[FFmpeg-devel] [PATCH v1] avcodec/av1_parser: ensure only one show frame packed data parsered

James Almer jamrial at gmail.com
Fri Dec 3 14:36:17 EET 2021


On Fri, Dec 3, 2021 at 5:12 AM Fei Wang <fei.w.wang at intel.com> wrote:

> Split packed data when it contains multiple show frames in some
> non-standard bitstream. This can benefit downstream decoder which can
> decode continuously instead of interrupt with unexpected error.
>
> Signed-off-by: Fei Wang <fei.w.wang at intel.com>
> ---
>  libavcodec/av1_parser.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/av1_parser.c b/libavcodec/av1_parser.c
> index d2dfdb3580..d6f5cace4b 100644
> --- a/libavcodec/av1_parser.c
> +++ b/libavcodec/av1_parser.c
> @@ -59,11 +59,10 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
>      const CodedBitstreamAV1Context *av1 = s->cbc->priv_data;
>      const AV1RawSequenceHeader *seq;
>      const AV1RawColorConfig *color;
> +    int pic_found = 0;
> +    int next = 0;
>      int ret;
>
> -    *out_data = data;
> -    *out_size = size;
> -
>      ctx->key_frame         = -1;
>      ctx->pict_type         = AV_PICTURE_TYPE_NONE;
>      ctx->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
> @@ -100,6 +99,8 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
>          const AV1RawOBU *obu = unit->content;
>          const AV1RawFrameHeader *frame;
>
> +        next += unit->data_size;
> +
>          if (unit->type == AV1_OBU_FRAME)
>              frame = &obu->obu.frame.header;
>          else if (unit->type == AV1_OBU_FRAME_HEADER)
> @@ -113,6 +114,12 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
>          if (!frame->show_frame && !frame->show_existing_frame)
>              continue;
>
> +        /* split data if it contains multi show frames */
> +        if (pic_found) {
> +            next -= unit->data_size;
> +            break;
> +        }
> +
>          ctx->width  = frame->frame_width_minus_1 + 1;
>          ctx->height = frame->frame_height_minus_1 + 1;
>
> @@ -131,8 +138,12 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
>              break;
>          }
>          ctx->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
> +        pic_found = 1;
>      }
>
> +    *out_size = next;
> +    *out_data = data;
> +
>      switch (av1->bit_depth) {
>      case 8:
>          ctx->format = color->mono_chrome ? AV_PIX_FMT_GRAY8
> @@ -171,7 +182,7 @@ end:
>
>      s->cbc->log_ctx = NULL;
>
> -    return size;
> +    return next;
>  }
>
>  static const CodedBitstreamUnitType decompose_unit_types[] = {
> --
> 2.25.1
>
>
No, the parser must not split the packets. We used to do this with the VP9
parser and the result was the creation of broken output files.

What you could do instead is autoinsert the frame_split BSF in the decoder,
same as we're doing for VP9. It should have the same effect.


More information about the ffmpeg-devel mailing list