Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Niklas Haas <ffmpeg@haasn.xyz>
To: ffmpeg-devel@ffmpeg.org
Cc: Niklas Haas <git@haasn.dev>
Subject: [FFmpeg-devel] [PATCH v9 2/6] lavfi/showinfo: Support AV_FRAME_DATA_DOVI_METADATA
Date: Wed, 22 Dec 2021 16:14:43 +0100
Message-ID: <20211222151447.57681-2-ffmpeg@haasn.xyz> (raw)
In-Reply-To: <20211222151447.57681-1-ffmpeg@haasn.xyz>

From: Niklas Haas <git@haasn.dev>

Signed-off-by: Niklas Haas <git@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..909ad4f8d7 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 = (AVDOVIMetadata *) sd->data;
+    const AVDOVIRpuDataHeader *hdr = av_dovi_get_header(dovi);
+    const AVDOVIDataMapping *mapping = av_dovi_get_mapping(dovi);
+    const AVDOVIColorMetadata *color = av_dovi_get_color(dovi);
+
+    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=%"PRIu8"; ", 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=%"PRIu8"; ", 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=%"PRIu8"; ", hdr->spatial_resampling_filter_flag);
+    av_log(ctx, AV_LOG_INFO, "el_spatial_resampling_filter_flag=%"PRIu8"; ", hdr->el_spatial_resampling_filter_flag);
+    av_log(ctx, AV_LOG_INFO, "disable_residual_flag=%"PRIu8"\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=%"PRIu8"; ", 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);
+}
+
 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);
-- 
2.34.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2021-12-22 15:15 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-22 15:14 [FFmpeg-devel] [PATCH v9 1/6] lavu/frame: Add Dolby Vision metadata side data type Niklas Haas
2021-12-22 15:14 ` Niklas Haas [this message]
2021-12-22 15:14 ` [FFmpeg-devel] [PATCH v9 3/6] ffprobe: Support AV_FRAME_DATA_DOVI_METADATA Niklas Haas
2021-12-22 15:14 ` [FFmpeg-devel] [PATCH v9 4/6] lavc: Implement Dolby Vision RPU parsing Niklas Haas
2022-01-02  4:18   ` Andreas Rheinhardt
2022-01-02 12:45     ` James Almer
2022-01-02 18:55       ` Hendrik Leppkes
2022-01-02 19:01     ` Hendrik Leppkes
2022-01-03  5:42       ` Andreas Rheinhardt
2021-12-22 15:14 ` [FFmpeg-devel] [PATCH v9 5/6] fate: Limit Dolby Vision RPU test frame count Niklas Haas
2021-12-22 15:14 ` [FFmpeg-devel] [PATCH v9 6/6] lavc/hevcdec: Parse DOVI RPU NALs Niklas Haas
2021-12-22 19:55   ` Andreas Rheinhardt
2022-01-02  4:31   ` Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211222151447.57681-2-ffmpeg@haasn.xyz \
    --to=ffmpeg@haasn.xyz \
    --cc=ffmpeg-devel@ffmpeg.org \
    --cc=git@haasn.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git