[FFmpeg-devel] [PATCH] h2645_parse: support badly muxed mp4 streams
Hendrik Leppkes
h.leppkes at gmail.com
Thu May 12 10:53:35 CEST 2016
On Thu, May 12, 2016 at 10:52 AM, Hendrik Leppkes <h.leppkes at gmail.com> wrote:
> Some streams contain an additional AnnexB NAL inside the mp4/nalff NALU.
> This commonly occurs in interlaced streams where both fields are packed
> into the same MP4 NAL with an AnnexB startcode in between.
>
> Port handling of this format from the previous h264 nal handling.
>
> Fixes trac #5529
> ---
> libavcodec/h2645_parse.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c
> index 62d0447..013d23c 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,6 +284,11 @@ 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)) {
> + int remaining = next_avc - buf;
> + buf += remaining;
> + length -= remaining;
> + continue;
Actually this is supposed to continue the outer loop, not the inner
loop. Why does C not have a construct for that.
> }
> }
>
> @@ -315,6 +322,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 */
> --
> 2.7.2.windows.1
>
More information about the ffmpeg-devel
mailing list