From patchwork Fri Jan 1 21:35:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 24738 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 57FB944BCD1 for ; Fri, 1 Jan 2021 23:38:12 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 434D368A8FD; Fri, 1 Jan 2021 23:38:12 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1828068A83C for ; Fri, 1 Jan 2021 23:38:09 +0200 (EET) Received: by mail-wm1-f46.google.com with SMTP id 190so9871956wmz.0 for ; Fri, 01 Jan 2021 13:38:09 -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=gJsul0sEGk67GuRR8Ko9qTTaIEbzG3pDyzrRhKy1khU=; b=J2Q3KXVCKZmdGwxyExh8prisXwM5uOU5EnZCJdbo9Elq+LEtFdMyQsFapIFun28J7S FLXhGARmWAJNOocE7LdWX0e2vRtALV7EvldGIjsQjf9I1tnajTXADLC4rxbTc/N+2+9i 9peJw9nZcQWmp3e/vO1FcYqpBxjFZn3oMuBTKzLzJKmttisPBLA2RMDYzO2yRW9ELd/0 vpbL68xn0ObXQSLUPRPLVY5TQ62iWAVwkUf/56lAI2cBGBhEE5WJGU9d9T6go5+CLw0J 3UIfO7uoMK0YHwpq1uqUv2EdJix7bApI8PA+GHS0RzHSoY+91NZjbr41mIhl0ClHoeWH Vt6w== 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=gJsul0sEGk67GuRR8Ko9qTTaIEbzG3pDyzrRhKy1khU=; b=nqJoLHdHYdtSnWNW8lqN1kvxIDBqNhYuWXkdCxSzHI0eqOFclvV88Our/BubTiE3z0 4zR7L/Y7SE73lJK+fjrCces96yQ4+Bl2c8G94DzmsWCs33zYk4Yn9CgqgpYA39wO06QT Lv8a12S0iHQD2zrJCY/31d42br3kKebH2gSMEfICl0KkLuR2dW3ienKZsIVnIrx32VWX POhedBGso9SZ6n/4FKfzCpECADkrhqOqEGBUh4krakKEBq4bFGRI62oJhv/B6FoFDnLs eCKxkqfIQhx54nL8vhsCYWIer+J5MBRzFmQL5lekl6S/Yq2WhEz75Jn8KWrLb68xxREM IOwA== X-Gm-Message-State: AOAM5337OCPJuUtghI0wp1b+4DqvZ5/yAjCQVk4AAh/DWekUAoa9rVvc vc5LAasCiGcCsycXpgClAqzA2zOAjj9/bw== X-Google-Smtp-Source: ABdhPJwFSkgRgSLbpr5zCHr8lt28lNkWUoHCLdHxutiuSww0r7R2mT8rQgWaPzBrWNzFwJCm2sqL8g== X-Received: by 2002:a7b:c19a:: with SMTP id y26mr16512067wmi.20.1609537088348; Fri, 01 Jan 2021 13:38:08 -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 v20sm18784595wml.34.2021.01.01.13.38.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 Jan 2021 13:38:07 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Fri, 1 Jan 2021 21:35:29 +0000 Message-Id: <20210101213537.169546-20-sw@jkqxz.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210101213537.169546-1-sw@jkqxz.net> References: <20210101213537.169546-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 19/27] 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 | 95 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index 3bca121fba..2b5fad69e9 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/pixfmt.h" #include "cbs.h" @@ -1285,6 +1286,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++) { @@ -1321,6 +1326,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, @@ -1347,6 +1359,51 @@ 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; + av_log(ctx->log_ctx, AV_LOG_ERROR, "mdcv->luminance_max = %d, %d\n", + mdcv->luminance_max, value); + mdcv->luminance_min = + rescale_clip(mdm->min_luminance, 1 << 14, 32); + av_log(ctx->log_ctx, AV_LOG_ERROR, "mdcv->luminance_min = %d\n", + mdcv->luminance_min); + } + } + break; default: av_assert0(0); } @@ -1381,6 +1438,44 @@ static int cbs_av1_extract_metadata(CodedBitstreamContext *ctx, } 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); }