From patchwork Sun Feb 21 19:51:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 25873 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 64223449DB5 for ; Sun, 21 Feb 2021 21:53:49 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 51D0B68A96E; Sun, 21 Feb 2021 21:53:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9F69668A83C for ; Sun, 21 Feb 2021 21:53:36 +0200 (EET) Received: by mail-wr1-f49.google.com with SMTP id n4so16936392wrx.1 for ; Sun, 21 Feb 2021 11:53:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=3IK5HH85ktEL6gdLkCtW2mB6/DjmC2FQMFOKUNbVr0k=; b=vnGFlcZ5GvVYT0coZP8o0d2+1SbFXBLYhEshutVHotVYm0rgkXgRTEL12VJ4fwOxS7 x9J94zgqDB/qfmiIRaNXnD9C40MT1LnFxhmOaMHUyqeaQle/S0tE86vjC7ejDT2ZM+Le ZDmu2WKE/S6ZULNsUyghi/ZVgNdiS61k/5CUoYh5URST8fSAHUpH1bofWkw3NRcLDIhh vrMyrhr3ZzqL1JugqTosveH7OW+qp7sPf+LurUYpTQTQKl/S5km/xsp2LLr1/Cha2hV1 rKj3wIyctl7ykROVYiYZ+XMt2I6bKOEUqjm+v6Q5mb1wSCxhKvGgej6mH6poyC/UOS1D ckgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3IK5HH85ktEL6gdLkCtW2mB6/DjmC2FQMFOKUNbVr0k=; b=lvedbA8tDENdG4Y4a/ubVfFkBIhj8X7thHpaxA35Dl+R5AaTWjXwdeWwiVlzDA1qOa 4YuSlQ7ySakJdRj6yF0f6wOU7We1YeVaEmb13LOVawpaN3Ue3npkb1721mfYjwrp3CzO Kiqfx3oBt7cJ7kWyjQ0t7ar5ofrvxIXHQhtjqBg4Dg7t+RHKIq9ncJU3S8RQmuUOjvDr z/4n57apsm128D43RKslXCbOybMLDSlS21YgeP4zU6zv+PnLBGq3v/bAyj5PR6tRsFIS ppYo9ES+nMpDHAlGssMmQGS93GEZAXCbR8MyedA6ef+6Hq+pTbrSnYFqcROlKZ9kMli5 OkLQ== X-Gm-Message-State: AOAM531LT18OWDhNJG1nc41hh7l60hnQw+TrMnFnVFikEKXQd8YJRlN9 G67VsXwLzXcBxNaRV5rRB+QaytK182EzCw== X-Google-Smtp-Source: ABdhPJx45NOVFtObIwOFYPOAU3aID28yCuNY0jvaKUd0Sd55x9H00Zz79M+ic776Hq/1Cici2gSfrQ== X-Received: by 2002:a5d:6404:: with SMTP id z4mr18125114wru.103.1613937216158; Sun, 21 Feb 2021 11:53:36 -0800 (PST) Received: from localhost.localdomain (cpc91226-cmbg18-2-0-cust7.5-4.cable.virginm.net. [82.0.29.8]) by smtp.gmail.com with ESMTPSA id z18sm1780372wrs.19.2021.02.21.11.53.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Feb 2021 11:53:35 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 Feb 2021 19:51:16 +0000 Message-Id: <20210221195125.1901683-9-sw@jkqxz.net> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210221195125.1901683-1-sw@jkqxz.net> References: <20210221195125.1901683-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 09/18] cbs_av1: Support manipulating HDR CLL and MDCV metadata X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/cbs_av1.c | 91 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index 0c958c81c2..281382c792 100644 --- a/libavcodec/cbs_av1.c +++ b/libavcodec/cbs_av1.c @@ -17,6 +17,7 @@ */ #include "libavutil/avassert.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/opt.h" #include "libavutil/pixfmt.h" @@ -1301,6 +1302,10 @@ static uint64_t cbs_av1_find_metadata_type(enum CBSMetadataType type) enum CBSMetadataType cbs_type; uint64_t av1_type; } map[] = { + { CBS_METADATA_CONTENT_LIGHT_LEVEL, + AV1_METADATA_TYPE_HDR_CLL }, + { CBS_METADATA_MASTERING_DISPLAY, + AV1_METADATA_TYPE_HDR_MDCV }, }; for (int i = 0; i < FF_ARRAY_ELEMS(map); i++) { @@ -1337,6 +1342,13 @@ static int cbs_av1_remove_metadata(CodedBitstreamContext *ctx, return 0; } +static uint32_t rescale_clip(AVRational value, uint32_t scale, + uint32_t bits) +{ + int64_t scaled = av_rescale(scale, value.num, value.den); + return av_clip64(scaled, 0, INT64_C(1) << bits); +} + static int cbs_av1_insert_metadata(CodedBitstreamContext *ctx, CodedBitstreamFragment *tu, enum CBSMetadataType type, @@ -1363,6 +1375,47 @@ static int cbs_av1_insert_metadata(CodedBitstreamContext *ctx, obu->obu.metadata.metadata_type = metadata_type; switch (metadata_type) { + case AV1_METADATA_TYPE_HDR_CLL: + { + const AVContentLightMetadata *clm = data; + AV1RawMetadataHDRCLL *cll = + &obu->obu.metadata.metadata.hdr_cll; + + cll->max_cll = av_clip_uintp2(clm->MaxCLL, 16); + cll->max_fall = av_clip_uintp2(clm->MaxFALL, 16); + } + break; + case AV1_METADATA_TYPE_HDR_MDCV: + { + const AVMasteringDisplayMetadata *mdm = data; + AV1RawMetadataHDRMDCV *mdcv = + &obu->obu.metadata.metadata.hdr_mdcv; + + if (mdm->has_primaries) { + for (int i = 0; i < 3; i++) { + mdcv->primary_chromaticity_x[i] = + rescale_clip(mdm->display_primaries[i][0], + 1 << 16, 16); + mdcv->primary_chromaticity_y[i] = + rescale_clip(mdm->display_primaries[i][1], + 1 << 16, 16); + } + + mdcv->white_point_chromaticity_x = + rescale_clip(mdm->white_point[0], 1 << 16, 16); + mdcv->white_point_chromaticity_y = + rescale_clip(mdm->white_point[1], 1 << 16, 16); + } + + if (mdm->has_luminance) { + uint32_t value; + value = rescale_clip(mdm->max_luminance, 1 << 8, 32); + mdcv->luminance_max = value; + mdcv->luminance_min = + rescale_clip(mdm->min_luminance, 1 << 14, 32); + } + } + break; default: av_assert0(0); } @@ -1398,6 +1451,44 @@ static int cbs_av1_extract_metadata(CodedBitstreamContext *ctx, obu = unit->content; switch (metadata_type) { + case AV1_METADATA_TYPE_HDR_CLL: + { + AVContentLightMetadata *clm = data; + const AV1RawMetadataHDRCLL *cll = + &obu->obu.metadata.metadata.hdr_cll; + + clm->MaxCLL = cll->max_cll; + clm->MaxFALL = cll->max_fall; + } + break; + case AV1_METADATA_TYPE_HDR_MDCV: + { + AVMasteringDisplayMetadata *mdm = data; + const AV1RawMetadataHDRMDCV *mdcv = + &obu->obu.metadata.metadata.hdr_mdcv; + + for (int i = 0; i < 3; i++) { + mdm->display_primaries[i][0] = + av_make_q(mdcv->primary_chromaticity_x[i], 1 << 16); + mdm->display_primaries[i][1] = + av_make_q(mdcv->primary_chromaticity_y[i], 1 << 16); + } + + mdm->white_point[0] = + av_make_q(mdcv->white_point_chromaticity_x, 1 << 16); + mdm->white_point[1] = + av_make_q(mdcv->white_point_chromaticity_y, 1 << 16); + + mdm->max_luminance = + av_make_q(mdcv->luminance_max, 1 << 8); + mdm->min_luminance = + av_make_q(mdcv->luminance_min, 1 << 14); + + // The standard doesn't allow partially-filled MDCV blocks, so + // if the metadata appears it must be complete. + mdm->has_primaries = mdm->has_luminance = 1; + } + break; default: av_assert0(0); }