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.

1182 lines
37KB

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