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.

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