1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2006 Konstantin Shishkov 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci/** 22cabdff1aSopenharmony_ci * @file 23cabdff1aSopenharmony_ci * TIFF image decoder 24cabdff1aSopenharmony_ci * @author Konstantin Shishkov 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "config.h" 28cabdff1aSopenharmony_ci#if CONFIG_ZLIB 29cabdff1aSopenharmony_ci#include <zlib.h> 30cabdff1aSopenharmony_ci#endif 31cabdff1aSopenharmony_ci#if CONFIG_LZMA 32cabdff1aSopenharmony_ci#define LZMA_API_STATIC 33cabdff1aSopenharmony_ci#include <lzma.h> 34cabdff1aSopenharmony_ci#endif 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 37cabdff1aSopenharmony_ci#include "libavutil/avstring.h" 38cabdff1aSopenharmony_ci#include "libavutil/error.h" 39cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 40cabdff1aSopenharmony_ci#include "libavutil/imgutils.h" 41cabdff1aSopenharmony_ci#include "libavutil/opt.h" 42cabdff1aSopenharmony_ci#include "libavutil/reverse.h" 43cabdff1aSopenharmony_ci#include "avcodec.h" 44cabdff1aSopenharmony_ci#include "bytestream.h" 45cabdff1aSopenharmony_ci#include "codec_internal.h" 46cabdff1aSopenharmony_ci#include "faxcompr.h" 47cabdff1aSopenharmony_ci#include "internal.h" 48cabdff1aSopenharmony_ci#include "lzw.h" 49cabdff1aSopenharmony_ci#include "mathops.h" 50cabdff1aSopenharmony_ci#include "tiff.h" 51cabdff1aSopenharmony_ci#include "tiff_data.h" 52cabdff1aSopenharmony_ci#include "mjpegdec.h" 53cabdff1aSopenharmony_ci#include "thread.h" 54cabdff1aSopenharmony_ci#include "get_bits.h" 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_citypedef struct TiffContext { 57cabdff1aSopenharmony_ci AVClass *class; 58cabdff1aSopenharmony_ci AVCodecContext *avctx; 59cabdff1aSopenharmony_ci GetByteContext gb; 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci /* JPEG decoding for DNG */ 62cabdff1aSopenharmony_ci AVCodecContext *avctx_mjpeg; // wrapper context for MJPEG 63cabdff1aSopenharmony_ci AVPacket *jpkt; // encoded JPEG tile 64cabdff1aSopenharmony_ci AVFrame *jpgframe; // decoded JPEG tile 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci int get_subimage; 67cabdff1aSopenharmony_ci uint16_t get_page; 68cabdff1aSopenharmony_ci int get_thumbnail; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci enum TiffType tiff_type; 71cabdff1aSopenharmony_ci int width, height; 72cabdff1aSopenharmony_ci unsigned int bpp, bppcount; 73cabdff1aSopenharmony_ci uint32_t palette[256]; 74cabdff1aSopenharmony_ci int palette_is_set; 75cabdff1aSopenharmony_ci int le; 76cabdff1aSopenharmony_ci enum TiffCompr compr; 77cabdff1aSopenharmony_ci enum TiffPhotometric photometric; 78cabdff1aSopenharmony_ci int planar; 79cabdff1aSopenharmony_ci int subsampling[2]; 80cabdff1aSopenharmony_ci int fax_opts; 81cabdff1aSopenharmony_ci int predictor; 82cabdff1aSopenharmony_ci int fill_order; 83cabdff1aSopenharmony_ci uint32_t res[4]; 84cabdff1aSopenharmony_ci int is_thumbnail; 85cabdff1aSopenharmony_ci unsigned last_tag; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci int is_bayer; 88cabdff1aSopenharmony_ci uint8_t pattern[4]; 89cabdff1aSopenharmony_ci unsigned black_level; 90cabdff1aSopenharmony_ci unsigned white_level; 91cabdff1aSopenharmony_ci uint16_t dng_lut[65536]; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci uint32_t sub_ifd; 94cabdff1aSopenharmony_ci uint16_t cur_page; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci int strips, rps, sstype; 97cabdff1aSopenharmony_ci int sot; 98cabdff1aSopenharmony_ci int stripsizesoff, stripsize, stripoff, strippos; 99cabdff1aSopenharmony_ci LZWState *lzw; 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci /* Tile support */ 102cabdff1aSopenharmony_ci int is_tiled; 103cabdff1aSopenharmony_ci int tile_byte_counts_offset, tile_offsets_offset; 104cabdff1aSopenharmony_ci int tile_width, tile_length; 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci int is_jpeg; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci uint8_t *deinvert_buf; 109cabdff1aSopenharmony_ci int deinvert_buf_size; 110cabdff1aSopenharmony_ci uint8_t *yuv_line; 111cabdff1aSopenharmony_ci unsigned int yuv_line_size; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci int geotag_count; 114cabdff1aSopenharmony_ci TiffGeoTag *geotags; 115cabdff1aSopenharmony_ci} TiffContext; 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_cistatic void tiff_set_type(TiffContext *s, enum TiffType tiff_type) { 118cabdff1aSopenharmony_ci if (s->tiff_type < tiff_type) // Prioritize higher-valued entries 119cabdff1aSopenharmony_ci s->tiff_type = tiff_type; 120cabdff1aSopenharmony_ci} 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_cistatic void free_geotags(TiffContext *const s) 123cabdff1aSopenharmony_ci{ 124cabdff1aSopenharmony_ci int i; 125cabdff1aSopenharmony_ci for (i = 0; i < s->geotag_count; i++) { 126cabdff1aSopenharmony_ci if (s->geotags[i].val) 127cabdff1aSopenharmony_ci av_freep(&s->geotags[i].val); 128cabdff1aSopenharmony_ci } 129cabdff1aSopenharmony_ci av_freep(&s->geotags); 130cabdff1aSopenharmony_ci s->geotag_count = 0; 131cabdff1aSopenharmony_ci} 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci#define RET_GEOKEY(TYPE, array, element)\ 134cabdff1aSopenharmony_ci if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\ 135cabdff1aSopenharmony_ci key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(tiff_##array##_name_type_map))\ 136cabdff1aSopenharmony_ci return tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].element; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_cistatic const char *get_geokey_name(int key) 139cabdff1aSopenharmony_ci{ 140cabdff1aSopenharmony_ci RET_GEOKEY(VERT, vert, name); 141cabdff1aSopenharmony_ci RET_GEOKEY(PROJ, proj, name); 142cabdff1aSopenharmony_ci RET_GEOKEY(GEOG, geog, name); 143cabdff1aSopenharmony_ci RET_GEOKEY(CONF, conf, name); 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci return NULL; 146cabdff1aSopenharmony_ci} 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_cistatic int get_geokey_type(int key) 149cabdff1aSopenharmony_ci{ 150cabdff1aSopenharmony_ci RET_GEOKEY(VERT, vert, type); 151cabdff1aSopenharmony_ci RET_GEOKEY(PROJ, proj, type); 152cabdff1aSopenharmony_ci RET_GEOKEY(GEOG, geog, type); 153cabdff1aSopenharmony_ci RET_GEOKEY(CONF, conf, type); 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 156cabdff1aSopenharmony_ci} 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_cistatic int cmp_id_key(const void *id, const void *k) 159cabdff1aSopenharmony_ci{ 160cabdff1aSopenharmony_ci return *(const int*)id - ((const TiffGeoTagKeyName*)k)->key; 161cabdff1aSopenharmony_ci} 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_cistatic const char *search_keyval(const TiffGeoTagKeyName *keys, int n, int id) 164cabdff1aSopenharmony_ci{ 165cabdff1aSopenharmony_ci TiffGeoTagKeyName *r = bsearch(&id, keys, n, sizeof(keys[0]), cmp_id_key); 166cabdff1aSopenharmony_ci if(r) 167cabdff1aSopenharmony_ci return r->name; 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci return NULL; 170cabdff1aSopenharmony_ci} 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_cistatic char *get_geokey_val(int key, int val) 173cabdff1aSopenharmony_ci{ 174cabdff1aSopenharmony_ci char *ap; 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci if (val == TIFF_GEO_KEY_UNDEFINED) 177cabdff1aSopenharmony_ci return av_strdup("undefined"); 178cabdff1aSopenharmony_ci if (val == TIFF_GEO_KEY_USER_DEFINED) 179cabdff1aSopenharmony_ci return av_strdup("User-Defined"); 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci#define RET_GEOKEY_VAL(TYPE, array)\ 182cabdff1aSopenharmony_ci if (val >= TIFF_##TYPE##_OFFSET &&\ 183cabdff1aSopenharmony_ci val - TIFF_##TYPE##_OFFSET < FF_ARRAY_ELEMS(tiff_##array##_codes))\ 184cabdff1aSopenharmony_ci return av_strdup(tiff_##array##_codes[val - TIFF_##TYPE##_OFFSET]); 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci switch (key) { 187cabdff1aSopenharmony_ci case TIFF_GT_MODEL_TYPE_GEOKEY: 188cabdff1aSopenharmony_ci RET_GEOKEY_VAL(GT_MODEL_TYPE, gt_model_type); 189cabdff1aSopenharmony_ci break; 190cabdff1aSopenharmony_ci case TIFF_GT_RASTER_TYPE_GEOKEY: 191cabdff1aSopenharmony_ci RET_GEOKEY_VAL(GT_RASTER_TYPE, gt_raster_type); 192cabdff1aSopenharmony_ci break; 193cabdff1aSopenharmony_ci case TIFF_GEOG_LINEAR_UNITS_GEOKEY: 194cabdff1aSopenharmony_ci case TIFF_PROJ_LINEAR_UNITS_GEOKEY: 195cabdff1aSopenharmony_ci case TIFF_VERTICAL_UNITS_GEOKEY: 196cabdff1aSopenharmony_ci RET_GEOKEY_VAL(LINEAR_UNIT, linear_unit); 197cabdff1aSopenharmony_ci break; 198cabdff1aSopenharmony_ci case TIFF_GEOG_ANGULAR_UNITS_GEOKEY: 199cabdff1aSopenharmony_ci case TIFF_GEOG_AZIMUTH_UNITS_GEOKEY: 200cabdff1aSopenharmony_ci RET_GEOKEY_VAL(ANGULAR_UNIT, angular_unit); 201cabdff1aSopenharmony_ci break; 202cabdff1aSopenharmony_ci case TIFF_GEOGRAPHIC_TYPE_GEOKEY: 203cabdff1aSopenharmony_ci RET_GEOKEY_VAL(GCS_TYPE, gcs_type); 204cabdff1aSopenharmony_ci RET_GEOKEY_VAL(GCSE_TYPE, gcse_type); 205cabdff1aSopenharmony_ci break; 206cabdff1aSopenharmony_ci case TIFF_GEOG_GEODETIC_DATUM_GEOKEY: 207cabdff1aSopenharmony_ci RET_GEOKEY_VAL(GEODETIC_DATUM, geodetic_datum); 208cabdff1aSopenharmony_ci RET_GEOKEY_VAL(GEODETIC_DATUM_E, geodetic_datum_e); 209cabdff1aSopenharmony_ci break; 210cabdff1aSopenharmony_ci case TIFF_GEOG_ELLIPSOID_GEOKEY: 211cabdff1aSopenharmony_ci RET_GEOKEY_VAL(ELLIPSOID, ellipsoid); 212cabdff1aSopenharmony_ci break; 213cabdff1aSopenharmony_ci case TIFF_GEOG_PRIME_MERIDIAN_GEOKEY: 214cabdff1aSopenharmony_ci RET_GEOKEY_VAL(PRIME_MERIDIAN, prime_meridian); 215cabdff1aSopenharmony_ci break; 216cabdff1aSopenharmony_ci case TIFF_PROJECTED_CS_TYPE_GEOKEY: 217cabdff1aSopenharmony_ci ap = av_strdup(search_keyval(tiff_proj_cs_type_codes, FF_ARRAY_ELEMS(tiff_proj_cs_type_codes), val)); 218cabdff1aSopenharmony_ci if(ap) return ap; 219cabdff1aSopenharmony_ci break; 220cabdff1aSopenharmony_ci case TIFF_PROJECTION_GEOKEY: 221cabdff1aSopenharmony_ci ap = av_strdup(search_keyval(tiff_projection_codes, FF_ARRAY_ELEMS(tiff_projection_codes), val)); 222cabdff1aSopenharmony_ci if(ap) return ap; 223cabdff1aSopenharmony_ci break; 224cabdff1aSopenharmony_ci case TIFF_PROJ_COORD_TRANS_GEOKEY: 225cabdff1aSopenharmony_ci RET_GEOKEY_VAL(COORD_TRANS, coord_trans); 226cabdff1aSopenharmony_ci break; 227cabdff1aSopenharmony_ci case TIFF_VERTICAL_CS_TYPE_GEOKEY: 228cabdff1aSopenharmony_ci RET_GEOKEY_VAL(VERT_CS, vert_cs); 229cabdff1aSopenharmony_ci RET_GEOKEY_VAL(ORTHO_VERT_CS, ortho_vert_cs); 230cabdff1aSopenharmony_ci break; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci ap = av_malloc(14); 235cabdff1aSopenharmony_ci if (ap) 236cabdff1aSopenharmony_ci snprintf(ap, 14, "Unknown-%d", val); 237cabdff1aSopenharmony_ci return ap; 238cabdff1aSopenharmony_ci} 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_cistatic char *doubles2str(double *dp, int count, const char *sep) 241cabdff1aSopenharmony_ci{ 242cabdff1aSopenharmony_ci int i; 243cabdff1aSopenharmony_ci char *ap, *ap0; 244cabdff1aSopenharmony_ci uint64_t component_len; 245cabdff1aSopenharmony_ci if (!sep) sep = ", "; 246cabdff1aSopenharmony_ci component_len = 24LL + strlen(sep); 247cabdff1aSopenharmony_ci if (count >= (INT_MAX - 1)/component_len) 248cabdff1aSopenharmony_ci return NULL; 249cabdff1aSopenharmony_ci ap = av_malloc(component_len * count + 1); 250cabdff1aSopenharmony_ci if (!ap) 251cabdff1aSopenharmony_ci return NULL; 252cabdff1aSopenharmony_ci ap0 = ap; 253cabdff1aSopenharmony_ci ap[0] = '\0'; 254cabdff1aSopenharmony_ci for (i = 0; i < count; i++) { 255cabdff1aSopenharmony_ci unsigned l = snprintf(ap, component_len, "%.15g%s", dp[i], sep); 256cabdff1aSopenharmony_ci if(l >= component_len) { 257cabdff1aSopenharmony_ci av_free(ap0); 258cabdff1aSopenharmony_ci return NULL; 259cabdff1aSopenharmony_ci } 260cabdff1aSopenharmony_ci ap += l; 261cabdff1aSopenharmony_ci } 262cabdff1aSopenharmony_ci ap0[strlen(ap0) - strlen(sep)] = '\0'; 263cabdff1aSopenharmony_ci return ap0; 264cabdff1aSopenharmony_ci} 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_cistatic int add_metadata(int count, int type, 267cabdff1aSopenharmony_ci const char *name, const char *sep, TiffContext *s, AVFrame *frame) 268cabdff1aSopenharmony_ci{ 269cabdff1aSopenharmony_ci switch(type) { 270cabdff1aSopenharmony_ci case TIFF_DOUBLE: return ff_tadd_doubles_metadata(count, name, sep, &s->gb, s->le, &frame->metadata); 271cabdff1aSopenharmony_ci case TIFF_SHORT : return ff_tadd_shorts_metadata(count, name, sep, &s->gb, s->le, 0, &frame->metadata); 272cabdff1aSopenharmony_ci case TIFF_STRING: return ff_tadd_string_metadata(count, name, &s->gb, s->le, &frame->metadata); 273cabdff1aSopenharmony_ci default : return AVERROR_INVALIDDATA; 274cabdff1aSopenharmony_ci }; 275cabdff1aSopenharmony_ci} 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci/** 278cabdff1aSopenharmony_ci * Map stored raw sensor values into linear reference values (see: DNG Specification - Chapter 5) 279cabdff1aSopenharmony_ci */ 280cabdff1aSopenharmony_cistatic uint16_t av_always_inline dng_process_color16(uint16_t value, 281cabdff1aSopenharmony_ci const uint16_t *lut, 282cabdff1aSopenharmony_ci uint16_t black_level, 283cabdff1aSopenharmony_ci float scale_factor) 284cabdff1aSopenharmony_ci{ 285cabdff1aSopenharmony_ci float value_norm; 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_ci // Lookup table lookup 288cabdff1aSopenharmony_ci if (lut) 289cabdff1aSopenharmony_ci value = lut[value]; 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci // Black level subtraction 292cabdff1aSopenharmony_ci value = av_clip_uint16_c((unsigned)value - black_level); 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci // Color scaling 295cabdff1aSopenharmony_ci value_norm = (float)value * scale_factor; 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci value = av_clip_uint16_c(value_norm * 65535); 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci return value; 300cabdff1aSopenharmony_ci} 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_cistatic uint16_t av_always_inline dng_process_color8(uint16_t value, 303cabdff1aSopenharmony_ci const uint16_t *lut, 304cabdff1aSopenharmony_ci uint16_t black_level, 305cabdff1aSopenharmony_ci float scale_factor) 306cabdff1aSopenharmony_ci{ 307cabdff1aSopenharmony_ci return dng_process_color16(value, lut, black_level, scale_factor) >> 8; 308cabdff1aSopenharmony_ci} 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_cistatic void av_always_inline dng_blit(TiffContext *s, uint8_t *dst, int dst_stride, 311cabdff1aSopenharmony_ci const uint8_t *src, int src_stride, int width, int height, 312cabdff1aSopenharmony_ci int is_single_comp, int is_u16) 313cabdff1aSopenharmony_ci{ 314cabdff1aSopenharmony_ci int line, col; 315cabdff1aSopenharmony_ci float scale_factor; 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci scale_factor = 1.0f / (s->white_level - s->black_level); 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (is_single_comp) { 320cabdff1aSopenharmony_ci if (!is_u16) 321cabdff1aSopenharmony_ci return; /* <= 8bpp unsupported */ 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci /* Image is double the width and half the height we need, each row comprises 2 rows of the output 324cabdff1aSopenharmony_ci (split vertically in the middle). */ 325cabdff1aSopenharmony_ci for (line = 0; line < height / 2; line++) { 326cabdff1aSopenharmony_ci uint16_t *dst_u16 = (uint16_t *)dst; 327cabdff1aSopenharmony_ci uint16_t *src_u16 = (uint16_t *)src; 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci /* Blit first half of input row row to initial row of output */ 330cabdff1aSopenharmony_ci for (col = 0; col < width; col++) 331cabdff1aSopenharmony_ci *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level, scale_factor); 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci /* Advance the destination pointer by a row (source pointer remains in the same place) */ 334cabdff1aSopenharmony_ci dst += dst_stride * sizeof(uint16_t); 335cabdff1aSopenharmony_ci dst_u16 = (uint16_t *)dst; 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci /* Blit second half of input row row to next row of output */ 338cabdff1aSopenharmony_ci for (col = 0; col < width; col++) 339cabdff1aSopenharmony_ci *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level, scale_factor); 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci dst += dst_stride * sizeof(uint16_t); 342cabdff1aSopenharmony_ci src += src_stride * sizeof(uint16_t); 343cabdff1aSopenharmony_ci } 344cabdff1aSopenharmony_ci } else { 345cabdff1aSopenharmony_ci /* Input and output image are the same size and the MJpeg decoder has done per-component 346cabdff1aSopenharmony_ci deinterleaving, so blitting here is straightforward. */ 347cabdff1aSopenharmony_ci if (is_u16) { 348cabdff1aSopenharmony_ci for (line = 0; line < height; line++) { 349cabdff1aSopenharmony_ci uint16_t *dst_u16 = (uint16_t *)dst; 350cabdff1aSopenharmony_ci uint16_t *src_u16 = (uint16_t *)src; 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci for (col = 0; col < width; col++) 353cabdff1aSopenharmony_ci *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level, scale_factor); 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci dst += dst_stride * sizeof(uint16_t); 356cabdff1aSopenharmony_ci src += src_stride * sizeof(uint16_t); 357cabdff1aSopenharmony_ci } 358cabdff1aSopenharmony_ci } else { 359cabdff1aSopenharmony_ci for (line = 0; line < height; line++) { 360cabdff1aSopenharmony_ci uint8_t *dst_u8 = dst; 361cabdff1aSopenharmony_ci const uint8_t *src_u8 = src; 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci for (col = 0; col < width; col++) 364cabdff1aSopenharmony_ci *dst_u8++ = dng_process_color8(*src_u8++, s->dng_lut, s->black_level, scale_factor); 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci dst += dst_stride; 367cabdff1aSopenharmony_ci src += src_stride; 368cabdff1aSopenharmony_ci } 369cabdff1aSopenharmony_ci } 370cabdff1aSopenharmony_ci } 371cabdff1aSopenharmony_ci} 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_cistatic void av_always_inline horizontal_fill(TiffContext *s, 374cabdff1aSopenharmony_ci unsigned int bpp, uint8_t* dst, 375cabdff1aSopenharmony_ci int usePtr, const uint8_t *src, 376cabdff1aSopenharmony_ci uint8_t c, int width, int offset) 377cabdff1aSopenharmony_ci{ 378cabdff1aSopenharmony_ci switch (bpp) { 379cabdff1aSopenharmony_ci case 1: 380cabdff1aSopenharmony_ci while (--width >= 0) { 381cabdff1aSopenharmony_ci dst[(width+offset)*8+7] = (usePtr ? src[width] : c) & 0x1; 382cabdff1aSopenharmony_ci dst[(width+offset)*8+6] = (usePtr ? src[width] : c) >> 1 & 0x1; 383cabdff1aSopenharmony_ci dst[(width+offset)*8+5] = (usePtr ? src[width] : c) >> 2 & 0x1; 384cabdff1aSopenharmony_ci dst[(width+offset)*8+4] = (usePtr ? src[width] : c) >> 3 & 0x1; 385cabdff1aSopenharmony_ci dst[(width+offset)*8+3] = (usePtr ? src[width] : c) >> 4 & 0x1; 386cabdff1aSopenharmony_ci dst[(width+offset)*8+2] = (usePtr ? src[width] : c) >> 5 & 0x1; 387cabdff1aSopenharmony_ci dst[(width+offset)*8+1] = (usePtr ? src[width] : c) >> 6 & 0x1; 388cabdff1aSopenharmony_ci dst[(width+offset)*8+0] = (usePtr ? src[width] : c) >> 7; 389cabdff1aSopenharmony_ci } 390cabdff1aSopenharmony_ci break; 391cabdff1aSopenharmony_ci case 2: 392cabdff1aSopenharmony_ci while (--width >= 0) { 393cabdff1aSopenharmony_ci dst[(width+offset)*4+3] = (usePtr ? src[width] : c) & 0x3; 394cabdff1aSopenharmony_ci dst[(width+offset)*4+2] = (usePtr ? src[width] : c) >> 2 & 0x3; 395cabdff1aSopenharmony_ci dst[(width+offset)*4+1] = (usePtr ? src[width] : c) >> 4 & 0x3; 396cabdff1aSopenharmony_ci dst[(width+offset)*4+0] = (usePtr ? src[width] : c) >> 6; 397cabdff1aSopenharmony_ci } 398cabdff1aSopenharmony_ci break; 399cabdff1aSopenharmony_ci case 4: 400cabdff1aSopenharmony_ci while (--width >= 0) { 401cabdff1aSopenharmony_ci dst[(width+offset)*2+1] = (usePtr ? src[width] : c) & 0xF; 402cabdff1aSopenharmony_ci dst[(width+offset)*2+0] = (usePtr ? src[width] : c) >> 4; 403cabdff1aSopenharmony_ci } 404cabdff1aSopenharmony_ci break; 405cabdff1aSopenharmony_ci case 10: 406cabdff1aSopenharmony_ci case 12: 407cabdff1aSopenharmony_ci case 14: { 408cabdff1aSopenharmony_ci uint16_t *dst16 = (uint16_t *)dst; 409cabdff1aSopenharmony_ci int is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG); 410cabdff1aSopenharmony_ci uint8_t shift = is_dng ? 0 : 16 - bpp; 411cabdff1aSopenharmony_ci GetBitContext gb; 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci init_get_bits8(&gb, src, width); 414cabdff1aSopenharmony_ci for (int i = 0; i < s->width; i++) { 415cabdff1aSopenharmony_ci dst16[i] = get_bits(&gb, bpp) << shift; 416cabdff1aSopenharmony_ci } 417cabdff1aSopenharmony_ci } 418cabdff1aSopenharmony_ci break; 419cabdff1aSopenharmony_ci default: 420cabdff1aSopenharmony_ci if (usePtr) { 421cabdff1aSopenharmony_ci memcpy(dst + offset, src, width); 422cabdff1aSopenharmony_ci } else { 423cabdff1aSopenharmony_ci memset(dst + offset, c, width); 424cabdff1aSopenharmony_ci } 425cabdff1aSopenharmony_ci } 426cabdff1aSopenharmony_ci} 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_cistatic int deinvert_buffer(TiffContext *s, const uint8_t *src, int size) 429cabdff1aSopenharmony_ci{ 430cabdff1aSopenharmony_ci int i; 431cabdff1aSopenharmony_ci 432cabdff1aSopenharmony_ci av_fast_padded_malloc(&s->deinvert_buf, &s->deinvert_buf_size, size); 433cabdff1aSopenharmony_ci if (!s->deinvert_buf) 434cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 435cabdff1aSopenharmony_ci for (i = 0; i < size; i++) 436cabdff1aSopenharmony_ci s->deinvert_buf[i] = ff_reverse[src[i]]; 437cabdff1aSopenharmony_ci 438cabdff1aSopenharmony_ci return 0; 439cabdff1aSopenharmony_ci} 440cabdff1aSopenharmony_ci 441cabdff1aSopenharmony_cistatic void unpack_gray(TiffContext *s, AVFrame *p, 442cabdff1aSopenharmony_ci const uint8_t *src, int lnum, int width, int bpp) 443cabdff1aSopenharmony_ci{ 444cabdff1aSopenharmony_ci GetBitContext gb; 445cabdff1aSopenharmony_ci uint16_t *dst = (uint16_t *)(p->data[0] + lnum * p->linesize[0]); 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_ci init_get_bits8(&gb, src, width); 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci for (int i = 0; i < s->width; i++) { 450cabdff1aSopenharmony_ci dst[i] = get_bits(&gb, bpp); 451cabdff1aSopenharmony_ci } 452cabdff1aSopenharmony_ci} 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_cistatic void unpack_yuv(TiffContext *s, AVFrame *p, 455cabdff1aSopenharmony_ci const uint8_t *src, int lnum) 456cabdff1aSopenharmony_ci{ 457cabdff1aSopenharmony_ci int i, j, k; 458cabdff1aSopenharmony_ci int w = (s->width - 1) / s->subsampling[0] + 1; 459cabdff1aSopenharmony_ci uint8_t *pu = &p->data[1][lnum / s->subsampling[1] * p->linesize[1]]; 460cabdff1aSopenharmony_ci uint8_t *pv = &p->data[2][lnum / s->subsampling[1] * p->linesize[2]]; 461cabdff1aSopenharmony_ci if (s->width % s->subsampling[0] || s->height % s->subsampling[1]) { 462cabdff1aSopenharmony_ci for (i = 0; i < w; i++) { 463cabdff1aSopenharmony_ci for (j = 0; j < s->subsampling[1]; j++) 464cabdff1aSopenharmony_ci for (k = 0; k < s->subsampling[0]; k++) 465cabdff1aSopenharmony_ci p->data[0][FFMIN(lnum + j, s->height-1) * p->linesize[0] + 466cabdff1aSopenharmony_ci FFMIN(i * s->subsampling[0] + k, s->width-1)] = *src++; 467cabdff1aSopenharmony_ci *pu++ = *src++; 468cabdff1aSopenharmony_ci *pv++ = *src++; 469cabdff1aSopenharmony_ci } 470cabdff1aSopenharmony_ci }else{ 471cabdff1aSopenharmony_ci for (i = 0; i < w; i++) { 472cabdff1aSopenharmony_ci for (j = 0; j < s->subsampling[1]; j++) 473cabdff1aSopenharmony_ci for (k = 0; k < s->subsampling[0]; k++) 474cabdff1aSopenharmony_ci p->data[0][(lnum + j) * p->linesize[0] + 475cabdff1aSopenharmony_ci i * s->subsampling[0] + k] = *src++; 476cabdff1aSopenharmony_ci *pu++ = *src++; 477cabdff1aSopenharmony_ci *pv++ = *src++; 478cabdff1aSopenharmony_ci } 479cabdff1aSopenharmony_ci } 480cabdff1aSopenharmony_ci} 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ci#if CONFIG_ZLIB 483cabdff1aSopenharmony_cistatic int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src, 484cabdff1aSopenharmony_ci int size) 485cabdff1aSopenharmony_ci{ 486cabdff1aSopenharmony_ci z_stream zstream = { 0 }; 487cabdff1aSopenharmony_ci int zret; 488cabdff1aSopenharmony_ci 489cabdff1aSopenharmony_ci zstream.next_in = src; 490cabdff1aSopenharmony_ci zstream.avail_in = size; 491cabdff1aSopenharmony_ci zstream.next_out = dst; 492cabdff1aSopenharmony_ci zstream.avail_out = *len; 493cabdff1aSopenharmony_ci zret = inflateInit(&zstream); 494cabdff1aSopenharmony_ci if (zret != Z_OK) { 495cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Inflate init error: %d\n", zret); 496cabdff1aSopenharmony_ci return zret; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci zret = inflate(&zstream, Z_SYNC_FLUSH); 499cabdff1aSopenharmony_ci inflateEnd(&zstream); 500cabdff1aSopenharmony_ci *len = zstream.total_out; 501cabdff1aSopenharmony_ci return zret == Z_STREAM_END ? Z_OK : zret; 502cabdff1aSopenharmony_ci} 503cabdff1aSopenharmony_ci 504cabdff1aSopenharmony_cistatic int tiff_unpack_zlib(TiffContext *s, AVFrame *p, uint8_t *dst, int stride, 505cabdff1aSopenharmony_ci const uint8_t *src, int size, int width, int lines, 506cabdff1aSopenharmony_ci int strip_start, int is_yuv) 507cabdff1aSopenharmony_ci{ 508cabdff1aSopenharmony_ci uint8_t *zbuf; 509cabdff1aSopenharmony_ci unsigned long outlen; 510cabdff1aSopenharmony_ci int ret, line; 511cabdff1aSopenharmony_ci outlen = width * lines; 512cabdff1aSopenharmony_ci zbuf = av_malloc(outlen); 513cabdff1aSopenharmony_ci if (!zbuf) 514cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 515cabdff1aSopenharmony_ci if (s->fill_order) { 516cabdff1aSopenharmony_ci if ((ret = deinvert_buffer(s, src, size)) < 0) { 517cabdff1aSopenharmony_ci av_free(zbuf); 518cabdff1aSopenharmony_ci return ret; 519cabdff1aSopenharmony_ci } 520cabdff1aSopenharmony_ci src = s->deinvert_buf; 521cabdff1aSopenharmony_ci } 522cabdff1aSopenharmony_ci ret = tiff_uncompress(zbuf, &outlen, src, size); 523cabdff1aSopenharmony_ci if (ret != Z_OK) { 524cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 525cabdff1aSopenharmony_ci "Uncompressing failed (%lu of %lu) with error %d\n", outlen, 526cabdff1aSopenharmony_ci (unsigned long)width * lines, ret); 527cabdff1aSopenharmony_ci av_free(zbuf); 528cabdff1aSopenharmony_ci return AVERROR_UNKNOWN; 529cabdff1aSopenharmony_ci } 530cabdff1aSopenharmony_ci src = zbuf; 531cabdff1aSopenharmony_ci for (line = 0; line < lines; line++) { 532cabdff1aSopenharmony_ci if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) { 533cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp, dst, 1, src, 0, width, 0); 534cabdff1aSopenharmony_ci } else { 535cabdff1aSopenharmony_ci memcpy(dst, src, width); 536cabdff1aSopenharmony_ci } 537cabdff1aSopenharmony_ci if (is_yuv) { 538cabdff1aSopenharmony_ci unpack_yuv(s, p, dst, strip_start + line); 539cabdff1aSopenharmony_ci line += s->subsampling[1] - 1; 540cabdff1aSopenharmony_ci } 541cabdff1aSopenharmony_ci dst += stride; 542cabdff1aSopenharmony_ci src += width; 543cabdff1aSopenharmony_ci } 544cabdff1aSopenharmony_ci av_free(zbuf); 545cabdff1aSopenharmony_ci return 0; 546cabdff1aSopenharmony_ci} 547cabdff1aSopenharmony_ci#endif 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci#if CONFIG_LZMA 550cabdff1aSopenharmony_cistatic int tiff_uncompress_lzma(uint8_t *dst, uint64_t *len, const uint8_t *src, 551cabdff1aSopenharmony_ci int size) 552cabdff1aSopenharmony_ci{ 553cabdff1aSopenharmony_ci lzma_stream stream = LZMA_STREAM_INIT; 554cabdff1aSopenharmony_ci lzma_ret ret; 555cabdff1aSopenharmony_ci 556cabdff1aSopenharmony_ci stream.next_in = (uint8_t *)src; 557cabdff1aSopenharmony_ci stream.avail_in = size; 558cabdff1aSopenharmony_ci stream.next_out = dst; 559cabdff1aSopenharmony_ci stream.avail_out = *len; 560cabdff1aSopenharmony_ci ret = lzma_stream_decoder(&stream, UINT64_MAX, 0); 561cabdff1aSopenharmony_ci if (ret != LZMA_OK) { 562cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "LZMA init error: %d\n", ret); 563cabdff1aSopenharmony_ci return ret; 564cabdff1aSopenharmony_ci } 565cabdff1aSopenharmony_ci ret = lzma_code(&stream, LZMA_RUN); 566cabdff1aSopenharmony_ci lzma_end(&stream); 567cabdff1aSopenharmony_ci *len = stream.total_out; 568cabdff1aSopenharmony_ci return ret == LZMA_STREAM_END ? LZMA_OK : ret; 569cabdff1aSopenharmony_ci} 570cabdff1aSopenharmony_ci 571cabdff1aSopenharmony_cistatic int tiff_unpack_lzma(TiffContext *s, AVFrame *p, uint8_t *dst, int stride, 572cabdff1aSopenharmony_ci const uint8_t *src, int size, int width, int lines, 573cabdff1aSopenharmony_ci int strip_start, int is_yuv) 574cabdff1aSopenharmony_ci{ 575cabdff1aSopenharmony_ci uint64_t outlen = width * (uint64_t)lines; 576cabdff1aSopenharmony_ci int ret, line; 577cabdff1aSopenharmony_ci uint8_t *buf = av_malloc(outlen); 578cabdff1aSopenharmony_ci if (!buf) 579cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 580cabdff1aSopenharmony_ci if (s->fill_order) { 581cabdff1aSopenharmony_ci if ((ret = deinvert_buffer(s, src, size)) < 0) { 582cabdff1aSopenharmony_ci av_free(buf); 583cabdff1aSopenharmony_ci return ret; 584cabdff1aSopenharmony_ci } 585cabdff1aSopenharmony_ci src = s->deinvert_buf; 586cabdff1aSopenharmony_ci } 587cabdff1aSopenharmony_ci ret = tiff_uncompress_lzma(buf, &outlen, src, size); 588cabdff1aSopenharmony_ci if (ret != LZMA_OK) { 589cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 590cabdff1aSopenharmony_ci "Uncompressing failed (%"PRIu64" of %"PRIu64") with error %d\n", outlen, 591cabdff1aSopenharmony_ci (uint64_t)width * lines, ret); 592cabdff1aSopenharmony_ci av_free(buf); 593cabdff1aSopenharmony_ci return AVERROR_UNKNOWN; 594cabdff1aSopenharmony_ci } 595cabdff1aSopenharmony_ci src = buf; 596cabdff1aSopenharmony_ci for (line = 0; line < lines; line++) { 597cabdff1aSopenharmony_ci if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) { 598cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp, dst, 1, src, 0, width, 0); 599cabdff1aSopenharmony_ci } else { 600cabdff1aSopenharmony_ci memcpy(dst, src, width); 601cabdff1aSopenharmony_ci } 602cabdff1aSopenharmony_ci if (is_yuv) { 603cabdff1aSopenharmony_ci unpack_yuv(s, p, dst, strip_start + line); 604cabdff1aSopenharmony_ci line += s->subsampling[1] - 1; 605cabdff1aSopenharmony_ci } 606cabdff1aSopenharmony_ci dst += stride; 607cabdff1aSopenharmony_ci src += width; 608cabdff1aSopenharmony_ci } 609cabdff1aSopenharmony_ci av_free(buf); 610cabdff1aSopenharmony_ci return 0; 611cabdff1aSopenharmony_ci} 612cabdff1aSopenharmony_ci#endif 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_cistatic int tiff_unpack_fax(TiffContext *s, uint8_t *dst, int stride, 615cabdff1aSopenharmony_ci const uint8_t *src, int size, int width, int lines) 616cabdff1aSopenharmony_ci{ 617cabdff1aSopenharmony_ci int line; 618cabdff1aSopenharmony_ci int ret; 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ci if (s->fill_order) { 621cabdff1aSopenharmony_ci if ((ret = deinvert_buffer(s, src, size)) < 0) 622cabdff1aSopenharmony_ci return ret; 623cabdff1aSopenharmony_ci src = s->deinvert_buf; 624cabdff1aSopenharmony_ci } 625cabdff1aSopenharmony_ci ret = ff_ccitt_unpack(s->avctx, src, size, dst, lines, stride, 626cabdff1aSopenharmony_ci s->compr, s->fax_opts); 627cabdff1aSopenharmony_ci if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) 628cabdff1aSopenharmony_ci for (line = 0; line < lines; line++) { 629cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp, dst, 1, dst, 0, width, 0); 630cabdff1aSopenharmony_ci dst += stride; 631cabdff1aSopenharmony_ci } 632cabdff1aSopenharmony_ci return ret; 633cabdff1aSopenharmony_ci} 634cabdff1aSopenharmony_ci 635cabdff1aSopenharmony_cistatic int dng_decode_jpeg(AVCodecContext *avctx, AVFrame *frame, 636cabdff1aSopenharmony_ci int tile_byte_count, int dst_x, int dst_y, int w, int h) 637cabdff1aSopenharmony_ci{ 638cabdff1aSopenharmony_ci TiffContext *s = avctx->priv_data; 639cabdff1aSopenharmony_ci uint8_t *dst_data, *src_data; 640cabdff1aSopenharmony_ci uint32_t dst_offset; /* offset from dst buffer in pixels */ 641cabdff1aSopenharmony_ci int is_single_comp, is_u16, pixel_size; 642cabdff1aSopenharmony_ci int ret; 643cabdff1aSopenharmony_ci 644cabdff1aSopenharmony_ci if (tile_byte_count < 0 || tile_byte_count > bytestream2_get_bytes_left(&s->gb)) 645cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 646cabdff1aSopenharmony_ci 647cabdff1aSopenharmony_ci /* Prepare a packet and send to the MJPEG decoder */ 648cabdff1aSopenharmony_ci av_packet_unref(s->jpkt); 649cabdff1aSopenharmony_ci s->jpkt->data = (uint8_t*)s->gb.buffer; 650cabdff1aSopenharmony_ci s->jpkt->size = tile_byte_count; 651cabdff1aSopenharmony_ci 652cabdff1aSopenharmony_ci if (s->is_bayer) { 653cabdff1aSopenharmony_ci MJpegDecodeContext *mjpegdecctx = s->avctx_mjpeg->priv_data; 654cabdff1aSopenharmony_ci /* We have to set this information here, there is no way to know if a given JPEG is a DNG-embedded 655cabdff1aSopenharmony_ci image or not from its own data (and we need that information when decoding it). */ 656cabdff1aSopenharmony_ci mjpegdecctx->bayer = 1; 657cabdff1aSopenharmony_ci } 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci ret = avcodec_send_packet(s->avctx_mjpeg, s->jpkt); 660cabdff1aSopenharmony_ci if (ret < 0) { 661cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); 662cabdff1aSopenharmony_ci return ret; 663cabdff1aSopenharmony_ci } 664cabdff1aSopenharmony_ci 665cabdff1aSopenharmony_ci ret = avcodec_receive_frame(s->avctx_mjpeg, s->jpgframe); 666cabdff1aSopenharmony_ci if (ret < 0) { 667cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "JPEG decoding error: %s.\n", av_err2str(ret)); 668cabdff1aSopenharmony_ci 669cabdff1aSopenharmony_ci /* Normally skip, error if explode */ 670cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_EXPLODE) 671cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 672cabdff1aSopenharmony_ci else 673cabdff1aSopenharmony_ci return 0; 674cabdff1aSopenharmony_ci } 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci is_u16 = (s->bpp > 8); 677cabdff1aSopenharmony_ci 678cabdff1aSopenharmony_ci /* Copy the outputted tile's pixels from 'jpgframe' to 'frame' (final buffer) */ 679cabdff1aSopenharmony_ci 680cabdff1aSopenharmony_ci if (s->jpgframe->width != s->avctx_mjpeg->width || 681cabdff1aSopenharmony_ci s->jpgframe->height != s->avctx_mjpeg->height || 682cabdff1aSopenharmony_ci s->jpgframe->format != s->avctx_mjpeg->pix_fmt) 683cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 684cabdff1aSopenharmony_ci 685cabdff1aSopenharmony_ci /* See dng_blit for explanation */ 686cabdff1aSopenharmony_ci if (s->avctx_mjpeg->width == w * 2 && 687cabdff1aSopenharmony_ci s->avctx_mjpeg->height == h / 2 && 688cabdff1aSopenharmony_ci s->avctx_mjpeg->pix_fmt == AV_PIX_FMT_GRAY16LE) { 689cabdff1aSopenharmony_ci is_single_comp = 1; 690cabdff1aSopenharmony_ci } else if (s->avctx_mjpeg->width >= w && 691cabdff1aSopenharmony_ci s->avctx_mjpeg->height >= h && 692cabdff1aSopenharmony_ci s->avctx_mjpeg->pix_fmt == (is_u16 ? AV_PIX_FMT_GRAY16 : AV_PIX_FMT_GRAY8) 693cabdff1aSopenharmony_ci ) { 694cabdff1aSopenharmony_ci is_single_comp = 0; 695cabdff1aSopenharmony_ci } else 696cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 697cabdff1aSopenharmony_ci 698cabdff1aSopenharmony_ci pixel_size = (is_u16 ? sizeof(uint16_t) : sizeof(uint8_t)); 699cabdff1aSopenharmony_ci 700cabdff1aSopenharmony_ci if (is_single_comp && !is_u16) { 701cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "DNGs with bpp <= 8 and 1 component are unsupported\n"); 702cabdff1aSopenharmony_ci av_frame_unref(s->jpgframe); 703cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 704cabdff1aSopenharmony_ci } 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci dst_offset = dst_x + frame->linesize[0] * dst_y / pixel_size; 707cabdff1aSopenharmony_ci dst_data = frame->data[0] + dst_offset * pixel_size; 708cabdff1aSopenharmony_ci src_data = s->jpgframe->data[0]; 709cabdff1aSopenharmony_ci 710cabdff1aSopenharmony_ci dng_blit(s, 711cabdff1aSopenharmony_ci dst_data, 712cabdff1aSopenharmony_ci frame->linesize[0] / pixel_size, 713cabdff1aSopenharmony_ci src_data, 714cabdff1aSopenharmony_ci s->jpgframe->linesize[0] / pixel_size, 715cabdff1aSopenharmony_ci w, 716cabdff1aSopenharmony_ci h, 717cabdff1aSopenharmony_ci is_single_comp, 718cabdff1aSopenharmony_ci is_u16); 719cabdff1aSopenharmony_ci 720cabdff1aSopenharmony_ci av_frame_unref(s->jpgframe); 721cabdff1aSopenharmony_ci 722cabdff1aSopenharmony_ci return 0; 723cabdff1aSopenharmony_ci} 724cabdff1aSopenharmony_ci 725cabdff1aSopenharmony_cistatic int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int stride, 726cabdff1aSopenharmony_ci const uint8_t *src, int size, int strip_start, int lines) 727cabdff1aSopenharmony_ci{ 728cabdff1aSopenharmony_ci PutByteContext pb; 729cabdff1aSopenharmony_ci int c, line, pixels, code, ret; 730cabdff1aSopenharmony_ci const uint8_t *ssrc = src; 731cabdff1aSopenharmony_ci int width = ((s->width * s->bpp) + 7) >> 3; 732cabdff1aSopenharmony_ci const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(p->format); 733cabdff1aSopenharmony_ci int is_yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) && 734cabdff1aSopenharmony_ci (desc->flags & AV_PIX_FMT_FLAG_PLANAR) && 735cabdff1aSopenharmony_ci desc->nb_components >= 3; 736cabdff1aSopenharmony_ci int is_dng; 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_ci if (s->planar) 739cabdff1aSopenharmony_ci width /= s->bppcount; 740cabdff1aSopenharmony_ci 741cabdff1aSopenharmony_ci if (size <= 0) 742cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 743cabdff1aSopenharmony_ci 744cabdff1aSopenharmony_ci if (is_yuv) { 745cabdff1aSopenharmony_ci int bytes_per_row = (((s->width - 1) / s->subsampling[0] + 1) * s->bpp * 746cabdff1aSopenharmony_ci s->subsampling[0] * s->subsampling[1] + 7) >> 3; 747cabdff1aSopenharmony_ci av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, bytes_per_row); 748cabdff1aSopenharmony_ci if (s->yuv_line == NULL) { 749cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n"); 750cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 751cabdff1aSopenharmony_ci } 752cabdff1aSopenharmony_ci dst = s->yuv_line; 753cabdff1aSopenharmony_ci stride = 0; 754cabdff1aSopenharmony_ci 755cabdff1aSopenharmony_ci width = (s->width - 1) / s->subsampling[0] + 1; 756cabdff1aSopenharmony_ci width = width * s->subsampling[0] * s->subsampling[1] + 2*width; 757cabdff1aSopenharmony_ci av_assert0(width <= bytes_per_row); 758cabdff1aSopenharmony_ci av_assert0(s->bpp == 24); 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci if (s->is_bayer) { 761cabdff1aSopenharmony_ci av_assert0(width == (s->bpp * s->width + 7) >> 3); 762cabdff1aSopenharmony_ci } 763cabdff1aSopenharmony_ci av_assert0(!(s->is_bayer && is_yuv)); 764cabdff1aSopenharmony_ci if (p->format == AV_PIX_FMT_GRAY12) { 765cabdff1aSopenharmony_ci av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, width); 766cabdff1aSopenharmony_ci if (s->yuv_line == NULL) { 767cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n"); 768cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 769cabdff1aSopenharmony_ci } 770cabdff1aSopenharmony_ci dst = s->yuv_line; 771cabdff1aSopenharmony_ci stride = 0; 772cabdff1aSopenharmony_ci } 773cabdff1aSopenharmony_ci 774cabdff1aSopenharmony_ci if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) { 775cabdff1aSopenharmony_ci#if CONFIG_ZLIB 776cabdff1aSopenharmony_ci return tiff_unpack_zlib(s, p, dst, stride, src, size, width, lines, 777cabdff1aSopenharmony_ci strip_start, is_yuv); 778cabdff1aSopenharmony_ci#else 779cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 780cabdff1aSopenharmony_ci "zlib support not enabled, " 781cabdff1aSopenharmony_ci "deflate compression not supported\n"); 782cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 783cabdff1aSopenharmony_ci#endif 784cabdff1aSopenharmony_ci } 785cabdff1aSopenharmony_ci if (s->compr == TIFF_LZMA) { 786cabdff1aSopenharmony_ci#if CONFIG_LZMA 787cabdff1aSopenharmony_ci return tiff_unpack_lzma(s, p, dst, stride, src, size, width, lines, 788cabdff1aSopenharmony_ci strip_start, is_yuv); 789cabdff1aSopenharmony_ci#else 790cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 791cabdff1aSopenharmony_ci "LZMA support not enabled\n"); 792cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 793cabdff1aSopenharmony_ci#endif 794cabdff1aSopenharmony_ci } 795cabdff1aSopenharmony_ci if (s->compr == TIFF_LZW) { 796cabdff1aSopenharmony_ci if (s->fill_order) { 797cabdff1aSopenharmony_ci if ((ret = deinvert_buffer(s, src, size)) < 0) 798cabdff1aSopenharmony_ci return ret; 799cabdff1aSopenharmony_ci ssrc = src = s->deinvert_buf; 800cabdff1aSopenharmony_ci } 801cabdff1aSopenharmony_ci if (size > 1 && !src[0] && (src[1]&1)) { 802cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Old style LZW is unsupported\n"); 803cabdff1aSopenharmony_ci } 804cabdff1aSopenharmony_ci if ((ret = ff_lzw_decode_init(s->lzw, 8, src, size, FF_LZW_TIFF)) < 0) { 805cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error initializing LZW decoder\n"); 806cabdff1aSopenharmony_ci return ret; 807cabdff1aSopenharmony_ci } 808cabdff1aSopenharmony_ci for (line = 0; line < lines; line++) { 809cabdff1aSopenharmony_ci pixels = ff_lzw_decode(s->lzw, dst, width); 810cabdff1aSopenharmony_ci if (pixels < width) { 811cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Decoded only %i bytes of %i\n", 812cabdff1aSopenharmony_ci pixels, width); 813cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 814cabdff1aSopenharmony_ci } 815cabdff1aSopenharmony_ci if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) 816cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp, dst, 1, dst, 0, width, 0); 817cabdff1aSopenharmony_ci if (is_yuv) { 818cabdff1aSopenharmony_ci unpack_yuv(s, p, dst, strip_start + line); 819cabdff1aSopenharmony_ci line += s->subsampling[1] - 1; 820cabdff1aSopenharmony_ci } else if (p->format == AV_PIX_FMT_GRAY12) { 821cabdff1aSopenharmony_ci unpack_gray(s, p, dst, strip_start + line, width, s->bpp); 822cabdff1aSopenharmony_ci } 823cabdff1aSopenharmony_ci dst += stride; 824cabdff1aSopenharmony_ci } 825cabdff1aSopenharmony_ci return 0; 826cabdff1aSopenharmony_ci } 827cabdff1aSopenharmony_ci if (s->compr == TIFF_CCITT_RLE || 828cabdff1aSopenharmony_ci s->compr == TIFF_G3 || 829cabdff1aSopenharmony_ci s->compr == TIFF_G4) { 830cabdff1aSopenharmony_ci if (is_yuv || p->format == AV_PIX_FMT_GRAY12) 831cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 832cabdff1aSopenharmony_ci 833cabdff1aSopenharmony_ci return tiff_unpack_fax(s, dst, stride, src, size, width, lines); 834cabdff1aSopenharmony_ci } 835cabdff1aSopenharmony_ci 836cabdff1aSopenharmony_ci bytestream2_init(&s->gb, src, size); 837cabdff1aSopenharmony_ci bytestream2_init_writer(&pb, dst, is_yuv ? s->yuv_line_size : (stride * lines)); 838cabdff1aSopenharmony_ci 839cabdff1aSopenharmony_ci is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG); 840cabdff1aSopenharmony_ci 841cabdff1aSopenharmony_ci /* Decode JPEG-encoded DNGs with strips */ 842cabdff1aSopenharmony_ci if (s->compr == TIFF_NEWJPEG && is_dng) { 843cabdff1aSopenharmony_ci if (s->strips > 1) { 844cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "More than one DNG JPEG strips unsupported\n"); 845cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 846cabdff1aSopenharmony_ci } 847cabdff1aSopenharmony_ci if (!s->is_bayer) 848cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 849cabdff1aSopenharmony_ci if ((ret = dng_decode_jpeg(s->avctx, p, s->stripsize, 0, 0, s->width, s->height)) < 0) 850cabdff1aSopenharmony_ci return ret; 851cabdff1aSopenharmony_ci return 0; 852cabdff1aSopenharmony_ci } 853cabdff1aSopenharmony_ci 854cabdff1aSopenharmony_ci if (is_dng && stride == 0) 855cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 856cabdff1aSopenharmony_ci 857cabdff1aSopenharmony_ci for (line = 0; line < lines; line++) { 858cabdff1aSopenharmony_ci if (src - ssrc > size) { 859cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n"); 860cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 861cabdff1aSopenharmony_ci } 862cabdff1aSopenharmony_ci 863cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(&s->gb) == 0 || bytestream2_get_eof(&pb)) 864cabdff1aSopenharmony_ci break; 865cabdff1aSopenharmony_ci bytestream2_seek_p(&pb, stride * line, SEEK_SET); 866cabdff1aSopenharmony_ci switch (s->compr) { 867cabdff1aSopenharmony_ci case TIFF_RAW: 868cabdff1aSopenharmony_ci if (ssrc + size - src < width) 869cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 870cabdff1aSopenharmony_ci 871cabdff1aSopenharmony_ci if (!s->fill_order) { 872cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 || s->is_bayer), 873cabdff1aSopenharmony_ci dst, 1, src, 0, width, 0); 874cabdff1aSopenharmony_ci } else { 875cabdff1aSopenharmony_ci int i; 876cabdff1aSopenharmony_ci for (i = 0; i < width; i++) 877cabdff1aSopenharmony_ci dst[i] = ff_reverse[src[i]]; 878cabdff1aSopenharmony_ci } 879cabdff1aSopenharmony_ci 880cabdff1aSopenharmony_ci /* Color processing for DNG images with uncompressed strips (non-tiled) */ 881cabdff1aSopenharmony_ci if (is_dng) { 882cabdff1aSopenharmony_ci int is_u16, pixel_size_bytes, pixel_size_bits, elements; 883cabdff1aSopenharmony_ci 884cabdff1aSopenharmony_ci is_u16 = (s->bpp / s->bppcount > 8); 885cabdff1aSopenharmony_ci pixel_size_bits = (is_u16 ? 16 : 8); 886cabdff1aSopenharmony_ci pixel_size_bytes = (is_u16 ? sizeof(uint16_t) : sizeof(uint8_t)); 887cabdff1aSopenharmony_ci 888cabdff1aSopenharmony_ci elements = width / pixel_size_bytes * pixel_size_bits / s->bpp * s->bppcount; // need to account for [1, 16] bpp 889cabdff1aSopenharmony_ci av_assert0 (elements * pixel_size_bytes <= FFABS(stride)); 890cabdff1aSopenharmony_ci dng_blit(s, 891cabdff1aSopenharmony_ci dst, 892cabdff1aSopenharmony_ci 0, // no stride, only 1 line 893cabdff1aSopenharmony_ci dst, 894cabdff1aSopenharmony_ci 0, // no stride, only 1 line 895cabdff1aSopenharmony_ci elements, 896cabdff1aSopenharmony_ci 1, 897cabdff1aSopenharmony_ci 0, // single-component variation is only preset in JPEG-encoded DNGs 898cabdff1aSopenharmony_ci is_u16); 899cabdff1aSopenharmony_ci } 900cabdff1aSopenharmony_ci 901cabdff1aSopenharmony_ci src += width; 902cabdff1aSopenharmony_ci break; 903cabdff1aSopenharmony_ci case TIFF_PACKBITS: 904cabdff1aSopenharmony_ci for (pixels = 0; pixels < width;) { 905cabdff1aSopenharmony_ci if (ssrc + size - src < 2) { 906cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read went out of bounds\n"); 907cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 908cabdff1aSopenharmony_ci } 909cabdff1aSopenharmony_ci code = s->fill_order ? (int8_t) ff_reverse[*src++]: (int8_t) *src++; 910cabdff1aSopenharmony_ci if (code >= 0) { 911cabdff1aSopenharmony_ci code++; 912cabdff1aSopenharmony_ci if (pixels + code > width || 913cabdff1aSopenharmony_ci ssrc + size - src < code) { 914cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 915cabdff1aSopenharmony_ci "Copy went out of bounds\n"); 916cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 917cabdff1aSopenharmony_ci } 918cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8), 919cabdff1aSopenharmony_ci dst, 1, src, 0, code, pixels); 920cabdff1aSopenharmony_ci src += code; 921cabdff1aSopenharmony_ci pixels += code; 922cabdff1aSopenharmony_ci } else if (code != -128) { // -127..-1 923cabdff1aSopenharmony_ci code = (-code) + 1; 924cabdff1aSopenharmony_ci if (pixels + code > width) { 925cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 926cabdff1aSopenharmony_ci "Run went out of bounds\n"); 927cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 928cabdff1aSopenharmony_ci } 929cabdff1aSopenharmony_ci c = *src++; 930cabdff1aSopenharmony_ci horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8), 931cabdff1aSopenharmony_ci dst, 0, NULL, c, code, pixels); 932cabdff1aSopenharmony_ci pixels += code; 933cabdff1aSopenharmony_ci } 934cabdff1aSopenharmony_ci } 935cabdff1aSopenharmony_ci if (s->fill_order) { 936cabdff1aSopenharmony_ci int i; 937cabdff1aSopenharmony_ci for (i = 0; i < width; i++) 938cabdff1aSopenharmony_ci dst[i] = ff_reverse[dst[i]]; 939cabdff1aSopenharmony_ci } 940cabdff1aSopenharmony_ci break; 941cabdff1aSopenharmony_ci } 942cabdff1aSopenharmony_ci if (is_yuv) { 943cabdff1aSopenharmony_ci unpack_yuv(s, p, dst, strip_start + line); 944cabdff1aSopenharmony_ci line += s->subsampling[1] - 1; 945cabdff1aSopenharmony_ci } else if (p->format == AV_PIX_FMT_GRAY12) { 946cabdff1aSopenharmony_ci unpack_gray(s, p, dst, strip_start + line, width, s->bpp); 947cabdff1aSopenharmony_ci } 948cabdff1aSopenharmony_ci dst += stride; 949cabdff1aSopenharmony_ci } 950cabdff1aSopenharmony_ci return 0; 951cabdff1aSopenharmony_ci} 952cabdff1aSopenharmony_ci 953cabdff1aSopenharmony_cistatic int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame, 954cabdff1aSopenharmony_ci const AVPacket *avpkt) 955cabdff1aSopenharmony_ci{ 956cabdff1aSopenharmony_ci TiffContext *s = avctx->priv_data; 957cabdff1aSopenharmony_ci int tile_idx; 958cabdff1aSopenharmony_ci int tile_offset_offset, tile_offset; 959cabdff1aSopenharmony_ci int tile_byte_count_offset, tile_byte_count; 960cabdff1aSopenharmony_ci int tile_count_x, tile_count_y; 961cabdff1aSopenharmony_ci int tile_width, tile_length; 962cabdff1aSopenharmony_ci int has_width_leftover, has_height_leftover; 963cabdff1aSopenharmony_ci int tile_x = 0, tile_y = 0; 964cabdff1aSopenharmony_ci int pos_x = 0, pos_y = 0; 965cabdff1aSopenharmony_ci int ret; 966cabdff1aSopenharmony_ci 967cabdff1aSopenharmony_ci if (s->tile_width <= 0 || s->tile_length <= 0) 968cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_ci has_width_leftover = (s->width % s->tile_width != 0); 971cabdff1aSopenharmony_ci has_height_leftover = (s->height % s->tile_length != 0); 972cabdff1aSopenharmony_ci 973cabdff1aSopenharmony_ci /* Calculate tile counts (round up) */ 974cabdff1aSopenharmony_ci tile_count_x = (s->width + s->tile_width - 1) / s->tile_width; 975cabdff1aSopenharmony_ci tile_count_y = (s->height + s->tile_length - 1) / s->tile_length; 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci /* Iterate over the number of tiles */ 978cabdff1aSopenharmony_ci for (tile_idx = 0; tile_idx < tile_count_x * tile_count_y; tile_idx++) { 979cabdff1aSopenharmony_ci tile_x = tile_idx % tile_count_x; 980cabdff1aSopenharmony_ci tile_y = tile_idx / tile_count_x; 981cabdff1aSopenharmony_ci 982cabdff1aSopenharmony_ci if (has_width_leftover && tile_x == tile_count_x - 1) // If on the right-most tile 983cabdff1aSopenharmony_ci tile_width = s->width % s->tile_width; 984cabdff1aSopenharmony_ci else 985cabdff1aSopenharmony_ci tile_width = s->tile_width; 986cabdff1aSopenharmony_ci 987cabdff1aSopenharmony_ci if (has_height_leftover && tile_y == tile_count_y - 1) // If on the bottom-most tile 988cabdff1aSopenharmony_ci tile_length = s->height % s->tile_length; 989cabdff1aSopenharmony_ci else 990cabdff1aSopenharmony_ci tile_length = s->tile_length; 991cabdff1aSopenharmony_ci 992cabdff1aSopenharmony_ci /* Read tile offset */ 993cabdff1aSopenharmony_ci tile_offset_offset = s->tile_offsets_offset + tile_idx * sizeof(int); 994cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, tile_offset_offset, SEEK_SET); 995cabdff1aSopenharmony_ci tile_offset = ff_tget_long(&s->gb, s->le); 996cabdff1aSopenharmony_ci 997cabdff1aSopenharmony_ci /* Read tile byte size */ 998cabdff1aSopenharmony_ci tile_byte_count_offset = s->tile_byte_counts_offset + tile_idx * sizeof(int); 999cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, tile_byte_count_offset, SEEK_SET); 1000cabdff1aSopenharmony_ci tile_byte_count = ff_tget_long(&s->gb, s->le); 1001cabdff1aSopenharmony_ci 1002cabdff1aSopenharmony_ci /* Seek to tile data */ 1003cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, tile_offset, SEEK_SET); 1004cabdff1aSopenharmony_ci 1005cabdff1aSopenharmony_ci /* Decode JPEG tile and copy it in the reference frame */ 1006cabdff1aSopenharmony_ci ret = dng_decode_jpeg(avctx, frame, tile_byte_count, pos_x, pos_y, tile_width, tile_length); 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci if (ret < 0) 1009cabdff1aSopenharmony_ci return ret; 1010cabdff1aSopenharmony_ci 1011cabdff1aSopenharmony_ci /* Advance current positions */ 1012cabdff1aSopenharmony_ci pos_x += tile_width; 1013cabdff1aSopenharmony_ci if (tile_x == tile_count_x - 1) { // If on the right edge 1014cabdff1aSopenharmony_ci pos_x = 0; 1015cabdff1aSopenharmony_ci pos_y += tile_length; 1016cabdff1aSopenharmony_ci } 1017cabdff1aSopenharmony_ci } 1018cabdff1aSopenharmony_ci 1019cabdff1aSopenharmony_ci /* Frame is ready to be output */ 1020cabdff1aSopenharmony_ci frame->pict_type = AV_PICTURE_TYPE_I; 1021cabdff1aSopenharmony_ci frame->key_frame = 1; 1022cabdff1aSopenharmony_ci 1023cabdff1aSopenharmony_ci return avpkt->size; 1024cabdff1aSopenharmony_ci} 1025cabdff1aSopenharmony_ci 1026cabdff1aSopenharmony_cistatic int init_image(TiffContext *s, AVFrame *frame) 1027cabdff1aSopenharmony_ci{ 1028cabdff1aSopenharmony_ci int ret; 1029cabdff1aSopenharmony_ci int create_gray_palette = 0; 1030cabdff1aSopenharmony_ci 1031cabdff1aSopenharmony_ci // make sure there is no aliasing in the following switch 1032cabdff1aSopenharmony_ci if (s->bpp >= 100 || s->bppcount >= 10) { 1033cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1034cabdff1aSopenharmony_ci "Unsupported image parameters: bpp=%d, bppcount=%d\n", 1035cabdff1aSopenharmony_ci s->bpp, s->bppcount); 1036cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1037cabdff1aSopenharmony_ci } 1038cabdff1aSopenharmony_ci 1039cabdff1aSopenharmony_ci switch (s->planar * 1000 + s->bpp * 10 + s->bppcount + s->is_bayer * 10000) { 1040cabdff1aSopenharmony_ci case 11: 1041cabdff1aSopenharmony_ci if (!s->palette_is_set) { 1042cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_MONOBLACK; 1043cabdff1aSopenharmony_ci break; 1044cabdff1aSopenharmony_ci } 1045cabdff1aSopenharmony_ci case 21: 1046cabdff1aSopenharmony_ci case 41: 1047cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_PAL8; 1048cabdff1aSopenharmony_ci if (!s->palette_is_set) { 1049cabdff1aSopenharmony_ci create_gray_palette = 1; 1050cabdff1aSopenharmony_ci } 1051cabdff1aSopenharmony_ci break; 1052cabdff1aSopenharmony_ci case 81: 1053cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->palette_is_set ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8; 1054cabdff1aSopenharmony_ci break; 1055cabdff1aSopenharmony_ci case 121: 1056cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_GRAY12; 1057cabdff1aSopenharmony_ci break; 1058cabdff1aSopenharmony_ci case 10081: 1059cabdff1aSopenharmony_ci switch (AV_RL32(s->pattern)) { 1060cabdff1aSopenharmony_ci case 0x02010100: 1061cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB8; 1062cabdff1aSopenharmony_ci break; 1063cabdff1aSopenharmony_ci case 0x00010102: 1064cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR8; 1065cabdff1aSopenharmony_ci break; 1066cabdff1aSopenharmony_ci case 0x01000201: 1067cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG8; 1068cabdff1aSopenharmony_ci break; 1069cabdff1aSopenharmony_ci case 0x01020001: 1070cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG8; 1071cabdff1aSopenharmony_ci break; 1072cabdff1aSopenharmony_ci default: 1073cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n", 1074cabdff1aSopenharmony_ci AV_RL32(s->pattern)); 1075cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1076cabdff1aSopenharmony_ci } 1077cabdff1aSopenharmony_ci break; 1078cabdff1aSopenharmony_ci case 10101: 1079cabdff1aSopenharmony_ci case 10121: 1080cabdff1aSopenharmony_ci case 10141: 1081cabdff1aSopenharmony_ci case 10161: 1082cabdff1aSopenharmony_ci switch (AV_RL32(s->pattern)) { 1083cabdff1aSopenharmony_ci case 0x02010100: 1084cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB16; 1085cabdff1aSopenharmony_ci break; 1086cabdff1aSopenharmony_ci case 0x00010102: 1087cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR16; 1088cabdff1aSopenharmony_ci break; 1089cabdff1aSopenharmony_ci case 0x01000201: 1090cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG16; 1091cabdff1aSopenharmony_ci break; 1092cabdff1aSopenharmony_ci case 0x01020001: 1093cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG16; 1094cabdff1aSopenharmony_ci break; 1095cabdff1aSopenharmony_ci default: 1096cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n", 1097cabdff1aSopenharmony_ci AV_RL32(s->pattern)); 1098cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1099cabdff1aSopenharmony_ci } 1100cabdff1aSopenharmony_ci break; 1101cabdff1aSopenharmony_ci case 243: 1102cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) { 1103cabdff1aSopenharmony_ci if (s->subsampling[0] == 1 && s->subsampling[1] == 1) { 1104cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YUV444P; 1105cabdff1aSopenharmony_ci } else if (s->subsampling[0] == 2 && s->subsampling[1] == 1) { 1106cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YUV422P; 1107cabdff1aSopenharmony_ci } else if (s->subsampling[0] == 4 && s->subsampling[1] == 1) { 1108cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YUV411P; 1109cabdff1aSopenharmony_ci } else if (s->subsampling[0] == 1 && s->subsampling[1] == 2) { 1110cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YUV440P; 1111cabdff1aSopenharmony_ci } else if (s->subsampling[0] == 2 && s->subsampling[1] == 2) { 1112cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YUV420P; 1113cabdff1aSopenharmony_ci } else if (s->subsampling[0] == 4 && s->subsampling[1] == 4) { 1114cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YUV410P; 1115cabdff1aSopenharmony_ci } else { 1116cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported YCbCr subsampling\n"); 1117cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1118cabdff1aSopenharmony_ci } 1119cabdff1aSopenharmony_ci } else 1120cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_RGB24; 1121cabdff1aSopenharmony_ci break; 1122cabdff1aSopenharmony_ci case 161: 1123cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GRAY16LE : AV_PIX_FMT_GRAY16BE; 1124cabdff1aSopenharmony_ci break; 1125cabdff1aSopenharmony_ci case 162: 1126cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_YA8; 1127cabdff1aSopenharmony_ci break; 1128cabdff1aSopenharmony_ci case 322: 1129cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->le ? AV_PIX_FMT_YA16LE : AV_PIX_FMT_YA16BE; 1130cabdff1aSopenharmony_ci break; 1131cabdff1aSopenharmony_ci case 324: 1132cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->photometric == TIFF_PHOTOMETRIC_SEPARATED ? AV_PIX_FMT_RGB0 : AV_PIX_FMT_RGBA; 1133cabdff1aSopenharmony_ci break; 1134cabdff1aSopenharmony_ci case 405: 1135cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED) 1136cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_RGBA; 1137cabdff1aSopenharmony_ci else { 1138cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1139cabdff1aSopenharmony_ci "bpp=40 without PHOTOMETRIC_SEPARATED is unsupported\n"); 1140cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1141cabdff1aSopenharmony_ci } 1142cabdff1aSopenharmony_ci break; 1143cabdff1aSopenharmony_ci case 483: 1144cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGB48LE : AV_PIX_FMT_RGB48BE; 1145cabdff1aSopenharmony_ci break; 1146cabdff1aSopenharmony_ci case 644: 1147cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGBA64LE : AV_PIX_FMT_RGBA64BE; 1148cabdff1aSopenharmony_ci break; 1149cabdff1aSopenharmony_ci case 1243: 1150cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_GBRP; 1151cabdff1aSopenharmony_ci break; 1152cabdff1aSopenharmony_ci case 1324: 1153cabdff1aSopenharmony_ci s->avctx->pix_fmt = AV_PIX_FMT_GBRAP; 1154cabdff1aSopenharmony_ci break; 1155cabdff1aSopenharmony_ci case 1483: 1156cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRP16LE : AV_PIX_FMT_GBRP16BE; 1157cabdff1aSopenharmony_ci break; 1158cabdff1aSopenharmony_ci case 1644: 1159cabdff1aSopenharmony_ci s->avctx->pix_fmt = s->le ? AV_PIX_FMT_GBRAP16LE : AV_PIX_FMT_GBRAP16BE; 1160cabdff1aSopenharmony_ci break; 1161cabdff1aSopenharmony_ci default: 1162cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1163cabdff1aSopenharmony_ci "This format is not supported (bpp=%d, bppcount=%d)\n", 1164cabdff1aSopenharmony_ci s->bpp, s->bppcount); 1165cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1166cabdff1aSopenharmony_ci } 1167cabdff1aSopenharmony_ci 1168cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) { 1169cabdff1aSopenharmony_ci const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt); 1170cabdff1aSopenharmony_ci if((desc->flags & AV_PIX_FMT_FLAG_RGB) || 1171cabdff1aSopenharmony_ci !(desc->flags & AV_PIX_FMT_FLAG_PLANAR) || 1172cabdff1aSopenharmony_ci desc->nb_components < 3) { 1173cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported YCbCr variant\n"); 1174cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1175cabdff1aSopenharmony_ci } 1176cabdff1aSopenharmony_ci } 1177cabdff1aSopenharmony_ci 1178cabdff1aSopenharmony_ci if (s->width != s->avctx->width || s->height != s->avctx->height) { 1179cabdff1aSopenharmony_ci ret = ff_set_dimensions(s->avctx, s->width, s->height); 1180cabdff1aSopenharmony_ci if (ret < 0) 1181cabdff1aSopenharmony_ci return ret; 1182cabdff1aSopenharmony_ci } 1183cabdff1aSopenharmony_ci if ((ret = ff_thread_get_buffer(s->avctx, frame, 0)) < 0) 1184cabdff1aSopenharmony_ci return ret; 1185cabdff1aSopenharmony_ci if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) { 1186cabdff1aSopenharmony_ci if (!create_gray_palette) 1187cabdff1aSopenharmony_ci memcpy(frame->data[1], s->palette, sizeof(s->palette)); 1188cabdff1aSopenharmony_ci else { 1189cabdff1aSopenharmony_ci /* make default grayscale pal */ 1190cabdff1aSopenharmony_ci int i; 1191cabdff1aSopenharmony_ci uint32_t *pal = (uint32_t *)frame->data[1]; 1192cabdff1aSopenharmony_ci for (i = 0; i < 1<<s->bpp; i++) 1193cabdff1aSopenharmony_ci pal[i] = 0xFFU << 24 | i * 255 / ((1<<s->bpp) - 1) * 0x010101; 1194cabdff1aSopenharmony_ci } 1195cabdff1aSopenharmony_ci } 1196cabdff1aSopenharmony_ci return 0; 1197cabdff1aSopenharmony_ci} 1198cabdff1aSopenharmony_ci 1199cabdff1aSopenharmony_cistatic void set_sar(TiffContext *s, unsigned tag, unsigned num, unsigned den) 1200cabdff1aSopenharmony_ci{ 1201cabdff1aSopenharmony_ci int offset = tag == TIFF_YRES ? 2 : 0; 1202cabdff1aSopenharmony_ci s->res[offset++] = num; 1203cabdff1aSopenharmony_ci s->res[offset] = den; 1204cabdff1aSopenharmony_ci if (s->res[0] && s->res[1] && s->res[2] && s->res[3]) { 1205cabdff1aSopenharmony_ci uint64_t num = s->res[2] * (uint64_t)s->res[1]; 1206cabdff1aSopenharmony_ci uint64_t den = s->res[0] * (uint64_t)s->res[3]; 1207cabdff1aSopenharmony_ci if (num > INT64_MAX || den > INT64_MAX) { 1208cabdff1aSopenharmony_ci num = num >> 1; 1209cabdff1aSopenharmony_ci den = den >> 1; 1210cabdff1aSopenharmony_ci } 1211cabdff1aSopenharmony_ci av_reduce(&s->avctx->sample_aspect_ratio.num, &s->avctx->sample_aspect_ratio.den, 1212cabdff1aSopenharmony_ci num, den, INT32_MAX); 1213cabdff1aSopenharmony_ci if (!s->avctx->sample_aspect_ratio.den) 1214cabdff1aSopenharmony_ci s->avctx->sample_aspect_ratio = (AVRational) {0, 1}; 1215cabdff1aSopenharmony_ci } 1216cabdff1aSopenharmony_ci} 1217cabdff1aSopenharmony_ci 1218cabdff1aSopenharmony_cistatic int tiff_decode_tag(TiffContext *s, AVFrame *frame) 1219cabdff1aSopenharmony_ci{ 1220cabdff1aSopenharmony_ci AVFrameSideData *sd; 1221cabdff1aSopenharmony_ci GetByteContext gb_temp; 1222cabdff1aSopenharmony_ci unsigned tag, type, count, off, value = 0, value2 = 1; // value2 is a denominator so init. to 1 1223cabdff1aSopenharmony_ci int i, start; 1224cabdff1aSopenharmony_ci int pos; 1225cabdff1aSopenharmony_ci int ret; 1226cabdff1aSopenharmony_ci double *dp; 1227cabdff1aSopenharmony_ci 1228cabdff1aSopenharmony_ci ret = ff_tread_tag(&s->gb, s->le, &tag, &type, &count, &start); 1229cabdff1aSopenharmony_ci if (ret < 0) { 1230cabdff1aSopenharmony_ci goto end; 1231cabdff1aSopenharmony_ci } 1232cabdff1aSopenharmony_ci if (tag <= s->last_tag) 1233cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1234cabdff1aSopenharmony_ci 1235cabdff1aSopenharmony_ci // We ignore TIFF_STRIP_SIZE as it is sometimes in the logic but wrong order around TIFF_STRIP_OFFS 1236cabdff1aSopenharmony_ci if (tag != TIFF_STRIP_SIZE) 1237cabdff1aSopenharmony_ci s->last_tag = tag; 1238cabdff1aSopenharmony_ci 1239cabdff1aSopenharmony_ci off = bytestream2_tell(&s->gb); 1240cabdff1aSopenharmony_ci if (count == 1) { 1241cabdff1aSopenharmony_ci switch (type) { 1242cabdff1aSopenharmony_ci case TIFF_BYTE: 1243cabdff1aSopenharmony_ci case TIFF_SHORT: 1244cabdff1aSopenharmony_ci case TIFF_LONG: 1245cabdff1aSopenharmony_ci value = ff_tget(&s->gb, type, s->le); 1246cabdff1aSopenharmony_ci break; 1247cabdff1aSopenharmony_ci case TIFF_RATIONAL: 1248cabdff1aSopenharmony_ci value = ff_tget(&s->gb, TIFF_LONG, s->le); 1249cabdff1aSopenharmony_ci value2 = ff_tget(&s->gb, TIFF_LONG, s->le); 1250cabdff1aSopenharmony_ci if (!value2) { 1251cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Invalid denominator in rational\n"); 1252cabdff1aSopenharmony_ci value2 = 1; 1253cabdff1aSopenharmony_ci } 1254cabdff1aSopenharmony_ci 1255cabdff1aSopenharmony_ci break; 1256cabdff1aSopenharmony_ci case TIFF_STRING: 1257cabdff1aSopenharmony_ci if (count <= 4) { 1258cabdff1aSopenharmony_ci break; 1259cabdff1aSopenharmony_ci } 1260cabdff1aSopenharmony_ci default: 1261cabdff1aSopenharmony_ci value = UINT_MAX; 1262cabdff1aSopenharmony_ci } 1263cabdff1aSopenharmony_ci } 1264cabdff1aSopenharmony_ci 1265cabdff1aSopenharmony_ci switch (tag) { 1266cabdff1aSopenharmony_ci case TIFF_SUBFILE: 1267cabdff1aSopenharmony_ci s->is_thumbnail = (value != 0); 1268cabdff1aSopenharmony_ci break; 1269cabdff1aSopenharmony_ci case TIFF_WIDTH: 1270cabdff1aSopenharmony_ci if (value > INT_MAX) 1271cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1272cabdff1aSopenharmony_ci s->width = value; 1273cabdff1aSopenharmony_ci break; 1274cabdff1aSopenharmony_ci case TIFF_HEIGHT: 1275cabdff1aSopenharmony_ci if (value > INT_MAX) 1276cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1277cabdff1aSopenharmony_ci s->height = value; 1278cabdff1aSopenharmony_ci break; 1279cabdff1aSopenharmony_ci case TIFF_BPP: 1280cabdff1aSopenharmony_ci if (count > 5 || count <= 0) { 1281cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1282cabdff1aSopenharmony_ci "This format is not supported (bpp=%d, %d components)\n", 1283cabdff1aSopenharmony_ci value, count); 1284cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1285cabdff1aSopenharmony_ci } 1286cabdff1aSopenharmony_ci s->bppcount = count; 1287cabdff1aSopenharmony_ci if (count == 1) 1288cabdff1aSopenharmony_ci s->bpp = value; 1289cabdff1aSopenharmony_ci else { 1290cabdff1aSopenharmony_ci switch (type) { 1291cabdff1aSopenharmony_ci case TIFF_BYTE: 1292cabdff1aSopenharmony_ci case TIFF_SHORT: 1293cabdff1aSopenharmony_ci case TIFF_LONG: 1294cabdff1aSopenharmony_ci s->bpp = 0; 1295cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(&s->gb) < type_sizes[type] * count) 1296cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1297cabdff1aSopenharmony_ci for (i = 0; i < count; i++) 1298cabdff1aSopenharmony_ci s->bpp += ff_tget(&s->gb, type, s->le); 1299cabdff1aSopenharmony_ci break; 1300cabdff1aSopenharmony_ci default: 1301cabdff1aSopenharmony_ci s->bpp = -1; 1302cabdff1aSopenharmony_ci } 1303cabdff1aSopenharmony_ci } 1304cabdff1aSopenharmony_ci break; 1305cabdff1aSopenharmony_ci case TIFF_SAMPLES_PER_PIXEL: 1306cabdff1aSopenharmony_ci if (count != 1) { 1307cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1308cabdff1aSopenharmony_ci "Samples per pixel requires a single value, many provided\n"); 1309cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1310cabdff1aSopenharmony_ci } 1311cabdff1aSopenharmony_ci if (value > 5 || value <= 0) { 1312cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1313cabdff1aSopenharmony_ci "Invalid samples per pixel %d\n", value); 1314cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1315cabdff1aSopenharmony_ci } 1316cabdff1aSopenharmony_ci if (s->bppcount == 1) 1317cabdff1aSopenharmony_ci s->bpp *= value; 1318cabdff1aSopenharmony_ci s->bppcount = value; 1319cabdff1aSopenharmony_ci break; 1320cabdff1aSopenharmony_ci case TIFF_COMPR: 1321cabdff1aSopenharmony_ci s->compr = value; 1322cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "compression: %d\n", s->compr); 1323cabdff1aSopenharmony_ci s->predictor = 0; 1324cabdff1aSopenharmony_ci switch (s->compr) { 1325cabdff1aSopenharmony_ci case TIFF_RAW: 1326cabdff1aSopenharmony_ci case TIFF_PACKBITS: 1327cabdff1aSopenharmony_ci case TIFF_LZW: 1328cabdff1aSopenharmony_ci case TIFF_CCITT_RLE: 1329cabdff1aSopenharmony_ci break; 1330cabdff1aSopenharmony_ci case TIFF_G3: 1331cabdff1aSopenharmony_ci case TIFF_G4: 1332cabdff1aSopenharmony_ci s->fax_opts = 0; 1333cabdff1aSopenharmony_ci break; 1334cabdff1aSopenharmony_ci case TIFF_DEFLATE: 1335cabdff1aSopenharmony_ci case TIFF_ADOBE_DEFLATE: 1336cabdff1aSopenharmony_ci#if CONFIG_ZLIB 1337cabdff1aSopenharmony_ci break; 1338cabdff1aSopenharmony_ci#else 1339cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n"); 1340cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 1341cabdff1aSopenharmony_ci#endif 1342cabdff1aSopenharmony_ci case TIFF_JPEG: 1343cabdff1aSopenharmony_ci case TIFF_NEWJPEG: 1344cabdff1aSopenharmony_ci s->is_jpeg = 1; 1345cabdff1aSopenharmony_ci break; 1346cabdff1aSopenharmony_ci case TIFF_LZMA: 1347cabdff1aSopenharmony_ci#if CONFIG_LZMA 1348cabdff1aSopenharmony_ci break; 1349cabdff1aSopenharmony_ci#else 1350cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "LZMA not compiled in\n"); 1351cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 1352cabdff1aSopenharmony_ci#endif 1353cabdff1aSopenharmony_ci default: 1354cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n", 1355cabdff1aSopenharmony_ci s->compr); 1356cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1357cabdff1aSopenharmony_ci } 1358cabdff1aSopenharmony_ci break; 1359cabdff1aSopenharmony_ci case TIFF_ROWSPERSTRIP: 1360cabdff1aSopenharmony_ci if (!value || (type == TIFF_LONG && value == UINT_MAX)) 1361cabdff1aSopenharmony_ci value = s->height; 1362cabdff1aSopenharmony_ci s->rps = FFMIN(value, s->height); 1363cabdff1aSopenharmony_ci break; 1364cabdff1aSopenharmony_ci case TIFF_STRIP_OFFS: 1365cabdff1aSopenharmony_ci if (count == 1) { 1366cabdff1aSopenharmony_ci if (value > INT_MAX) { 1367cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1368cabdff1aSopenharmony_ci "strippos %u too large\n", value); 1369cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1370cabdff1aSopenharmony_ci } 1371cabdff1aSopenharmony_ci s->strippos = 0; 1372cabdff1aSopenharmony_ci s->stripoff = value; 1373cabdff1aSopenharmony_ci } else 1374cabdff1aSopenharmony_ci s->strippos = off; 1375cabdff1aSopenharmony_ci s->strips = count; 1376cabdff1aSopenharmony_ci if (s->strips == 1) 1377cabdff1aSopenharmony_ci s->rps = s->height; 1378cabdff1aSopenharmony_ci s->sot = type; 1379cabdff1aSopenharmony_ci break; 1380cabdff1aSopenharmony_ci case TIFF_STRIP_SIZE: 1381cabdff1aSopenharmony_ci if (count == 1) { 1382cabdff1aSopenharmony_ci if (value > INT_MAX) { 1383cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1384cabdff1aSopenharmony_ci "stripsize %u too large\n", value); 1385cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1386cabdff1aSopenharmony_ci } 1387cabdff1aSopenharmony_ci s->stripsizesoff = 0; 1388cabdff1aSopenharmony_ci s->stripsize = value; 1389cabdff1aSopenharmony_ci s->strips = 1; 1390cabdff1aSopenharmony_ci } else { 1391cabdff1aSopenharmony_ci s->stripsizesoff = off; 1392cabdff1aSopenharmony_ci } 1393cabdff1aSopenharmony_ci s->strips = count; 1394cabdff1aSopenharmony_ci s->sstype = type; 1395cabdff1aSopenharmony_ci break; 1396cabdff1aSopenharmony_ci case TIFF_XRES: 1397cabdff1aSopenharmony_ci case TIFF_YRES: 1398cabdff1aSopenharmony_ci set_sar(s, tag, value, value2); 1399cabdff1aSopenharmony_ci break; 1400cabdff1aSopenharmony_ci case TIFF_TILE_OFFSETS: 1401cabdff1aSopenharmony_ci s->tile_offsets_offset = off; 1402cabdff1aSopenharmony_ci s->is_tiled = 1; 1403cabdff1aSopenharmony_ci break; 1404cabdff1aSopenharmony_ci case TIFF_TILE_BYTE_COUNTS: 1405cabdff1aSopenharmony_ci s->tile_byte_counts_offset = off; 1406cabdff1aSopenharmony_ci break; 1407cabdff1aSopenharmony_ci case TIFF_TILE_LENGTH: 1408cabdff1aSopenharmony_ci if (value > INT_MAX) 1409cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1410cabdff1aSopenharmony_ci s->tile_length = value; 1411cabdff1aSopenharmony_ci break; 1412cabdff1aSopenharmony_ci case TIFF_TILE_WIDTH: 1413cabdff1aSopenharmony_ci if (value > INT_MAX) 1414cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1415cabdff1aSopenharmony_ci s->tile_width = value; 1416cabdff1aSopenharmony_ci break; 1417cabdff1aSopenharmony_ci case TIFF_PREDICTOR: 1418cabdff1aSopenharmony_ci if (value > INT_MAX) 1419cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1420cabdff1aSopenharmony_ci s->predictor = value; 1421cabdff1aSopenharmony_ci break; 1422cabdff1aSopenharmony_ci case TIFF_SUB_IFDS: 1423cabdff1aSopenharmony_ci if (count == 1) 1424cabdff1aSopenharmony_ci s->sub_ifd = value; 1425cabdff1aSopenharmony_ci else if (count > 1) 1426cabdff1aSopenharmony_ci s->sub_ifd = ff_tget(&s->gb, TIFF_LONG, s->le); /** Only get the first SubIFD */ 1427cabdff1aSopenharmony_ci break; 1428cabdff1aSopenharmony_ci case DNG_LINEARIZATION_TABLE: 1429cabdff1aSopenharmony_ci if (count < 1 || count > FF_ARRAY_ELEMS(s->dng_lut)) 1430cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1431cabdff1aSopenharmony_ci for (int i = 0; i < count; i++) 1432cabdff1aSopenharmony_ci s->dng_lut[i] = ff_tget(&s->gb, type, s->le); 1433cabdff1aSopenharmony_ci break; 1434cabdff1aSopenharmony_ci case DNG_BLACK_LEVEL: 1435cabdff1aSopenharmony_ci if (count > 1) { /* Use the first value in the pattern (assume they're all the same) */ 1436cabdff1aSopenharmony_ci if (type == TIFF_RATIONAL) { 1437cabdff1aSopenharmony_ci value = ff_tget(&s->gb, TIFF_LONG, s->le); 1438cabdff1aSopenharmony_ci value2 = ff_tget(&s->gb, TIFF_LONG, s->le); 1439cabdff1aSopenharmony_ci if (!value2) { 1440cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Invalid black level denominator\n"); 1441cabdff1aSopenharmony_ci value2 = 1; 1442cabdff1aSopenharmony_ci } 1443cabdff1aSopenharmony_ci 1444cabdff1aSopenharmony_ci s->black_level = value / value2; 1445cabdff1aSopenharmony_ci } else 1446cabdff1aSopenharmony_ci s->black_level = ff_tget(&s->gb, type, s->le); 1447cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Assuming black level pattern values are identical\n"); 1448cabdff1aSopenharmony_ci } else { 1449cabdff1aSopenharmony_ci s->black_level = value / value2; 1450cabdff1aSopenharmony_ci } 1451cabdff1aSopenharmony_ci break; 1452cabdff1aSopenharmony_ci case DNG_WHITE_LEVEL: 1453cabdff1aSopenharmony_ci s->white_level = value; 1454cabdff1aSopenharmony_ci break; 1455cabdff1aSopenharmony_ci case TIFF_CFA_PATTERN_DIM: 1456cabdff1aSopenharmony_ci if (count != 2 || (ff_tget(&s->gb, type, s->le) != 2 && 1457cabdff1aSopenharmony_ci ff_tget(&s->gb, type, s->le) != 2)) { 1458cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "CFA Pattern dimensions are not 2x2\n"); 1459cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1460cabdff1aSopenharmony_ci } 1461cabdff1aSopenharmony_ci break; 1462cabdff1aSopenharmony_ci case TIFF_CFA_PATTERN: 1463cabdff1aSopenharmony_ci s->is_bayer = 1; 1464cabdff1aSopenharmony_ci s->pattern[0] = ff_tget(&s->gb, type, s->le); 1465cabdff1aSopenharmony_ci s->pattern[1] = ff_tget(&s->gb, type, s->le); 1466cabdff1aSopenharmony_ci s->pattern[2] = ff_tget(&s->gb, type, s->le); 1467cabdff1aSopenharmony_ci s->pattern[3] = ff_tget(&s->gb, type, s->le); 1468cabdff1aSopenharmony_ci break; 1469cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC: 1470cabdff1aSopenharmony_ci switch (value) { 1471cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_WHITE_IS_ZERO: 1472cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_BLACK_IS_ZERO: 1473cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_RGB: 1474cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_PALETTE: 1475cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_SEPARATED: 1476cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_YCBCR: 1477cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_CFA: 1478cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_LINEAR_RAW: // Used by DNG images 1479cabdff1aSopenharmony_ci s->photometric = value; 1480cabdff1aSopenharmony_ci break; 1481cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_ALPHA_MASK: 1482cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_CIE_LAB: 1483cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_ICC_LAB: 1484cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_ITU_LAB: 1485cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_LOG_L: 1486cabdff1aSopenharmony_ci case TIFF_PHOTOMETRIC_LOG_LUV: 1487cabdff1aSopenharmony_ci avpriv_report_missing_feature(s->avctx, 1488cabdff1aSopenharmony_ci "PhotometricInterpretation 0x%04X", 1489cabdff1aSopenharmony_ci value); 1490cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1491cabdff1aSopenharmony_ci default: 1492cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "PhotometricInterpretation %u is " 1493cabdff1aSopenharmony_ci "unknown\n", value); 1494cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1495cabdff1aSopenharmony_ci } 1496cabdff1aSopenharmony_ci break; 1497cabdff1aSopenharmony_ci case TIFF_FILL_ORDER: 1498cabdff1aSopenharmony_ci if (value < 1 || value > 2) { 1499cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1500cabdff1aSopenharmony_ci "Unknown FillOrder value %d, trying default one\n", value); 1501cabdff1aSopenharmony_ci value = 1; 1502cabdff1aSopenharmony_ci } 1503cabdff1aSopenharmony_ci s->fill_order = value - 1; 1504cabdff1aSopenharmony_ci break; 1505cabdff1aSopenharmony_ci case TIFF_PAL: { 1506cabdff1aSopenharmony_ci GetByteContext pal_gb[3]; 1507cabdff1aSopenharmony_ci off = type_sizes[type]; 1508cabdff1aSopenharmony_ci if (count / 3 > 256 || 1509cabdff1aSopenharmony_ci bytestream2_get_bytes_left(&s->gb) < count / 3 * off * 3) 1510cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1511cabdff1aSopenharmony_ci 1512cabdff1aSopenharmony_ci pal_gb[0] = pal_gb[1] = pal_gb[2] = s->gb; 1513cabdff1aSopenharmony_ci bytestream2_skip(&pal_gb[1], count / 3 * off); 1514cabdff1aSopenharmony_ci bytestream2_skip(&pal_gb[2], count / 3 * off * 2); 1515cabdff1aSopenharmony_ci 1516cabdff1aSopenharmony_ci off = (type_sizes[type] - 1) << 3; 1517cabdff1aSopenharmony_ci if (off > 31U) { 1518cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "palette shift %d is out of range\n", off); 1519cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1520cabdff1aSopenharmony_ci } 1521cabdff1aSopenharmony_ci 1522cabdff1aSopenharmony_ci for (i = 0; i < count / 3; i++) { 1523cabdff1aSopenharmony_ci uint32_t p = 0xFF000000; 1524cabdff1aSopenharmony_ci p |= (ff_tget(&pal_gb[0], type, s->le) >> off) << 16; 1525cabdff1aSopenharmony_ci p |= (ff_tget(&pal_gb[1], type, s->le) >> off) << 8; 1526cabdff1aSopenharmony_ci p |= ff_tget(&pal_gb[2], type, s->le) >> off; 1527cabdff1aSopenharmony_ci s->palette[i] = p; 1528cabdff1aSopenharmony_ci } 1529cabdff1aSopenharmony_ci s->palette_is_set = 1; 1530cabdff1aSopenharmony_ci break; 1531cabdff1aSopenharmony_ci } 1532cabdff1aSopenharmony_ci case TIFF_PLANAR: 1533cabdff1aSopenharmony_ci s->planar = value == 2; 1534cabdff1aSopenharmony_ci break; 1535cabdff1aSopenharmony_ci case TIFF_YCBCR_SUBSAMPLING: 1536cabdff1aSopenharmony_ci if (count != 2) { 1537cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "subsample count invalid\n"); 1538cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1539cabdff1aSopenharmony_ci } 1540cabdff1aSopenharmony_ci for (i = 0; i < count; i++) { 1541cabdff1aSopenharmony_ci s->subsampling[i] = ff_tget(&s->gb, type, s->le); 1542cabdff1aSopenharmony_ci if (s->subsampling[i] <= 0) { 1543cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "subsampling %d is invalid\n", s->subsampling[i]); 1544cabdff1aSopenharmony_ci s->subsampling[i] = 1; 1545cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1546cabdff1aSopenharmony_ci } 1547cabdff1aSopenharmony_ci } 1548cabdff1aSopenharmony_ci break; 1549cabdff1aSopenharmony_ci case TIFF_T4OPTIONS: 1550cabdff1aSopenharmony_ci if (s->compr == TIFF_G3) { 1551cabdff1aSopenharmony_ci if (value > INT_MAX) 1552cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1553cabdff1aSopenharmony_ci s->fax_opts = value; 1554cabdff1aSopenharmony_ci } 1555cabdff1aSopenharmony_ci break; 1556cabdff1aSopenharmony_ci case TIFF_T6OPTIONS: 1557cabdff1aSopenharmony_ci if (s->compr == TIFF_G4) { 1558cabdff1aSopenharmony_ci if (value > INT_MAX) 1559cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1560cabdff1aSopenharmony_ci s->fax_opts = value; 1561cabdff1aSopenharmony_ci } 1562cabdff1aSopenharmony_ci break; 1563cabdff1aSopenharmony_ci#define ADD_METADATA(count, name, sep)\ 1564cabdff1aSopenharmony_ci if ((ret = add_metadata(count, type, name, sep, s, frame)) < 0) {\ 1565cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");\ 1566cabdff1aSopenharmony_ci goto end;\ 1567cabdff1aSopenharmony_ci } 1568cabdff1aSopenharmony_ci case TIFF_MODEL_PIXEL_SCALE: 1569cabdff1aSopenharmony_ci ADD_METADATA(count, "ModelPixelScaleTag", NULL); 1570cabdff1aSopenharmony_ci break; 1571cabdff1aSopenharmony_ci case TIFF_MODEL_TRANSFORMATION: 1572cabdff1aSopenharmony_ci ADD_METADATA(count, "ModelTransformationTag", NULL); 1573cabdff1aSopenharmony_ci break; 1574cabdff1aSopenharmony_ci case TIFF_MODEL_TIEPOINT: 1575cabdff1aSopenharmony_ci ADD_METADATA(count, "ModelTiepointTag", NULL); 1576cabdff1aSopenharmony_ci break; 1577cabdff1aSopenharmony_ci case TIFF_GEO_KEY_DIRECTORY: 1578cabdff1aSopenharmony_ci if (s->geotag_count) { 1579cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Multiple geo key directories"); 1580cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1581cabdff1aSopenharmony_ci } 1582cabdff1aSopenharmony_ci ADD_METADATA(1, "GeoTIFF_Version", NULL); 1583cabdff1aSopenharmony_ci ADD_METADATA(2, "GeoTIFF_Key_Revision", "."); 1584cabdff1aSopenharmony_ci s->geotag_count = ff_tget_short(&s->gb, s->le); 1585cabdff1aSopenharmony_ci if (s->geotag_count > count / 4 - 1) { 1586cabdff1aSopenharmony_ci s->geotag_count = count / 4 - 1; 1587cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "GeoTIFF key directory buffer shorter than specified\n"); 1588cabdff1aSopenharmony_ci } 1589cabdff1aSopenharmony_ci if ( bytestream2_get_bytes_left(&s->gb) < s->geotag_count * sizeof(int16_t) * 4 1590cabdff1aSopenharmony_ci || s->geotag_count == 0) { 1591cabdff1aSopenharmony_ci s->geotag_count = 0; 1592cabdff1aSopenharmony_ci return -1; 1593cabdff1aSopenharmony_ci } 1594cabdff1aSopenharmony_ci s->geotags = av_calloc(s->geotag_count, sizeof(*s->geotags)); 1595cabdff1aSopenharmony_ci if (!s->geotags) { 1596cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n"); 1597cabdff1aSopenharmony_ci s->geotag_count = 0; 1598cabdff1aSopenharmony_ci goto end; 1599cabdff1aSopenharmony_ci } 1600cabdff1aSopenharmony_ci for (i = 0; i < s->geotag_count; i++) { 1601cabdff1aSopenharmony_ci s->geotags[i].key = ff_tget_short(&s->gb, s->le); 1602cabdff1aSopenharmony_ci s->geotags[i].type = ff_tget_short(&s->gb, s->le); 1603cabdff1aSopenharmony_ci s->geotags[i].count = ff_tget_short(&s->gb, s->le); 1604cabdff1aSopenharmony_ci 1605cabdff1aSopenharmony_ci if (!s->geotags[i].type) 1606cabdff1aSopenharmony_ci s->geotags[i].val = get_geokey_val(s->geotags[i].key, ff_tget_short(&s->gb, s->le)); 1607cabdff1aSopenharmony_ci else 1608cabdff1aSopenharmony_ci s->geotags[i].offset = ff_tget_short(&s->gb, s->le); 1609cabdff1aSopenharmony_ci } 1610cabdff1aSopenharmony_ci break; 1611cabdff1aSopenharmony_ci case TIFF_GEO_DOUBLE_PARAMS: 1612cabdff1aSopenharmony_ci if (count >= INT_MAX / sizeof(int64_t)) 1613cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1614cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(&s->gb) < count * sizeof(int64_t)) 1615cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1616cabdff1aSopenharmony_ci dp = av_malloc_array(count, sizeof(double)); 1617cabdff1aSopenharmony_ci if (!dp) { 1618cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n"); 1619cabdff1aSopenharmony_ci goto end; 1620cabdff1aSopenharmony_ci } 1621cabdff1aSopenharmony_ci for (i = 0; i < count; i++) 1622cabdff1aSopenharmony_ci dp[i] = ff_tget_double(&s->gb, s->le); 1623cabdff1aSopenharmony_ci for (i = 0; i < s->geotag_count; i++) { 1624cabdff1aSopenharmony_ci if (s->geotags[i].type == TIFF_GEO_DOUBLE_PARAMS) { 1625cabdff1aSopenharmony_ci if (s->geotags[i].count == 0 1626cabdff1aSopenharmony_ci || s->geotags[i].offset + s->geotags[i].count > count) { 1627cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key); 1628cabdff1aSopenharmony_ci } else if (s->geotags[i].val) { 1629cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Duplicate GeoTIFF key %d\n", s->geotags[i].key); 1630cabdff1aSopenharmony_ci } else { 1631cabdff1aSopenharmony_ci char *ap = doubles2str(&dp[s->geotags[i].offset], s->geotags[i].count, ", "); 1632cabdff1aSopenharmony_ci if (!ap) { 1633cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n"); 1634cabdff1aSopenharmony_ci av_freep(&dp); 1635cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1636cabdff1aSopenharmony_ci } 1637cabdff1aSopenharmony_ci s->geotags[i].val = ap; 1638cabdff1aSopenharmony_ci } 1639cabdff1aSopenharmony_ci } 1640cabdff1aSopenharmony_ci } 1641cabdff1aSopenharmony_ci av_freep(&dp); 1642cabdff1aSopenharmony_ci break; 1643cabdff1aSopenharmony_ci case TIFF_GEO_ASCII_PARAMS: 1644cabdff1aSopenharmony_ci pos = bytestream2_tell(&s->gb); 1645cabdff1aSopenharmony_ci for (i = 0; i < s->geotag_count; i++) { 1646cabdff1aSopenharmony_ci if (s->geotags[i].type == TIFF_GEO_ASCII_PARAMS) { 1647cabdff1aSopenharmony_ci if (s->geotags[i].count == 0 1648cabdff1aSopenharmony_ci || s->geotags[i].offset + s->geotags[i].count > count) { 1649cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Invalid GeoTIFF key %d\n", s->geotags[i].key); 1650cabdff1aSopenharmony_ci } else { 1651cabdff1aSopenharmony_ci char *ap; 1652cabdff1aSopenharmony_ci 1653cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, pos + s->geotags[i].offset, SEEK_SET); 1654cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(&s->gb) < s->geotags[i].count) 1655cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1656cabdff1aSopenharmony_ci if (s->geotags[i].val) 1657cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1658cabdff1aSopenharmony_ci ap = av_malloc(s->geotags[i].count); 1659cabdff1aSopenharmony_ci if (!ap) { 1660cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n"); 1661cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1662cabdff1aSopenharmony_ci } 1663cabdff1aSopenharmony_ci bytestream2_get_bufferu(&s->gb, ap, s->geotags[i].count); 1664cabdff1aSopenharmony_ci ap[s->geotags[i].count - 1] = '\0'; //replace the "|" delimiter with a 0 byte 1665cabdff1aSopenharmony_ci s->geotags[i].val = ap; 1666cabdff1aSopenharmony_ci } 1667cabdff1aSopenharmony_ci } 1668cabdff1aSopenharmony_ci } 1669cabdff1aSopenharmony_ci break; 1670cabdff1aSopenharmony_ci case TIFF_ICC_PROFILE: 1671cabdff1aSopenharmony_ci gb_temp = s->gb; 1672cabdff1aSopenharmony_ci bytestream2_seek(&gb_temp, SEEK_SET, off); 1673cabdff1aSopenharmony_ci 1674cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(&gb_temp) < count) 1675cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1676cabdff1aSopenharmony_ci 1677cabdff1aSopenharmony_ci sd = av_frame_new_side_data(frame, AV_FRAME_DATA_ICC_PROFILE, count); 1678cabdff1aSopenharmony_ci if (!sd) 1679cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1680cabdff1aSopenharmony_ci 1681cabdff1aSopenharmony_ci bytestream2_get_bufferu(&gb_temp, sd->data, count); 1682cabdff1aSopenharmony_ci break; 1683cabdff1aSopenharmony_ci case TIFF_ARTIST: 1684cabdff1aSopenharmony_ci ADD_METADATA(count, "artist", NULL); 1685cabdff1aSopenharmony_ci break; 1686cabdff1aSopenharmony_ci case TIFF_COPYRIGHT: 1687cabdff1aSopenharmony_ci ADD_METADATA(count, "copyright", NULL); 1688cabdff1aSopenharmony_ci break; 1689cabdff1aSopenharmony_ci case TIFF_DATE: 1690cabdff1aSopenharmony_ci ADD_METADATA(count, "date", NULL); 1691cabdff1aSopenharmony_ci break; 1692cabdff1aSopenharmony_ci case TIFF_DOCUMENT_NAME: 1693cabdff1aSopenharmony_ci ADD_METADATA(count, "document_name", NULL); 1694cabdff1aSopenharmony_ci break; 1695cabdff1aSopenharmony_ci case TIFF_HOST_COMPUTER: 1696cabdff1aSopenharmony_ci ADD_METADATA(count, "computer", NULL); 1697cabdff1aSopenharmony_ci break; 1698cabdff1aSopenharmony_ci case TIFF_IMAGE_DESCRIPTION: 1699cabdff1aSopenharmony_ci ADD_METADATA(count, "description", NULL); 1700cabdff1aSopenharmony_ci break; 1701cabdff1aSopenharmony_ci case TIFF_MAKE: 1702cabdff1aSopenharmony_ci ADD_METADATA(count, "make", NULL); 1703cabdff1aSopenharmony_ci break; 1704cabdff1aSopenharmony_ci case TIFF_MODEL: 1705cabdff1aSopenharmony_ci ADD_METADATA(count, "model", NULL); 1706cabdff1aSopenharmony_ci break; 1707cabdff1aSopenharmony_ci case TIFF_PAGE_NAME: 1708cabdff1aSopenharmony_ci ADD_METADATA(count, "page_name", NULL); 1709cabdff1aSopenharmony_ci break; 1710cabdff1aSopenharmony_ci case TIFF_PAGE_NUMBER: 1711cabdff1aSopenharmony_ci ADD_METADATA(count, "page_number", " / "); 1712cabdff1aSopenharmony_ci // need to seek back to re-read the page number 1713cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, -count * sizeof(uint16_t), SEEK_CUR); 1714cabdff1aSopenharmony_ci // read the page number 1715cabdff1aSopenharmony_ci s->cur_page = ff_tget(&s->gb, TIFF_SHORT, s->le); 1716cabdff1aSopenharmony_ci // get back to where we were before the previous seek 1717cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, count * sizeof(uint16_t) - sizeof(uint16_t), SEEK_CUR); 1718cabdff1aSopenharmony_ci break; 1719cabdff1aSopenharmony_ci case TIFF_SOFTWARE_NAME: 1720cabdff1aSopenharmony_ci ADD_METADATA(count, "software", NULL); 1721cabdff1aSopenharmony_ci break; 1722cabdff1aSopenharmony_ci case DNG_VERSION: 1723cabdff1aSopenharmony_ci if (count == 4) { 1724cabdff1aSopenharmony_ci unsigned int ver[4]; 1725cabdff1aSopenharmony_ci ver[0] = ff_tget(&s->gb, type, s->le); 1726cabdff1aSopenharmony_ci ver[1] = ff_tget(&s->gb, type, s->le); 1727cabdff1aSopenharmony_ci ver[2] = ff_tget(&s->gb, type, s->le); 1728cabdff1aSopenharmony_ci ver[3] = ff_tget(&s->gb, type, s->le); 1729cabdff1aSopenharmony_ci 1730cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "DNG file, version %u.%u.%u.%u\n", 1731cabdff1aSopenharmony_ci ver[0], ver[1], ver[2], ver[3]); 1732cabdff1aSopenharmony_ci 1733cabdff1aSopenharmony_ci tiff_set_type(s, TIFF_TYPE_DNG); 1734cabdff1aSopenharmony_ci } 1735cabdff1aSopenharmony_ci break; 1736cabdff1aSopenharmony_ci case CINEMADNG_TIME_CODES: 1737cabdff1aSopenharmony_ci case CINEMADNG_FRAME_RATE: 1738cabdff1aSopenharmony_ci case CINEMADNG_T_STOP: 1739cabdff1aSopenharmony_ci case CINEMADNG_REEL_NAME: 1740cabdff1aSopenharmony_ci case CINEMADNG_CAMERA_LABEL: 1741cabdff1aSopenharmony_ci tiff_set_type(s, TIFF_TYPE_CINEMADNG); 1742cabdff1aSopenharmony_ci break; 1743cabdff1aSopenharmony_ci default: 1744cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) { 1745cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1746cabdff1aSopenharmony_ci "Unknown or unsupported tag %d/0x%0X\n", 1747cabdff1aSopenharmony_ci tag, tag); 1748cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1749cabdff1aSopenharmony_ci } 1750cabdff1aSopenharmony_ci } 1751cabdff1aSopenharmony_ciend: 1752cabdff1aSopenharmony_ci if (s->bpp > 64U) { 1753cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1754cabdff1aSopenharmony_ci "This format is not supported (bpp=%d, %d components)\n", 1755cabdff1aSopenharmony_ci s->bpp, count); 1756cabdff1aSopenharmony_ci s->bpp = 0; 1757cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1758cabdff1aSopenharmony_ci } 1759cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, start, SEEK_SET); 1760cabdff1aSopenharmony_ci return 0; 1761cabdff1aSopenharmony_ci} 1762cabdff1aSopenharmony_ci 1763cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *p, 1764cabdff1aSopenharmony_ci int *got_frame, AVPacket *avpkt) 1765cabdff1aSopenharmony_ci{ 1766cabdff1aSopenharmony_ci TiffContext *const s = avctx->priv_data; 1767cabdff1aSopenharmony_ci unsigned off, last_off = 0; 1768cabdff1aSopenharmony_ci int le, ret, plane, planes; 1769cabdff1aSopenharmony_ci int i, j, entries, stride; 1770cabdff1aSopenharmony_ci unsigned soff, ssize; 1771cabdff1aSopenharmony_ci uint8_t *dst; 1772cabdff1aSopenharmony_ci GetByteContext stripsizes; 1773cabdff1aSopenharmony_ci GetByteContext stripdata; 1774cabdff1aSopenharmony_ci int retry_for_subifd, retry_for_page; 1775cabdff1aSopenharmony_ci int is_dng; 1776cabdff1aSopenharmony_ci int has_tile_bits, has_strip_bits; 1777cabdff1aSopenharmony_ci 1778cabdff1aSopenharmony_ci bytestream2_init(&s->gb, avpkt->data, avpkt->size); 1779cabdff1aSopenharmony_ci 1780cabdff1aSopenharmony_ci // parse image header 1781cabdff1aSopenharmony_ci if ((ret = ff_tdecode_header(&s->gb, &le, &off))) { 1782cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid TIFF header\n"); 1783cabdff1aSopenharmony_ci return ret; 1784cabdff1aSopenharmony_ci } else if (off >= UINT_MAX - 14 || avpkt->size < off + 14) { 1785cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n"); 1786cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1787cabdff1aSopenharmony_ci } 1788cabdff1aSopenharmony_ci s->le = le; 1789cabdff1aSopenharmony_ci // TIFF_BPP is not a required tag and defaults to 1 1790cabdff1aSopenharmony_ci 1791cabdff1aSopenharmony_ci s->tiff_type = TIFF_TYPE_TIFF; 1792cabdff1aSopenharmony_ciagain: 1793cabdff1aSopenharmony_ci s->is_thumbnail = 0; 1794cabdff1aSopenharmony_ci s->bppcount = s->bpp = 1; 1795cabdff1aSopenharmony_ci s->photometric = TIFF_PHOTOMETRIC_NONE; 1796cabdff1aSopenharmony_ci s->compr = TIFF_RAW; 1797cabdff1aSopenharmony_ci s->fill_order = 0; 1798cabdff1aSopenharmony_ci s->white_level = 0; 1799cabdff1aSopenharmony_ci s->is_bayer = 0; 1800cabdff1aSopenharmony_ci s->is_tiled = 0; 1801cabdff1aSopenharmony_ci s->is_jpeg = 0; 1802cabdff1aSopenharmony_ci s->cur_page = 0; 1803cabdff1aSopenharmony_ci s->last_tag = 0; 1804cabdff1aSopenharmony_ci 1805cabdff1aSopenharmony_ci for (i = 0; i < 65536; i++) 1806cabdff1aSopenharmony_ci s->dng_lut[i] = i; 1807cabdff1aSopenharmony_ci 1808cabdff1aSopenharmony_ci free_geotags(s); 1809cabdff1aSopenharmony_ci 1810cabdff1aSopenharmony_ci // Reset these offsets so we can tell if they were set this frame 1811cabdff1aSopenharmony_ci s->stripsizesoff = s->strippos = 0; 1812cabdff1aSopenharmony_ci /* parse image file directory */ 1813cabdff1aSopenharmony_ci bytestream2_seek(&s->gb, off, SEEK_SET); 1814cabdff1aSopenharmony_ci entries = ff_tget_short(&s->gb, le); 1815cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(&s->gb) < entries * 12) 1816cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1817cabdff1aSopenharmony_ci for (i = 0; i < entries; i++) { 1818cabdff1aSopenharmony_ci if ((ret = tiff_decode_tag(s, p)) < 0) 1819cabdff1aSopenharmony_ci return ret; 1820cabdff1aSopenharmony_ci } 1821cabdff1aSopenharmony_ci 1822cabdff1aSopenharmony_ci if (s->get_thumbnail && !s->is_thumbnail) { 1823cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, "No embedded thumbnail present\n"); 1824cabdff1aSopenharmony_ci return AVERROR_EOF; 1825cabdff1aSopenharmony_ci } 1826cabdff1aSopenharmony_ci 1827cabdff1aSopenharmony_ci /** whether we should process this IFD's SubIFD */ 1828cabdff1aSopenharmony_ci retry_for_subifd = s->sub_ifd && (s->get_subimage || (!s->get_thumbnail && s->is_thumbnail)); 1829cabdff1aSopenharmony_ci /** whether we should process this multi-page IFD's next page */ 1830cabdff1aSopenharmony_ci retry_for_page = s->get_page && s->cur_page + 1 < s->get_page; // get_page is 1-indexed 1831cabdff1aSopenharmony_ci 1832cabdff1aSopenharmony_ci if (retry_for_page) { 1833cabdff1aSopenharmony_ci // set offset to the next IFD 1834cabdff1aSopenharmony_ci off = ff_tget_long(&s->gb, le); 1835cabdff1aSopenharmony_ci } else if (retry_for_subifd) { 1836cabdff1aSopenharmony_ci // set offset to the SubIFD 1837cabdff1aSopenharmony_ci off = s->sub_ifd; 1838cabdff1aSopenharmony_ci } 1839cabdff1aSopenharmony_ci 1840cabdff1aSopenharmony_ci if (retry_for_subifd || retry_for_page) { 1841cabdff1aSopenharmony_ci if (!off) { 1842cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Requested entry not found\n"); 1843cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1844cabdff1aSopenharmony_ci } 1845cabdff1aSopenharmony_ci if (off <= last_off) { 1846cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "non increasing IFD offset"); 1847cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1848cabdff1aSopenharmony_ci } 1849cabdff1aSopenharmony_ci last_off = off; 1850cabdff1aSopenharmony_ci if (off >= UINT_MAX - 14 || avpkt->size < off + 14) { 1851cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n"); 1852cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1853cabdff1aSopenharmony_ci } 1854cabdff1aSopenharmony_ci s->sub_ifd = 0; 1855cabdff1aSopenharmony_ci goto again; 1856cabdff1aSopenharmony_ci } 1857cabdff1aSopenharmony_ci 1858cabdff1aSopenharmony_ci /* At this point we've decided on which (Sub)IFD to process */ 1859cabdff1aSopenharmony_ci 1860cabdff1aSopenharmony_ci is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG); 1861cabdff1aSopenharmony_ci 1862cabdff1aSopenharmony_ci for (i = 0; i<s->geotag_count; i++) { 1863cabdff1aSopenharmony_ci const char *keyname = get_geokey_name(s->geotags[i].key); 1864cabdff1aSopenharmony_ci if (!keyname) { 1865cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Unknown or unsupported GeoTIFF key %d\n", s->geotags[i].key); 1866cabdff1aSopenharmony_ci continue; 1867cabdff1aSopenharmony_ci } 1868cabdff1aSopenharmony_ci if (get_geokey_type(s->geotags[i].key) != s->geotags[i].type) { 1869cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Type of GeoTIFF key %d is wrong\n", s->geotags[i].key); 1870cabdff1aSopenharmony_ci continue; 1871cabdff1aSopenharmony_ci } 1872cabdff1aSopenharmony_ci ret = av_dict_set(&p->metadata, keyname, s->geotags[i].val, 0); 1873cabdff1aSopenharmony_ci if (ret<0) { 1874cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Writing metadata with key '%s' failed\n", keyname); 1875cabdff1aSopenharmony_ci return ret; 1876cabdff1aSopenharmony_ci } 1877cabdff1aSopenharmony_ci } 1878cabdff1aSopenharmony_ci 1879cabdff1aSopenharmony_ci if (is_dng) { 1880cabdff1aSopenharmony_ci int bps; 1881cabdff1aSopenharmony_ci 1882cabdff1aSopenharmony_ci if (s->bpp % s->bppcount) 1883cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1884cabdff1aSopenharmony_ci bps = s->bpp / s->bppcount; 1885cabdff1aSopenharmony_ci if (bps < 8 || bps > 32) 1886cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1887cabdff1aSopenharmony_ci 1888cabdff1aSopenharmony_ci if (s->white_level == 0) 1889cabdff1aSopenharmony_ci s->white_level = (1LL << bps) - 1; /* Default value as per the spec */ 1890cabdff1aSopenharmony_ci 1891cabdff1aSopenharmony_ci if (s->white_level <= s->black_level) { 1892cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "BlackLevel (%"PRId32") must be less than WhiteLevel (%"PRId32")\n", 1893cabdff1aSopenharmony_ci s->black_level, s->white_level); 1894cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1895cabdff1aSopenharmony_ci } 1896cabdff1aSopenharmony_ci 1897cabdff1aSopenharmony_ci if (s->planar) 1898cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1899cabdff1aSopenharmony_ci } 1900cabdff1aSopenharmony_ci 1901cabdff1aSopenharmony_ci if (!s->is_tiled && !s->strippos && !s->stripoff) { 1902cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Image data is missing\n"); 1903cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1904cabdff1aSopenharmony_ci } 1905cabdff1aSopenharmony_ci 1906cabdff1aSopenharmony_ci has_tile_bits = s->is_tiled || s->tile_byte_counts_offset || s->tile_offsets_offset || s->tile_width || s->tile_length; 1907cabdff1aSopenharmony_ci has_strip_bits = s->strippos || s->strips || s->stripoff || s->rps || s->sot || s->sstype || s->stripsize || s->stripsizesoff; 1908cabdff1aSopenharmony_ci 1909cabdff1aSopenharmony_ci if (has_tile_bits && has_strip_bits) { 1910cabdff1aSopenharmony_ci int tiled_dng = s->is_tiled && is_dng; 1911cabdff1aSopenharmony_ci av_log(avctx, tiled_dng ? AV_LOG_WARNING : AV_LOG_ERROR, "Tiled TIFF is not allowed to strip\n"); 1912cabdff1aSopenharmony_ci if (!tiled_dng) 1913cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1914cabdff1aSopenharmony_ci } 1915cabdff1aSopenharmony_ci 1916cabdff1aSopenharmony_ci /* now we have the data and may start decoding */ 1917cabdff1aSopenharmony_ci if ((ret = init_image(s, p)) < 0) 1918cabdff1aSopenharmony_ci return ret; 1919cabdff1aSopenharmony_ci 1920cabdff1aSopenharmony_ci if (!s->is_tiled || has_strip_bits) { 1921cabdff1aSopenharmony_ci if (s->strips == 1 && !s->stripsize) { 1922cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Image data size missing\n"); 1923cabdff1aSopenharmony_ci s->stripsize = avpkt->size - s->stripoff; 1924cabdff1aSopenharmony_ci } 1925cabdff1aSopenharmony_ci 1926cabdff1aSopenharmony_ci if (s->stripsizesoff) { 1927cabdff1aSopenharmony_ci if (s->stripsizesoff >= (unsigned)avpkt->size) 1928cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1929cabdff1aSopenharmony_ci bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff, 1930cabdff1aSopenharmony_ci avpkt->size - s->stripsizesoff); 1931cabdff1aSopenharmony_ci } 1932cabdff1aSopenharmony_ci if (s->strippos) { 1933cabdff1aSopenharmony_ci if (s->strippos >= (unsigned)avpkt->size) 1934cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1935cabdff1aSopenharmony_ci bytestream2_init(&stripdata, avpkt->data + s->strippos, 1936cabdff1aSopenharmony_ci avpkt->size - s->strippos); 1937cabdff1aSopenharmony_ci } 1938cabdff1aSopenharmony_ci 1939cabdff1aSopenharmony_ci if (s->rps <= 0 || s->rps % s->subsampling[1]) { 1940cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps); 1941cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1942cabdff1aSopenharmony_ci } 1943cabdff1aSopenharmony_ci } 1944cabdff1aSopenharmony_ci 1945cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_LINEAR_RAW || 1946cabdff1aSopenharmony_ci s->photometric == TIFF_PHOTOMETRIC_CFA) { 1947cabdff1aSopenharmony_ci p->color_trc = AVCOL_TRC_LINEAR; 1948cabdff1aSopenharmony_ci } else if (s->photometric == TIFF_PHOTOMETRIC_BLACK_IS_ZERO) { 1949cabdff1aSopenharmony_ci p->color_trc = AVCOL_TRC_GAMMA22; 1950cabdff1aSopenharmony_ci } 1951cabdff1aSopenharmony_ci 1952cabdff1aSopenharmony_ci /* Handle DNG images with JPEG-compressed tiles */ 1953cabdff1aSopenharmony_ci 1954cabdff1aSopenharmony_ci if (is_dng && s->is_tiled) { 1955cabdff1aSopenharmony_ci if (!s->is_jpeg) { 1956cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, "DNG uncompressed tiled images"); 1957cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1958cabdff1aSopenharmony_ci } else if (!s->is_bayer) { 1959cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, "DNG JPG-compressed tiled non-bayer-encoded images"); 1960cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1961cabdff1aSopenharmony_ci } else { 1962cabdff1aSopenharmony_ci if ((ret = dng_decode_tiles(avctx, p, avpkt)) > 0) 1963cabdff1aSopenharmony_ci *got_frame = 1; 1964cabdff1aSopenharmony_ci return ret; 1965cabdff1aSopenharmony_ci } 1966cabdff1aSopenharmony_ci } 1967cabdff1aSopenharmony_ci 1968cabdff1aSopenharmony_ci /* Handle TIFF images and DNG images with uncompressed strips (non-tiled) */ 1969cabdff1aSopenharmony_ci 1970cabdff1aSopenharmony_ci planes = s->planar ? s->bppcount : 1; 1971cabdff1aSopenharmony_ci for (plane = 0; plane < planes; plane++) { 1972cabdff1aSopenharmony_ci uint8_t *five_planes = NULL; 1973cabdff1aSopenharmony_ci int remaining = avpkt->size; 1974cabdff1aSopenharmony_ci int decoded_height; 1975cabdff1aSopenharmony_ci stride = p->linesize[plane]; 1976cabdff1aSopenharmony_ci dst = p->data[plane]; 1977cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED && 1978cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_RGBA) { 1979cabdff1aSopenharmony_ci stride = stride * 5 / 4; 1980cabdff1aSopenharmony_ci five_planes = 1981cabdff1aSopenharmony_ci dst = av_malloc(stride * s->height); 1982cabdff1aSopenharmony_ci if (!dst) 1983cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1984cabdff1aSopenharmony_ci } 1985cabdff1aSopenharmony_ci for (i = 0; i < s->height; i += s->rps) { 1986cabdff1aSopenharmony_ci if (i) 1987cabdff1aSopenharmony_ci dst += s->rps * stride; 1988cabdff1aSopenharmony_ci if (s->stripsizesoff) 1989cabdff1aSopenharmony_ci ssize = ff_tget(&stripsizes, s->sstype, le); 1990cabdff1aSopenharmony_ci else 1991cabdff1aSopenharmony_ci ssize = s->stripsize; 1992cabdff1aSopenharmony_ci 1993cabdff1aSopenharmony_ci if (s->strippos) 1994cabdff1aSopenharmony_ci soff = ff_tget(&stripdata, s->sot, le); 1995cabdff1aSopenharmony_ci else 1996cabdff1aSopenharmony_ci soff = s->stripoff; 1997cabdff1aSopenharmony_ci 1998cabdff1aSopenharmony_ci if (soff > avpkt->size || ssize > avpkt->size - soff || ssize > remaining) { 1999cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n"); 2000cabdff1aSopenharmony_ci av_freep(&five_planes); 2001cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2002cabdff1aSopenharmony_ci } 2003cabdff1aSopenharmony_ci remaining -= ssize; 2004cabdff1aSopenharmony_ci if ((ret = tiff_unpack_strip(s, p, dst, stride, avpkt->data + soff, ssize, i, 2005cabdff1aSopenharmony_ci FFMIN(s->rps, s->height - i))) < 0) { 2006cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_EXPLODE) { 2007cabdff1aSopenharmony_ci av_freep(&five_planes); 2008cabdff1aSopenharmony_ci return ret; 2009cabdff1aSopenharmony_ci } 2010cabdff1aSopenharmony_ci break; 2011cabdff1aSopenharmony_ci } 2012cabdff1aSopenharmony_ci } 2013cabdff1aSopenharmony_ci decoded_height = FFMIN(i, s->height); 2014cabdff1aSopenharmony_ci 2015cabdff1aSopenharmony_ci if (s->predictor == 2) { 2016cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) { 2017cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported"); 2018cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 2019cabdff1aSopenharmony_ci } 2020cabdff1aSopenharmony_ci dst = five_planes ? five_planes : p->data[plane]; 2021cabdff1aSopenharmony_ci soff = s->bpp >> 3; 2022cabdff1aSopenharmony_ci if (s->planar) 2023cabdff1aSopenharmony_ci soff = FFMAX(soff / s->bppcount, 1); 2024cabdff1aSopenharmony_ci ssize = s->width * soff; 2025cabdff1aSopenharmony_ci if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48LE || 2026cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE || 2027cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_GRAY16LE || 2028cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_YA16LE || 2029cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_GBRP16LE || 2030cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16LE) { 2031cabdff1aSopenharmony_ci for (i = 0; i < decoded_height; i++) { 2032cabdff1aSopenharmony_ci for (j = soff; j < ssize; j += 2) 2033cabdff1aSopenharmony_ci AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff)); 2034cabdff1aSopenharmony_ci dst += stride; 2035cabdff1aSopenharmony_ci } 2036cabdff1aSopenharmony_ci } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48BE || 2037cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE || 2038cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_GRAY16BE || 2039cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_YA16BE || 2040cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_GBRP16BE || 2041cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16BE) { 2042cabdff1aSopenharmony_ci for (i = 0; i < decoded_height; i++) { 2043cabdff1aSopenharmony_ci for (j = soff; j < ssize; j += 2) 2044cabdff1aSopenharmony_ci AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff)); 2045cabdff1aSopenharmony_ci dst += stride; 2046cabdff1aSopenharmony_ci } 2047cabdff1aSopenharmony_ci } else { 2048cabdff1aSopenharmony_ci for (i = 0; i < decoded_height; i++) { 2049cabdff1aSopenharmony_ci for (j = soff; j < ssize; j++) 2050cabdff1aSopenharmony_ci dst[j] += dst[j - soff]; 2051cabdff1aSopenharmony_ci dst += stride; 2052cabdff1aSopenharmony_ci } 2053cabdff1aSopenharmony_ci } 2054cabdff1aSopenharmony_ci } 2055cabdff1aSopenharmony_ci 2056cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_WHITE_IS_ZERO) { 2057cabdff1aSopenharmony_ci int c = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<<s->bpp) - 1 : 255); 2058cabdff1aSopenharmony_ci dst = p->data[plane]; 2059cabdff1aSopenharmony_ci for (i = 0; i < s->height; i++) { 2060cabdff1aSopenharmony_ci for (j = 0; j < stride; j++) 2061cabdff1aSopenharmony_ci dst[j] = c - dst[j]; 2062cabdff1aSopenharmony_ci dst += stride; 2063cabdff1aSopenharmony_ci } 2064cabdff1aSopenharmony_ci } 2065cabdff1aSopenharmony_ci 2066cabdff1aSopenharmony_ci if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED && 2067cabdff1aSopenharmony_ci (s->avctx->pix_fmt == AV_PIX_FMT_RGB0 || s->avctx->pix_fmt == AV_PIX_FMT_RGBA)) { 2068cabdff1aSopenharmony_ci int x = s->avctx->pix_fmt == AV_PIX_FMT_RGB0 ? 4 : 5; 2069cabdff1aSopenharmony_ci uint8_t *src = five_planes ? five_planes : p->data[plane]; 2070cabdff1aSopenharmony_ci dst = p->data[plane]; 2071cabdff1aSopenharmony_ci for (i = 0; i < s->height; i++) { 2072cabdff1aSopenharmony_ci for (j = 0; j < s->width; j++) { 2073cabdff1aSopenharmony_ci int k = 255 - src[x * j + 3]; 2074cabdff1aSopenharmony_ci int r = (255 - src[x * j ]) * k; 2075cabdff1aSopenharmony_ci int g = (255 - src[x * j + 1]) * k; 2076cabdff1aSopenharmony_ci int b = (255 - src[x * j + 2]) * k; 2077cabdff1aSopenharmony_ci dst[4 * j ] = r * 257 >> 16; 2078cabdff1aSopenharmony_ci dst[4 * j + 1] = g * 257 >> 16; 2079cabdff1aSopenharmony_ci dst[4 * j + 2] = b * 257 >> 16; 2080cabdff1aSopenharmony_ci dst[4 * j + 3] = s->avctx->pix_fmt == AV_PIX_FMT_RGBA ? src[x * j + 4] : 255; 2081cabdff1aSopenharmony_ci } 2082cabdff1aSopenharmony_ci src += stride; 2083cabdff1aSopenharmony_ci dst += p->linesize[plane]; 2084cabdff1aSopenharmony_ci } 2085cabdff1aSopenharmony_ci av_freep(&five_planes); 2086cabdff1aSopenharmony_ci } else if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED && 2087cabdff1aSopenharmony_ci s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE) { 2088cabdff1aSopenharmony_ci dst = p->data[plane]; 2089cabdff1aSopenharmony_ci for (i = 0; i < s->height; i++) { 2090cabdff1aSopenharmony_ci for (j = 0; j < s->width; j++) { 2091cabdff1aSopenharmony_ci uint64_t k = 65535 - AV_RB16(dst + 8 * j + 6); 2092cabdff1aSopenharmony_ci uint64_t r = (65535 - AV_RB16(dst + 8 * j )) * k; 2093cabdff1aSopenharmony_ci uint64_t g = (65535 - AV_RB16(dst + 8 * j + 2)) * k; 2094cabdff1aSopenharmony_ci uint64_t b = (65535 - AV_RB16(dst + 8 * j + 4)) * k; 2095cabdff1aSopenharmony_ci AV_WB16(dst + 8 * j , r * 65537 >> 32); 2096cabdff1aSopenharmony_ci AV_WB16(dst + 8 * j + 2, g * 65537 >> 32); 2097cabdff1aSopenharmony_ci AV_WB16(dst + 8 * j + 4, b * 65537 >> 32); 2098cabdff1aSopenharmony_ci AV_WB16(dst + 8 * j + 6, 65535); 2099cabdff1aSopenharmony_ci } 2100cabdff1aSopenharmony_ci dst += p->linesize[plane]; 2101cabdff1aSopenharmony_ci } 2102cabdff1aSopenharmony_ci } 2103cabdff1aSopenharmony_ci } 2104cabdff1aSopenharmony_ci 2105cabdff1aSopenharmony_ci if (s->planar && s->bppcount > 2) { 2106cabdff1aSopenharmony_ci FFSWAP(uint8_t*, p->data[0], p->data[2]); 2107cabdff1aSopenharmony_ci FFSWAP(int, p->linesize[0], p->linesize[2]); 2108cabdff1aSopenharmony_ci FFSWAP(uint8_t*, p->data[0], p->data[1]); 2109cabdff1aSopenharmony_ci FFSWAP(int, p->linesize[0], p->linesize[1]); 2110cabdff1aSopenharmony_ci } 2111cabdff1aSopenharmony_ci 2112cabdff1aSopenharmony_ci if (s->is_bayer && s->white_level && s->bpp == 16 && !is_dng) { 2113cabdff1aSopenharmony_ci uint16_t *dst = (uint16_t *)p->data[0]; 2114cabdff1aSopenharmony_ci for (i = 0; i < s->height; i++) { 2115cabdff1aSopenharmony_ci for (j = 0; j < s->width; j++) 2116cabdff1aSopenharmony_ci dst[j] = FFMIN((dst[j] / (float)s->white_level) * 65535, 65535); 2117cabdff1aSopenharmony_ci dst += stride / 2; 2118cabdff1aSopenharmony_ci } 2119cabdff1aSopenharmony_ci } 2120cabdff1aSopenharmony_ci 2121cabdff1aSopenharmony_ci *got_frame = 1; 2122cabdff1aSopenharmony_ci 2123cabdff1aSopenharmony_ci return avpkt->size; 2124cabdff1aSopenharmony_ci} 2125cabdff1aSopenharmony_ci 2126cabdff1aSopenharmony_cistatic av_cold int tiff_init(AVCodecContext *avctx) 2127cabdff1aSopenharmony_ci{ 2128cabdff1aSopenharmony_ci TiffContext *s = avctx->priv_data; 2129cabdff1aSopenharmony_ci const AVCodec *codec; 2130cabdff1aSopenharmony_ci int ret; 2131cabdff1aSopenharmony_ci 2132cabdff1aSopenharmony_ci s->width = 0; 2133cabdff1aSopenharmony_ci s->height = 0; 2134cabdff1aSopenharmony_ci s->subsampling[0] = 2135cabdff1aSopenharmony_ci s->subsampling[1] = 1; 2136cabdff1aSopenharmony_ci s->avctx = avctx; 2137cabdff1aSopenharmony_ci ff_lzw_decode_open(&s->lzw); 2138cabdff1aSopenharmony_ci if (!s->lzw) 2139cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2140cabdff1aSopenharmony_ci ff_ccitt_unpack_init(); 2141cabdff1aSopenharmony_ci 2142cabdff1aSopenharmony_ci /* Allocate JPEG frame */ 2143cabdff1aSopenharmony_ci s->jpgframe = av_frame_alloc(); 2144cabdff1aSopenharmony_ci s->jpkt = av_packet_alloc(); 2145cabdff1aSopenharmony_ci if (!s->jpgframe || !s->jpkt) 2146cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2147cabdff1aSopenharmony_ci 2148cabdff1aSopenharmony_ci /* Prepare everything needed for JPEG decoding */ 2149cabdff1aSopenharmony_ci codec = avcodec_find_decoder(AV_CODEC_ID_MJPEG); 2150cabdff1aSopenharmony_ci if (!codec) 2151cabdff1aSopenharmony_ci return AVERROR_BUG; 2152cabdff1aSopenharmony_ci s->avctx_mjpeg = avcodec_alloc_context3(codec); 2153cabdff1aSopenharmony_ci if (!s->avctx_mjpeg) 2154cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2155cabdff1aSopenharmony_ci s->avctx_mjpeg->flags = avctx->flags; 2156cabdff1aSopenharmony_ci s->avctx_mjpeg->flags2 = avctx->flags2; 2157cabdff1aSopenharmony_ci s->avctx_mjpeg->dct_algo = avctx->dct_algo; 2158cabdff1aSopenharmony_ci s->avctx_mjpeg->idct_algo = avctx->idct_algo; 2159cabdff1aSopenharmony_ci s->avctx_mjpeg->max_pixels = avctx->max_pixels; 2160cabdff1aSopenharmony_ci ret = avcodec_open2(s->avctx_mjpeg, codec, NULL); 2161cabdff1aSopenharmony_ci if (ret < 0) { 2162cabdff1aSopenharmony_ci return ret; 2163cabdff1aSopenharmony_ci } 2164cabdff1aSopenharmony_ci 2165cabdff1aSopenharmony_ci return 0; 2166cabdff1aSopenharmony_ci} 2167cabdff1aSopenharmony_ci 2168cabdff1aSopenharmony_cistatic av_cold int tiff_end(AVCodecContext *avctx) 2169cabdff1aSopenharmony_ci{ 2170cabdff1aSopenharmony_ci TiffContext *const s = avctx->priv_data; 2171cabdff1aSopenharmony_ci 2172cabdff1aSopenharmony_ci free_geotags(s); 2173cabdff1aSopenharmony_ci 2174cabdff1aSopenharmony_ci ff_lzw_decode_close(&s->lzw); 2175cabdff1aSopenharmony_ci av_freep(&s->deinvert_buf); 2176cabdff1aSopenharmony_ci s->deinvert_buf_size = 0; 2177cabdff1aSopenharmony_ci av_freep(&s->yuv_line); 2178cabdff1aSopenharmony_ci s->yuv_line_size = 0; 2179cabdff1aSopenharmony_ci av_frame_free(&s->jpgframe); 2180cabdff1aSopenharmony_ci av_packet_free(&s->jpkt); 2181cabdff1aSopenharmony_ci avcodec_free_context(&s->avctx_mjpeg); 2182cabdff1aSopenharmony_ci return 0; 2183cabdff1aSopenharmony_ci} 2184cabdff1aSopenharmony_ci 2185cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(TiffContext, x) 2186cabdff1aSopenharmony_cistatic const AVOption tiff_options[] = { 2187cabdff1aSopenharmony_ci { "subimage", "decode subimage instead if available", OFFSET(get_subimage), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM }, 2188cabdff1aSopenharmony_ci { "thumbnail", "decode embedded thumbnail subimage instead if available", OFFSET(get_thumbnail), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM }, 2189cabdff1aSopenharmony_ci { "page", "page number of multi-page image to decode (starting from 1)", OFFSET(get_page), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM }, 2190cabdff1aSopenharmony_ci { NULL }, 2191cabdff1aSopenharmony_ci}; 2192cabdff1aSopenharmony_ci 2193cabdff1aSopenharmony_cistatic const AVClass tiff_decoder_class = { 2194cabdff1aSopenharmony_ci .class_name = "TIFF decoder", 2195cabdff1aSopenharmony_ci .item_name = av_default_item_name, 2196cabdff1aSopenharmony_ci .option = tiff_options, 2197cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 2198cabdff1aSopenharmony_ci}; 2199cabdff1aSopenharmony_ci 2200cabdff1aSopenharmony_ciconst FFCodec ff_tiff_decoder = { 2201cabdff1aSopenharmony_ci .p.name = "tiff", 2202cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("TIFF image"), 2203cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 2204cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_TIFF, 2205cabdff1aSopenharmony_ci .priv_data_size = sizeof(TiffContext), 2206cabdff1aSopenharmony_ci .init = tiff_init, 2207cabdff1aSopenharmony_ci .close = tiff_end, 2208cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_frame), 2209cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS, 2210cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 2211cabdff1aSopenharmony_ci .p.priv_class = &tiff_decoder_class, 2212cabdff1aSopenharmony_ci}; 2213