From patchwork Mon Apr 3 07:29:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Lhomme X-Patchwork-Id: 3259 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.44.195 with SMTP id s186csp3060053vss; Mon, 3 Apr 2017 00:30:14 -0700 (PDT) X-Received: by 10.28.226.215 with SMTP id z206mr8170108wmg.92.1491204614824; Mon, 03 Apr 2017 00:30:14 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y47si18807854wrb.202.2017.04.03.00.30.14; Mon, 03 Apr 2017 00:30:14 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9E7DC680B17; Mon, 3 Apr 2017 10:30:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f171.google.com (mail-wr0-f171.google.com [209.85.128.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 951366805FB for ; Mon, 3 Apr 2017 10:30:03 +0300 (EEST) Received: by mail-wr0-f171.google.com with SMTP id l43so157753955wre.1 for ; Mon, 03 Apr 2017 00:30:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=t+G/o3k8xALqdd1kepTQqInJeuCbRBkGnQow/GQs35o=; b=b3ya9nkZP5n3s9fSe9q2+MAUecmQ748n2mo/VuYYuR3VukiVUdSFMhZGbWpnYFas6R YvqDkk1EojsqzUY+j7sentl03nVVFwDVHSBXBLqcNO8Y11JiGcpOPo2rYn332lrqRQaZ lQ9tibB0YAF/GEN087lXHnZ+DFAGyVwMpUT+J7+KvgHqLuXNmi1aSTffR5YjVc+4K52u CQSpv07CEm2e4i2Rs3C1DIZhdZy6WNuFNvmFcRc6k/1M1ifwARsmG8brbJyNC9VKd1r9 dXZQWtFLnG+qw1LEAvKlwfOPNm4m4+3dZwMrWr0zY37AjcMOOMlL8AJ/5VMP78XxN1q5 gqIQ== 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; bh=t+G/o3k8xALqdd1kepTQqInJeuCbRBkGnQow/GQs35o=; b=tEZAdMw2OW/st1be2biB12FFEHQDRPJCdydMkMq7Abxs87iBhmeiObnlogNnUvWhaO y63IcyjbeLXhpmHRhl7JbEKGUGNagWj3O3O/7rMgNd0z33oZakn6P5G58YLCldJpJy+2 EG4FAgqpOKv94pnVaYIejxE2f/ZNia/90QzEEelBBosykFR5kaloXtUwOp9qgHQnpmzz QkNg+qklZvTYYtBSv4NWBluPIKvR0KBb35/rBux/dFsH/+UBDPkhgXFTugtZJA8V1c7e UNKIYKpOJDfO5ZgloAE94kcnjlnVH5Z+W/Myz5f2r2bNFFN5zcxeIHlnF0TZy5ga2qdb WASw== X-Gm-Message-State: AFeK/H0a2s2rDDxle8L8Z+y/nkDsK1hbr3D3nqMDJ84N7RRTryXkAONN+kMsm12SC3/XUg== X-Received: by 10.223.163.212 with SMTP id m20mr12661162wrb.52.1491204604332; Mon, 03 Apr 2017 00:30:04 -0700 (PDT) Received: from localhost.localdomain (2a01cb0c000ea90038820d29b685d41a.ipv6.abo.wanadoo.fr. [2a01:cb0c:e:a900:3882:d29:b685:d41a]) by smtp.gmail.com with ESMTPSA id m14sm2444916wrb.13.2017.04.03.00.30.03 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Apr 2017 00:30:03 -0700 (PDT) From: Steve Lhomme To: ffmpeg-devel@ffmpeg.org Date: Mon, 3 Apr 2017 09:29:45 +0200 Message-Id: <20170403072947.10208-1-robux4@gmail.com> X-Mailer: git-send-email 2.11.1 Subject: [FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" As found in HEVC. I put the code in mastering_display_metadata as they usually go together in Blu-Ray UHD sources. --- update the previous patch: - rename CEA 861.3 to CTA-861.3 - use MaxCLL and MaxFALL names that are more commonly found - use unsigned integer rather than rational numbers as (supposedly) in the specs - provide the structure size on output of av_content_light_metadata_alloc() update the previous patch: - rebased and updated version bump update the previous patch: - rebased and updated version bump - fix contains typo --- libavutil/frame.c | 1 + libavutil/frame.h | 6 ++++++ libavutil/mastering_display_metadata.c | 23 ++++++++++++++++++++ libavutil/mastering_display_metadata.h | 39 ++++++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 5 files changed, 70 insertions(+), 1 deletion(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index 8811dcdcfe..dd12c5549c 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type) case AV_FRAME_DATA_SKIP_SAMPLES: return "Skip samples"; case AV_FRAME_DATA_AUDIO_SERVICE_TYPE: return "Audio service type"; case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata"; + case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light level metadata"; case AV_FRAME_DATA_GOP_TIMECODE: return "GOP timecode"; } return NULL; diff --git a/libavutil/frame.h b/libavutil/frame.h index 7cb78a1a44..4d8c1bed4f 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -127,6 +127,12 @@ enum AVFrameSideDataType { * libavutil/spherical.h. */ AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, }; enum AVActiveFormatDescription { diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c index e1683e55c7..6069347617 100644 --- a/libavutil/mastering_display_metadata.c +++ b/libavutil/mastering_display_metadata.c @@ -41,3 +41,26 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFra return (AVMasteringDisplayMetadata *)side_data->data; } + +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size) +{ + AVContentLightMetadata *metadata = av_mallocz(sizeof(AVContentLightMetadata)); + + if (size) + *size = sizeof(*metadata); + + return metadata; +} + +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame) +{ + AVFrameSideData *side_data = av_frame_new_side_data(frame, + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + sizeof(AVContentLightMetadata)); + if (!side_data) + return NULL; + + memset(side_data->data, 0, sizeof(AVContentLightMetadata)); + + return (AVContentLightMetadata *)side_data->data; +} diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h index 936533fec4..847b0b62c6 100644 --- a/libavutil/mastering_display_metadata.h +++ b/libavutil/mastering_display_metadata.h @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); */ AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/libavutil/version.h b/libavutil/version.h index b0f9ba4f4e..95e1e929f3 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 55 -#define LIBAVUTIL_VERSION_MINOR 59 +#define LIBAVUTIL_VERSION_MINOR 60 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \