From 62bd8deef9005dbc9750e3bdc12fbf9b50392adc Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 1 Sep 2015 16:27:02 +0200 Subject: [PATCH] avcodec/hevc_parser: fix split function of parser Signed-off-by: Michael Niedermayer --- libavcodec/hevc_parser.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index f970de5474..35cace5e3c 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -410,19 +410,30 @@ static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { const uint8_t *ptr = buf, *end = buf + buf_size; uint32_t state = -1; - int has_ps = 0, nut; + int has_vps = 0; + int has_sps = 0; + int has_pps = 0; + int nut; while (ptr < end) { ptr = avpriv_find_start_code(ptr, end, &state); if ((state >> 8) != START_CODE) break; nut = (state >> 1) & 0x3F; - if (nut >= NAL_VPS && nut <= NAL_PPS) - has_ps = 1; - else if (has_ps) - return ptr - 4 - buf; - else // no parameter set at the beginning of the stream - return 0; + if (nut == NAL_VPS) + has_vps = 1; + else if (nut == NAL_SPS) + has_sps = 1; + else if (nut == NAL_PPS) + has_pps = 1; + else if ((nut != NAL_SEI_PREFIX || has_pps) && + nut != NAL_AUD) { + if (has_vps && has_sps) { + while (ptr - 4 > buf && ptr[-5] == 0) + ptr--; + return ptr - 4 - buf; + } + } } return 0; } -- GitLab