X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fh264_parser.c;h=0b8798dbed516dc87764ba14721ec9e4984ce541;hb=7b0b10ce4186eaa1cd3c0a2bfbb86307d65eecfd;hp=614dad35ebac1b21e902213addf1aaf3e8aa8318;hpb=f97faf67510d92c2a18180a6ec80435d5dd1da0b;p=ffmpeg diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index 614dad35eba..0b8798dbed5 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -93,17 +93,28 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si goto found; } }else if(v==1 || v==2 || v==5){ + state+=8; + continue; + } + state= 7; + }else{ + h->parse_history[h->parse_history_count++]= buf[i]; + if(h->parse_history_count>3){ + unsigned int mb, last_mb= h->parse_last_mb; + GetBitContext gb; + + init_get_bits(&gb, h->parse_history, 8*h->parse_history_count); + h->parse_history_count=0; + mb= get_ue_golomb_long(&gb); + last_mb= h->parse_last_mb; + h->parse_last_mb= mb; if(pc->frame_start_found){ - state+=8; - continue; + if(mb <= last_mb) + goto found; }else pc->frame_start_found = 1; + state= 7; } - state= 7; - }else{ - if(buf[i] & 0x80) - goto found; - state= 7; } } pc->state= state; @@ -116,7 +127,7 @@ found: pc->frame_start_found= 0; if(h->is_avc) return next_avc; - return i-(state&5); + return i-(state&5) - 3*(state>7); } /** @@ -185,7 +196,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, s->key_frame = 1; /* fall through */ case NAL_SLICE: - get_ue_golomb(&h->s.gb); // skip first_mb_in_slice + get_ue_golomb_long(&h->s.gb); // skip first_mb_in_slice slice_type = get_ue_golomb_31(&h->s.gb); s->pict_type = golomb_to_pict_type[slice_type % 5]; if (h->sei_recovery_frame_cnt >= 0) { @@ -364,10 +375,10 @@ static int init(AVCodecParserContext *s) } AVCodecParser ff_h264_parser = { - { CODEC_ID_H264 }, - sizeof(H264Context), - init, - h264_parse, - close, - h264_split, + .codec_ids = { CODEC_ID_H264 }, + .priv_data_size = sizeof(H264Context), + .parser_init = init, + .parser_parse = h264_parse, + .parser_close = close, + .split = h264_split, };