From patchwork Fri Dec 15 21:22:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tobias Rapp X-Patchwork-Id: 6799 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp1000667jah; Fri, 15 Dec 2017 13:22:30 -0800 (PST) X-Google-Smtp-Source: ACJfBotYsOxfSA5BJx/n9xM13GzNMd3MQfXp/ZWNbIp5lOSBR0eFnvJCnVOxfIw79Jfa0AMfMxp1 X-Received: by 10.223.148.102 with SMTP id 93mr11258808wrq.32.1513372950539; Fri, 15 Dec 2017 13:22:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513372950; cv=none; d=google.com; s=arc-20160816; b=eQGx6AlA9rxb1W0cFJLmVSMl3jN2FE5j0EHTuctpBFdd2515TL7gyp1qf7mjGvcoEx pCOl9CZiRvOIUikMS3a0bqws7s42yHsZ3rV62fYZDUJYFotdHobw2XCiXdyEb5NXe9US l8vtGLhHUDbHJ6UEXEvkAjKPKYxQQQY2UhFSxt0rPxjJR+v7rUNVrdZKKSoMvEXYXYDb 1JllfPf6C9zcurByCqETXbdzWRjvsBeY2vXGwZp1jiWDP25wR/HvjKbBE2lhAA3uDwvR JYterE6WAZSkrjgrJuzxvdI4yl1zLDN7l1TyRhY/47pLGNgQ27K/CMkuEWSVfzR63NVt ZzOw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to :arc-authentication-results; bh=DtOLjcsNJcgc0jrdgkAq+DVWJk2ggQZvwqrxQhbSKuw=; b=wC6BGjIAHinTEBrzsYEyR8icSUoSqXKburknUVeiaNqXpC8GH98puLNJczmkKtWOLk HamfledwCm6o7n0DSBLzK9sAFGKtcAJlg2nRueF+2i37SWF7EL8eeBXglhgue9MIm76O ERGI9dxfe9v0fblvsbzxpOmZpyRkNxAIult+NlV9Wti5/d0vPUpOoPQLcYPEyO2E826M 32H8WOwfAe/w0ie/54aoCmGnLMG8pJRjL5Md8NZZV9gkzKIQEUgfLZMX9wPfzjyh4Xhe Sv9kdVu4JvZ8xV0RjEEESGcLDsGMuAjzrcX6ROEdQjNJ2aVROyTQlkpLoUtjMQu6pDLD +Abg== ARC-Authentication-Results: i=1; mx.google.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x123si3495887wmd.114.2017.12.15.13.22.29; Fri, 15 Dec 2017 13:22:30 -0800 (PST) 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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 45618688374; Fri, 15 Dec 2017 23:22:19 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mx01.mail.netstorage.at (mx01.mail.netstorage.at [89.207.144.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 01252680A24 for ; Fri, 15 Dec 2017 23:22:12 +0200 (EET) Received: from p1002.netstorage.at (p1002.netstorage.at [89.207.146.186]) by mx01.mail.netstorage.at (Postfix) with ESMTPS id C0D02A03A2 for ; Fri, 15 Dec 2017 22:22:09 +0100 (CET) Received: from mailix (noaport.de [46.237.252.213]) by p1002.netstorage.at (Postfix) with ESMTPA id 6040D81302 for ; Fri, 15 Dec 2017 22:22:09 +0100 (CET) Received: from frogstar-a.kuhnle.local (frogstar-a.kuhnle.local [192.168.0.26]) by mailix with ESMTPA ; Fri, 15 Dec 2017 22:22:11 +0100 From: Tobias Rapp To: ffmpeg-devel@ffmpeg.org Date: Fri, 15 Dec 2017 22:22:09 +0100 Message-Id: <1513372929-4071-1-git-send-email-t.rapp@noa-archive.com> X-Mailer: git-send-email 2.7.4 X-PPP-Message-ID: <20171215212209.6576.87649@p1002.netstorage.at> X-PPP-Vhost: noa-archive.com X-NetStorage-MailScanner-Information: Please contact the ISP for more information X-NetStorage-MailScanner-ID: C0D02A03A2.A56A7 X-NetStorage-MailScanner: Found to be clean X-NetStorage-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (nicht zwischen gespeichert, Wertung=-0.25, benoetigt 6, BAYES_00 -0.50, KAM_LOTSOFHASH 0.25) X-NetStorage-MailScanner-From: t.rapp@noa-archive.com X-Spam-Status: No Subject: [FFmpeg-devel] [PATCH][RFC] avcodec/dpxenc: add option to force color transfer characteristics 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" Based on a patch by Kieran O'Leary. Fixes ticket #6023. Open topics: - is there some mapping missing in color_trc_to_dpx? - the default for color_trc is DPX_TRC_UNDEFINED, would it be better to use DPX_TRC_USER_DEFINED instead? - do we need a separate encoder option for the colorimetric specification field? If yes, do we try to map the value from frame color_trc/color_primaries/...? Signed-off-by: Tobias Rapp --- doc/encoders.texi | 43 ++++++++++++++++++++++++++++ libavcodec/dpxenc.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++-- tests/ref/lavf/dpx | 12 ++++---- 3 files changed, 127 insertions(+), 8 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index 88ef8f9..f3f36bf 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -1312,6 +1312,49 @@ disabled A description of some of the currently available video encoders follows. +@section dpx + +Digital Moving-Picture Exchange (DPX) image encoder. + +@subsection Options + +@table @option +@item dpx_color_trc @var{integer} +DPX color transfer characteristics (see Table 5A in SMPTE 268M-2003). + +@table @option +@item user +User Defined +@item print +Printing Density +@item linear +Linear +@item log +Logarithmic +@item video +Unspecified Video +@item smpte274m +SMPTE-274M +@item itur709 +ITU-R 709-4 +@item itur601bg +ITU-R 601-5 (system B or G) +@item itur601m +ITU-R 601-5 (system M) +@item ntsc +NTSC Composite Video +@item pal +PAL Composite Video +@item zlinear +Z-Linear +@item zhomogen +Z-Homogeneous +@end table + +Default value is derived from encoder, when mapping is available. + +@end table + @section Hap Vidvox Hap video encoder. diff --git a/libavcodec/dpxenc.c b/libavcodec/dpxenc.c index a596033..ddcd53b 100644 --- a/libavcodec/dpxenc.c +++ b/libavcodec/dpxenc.c @@ -22,17 +22,56 @@ #include "libavutil/common.h" #include "libavutil/intreadwrite.h" #include "libavutil/imgutils.h" +#include "libavutil/opt.h" +#include "libavutil/pixdesc.h" +#include "libavutil/pixfmt.h" #include "avcodec.h" #include "internal.h" typedef struct DPXContext { + AVClass *class; int big_endian; int bits_per_component; int num_components; int descriptor; int planar; + int color_trc; } DPXContext; +enum DPXTransferCharacteristic { + DPX_TRC_UNDEFINED = -1, + DPX_TRC_USER_DEFINED = 0, + DPX_TRC_PRINTING_DENSITY = 1, + DPX_TRC_LINEAR = 2, + DPX_TRC_LOG = 3, // Logarithmic + DPX_TRC_UNSPECIFIED_VIDEO = 4, + DPX_TRC_SMPTE274M = 5, // SMPTE 274M + DPX_TRC_ITUR709 = 6, // ITU-R 709-4 + DPX_TRC_ITUR601BG = 7, // ITU-R 601-5 system B or G (625) + DPX_TRC_ITUR601M = 8, // ITU-R 601-5 system M (525) + DPX_TRC_COMPOSITE_VIDEO_NTSC = 9, // Composite video (NTSC), see SMPTE 170M + DPX_TRC_COMPOSITE_VIDEO_PAL = 10, // Composite video (PAL), see ITU-R 624-4 + DPX_TRC_Z_LINEAR = 11, + DPX_TRC_Z_HOMOGENEOUS = 12, + DPX_TRC_NB +}; + +static int color_trc_to_dpx(enum AVColorTransferCharacteristic color_trc) +{ + switch (color_trc) { + case AVCOL_TRC_LINEAR: + return DPX_TRC_LINEAR; + case AVCOL_TRC_LOG: + return DPX_TRC_LOG; + case AVCOL_TRC_BT709: + return DPX_TRC_ITUR709; + case AVCOL_TRC_SMPTE170M: + return DPX_TRC_COMPOSITE_VIDEO_NTSC; + default: + return DPX_TRC_UNDEFINED; + } +} + static av_cold int encode_init(AVCodecContext *avctx) { DPXContext *s = avctx->priv_data; @@ -178,6 +217,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, { DPXContext *s = avctx->priv_data; int size, ret, need_align, len; + int color_trc = s->color_trc; uint8_t *buf; #define HEADER_SIZE 1664 /* DPX Generic header */ @@ -200,6 +240,14 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, return ret; buf = pkt->data; + if (color_trc < 0) + color_trc = color_trc_to_dpx(frame->color_trc); + if (color_trc < 0) + color_trc = color_trc_to_dpx(avctx->color_trc); + av_log(avctx, AV_LOG_TRACE, "codec_color_trc:%s frame_color_trc:%s dpx_color_trc:%d\n", + av_color_transfer_name(avctx->color_trc), av_color_transfer_name(frame->color_trc), + color_trc); + memset(buf, 0, HEADER_SIZE); /* File information header */ @@ -218,8 +266,8 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, write32(buf + 772, avctx->width); write32(buf + 776, avctx->height); buf[800] = s->descriptor; - buf[801] = 2; /* linear transfer */ - buf[802] = 2; /* linear colorimetric */ + buf[801] = color_trc; /* transfer characteristics */ + buf[802] = color_trc; /* colorimetric specification */ buf[803] = s->bits_per_component; write16(buf + 804, (s->bits_per_component == 10 || s->bits_per_component == 12) ? 1 : 0); /* packing method */ @@ -276,6 +324,33 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, return 0; } +#define OFFSET(x) offsetof(DPXContext, x) +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM +static const AVOption options[] = { + { "dpx_color_trc", "Transfer Characteristics", OFFSET(color_trc), AV_OPT_TYPE_INT, { .i64 = DPX_TRC_UNDEFINED }, DPX_TRC_UNDEFINED, DPX_TRC_NB-1, VE, "trc" }, + { "user", "User Defined", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_USER_DEFINED }, 0, 0, VE, "trc" }, + { "print", "Printing Density", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_PRINTING_DENSITY }, 0, 0, VE, "trc" }, + { "linear", "Linear", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_LINEAR }, 0, 0, VE, "trc" }, + { "log", "Logarithmic", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_LOG }, 0, 0, VE, "trc" }, + { "video", "Unspecified Video", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_UNSPECIFIED_VIDEO }, 0, 0, VE, "trc" }, + { "smpte274m", "SMPTE-274M", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_SMPTE274M }, 0, 0, VE, "trc" }, + { "itur709", "ITU-R 709-4", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_ITUR709 }, 0, 0, VE, "trc" }, + { "itur601bg", "ITU-R 601-5 (system B or G)", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_ITUR601BG }, 0, 0, VE, "trc" }, + { "itur601m", "ITU-R 601-5 (system M)", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_ITUR601M }, 0, 0, VE, "trc" }, + { "ntsc", "NTSC Composite Video", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_COMPOSITE_VIDEO_NTSC }, 0, 0, VE, "trc" }, + { "pal", "PAL Composite Video", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_COMPOSITE_VIDEO_PAL }, 0, 0, VE, "trc" }, + { "zlinear", "Z-Linear", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_Z_LINEAR }, 0, 0, VE, "trc" }, + { "zhomogen", "Z-Homogeneous", 0, AV_OPT_TYPE_CONST, { .i64 = DPX_TRC_Z_HOMOGENEOUS }, 0, 0, VE, "trc" }, + { NULL } +}; + +static const AVClass dpxenc_class = { + .class_name = "DPX encoder", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + AVCodec ff_dpx_encoder = { .name = "dpx", .long_name = NULL_IF_CONFIG_SMALL("DPX (Digital Picture Exchange) image"), @@ -293,4 +368,5 @@ AVCodec ff_dpx_encoder = { AV_PIX_FMT_GBRP10LE, AV_PIX_FMT_GBRP10BE, AV_PIX_FMT_GBRP12LE, AV_PIX_FMT_GBRP12BE, AV_PIX_FMT_NONE}, + .priv_class = &dpxenc_class, }; diff --git a/tests/ref/lavf/dpx b/tests/ref/lavf/dpx index 7bbed3e..6092570 100644 --- a/tests/ref/lavf/dpx +++ b/tests/ref/lavf/dpx @@ -1,18 +1,18 @@ -4c8880d5835ffb5fe37c1ed8c8d404de *./tests/data/images/dpx/02.dpx +f7c1f414a5ac67fb46c19094af15d88b *./tests/data/images/dpx/02.dpx ./tests/data/images/dpx/%02d.dpx CRC=0x6da01946 305792 ./tests/data/images/dpx/02.dpx -7ca935d5d5e00c54acbc85565d3039b6 *./tests/data/images/dpx/02.dpx +2196b8d0a224177487438da63f5c7f86 *./tests/data/images/dpx/02.dpx ./tests/data/images/dpx/%02d.dpx CRC=0xe6663fba 407168 ./tests/data/images/dpx/02.dpx -a4cfea1797c928f2eff73573e559675d *./tests/data/images/dpx/02.dpx +6596e31dca6122759601650d9b9b33b5 *./tests/data/images/dpx/02.dpx ./tests/data/images/dpx/%02d.dpx CRC=0x1c755633 609920 ./tests/data/images/dpx/02.dpx -075963c3c08978b6a20555ba09161434 *./tests/data/images/dpx/02.dpx +958042039a25d5cbb9a351503bc57052 *./tests/data/images/dpx/02.dpx ./tests/data/images/dpx/%02d.dpx CRC=0xe5b9c023 609920 ./tests/data/images/dpx/02.dpx -b9f22728f8ff393bf30cf6cbd624fa95 *./tests/data/images/dpx/02.dpx +7bf3bf630d5ca27d5703e5dfb5ad217c *./tests/data/images/dpx/02.dpx ./tests/data/images/dpx/%02d.dpx CRC=0xf38d5830 407168 ./tests/data/images/dpx/02.dpx -545603630f30dec2768c8ae8d12eb8ea *./tests/data/images/dpx/02.dpx +414c10bfd8c8d14d1ad65ed009755ab0 *./tests/data/images/dpx/02.dpx ./tests/data/images/dpx/%02d.dpx CRC=0xe72ce131 812672 ./tests/data/images/dpx/02.dpx