[FFmpeg-devel] [PATCH 3/4] vf_tonemap_opencl: Move update_metadata() to a shared file
James Almer
jamrial at gmail.com
Mon Aug 6 22:21:36 EEST 2018
On 7/25/2018 12:46 PM, Vittorio Giovara wrote:
> ---
> libavfilter/colorspace.c | 17 +++++++++++++++++
> libavfilter/colorspace.h | 1 +
> libavfilter/vf_tonemap_opencl.c | 19 +------------------
> 3 files changed, 19 insertions(+), 18 deletions(-)
>
> diff --git a/libavfilter/colorspace.c b/libavfilter/colorspace.c
> index d6f6055401..c6682216d6 100644
> --- a/libavfilter/colorspace.c
> +++ b/libavfilter/colorspace.c
> @@ -118,3 +118,20 @@ double ff_determine_signal_peak(AVFrame *in)
>
> return peak;
> }
> +
> +void ff_update_hdr_metadata(AVFrame *in, double peak)
> +{
> + AVFrameSideData *sd = av_frame_get_side_data(in, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
> +
> + if (sd) {
> + AVContentLightMetadata *clm = (AVContentLightMetadata *)sd->data;
> + clm->MaxCLL = (unsigned)(peak * REFERENCE_WHITE);
> + }
> +
> + sd = av_frame_get_side_data(in, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
> + if (sd) {
> + AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data;
> + if (metadata->has_luminance)
> + metadata->max_luminance = av_d2q(peak * REFERENCE_WHITE, 10000);
> + }
Frame side data is refcounted, so this is not correct. I'm not sure if a
side data element is ever modified in-place long after being created to
being with, aside from this function here.
Easiest option is to call av_buffer_make_writable() on sd->buf and
updating the sd->data pointer before modifying the fields in question,
but such manual handling of side data seems improper and fragile.
I guess another option is av_mastering_display_metadata_alloc(), copy
the values, av_frame_remove_side_data(), av_buffer_create(), then
av_frame_new_side_data_from_buf().
Honestly, i think we may have to add a make_writable() function for side
data for this.
More information about the ffmpeg-devel
mailing list