diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c index 62d0447215..9979b63c3b 100644 --- a/libavcodec/h2645_parse.c +++ b/libavcodec/h2645_parse.c @@ -250,6 +250,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, enum AVCodecID codec_id) { int consumed, ret = 0; + const uint8_t *next_avc = is_nalff ? buf : buf + length; pkt->nb_nals = 0; while (length >= 4) { @@ -257,7 +258,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, int extract_length = 0; int skip_trailing_zeros = 1; - if (is_nalff) { + if (buf >= next_avc) { int i; for (i = 0; i < nal_length_size; i++) extract_length = (extract_length << 8) | buf[i]; @@ -268,6 +269,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, av_log(logctx, AV_LOG_ERROR, "Invalid NAL unit size.\n"); return AVERROR_INVALIDDATA; } + next_avc = buf + extract_length; } else { /* search start code */ while (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) { @@ -282,12 +284,21 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, av_log(logctx, AV_LOG_ERROR, "No start code is found.\n"); return AVERROR_INVALIDDATA; } - } + } else if (buf >= (next_avc - 3)) + break; } buf += 3; length -= 3; extract_length = length; + + if (buf >= next_avc) { + /* skip to the start of the next NAL */ + int offset = next_avc - buf; + buf += offset; + length -= offset; + continue; + } } if (pkt->nals_allocated < pkt->nb_nals + 1) { @@ -315,6 +326,11 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, if (consumed < 0) return consumed; + if (is_nalff && (extract_length != consumed) && extract_length) + av_log(logctx, AV_LOG_DEBUG, + "NALFF: Consumed only %d bytes instead of %d\n", + consumed, extract_length); + pkt->nb_nals++; /* see commit 3566042a0 */