From patchwork Thu May 30 10:42:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: velocityra@gmail.com X-Patchwork-Id: 13336 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 DBEE4447EBE for ; Thu, 30 May 2019 13:43:51 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B835C68A451; Thu, 30 May 2019 13:43:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DC5B868A196 for ; Thu, 30 May 2019 13:43:45 +0300 (EEST) Received: by mail-wm1-f54.google.com with SMTP id v22so3525567wml.1 for ; Thu, 30 May 2019 03:43:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LilEqwtIbsVmOjN6sQXRi41vwuOsbfhdgBGsRLUR+gw=; b=r/We/YrWF/M2/4Cwrmkd72b4o1PRV5xkuWXGFGoXyB1bWhMihsyBFuTVfQACJnuUbo RmiwEU7fXIRkANwFwYzsmWlezfd/7bTyC3sYyhhuuZD/xJduIFvBv30rOueaP3tUwLvO rNnsQS4JpArfaCoAnEGxQoHCC+iP9HuWc9ZKEoheeZTcBiYQEN5EZauHDXblta1gprlf V/i6T8++qEXcAOZb9Hyne7ahph+b7cunPE6+ipozYeR4/XIDNaw/WnT2g/RMqADdd5jA X6M8tDL7x5OVh5MNiauB8QMRIZ70HPh0Wpa2qBgd9tB/a9WF/aYg/zbWlhJqFCVKC4Wp 7lVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LilEqwtIbsVmOjN6sQXRi41vwuOsbfhdgBGsRLUR+gw=; b=tTjkJOjosO1vXO3sPS9h+goIVa6JBLSH1iVrudIaHF41j6m1FOaWijkdrKC66Zc39y DD7zI5RraqZokR0Qf/VWONJgZF83mAVAyK7qOX+H/5/9+PnkBX7SIreWUCs7Beqf0UsC +F40U3/lNW6fPUu8qyAkroDAHp9OaQ2IJCkFiOVo7GJ8kkC9v/DZFMN/Lmg0au/sCxeC 7MzbR1++sunx7TjvMwsKNEZZovQLftH1XV76P0tYbcJT/+eLlHFRFGru62/BCdYEEQge G9mfcsTrZK/82MA5ZI6CGo2ssvpcbGsl6fuJrwQStOgl/dbhAikdcLRN7cv3qt/fg+ae AoBg== X-Gm-Message-State: APjAAAW5K+TwqGkgBSwYNdgFQ0OiQqZCN9m/6uUH6YRd/5Xq7ux/BFI+ SepgHUnMcPVmuBv3+nm6J+cMnI+vBlc= X-Google-Smtp-Source: APXvYqwB9lBpi9AxvOvu/6EBl495wIhxUqoIiXPhO1hwpojGMc6174d5KFUxeYtkUukKbGnaV9t97w== X-Received: by 2002:a05:600c:230a:: with SMTP id 10mr1909401wmo.13.1559213024976; Thu, 30 May 2019 03:43:44 -0700 (PDT) Received: from localhost.localdomain ([2a02:587:240e:1e00:88b1:4835:cc8d:5e2]) by smtp.gmail.com with ESMTPSA id b2sm3078024wrt.20.2019.05.30.03.43.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 30 May 2019 03:43:44 -0700 (PDT) From: velocityra@gmail.com X-Google-Original-From: velocityra@gmail To: ffmpeg-devel@ffmpeg.org Date: Thu, 30 May 2019 13:42:42 +0300 Message-Id: <20190530104242.4908-3-velocityra@gmail.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20190530104242.4908-1-velocityra@gmail.com> References: <20190530104242.4908-1-velocityra@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 3/3] avcodec/tiff: Recognize DNG/CinemaDNG images 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 Cc: onemda@gmail.com, Nick Renieris Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Nick Renieris Additionally: - Renamed TIFF_WHITE_LEVEL to DNG_WHITE_LEVEL since it is specified in the DNG spec. - Added/changed some comments to be more precise in differentiating between TIFF, TIFF/EP and DNG values. Related to ticket: https://trac.ffmpeg.org/ticket/4364 Signed-off-by: Nick Renieris --- libavcodec/tiff.c | 30 +++++++++++++++++++++++++++++- libavcodec/tiff.h | 36 +++++++++++++++++++++++++++++++----- libavformat/img2.c | 1 + 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index 3a3f68fa94..c520d7df83 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -58,6 +58,7 @@ typedef struct TiffContext { uint16_t get_page; int get_thumbnail; + enum TiffType tiff_type; int width, height; unsigned int bpp, bppcount; uint32_t palette[256]; @@ -96,6 +97,11 @@ typedef struct TiffContext { TiffGeoTag *geotags; } TiffContext; +static void tiff_set_type(TiffContext *s, enum TiffType tiff_type) { + if (s->tiff_type < tiff_type) // Prioritize higher-valued entries + s->tiff_type = tiff_type; +} + static void free_geotags(TiffContext *const s) { int i; @@ -1095,7 +1101,7 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) else if (count > 1) s->sub_ifd = ff_tget(&s->gb, TIFF_LONG, s->le); /** Only get the first SubIFD */ break; - case TIFF_WHITE_LEVEL: + case DNG_WHITE_LEVEL: s->white_level = value; break; case TIFF_CFA_PATTERN_DIM: @@ -1346,6 +1352,27 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) case TIFF_SOFTWARE_NAME: ADD_METADATA(count, "software", NULL); break; + case DNG_VERSION: + if (count == 4) { + unsigned int ver[4]; + ver[0] = ff_tget(&s->gb, type, s->le); + ver[1] = ff_tget(&s->gb, type, s->le); + ver[2] = ff_tget(&s->gb, type, s->le); + ver[3] = ff_tget(&s->gb, type, s->le); + + av_log(s->avctx, AV_LOG_DEBUG, "DNG file, version %u.%u.%u.%u\n", + ver[0], ver[1], ver[2], ver[3]); + + tiff_set_type(s, TIFF_TYPE_DNG); + } + break; + case CINEMADNG_TIME_CODES: + case CINEMADNG_FRAME_RATE: + case CINEMADNG_T_STOP: + case CINEMADNG_REEL_NAME: + case CINEMADNG_CAMERA_LABEL: + tiff_set_type(s, TIFF_TYPE_CINEMADNG); + break; default: if (s->avctx->err_recognition & AV_EF_EXPLODE) { av_log(s->avctx, AV_LOG_ERROR, @@ -1402,6 +1429,7 @@ again: s->white_level = 0; s->is_bayer = 0; s->cur_page = 0; + s->tiff_type = TIFF_TYPE_TIFF; free_geotags(s); // Reset these offsets so we can tell if they were set this frame diff --git a/libavcodec/tiff.h b/libavcodec/tiff.h index 4b08650108..81913c6b1a 100644 --- a/libavcodec/tiff.h +++ b/libavcodec/tiff.h @@ -20,7 +20,7 @@ /** * @file - * TIFF tables + * TIFF constants & data structures * * For more information about the TIFF format, check the official docs at: * http://partners.adobe.com/public/developer/tiff/index.html @@ -33,7 +33,17 @@ #include #include "tiff_common.h" -/** abridged list of TIFF tags */ +/** TIFF types in ascenting priority (last in the list is highest) */ +enum TiffType { + /** TIFF image based on the TIFF 6.0 or TIFF/EP (ISO 12234-2) specifications */ + TIFF_TYPE_TIFF, + /** Digital Negative (DNG) image */ + TIFF_TYPE_DNG, + /** Digital Negative (DNG) image part of an CinemaDNG image sequence */ + TIFF_TYPE_CINEMADNG, +}; + +/** abridged list of TIFF and TIFF/EP tags */ enum TiffTags { TIFF_SUBFILE = 0xfe, TIFF_WIDTH = 0x100, @@ -85,10 +95,25 @@ enum TiffTags { TIFF_GEO_KEY_DIRECTORY = 0x87AF, TIFF_GEO_DOUBLE_PARAMS = 0x87B0, TIFF_GEO_ASCII_PARAMS = 0x87B1, - TIFF_WHITE_LEVEL = 0xC61D, }; -/** list of TIFF compression types */ +/** abridged list of DNG tags */ +enum DngTags { + DNG_VERSION = 0xC612, + DNG_BACKWARD_VERSION = 0xC613, + DNG_WHITE_LEVEL = 0xC61D, +}; + +/** list of CinemaDNG tags */ +enum CinemaDngTags { + CINEMADNG_TIME_CODES = 0xC763, + CINEMADNG_FRAME_RATE = 0xC764, + CINEMADNG_T_STOP = 0xC772, + CINEMADNG_REEL_NAME = 0xC789, + CINEMADNG_CAMERA_LABEL = 0xC7A1, +}; + +/** list of TIFF, TIFF/EP and DNG compression types */ enum TiffCompr { TIFF_RAW = 1, TIFF_CCITT_RLE, @@ -151,6 +176,7 @@ enum TiffGeoTagKey { TIFF_VERTICAL_UNITS_GEOKEY = 4099 }; +/** list of TIFF, TIFF/AP and DNG PhotometricInterpretation (TIFF_PHOTOMETRIC) values */ enum TiffPhotometric { TIFF_PHOTOMETRIC_NONE = -1, TIFF_PHOTOMETRIC_WHITE_IS_ZERO, /* mono or grayscale, 0 is white */ @@ -163,7 +189,7 @@ enum TiffPhotometric { TIFF_PHOTOMETRIC_CIE_LAB = 8, /* 1976 CIE L*a*b* */ TIFF_PHOTOMETRIC_ICC_LAB, /* ICC L*a*b* */ TIFF_PHOTOMETRIC_ITU_LAB, /* ITU L*a*b* */ - TIFF_PHOTOMETRIC_CFA = 32803, /* Color Filter Array (DNG) */ + TIFF_PHOTOMETRIC_CFA = 32803, /* Color Filter Array (TIFF/AP and DNG) */ TIFF_PHOTOMETRIC_LOG_L = 32844, /* CIE Log2(L) */ TIFF_PHOTOMETRIC_LOG_LUV, /* CIE Log L*u*v* */ TIFF_PHOTOMETRIC_LINEAR_RAW = 34892, /* Linear Raw (DNG) */ diff --git a/libavformat/img2.c b/libavformat/img2.c index 8432cc0955..16bc9d2abd 100644 --- a/libavformat/img2.c +++ b/libavformat/img2.c @@ -51,6 +51,7 @@ const IdStrMap ff_img_tags[] = { { AV_CODEC_ID_TARGA, "tga" }, { AV_CODEC_ID_TIFF, "tiff" }, { AV_CODEC_ID_TIFF, "tif" }, + { AV_CODEC_ID_TIFF, "dng" }, { AV_CODEC_ID_SGI, "sgi" }, { AV_CODEC_ID_PTX, "ptx" }, { AV_CODEC_ID_PCX, "pcx" },