From patchwork Fri Jul 31 10:09:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harry Mallon X-Patchwork-Id: 21399 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 F1E5244B4E1 for ; Fri, 31 Jul 2020 13:10:07 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C67BD68B7B6; Fri, 31 Jul 2020 13:10:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f102.google.com (mail-ot1-f102.google.com [209.85.210.102]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B362B68B630 for ; Fri, 31 Jul 2020 13:10:00 +0300 (EEST) Received: by mail-ot1-f102.google.com with SMTP id 93so12082180otx.2 for ; Fri, 31 Jul 2020 03:10:00 -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=1ZUqgH4xQMR0hN8I+hyJetwgwA1lBs+b1vwBWHFbO5o=; b=YTLeFCjDILkEnQce9VlJmqjiRpWcXqoC9aeukUczHOe8ACUh+TyFuea0cIqHHQ/uDk 4CPK08EsEXZZ3cmmE/LVLuQMPiC6p0QpzihJxFyNg0yT0shhTCO9TO6KjE+rStxynGtA zy42JZwJ1d/s/yDlsMuoEaoq7Yw07r31yt3PE= 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=1ZUqgH4xQMR0hN8I+hyJetwgwA1lBs+b1vwBWHFbO5o=; b=c3hgqbCX/ENGOtIj6UpbWiAVulu4zqPrpRoxZHoMIw06JnauwNW+ZPS7kxRo6h5hqJ 9fsZZmuGUVHKpDMzI+4d77g6WYrG94oUr1K0RFEtvU4p6M54J27m6syiRntAC9q07qPO tWSaO+p5fa03Wz98V4Ot9GzberXmoY2AMUnK+Hyi2wzqPQnnBS0HYG4M2UlusH61ltjy KHScuonuO1gcwnUkgKS3gKuB9ULquv4mpwUJVAkrSWAAcjohlH+9WLfVzQXWpOD3LHy0 taSR8lv5hxmx+0dckKsCp8j9edULMeb03SVlms5o39DImaKnmj6DGKvtPdvf4r4lAkRz Xscw== X-Gm-Message-State: AOAM5307lpVqG3fGQVHmLxQw2LFMKFHdfHGarKa8dMFC56NPkrekRUEe NUe2XV9uQnMT+2qHPbcjjKwclOP8gp+X+G6hHHjwYRJgCrrYsQ== X-Google-Smtp-Source: ABdhPJxK0/OqolCtv1jE6VEc5ps+T93JIu5DQPqyUIEmtM1VCpaw7F3v5huCE1Z3W63zR9Zf84dL6nIiQqLn X-Received: by 2002:a9d:6218:: with SMTP id g24mr2515911otj.48.1596190198746; Fri, 31 Jul 2020 03:09:58 -0700 (PDT) Received: from us3.smtp.exclaimer.net (us3.smtp.exclaimer.net. [23.100.16.236]) by smtp-relay.gmail.com with ESMTPS id d10sm878463oob.15.2020.07.31.03.09.58 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 31 Jul 2020 03:09:58 -0700 (PDT) X-Relaying-Domain: pixsystem.com Received: from mail-wm1-f72.google.com (209.85.128.72) by us3.smtp.exclaimer.net (23.100.16.236) with Exclaimer Signature Manager ESMTP Proxy us3.smtp.exclaimer.net (tlsversion=TLS12, tlscipher=TLS_ECDHE_WITH_AES256_SHA1); Fri, 31 Jul 2020 10:09:57 +0000 X-ExclaimerHostedSignatures-MessageProcessed: true X-ExclaimerProxyLatency: 9957120 X-ExclaimerImprintLatency: 2157175 X-ExclaimerImprintAction: 52df2a01f7cd444db62789b2e3b1cb37 Received: by mail-wm1-f72.google.com with SMTP id u14so1875668wml.0 for ; Fri, 31 Jul 2020 03:09:57 -0700 (PDT) X-Received: by 2002:a1c:7306:: with SMTP id d6mr3036245wmb.113.1596190195934; Fri, 31 Jul 2020 03:09:55 -0700 (PDT) X-Received: by 2002:a1c:7306:: with SMTP id d6mr3036221wmb.113.1596190195578; Fri, 31 Jul 2020 03:09:55 -0700 (PDT) Received: from ?IPv6:2a01:4b00:8571:3800:54dc:edf6:5273:4b3f? ([2a01:4b00:8571:3800:54dc:edf6:5273:4b3f]) by smtp.gmail.com with ESMTPSA id j24sm14303702wrb.49.2020.07.31.03.09.54 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 31 Jul 2020 03:09:55 -0700 (PDT) From: Harry Mallon Mime-Version: 1.0 Message-Id: <3AAD3CB2-80D0-40C7-BF2E-A21D8E57BE36@codex.online> Date: Fri, 31 Jul 2020 11:09:54 +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 v2] avformat/mxfdec: Read color metadata from 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" Hi, V2 fixes all the fate tests (I didn't know to download the test footage before. Doh). The following patch adds reading colour metadata (transfer, primaries and colour space) from standard MXF files. I wrote it without seeing the other patch but it turned out very similar to this one that was never merged. https://patchwork.ffmpeg.org/project/ffmpeg/patch/1474694344-31167-1-git-send-email-steven@strobe.cc/ . Thanks. Harry From d16966e6b0a6367a5e5445987c0449fb1150785a Mon Sep 17 00:00:00 2001 From: Harry Mallon Date: Mon, 27 Jul 2020 15:52:17 +0100 Subject: [PATCH] avformat/mxfdec: Read color metadata from MXF Reads color_primaries, color_trc and color_space from mxf headers. ULs are from https://registry.smpte-ra.org/ site. Signed-off-by: Harry Mallon --- libavformat/mxf.c | 49 +++++++++++++++++++++++++ libavformat/mxf.h | 3 ++ libavformat/mxfdec.c | 15 ++++++++ tests/ref/fate/mxf-d10-user-comments | 2 +- tests/ref/fate/mxf-opatom-user-comments | 2 +- tests/ref/fate/mxf-probe-d10 | 2 +- tests/ref/fate/mxf-probe-dnxhd | 4 +- tests/ref/fate/mxf-probe-dv25 | 2 +- tests/ref/fate/mxf-reel_name | 2 +- tests/ref/fate/mxf-user-comments | 2 +- 10 files changed, 75 insertions(+), 8 deletions(-) diff --git a/libavformat/mxf.c b/libavformat/mxf.c index 7d154ca9d3..e51fc48a84 100644 --- a/libavformat/mxf.c +++ b/libavformat/mxf.c @@ -86,6 +86,55 @@ const MXFCodecUL ff_mxf_codec_tag_uls[] = { { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, 0 }, }; +const MXFCodecUL ff_mxf_color_primaries_uls[] = { + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x03,0x01,0x00,0x00 }, 14, AVCOL_PRI_SMPTE170M }, /* SMPTE 170M */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x03,0x02,0x00,0x00 }, 14, AVCOL_PRI_BT470BG }, /* ITU-R BT.470 PAL */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x03,0x03,0x00,0x00 }, 14, AVCOL_PRI_BT709 }, /* ITU-R BT.709 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x03,0x04,0x00,0x00 }, 14, AVCOL_PRI_BT2020 }, /* ITU-R BT.2020 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x03,0x05,0x00,0x00 }, 14, AVCOL_PRI_SMPTE428 }, /* SMPTE-DC28 DCDM */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x03,0x06,0x00,0x00 }, 14, AVCOL_PRI_SMPTE432 }, /* P3D65 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x03,0x08,0x00,0x00 }, 14, AVCOL_PRI_SMPTE428 }, /* Cinema Mezzanine */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x03,0x0a,0x00,0x00 }, 14, AVCOL_PRI_SMPTE431 }, /* P3DCI */ + /* alternate mappings for encoding */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x03,0x01,0x00,0x00 }, 14, AVCOL_PRI_SMPTE240M }, /* = AVCOL_PRI_SMPTE170M */ + + { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AVCOL_PRI_UNSPECIFIED }, +}; + +const MXFCodecUL ff_mxf_color_trc_uls[] = { + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x00,0x00 }, 14, AVCOL_TRC_GAMMA22 }, /* ITU-R BT.470 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00 }, 14, AVCOL_TRC_BT709 }, /* ITU-R BT.709 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x03,0x00,0x00 }, 14, AVCOL_TRC_SMPTE240M }, /* SMPTE 240M */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x04,0x00,0x00 }, 14, AVCOL_TRC_BT709 }, /* SMPTE 274/296M (must appear after ITU-R BT.709) */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x01,0x05,0x00,0x00 }, 14, AVCOL_TRC_BT1361_ECG }, /* ITU-R BT.1361 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x01,0x06,0x00,0x00 }, 14, AVCOL_TRC_LINEAR }, /* Linear */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x08,0x04,0x01,0x01,0x01,0x01,0x07,0x00,0x00 }, 14, AVCOL_TRC_SMPTE428 }, /* SMPTE-DC28 DCDM */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x01,0x08,0x00,0x00 }, 14, AVCOL_TRC_IEC61966_2_4 }, /* IEC 61966-2-4 xvYCC */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0E,0x04,0x01,0x01,0x01,0x01,0x09,0x00,0x00 }, 14, AVCOL_TRC_BT2020_10 }, /* ITU-R BT.2020 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x01,0x0A,0x00,0x00 }, 14, AVCOL_TRC_SMPTE2084 }, /* SMPTE ST 2084 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x01,0x0B,0x00,0x00 }, 14, AVCOL_TRC_ARIB_STD_B67 }, /* Hybrid Log-Gamma OETF */ + /* alternate mappings for encoding */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x00,0x00 }, 14, AVCOL_TRC_GAMMA28 }, /* = AVCOL_TRC_GAMMA22 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00 }, 14, AVCOL_TRC_SMPTE170M }, /* = AVCOL_TRC_BT709 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0E,0x04,0x01,0x01,0x01,0x01,0x09,0x00,0x00 }, 14, AVCOL_TRC_BT2020_12 }, /* = AVCOL_TRC_BT2020_10 */ + + { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AVCOL_TRC_UNSPECIFIED }, +}; + +/* aka Coding Equations */ +const MXFCodecUL ff_mxf_color_space_uls[] = { + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x02,0x01,0x00,0x00 }, 14, AVCOL_SPC_BT470BG }, /* ITU-R BT.601 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x02,0x02,0x00,0x00 }, 14, AVCOL_SPC_BT709 }, /* ITU-R BT.709 */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x02,0x03,0x00,0x00 }, 14, AVCOL_SPC_SMPTE240M }, /* SMPTE 240M */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x02,0x04,0x00,0x00 }, 14, AVCOL_SPC_YCGCO }, /* YCgCo */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x02,0x05,0x00,0x00 }, 14, AVCOL_SPC_RGB }, /* GBR */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x02,0x06,0x00,0x00 }, 14, AVCOL_SPC_BT2020_NCL }, /* ITU-R BT.2020 Non-Constant Luminance */ + /* alternate mappings for encoding */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x02,0x03,0x00,0x00 }, 14, AVCOL_SPC_SMPTE170M }, /* = AVCOL_SPC_SMPTE240M */ + + { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, AVCOL_SPC_UNSPECIFIED }, +}; + static const struct { enum AVPixelFormat pix_fmt; const char data[16]; diff --git a/libavformat/mxf.h b/libavformat/mxf.h index f2fff2781e..fc587f19f0 100644 --- a/libavformat/mxf.h +++ b/libavformat/mxf.h @@ -91,6 +91,9 @@ extern const MXFCodecUL ff_mxf_data_definition_uls[]; extern const MXFCodecUL ff_mxf_codec_uls[]; extern const MXFCodecUL ff_mxf_pixel_format_uls[]; extern const MXFCodecUL ff_mxf_codec_tag_uls[]; +extern const MXFCodecUL ff_mxf_color_primaries_uls[]; +extern const MXFCodecUL ff_mxf_color_trc_uls[]; +extern const MXFCodecUL ff_mxf_color_space_uls[]; int ff_mxf_decode_pixel_layout(const char pixel_layout[16], enum AVPixelFormat *pix_fmt); int ff_mxf_get_content_package_rate(AVRational time_base); diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index f0975f409e..4b56984b77 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -207,6 +207,9 @@ typedef struct MXFDescriptor { uint8_t *extradata; int extradata_size; enum AVPixelFormat pix_fmt; + UID color_primaries_ul; + UID color_trc_ul; + UID color_space_ul; } MXFDescriptor; typedef struct MXFIndexTableSegment { @@ -1201,9 +1204,18 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int descriptor->aspect_ratio.num = avio_rb32(pb); descriptor->aspect_ratio.den = avio_rb32(pb); break; + case 0x3210: + avio_read(pb, descriptor->color_trc_ul, 16); + break; case 0x3212: descriptor->field_dominance = avio_r8(pb); break; + case 0x3219: + avio_read(pb, descriptor->color_primaries_ul, 16); + break; + case 0x321A: + avio_read(pb, descriptor->color_space_ul, 16); + break; case 0x3301: descriptor->component_depth = avio_rb32(pb); break; @@ -2480,6 +2492,9 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) } if (descriptor->aspect_ratio.num && descriptor->aspect_ratio.den) st->display_aspect_ratio = descriptor->aspect_ratio; + st->codecpar->color_primaries = mxf_get_codec_ul(ff_mxf_color_primaries_uls, &descriptor->color_primaries_ul)->id; + st->codecpar->color_trc = mxf_get_codec_ul(ff_mxf_color_trc_uls, &descriptor->color_trc_ul)->id; + st->codecpar->color_space = mxf_get_codec_ul(ff_mxf_color_space_uls, &descriptor->color_space_ul)->id; } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul); /* Only overwrite existing codec ID if it is unset or A-law, which is the default according to SMPTE RP 224. */ diff --git a/tests/ref/fate/mxf-d10-user-comments b/tests/ref/fate/mxf-d10-user-comments index e78765020c..de4f26c6f8 100644 --- a/tests/ref/fate/mxf-d10-user-comments +++ b/tests/ref/fate/mxf-d10-user-comments @@ -1 +1 @@ -b659c1204f8d04e2a5607af083590dca +68f0fa62b6a676894afbbe4c34ebf70b diff --git a/tests/ref/fate/mxf-opatom-user-comments b/tests/ref/fate/mxf-opatom-user-comments index 1834b9e074..90e3fb229a 100644 --- a/tests/ref/fate/mxf-opatom-user-comments +++ b/tests/ref/fate/mxf-opatom-user-comments @@ -1 +1 @@ -892cf02e44bf7d61b6d6f01e41db9375 +f6760a9e710ba478bc3949f3e5c9b34a diff --git a/tests/ref/fate/mxf-probe-d10 b/tests/ref/fate/mxf-probe-d10 index b59fe4b597..17f47639f3 100644 --- a/tests/ref/fate/mxf-probe-d10 +++ b/tests/ref/fate/mxf-probe-d10 @@ -18,7 +18,7 @@ pix_fmt=yuv422p level=5 color_range=tv color_space=unknown -color_transfer=unknown +color_transfer=bt470m color_primaries=unknown chroma_location=topleft field_order=tt diff --git a/tests/ref/fate/mxf-probe-dnxhd b/tests/ref/fate/mxf-probe-dnxhd index 5d385e8a06..012d3ea1d9 100644 --- a/tests/ref/fate/mxf-probe-dnxhd +++ b/tests/ref/fate/mxf-probe-dnxhd @@ -126,8 +126,8 @@ pix_fmt=yuv422p level=-99 color_range=unknown color_space=bt709 -color_transfer=unknown -color_primaries=unknown +color_transfer=bt709 +color_primaries=bt709 chroma_location=unspecified field_order=progressive timecode=N/A diff --git a/tests/ref/fate/mxf-probe-dv25 b/tests/ref/fate/mxf-probe-dv25 index d0fb308c19..810f145f41 100644 --- a/tests/ref/fate/mxf-probe-dv25 +++ b/tests/ref/fate/mxf-probe-dv25 @@ -18,7 +18,7 @@ pix_fmt=yuv420p level=-99 color_range=unknown color_space=unknown -color_transfer=unknown +color_transfer=bt470m color_primaries=unknown chroma_location=topleft field_order=bb diff --git a/tests/ref/fate/mxf-reel_name b/tests/ref/fate/mxf-reel_name index cfe62dfdb7..16022b1789 100644 --- a/tests/ref/fate/mxf-reel_name +++ b/tests/ref/fate/mxf-reel_name @@ -1 +1 @@ -a788589c14f343dcc6d75aaaec0f0266 +73a891041b2fc836a893ffb49fff4fff diff --git a/tests/ref/fate/mxf-user-comments b/tests/ref/fate/mxf-user-comments index e91b23baa5..ddf51d939c 100644 --- a/tests/ref/fate/mxf-user-comments +++ b/tests/ref/fate/mxf-user-comments @@ -1 +1 @@ -c6469c0ae2aaee602eacbc009080ae8e +1255faf854223a74d707553121e5eca3