diff --git a/video/mp_image.c b/video/mp_image.c index a89762b6d5..b809dae765 100644 --- a/video/mp_image.c +++ b/video/mp_image.c @@ -848,6 +848,19 @@ bool mp_image_params_static_equal(const struct mp_image_params *p1, return mp_image_params_equal(&a, &b); } +// Restore color system, transfer, and primaries to their original values +// before dovi mapping. +void mp_image_params_restore_dovi_mapping(struct mp_image_params *params) +{ + params->color.primaries = params->primaries_orig; + params->color.transfer = params->transfer_orig; + params->repr.sys = params->sys_orig; + if (!pl_color_transfer_is_hdr(params->transfer_orig)) + params->color.hdr = (struct pl_hdr_metadata){0}; + if (params->transfer_orig != PL_COLOR_TRC_PQ) + params->color.hdr.max_pq_y = params->color.hdr.avg_pq_y = 0; +} + // Set most image parameters, but not image format or size. // Display size is used to set the PAR. void mp_image_set_attributes(struct mp_image *image, @@ -1079,6 +1092,9 @@ struct mp_image *mp_image_from_av_frame(struct AVFrame *src) if (sd) dst->a53_cc = sd->buf; + dst->params.primaries_orig = dst->params.color.primaries; + dst->params.transfer_orig = dst->params.color.transfer; + dst->params.sys_orig = dst->params.repr.sys; AVBufferRef *dovi = NULL; sd = av_frame_get_side_data(src, AV_FRAME_DATA_DOVI_METADATA); if (sd) { diff --git a/video/mp_image.h b/video/mp_image.h index af0d9fd58d..2208deb26d 100644 --- a/video/mp_image.h +++ b/video/mp_image.h @@ -50,6 +50,11 @@ struct mp_image_params { bool force_window; // fake image created by handle_force_window struct pl_color_space color; struct pl_color_repr repr; + // Original values before Dolby Vision metadata mapping + enum pl_color_primaries primaries_orig; + enum pl_color_transfer transfer_orig; + enum pl_color_system sys_orig; + enum mp_csp_light light; enum pl_chroma_location chroma_location; // The image should be rotated clockwise (0-359 degrees). @@ -177,6 +182,7 @@ bool mp_image_params_equal(const struct mp_image_params *p1, const struct mp_image_params *p2); bool mp_image_params_static_equal(const struct mp_image_params *p1, const struct mp_image_params *p2); +void mp_image_params_restore_dovi_mapping(struct mp_image_params *params); void mp_image_params_get_dsize(const struct mp_image_params *p, int *d_w, int *d_h);