avcodec/h264_parser: Reduce needed history for parsing mb index

This fixes a bug/regression with very small packets
Fixes: output_file

Regression since: 0782fb6bcb

Reported-by: Thierry Foucu <tfoucu@google.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
pull/288/head
Michael Niedermayer 6 years ago
parent 7719b8ccc7
commit d25c945247
  1. 19
      libavcodec/h264_parser.c

@ -121,20 +121,23 @@ static int h264_find_frame_end(H264ParseContext *p, const uint8_t *buf,
} }
state = 7; state = 7;
} else { } else {
unsigned int mb, last_mb = p->parse_last_mb;
GetBitContext gb;
p->parse_history[p->parse_history_count++] = buf[i]; p->parse_history[p->parse_history_count++] = buf[i];
if (p->parse_history_count > 5) {
unsigned int mb, last_mb = p->parse_last_mb;
GetBitContext gb;
init_get_bits(&gb, p->parse_history, 8*p->parse_history_count); init_get_bits(&gb, p->parse_history, 8*p->parse_history_count);
p->parse_history_count = 0; mb= get_ue_golomb_long(&gb);
mb= get_ue_golomb_long(&gb); if (get_bits_left(&gb) > 0 || p->parse_history_count > 5) {
p->parse_last_mb = mb; p->parse_last_mb = mb;
if (pc->frame_start_found) { if (pc->frame_start_found) {
if (mb <= last_mb) if (mb <= last_mb) {
i -= p->parse_history_count - 1;
p->parse_history_count = 0;
goto found; goto found;
}
} else } else
pc->frame_start_found = 1; pc->frame_start_found = 1;
p->parse_history_count = 0;
state = 7; state = 7;
} }
} }
@ -149,7 +152,7 @@ found:
pc->frame_start_found = 0; pc->frame_start_found = 0;
if (p->is_avc) if (p->is_avc)
return next_avc; return next_avc;
return i - (state & 5) - 5 * (state > 7); return i - (state & 5);
} }
static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb,

Loading…
Cancel
Save