Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2006 Konstantin Shishkov
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. /**
  22.  * @file
  23.  * TIFF image decoder
  24.  * @author Konstantin Shishkov
  25.  */
  26.  
  27. #include "config.h"
  28. #if CONFIG_ZLIB
  29. #include <zlib.h>
  30. #endif
  31. #if CONFIG_LZMA
  32. #define LZMA_API_STATIC
  33. #include <lzma.h>
  34. #endif
  35.  
  36. #include "libavutil/attributes.h"
  37. #include "libavutil/avstring.h"
  38. #include "libavutil/intreadwrite.h"
  39. #include "libavutil/imgutils.h"
  40. #include "avcodec.h"
  41. #include "bytestream.h"
  42. #include "faxcompr.h"
  43. #include "internal.h"
  44. #include "lzw.h"
  45. #include "mathops.h"
  46. #include "tiff.h"
  47. #include "tiff_data.h"
  48. #include "thread.h"
  49.  
  50. typedef struct TiffContext {
  51.     AVCodecContext *avctx;
  52.     GetByteContext gb;
  53.  
  54.     int width, height;
  55.     unsigned int bpp, bppcount;
  56.     uint32_t palette[256];
  57.     int palette_is_set;
  58.     int le;
  59.     enum TiffCompr compr;
  60.     enum TiffPhotometric photometric;
  61.     int planar;
  62.     int subsampling[2];
  63.     int fax_opts;
  64.     int predictor;
  65.     int fill_order;
  66.     uint32_t res[4];
  67.  
  68.     int strips, rps, sstype;
  69.     int sot;
  70.     int stripsizesoff, stripsize, stripoff, strippos;
  71.     LZWState *lzw;
  72.  
  73.     uint8_t *deinvert_buf;
  74.     int deinvert_buf_size;
  75.     uint8_t *yuv_line;
  76.     unsigned int yuv_line_size;
  77.  
  78.     int geotag_count;
  79.     TiffGeoTag *geotags;
  80. } TiffContext;
  81.  
  82. static void free_geotags(TiffContext *const s)
  83. {
  84.     int i;
  85.     for (i = 0; i < s->geotag_count; i++) {
  86.         if (s->geotags[i].val)
  87.             av_freep(&s->geotags[i].val);
  88.     }
  89.     av_freep(&s->geotags);
  90.     s->geotag_count = 0;
  91. }
  92.  
  93. #define RET_GEOKEY(TYPE, array, element)\
  94.     if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\
  95.         key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_name_type_map))\
  96.         return ff_tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].element;
  97.  
  98. static const char *get_geokey_name(int key)
  99. {
  100.     RET_GEOKEY(VERT, vert, name);
  101.     RET_GEOKEY(PROJ, proj, name);
  102.     RET_GEOKEY(GEOG, geog, name);
  103.     RET_GEOKEY(CONF, conf, name);
  104.  
  105.     return NULL;
  106. }
  107.  
  108. static int get_geokey_type(int key)
  109. {
  110.     RET_GEOKEY(VERT, vert, type);
  111.     RET_GEOKEY(PROJ, proj, type);
  112.     RET_GEOKEY(GEOG, geog, type);
  113.     RET_GEOKEY(CONF, conf, type);
  114.  
  115.     return AVERROR_INVALIDDATA;
  116. }
  117.  
  118. static int cmp_id_key(const void *id, const void *k)
  119. {
  120.     return *(const int*)id - ((const TiffGeoTagKeyName*)k)->key;
  121. }
  122.  
  123. static const char *search_keyval(const TiffGeoTagKeyName *keys, int n, int id)
  124. {
  125.     TiffGeoTagKeyName *r = bsearch(&id, keys, n, sizeof(keys[0]), cmp_id_key);
  126.     if(r)
  127.         return r->name;
  128.  
  129.     return NULL;
  130. }
  131.  
  132. static char *get_geokey_val(int key, int val)
  133. {
  134.     char *ap;
  135.  
  136.     if (val == TIFF_GEO_KEY_UNDEFINED)
  137.         return av_strdup("undefined");
  138.     if (val == TIFF_GEO_KEY_USER_DEFINED)
  139.         return av_strdup("User-Defined");
  140.  
  141. #define RET_GEOKEY_VAL(TYPE, array)\
  142.     if (val >= TIFF_##TYPE##_OFFSET &&\
  143.         val - TIFF_##TYPE##_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_codes))\
  144.         return av_strdup(ff_tiff_##array##_codes[val - TIFF_##TYPE##_OFFSET]);
  145.  
  146.     switch (key) {
  147.     case TIFF_GT_MODEL_TYPE_GEOKEY:
  148.         RET_GEOKEY_VAL(GT_MODEL_TYPE, gt_model_type);
  149.         break;
  150.     case TIFF_GT_RASTER_TYPE_GEOKEY:
  151.         RET_GEOKEY_VAL(GT_RASTER_TYPE, gt_raster_type);
  152.         break;
  153.     case TIFF_GEOG_LINEAR_UNITS_GEOKEY:
  154.     case TIFF_PROJ_LINEAR_UNITS_GEOKEY:
  155.     case TIFF_VERTICAL_UNITS_GEOKEY:
  156.         RET_GEOKEY_VAL(LINEAR_UNIT, linear_unit);
  157.         break;
  158.     case TIFF_GEOG_ANGULAR_UNITS_GEOKEY:
  159.     case TIFF_GEOG_AZIMUTH_UNITS_GEOKEY:
  160.         RET_GEOKEY_VAL(ANGULAR_UNIT, angular_unit);
  161.         break;
  162.     case TIFF_GEOGRAPHIC_TYPE_GEOKEY:
  163.         RET_GEOKEY_VAL(GCS_TYPE, gcs_type);
  164.         RET_GEOKEY_VAL(GCSE_TYPE, gcse_type);
  165.         break;
  166.     case TIFF_GEOG_GEODETIC_DATUM_GEOKEY:
  167.         RET_GEOKEY_VAL(GEODETIC_DATUM, geodetic_datum);
  168.         RET_GEOKEY_VAL(GEODETIC_DATUM_E, geodetic_datum_e);
  169.         break;
  170.     case TIFF_GEOG_ELLIPSOID_GEOKEY:
  171.         RET_GEOKEY_VAL(ELLIPSOID, ellipsoid);
  172.         break;
  173.     case TIFF_GEOG_PRIME_MERIDIAN_GEOKEY:
  174.         RET_GEOKEY_VAL(PRIME_MERIDIAN, prime_meridian);
  175.         break;
  176.     case TIFF_PROJECTED_CS_TYPE_GEOKEY:
  177.         ap = av_strdup(search_keyval(ff_tiff_proj_cs_type_codes, FF_ARRAY_ELEMS(ff_tiff_proj_cs_type_codes), val));
  178.         if(ap) return ap;
  179.         break;
  180.     case TIFF_PROJECTION_GEOKEY:
  181.         ap = av_strdup(search_keyval(ff_tiff_projection_codes, FF_ARRAY_ELEMS(ff_tiff_projection_codes), val));
  182.         if(ap) return ap;
  183.         break;
  184.     case TIFF_PROJ_COORD_TRANS_GEOKEY:
  185.         RET_GEOKEY_VAL(COORD_TRANS, coord_trans);
  186.         break;
  187.     case TIFF_VERTICAL_CS_TYPE_GEOKEY:
  188.         RET_GEOKEY_VAL(VERT_CS, vert_cs);
  189.         RET_GEOKEY_VAL(ORTHO_VERT_CS, ortho_vert_cs);
  190.         break;
  191.  
  192.     }
  193.  
  194.     ap = av_malloc(14);
  195.     if (ap)
  196.         snprintf(ap, 14, "Unknown-%d", val);
  197.     return ap;
  198. }
  199.  
  200. static char *doubles2str(double *dp, int count, const char *sep)
  201. {
  202.     int i;
  203.     char *ap, *ap0;
  204.     uint64_t component_len;
  205.     if (!sep) sep = ", ";
  206.     component_len = 24LL + strlen(sep);
  207.     if (count >= (INT_MAX - 1)/component_len)
  208.         return NULL;
  209.     ap = av_malloc(component_len * count + 1);
  210.     if (!ap)
  211.         return NULL;
  212.     ap0   = ap;
  213.     ap[0] = '\0';
  214.     for (i = 0; i < count; i++) {
  215.         unsigned l = snprintf(ap, component_len, "%.15g%s", dp[i], sep);
  216.         if(l >= component_len) {
  217.             av_free(ap0);
  218.             return NULL;
  219.         }
  220.         ap += l;
  221.     }
  222.     ap0[strlen(ap0) - strlen(sep)] = '\0';
  223.     return ap0;
  224. }
  225.  
  226. static int add_metadata(int count, int type,
  227.                         const char *name, const char *sep, TiffContext *s, AVFrame *frame)
  228. {
  229.     switch(type) {
  230.     case TIFF_DOUBLE: return ff_tadd_doubles_metadata(count, name, sep, &s->gb, s->le, avpriv_frame_get_metadatap(frame));
  231.     case TIFF_SHORT : return ff_tadd_shorts_metadata(count, name, sep, &s->gb, s->le, 0, avpriv_frame_get_metadatap(frame));
  232.     case TIFF_STRING: return ff_tadd_string_metadata(count, name, &s->gb, s->le, avpriv_frame_get_metadatap(frame));
  233.     default         : return AVERROR_INVALIDDATA;
  234.     };
  235. }
  236.  
  237. static void av_always_inline horizontal_fill(unsigned int bpp, uint8_t* dst,
  238.                                              int usePtr, const uint8_t *src,
  239.                                              uint8_t c, int width, int offset)
  240. {
  241.     switch (bpp) {
  242.     case 1:
  243.         while (--width >= 0) {
  244.             dst[(width+offset)*8+7] = (usePtr ? src[width] : c)      & 0x1;
  245.             dst[(width+offset)*8+6] = (usePtr ? src[width] : c) >> 1 & 0x1;
  246.             dst[(width+offset)*8+5] = (usePtr ? src[width] : c) >> 2 & 0x1;
  247.             dst[(width+offset)*8+4] = (usePtr ? src[width] : c) >> 3 & 0x1;
  248.             dst[(width+offset)*8+3] = (usePtr ? src[width] : c) >> 4 & 0x1;
  249.             dst[(width+offset)*8+2] = (usePtr ? src[width] : c) >> 5 & 0x1;
  250.             dst[(width+offset)*8+1] = (usePtr ? src[width] : c) >> 6 & 0x1;
  251.             dst[(width+offset)*8+0] = (usePtr ? src[width] : c) >> 7;
  252.         }
  253.         break;
  254.     case 2:
  255.         while (--width >= 0) {
  256.             dst[(width+offset)*4+3] = (usePtr ? src[width] : c) & 0x3;
  257.             dst[(width+offset)*4+2] = (usePtr ? src[width] : c) >> 2 & 0x3;
  258.             dst[(width+offset)*4+1] = (usePtr ? src[width] : c) >> 4 & 0x3;
  259.             dst[(width+offset)*4+0] = (usePtr ? src[width] : c) >> 6;
  260.         }
  261.         break;
  262.     case 4:
  263.         while (--width >= 0) {
  264.             dst[(width+offset)*2+1] = (usePtr ? src[width] : c) & 0xF;
  265.             dst[(width+offset)*2+0] = (usePtr ? src[width] : c) >> 4;
  266.         }
  267.         break;
  268.     default:
  269.         if (usePtr) {
  270.             memcpy(dst + offset, src, width);
  271.         } else {
  272.             memset(dst + offset, c, width);
  273.         }
  274.     }
  275. }
  276.  
  277. static int deinvert_buffer(TiffContext *s, const uint8_t *src, int size)
  278. {
  279.     int i;
  280.  
  281.     av_fast_padded_malloc(&s->deinvert_buf, &s->deinvert_buf_size, size);
  282.     if (!s->deinvert_buf)
  283.         return AVERROR(ENOMEM);
  284.     for (i = 0; i < size; i++)
  285.         s->deinvert_buf[i] = ff_reverse[src[i]];
  286.  
  287.     return 0;
  288. }
  289.  
  290. static void unpack_yuv(TiffContext *s, AVFrame *p,
  291.                        const uint8_t *src, int lnum)
  292. {
  293.     int i, j, k;
  294.     int w       = (s->width - 1) / s->subsampling[0] + 1;
  295.     uint8_t *pu = &p->data[1][lnum / s->subsampling[1] * p->linesize[1]];
  296.     uint8_t *pv = &p->data[2][lnum / s->subsampling[1] * p->linesize[2]];
  297.     if (s->width % s->subsampling[0] || s->height % s->subsampling[1]) {
  298.         for (i = 0; i < w; i++) {
  299.             for (j = 0; j < s->subsampling[1]; j++)
  300.                 for (k = 0; k < s->subsampling[0]; k++)
  301.                     p->data[0][FFMIN(lnum + j, s->height-1) * p->linesize[0] +
  302.                                FFMIN(i * s->subsampling[0] + k, s->width-1)] = *src++;
  303.             *pu++ = *src++;
  304.             *pv++ = *src++;
  305.         }
  306.     }else{
  307.         for (i = 0; i < w; i++) {
  308.             for (j = 0; j < s->subsampling[1]; j++)
  309.                 for (k = 0; k < s->subsampling[0]; k++)
  310.                     p->data[0][(lnum + j) * p->linesize[0] +
  311.                                i * s->subsampling[0] + k] = *src++;
  312.             *pu++ = *src++;
  313.             *pv++ = *src++;
  314.         }
  315.     }
  316. }
  317.  
  318. #if CONFIG_ZLIB
  319. static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
  320.                            int size)
  321. {
  322.     z_stream zstream = { 0 };
  323.     int zret;
  324.  
  325.     zstream.next_in   = (uint8_t *)src;
  326.     zstream.avail_in  = size;
  327.     zstream.next_out  = dst;
  328.     zstream.avail_out = *len;
  329.     zret              = inflateInit(&zstream);
  330.     if (zret != Z_OK) {
  331.         av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
  332.         return zret;
  333.     }
  334.     zret = inflate(&zstream, Z_SYNC_FLUSH);
  335.     inflateEnd(&zstream);
  336.     *len = zstream.total_out;
  337.     return zret == Z_STREAM_END ? Z_OK : zret;
  338. }
  339.  
  340. static int tiff_unpack_zlib(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
  341.                             const uint8_t *src, int size, int width, int lines,
  342.                             int strip_start, int is_yuv)
  343. {
  344.     uint8_t *zbuf;
  345.     unsigned long outlen;
  346.     int ret, line;
  347.     outlen = width * lines;
  348.     zbuf   = av_malloc(outlen);
  349.     if (!zbuf)
  350.         return AVERROR(ENOMEM);
  351.     if (s->fill_order) {
  352.         if ((ret = deinvert_buffer(s, src, size)) < 0) {
  353.             av_free(zbuf);
  354.             return ret;
  355.         }
  356.         src = s->deinvert_buf;
  357.     }
  358.     ret = tiff_uncompress(zbuf, &outlen, src, size);
  359.     if (ret != Z_OK) {
  360.         av_log(s->avctx, AV_LOG_ERROR,
  361.                "Uncompressing failed (%lu of %lu) with error %d\n", outlen,
  362.                (unsigned long)width * lines, ret);
  363.         av_free(zbuf);
  364.         return AVERROR_UNKNOWN;
  365.     }
  366.     src = zbuf;
  367.     for (line = 0; line < lines; line++) {
  368.         if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
  369.             horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
  370.         } else {
  371.             memcpy(dst, src, width);
  372.         }
  373.         if (is_yuv) {
  374.             unpack_yuv(s, p, dst, strip_start + line);
  375.             line += s->subsampling[1] - 1;
  376.         }
  377.         dst += stride;
  378.         src += width;
  379.     }
  380.     av_free(zbuf);
  381.     return 0;
  382. }
  383. #endif
  384.  
  385. #if CONFIG_LZMA
  386. static int tiff_uncompress_lzma(uint8_t *dst, uint64_t *len, const uint8_t *src,
  387.                                 int size)
  388. {
  389.     lzma_stream stream = LZMA_STREAM_INIT;
  390.     lzma_ret ret;
  391.  
  392.     stream.next_in   = (uint8_t *)src;
  393.     stream.avail_in  = size;
  394.     stream.next_out  = dst;
  395.     stream.avail_out = *len;
  396.     ret              = lzma_stream_decoder(&stream, UINT64_MAX, 0);
  397.     if (ret != LZMA_OK) {
  398.         av_log(NULL, AV_LOG_ERROR, "LZMA init error: %d\n", ret);
  399.         return ret;
  400.     }
  401.     ret = lzma_code(&stream, LZMA_RUN);
  402.     lzma_end(&stream);
  403.     *len = stream.total_out;
  404.     return ret == LZMA_STREAM_END ? LZMA_OK : ret;
  405. }
  406.  
  407. static int tiff_unpack_lzma(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
  408.                             const uint8_t *src, int size, int width, int lines,
  409.                             int strip_start, int is_yuv)
  410. {
  411.     uint64_t outlen = width * lines;
  412.     int ret, line;
  413.     uint8_t *buf = av_malloc(outlen);
  414.     if (!buf)
  415.         return AVERROR(ENOMEM);
  416.     if (s->fill_order) {
  417.         if ((ret = deinvert_buffer(s, src, size)) < 0) {
  418.             av_free(buf);
  419.             return ret;
  420.         }
  421.         src = s->deinvert_buf;
  422.     }
  423.     ret = tiff_uncompress_lzma(buf, &outlen, src, size);
  424.     if (ret != LZMA_OK) {
  425.         av_log(s->avctx, AV_LOG_ERROR,
  426.                "Uncompressing failed (%"PRIu64" of %"PRIu64") with error %d\n", outlen,
  427.                (uint64_t)width * lines, ret);
  428.         av_free(buf);
  429.         return AVERROR_UNKNOWN;
  430.     }
  431.     src = buf;
  432.     for (line = 0; line < lines; line++) {
  433.         if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
  434.             horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
  435.         } else {
  436.             memcpy(dst, src, width);
  437.         }
  438.         if (is_yuv) {
  439.             unpack_yuv(s, p, dst, strip_start + line);
  440.             line += s->subsampling[1] - 1;
  441.         }
  442.         dst += stride;
  443.         src += width;
  444.     }
  445.     av_free(buf);
  446.     return 0;
  447. }
  448. #endif
  449.  
  450. static int tiff_unpack_fax(TiffContext *s, uint8_t *dst, int stride,
  451.                            const uint8_t *src, int size, int width, int lines)
  452. {
  453.     int i, ret = 0;
  454.     int line;
  455.     uint8_t *src2 = av_malloc((unsigned)size +
  456.                               AV_INPUT_BUFFER_PADDING_SIZE);
  457.  
  458.     if (!src2) {
  459.         av_log(s->avctx, AV_LOG_ERROR,
  460.                "Error allocating temporary buffer\n");
  461.         return AVERROR(ENOMEM);
  462.     }
  463.  
  464.     if (!s->fill_order) {
  465.         memcpy(src2, src, size);
  466.     } else {
  467.         for (i = 0; i < size; i++)
  468.             src2[i] = ff_reverse[src[i]];
  469.     }
  470.     memset(src2 + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
  471.     ret = ff_ccitt_unpack(s->avctx, src2, size, dst, lines, stride,
  472.                           s->compr, s->fax_opts);
  473.     if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
  474.         for (line = 0; line < lines; line++) {
  475.             horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
  476.             dst += stride;
  477.         }
  478.     av_free(src2);
  479.     return ret;
  480. }
  481.  
  482. static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
  483.                              const uint8_t *src, int size, int strip_start, int lines)
  484. {
  485.     PutByteContext pb;
  486.     int c, line, pixels, code, ret;
  487.     const uint8_t *ssrc = src;
  488.     int width = ((s->width * s->bpp) + 7) >> 3;
  489.     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(p->format);
  490.     int is_yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) &&
  491.                  (desc->flags & AV_PIX_FMT_FLAG_PLANAR) &&
  492.                  desc->nb_components >= 3;
  493.  
  494.     if (s->planar)
  495.         width /= s->bppcount;
  496.  
  497.     if (size <= 0)
  498.         return AVERROR_INVALIDDATA;
  499.  
  500.     if (is_yuv) {
  501.         int bytes_per_row = (((s->width - 1) / s->subsampling[0] + 1) * s->bpp *
  502.                             s->subsampling[0] * s->subsampling[1] + 7) >> 3;
  503.         av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, bytes_per_row);
  504.         if (s->yuv_line == NULL) {
  505.             av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n");
  506.             return AVERROR(ENOMEM);
  507.         }
  508.         dst = s->yuv_line;
  509.         stride = 0;
  510.  
  511.         width = (s->width - 1) / s->subsampling[0] + 1;
  512.         width = width * s->subsampling[0] * s->subsampling[1] + 2*width;
  513.         av_assert0(width <= bytes_per_row);
  514.         av_assert0(s->bpp == 24);
  515.     }
  516.  
  517.     if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
  518. #if CONFIG_ZLIB
  519.         return tiff_unpack_zlib(s, p, dst, stride, src, size, width, lines,
  520.                                 strip_start, is_yuv);
  521. #else
  522.         av_log(s->avctx, AV_LOG_ERROR,
  523.                "zlib support not enabled, "
  524.                "deflate compression not supported\n");
  525.         return AVERROR(ENOSYS);
  526. #endif
  527.     }
  528.     if (s->compr == TIFF_LZMA) {
  529. #if CONFIG_LZMA
  530.         return tiff_unpack_lzma(s, p, dst, stride, src, size, width, lines,
  531.                                 strip_start, is_yuv);
  532. #else
  533.         av_log(s->avctx, AV_LOG_ERROR,
  534.                "LZMA support not enabled\n");
  535.         return AVERROR(ENOSYS);
  536. #endif
  537.     }
  538.     if (s->compr == TIFF_LZW) {
  539.         if (s->fill_order) {
  540.             if ((ret = deinvert_buffer(s, src, size)) < 0)
  541.                 return ret;
  542.             ssrc = src = s->deinvert_buf;
  543.         }
  544.         if (size > 1 && !src[0] && (src[1]&1)) {
  545.             av_log(s->avctx, AV_LOG_ERROR, "Old style LZW is unsupported\n");
  546.         }
  547.         if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) {
  548.             av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
  549.             return ret;
  550.         }
  551.         for (line = 0; line < lines; line++) {
  552.             pixels = ff_lzw_decode(s->lzw, dst, width);
  553.             if (pixels < width) {
  554.                 av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n",
  555.                        pixels, width);
  556.                 return AVERROR_INVALIDDATA;
  557.             }
  558.             if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
  559.                 horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
  560.             if (is_yuv) {
  561.                 unpack_yuv(s, p, dst, strip_start + line);
  562.                 line += s->subsampling[1] - 1;
  563.             }
  564.             dst += stride;
  565.         }
  566.         return 0;
  567.     }
  568.     if (s->compr == TIFF_CCITT_RLE ||
  569.         s->compr == TIFF_G3        ||
  570.         s->compr == TIFF_G4) {
  571.         if (is_yuv)
  572.             return AVERROR_INVALIDDATA;
  573.  
  574.         return tiff_unpack_fax(s, dst, stride, src, size, width, lines);
  575.     }
  576.  
  577.     bytestream2_init(&s->gb, src, size);
  578.     bytestream2_init_writer(&pb, dst, is_yuv ? s->yuv_line_size : (stride * lines));
  579.  
  580.     for (line = 0; line < lines; line++) {
  581.         if (src - ssrc > size) {
  582.             av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
  583.             return AVERROR_INVALIDDATA;
  584.         }
  585.  
  586.         if (bytestream2_get_bytes_left(&s->gb) == 0 || bytestream2_get_eof(&pb))
  587.             break;
  588.         bytestream2_seek_p(&pb, stride * line, SEEK_SET);
  589.         switch (s->compr) {
  590.         case TIFF_RAW:
  591.             if (ssrc + size - src < width)
  592.                 return AVERROR_INVALIDDATA;
  593.  
  594.             if (!s->fill_order) {
  595.                 horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
  596.                                 dst, 1, src, 0, width, 0);
  597.             } else {
  598.                 int i;
  599.                 for (i = 0; i < width; i++)
  600.                     dst[i] = ff_reverse[src[i]];
  601.             }
  602.             src += width;
  603.             break;
  604.         case TIFF_PACKBITS:
  605.             for (pixels = 0; pixels < width;) {
  606.                 if (ssrc + size - src < 2) {
  607.                     av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n");
  608.                     return AVERROR_INVALIDDATA;
  609.                 }
  610.                 code = s->fill_order ? (int8_t) ff_reverse[*src++]: (int8_t) *src++;
  611.                 if (code >= 0) {
  612.                     code++;
  613.                     if (pixels + code > width ||
  614.                         ssrc + size - src < code) {
  615.                         av_log(s->avctx, AV_LOG_ERROR,
  616.                                "Copy went out of bounds\n");
  617.                         return AVERROR_INVALIDDATA;
  618.                     }
  619.                     horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
  620.                                     dst, 1, src, 0, code, pixels);
  621.                     src    += code;
  622.                     pixels += code;
  623.                 } else if (code != -128) { // -127..-1
  624.                     code = (-code) + 1;
  625.                     if (pixels + code > width) {
  626.                         av_log(s->avctx, AV_LOG_ERROR,
  627.                                "Run went out of bounds\n");
  628.                         return AVERROR_INVALIDDATA;
  629.                     }
  630.                     c = *src++;
  631.                     horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
  632.                                     dst, 0, NULL, c, code, pixels);
  633.                     pixels += code;
  634.                 }
  635.             }
  636.             if (s->fill_order) {
  637.                 int i;
  638.                 for (i = 0; i < width; i++)
  639.                     dst[i] = ff_reverse[dst[i]];
  640.             }
  641.             break;
  642.         }
  643.         if (is_yuv) {
  644.             unpack_yuv(s, p, dst, strip_start + line);
  645.             line += s->subsampling[1] - 1;
  646.         }
  647.         dst += stride;
  648.     }
  649.     return 0;
  650. }
  651.  
  652. static int init_image(TiffContext *s, ThreadFrame *frame)
  653. {
  654.     int ret;
  655.     int create_gray_palette = 0;
  656.  
  657.     // make sure there is no aliasing in the following switch
  658.     if (s->bpp >= 100 || s->bppcount >= 10) {
  659.         av_log(s->avctx, AV_LOG_ERROR,
  660.                "Unsupported image parameters: bpp=%d, bppcount=%d\n",
  661.                s->bpp, s->bppcount);
  662.         return AVERROR_INVALIDDATA;
  663.     }
  664.  
  665.     switch (s->planar * 1000 + s->bpp * 10 + s->bppcount) {
  666.     case 11:
  667.         if (!s->palette_is_set) {
  668.             s->avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
  669.             break;
  670.         }
  671.     case 21:
  672.     case 41:
  673.         s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
  674.         if (!s->palette_is_set) {
  675.             create_gray_palette = 1;
  676.         }
  677.         break;
  678.     case 81:
  679.         s->avctx->pix_fmt = s->palette_is_set ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8;
  680.         break;
  681.     case 243:
  682.         if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
  683.             if (s->subsampling[0] == 1 && s->subsampling[1] == 1) {
  684.                 s->avctx->pix_fmt = AV_PIX_FMT_YUV444P;
  685.             } else if (s->subsampling[0] == 2 && s->subsampling[1] == 1) {
  686.                 s->avctx->pix_fmt = AV_PIX_FMT_YUV422P;
  687.             } else if (s->subsampling[0] == 4 && s->subsampling[1] == 1) {
  688.                 s->avctx->pix_fmt = AV_PIX_FMT_YUV411P;
  689.             } else if (s->subsampling[0] == 1 && s->subsampling[1] == 2) {
  690.                 s->avctx->pix_fmt = AV_PIX_FMT_YUV440P;
  691.             } else if (s->subsampling[0] == 2 && s->subsampling[1] == 2) {
  692.                 s->avctx->pix_fmt = AV_PIX_FMT_YUV420P;
  693.             } else if (s->subsampling[0] == 4 && s->subsampling[1] == 4) {
  694.                 s->avctx->pix_fmt = AV_PIX_FMT_YUV410P;
  695.             } else {
  696.                 av_log(s->avctx, AV_LOG_ERROR, "Unsupported YCbCr subsampling\n");
  697.                 return AVERROR_PATCHWELCOME;
  698.             }
  699.         } else
  700.             s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
  701.         break;
  702.     case 161:
  703.         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GRAY16LE : AV_PIX_FMT_GRAY16BE;
  704.         break;
  705.     case 162:
  706.         s->avctx->pix_fmt = AV_PIX_FMT_YA8;
  707.         break;
  708.     case 322:
  709.         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_YA16LE : AV_PIX_FMT_YA16BE;
  710.         break;
  711.     case 324:
  712.         s->avctx->pix_fmt = AV_PIX_FMT_RGBA;
  713.         break;
  714.     case 483:
  715.         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGB48LE  : AV_PIX_FMT_RGB48BE;
  716.         break;
  717.     case 644:
  718.         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGBA64LE  : AV_PIX_FMT_RGBA64BE;
  719.         break;
  720.     case 1243:
  721.         s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
  722.         break;
  723.     case 1324:
  724.         s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
  725.         break;
  726.     case 1483:
  727.         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRP16LE : AV_PIX_FMT_GBRP16BE;
  728.         break;
  729.     case 1644:
  730.         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRAP16LE : AV_PIX_FMT_GBRAP16BE;
  731.         break;
  732.     default:
  733.         av_log(s->avctx, AV_LOG_ERROR,
  734.                "This format is not supported (bpp=%d, bppcount=%d)\n",
  735.                s->bpp, s->bppcount);
  736.         return AVERROR_INVALIDDATA;
  737.     }
  738.  
  739.     if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
  740.         const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
  741.         if((desc->flags & AV_PIX_FMT_FLAG_RGB) ||
  742.            !(desc->flags & AV_PIX_FMT_FLAG_PLANAR) ||
  743.            desc->nb_components < 3) {
  744.             av_log(s->avctx, AV_LOG_ERROR, "Unsupported YCbCr variant\n");
  745.             return AVERROR_INVALIDDATA;
  746.         }
  747.     }
  748.  
  749.     if (s->width != s->avctx->width || s->height != s->avctx->height) {
  750.         ret = ff_set_dimensions(s->avctx, s->width, s->height);
  751.         if (ret < 0)
  752.             return ret;
  753.     }
  754.     if ((ret = ff_thread_get_buffer(s->avctx, frame, 0)) < 0)
  755.         return ret;
  756.     if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
  757.         if (!create_gray_palette)
  758.             memcpy(frame->f->data[1], s->palette, sizeof(s->palette));
  759.         else {
  760.             /* make default grayscale pal */
  761.             int i;
  762.             uint32_t *pal = (uint32_t *)frame->f->data[1];
  763.             for (i = 0; i < 1<<s->bpp; i++)
  764.                 pal[i] = 0xFFU << 24 | i * 255 / ((1<<s->bpp) - 1) * 0x010101;
  765.         }
  766.     }
  767.     return 0;
  768. }
  769.  
  770. static void set_sar(TiffContext *s, unsigned tag, unsigned num, unsigned den)
  771. {
  772.     int offset = tag == TIFF_YRES ? 2 : 0;
  773.     s->res[offset++] = num;
  774.     s->res[offset]   = den;
  775.     if (s->res[0] && s->res[1] && s->res[2] && s->res[3])
  776.         av_reduce(&s->avctx->sample_aspect_ratio.num, &s->avctx->sample_aspect_ratio.den,
  777.                   s->res[2] * (uint64_t)s->res[1], s->res[0] * (uint64_t)s->res[3], INT32_MAX);
  778. }
  779.  
  780. static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
  781. {
  782.     unsigned tag, type, count, off, value = 0, value2 = 0;
  783.     int i, start;
  784.     int pos;
  785.     int ret;
  786.     double *dp;
  787.  
  788.     ret = ff_tread_tag(&s->gb, s->le, &tag, &type, &count, &start);
  789.     if (ret < 0) {
  790.         goto end;
  791.     }
  792.  
  793.     off = bytestream2_tell(&s->gb);
  794.     if (count == 1) {
  795.         switch (type) {
  796.         case TIFF_BYTE:
  797.         case TIFF_SHORT:
  798.         case TIFF_LONG:
  799.             value = ff_tget(&s->gb, type, s->le);
  800.             break;
  801.         case TIFF_RATIONAL:
  802.             value  = ff_tget(&s->gb, TIFF_LONG, s->le);
  803.             value2 = ff_tget(&s->gb, TIFF_LONG, s->le);
  804.             break;
  805.         case TIFF_STRING:
  806.             if (count <= 4) {
  807.                 break;
  808.             }
  809.         default:
  810.             value = UINT_MAX;
  811.         }
  812.     }
  813.  
  814.     switch (tag) {
  815.     case TIFF_WIDTH:
  816.         s->width = value;
  817.         break;
  818.     case TIFF_HEIGHT:
  819.         s->height = value;
  820.         break;
  821.     case TIFF_BPP:
  822.         if (count > 4U) {
  823.             av_log(s->avctx, AV_LOG_ERROR,
  824.                    "This format is not supported (bpp=%d, %d components)\n",
  825.                    value, count);
  826.             return AVERROR_INVALIDDATA;
  827.         }
  828.         s->bppcount = count;
  829.         if (count == 1)
  830.             s->bpp = value;
  831.         else {
  832.             switch (type) {
  833.             case TIFF_BYTE:
  834.             case TIFF_SHORT:
  835.             case TIFF_LONG:
  836.                 s->bpp = 0;
  837.                 if (bytestream2_get_bytes_left(&s->gb) < type_sizes[type] * count)
  838.                     return AVERROR_INVALIDDATA;
  839.                 for (i = 0; i < count; i++)
  840.                     s->bpp += ff_tget(&s->gb, type, s->le);
  841.                 break;
  842.             default:
  843.                 s->bpp = -1;
  844.             }
  845.         }
  846.         break;
  847.     case TIFF_SAMPLES_PER_PIXEL:
  848.         if (count != 1) {
  849.             av_log(s->avctx, AV_LOG_ERROR,
  850.                    "Samples per pixel requires a single value, many provided\n");
  851.             return AVERROR_INVALIDDATA;
  852.         }
  853.         if (value > 4U) {
  854.             av_log(s->avctx, AV_LOG_ERROR,
  855.                    "Samples per pixel %d is too large\n", value);
  856.             return AVERROR_INVALIDDATA;
  857.         }
  858.         if (s->bppcount == 1)
  859.             s->bpp *= value;
  860.         s->bppcount = value;
  861.         break;
  862.     case TIFF_COMPR:
  863.         s->compr     = value;
  864.         s->predictor = 0;
  865.         switch (s->compr) {
  866.         case TIFF_RAW:
  867.         case TIFF_PACKBITS:
  868.         case TIFF_LZW:
  869.         case TIFF_CCITT_RLE:
  870.             break;
  871.         case TIFF_G3:
  872.         case TIFF_G4:
  873.             s->fax_opts = 0;
  874.             break;
  875.         case TIFF_DEFLATE:
  876.         case TIFF_ADOBE_DEFLATE:
  877. #if CONFIG_ZLIB
  878.             break;
  879. #else
  880.             av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
  881.             return AVERROR(ENOSYS);
  882. #endif
  883.         case TIFF_JPEG:
  884.         case TIFF_NEWJPEG:
  885.             avpriv_report_missing_feature(s->avctx, "JPEG compression");
  886.             return AVERROR_PATCHWELCOME;
  887.         case TIFF_LZMA:
  888. #if CONFIG_LZMA
  889.             break;
  890. #else
  891.             av_log(s->avctx, AV_LOG_ERROR, "LZMA not compiled in\n");
  892.             return AVERROR(ENOSYS);
  893. #endif
  894.         default:
  895.             av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n",
  896.                    s->compr);
  897.             return AVERROR_INVALIDDATA;
  898.         }
  899.         break;
  900.     case TIFF_ROWSPERSTRIP:
  901.         if (!value || (type == TIFF_LONG && value == UINT_MAX))
  902.             value = s->height;
  903.         s->rps = FFMIN(value, s->height);
  904.         break;
  905.     case TIFF_STRIP_OFFS:
  906.         if (count == 1) {
  907.             s->strippos = 0;
  908.             s->stripoff = value;
  909.         } else
  910.             s->strippos = off;
  911.         s->strips = count;
  912.         if (s->strips == 1)
  913.             s->rps = s->height;
  914.         s->sot = type;
  915.         break;
  916.     case TIFF_STRIP_SIZE:
  917.         if (count == 1) {
  918.             s->stripsizesoff = 0;
  919.             s->stripsize     = value;
  920.             s->strips        = 1;
  921.         } else {
  922.             s->stripsizesoff = off;
  923.         }
  924.         s->strips = count;
  925.         s->sstype = type;
  926.         break;
  927.     case TIFF_XRES:
  928.     case TIFF_YRES:
  929.         set_sar(s, tag, value, value2);
  930.         break;
  931.     case TIFF_TILE_BYTE_COUNTS:
  932.     case TIFF_TILE_LENGTH:
  933.     case TIFF_TILE_OFFSETS:
  934.     case TIFF_TILE_WIDTH:
  935.         av_log(s->avctx, AV_LOG_ERROR, "Tiled images are not supported\n");
  936.         return AVERROR_PATCHWELCOME;
  937.         break;
  938.     case TIFF_PREDICTOR:
  939.         s->predictor = value;
  940.         break;
  941.     case TIFF_PHOTOMETRIC:
  942.         switch (value) {
  943.         case TIFF_PHOTOMETRIC_WHITE_IS_ZERO:
  944.         case TIFF_PHOTOMETRIC_BLACK_IS_ZERO:
  945.         case TIFF_PHOTOMETRIC_RGB:
  946.         case TIFF_PHOTOMETRIC_PALETTE:
  947.         case TIFF_PHOTOMETRIC_YCBCR:
  948.             s->photometric = value;
  949.             break;
  950.         case TIFF_PHOTOMETRIC_ALPHA_MASK:
  951.         case TIFF_PHOTOMETRIC_SEPARATED:
  952.         case TIFF_PHOTOMETRIC_CIE_LAB:
  953.         case TIFF_PHOTOMETRIC_ICC_LAB:
  954.         case TIFF_PHOTOMETRIC_ITU_LAB:
  955.         case TIFF_PHOTOMETRIC_CFA:
  956.         case TIFF_PHOTOMETRIC_LOG_L:
  957.         case TIFF_PHOTOMETRIC_LOG_LUV:
  958.         case TIFF_PHOTOMETRIC_LINEAR_RAW:
  959.             avpriv_report_missing_feature(s->avctx,
  960.                                           "PhotometricInterpretation 0x%04X",
  961.                                           value);
  962.             return AVERROR_PATCHWELCOME;
  963.         default:
  964.             av_log(s->avctx, AV_LOG_ERROR, "PhotometricInterpretation %u is "
  965.                    "unknown\n", value);
  966.             return AVERROR_INVALIDDATA;
  967.         }
  968.         break;
  969.     case TIFF_FILL_ORDER:
  970.         if (value < 1 || value > 2) {
  971.             av_log(s->avctx, AV_LOG_ERROR,
  972.                    "Unknown FillOrder value %d, trying default one\n", value);
  973.             value = 1;
  974.         }
  975.         s->fill_order = value - 1;
  976.         break;
  977.     case TIFF_PAL: {
  978.         GetByteContext pal_gb[3];
  979.         off = type_sizes[type];
  980.         if (count / 3 > 256 ||
  981.             bytestream2_get_bytes_left(&s->gb) < count / 3 * off * 3)
  982.             return AVERROR_INVALIDDATA;
  983.  
  984.         pal_gb[0] = pal_gb[1] = pal_gb[2] = s->gb;
  985.         bytestream2_skip(&pal_gb[1], count / 3 * off);
  986.         bytestream2_skip(&pal_gb[2], count / 3 * off * 2);
  987.  
  988.         off = (type_sizes[type] - 1) << 3;
  989.         for (i = 0; i < count / 3; i++) {
  990.             uint32_t p = 0xFF000000;
  991.             p |= (ff_tget(&pal_gb[0], type, s->le) >> off) << 16;
  992.             p |= (ff_tget(&pal_gb[1], type, s->le) >> off) << 8;
  993.             p |=  ff_tget(&pal_gb[2], type, s->le) >> off;
  994.             s->palette[i] = p;
  995.         }
  996.         s->palette_is_set = 1;
  997.         break;
  998.     }
  999.     case TIFF_PLANAR:
  1000.         s->planar = value == 2;
  1001.         break;
  1002.     case TIFF_YCBCR_SUBSAMPLING:
  1003.         if (count != 2) {
  1004.             av_log(s->avctx, AV_LOG_ERROR, "subsample count invalid\n");
  1005.             return AVERROR_INVALIDDATA;
  1006.         }
  1007.         for (i = 0; i < count; i++)
  1008.             s->subsampling[i] = ff_tget(&s->gb, type, s->le);
  1009.         break;
  1010.     case TIFF_T4OPTIONS:
  1011.         if (s->compr == TIFF_G3)
  1012.             s->fax_opts = value;
  1013.         break;
  1014.     case TIFF_T6OPTIONS:
  1015.         if (s->compr == TIFF_G4)
  1016.             s->fax_opts = value;
  1017.         break;
  1018. #define ADD_METADATA(count, name, sep)\
  1019.     if ((ret = add_metadata(count, type, name, sep, s, frame)) < 0) {\
  1020.         av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");\
  1021.         goto end;\
  1022.     }
  1023.     case TIFF_MODEL_PIXEL_SCALE:
  1024.         ADD_METADATA(count, "ModelPixelScaleTag", NULL);
  1025.         break;
  1026.     case TIFF_MODEL_TRANSFORMATION:
  1027.         ADD_METADATA(count, "ModelTransformationTag", NULL);
  1028.         break;
  1029.     case TIFF_MODEL_TIEPOINT:
  1030.         ADD_METADATA(count, "ModelTiepointTag", NULL);
  1031.         break;
  1032.     case TIFF_GEO_KEY_DIRECTORY:
  1033.         ADD_METADATA(1, "GeoTIFF_Version", NULL);
  1034.         ADD_METADATA(2, "GeoTIFF_Key_Revision", ".");
  1035.         s->geotag_count   = ff_tget_short(&s->gb, s->le);
  1036.         if (s->geotag_count > count / 4 - 1) {
  1037.             s->geotag_count = count / 4 - 1;
  1038.             av_log(s->avctx, AV_LOG_WARNING, "GeoTIFF key directory buffer shorter than specified\n");
  1039.         }
  1040.         if (bytestream2_get_bytes_left(&s->gb) < s->geotag_count * sizeof(int16_t) * 4) {
  1041.             s->geotag_count = 0;
  1042.             return -1;
  1043.         }
  1044.         s->geotags = av_mallocz_array(s->geotag_count, sizeof(TiffGeoTag));
  1045.         if (!s->geotags) {
  1046.             av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  1047.             s->geotag_count = 0;
  1048.             goto end;
  1049.         }
  1050.         for (i = 0; i < s->geotag_count; i++) {
  1051.             s->geotags[i].key    = ff_tget_short(&s->gb, s->le);
  1052.             s->geotags[i].type   = ff_tget_short(&s->gb, s->le);
  1053.             s->geotags[i].count  = ff_tget_short(&s->gb, s->le);
  1054.  
  1055.             if (!s->geotags[i].type)
  1056.                 s->geotags[i].val  = get_geokey_val(s->geotags[i].key, ff_tget_short(&s->gb, s->le));
  1057.             else
  1058.                 s->geotags[i].offset = ff_tget_short(&s->gb, s->le);
  1059.         }
  1060.         break;
  1061.     case TIFF_GEO_DOUBLE_PARAMS:
  1062.         if (count >= INT_MAX / sizeof(int64_t))
  1063.             return AVERROR_INVALIDDATA;
  1064.         if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t))
  1065.             return AVERROR_INVALIDDATA;
  1066.         dp = av_malloc_array(count, sizeof(double));
  1067.         if (!dp) {
  1068.             av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  1069.             goto end;
  1070.         }
  1071.         for (i = 0; i < count; i++)
  1072.             dp[i] = ff_tget_double(&s->gb, s->le);
  1073.         for (i = 0; i < s->geotag_count; i++) {
  1074.             if (s->geotags[i].type == TIFF_GEO_DOUBLE_PARAMS) {
  1075.                 if (s->geotags[i].count == 0
  1076.                     || s->geotags[i].offset + s->geotags[i].count > count) {
  1077.                     av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
  1078.                 } else {
  1079.                     char *ap = doubles2str(&dp[s->geotags[i].offset], s->geotags[i].count, ", ");
  1080.                     if (!ap) {
  1081.                         av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  1082.                         av_freep(&dp);
  1083.                         return AVERROR(ENOMEM);
  1084.                     }
  1085.                     s->geotags[i].val = ap;
  1086.                 }
  1087.             }
  1088.         }
  1089.         av_freep(&dp);
  1090.         break;
  1091.     case TIFF_GEO_ASCII_PARAMS:
  1092.         pos = bytestream2_tell(&s->gb);
  1093.         for (i = 0; i < s->geotag_count; i++) {
  1094.             if (s->geotags[i].type == TIFF_GEO_ASCII_PARAMS) {
  1095.                 if (s->geotags[i].count == 0
  1096.                     || s->geotags[i].offset +  s->geotags[i].count > count) {
  1097.                     av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
  1098.                 } else {
  1099.                     char *ap;
  1100.  
  1101.                     bytestream2_seek(&s->gb, pos + s->geotags[i].offset, SEEK_SET);
  1102.                     if (bytestream2_get_bytes_left(&s->gb) < s->geotags[i].count)
  1103.                         return AVERROR_INVALIDDATA;
  1104.                     ap = av_malloc(s->geotags[i].count);
  1105.                     if (!ap) {
  1106.                         av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  1107.                         return AVERROR(ENOMEM);
  1108.                     }
  1109.                     bytestream2_get_bufferu(&s->gb, ap, s->geotags[i].count);
  1110.                     ap[s->geotags[i].count - 1] = '\0'; //replace the "|" delimiter with a 0 byte
  1111.                     s->geotags[i].val = ap;
  1112.                 }
  1113.             }
  1114.         }
  1115.         break;
  1116.     case TIFF_ARTIST:
  1117.         ADD_METADATA(count, "artist", NULL);
  1118.         break;
  1119.     case TIFF_COPYRIGHT:
  1120.         ADD_METADATA(count, "copyright", NULL);
  1121.         break;
  1122.     case TIFF_DATE:
  1123.         ADD_METADATA(count, "date", NULL);
  1124.         break;
  1125.     case TIFF_DOCUMENT_NAME:
  1126.         ADD_METADATA(count, "document_name", NULL);
  1127.         break;
  1128.     case TIFF_HOST_COMPUTER:
  1129.         ADD_METADATA(count, "computer", NULL);
  1130.         break;
  1131.     case TIFF_IMAGE_DESCRIPTION:
  1132.         ADD_METADATA(count, "description", NULL);
  1133.         break;
  1134.     case TIFF_MAKE:
  1135.         ADD_METADATA(count, "make", NULL);
  1136.         break;
  1137.     case TIFF_MODEL:
  1138.         ADD_METADATA(count, "model", NULL);
  1139.         break;
  1140.     case TIFF_PAGE_NAME:
  1141.         ADD_METADATA(count, "page_name", NULL);
  1142.         break;
  1143.     case TIFF_PAGE_NUMBER:
  1144.         ADD_METADATA(count, "page_number", " / ");
  1145.         break;
  1146.     case TIFF_SOFTWARE_NAME:
  1147.         ADD_METADATA(count, "software", NULL);
  1148.         break;
  1149.     default:
  1150.         if (s->avctx->err_recognition & AV_EF_EXPLODE) {
  1151.             av_log(s->avctx, AV_LOG_ERROR,
  1152.                    "Unknown or unsupported tag %d/0X%0X\n",
  1153.                    tag, tag);
  1154.             return AVERROR_INVALIDDATA;
  1155.         }
  1156.     }
  1157. end:
  1158.     if (s->bpp > 64U) {
  1159.         av_log(s->avctx, AV_LOG_ERROR,
  1160.                 "This format is not supported (bpp=%d, %d components)\n",
  1161.                 s->bpp, count);
  1162.         s->bpp = 0;
  1163.         return AVERROR_INVALIDDATA;
  1164.     }
  1165.     bytestream2_seek(&s->gb, start, SEEK_SET);
  1166.     return 0;
  1167. }
  1168.  
  1169. static int decode_frame(AVCodecContext *avctx,
  1170.                         void *data, int *got_frame, AVPacket *avpkt)
  1171. {
  1172.     TiffContext *const s = avctx->priv_data;
  1173.     AVFrame *const p = data;
  1174.     ThreadFrame frame = { .f = data };
  1175.     unsigned off;
  1176.     int le, ret, plane, planes;
  1177.     int i, j, entries, stride;
  1178.     unsigned soff, ssize;
  1179.     uint8_t *dst;
  1180.     GetByteContext stripsizes;
  1181.     GetByteContext stripdata;
  1182.  
  1183.     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
  1184.  
  1185.     // parse image header
  1186.     if ((ret = ff_tdecode_header(&s->gb, &le, &off))) {
  1187.         av_log(avctx, AV_LOG_ERROR, "Invalid TIFF header\n");
  1188.         return ret;
  1189.     } else if (off >= UINT_MAX - 14 || avpkt->size < off + 14) {
  1190.         av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
  1191.         return AVERROR_INVALIDDATA;
  1192.     }
  1193.     s->le          = le;
  1194.     // TIFF_BPP is not a required tag and defaults to 1
  1195.     s->bppcount    = s->bpp = 1;
  1196.     s->photometric = TIFF_PHOTOMETRIC_NONE;
  1197.     s->compr       = TIFF_RAW;
  1198.     s->fill_order  = 0;
  1199.     free_geotags(s);
  1200.  
  1201.     // Reset these offsets so we can tell if they were set this frame
  1202.     s->stripsizesoff = s->strippos = 0;
  1203.     /* parse image file directory */
  1204.     bytestream2_seek(&s->gb, off, SEEK_SET);
  1205.     entries = ff_tget_short(&s->gb, le);
  1206.     if (bytestream2_get_bytes_left(&s->gb) < entries * 12)
  1207.         return AVERROR_INVALIDDATA;
  1208.     for (i = 0; i < entries; i++) {
  1209.         if ((ret = tiff_decode_tag(s, p)) < 0)
  1210.             return ret;
  1211.     }
  1212.  
  1213.     for (i = 0; i<s->geotag_count; i++) {
  1214.         const char *keyname = get_geokey_name(s->geotags[i].key);
  1215.         if (!keyname) {
  1216.             av_log(avctx, AV_LOG_WARNING, "Unknown or unsupported GeoTIFF key %d\n", s->geotags[i].key);
  1217.             continue;
  1218.         }
  1219.         if (get_geokey_type(s->geotags[i].key) != s->geotags[i].type) {
  1220.             av_log(avctx, AV_LOG_WARNING, "Type of GeoTIFF key %d is wrong\n", s->geotags[i].key);
  1221.             continue;
  1222.         }
  1223.         ret = av_dict_set(avpriv_frame_get_metadatap(p), keyname, s->geotags[i].val, 0);
  1224.         if (ret<0) {
  1225.             av_log(avctx, AV_LOG_ERROR, "Writing metadata with key '%s' failed\n", keyname);
  1226.             return ret;
  1227.         }
  1228.     }
  1229.  
  1230.     if (!s->strippos && !s->stripoff) {
  1231.         av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
  1232.         return AVERROR_INVALIDDATA;
  1233.     }
  1234.     /* now we have the data and may start decoding */
  1235.     if ((ret = init_image(s, &frame)) < 0)
  1236.         return ret;
  1237.  
  1238.     if (s->strips == 1 && !s->stripsize) {
  1239.         av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
  1240.         s->stripsize = avpkt->size - s->stripoff;
  1241.     }
  1242.  
  1243.     if (s->stripsizesoff) {
  1244.         if (s->stripsizesoff >= (unsigned)avpkt->size)
  1245.             return AVERROR_INVALIDDATA;
  1246.         bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff,
  1247.                          avpkt->size - s->stripsizesoff);
  1248.     }
  1249.     if (s->strippos) {
  1250.         if (s->strippos >= (unsigned)avpkt->size)
  1251.             return AVERROR_INVALIDDATA;
  1252.         bytestream2_init(&stripdata, avpkt->data + s->strippos,
  1253.                          avpkt->size - s->strippos);
  1254.     }
  1255.  
  1256.     if (s->rps <= 0) {
  1257.         av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps);
  1258.         return AVERROR_INVALIDDATA;
  1259.     }
  1260.  
  1261.     planes = s->planar ? s->bppcount : 1;
  1262.     for (plane = 0; plane < planes; plane++) {
  1263.         stride = p->linesize[plane];
  1264.         dst = p->data[plane];
  1265.         for (i = 0; i < s->height; i += s->rps) {
  1266.             if (s->stripsizesoff)
  1267.                 ssize = ff_tget(&stripsizes, s->sstype, le);
  1268.             else
  1269.                 ssize = s->stripsize;
  1270.  
  1271.             if (s->strippos)
  1272.                 soff = ff_tget(&stripdata, s->sot, le);
  1273.             else
  1274.                 soff = s->stripoff;
  1275.  
  1276.             if (soff > avpkt->size || ssize > avpkt->size - soff) {
  1277.                 av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
  1278.                 return AVERROR_INVALIDDATA;
  1279.             }
  1280.             if ((ret = tiff_unpack_strip(s, p, dst, stride, avpkt->data + soff, ssize, i,
  1281.                                          FFMIN(s->rps, s->height - i))) < 0) {
  1282.                 if (avctx->err_recognition & AV_EF_EXPLODE)
  1283.                     return ret;
  1284.                 break;
  1285.             }
  1286.             dst += s->rps * stride;
  1287.         }
  1288.         if (s->predictor == 2) {
  1289.             if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
  1290.                 av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported");
  1291.                 return AVERROR_PATCHWELCOME;
  1292.             }
  1293.             dst   = p->data[plane];
  1294.             soff  = s->bpp >> 3;
  1295.             if (s->planar)
  1296.                 soff  = FFMAX(soff / s->bppcount, 1);
  1297.             ssize = s->width * soff;
  1298.             if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48LE ||
  1299.                 s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE ||
  1300.                 s->avctx->pix_fmt == AV_PIX_FMT_GRAY16LE ||
  1301.                 s->avctx->pix_fmt == AV_PIX_FMT_YA16LE ||
  1302.                 s->avctx->pix_fmt == AV_PIX_FMT_GBRP16LE ||
  1303.                 s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16LE) {
  1304.                 for (i = 0; i < s->height; i++) {
  1305.                     for (j = soff; j < ssize; j += 2)
  1306.                         AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff));
  1307.                     dst += stride;
  1308.                 }
  1309.             } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
  1310.                        s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE ||
  1311.                        s->avctx->pix_fmt == AV_PIX_FMT_GRAY16BE ||
  1312.                        s->avctx->pix_fmt == AV_PIX_FMT_YA16BE ||
  1313.                        s->avctx->pix_fmt == AV_PIX_FMT_GBRP16BE ||
  1314.                        s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16BE) {
  1315.                 for (i = 0; i < s->height; i++) {
  1316.                     for (j = soff; j < ssize; j += 2)
  1317.                         AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff));
  1318.                     dst += stride;
  1319.                 }
  1320.             } else {
  1321.                 for (i = 0; i < s->height; i++) {
  1322.                     for (j = soff; j < ssize; j++)
  1323.                         dst[j] += dst[j - soff];
  1324.                     dst += stride;
  1325.                 }
  1326.             }
  1327.         }
  1328.  
  1329.         if (s->photometric == TIFF_PHOTOMETRIC_WHITE_IS_ZERO) {
  1330.             dst = p->data[plane];
  1331.             for (i = 0; i < s->height; i++) {
  1332.                 for (j = 0; j < stride; j++)
  1333.                     dst[j] = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<<s->bpp) - 1 : 255) - dst[j];
  1334.                 dst += stride;
  1335.             }
  1336.         }
  1337.     }
  1338.  
  1339.     if (s->planar && s->bppcount > 2) {
  1340.         FFSWAP(uint8_t*, p->data[0],     p->data[2]);
  1341.         FFSWAP(int,      p->linesize[0], p->linesize[2]);
  1342.         FFSWAP(uint8_t*, p->data[0],     p->data[1]);
  1343.         FFSWAP(int,      p->linesize[0], p->linesize[1]);
  1344.     }
  1345.  
  1346.     *got_frame = 1;
  1347.  
  1348.     return avpkt->size;
  1349. }
  1350.  
  1351. static av_cold int tiff_init(AVCodecContext *avctx)
  1352. {
  1353.     TiffContext *s = avctx->priv_data;
  1354.  
  1355.     s->width  = 0;
  1356.     s->height = 0;
  1357.     s->subsampling[0] =
  1358.     s->subsampling[1] = 1;
  1359.     s->avctx  = avctx;
  1360.     ff_lzw_decode_open(&s->lzw);
  1361.     ff_ccitt_unpack_init();
  1362.  
  1363.     return 0;
  1364. }
  1365.  
  1366. static av_cold int tiff_end(AVCodecContext *avctx)
  1367. {
  1368.     TiffContext *const s = avctx->priv_data;
  1369.  
  1370.     free_geotags(s);
  1371.  
  1372.     ff_lzw_decode_close(&s->lzw);
  1373.     av_freep(&s->deinvert_buf);
  1374.     return 0;
  1375. }
  1376.  
  1377. AVCodec ff_tiff_decoder = {
  1378.     .name           = "tiff",
  1379.     .long_name      = NULL_IF_CONFIG_SMALL("TIFF image"),
  1380.     .type           = AVMEDIA_TYPE_VIDEO,
  1381.     .id             = AV_CODEC_ID_TIFF,
  1382.     .priv_data_size = sizeof(TiffContext),
  1383.     .init           = tiff_init,
  1384.     .close          = tiff_end,
  1385.     .decode         = decode_frame,
  1386.     .init_thread_copy = ONLY_IF_THREADS_ENABLED(tiff_init),
  1387.     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
  1388. };
  1389.