[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