libplacebo: forward HDR10+ metadata to libplacebo

Fairly straightforward as libplacebo currently ignores most metadata
fields and only cares about the OOTF (bezier anchors) and global scene
brightness/average measurements.
This commit is contained in:
Niklas Haas 2023-02-12 15:29:21 +01:00 committed by Jean-Baptiste Kempf
parent 5f7a8c04ce
commit ab9b509df6
3 changed files with 32 additions and 0 deletions

View File

@ -259,6 +259,12 @@ static void PictureRender(vout_display_t *vd, picture_t *pic,
pl_icc_profile_compute_signature(&img.profile);
}
struct vlc_ancillary *hdrplus = picture_GetAncillary(pic, VLC_ANCILLARY_ID_HDR10PLUS);
if (hdrplus) {
vlc_video_hdr_dynamic_metadata_t *hdm = vlc_ancillary_GetData(hdrplus);
vlc_placebo_HdrMetadata(hdm, &img.color.hdr);
}
// Upload the image data for each plane
struct pl_plane_data data[4];
if (!vlc_placebo_PlaneData(pic, data, NULL)) {

View File

@ -452,6 +452,28 @@ struct pl_color_repr vlc_placebo_ColorRepr(const video_format_t *fmt)
};
}
void vlc_placebo_HdrMetadata(const vlc_video_hdr_dynamic_metadata_t *src,
struct pl_hdr_metadata *dst)
{
#if PL_API_VER >= 242
for (size_t i = 0; i < ARRAY_SIZE(dst->scene_max); i++)
dst->scene_max[i] = src->maxscl[i];
dst->scene_avg = src->average_maxrgb;
if (src->tone_mapping_flag) {
static_assert(sizeof(dst->ootf.anchors) == sizeof(src->bezier_curve_anchors), "array mismatch");
memcpy(dst->ootf.anchors, src->bezier_curve_anchors, sizeof(dst->ootf.anchors));
dst->ootf.num_anchors = src->num_bezier_anchors;
dst->ootf.target_luma = src->targeted_luminance;
dst->ootf.knee_x = src->knee_point_x;
dst->ootf.knee_y = src->knee_point_y;
}
#else
(void) src;
(void) dst;
#endif
}
#if PL_API_VER >= 185
void vlc_placebo_DoviMetadata(const vlc_video_dovi_metadata_t *src,
struct pl_dovi_metadata *dst)

View File

@ -38,6 +38,10 @@ struct pl_color_space vlc_placebo_ColorSpace(const video_format_t *);
struct pl_color_repr vlc_placebo_ColorRepr(const video_format_t *);
enum pl_chroma_location vlc_placebo_ChromaLoc(const video_format_t *);
// Map HDR10+ metadata struct (on supported version of libplacebo)
void vlc_placebo_HdrMetadata(const vlc_video_hdr_dynamic_metadata_t *src,
struct pl_hdr_metadata *dst);
#if PL_API_VER >= 185
// Map raw dolby vision metadata struct
void vlc_placebo_DoviMetadata(const vlc_video_dovi_metadata_t *src,