From patchwork Wed Oct 31 14:25:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 10869 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 31E5B44C9DB for ; Wed, 31 Oct 2018 16:25:46 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A7CEC68A879; Wed, 31 Oct 2018 16:25:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 60D4A68A854 for ; Wed, 31 Oct 2018 16:25:11 +0200 (EET) Received: by mail-ed1-f68.google.com with SMTP id x2-v6so13790138eds.3 for ; Wed, 31 Oct 2018 07:25:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=25DAnDB1SJe+sbrtXTtbohdN3bbRQusfKLQW+k2RiIg=; b=n8FH7djF002NN1TRd5adzoeRYSdlya3qs35IIrDZOQ1xWrKQtPuEn4Gr3hGw3rD+I5 QVLeX/kFUrI/w+jBrCSBjUix99B7rikS+8NitoCcHiwgCGC+Thh+tjaEnYdhBtmA7KrQ P7GqvpBqiVsVu6NQWBqLnNP89MAy9XZlhlFeMxLFcqCrAf4GFYEDRUVK1LwaOP5Jsz7P 9Eq+Nzurdg1RkP2WDxE3AyOXutmS4AAf0rjMfNmVdCzpymCCIvQRh5tK0CVWmYYhIY8Y RX/Zpc4opcE0+5W/JzWxUjaGJLxJ/TsNRpP+p9Mh3nbYrKl1Bs937Uo2xyOp39Ox22HI CDyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=25DAnDB1SJe+sbrtXTtbohdN3bbRQusfKLQW+k2RiIg=; b=fRPwn03ipBN4j4pm30onFWoordJNvBEjwCubM/8uD3PYGkY5ho2MOCXg1H/QaShy89 SlKB1wkg+gFVElYgX1cnbw6fnMn9WKEy/qGwzz/A/P7QSukhv4S0AFiy4OSCUaLnjL/v 1NnXpV2W34BSv8IV9pkOh3o6S978M1azbyMxpeEphIx82CCky2w2oWdNXNlXzNvGBq0G T2pShU7zDT0zgT+lJwqbcLMHa4deKWTsltTmosH3tSIVhK3uR9sl3aq7AQXPd8lQJ5/t gajo2YnH928JFrr10WbGenGmrp0Y44/5sO5jk81Kw8Yn5pD0WjZZnUG091d3LJPwZu1E o+PA== X-Gm-Message-State: AGRZ1gJ09Lwr88DEBcrEZGLDb1XS+RbVKXhYMzFpyPQb8/PnIvOaiaP+ GA17pN/Dk1Hljm+7saH99kB+FA4u9Dk= X-Google-Smtp-Source: AJdET5eZLQvdqO67FW6P06mjknyi7fcG2cS5xNeD4IJTxlqy9Gw9LdFOPWTRLoZnTt9NQm5sG81rWQ== X-Received: by 2002:aa7:d699:: with SMTP id d25-v6mr2334809edr.83.1540995942455; Wed, 31 Oct 2018 07:25:42 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id i17-v6sm3583222edq.75.2018.10.31.07.25.41 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Oct 2018 07:25:41 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 31 Oct 2018 15:25:28 +0100 Message-Id: <20181031142528.25850-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181031142528.25850-1-onemda@gmail.com> References: <20181031142528.25850-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH] avcodec/tiff: add support for sub 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- For ticket #4364. Colors looks wrong with 8bit sample mentioned in trac ticket. Too greenish, missing yellow. Why? --- libavcodec/tiff.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- libavcodec/tiff.h | 2 ++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index d42550b4cf..4a82b398af 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -37,6 +37,7 @@ #include "libavutil/avstring.h" #include "libavutil/intreadwrite.h" #include "libavutil/imgutils.h" +#include "libavutil/opt.h" #include "avcodec.h" #include "bytestream.h" #include "faxcompr.h" @@ -49,9 +50,12 @@ #include "get_bits.h" typedef struct TiffContext { + AVClass *class; AVCodecContext *avctx; GetByteContext gb; + int get_subimage; + int width, height; unsigned int bpp, bppcount; uint32_t palette[256]; @@ -69,6 +73,8 @@ typedef struct TiffContext { int is_bayer; uint8_t pattern[4]; + uint32_t sub_ifd; + int strips, rps, sstype; int sot; int stripsizesoff, stripsize, stripoff, strippos; @@ -698,6 +704,20 @@ static int init_image(TiffContext *s, ThreadFrame *frame) case 81: s->avctx->pix_fmt = s->palette_is_set ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8; break; + case 10081: + switch (s->pattern[0] | s->pattern[1] << 8 | s->pattern[2] << 16 | s->pattern[3] << 24) { + case 0x02010100: + s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB8; + break; + case 0x00010102: + s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR8; + break; + default: + av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n", + s->pattern[0] | s->pattern[1] << 8 | s->pattern[2] << 16 | s->pattern[3] << 24); + return AVERROR_PATCHWELCOME; + } + break; case 10121: switch (s->pattern[0] | s->pattern[1] << 8 | s->pattern[2] << 16 | s->pattern[3] << 24) { case 0x02010100: @@ -992,6 +1012,9 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) case TIFF_PREDICTOR: s->predictor = value; break; + case TIFF_SUB_IFDS: + s->sub_ifd = value; + break; case TIFF_CFA_PATTERN: s->is_bayer = 1; s->pattern[0] = ff_tget(&s->gb, type, s->le); @@ -1230,7 +1253,7 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) default: if (s->avctx->err_recognition & AV_EF_EXPLODE) { av_log(s->avctx, AV_LOG_ERROR, - "Unknown or unsupported tag %d/0X%0X\n", + "Unknown or unsupported tag %d/0x%0X\n", tag, tag); return AVERROR_INVALIDDATA; } @@ -1282,6 +1305,7 @@ static int decode_frame(AVCodecContext *avctx, // Reset these offsets so we can tell if they were set this frame s->stripsizesoff = s->strippos = 0; /* parse image file directory */ +again: bytestream2_seek(&s->gb, off, SEEK_SET); entries = ff_tget_short(&s->gb, le); if (bytestream2_get_bytes_left(&s->gb) < entries * 12) @@ -1291,6 +1315,12 @@ static int decode_frame(AVCodecContext *avctx, return ret; } + if (s->sub_ifd && s->get_subimage) { + off = s->sub_ifd; + s->get_subimage = 0; + goto again; + } + for (i = 0; igeotag_count; i++) { const char *keyname = get_geokey_name(s->geotags[i].key); if (!keyname) { @@ -1464,6 +1494,19 @@ static av_cold int tiff_end(AVCodecContext *avctx) return 0; } +#define OFFSET(x) offsetof(TiffContext, x) +static const AVOption tiff_options[] = { + { "subimage", "decode subimage instead if available", OFFSET(get_subimage), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM }, + { NULL }, +}; + +static const AVClass tiff_decoder_class = { + .class_name = "TIFF decoder", + .item_name = av_default_item_name, + .option = tiff_options, + .version = LIBAVUTIL_VERSION_INT, +}; + AVCodec ff_tiff_decoder = { .name = "tiff", .long_name = NULL_IF_CONFIG_SMALL("TIFF image"), @@ -1475,4 +1518,5 @@ AVCodec ff_tiff_decoder = { .decode = decode_frame, .init_thread_copy = ONLY_IF_THREADS_ENABLED(tiff_init), .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS, + .priv_class = &tiff_decoder_class, }; diff --git a/libavcodec/tiff.h b/libavcodec/tiff.h index ae6622cb0c..57c677c6aa 100644 --- a/libavcodec/tiff.h +++ b/libavcodec/tiff.h @@ -70,11 +70,13 @@ enum TiffTags { TIFF_TILE_LENGTH = 0x143, TIFF_TILE_OFFSETS = 0x144, TIFF_TILE_BYTE_COUNTS = 0x145, + TIFF_SUB_IFDS = 0x14A, TIFF_EXTRASAMPLES = 0x152, TIFF_YCBCR_COEFFICIENTS = 0x211, TIFF_YCBCR_SUBSAMPLING = 0x212, TIFF_YCBCR_POSITIONING = 0x213, TIFF_REFERENCE_BW = 0x214, + TIFF_CFA_PATTERN_DIM = 0x828D, TIFF_CFA_PATTERN = 0x828E, TIFF_COPYRIGHT = 0x8298, TIFF_MODEL_TIEPOINT = 0x8482,