[FFmpeg-devel] [PATCH v4 2/5] lavfi/showinfo: Support AV_FRAME_DATA_DOVI_METADATA

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sat Dec 11 14:58:53 EET 2021


Niklas Haas:
> From: Niklas Haas <git at haasn.dev>
> 
> Signed-off-by: Niklas Haas <git at haasn.dev>
> ---
>  libavfilter/vf_showinfo.c | 108 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 108 insertions(+)
> 
> diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
> index 62c7833247..8a7efc15b7 100644
> --- a/libavfilter/vf_showinfo.c
> +++ b/libavfilter/vf_showinfo.c
> @@ -27,6 +27,7 @@
>  #include "libavutil/bswap.h"
>  #include "libavutil/adler32.h"
>  #include "libavutil/display.h"
> +#include "libavutil/dovi_meta.h"
>  #include "libavutil/imgutils.h"
>  #include "libavutil/internal.h"
>  #include "libavutil/film_grain_params.h"
> @@ -429,6 +430,110 @@ static void dump_sei_film_grain_params_metadata(AVFilterContext *ctx, const AVFr
>      }
>  }
>  
> +static void dump_dovi_metadata(AVFilterContext *ctx, const AVFrameSideData *sd)
> +{
> +    const AVDOVIMetadata *dovi = (const AVDOVIMetadata *) sd->data;
> +    const AVDOVIRpuDataHeader *hdr = &dovi->header;
> +    const AVDOVIDataMapping *mapping = &dovi->mapping;
> +    const AVDOVIColorMetadata *color = &dovi->color;
> +
> +    av_log(ctx, AV_LOG_INFO, "Dolby Vision Metadata:\n");
> +    av_log(ctx, AV_LOG_INFO, "    rpu_type=%"PRIu8"; ", hdr->rpu_type);
> +    av_log(ctx, AV_LOG_INFO, "rpu_format=%"PRIu16"; ", hdr->rpu_format);
> +    av_log(ctx, AV_LOG_INFO, "vdr_rpu_profile=%"PRIu8"; ", hdr->vdr_rpu_profile);
> +    av_log(ctx, AV_LOG_INFO, "vdr_rpu_level=%"PRIu8"; ", hdr->vdr_rpu_level);
> +    av_log(ctx, AV_LOG_INFO, "chroma_resampling_explicit_filter_flag=%d; ", hdr->chroma_resampling_explicit_filter_flag);
> +    av_log(ctx, AV_LOG_INFO, "coef_data_type=%"PRIu8"; ", hdr->coef_data_type);
> +    av_log(ctx, AV_LOG_INFO, "coef_log2_denom=%"PRIu8"; ", hdr->coef_log2_denom);
> +    av_log(ctx, AV_LOG_INFO, "vdr_rpu_normalized_idc=%"PRIu8"; ", hdr->vdr_rpu_normalized_idc);
> +    av_log(ctx, AV_LOG_INFO, "bl_video_full_range_flag=%d; ", hdr->bl_video_full_range_flag);
> +    av_log(ctx, AV_LOG_INFO, "bl_bit_depth=%"PRIu8"; ", hdr->bl_bit_depth);
> +    av_log(ctx, AV_LOG_INFO, "el_bit_depth=%"PRIu8"; ", hdr->el_bit_depth);
> +    av_log(ctx, AV_LOG_INFO, "vdr_bit_depth=%"PRIu8"; ", hdr->vdr_bit_depth);
> +    av_log(ctx, AV_LOG_INFO, "spatial_resampling_filter_flag=%d; ", hdr->spatial_resampling_filter_flag);
> +    av_log(ctx, AV_LOG_INFO, "el_spatial_resampling_filter_flag=%d; ", hdr->el_spatial_resampling_filter_flag);
> +    av_log(ctx, AV_LOG_INFO, "disable_residual_flag=%d\n", hdr->disable_residual_flag);
> +
> +    av_log(ctx, AV_LOG_INFO, "    data mapping: ");
> +    av_log(ctx, AV_LOG_INFO, "vdr_rpu_id=%"PRIu8"; ", mapping->vdr_rpu_id);
> +    av_log(ctx, AV_LOG_INFO, "mapping_color_space=%"PRIu8"; ", mapping->mapping_color_space);
> +    av_log(ctx, AV_LOG_INFO, "mapping_chroma_format_idc=%"PRIu8"; ", mapping->mapping_chroma_format_idc);
> +    av_log(ctx, AV_LOG_INFO, "nlq_method_idc=%d; ", (int) mapping->nlq_method_idc);
> +    av_log(ctx, AV_LOG_INFO, "num_x_partitions=%"PRIu32"; ", mapping->num_x_partitions);
> +    av_log(ctx, AV_LOG_INFO, "num_y_partitions=%"PRIu32"\n", mapping->num_y_partitions);
> +
> +    for (int c = 0; c < 3; c++) {
> +        const AVDOVIReshapingCurve *curve = &mapping->curves[c];
> +        const AVDOVINLQParams *nlq = &mapping->nlq[c];
> +        av_log(ctx, AV_LOG_INFO, "      channel %d: ", c);
> +        av_log(ctx, AV_LOG_INFO, "pivots={ ");
> +        for (int i = 0; i < curve->num_pivots; i++)
> +            av_log(ctx, AV_LOG_INFO, "%"PRIu16" ", curve->pivots[i]);
> +        av_log(ctx, AV_LOG_INFO, "}; mapping_idc={ ");
> +        for (int i = 0; i < curve->num_pivots - 1; i++)
> +            av_log(ctx, AV_LOG_INFO, "%d ", (int) curve->mapping_idc[i]);
> +        av_log(ctx, AV_LOG_INFO, "}; poly_order={ ");
> +        for (int i = 0; i < curve->num_pivots - 1; i++)
> +            av_log(ctx, AV_LOG_INFO, "%"PRIu8" ", curve->poly_order[i]);
> +        av_log(ctx, AV_LOG_INFO, "}; poly_coef={ ");
> +        for (int i = 0; i < curve->num_pivots - 1; i++) {
> +            av_log(ctx, AV_LOG_INFO, "{%"PRIi64", %"PRIi64", %"PRIi64"} ",
> +                   curve->poly_coef[i][0],
> +                   curve->poly_coef[i][1],
> +                   curve->poly_coef[i][2]);
> +        }
> +
> +        av_log(ctx, AV_LOG_INFO, "}; mmr_order={ ");
> +        for (int i = 0; i < curve->num_pivots - 1; i++)
> +            av_log(ctx, AV_LOG_INFO, "%"PRIu8" ", curve->mmr_order[i]);
> +        av_log(ctx, AV_LOG_INFO, "}; mmr_constant={ ");
> +        for (int i = 0; i < curve->num_pivots - 1; i++)
> +            av_log(ctx, AV_LOG_INFO, "%"PRIi64" ", curve->mmr_constant[i]);
> +        av_log(ctx, AV_LOG_INFO, "}; mmr_coef={ ");
> +        for (int i = 0; i < curve->num_pivots - 1; i++) {
> +            av_log(ctx, AV_LOG_INFO, "{");
> +            for (int j = 0; j < curve->mmr_order[i]; j++) {
> +                for (int k = 0; k < 7; k++)
> +                    av_log(ctx, AV_LOG_INFO, "%"PRIi64" ", curve->mmr_coef[i][j][k]);
> +            }
> +            av_log(ctx, AV_LOG_INFO, "} ");
> +        }
> +
> +        av_log(ctx, AV_LOG_INFO, "}; nlq_offset=%"PRIu64"; ", nlq->nlq_offset);
> +        av_log(ctx, AV_LOG_INFO, "vdr_in_max=%"PRIu64"; ", nlq->vdr_in_max);
> +        switch (mapping->nlq_method_idc) {
> +        case AV_DOVI_NLQ_LINEAR_DZ:
> +            av_log(ctx, AV_LOG_INFO, "linear_deadzone_slope=%"PRIu64"; ", nlq->linear_deadzone_slope);
> +            av_log(ctx, AV_LOG_INFO, "linear_deadzone_threshold=%"PRIu64"\n", nlq->linear_deadzone_threshold);
> +            break;
> +        }
> +    }
> +
> +    av_log(ctx, AV_LOG_INFO, "    color metadata: ");
> +    av_log(ctx, AV_LOG_INFO, "dm_metadata_id=%"PRIu8"; ", color->dm_metadata_id);
> +    av_log(ctx, AV_LOG_INFO, "scene_refresh_flag=%d; ", color->scene_refresh_flag);
> +    av_log(ctx, AV_LOG_INFO, "ycc_to_rgb_matrix={ ");
> +    for (int i = 0; i < 9; i++)
> +        av_log(ctx, AV_LOG_INFO, "%f ", av_q2d(color->ycc_to_rgb_matrix[i]));
> +    av_log(ctx, AV_LOG_INFO, "}; ycc_to_rgb_offset={ ");
> +    for (int i = 0; i < 3; i++)
> +        av_log(ctx, AV_LOG_INFO, "%f ", av_q2d(color->ycc_to_rgb_offset[i]));
> +    av_log(ctx, AV_LOG_INFO, "}; rgb_to_lms_matrix={ ");
> +    for (int i = 0; i < 9; i++)
> +        av_log(ctx, AV_LOG_INFO, "%f ", av_q2d(color->rgb_to_lms_matrix[i]));
> +    av_log(ctx, AV_LOG_INFO, "}; signal_eotf=%"PRIu16"; ", color->signal_eotf);
> +    av_log(ctx, AV_LOG_INFO, "signal_eotf_param0=%"PRIu16"; ", color->signal_eotf_param0);
> +    av_log(ctx, AV_LOG_INFO, "signal_eotf_param1=%"PRIu16"; ", color->signal_eotf_param1);
> +    av_log(ctx, AV_LOG_INFO, "signal_eotf_param2=%"PRIu32"; ", color->signal_eotf_param2);
> +    av_log(ctx, AV_LOG_INFO, "signal_bit_depth=%"PRIu8"; ", color->signal_bit_depth);
> +    av_log(ctx, AV_LOG_INFO, "signal_color_space=%"PRIu8"; ", color->signal_color_space);
> +    av_log(ctx, AV_LOG_INFO, "signal_chroma_format=%"PRIu8"; ", color->signal_chroma_format);
> +    av_log(ctx, AV_LOG_INFO, "signal_full_range_flag=%"PRIu8"; ", color->signal_full_range_flag);
> +    av_log(ctx, AV_LOG_INFO, "source_min_pq=%"PRIu16"; ", color->source_min_pq);
> +    av_log(ctx, AV_LOG_INFO, "source_max_pq=%"PRIu16"; ", color->source_max_pq);
> +    av_log(ctx, AV_LOG_INFO, "source_diagonal=%"PRIu16"; ", color->source_diagonal);

Why are you using so many av_log calls? Every one of them poses the risk
of the output being torn apart by other av_log calls (with a different
logctx); and of course, it also leads to lower performance and bigger
binary size.

> +}
> +
>  static void dump_color_property(AVFilterContext *ctx, AVFrame *frame)
>  {
>      const char *color_range_str     = av_color_range_name(frame->color_range);
> @@ -617,6 +722,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
>          case AV_FRAME_DATA_FILM_GRAIN_PARAMS:
>              dump_sei_film_grain_params_metadata(ctx, sd);
>              break;
> +        case AV_FRAME_DATA_DOVI_METADATA:
> +            dump_dovi_metadata(ctx, sd);
> +            break;
>          default:
>              av_log(ctx, AV_LOG_WARNING, "unknown side data type %d "
>                     "(%"SIZE_SPECIFIER" bytes)\n", sd->type, sd->size);
> 



More information about the ffmpeg-devel mailing list