else state>>=1; //2->1, 1->0, 0->0
}else if(state<=5){
int v= buf[i] & 0x1F;
- if(v==7 || v==8 || v==9){
+ if(v==6 || v==7 || v==8 || v==9){
if(pc->frame_start_found){
i++;
goto found;
const uint8_t *buf_end = buf + buf_size;
unsigned int pps_id;
unsigned int slice_type;
- int state;
+ int state = -1;
const uint8_t *ptr;
/* set some sane default values */
h->s.avctx= avctx;
h->sei_recovery_frame_cnt = -1;
+ h->sei_dpb_output_delay = 0;
+ h->sei_cpb_removal_delay = -1;
+ h->sei_buffering_period_present = 0;
for(;;) {
int src_length, dst_length, consumed;
h->sps = *h->sps_buffers[h->pps.sps_id];
h->frame_num = get_bits(&h->s.gb, h->sps.log2_max_frame_num);
+ avctx->profile = h->sps.profile_idc;
+ avctx->level = h->sps.level_idc;
+
if(h->sps.frame_mbs_only_flag){
h->s.picture_structure= PICT_FRAME;
}else{
}
parse_nal_units(s, avctx, buf, buf_size);
+
+ if (h->sei_cpb_removal_delay >= 0) {
+ s->dts_sync_point = h->sei_buffering_period_present;
+ s->dts_ref_dts_delta = h->sei_cpb_removal_delay;
+ s->pts_dts_delta = h->sei_dpb_output_delay;
+ } else {
+ s->dts_sync_point = INT_MIN;
+ s->dts_ref_dts_delta = INT_MIN;
+ s->pts_dts_delta = INT_MIN;
+ }
}
*poutbuf = buf;
ParseContext *pc = &h->s.parse_context;
av_free(pc->buffer);
+ ff_h264_free_context(h);
}
+static int init(AVCodecParserContext *s)
+{
+ H264Context *h = s->priv_data;
+ h->thread_context[0] = h;
+ return 0;
+}
AVCodecParser h264_parser = {
{ CODEC_ID_H264 },
sizeof(H264Context),
- NULL,
+ init,
h264_parse,
close,
h264_split,