From patchwork Thu Aug 6 14:27:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harry Mallon X-Patchwork-Id: 21516 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 17C1444B860 for ; Thu, 6 Aug 2020 17:28:04 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E065668B650; Thu, 6 Aug 2020 17:28:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f100.google.com (mail-ot1-f100.google.com [209.85.210.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8E5B068B650 for ; Thu, 6 Aug 2020 17:27:56 +0300 (EEST) Received: by mail-ot1-f100.google.com with SMTP id r21so25766408ota.10 for ; Thu, 06 Aug 2020 07:27:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codex.online; s=google; h=from:mime-version:subject:message-id:date:to; bh=Avpy4blgxUWBs78TghhCOwBKW24RjGtXO+d5eFRjRDE=; b=WtlfwerQPLpejECK57EoMWUZLnmvTRqpjAiX+b2YgzDIf7Hy7nvYxtUlJlzMb96w1v EUg+1G0Rcqi+ldqpamaRzPx3KiD40juuwdjzGG4l5epUv18ACJH6GJie0i5Fkp+4fVjh StEM7dgpngDHbrRPk8+NyxLIluSQ5iC/aa3F8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:mime-version:subject:message-id:date:to; bh=Avpy4blgxUWBs78TghhCOwBKW24RjGtXO+d5eFRjRDE=; b=lMRmcPyhTW6onPCW55j0+HQh2wXm3Zs8QXfO+Ongvb41JJwqZyXEcO0GBbDzgis+Ol P9VzxYMqVjZJGDYJqCOjq2r85+bSCpOipeQ0GlS3Z/u7cgzQQQ/URyyJk5kB/nJwN5cn LPDv9GgOrmjetz9kbzI7qv2LxaMZtWz0qP5/aFGauJbxGVuxjc8dHySVk5wmbzGqe9RM LAvYSJzlkRl1YxG53Jl1vdIgS5X6W0Ztn+1IA0qbNpQLdM+/YiCIUPPrOfE+x5HwZRQS K3pK1D7SV+pRWgdLqgJYl/ybMSqFJBBbapPmjrZKvXLPVt9rUVQRoSChPFt24m/Utrja +6CQ== X-Gm-Message-State: AOAM532OZXKItkHnfZphMQu/w0rJp+qKw7WZQTnOa6+3F/ZGuDGHdgPh bVecyzWMnp7M6eXcRH1TDumJmBWeh4xoLinRcDOru6UeyF8RZQ== X-Google-Smtp-Source: ABdhPJxeX/8/Ql1PIZzBv7xumdAmPfgf4BUfPTyc8b2FqcdMDbPbDRBOQ5nbqVB6sufQY5CDY7IZFYoTyjPJ X-Received: by 2002:a9d:d84:: with SMTP id 4mr6926627ots.173.1596724074795; Thu, 06 Aug 2020 07:27:54 -0700 (PDT) Received: from us4.smtp.exclaimer.net (us4.smtp.exclaimer.net. [23.100.38.75]) by smtp-relay.gmail.com with ESMTPS id p12sm638239otk.9.2020.08.06.07.27.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 06 Aug 2020 07:27:54 -0700 (PDT) X-Relaying-Domain: pixsystem.com Received: from mail-wm1-f72.google.com (209.85.128.72) by us4.smtp.exclaimer.net (23.100.38.75) with Exclaimer Signature Manager ESMTP Proxy us4.smtp.exclaimer.net (tlsversion=TLS12, tlscipher=TLS_ECDHE_WITH_AES256_SHA1); Thu, 6 Aug 2020 14:27:55 +0000 X-ExclaimerHostedSignatures-MessageProcessed: true X-ExclaimerProxyLatency: 23057959 X-ExclaimerImprintLatency: 3148628 X-ExclaimerImprintAction: 20b7e1414cce4c8e95d91b1fb33136a0 Received: by mail-wm1-f72.google.com with SMTP id d22so4227459wmd.2 for ; Thu, 06 Aug 2020 07:27:52 -0700 (PDT) X-Received: by 2002:adf:de09:: with SMTP id b9mr7817337wrm.409.1596724070426; Thu, 06 Aug 2020 07:27:50 -0700 (PDT) X-Received: by 2002:adf:de09:: with SMTP id b9mr7817318wrm.409.1596724070072; Thu, 06 Aug 2020 07:27:50 -0700 (PDT) Received: from ?IPv6:2a01:4b00:8571:3800:550f:64ee:13df:4b7e? ([2a01:4b00:8571:3800:550f:64ee:13df:4b7e]) by smtp.gmail.com with ESMTPSA id f15sm6381663wmj.39.2020.08.06.07.27.49 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 06 Aug 2020 07:27:49 -0700 (PDT) From: Harry Mallon Mime-Version: 1.0 Message-Id: <38F7B904-4988-45CD-BC4C-68FDABA578BA@codex.online> Date: Thu, 6 Aug 2020 15:27:48 +0100 To: ffmpeg-devel@ffmpeg.org X-Mailer: Apple Mail (2.3608.120.23.2.1) X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH] avformat/mxfenc: Write color metadata to MXF 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" I attach a patch to apply the colour metadata that was read in my previous commit during mxf encoding. ffmpeg previously wrote the transfer characteristic only, and not for all supported transfer curves. Now it will do transfer characteristic, colour primaries and colour space. Best, Harry From de460620b73379d5a869baa98e49a5d0f67d9ebb Mon Sep 17 00:00:00 2001 From: Harry Mallon Date: Tue, 28 Jul 2020 10:33:19 +0100 Subject: [PATCH] avformat/mxfenc: Write color metadata to MXF Writes color_primaries, color_trc and color_space to mxf headers. ULs are from https://registry.smpte-ra.org/ site. Signed-off-by: Harry Mallon --- libavformat/mxfenc.c | 58 ++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 5a3a609bf6..a38fa6b983 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -553,11 +553,10 @@ static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value) avio_wb24(pb, value); } -static const MXFCodecUL *mxf_get_data_definition_ul(int type) +static const MXFCodecUL *mxf_get_codec_ul_by_id(const MXFCodecUL *uls, int id) { - const MXFCodecUL *uls = ff_mxf_data_definition_uls; while (uls->uid[0]) { - if (type == uls->id) + if (id == uls->id) break; uls++; } @@ -847,7 +846,7 @@ static void mxf_write_common_fields(AVFormatContext *s, AVStream *st) if (st == mxf->timecode_track) avio_write(pb, smpte_12m_timecode_track_data_ul, 16); else { - const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codecpar->codec_type); + const MXFCodecUL *data_def_ul = mxf_get_codec_ul_by_id(ff_mxf_data_definition_uls, st->codecpar->codec_type); avio_write(pb, data_def_ul->uid, 16); } @@ -1049,34 +1048,6 @@ static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0 static const UID mxf_avc_subdescriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6E,0x00 }; -static int get_trc(UID ul, enum AVColorTransferCharacteristic trc) -{ - switch (trc){ - case AVCOL_TRC_GAMMA28 : - case AVCOL_TRC_GAMMA22 : - memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x00,0x00}), 16); - return 0; - case AVCOL_TRC_BT709 : - case AVCOL_TRC_SMPTE170M : - memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00}), 16); - return 0; - case AVCOL_TRC_SMPTE240M : - memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x03,0x00,0x00}), 16); - return 0; - case AVCOL_TRC_BT1361_ECG: - memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x01,0x05,0x00,0x00}), 16); - return 0; - case AVCOL_TRC_LINEAR : - memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x01,0x06,0x00,0x00}), 16); - return 0; - case AVCOL_TRC_SMPTE428 : - memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x08,0x04,0x01,0x01,0x01,0x01,0x07,0x00,0x00}), 16); - return 0; - default: - return -1; - } -} - static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key) { MXFStreamContext *sc = st->priv_data; @@ -1085,10 +1056,14 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID int stored_height = (st->codecpar->height+15)/16*16; int display_height; int f1, f2; - UID transfer_ul = {0}; + const MXFCodecUL *color_primaries_ul; + const MXFCodecUL *color_trc_ul; + const MXFCodecUL *color_space_ul; int64_t pos = mxf_write_generic_desc(s, st, key); - get_trc(transfer_ul, st->codecpar->color_trc); + color_primaries_ul = mxf_get_codec_ul_by_id(ff_mxf_color_primaries_uls, st->codecpar->color_primaries); + color_trc_ul = mxf_get_codec_ul_by_id(ff_mxf_color_trc_uls, st->codecpar->color_trc); + color_space_ul = mxf_get_codec_ul_by_id(ff_mxf_color_space_uls, st->codecpar->color_space); if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO) { if (st->codecpar->height == 1080) @@ -1235,10 +1210,19 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID avio_wb32(pb, sc->aspect_ratio.num); avio_wb32(pb, sc->aspect_ratio.den); - //Transfer characteristic - if (transfer_ul[0]) { + if (color_primaries_ul->uid[0]) { + mxf_write_local_tag(pb, 16, 0x3219); + avio_write(pb, color_primaries_ul->uid, 16); + }; + + if (color_trc_ul->uid[0]) { mxf_write_local_tag(pb, 16, 0x3210); - avio_write(pb, transfer_ul, 16); + avio_write(pb, color_trc_ul->uid, 16); + }; + + if (color_space_ul->uid[0]) { + mxf_write_local_tag(pb, 16, 0x321A); + avio_write(pb, color_space_ul->uid, 16); }; mxf_write_local_tag(pb, 16, 0x3201);