You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1260 lines
40KB

  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. * @file
  22. * TIFF image decoder
  23. * @author Konstantin Shishkov
  24. */
  25. #include "config.h"
  26. #if CONFIG_ZLIB
  27. #include <zlib.h>
  28. #endif
  29. #include "libavutil/attributes.h"
  30. #include "libavutil/avstring.h"
  31. #include "libavutil/intreadwrite.h"
  32. #include "libavutil/imgutils.h"
  33. #include "avcodec.h"
  34. #include "bytestream.h"
  35. #include "faxcompr.h"
  36. #include "internal.h"
  37. #include "lzw.h"
  38. #include "mathops.h"
  39. #include "tiff.h"
  40. #include "tiff_data.h"
  41. typedef struct TiffContext {
  42. AVCodecContext *avctx;
  43. GetByteContext gb;
  44. int width, height;
  45. unsigned int bpp, bppcount;
  46. uint32_t palette[256];
  47. int palette_is_set;
  48. int le;
  49. enum TiffCompr compr;
  50. int invert;
  51. int planar;
  52. int fax_opts;
  53. int predictor;
  54. int fill_order;
  55. int strips, rps, sstype;
  56. int sot;
  57. int stripsizesoff, stripsize, stripoff, strippos;
  58. LZWState *lzw;
  59. uint8_t *deinvert_buf;
  60. int deinvert_buf_size;
  61. int geotag_count;
  62. TiffGeoTag *geotags;
  63. } TiffContext;
  64. static unsigned tget_short(GetByteContext *gb, int le)
  65. {
  66. unsigned v = le ? bytestream2_get_le16(gb) : bytestream2_get_be16(gb);
  67. return v;
  68. }
  69. static unsigned tget_long(GetByteContext *gb, int le)
  70. {
  71. unsigned v = le ? bytestream2_get_le32(gb) : bytestream2_get_be32(gb);
  72. return v;
  73. }
  74. static double tget_double(GetByteContext *gb, int le)
  75. {
  76. av_alias64 i = { .u64 = le ? bytestream2_get_le64(gb) : bytestream2_get_be64(gb)};
  77. return i.f64;
  78. }
  79. static unsigned tget(GetByteContext *gb, int type, int le)
  80. {
  81. switch (type) {
  82. case TIFF_BYTE:
  83. return bytestream2_get_byte(gb);
  84. case TIFF_SHORT:
  85. return tget_short(gb, le);
  86. case TIFF_LONG:
  87. return tget_long(gb, le);
  88. default:
  89. return UINT_MAX;
  90. }
  91. }
  92. static void free_geotags(TiffContext *const s)
  93. {
  94. int i;
  95. for (i = 0; i < s->geotag_count; i++) {
  96. if (s->geotags[i].val)
  97. av_freep(&s->geotags[i].val);
  98. }
  99. av_freep(&s->geotags);
  100. }
  101. #define RET_GEOKEY(TYPE, array, element)\
  102. if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\
  103. key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_name_type_map))\
  104. return ff_tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].element;
  105. static const char *get_geokey_name(int key)
  106. {
  107. RET_GEOKEY(VERT, vert, name);
  108. RET_GEOKEY(PROJ, proj, name);
  109. RET_GEOKEY(GEOG, geog, name);
  110. RET_GEOKEY(CONF, conf, name);
  111. return NULL;
  112. }
  113. static int get_geokey_type(int key)
  114. {
  115. RET_GEOKEY(VERT, vert, type);
  116. RET_GEOKEY(PROJ, proj, type);
  117. RET_GEOKEY(GEOG, geog, type);
  118. RET_GEOKEY(CONF, conf, type);
  119. return AVERROR_INVALIDDATA;
  120. }
  121. static int cmp_id_key(const void *id, const void *k)
  122. {
  123. return *(const int*)id - ((const TiffGeoTagKeyName*)k)->key;
  124. }
  125. static const char *search_keyval(const TiffGeoTagKeyName *keys, int n, int id)
  126. {
  127. TiffGeoTagKeyName *r = bsearch(&id, keys, n, sizeof(keys[0]), cmp_id_key);
  128. if(r)
  129. return r->name;
  130. return NULL;
  131. }
  132. static char *get_geokey_val(int key, int val)
  133. {
  134. char *ap;
  135. if (val == TIFF_GEO_KEY_UNDEFINED)
  136. return av_strdup("undefined");
  137. if (val == TIFF_GEO_KEY_USER_DEFINED)
  138. return av_strdup("User-Defined");
  139. #define RET_GEOKEY_VAL(TYPE, array)\
  140. if (val >= TIFF_##TYPE##_OFFSET &&\
  141. val - TIFF_##TYPE##_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_codes))\
  142. return av_strdup(ff_tiff_##array##_codes[val - TIFF_##TYPE##_OFFSET]);
  143. switch (key) {
  144. case TIFF_GT_MODEL_TYPE_GEOKEY:
  145. RET_GEOKEY_VAL(GT_MODEL_TYPE, gt_model_type);
  146. break;
  147. case TIFF_GT_RASTER_TYPE_GEOKEY:
  148. RET_GEOKEY_VAL(GT_RASTER_TYPE, gt_raster_type);
  149. break;
  150. case TIFF_GEOG_LINEAR_UNITS_GEOKEY:
  151. case TIFF_PROJ_LINEAR_UNITS_GEOKEY:
  152. case TIFF_VERTICAL_UNITS_GEOKEY:
  153. RET_GEOKEY_VAL(LINEAR_UNIT, linear_unit);
  154. break;
  155. case TIFF_GEOG_ANGULAR_UNITS_GEOKEY:
  156. case TIFF_GEOG_AZIMUTH_UNITS_GEOKEY:
  157. RET_GEOKEY_VAL(ANGULAR_UNIT, angular_unit);
  158. break;
  159. case TIFF_GEOGRAPHIC_TYPE_GEOKEY:
  160. RET_GEOKEY_VAL(GCS_TYPE, gcs_type);
  161. RET_GEOKEY_VAL(GCSE_TYPE, gcse_type);
  162. break;
  163. case TIFF_GEOG_GEODETIC_DATUM_GEOKEY:
  164. RET_GEOKEY_VAL(GEODETIC_DATUM, geodetic_datum);
  165. RET_GEOKEY_VAL(GEODETIC_DATUM_E, geodetic_datum_e);
  166. break;
  167. case TIFF_GEOG_ELLIPSOID_GEOKEY:
  168. RET_GEOKEY_VAL(ELLIPSOID, ellipsoid);
  169. break;
  170. case TIFF_GEOG_PRIME_MERIDIAN_GEOKEY:
  171. RET_GEOKEY_VAL(PRIME_MERIDIAN, prime_meridian);
  172. break;
  173. case TIFF_PROJECTED_CS_TYPE_GEOKEY:
  174. ap = av_strdup(search_keyval(ff_tiff_proj_cs_type_codes, FF_ARRAY_ELEMS(ff_tiff_proj_cs_type_codes), val));
  175. if(ap) return ap;
  176. break;
  177. case TIFF_PROJECTION_GEOKEY:
  178. ap = av_strdup(search_keyval(ff_tiff_projection_codes, FF_ARRAY_ELEMS(ff_tiff_projection_codes), val));
  179. if(ap) return ap;
  180. break;
  181. case TIFF_PROJ_COORD_TRANS_GEOKEY:
  182. RET_GEOKEY_VAL(COORD_TRANS, coord_trans);
  183. break;
  184. case TIFF_VERTICAL_CS_TYPE_GEOKEY:
  185. RET_GEOKEY_VAL(VERT_CS, vert_cs);
  186. RET_GEOKEY_VAL(ORTHO_VERT_CS, ortho_vert_cs);
  187. break;
  188. }
  189. ap = av_malloc(14);
  190. if (ap)
  191. snprintf(ap, 14, "Unknown-%d", val);
  192. return ap;
  193. }
  194. static char *doubles2str(double *dp, int count, const char *sep)
  195. {
  196. int i;
  197. char *ap, *ap0;
  198. uint64_t component_len;
  199. if (!sep) sep = ", ";
  200. component_len = 15LL + strlen(sep);
  201. if (count >= (INT_MAX - 1)/component_len)
  202. return NULL;
  203. ap = av_malloc(component_len * count + 1);
  204. if (!ap)
  205. return NULL;
  206. ap0 = ap;
  207. ap[0] = '\0';
  208. for (i = 0; i < count; i++) {
  209. unsigned l = snprintf(ap, component_len, "%f%s", dp[i], sep);
  210. if(l >= component_len) {
  211. av_free(ap0);
  212. return NULL;
  213. }
  214. ap += l;
  215. }
  216. ap0[strlen(ap0) - strlen(sep)] = '\0';
  217. return ap0;
  218. }
  219. static char *shorts2str(int16_t *sp, int count, const char *sep)
  220. {
  221. int i;
  222. char *ap, *ap0;
  223. uint64_t component_len;
  224. if (!sep) sep = ", ";
  225. component_len = 7LL + strlen(sep);
  226. if (count >= (INT_MAX - 1)/component_len)
  227. return NULL;
  228. ap = av_malloc(component_len * count + 1);
  229. if (!ap)
  230. return NULL;
  231. ap0 = ap;
  232. ap[0] = '\0';
  233. for (i = 0; i < count; i++) {
  234. unsigned l = snprintf(ap, component_len, "%d%s", sp[i], sep);
  235. if (l >= component_len) {
  236. av_free(ap0);
  237. return NULL;
  238. }
  239. ap += l;
  240. }
  241. ap0[strlen(ap0) - strlen(sep)] = '\0';
  242. return ap0;
  243. }
  244. static int add_doubles_metadata(int count,
  245. const char *name, const char *sep,
  246. TiffContext *s, AVFrame *frame)
  247. {
  248. char *ap;
  249. int i;
  250. double *dp;
  251. if (count >= INT_MAX / sizeof(int64_t) || count <= 0)
  252. return AVERROR_INVALIDDATA;
  253. if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t))
  254. return AVERROR_INVALIDDATA;
  255. dp = av_malloc(count * sizeof(double));
  256. if (!dp)
  257. return AVERROR(ENOMEM);
  258. for (i = 0; i < count; i++)
  259. dp[i] = tget_double(&s->gb, s->le);
  260. ap = doubles2str(dp, count, sep);
  261. av_freep(&dp);
  262. if (!ap)
  263. return AVERROR(ENOMEM);
  264. av_dict_set(avpriv_frame_get_metadatap(frame), name, ap, AV_DICT_DONT_STRDUP_VAL);
  265. return 0;
  266. }
  267. static int add_shorts_metadata(int count, const char *name,
  268. const char *sep, TiffContext *s, AVFrame *frame)
  269. {
  270. char *ap;
  271. int i;
  272. int16_t *sp;
  273. if (count >= INT_MAX / sizeof(int16_t) || count <= 0)
  274. return AVERROR_INVALIDDATA;
  275. if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int16_t))
  276. return AVERROR_INVALIDDATA;
  277. sp = av_malloc(count * sizeof(int16_t));
  278. if (!sp)
  279. return AVERROR(ENOMEM);
  280. for (i = 0; i < count; i++)
  281. sp[i] = tget_short(&s->gb, s->le);
  282. ap = shorts2str(sp, count, sep);
  283. av_freep(&sp);
  284. if (!ap)
  285. return AVERROR(ENOMEM);
  286. av_dict_set(avpriv_frame_get_metadatap(frame), name, ap, AV_DICT_DONT_STRDUP_VAL);
  287. return 0;
  288. }
  289. static int add_string_metadata(int count, const char *name,
  290. TiffContext *s, AVFrame *frame)
  291. {
  292. char *value;
  293. if (bytestream2_get_bytes_left(&s->gb) < count || count < 0)
  294. return AVERROR_INVALIDDATA;
  295. value = av_malloc(count + 1);
  296. if (!value)
  297. return AVERROR(ENOMEM);
  298. bytestream2_get_bufferu(&s->gb, value, count);
  299. value[count] = 0;
  300. av_dict_set(avpriv_frame_get_metadatap(frame), name, value, AV_DICT_DONT_STRDUP_VAL);
  301. return 0;
  302. }
  303. static int add_metadata(int count, int type,
  304. const char *name, const char *sep, TiffContext *s, AVFrame *frame)
  305. {
  306. switch(type) {
  307. case TIFF_DOUBLE: return add_doubles_metadata(count, name, sep, s, frame);
  308. case TIFF_SHORT : return add_shorts_metadata(count, name, sep, s, frame);
  309. case TIFF_STRING: return add_string_metadata(count, name, s, frame);
  310. default : return AVERROR_INVALIDDATA;
  311. };
  312. }
  313. #if CONFIG_ZLIB
  314. static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
  315. int size)
  316. {
  317. z_stream zstream = { 0 };
  318. int zret;
  319. zstream.next_in = (uint8_t *)src;
  320. zstream.avail_in = size;
  321. zstream.next_out = dst;
  322. zstream.avail_out = *len;
  323. zret = inflateInit(&zstream);
  324. if (zret != Z_OK) {
  325. av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
  326. return zret;
  327. }
  328. zret = inflate(&zstream, Z_SYNC_FLUSH);
  329. inflateEnd(&zstream);
  330. *len = zstream.total_out;
  331. return zret == Z_STREAM_END ? Z_OK : zret;
  332. }
  333. #endif
  334. static void av_always_inline horizontal_fill(unsigned int bpp, uint8_t* dst,
  335. int usePtr, const uint8_t *src,
  336. uint8_t c, int width, int offset)
  337. {
  338. switch (bpp) {
  339. case 1:
  340. while (--width >= 0) {
  341. dst[(width+offset)*8+7] = (usePtr ? src[width] : c) & 0x1;
  342. dst[(width+offset)*8+6] = (usePtr ? src[width] : c) >> 1 & 0x1;
  343. dst[(width+offset)*8+5] = (usePtr ? src[width] : c) >> 2 & 0x1;
  344. dst[(width+offset)*8+4] = (usePtr ? src[width] : c) >> 3 & 0x1;
  345. dst[(width+offset)*8+3] = (usePtr ? src[width] : c) >> 4 & 0x1;
  346. dst[(width+offset)*8+2] = (usePtr ? src[width] : c) >> 5 & 0x1;
  347. dst[(width+offset)*8+1] = (usePtr ? src[width] : c) >> 6 & 0x1;
  348. dst[(width+offset)*8+0] = (usePtr ? src[width] : c) >> 7;
  349. }
  350. break;
  351. case 2:
  352. while (--width >= 0) {
  353. dst[(width+offset)*4+3] = (usePtr ? src[width] : c) & 0x3;
  354. dst[(width+offset)*4+2] = (usePtr ? src[width] : c) >> 2 & 0x3;
  355. dst[(width+offset)*4+1] = (usePtr ? src[width] : c) >> 4 & 0x3;
  356. dst[(width+offset)*4+0] = (usePtr ? src[width] : c) >> 6;
  357. }
  358. break;
  359. case 4:
  360. while (--width >= 0) {
  361. dst[(width+offset)*2+1] = (usePtr ? src[width] : c) & 0xF;
  362. dst[(width+offset)*2+0] = (usePtr ? src[width] : c) >> 4;
  363. }
  364. break;
  365. default:
  366. if (usePtr) {
  367. memcpy(dst + offset, src, width);
  368. } else {
  369. memset(dst + offset, c, width);
  370. }
  371. }
  372. }
  373. static int deinvert_buffer(TiffContext *s, const uint8_t *src, int size)
  374. {
  375. int i;
  376. av_fast_padded_malloc(&s->deinvert_buf, &s->deinvert_buf_size, size);
  377. if (!s->deinvert_buf)
  378. return AVERROR(ENOMEM);
  379. for (i = 0; i < size; i++)
  380. s->deinvert_buf[i] = ff_reverse[src[i]];
  381. return 0;
  382. }
  383. static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
  384. const uint8_t *src, int size, int lines)
  385. {
  386. int c, line, pixels, code, ret;
  387. const uint8_t *ssrc = src;
  388. int width = ((s->width * s->bpp) + 7) >> 3;
  389. if (s->planar)
  390. width /= s->bppcount;
  391. if (size <= 0)
  392. return AVERROR_INVALIDDATA;
  393. #if CONFIG_ZLIB
  394. if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
  395. uint8_t *zbuf;
  396. unsigned long outlen;
  397. int ret;
  398. outlen = width * lines;
  399. zbuf = av_malloc(outlen);
  400. if (!zbuf)
  401. return AVERROR(ENOMEM);
  402. if (s->fill_order) {
  403. if ((ret = deinvert_buffer(s, src, size)) < 0)
  404. return ret;
  405. ssrc = src = s->deinvert_buf;
  406. }
  407. ret = tiff_uncompress(zbuf, &outlen, src, size);
  408. if (ret != Z_OK) {
  409. av_log(s->avctx, AV_LOG_ERROR,
  410. "Uncompressing failed (%lu of %lu) with error %d\n", outlen,
  411. (unsigned long)width * lines, ret);
  412. av_free(zbuf);
  413. return AVERROR_UNKNOWN;
  414. }
  415. src = zbuf;
  416. for (line = 0; line < lines; line++) {
  417. if(s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
  418. horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
  419. }else{
  420. memcpy(dst, src, width);
  421. }
  422. dst += stride;
  423. src += width;
  424. }
  425. av_free(zbuf);
  426. return 0;
  427. }
  428. #endif
  429. if (s->compr == TIFF_LZW) {
  430. if (s->fill_order) {
  431. if ((ret = deinvert_buffer(s, src, size)) < 0)
  432. return ret;
  433. ssrc = src = s->deinvert_buf;
  434. }
  435. if (size > 1 && !src[0] && (src[1]&1)) {
  436. av_log(s->avctx, AV_LOG_ERROR, "Old style LZW is unsupported\n");
  437. }
  438. if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) {
  439. av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n");
  440. return ret;
  441. }
  442. }
  443. if (s->compr == TIFF_CCITT_RLE ||
  444. s->compr == TIFF_G3 ||
  445. s->compr == TIFF_G4) {
  446. int i, ret = 0;
  447. uint8_t *src2 = av_malloc((unsigned)size +
  448. FF_INPUT_BUFFER_PADDING_SIZE);
  449. if (!src2) {
  450. av_log(s->avctx, AV_LOG_ERROR,
  451. "Error allocating temporary buffer\n");
  452. return AVERROR(ENOMEM);
  453. }
  454. if (s->fax_opts & 2) {
  455. av_log(s->avctx, AV_LOG_ERROR,
  456. "Uncompressed fax mode is not supported (yet)\n");
  457. av_free(src2);
  458. return AVERROR_INVALIDDATA;
  459. }
  460. if (!s->fill_order) {
  461. memcpy(src2, src, size);
  462. } else {
  463. for (i = 0; i < size; i++)
  464. src2[i] = ff_reverse[src[i]];
  465. }
  466. memset(src2 + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
  467. switch (s->compr) {
  468. case TIFF_CCITT_RLE:
  469. case TIFF_G3:
  470. case TIFF_G4:
  471. ret = ff_ccitt_unpack(s->avctx, src2, size, dst, lines, stride,
  472. s->compr, s->fax_opts);
  473. break;
  474. }
  475. if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
  476. for (line = 0; line < lines; line++) {
  477. horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
  478. dst += stride;
  479. }
  480. av_free(src2);
  481. return ret;
  482. }
  483. for (line = 0; line < lines; line++) {
  484. if (src - ssrc > size) {
  485. av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
  486. return AVERROR_INVALIDDATA;
  487. }
  488. switch (s->compr) {
  489. case TIFF_RAW:
  490. if (ssrc + size - src < width)
  491. return AVERROR_INVALIDDATA;
  492. if (!s->fill_order) {
  493. horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
  494. dst, 1, src, 0, width, 0);
  495. } else {
  496. int i;
  497. for (i = 0; i < width; i++)
  498. dst[i] = ff_reverse[src[i]];
  499. }
  500. src += width;
  501. break;
  502. case TIFF_PACKBITS:
  503. for (pixels = 0; pixels < width;) {
  504. if (ssrc + size - src < 2) {
  505. av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n");
  506. return AVERROR_INVALIDDATA;
  507. }
  508. code = s->fill_order ? (int8_t) ff_reverse[*src++]: (int8_t) *src++;
  509. if (code >= 0) {
  510. code++;
  511. if (pixels + code > width) {
  512. av_log(s->avctx, AV_LOG_ERROR,
  513. "Copy went out of bounds\n");
  514. return AVERROR_INVALIDDATA;
  515. }
  516. if (ssrc + size - src < code) {
  517. av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n");
  518. return AVERROR_INVALIDDATA;
  519. }
  520. horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
  521. dst, 1, src, 0, code, pixels);
  522. src += code;
  523. pixels += code;
  524. } else if (code != -128) { // -127..-1
  525. code = (-code) + 1;
  526. if (pixels + code > width) {
  527. av_log(s->avctx, AV_LOG_ERROR,
  528. "Run went out of bounds\n");
  529. return AVERROR_INVALIDDATA;
  530. }
  531. c = *src++;
  532. horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
  533. dst, 0, NULL, c, code, pixels);
  534. pixels += code;
  535. }
  536. }
  537. if (s->fill_order) {
  538. int i;
  539. for (i = 0; i < width; i++)
  540. dst[i] = ff_reverse[dst[i]];
  541. }
  542. break;
  543. case TIFF_LZW:
  544. pixels = ff_lzw_decode(s->lzw, dst, width);
  545. if (pixels < width) {
  546. av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n",
  547. pixels, width);
  548. return AVERROR_INVALIDDATA;
  549. }
  550. if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
  551. horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
  552. break;
  553. }
  554. dst += stride;
  555. }
  556. return 0;
  557. }
  558. static int init_image(TiffContext *s, AVFrame *frame)
  559. {
  560. int i, ret;
  561. uint32_t *pal;
  562. switch (s->bpp * 10 + s->bppcount) {
  563. case 11:
  564. if (!s->palette_is_set) {
  565. s->avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
  566. break;
  567. }
  568. case 21:
  569. case 41:
  570. case 81:
  571. s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
  572. break;
  573. case 243:
  574. s->avctx->pix_fmt = s->planar ? AV_PIX_FMT_GBRP : AV_PIX_FMT_RGB24;
  575. break;
  576. case 161:
  577. s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GRAY16LE : AV_PIX_FMT_GRAY16BE;
  578. break;
  579. case 162:
  580. s->avctx->pix_fmt = s->planar ? AV_PIX_FMT_NONE : AV_PIX_FMT_GRAY8A;
  581. break;
  582. case 324:
  583. s->avctx->pix_fmt = s->planar ? AV_PIX_FMT_GBRAP : AV_PIX_FMT_RGBA;
  584. break;
  585. case 483:
  586. s->avctx->pix_fmt = s->planar ? (s->le ? AV_PIX_FMT_GBRP16LE : AV_PIX_FMT_GBRP16BE) :
  587. (s->le ? AV_PIX_FMT_RGB48LE : AV_PIX_FMT_RGB48BE);
  588. break;
  589. case 644:
  590. s->avctx->pix_fmt = s->planar ? (s->le ? AV_PIX_FMT_GBRAP16LE : AV_PIX_FMT_GBRAP16BE) :
  591. (s->le ? AV_PIX_FMT_RGBA64LE : AV_PIX_FMT_RGBA64BE);
  592. break;
  593. default:
  594. av_log(s->avctx, AV_LOG_ERROR,
  595. "This format is not supported (bpp=%d, bppcount=%d)\n",
  596. s->bpp, s->bppcount);
  597. return AVERROR_INVALIDDATA;
  598. }
  599. if (s->width != s->avctx->width || s->height != s->avctx->height) {
  600. if ((ret = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
  601. return ret;
  602. avcodec_set_dimensions(s->avctx, s->width, s->height);
  603. }
  604. if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0)
  605. return ret;
  606. if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
  607. if (s->palette_is_set) {
  608. memcpy(frame->data[1], s->palette, sizeof(s->palette));
  609. } else {
  610. /* make default grayscale pal */
  611. pal = (uint32_t *) frame->data[1];
  612. for (i = 0; i < 1<<s->bpp; i++)
  613. pal[i] = 0xFFU << 24 | i * 255 / ((1<<s->bpp) - 1) * 0x010101;
  614. }
  615. }
  616. return 0;
  617. }
  618. static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
  619. {
  620. unsigned tag, type, count, off, value = 0;
  621. int i, j, k, pos, start;
  622. int ret;
  623. uint32_t *pal;
  624. double *dp;
  625. tag = tget_short(&s->gb, s->le);
  626. type = tget_short(&s->gb, s->le);
  627. count = tget_long(&s->gb, s->le);
  628. off = tget_long(&s->gb, s->le);
  629. start = bytestream2_tell(&s->gb);
  630. if (type == 0 || type >= FF_ARRAY_ELEMS(type_sizes)) {
  631. av_log(s->avctx, AV_LOG_DEBUG, "Unknown tiff type (%u) encountered\n",
  632. type);
  633. return 0;
  634. }
  635. if (count == 1) {
  636. switch (type) {
  637. case TIFF_BYTE:
  638. case TIFF_SHORT:
  639. bytestream2_seek(&s->gb, -4, SEEK_CUR);
  640. value = tget(&s->gb, type, s->le);
  641. break;
  642. case TIFF_LONG:
  643. value = off;
  644. break;
  645. case TIFF_STRING:
  646. if (count <= 4) {
  647. bytestream2_seek(&s->gb, -4, SEEK_CUR);
  648. break;
  649. }
  650. default:
  651. value = UINT_MAX;
  652. bytestream2_seek(&s->gb, off, SEEK_SET);
  653. }
  654. } else {
  655. if (count <= 4 && type_sizes[type] * count <= 4)
  656. bytestream2_seek(&s->gb, -4, SEEK_CUR);
  657. else
  658. bytestream2_seek(&s->gb, off, SEEK_SET);
  659. }
  660. switch (tag) {
  661. case TIFF_WIDTH:
  662. s->width = value;
  663. break;
  664. case TIFF_HEIGHT:
  665. s->height = value;
  666. break;
  667. case TIFF_BPP:
  668. s->bppcount = count;
  669. if (count > 4) {
  670. av_log(s->avctx, AV_LOG_ERROR,
  671. "This format is not supported (bpp=%d, %d components)\n",
  672. s->bpp, count);
  673. return AVERROR_INVALIDDATA;
  674. }
  675. if (count == 1)
  676. s->bpp = value;
  677. else {
  678. switch (type) {
  679. case TIFF_BYTE:
  680. s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) +
  681. ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
  682. break;
  683. case TIFF_SHORT:
  684. case TIFF_LONG:
  685. s->bpp = 0;
  686. if (bytestream2_get_bytes_left(&s->gb) < type_sizes[type] * count)
  687. return AVERROR_INVALIDDATA;
  688. for (i = 0; i < count; i++)
  689. s->bpp += tget(&s->gb, type, s->le);
  690. break;
  691. default:
  692. s->bpp = -1;
  693. }
  694. }
  695. break;
  696. case TIFF_SAMPLES_PER_PIXEL:
  697. if (count != 1) {
  698. av_log(s->avctx, AV_LOG_ERROR,
  699. "Samples per pixel requires a single value, many provided\n");
  700. return AVERROR_INVALIDDATA;
  701. }
  702. if (value > 4U) {
  703. av_log(s->avctx, AV_LOG_ERROR,
  704. "Samples per pixel %d is too large\n", value);
  705. return AVERROR_INVALIDDATA;
  706. }
  707. if (s->bppcount == 1)
  708. s->bpp *= value;
  709. s->bppcount = value;
  710. break;
  711. case TIFF_COMPR:
  712. s->compr = value;
  713. s->predictor = 0;
  714. switch (s->compr) {
  715. case TIFF_RAW:
  716. case TIFF_PACKBITS:
  717. case TIFF_LZW:
  718. case TIFF_CCITT_RLE:
  719. break;
  720. case TIFF_G3:
  721. case TIFF_G4:
  722. s->fax_opts = 0;
  723. break;
  724. case TIFF_DEFLATE:
  725. case TIFF_ADOBE_DEFLATE:
  726. #if CONFIG_ZLIB
  727. break;
  728. #else
  729. av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");
  730. return AVERROR(ENOSYS);
  731. #endif
  732. case TIFF_JPEG:
  733. case TIFF_NEWJPEG:
  734. av_log(s->avctx, AV_LOG_ERROR,
  735. "JPEG compression is not supported\n");
  736. return AVERROR_PATCHWELCOME;
  737. default:
  738. av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n",
  739. s->compr);
  740. return AVERROR_INVALIDDATA;
  741. }
  742. break;
  743. case TIFF_ROWSPERSTRIP:
  744. if (type == TIFF_LONG && value == UINT_MAX)
  745. value = s->height;
  746. if (value < 1) {
  747. av_log(s->avctx, AV_LOG_ERROR,
  748. "Incorrect value of rows per strip\n");
  749. return AVERROR_INVALIDDATA;
  750. }
  751. s->rps = value;
  752. break;
  753. case TIFF_STRIP_OFFS:
  754. if (count == 1) {
  755. s->strippos = 0;
  756. s->stripoff = value;
  757. } else
  758. s->strippos = off;
  759. s->strips = count;
  760. if (s->strips == 1)
  761. s->rps = s->height;
  762. s->sot = type;
  763. if (s->strippos > bytestream2_size(&s->gb)) {
  764. av_log(s->avctx, AV_LOG_ERROR,
  765. "Tag referencing position outside the image\n");
  766. return AVERROR_INVALIDDATA;
  767. }
  768. break;
  769. case TIFF_STRIP_SIZE:
  770. if (count == 1) {
  771. s->stripsizesoff = 0;
  772. s->stripsize = value;
  773. s->strips = 1;
  774. } else {
  775. s->stripsizesoff = off;
  776. }
  777. s->strips = count;
  778. s->sstype = type;
  779. if (s->stripsizesoff > bytestream2_size(&s->gb)) {
  780. av_log(s->avctx, AV_LOG_ERROR,
  781. "Tag referencing position outside the image\n");
  782. return AVERROR_INVALIDDATA;
  783. }
  784. break;
  785. case TIFF_TILE_BYTE_COUNTS:
  786. case TIFF_TILE_LENGTH:
  787. case TIFF_TILE_OFFSETS:
  788. case TIFF_TILE_WIDTH:
  789. av_log(s->avctx, AV_LOG_ERROR, "Tiled images are not supported\n");
  790. return AVERROR_PATCHWELCOME;
  791. break;
  792. case TIFF_PREDICTOR:
  793. s->predictor = value;
  794. break;
  795. case TIFF_INVERT:
  796. switch (value) {
  797. case 0:
  798. s->invert = 1;
  799. break;
  800. case 1:
  801. s->invert = 0;
  802. break;
  803. case 2:
  804. case 3:
  805. break;
  806. default:
  807. av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n",
  808. value);
  809. return AVERROR_INVALIDDATA;
  810. }
  811. break;
  812. case TIFF_FILL_ORDER:
  813. if (value < 1 || value > 2) {
  814. av_log(s->avctx, AV_LOG_ERROR,
  815. "Unknown FillOrder value %d, trying default one\n", value);
  816. value = 1;
  817. }
  818. s->fill_order = value - 1;
  819. break;
  820. case TIFF_PAL:
  821. pal = (uint32_t *) s->palette;
  822. off = type_sizes[type];
  823. if (count / 3 > 256 || bytestream2_get_bytes_left(&s->gb) < count / 3 * off * 3)
  824. return AVERROR_INVALIDDATA;
  825. off = (type_sizes[type] - 1) << 3;
  826. for (k = 2; k >= 0; k--) {
  827. for (i = 0; i < count / 3; i++) {
  828. if (k == 2)
  829. pal[i] = 0xFFU << 24;
  830. j = (tget(&s->gb, type, s->le) >> off) << (k * 8);
  831. pal[i] |= j;
  832. }
  833. }
  834. s->palette_is_set = 1;
  835. break;
  836. case TIFF_PLANAR:
  837. s->planar = value == 2;
  838. break;
  839. case TIFF_T4OPTIONS:
  840. if (s->compr == TIFF_G3)
  841. s->fax_opts = value;
  842. break;
  843. case TIFF_T6OPTIONS:
  844. if (s->compr == TIFF_G4)
  845. s->fax_opts = value;
  846. break;
  847. #define ADD_METADATA(count, name, sep)\
  848. if ((ret = add_metadata(count, type, name, sep, s, frame)) < 0) {\
  849. av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");\
  850. return ret;\
  851. }
  852. case TIFF_MODEL_PIXEL_SCALE:
  853. ADD_METADATA(count, "ModelPixelScaleTag", NULL);
  854. break;
  855. case TIFF_MODEL_TRANSFORMATION:
  856. ADD_METADATA(count, "ModelTransformationTag", NULL);
  857. break;
  858. case TIFF_MODEL_TIEPOINT:
  859. ADD_METADATA(count, "ModelTiepointTag", NULL);
  860. break;
  861. case TIFF_GEO_KEY_DIRECTORY:
  862. ADD_METADATA(1, "GeoTIFF_Version", NULL);
  863. ADD_METADATA(2, "GeoTIFF_Key_Revision", ".");
  864. s->geotag_count = tget_short(&s->gb, s->le);
  865. if (s->geotag_count > count / 4 - 1) {
  866. s->geotag_count = count / 4 - 1;
  867. av_log(s->avctx, AV_LOG_WARNING, "GeoTIFF key directory buffer shorter than specified\n");
  868. }
  869. if (bytestream2_get_bytes_left(&s->gb) < s->geotag_count * sizeof(int16_t) * 4) {
  870. s->geotag_count = 0;
  871. return -1;
  872. }
  873. s->geotags = av_mallocz(sizeof(TiffGeoTag) * s->geotag_count);
  874. if (!s->geotags) {
  875. av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  876. s->geotag_count = 0;
  877. return AVERROR(ENOMEM);
  878. }
  879. for (i = 0; i < s->geotag_count; i++) {
  880. s->geotags[i].key = tget_short(&s->gb, s->le);
  881. s->geotags[i].type = tget_short(&s->gb, s->le);
  882. s->geotags[i].count = tget_short(&s->gb, s->le);
  883. if (!s->geotags[i].type)
  884. s->geotags[i].val = get_geokey_val(s->geotags[i].key, tget_short(&s->gb, s->le));
  885. else
  886. s->geotags[i].offset = tget_short(&s->gb, s->le);
  887. }
  888. break;
  889. case TIFF_GEO_DOUBLE_PARAMS:
  890. if (count >= INT_MAX / sizeof(int64_t))
  891. return AVERROR_INVALIDDATA;
  892. if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t))
  893. return AVERROR_INVALIDDATA;
  894. dp = av_malloc(count * sizeof(double));
  895. if (!dp) {
  896. av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  897. return AVERROR(ENOMEM);
  898. }
  899. for (i = 0; i < count; i++)
  900. dp[i] = tget_double(&s->gb, s->le);
  901. for (i = 0; i < s->geotag_count; i++) {
  902. if (s->geotags[i].type == TIFF_GEO_DOUBLE_PARAMS) {
  903. if (s->geotags[i].count == 0
  904. || s->geotags[i].offset + s->geotags[i].count > count) {
  905. av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
  906. } else {
  907. char *ap = doubles2str(&dp[s->geotags[i].offset], s->geotags[i].count, ", ");
  908. if (!ap) {
  909. av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  910. av_freep(&dp);
  911. return AVERROR(ENOMEM);
  912. }
  913. s->geotags[i].val = ap;
  914. }
  915. }
  916. }
  917. av_freep(&dp);
  918. break;
  919. case TIFF_GEO_ASCII_PARAMS:
  920. pos = bytestream2_tell(&s->gb);
  921. for (i = 0; i < s->geotag_count; i++) {
  922. if (s->geotags[i].type == TIFF_GEO_ASCII_PARAMS) {
  923. if (s->geotags[i].count == 0
  924. || s->geotags[i].offset + s->geotags[i].count > count) {
  925. av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key);
  926. } else {
  927. char *ap;
  928. bytestream2_seek(&s->gb, pos + s->geotags[i].offset, SEEK_SET);
  929. if (bytestream2_get_bytes_left(&s->gb) < s->geotags[i].count)
  930. return AVERROR_INVALIDDATA;
  931. ap = av_malloc(s->geotags[i].count);
  932. if (!ap) {
  933. av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");
  934. return AVERROR(ENOMEM);
  935. }
  936. bytestream2_get_bufferu(&s->gb, ap, s->geotags[i].count);
  937. ap[s->geotags[i].count - 1] = '\0'; //replace the "|" delimiter with a 0 byte
  938. s->geotags[i].val = ap;
  939. }
  940. }
  941. }
  942. break;
  943. case TIFF_ARTIST:
  944. ADD_METADATA(count, "artist", NULL);
  945. break;
  946. case TIFF_COPYRIGHT:
  947. ADD_METADATA(count, "copyright", NULL);
  948. break;
  949. case TIFF_DATE:
  950. ADD_METADATA(count, "date", NULL);
  951. break;
  952. case TIFF_DOCUMENT_NAME:
  953. ADD_METADATA(count, "document_name", NULL);
  954. break;
  955. case TIFF_HOST_COMPUTER:
  956. ADD_METADATA(count, "computer", NULL);
  957. break;
  958. case TIFF_IMAGE_DESCRIPTION:
  959. ADD_METADATA(count, "description", NULL);
  960. break;
  961. case TIFF_MAKE:
  962. ADD_METADATA(count, "make", NULL);
  963. break;
  964. case TIFF_MODEL:
  965. ADD_METADATA(count, "model", NULL);
  966. break;
  967. case TIFF_PAGE_NAME:
  968. ADD_METADATA(count, "page_name", NULL);
  969. break;
  970. case TIFF_PAGE_NUMBER:
  971. ADD_METADATA(count, "page_number", " / ");
  972. break;
  973. case TIFF_SOFTWARE_NAME:
  974. ADD_METADATA(count, "software", NULL);
  975. break;
  976. default:
  977. av_log(s->avctx, AV_LOG_DEBUG, "Unknown or unsupported tag %d/0X%0X\n",
  978. tag, tag);
  979. }
  980. bytestream2_seek(&s->gb, start, SEEK_SET);
  981. return 0;
  982. }
  983. static int decode_frame(AVCodecContext *avctx,
  984. void *data, int *got_frame, AVPacket *avpkt)
  985. {
  986. TiffContext *const s = avctx->priv_data;
  987. AVFrame *const p = data;
  988. unsigned off;
  989. int id, le, ret, plane, planes;
  990. int i, j, entries, stride;
  991. unsigned soff, ssize;
  992. uint8_t *dst;
  993. GetByteContext stripsizes;
  994. GetByteContext stripdata;
  995. bytestream2_init(&s->gb, avpkt->data, avpkt->size);
  996. // parse image header
  997. if (avpkt->size < 8)
  998. return AVERROR_INVALIDDATA;
  999. id = bytestream2_get_le16u(&s->gb);
  1000. if (id == 0x4949)
  1001. le = 1;
  1002. else if (id == 0x4D4D)
  1003. le = 0;
  1004. else {
  1005. av_log(avctx, AV_LOG_ERROR, "TIFF header not found\n");
  1006. return AVERROR_INVALIDDATA;
  1007. }
  1008. s->le = le;
  1009. // TIFF_BPP is not a required tag and defaults to 1
  1010. s->bppcount = s->bpp = 1;
  1011. s->invert = 0;
  1012. s->compr = TIFF_RAW;
  1013. s->fill_order = 0;
  1014. free_geotags(s);
  1015. // As TIFF 6.0 specification puts it "An arbitrary but carefully chosen number
  1016. // that further identifies the file as a TIFF file"
  1017. if (tget_short(&s->gb, le) != 42) {
  1018. av_log(avctx, AV_LOG_ERROR,
  1019. "The answer to life, universe and everything is not correct!\n");
  1020. return AVERROR_INVALIDDATA;
  1021. }
  1022. // Reset these offsets so we can tell if they were set this frame
  1023. s->stripsizesoff = s->strippos = 0;
  1024. /* parse image file directory */
  1025. off = tget_long(&s->gb, le);
  1026. if (off >= UINT_MAX - 14 || avpkt->size < off + 14) {
  1027. av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
  1028. return AVERROR_INVALIDDATA;
  1029. }
  1030. bytestream2_seek(&s->gb, off, SEEK_SET);
  1031. entries = tget_short(&s->gb, le);
  1032. if (bytestream2_get_bytes_left(&s->gb) < entries * 12)
  1033. return AVERROR_INVALIDDATA;
  1034. for (i = 0; i < entries; i++) {
  1035. if ((ret = tiff_decode_tag(s, p)) < 0)
  1036. return ret;
  1037. }
  1038. for (i = 0; i<s->geotag_count; i++) {
  1039. const char *keyname = get_geokey_name(s->geotags[i].key);
  1040. if (!keyname) {
  1041. av_log(avctx, AV_LOG_WARNING, "Unknown or unsupported GeoTIFF key %d\n", s->geotags[i].key);
  1042. continue;
  1043. }
  1044. if (get_geokey_type(s->geotags[i].key) != s->geotags[i].type) {
  1045. av_log(avctx, AV_LOG_WARNING, "Type of GeoTIFF key %d is wrong\n", s->geotags[i].key);
  1046. continue;
  1047. }
  1048. ret = av_dict_set(avpriv_frame_get_metadatap(p), keyname, s->geotags[i].val, 0);
  1049. if (ret<0) {
  1050. av_log(avctx, AV_LOG_ERROR, "Writing metadata with key '%s' failed\n", keyname);
  1051. return ret;
  1052. }
  1053. }
  1054. if (!s->strippos && !s->stripoff) {
  1055. av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
  1056. return AVERROR_INVALIDDATA;
  1057. }
  1058. /* now we have the data and may start decoding */
  1059. if ((ret = init_image(s, p)) < 0)
  1060. return ret;
  1061. if (s->strips == 1 && !s->stripsize) {
  1062. av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
  1063. s->stripsize = avpkt->size - s->stripoff;
  1064. }
  1065. if (s->stripsizesoff) {
  1066. if (s->stripsizesoff >= (unsigned)avpkt->size)
  1067. return AVERROR_INVALIDDATA;
  1068. bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff, avpkt->size - s->stripsizesoff);
  1069. }
  1070. if (s->strippos) {
  1071. if (s->strippos >= (unsigned)avpkt->size)
  1072. return AVERROR_INVALIDDATA;
  1073. bytestream2_init(&stripdata, avpkt->data + s->strippos, avpkt->size - s->strippos);
  1074. }
  1075. if (s->rps <= 0) {
  1076. av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps);
  1077. return AVERROR_INVALIDDATA;
  1078. }
  1079. planes = s->planar ? s->bppcount : 1;
  1080. for (plane = 0; plane < planes; plane++) {
  1081. stride = p->linesize[plane];
  1082. dst = p->data[plane];
  1083. for (i = 0; i < s->height; i += s->rps) {
  1084. if (s->stripsizesoff)
  1085. ssize = tget(&stripsizes, s->sstype, s->le);
  1086. else
  1087. ssize = s->stripsize;
  1088. if (s->strippos)
  1089. soff = tget(&stripdata, s->sot, s->le);
  1090. else
  1091. soff = s->stripoff;
  1092. if (soff > avpkt->size || ssize > avpkt->size - soff) {
  1093. av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
  1094. return AVERROR_INVALIDDATA;
  1095. }
  1096. if (tiff_unpack_strip(s, dst, stride, avpkt->data + soff, ssize,
  1097. FFMIN(s->rps, s->height - i)) < 0)
  1098. break;
  1099. dst += s->rps * stride;
  1100. }
  1101. if (s->predictor == 2) {
  1102. dst = p->data[plane];
  1103. soff = s->bpp >> 3;
  1104. ssize = s->width * soff;
  1105. if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48LE ||
  1106. s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE) {
  1107. for (i = 0; i < s->height; i++) {
  1108. for (j = soff; j < ssize; j += 2)
  1109. AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff));
  1110. dst += stride;
  1111. }
  1112. } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
  1113. s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE) {
  1114. for (i = 0; i < s->height; i++) {
  1115. for (j = soff; j < ssize; j += 2)
  1116. AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff));
  1117. dst += stride;
  1118. }
  1119. } else {
  1120. for (i = 0; i < s->height; i++) {
  1121. for (j = soff; j < ssize; j++)
  1122. dst[j] += dst[j - soff];
  1123. dst += stride;
  1124. }
  1125. }
  1126. }
  1127. if (s->invert) {
  1128. dst = p->data[plane];
  1129. for (i = 0; i < s->height; i++) {
  1130. for (j = 0; j < p->linesize[plane]; j++)
  1131. dst[j] = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<<s->bpp) - 1 : 255) - dst[j];
  1132. dst += p->linesize[plane];
  1133. }
  1134. }
  1135. }
  1136. if (s->planar && s->bppcount > 2) {
  1137. FFSWAP(uint8_t*, p->data[0], p->data[2]);
  1138. FFSWAP(int, p->linesize[0], p->linesize[2]);
  1139. FFSWAP(uint8_t*, p->data[0], p->data[1]);
  1140. FFSWAP(int, p->linesize[0], p->linesize[1]);
  1141. }
  1142. *got_frame = 1;
  1143. return avpkt->size;
  1144. }
  1145. static av_cold int tiff_init(AVCodecContext *avctx)
  1146. {
  1147. TiffContext *s = avctx->priv_data;
  1148. s->width = 0;
  1149. s->height = 0;
  1150. s->avctx = avctx;
  1151. ff_lzw_decode_open(&s->lzw);
  1152. ff_ccitt_unpack_init();
  1153. return 0;
  1154. }
  1155. static av_cold int tiff_end(AVCodecContext *avctx)
  1156. {
  1157. TiffContext *const s = avctx->priv_data;
  1158. free_geotags(s);
  1159. ff_lzw_decode_close(&s->lzw);
  1160. av_freep(&s->deinvert_buf);
  1161. return 0;
  1162. }
  1163. AVCodec ff_tiff_decoder = {
  1164. .name = "tiff",
  1165. .long_name = NULL_IF_CONFIG_SMALL("TIFF image"),
  1166. .type = AVMEDIA_TYPE_VIDEO,
  1167. .id = AV_CODEC_ID_TIFF,
  1168. .priv_data_size = sizeof(TiffContext),
  1169. .init = tiff_init,
  1170. .close = tiff_end,
  1171. .decode = decode_frame,
  1172. .capabilities = CODEC_CAP_DR1,
  1173. };