qtdemux: Parse content light level and mastering display info if available

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8929>
This commit is contained in:
Sebastian Dröge 2025-05-06 11:02:55 +03:00 committed by GStreamer Marge Bot
parent 8a30c6b13b
commit 9fa7f8b001
3 changed files with 59 additions and 0 deletions

View File

@ -214,6 +214,8 @@ G_BEGIN_DECLS
#define FOURCC_dops GST_MAKE_FOURCC('d','O','p','s')
#define FOURCC_pasp GST_MAKE_FOURCC('p','a','s','p')
#define FOURCC_colr GST_MAKE_FOURCC('c','o','l','r')
#define FOURCC_clli GST_MAKE_FOURCC('c','l','l','i')
#define FOURCC_mdcv GST_MAKE_FOURCC('m','d','c','v')
#define FOURCC_clap GST_MAKE_FOURCC('c','l','a','p')
#define FOURCC_tapt GST_MAKE_FOURCC('t','a','p','t')
#define FOURCC_clef GST_MAKE_FOURCC('c','l','e','f')

View File

@ -9874,6 +9874,16 @@ gst_qtdemux_configure_stream (GstQTDemux * qtdemux, QtDemuxStream * stream)
g_free (colorimetry);
}
if (CUR_STREAM (stream)->content_light_level_set) {
gst_video_content_light_level_add_to_caps (&CUR_STREAM
(stream)->content_light_level, CUR_STREAM (stream)->caps);
}
if (CUR_STREAM (stream)->mastering_display_info_set) {
gst_video_mastering_display_info_add_to_caps (&CUR_STREAM
(stream)->mastering_display_info, CUR_STREAM (stream)->caps);
}
if (stream->multiview_mode != GST_VIDEO_MULTIVIEW_MODE_NONE) {
guint par_w = 1, par_h = 1;
@ -14805,6 +14815,8 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak, guint32 * mvhd_matrix)
GNode *fiel;
GNode *pasp;
GNode *btrt;
GNode *clli;
GNode *mdcv;
guint32 version;
gboolean gray;
gint depth, palette_size, palette_count;
@ -14979,6 +14991,8 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak, guint32 * mvhd_matrix)
colr = qtdemux_tree_get_child_by_type (stsd_entry, FOURCC_colr);
fiel = qtdemux_tree_get_child_by_type (stsd_entry, FOURCC_fiel);
btrt = qtdemux_tree_get_child_by_type (stsd_entry, FOURCC_btrt);
clli = qtdemux_tree_get_child_by_type (stsd_entry, FOURCC_clli);
mdcv = qtdemux_tree_get_child_by_type (stsd_entry, FOURCC_mdcv);
if (pasp) {
const guint8 *pasp_data = (const guint8 *) pasp->data;
@ -15036,6 +15050,45 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak, guint32 * mvhd_matrix)
}
}
if (clli) {
const guint8 *clli_data = clli->data;
guint32 len = QT_UINT32 (clli_data);
if (len >= 8 + 2 * 2) {
CUR_STREAM (stream)->content_light_level_set = TRUE;
CUR_STREAM (stream)->content_light_level.max_content_light_level =
QT_UINT16 (clli_data + 8);
CUR_STREAM (stream)->
content_light_level.max_frame_average_light_level =
QT_UINT16 (clli_data + 10);
}
}
if (mdcv) {
const guint8 *mdcv_data = mdcv->data;
guint32 len = QT_UINT32 (mdcv_data);
if (len >= 8 + 3 * 2 * 2 + 2 * 2 + 2 * 4) {
CUR_STREAM (stream)->mastering_display_info_set = TRUE;
for (gsize c = 0; c < 3; c++) {
CUR_STREAM (stream)->mastering_display_info.display_primaries[c].x =
QT_UINT16 (mdcv_data + 8 + c * 2 * 2);
CUR_STREAM (stream)->mastering_display_info.display_primaries[c].y =
QT_UINT16 (mdcv_data + 8 + c * 2 * 2 + 2);
}
CUR_STREAM (stream)->mastering_display_info.white_point.x =
QT_UINT16 (mdcv_data + 8 + 3 * 2 * 2);
CUR_STREAM (stream)->mastering_display_info.white_point.y =
QT_UINT16 (mdcv_data + 8 + 3 * 2 * 2 + 2);
CUR_STREAM (stream)->
mastering_display_info.max_display_mastering_luminance =
QT_UINT16 (mdcv_data + 8 + 3 * 2 * 2 + 2 * 2);
CUR_STREAM (stream)->
mastering_display_info.min_display_mastering_luminance =
QT_UINT16 (mdcv_data + 8 + 3 * 2 * 2 + 2 * 2 + 4);
}
}
if (btrt) {
const guint8 *data;
guint32 size;

View File

@ -337,6 +337,10 @@ struct _QtDemuxStreamStsdEntry
GstMemory *rgb8_palette;
guint interlace_mode;
guint field_order;
gboolean content_light_level_set;
GstVideoContentLightLevel content_light_level;
gboolean mastering_display_info_set;
GstVideoMasteringDisplayInfo mastering_display_info;
/* audio info */
gdouble rate;