FFmpeg
Data Structures | Macros | Functions | Variables
tiff.c File Reference

TIFF image decoder. More...

#include "config.h"
#include "libavutil/attributes.h"
#include "libavutil/avstring.h"
#include "libavutil/error.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "avcodec.h"
#include "bytestream.h"
#include "faxcompr.h"
#include "internal.h"
#include "lzw.h"
#include "mathops.h"
#include "tiff.h"
#include "tiff_data.h"
#include "mjpegdec.h"
#include "thread.h"
#include "get_bits.h"

Go to the source code of this file.

Data Structures

struct  TiffContext
 

Macros

#define RET_GEOKEY(TYPE, array, element)
 
#define RET_GEOKEY_VAL(TYPE, array)
 
#define ADD_METADATA(count, name, sep)
 
#define OFFSET(x)   offsetof(TiffContext, x)
 

Functions

static void tiff_set_type (TiffContext *s, enum TiffType tiff_type)
 
static void free_geotags (TiffContext *const s)
 
static const char * get_geokey_name (int key)
 
static int get_geokey_type (int key)
 
static int cmp_id_key (const void *id, const void *k)
 
static const char * search_keyval (const TiffGeoTagKeyName *keys, int n, int id)
 
static char * get_geokey_val (int key, int val)
 
static char * doubles2str (double *dp, int count, const char *sep)
 
static int add_metadata (int count, int type, const char *name, const char *sep, TiffContext *s, AVFrame *frame)
 
static void av_always_inline dng_blit (TiffContext *s, uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int width, int height, int is_single_comp, int is_u16)
 
static void av_always_inline horizontal_fill (TiffContext *s, unsigned int bpp, uint8_t *dst, int usePtr, const uint8_t *src, uint8_t c, int width, int offset)
 
static int deinvert_buffer (TiffContext *s, const uint8_t *src, int size)
 
static void unpack_gray (TiffContext *s, AVFrame *p, const uint8_t *src, int lnum, int width, int bpp)
 
static void unpack_yuv (TiffContext *s, AVFrame *p, const uint8_t *src, int lnum)
 
static int tiff_unpack_fax (TiffContext *s, uint8_t *dst, int stride, const uint8_t *src, int size, int width, int lines)
 
static int dng_decode_strip (AVCodecContext *avctx, AVFrame *frame)
 
static int tiff_unpack_strip (TiffContext *s, AVFrame *p, uint8_t *dst, int stride, const uint8_t *src, int size, int strip_start, int lines)
 
static uint16_t av_always_inline dng_process_color16 (uint16_t value, const uint16_t *lut, uint16_t black_level, float scale_factor)
 Map stored raw sensor values into linear reference values (see: DNG Specification - Chapter 5) More...
 
static uint16_t av_always_inline dng_process_color8 (uint16_t value, const uint16_t *lut, uint16_t black_level, float scale_factor)
 
static int dng_decode_jpeg (AVCodecContext *avctx, AVFrame *frame, int tile_byte_count, int dst_x, int dst_y, int w, int h)
 
static int dng_decode_tiles (AVCodecContext *avctx, AVFrame *frame, AVPacket *avpkt)
 
static int init_image (TiffContext *s, ThreadFrame *frame)
 
static void set_sar (TiffContext *s, unsigned tag, unsigned num, unsigned den)
 
static int tiff_decode_tag (TiffContext *s, AVFrame *frame)
 
