[FFmpeg-devel] [PATCH 2/8] av1_metadata: Add option to update video parameters

James Almer jamrial at gmail.com
Sat Dec 1 22:03:32 EET 2018


On 12/1/2018 4:28 PM, Andreas Rheinhardt wrote:
> Up until now, this BSF only changed the bitstream, not the
> AVCodecParameters. The result is that e.g. some muxers use outdated
> information to write header information that conflicts with (and precedes)
> the new information at the bitstream level, so that the updates might
> not lead to the desired change.
> This commit changes this. It adds a mechanism by which the new
> information can be used to update the AVCodecParameters, too. This is
> the new default and an option has been added to revert to the old
> behaviour.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at googlemail.com>
> ---
>  doc/bitstream_filters.texi    |  6 +++++
>  libavcodec/av1_metadata_bsf.c | 43 +++++++++++++++++++++++++++++++----
>  2 files changed, 45 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
> index 15c578aa8a..80df345f26 100644
> --- a/doc/bitstream_filters.texi
> +++ b/doc/bitstream_filters.texi
> @@ -87,6 +87,12 @@ the timing info in the sequence header.
>  Set the number of ticks in each picture, to indicate that the stream
>  has a fixed framerate.  Ignored if @option{tick_rate} is not also set.
>  
> + at item full_update
> +If this is set, the AVCodecParameters are updated in addition to the
> +bitstream. If unset, muxers might add header information based upon the
> +old AVCodecParameters that contradicts and potentially precedes the
> +changes made at the bitstream level. On by default.
> +
>  @end table
>  
>  @section chomp
> diff --git a/libavcodec/av1_metadata_bsf.c b/libavcodec/av1_metadata_bsf.c
> index 52d383661f..0c8d00acea 100644
> --- a/libavcodec/av1_metadata_bsf.c
> +++ b/libavcodec/av1_metadata_bsf.c
> @@ -46,11 +46,15 @@ typedef struct AV1MetadataContext {
>  
>      AVRational tick_rate;
>      int num_ticks_per_picture;
> +
> +    int full_update;
>  } AV1MetadataContext;
>  
>  
>  static int av1_metadata_update_sequence_header(AVBSFContext *bsf,
> -                                               AV1RawSequenceHeader *seq)
> +                                               AV1RawSequenceHeader *seq,
> +                                               int *color_range,
> +                                               int *chroma_sample_position)
>  {
>      AV1MetadataContext *ctx = bsf->priv_data;
>      AV1RawColorConfig  *clc = &seq->color_config;
> @@ -82,6 +86,8 @@ static int av1_metadata_update_sequence_header(AVBSFContext *bsf,
>                     "on RGB streams encoded in BT.709 sRGB.\n");
>          } else {
>              clc->color_range = ctx->color_range;
> +            if (color_range)
> +                *color_range = ctx->color_range;
>          }
>      }
>  
> @@ -91,6 +97,8 @@ static int av1_metadata_update_sequence_header(AVBSFContext *bsf,
>                     "can only be set for 4:2:0 streams.\n");
>          } else {
>              clc->chroma_sample_position = ctx->chroma_sample_position;
> +            if (chroma_sample_position)
> +                *chroma_sample_position = ctx->chroma_sample_position;
>          }
>      }
>  
> @@ -135,7 +143,8 @@ static int av1_metadata_filter(AVBSFContext *bsf, AVPacket *out)
>      for (i = 0; i < frag->nb_units; i++) {
>          if (frag->units[i].type == AV1_OBU_SEQUENCE_HEADER) {
>              obu = frag->units[i].content;
> -            err = av1_metadata_update_sequence_header(bsf, &obu->obu.sequence_header);
> +            err = av1_metadata_update_sequence_header(bsf, &obu->obu.sequence_header,
> +                                                      NULL, NULL);
>              if (err < 0)
>                  goto fail;
>          }
> @@ -184,7 +193,7 @@ static int av1_metadata_init(AVBSFContext *bsf)
>      AV1MetadataContext *ctx = bsf->priv_data;
>      CodedBitstreamFragment *frag = &ctx->access_unit;
>      AV1RawOBU *obu;
> -    int err, i;
> +    int err, i, color_range = -1, chroma_sample_position = -1;
>  
>      err = ff_cbs_init(&ctx->cbc, AV_CODEC_ID_AV1, bsf);
>      if (err < 0)
> @@ -200,7 +209,8 @@ static int av1_metadata_init(AVBSFContext *bsf)
>          for (i = 0; i < frag->nb_units; i++) {
>              if (frag->units[i].type == AV1_OBU_SEQUENCE_HEADER) {
>                  obu = frag->units[i].content;
> -                err = av1_metadata_update_sequence_header(bsf, &obu->obu.sequence_header);
> +                err = av1_metadata_update_sequence_header(bsf, &obu->obu.sequence_header,
> +                                                          &color_range, &chroma_sample_position);
>                  if (err < 0)
>                      goto fail;
>              }
> @@ -213,6 +223,28 @@ static int av1_metadata_init(AVBSFContext *bsf)
>          }
>      }
>  
> +    if (ctx->full_update) {
> +        if (chroma_sample_position >= 0) {
> +            const int conversion_table[4] = { AVCHROMA_LOC_UNSPECIFIED,
> +                                              AVCHROMA_LOC_LEFT,
> +                                              AVCHROMA_LOC_TOPLEFT,
> +                                              AVCHROMA_LOC_UNSPECIFIED };
> +            chroma_sample_position = conversion_table[chroma_sample_position];
> +        }
> +
> +        if (ctx->color_range >= 0)
> +            ctx->color_range++;
> +
> +        ff_cbs_update_video_parameters(ctx->cbc, bsf->par_out, -1, -1, -1, -1,
> +                                       -1, color_range, ctx->color_primaries,
> +                                       ctx->transfer_characteristics,
> +                                       ctx->matrix_coefficients,
> +                                       chroma_sample_position, -1);
> +
> +        if (ctx->color_range != -1)
> +            ctx->color_range--;
> +    }
> +
>      err = 0;
>  fail:
>      ff_cbs_fragment_uninit(ctx->cbc, frag);
> @@ -273,6 +305,9 @@ static const AVOption av1_metadata_options[] = {
>          OFFSET(num_ticks_per_picture), AV_OPT_TYPE_INT,
>          { .i64 = -1 }, -1, INT_MAX, FLAGS },
>  
> +    { "full_update", "Update not only bitstream, but also AVCodecParameters.",
> +        OFFSET(full_update), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, FLAGS},

I don't think this needs an option. It should be the default behavior.
The BSF framework is written in a way that changing AVCodecParameters
values is expected (Or necessary, like in cases where it adds extradata).

> +
>      { NULL }
>  };
>  
> 



More information about the ffmpeg-devel mailing list