From patchwork Sun Mar 17 07:38:33 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: 12332 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 11B23448D96 for ; Sun, 17 Mar 2019 09:46:34 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EA07D68096E; Sun, 17 Mar 2019 09:46:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BC18A680806 for ; Sun, 17 Mar 2019 09:46:26 +0200 (EET) Received: by mail-wr1-f65.google.com with SMTP id 33so13664724wrb.13 for ; Sun, 17 Mar 2019 00:46:26 -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; bh=DunVXFoIfrMCfoDNr4xw4kLDwrCZlgRiK1MYS8cQhtQ=; b=Et+H7WcZ6c2fBlXBKz/RGlW6uNcldSk6Ih+EE+LJpuLYcG3DJ7zzymrCJHWolP+jux FUZkvgfSoKdtthl5kTweQP8Q/rM5ct3VeI3lSZmZi/XHy+1L/FNYHggOCe68ckmLSHty /1DsixBZ+4DezdcDXuXE1CCwiA5xWCgSyYCJoZUydiavL55jBm/vMRVRykeWeel9rRtT phs6cpF8Vvhg8Iw/xeiNpp/G6y0D7cPCO+t+L/W8VDfY9IWSH9YrVMm1HJ3qGHmIKilo 6kiIDGz62OnkdcLUUGkDMRMJAFaOlNJy0QT7cgZ57Ov8ufRnIPgKw8VHyz4SdaMS0DTL 2vsw== 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; bh=DunVXFoIfrMCfoDNr4xw4kLDwrCZlgRiK1MYS8cQhtQ=; b=Ygp/7kHz9Kj5/JJIlke4Yaf/c9RkjHwA7MjWtJsMeQGBvKuQyrY2yaTDLUzZCVh5a5 MwcrJDY0czve9eTS/+R5G62YBej73AmCJ0YjLh4X+ZNOtnCC5/KFsPxdxdJJv393W922 7XZs0CCytX+NVO6gan7q23cvMlGHtr7IF3Fhjt+RdZg41n+mHlIFLe5Tmr4wi4ifkm9n AdNMdJrQrH3+7iC7uW1yXIeT/zGjxvbKzLhgATIu/bsZctz9eqpR57Prai+TDHbSiJJZ cxwiVWaHRShOMttDDXhs6lE3h7hByse4xCYkpNpZu/5zFFupgRAGDFnGoP4Ro6pUM5L6 1+Nw== X-Gm-Message-State: APjAAAWpk5NwzumCF9npeI9Hb07pUpnx7+NC5yDV01rUMOyh407r+3C+ MHDrnBgaqihpp/bIFiUA71JqcBGm X-Google-Smtp-Source: APXvYqwaBa8OY/kM7Ejd3lnct5AAqrAU4wJfXh+D/mKLOU+AbEX4KMwOOcbjqrhnFgwFAjy7HvALuA== X-Received: by 2002:adf:e487:: with SMTP id i7mr7723426wrm.202.1552808333554; Sun, 17 Mar 2019 00:38:53 -0700 (PDT) Received: from localhost.localdomain ([2a02:587:240a:c500:b906:35bb:f9cf:fac8]) by smtp.gmail.com with ESMTPSA id d5sm4086199wrx.12.2019.03.17.00.38.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 Mar 2019 00:38:52 -0700 (PDT) From: velocityra@gmail.com X-Google-Original-From: velocityra@gmail To: ffmpeg-devel@ffmpeg.org Date: Sun, 17 Mar 2019 09:38:33 +0200 Message-Id: <20190317073833.19516-1-velocityra@gmail.com> X-Mailer: git-send-email 2.17.1.windows.2 Subject: [FFmpeg-devel] [PATCH] avcodec/tiff: Add support for recognizing DNG files 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: Nick Renieris MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Nick Renieris Prints "DNG images are not supported" if it finds a TIFF image with the 'DNGVersion' tag. In DNG images with the .tiff extension it, solves the issue where the TIFF thumbnail in IFD 0 was incorrectly parsed (related confusion: [1]). Also prints the DNG version of the file on the debug channel. 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 --- [1]: https://superuser.com/questions/546879/creating-video-from-dng-images-with-ffmpeg Signed-off-by: Nick Renieris --- libavcodec/tiff.c | 25 +++++++++++++++++++++++-- libavcodec/tiff.h | 18 +++++++++++++----- libavformat/img2.c | 1 + 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index 112f5b52f4..95d00930ce 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -70,6 +70,7 @@ typedef struct TiffContext { int fill_order; uint32_t res[4]; + int dng_mode; /** denotes that this is a DNG image */ int is_bayer; uint8_t pattern[4]; unsigned white_level; @@ -1077,7 +1078,7 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) case TIFF_SUB_IFDS: s->sub_ifd = value; break; - case TIFF_WHITE_LEVEL: + case DNG_WHITE_LEVEL: s->white_level = value; break; case TIFF_CFA_PATTERN_DIM: @@ -1322,6 +1323,20 @@ 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]); + + s->dng_mode = 1; + } + break; default: if (s->avctx->err_recognition & AV_EF_EXPLODE) { av_log(s->avctx, AV_LOG_ERROR, @@ -1375,6 +1390,7 @@ again: s->fill_order = 0; s->white_level = 0; s->is_bayer = 0; + s->dng_mode = 0; free_geotags(s); // Reset these offsets so we can tell if they were set this frame @@ -1389,6 +1405,11 @@ again: return ret; } + if (s->dng_mode) { + av_log(avctx, AV_LOG_ERROR, "DNG images are not supported\n"); + return AVERROR_PATCHWELCOME; + } + if (s->sub_ifd && s->get_subimage) { off = s->sub_ifd; if (off >= UINT_MAX - 14 || avpkt->size < off + 14) { @@ -1619,7 +1640,7 @@ static const AVClass tiff_decoder_class = { AVCodec ff_tiff_decoder = { .name = "tiff", - .long_name = NULL_IF_CONFIG_SMALL("TIFF image"), + .long_name = NULL_IF_CONFIG_SMALL("TIFF / DNG image"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_TIFF, .priv_data_size = sizeof(TiffContext), diff --git a/libavcodec/tiff.h b/libavcodec/tiff.h index 4b08650108..3cede299f6 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,7 @@ #include #include "tiff_common.h" -/** abridged list of TIFF tags */ +/** abridged list of TIFF and TIFF/EP tags */ enum TiffTags { TIFF_SUBFILE = 0xfe, TIFF_WIDTH = 0x100, @@ -85,10 +85,17 @@ 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 TIFF, TIFF/EP and DNG compression types */ enum TiffCompr { TIFF_RAW = 1, TIFF_CCITT_RLE, @@ -151,6 +158,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 +171,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" },