static int decode_frame (AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
 
static av_cold int tiff_init (AVCodecContext *avctx)
 
static av_cold int tiff_end (AVCodecContext *avctx)
 

Variables

static const AVOption tiff_options []
 
static const AVClass tiff_decoder_class
 
AVCodec ff_tiff_decoder
 

Detailed Description

TIFF image decoder.

Author
Konstantin Shishkov

Definition in file tiff.c.

Macro Definition Documentation

#define RET_GEOKEY (   TYPE,
  array,
  element 
)
Value:
if (key >= TIFF_##TYPE##_KEY_ID_OFFSET &&\
key - TIFF_##TYPE##_KEY_ID_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_name_type_map))\
return ff_tiff_##array##_name_type_map[key - TIFF_##TYPE##_KEY_ID_OFFSET].element;
const char * key
#define FF_ARRAY_ELEMS(a)
#define TYPE
Definition: ffv1.h:195
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return
static int array[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:106

Definition at line 132 of file tiff.c.

Referenced by get_geokey_name(), and get_geokey_type().

#define RET_GEOKEY_VAL (   TYPE,
  array 
)
Value:
if (val >= TIFF_##TYPE##_OFFSET &&\
val - TIFF_##TYPE##_OFFSET < FF_ARRAY_ELEMS(ff_tiff_##array##_codes))\
return av_strdup(ff_tiff_##array##_codes[val - TIFF_##TYPE##_OFFSET]);
const char const char void * val
Definition: avisynth_c.h:863
#define FF_ARRAY_ELEMS(a)
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:251
#define TYPE
Definition: ffv1.h:195
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return
static int array[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:106

Referenced by get_geokey_val().

#define ADD_METADATA (   count,
  name,
  sep 
)
Value:
if ((ret = add_metadata(count, type, name, sep, s, frame)) < 0) {\
av_log(s->avctx, AV_LOG_ERROR, "Error allocating temporary buffer\n");\
goto end;\
}
GLint GLenum type
Definition: opengl_enc.c:104
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
static int add_metadata(int count, int type, const char *name, const char *sep, TiffContext *s, AVFrame *frame)
Definition: tiff.c:265
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
GLsizei count
Definition: opengl_enc.c:108
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
#define s(width, name)
Definition: cbs_vp9.c:257
const char * name
Definition: opengl_enc.c:102

Referenced by tiff_decode_tag().

#define OFFSET (   x)    offsetof(TiffContext, x)

Definition at line 2144 of file tiff.c.

Function Documentation

static void tiff_set_type ( TiffContext s,
enum TiffType  tiff_type 
)
static

Definition at line 116 of file tiff.c.

Referenced by tiff_decode_tag().

static void free_geotags ( TiffContext *const  s)
static

Definition at line 121 of file tiff.c.

Referenced by decode_frame(), and tiff_end().

static const char* get_geokey_name ( int  key)
static

Definition at line 137 of file tiff.c.

Referenced by decode_frame().

static int get_geokey_type ( int  key)
static

Definition at line 147 of file tiff.c.

Referenced by decode_frame().

static int cmp_id_key ( const void id,
const void k 
)
static

Definition at line 157 of file tiff.c.

Referenced by search_keyval().

static const char* search_keyval ( const TiffGeoTagKeyName keys,
int  n,
int  id 
)
static

Definition at line 162 of file tiff.c.

Referenced by get_geokey_val().

static char* get_geokey_val ( int  key,
int  val 
)
static

Definition at line 171 of file tiff.c.

Referenced by tiff_decode_tag().

static char* doubles2str ( double *  dp,
int  count,
const char *  sep 
)
static

Definition at line 239 of file tiff.c.

Referenced by tiff_decode_tag().

static int add_metadata ( int  count,
int  type,
const char *  name,
const char *  sep,
TiffContext s,
AVFrame frame 
)
static

Definition at line 265 of file tiff.c.

static void dng_blit ( TiffContext s,
uint8_t dst,
int  dst_stride,
const uint8_t src,
int  src_stride,
int  width,
int  height,
int  is_single_comp,
int  is_u16 
)
static

Definition at line 807 of file tiff.c.

Referenced by add_metadata(), dng_decode_jpeg(), and tiff_unpack_strip().

static void av_always_inline horizontal_fill ( TiffContext s,
unsigned int  bpp,
uint8_t dst,
int  usePtr,
const uint8_t src,
uint8_t  c,
int  width,
int  offset 
)
static

Definition at line 280 of file tiff.c.

Referenced by tiff_unpack_fax(), tiff_unpack_strip(), and unpack_yuv().

static int deinvert_buffer ( TiffContext s,
const uint8_t src,
int  size 
)
static

Definition at line 335 of file tiff.c.

Referenced by tiff_unpack_strip(), and unpack_yuv().

static void unpack_gray ( TiffContext s,
AVFrame p,
const uint8_t src,
int  lnum,
int  width,
int  bpp 
)
static

Definition at line 348 of file tiff.c.

Referenced by tiff_unpack_strip().

static void unpack_yuv ( TiffContext s,
AVFrame p,
const uint8_t src,
int  lnum 
)
static

Definition at line 361 of file tiff.c.

Referenced by tiff_unpack_strip().

static int tiff_unpack_fax ( TiffContext s,
uint8_t dst,
int  stride,
const uint8_t src,
int  size,
int  width,
int  lines 
)
static

Definition at line 521 of file tiff.c.

Referenced by tiff_unpack_strip().

static int dng_decode_strip ( AVCodecContext avctx,
AVFrame frame 
)
static

Definition at line 1014 of file tiff.c.

Referenced by tiff_unpack_fax(), and tiff_unpack_strip().

static int tiff_unpack_strip ( TiffContext s,
AVFrame p,
uint8_t dst,
int  stride,
const uint8_t src,
int  size,
int  strip_start,
int  lines 
)
static

Definition at line 556 of file tiff.c.

Referenced by decode_frame().

static uint16_t av_always_inline dng_process_color16 ( uint16_t  value,
const uint16_t *  lut,
uint16_t  black_level,
float  scale_factor 
)
static

Map stored raw sensor values into linear reference values (see: DNG Specification - Chapter 5)

Definition at line 779 of file tiff.c.

Referenced by dng_blit(), and dng_process_color8().

static uint16_t av_always_inline dng_process_color8 ( uint16_t  value,
const uint16_t *  lut,
uint16_t  black_level,
float  scale_factor 
)
static

Definition at line 800 of file tiff.c.

Referenced by dng_blit().

static int dng_decode_jpeg ( AVCodecContext avctx,
AVFrame frame,
int  tile_byte_count,
int  dst_x,
int  dst_y,
int  w,
int  h 
)
static

Definition at line 867 of file tiff.c.

Referenced by dng_decode_strip(), and dng_decode_tiles().

static int dng_decode_tiles ( AVCodecContext avctx,
AVFrame frame,
AVPacket avpkt 
)
static

Definition at line 939 of file tiff.c.

Referenced by decode_frame().

static int init_image ( TiffContext s,
ThreadFrame frame 
)
static

Definition at line 1027 of file tiff.c.

Referenced by decode_frame().

static void set_sar ( TiffContext s,
unsigned  tag,
unsigned  num,
unsigned  den 
)
static

Definition at line 1200 of file tiff.c.

Referenced by tiff_decode_tag().

static int tiff_decode_tag ( TiffContext s,
AVFrame frame 
)
static

Only get the first SubIFD

Definition at line 1219 of file tiff.c.

Referenced by decode_frame().

static int decode_frame ( AVCodecContext avctx,
void data,
int got_frame,
AVPacket avpkt 
)
static

whether we should process this IFD's SubIFD

whether we should process this multi-page IFD's next page

Definition at line 1744 of file tiff.c.

static av_cold int tiff_init ( AVCodecContext avctx)
static

Definition at line 2086 of file tiff.c.

static av_cold int tiff_end ( AVCodecContext avctx)
static

Definition at line 2126 of file tiff.c.

Variable Documentation

const AVOption tiff_options[]
static
Initial value:
= {
{ "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 },
{ "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 },
{ "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 },
{ NULL },
}
#define NULL
Definition: coverity.c:32
#define AV_OPT_FLAG_VIDEO_PARAM
Definition: opt.h:279
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:277
#define OFFSET(x)
Definition: tiff.c:2144

Definition at line 2145 of file tiff.c.

const AVClass tiff_decoder_class
static
Initial value:
= {
.class_name = "TIFF decoder",
.item_name = av_default_item_name,
.option = tiff_options,
}
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
static const AVOption tiff_options[]
Definition: tiff.c:2145

Definition at line 2152 of file tiff.c.

AVCodec ff_tiff_decoder
Initial value:
= {
.name = "tiff",
.long_name = NULL_IF_CONFIG_SMALL("TIFF image"),
.priv_data_size = sizeof(TiffContext),
.close = tiff_end,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
.priv_class = &tiff_decoder_class,
}
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: internal.h:48
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have add an init_thread_copy() which re-allocates them for other threads.Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities.There will be very little speed gain at this point but it should work.If there are inter-frame dependencies
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: tiff.c:1744
static av_cold int tiff_init(AVCodecContext *avctx)
Definition: tiff.c:2086
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
static av_cold int tiff_end(AVCodecContext *avctx)
Definition: tiff.c:2126
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: avcodec.h:1055
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
Definition: internal.h:225
static const AVClass tiff_decoder_class
Definition: tiff.c:2152
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:999

Definition at line 2159 of file tiff.c.