33 #include "libavutil/attributes.h"
34 #include "libavutil/intreadwrite.h"
35 #include "libavutil/imgutils.h"
67 return le ? bytestream2_get_le16(gb) : bytestream2_get_be16(gb);
72 return le ? bytestream2_get_le32(gb) : bytestream2_get_be32(gb);
78 case TIFF_BYTE:
return bytestream2_get_byte(gb);
81 default:
return UINT_MAX;
89 z_stream zstream = { 0 };
92 zstream.next_in = src;
93 zstream.avail_in =
size;
94 zstream.next_out = dst;
95 zstream.avail_out = *
len;
96 zret = inflateInit(&zstream);
101 zret = inflate(&zstream, Z_SYNC_FLUSH);
102 inflateEnd(&zstream);
103 *len = zstream.total_out;
104 return zret == Z_STREAM_END ? Z_OK : zret;
109 int width,
int lines)
112 unsigned long outlen;
114 outlen = width * lines;
118 ret = tiff_uncompress(zbuf, &outlen, src, size);
121 "Uncompressing failed (%lu of %lu) with error %d\n", outlen,
122 (
unsigned long)width * lines, ret);
127 for (line = 0; line < lines; line++) {
128 memcpy(dst, src, width);
139 const uint8_t *src,
int size,
int lines)
147 "Error allocating temporary buffer\n");
156 memcpy(src2, src, size);
158 for (i = 0; i <
size; i++)
169 const uint8_t *src,
int size,
int lines)
172 int c, line, pixels, code, ret;
173 int width = ((s->
width * s->
bpp) + 7) >> 3;
180 return tiff_unpack_zlib(s, dst, stride, src, size, width, lines);
183 "zlib support not enabled, "
184 "deflate compression not supported\n");
193 for (line = 0; line < lines; line++) {
195 if (pixels < width) {
213 for (line = 0; line < lines; line++) {
223 for (i = 0; i <
width; i++)
224 bytestream2_put_byte(&pb,
ff_reverse[bytestream2_get_byte(&s->
gb)]);
228 for (pixels = 0; pixels <
width;) {
234 }
else if (code != -128) {
236 c = bytestream2_get_byte(&s->
gb);
278 "This format is not supported (bpp=%d, bppcount=%d)\n",
299 unsigned tag, type, count, off, value = 0;
336 if (count <= 4 &&
type_sizes[type] * count <= 4)
353 "This format is not supported (bpp=%d, %d components)\n",
362 s->
bpp = (off & 0xFF) + ((off >> 8) & 0xFF) +
363 ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
368 for (i = 0; i < count; i++)
379 "Samples per pixel requires a single value, many provided\n");
421 if (!value || (type ==
TIFF_LONG && value == UINT_MAX))
469 "PhotometricInterpretation 0x%04X",
479 if (value < 1 || value > 2) {
481 "Unknown FillOrder value %d, trying default one\n", value);
489 if (count / 3 > 256 ||
492 pal_gb[0] = pal_gb[1] = pal_gb[2] = s->
gb;
496 for (i = 0; i < count / 3; i++) {
497 uint32_t p = 0xFF000000;
498 p |= (
tget(&pal_gb[0], type, s->
le) >> off) << 16;
499 p |= (
tget(&pal_gb[1], type, s->
le) >> off) << 8;
500 p |=
tget(&pal_gb[2], type, s->
le) >> off;
523 "Unknown or unsupported tag %d/0X%0X\n",
539 int i, j, entries,
stride;
540 unsigned soff, ssize;
550 id = bytestream2_get_le16(&s->
gb);
553 else if (
id == 0x4D4D)
567 "The answer to life, universe and everything is not correct!\n");
574 if (off >= UINT_MAX - 14 || avpkt->
size < off + 14) {
580 for (i = 0; i < entries; i++) {
612 for (i = 0; i < s->
height; i += s->
rps) {
619 soff =
tget(&stripdata, s->
sot, le);
623 if (soff > avpkt->
size || ssize > avpkt->
size - soff) {
638 ssize = s->
width * soff;
640 for (i = 0; i < s->
height; i++) {
641 for (j = soff; j < ssize; j += 2)
646 for (i = 0; i < s->
height; i++) {
647 for (j = soff; j < ssize; j += 2)
652 for (i = 0; i < s->
height; i++) {
653 for (j = soff; j < ssize; j++)
654 dst[j] += dst[j - soff];
662 for (i = 0; i < s->
height; i++) {
663 for (j = 0; j < p->
linesize[0]; j++)
664 dst[j] = 255 - dst[j];
int ff_lzw_decode(LZWState *p, uint8_t *buf, int len)
Decode given number of bytes NOTE: the algorithm here is inspired from the LZW GIF decoder written by...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static av_always_inline void bytestream2_set_buffer(PutByteContext *p, const uint8_t c, unsigned int size)
This structure describes decoded (raw) audio or video data.
16bit gray, 16bit alpha (big-endian)
static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride, const uint8_t *src, int size, int lines)
packed RGB 8:8:8, 24bpp, RGBRGB...
#define AV_LOG_WARNING
Something somehow does not look correct.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
av_cold void ff_lzw_decode_close(LZWState **p)
av_cold void ff_lzw_decode_open(LZWState **p)
static int init_image(TiffContext *s, AVFrame *frame)
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
static int8_t ff_u8_to_s8(uint8_t a)
static unsigned tget_short(GetByteContext *gb, int le)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static unsigned tget_long(GetByteContext *gb, int le)
av_cold void ff_ccitt_unpack_init(void)
initialize upacker code
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
16bit gray, 16bit alpha (little-endian)
const char * name
Name of the codec implementation.
static av_cold int tiff_init(AVCodecContext *avctx)
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static const uint8_t type_sizes[6]
sizes of various TIFF field types (string size = 100)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_cold int tiff_end(AVCodecContext *avctx)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
static int tiff_decode_tag(TiffContext *s)
int ff_ccitt_unpack(AVCodecContext *avctx, const uint8_t *src, int srcsize, uint8_t *dst, int height, int stride, enum TiffCompr compr, int opts)
unpack data compressed with CCITT Group 3 1/2-D or Group 4 method
Libavcodec external API header.
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
enum TiffPhotometric photometric
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
int width
picture width / height.
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
#define FF_ARRAY_ELEMS(a)
static unsigned tget(GetByteContext *gb, int type, int le)
8 bit with PIX_FMT_RGB32 palette
#define AVERROR_PATCHWELCOME
Not yet implemented in Libav, patches welcome.
static av_always_inline int bytestream2_seek_p(PutByteContext *p, int offset, int whence)
static av_always_inline int bytestream2_tell(GetByteContext *g)
TiffCompr
list of TIFF compression types
main external API structure.
static void close(AVCodecParserContext *s)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static av_always_inline unsigned int bytestream2_copy_buffer(PutByteContext *p, GetByteContext *g, unsigned int size)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
common internal api header.
static av_always_inline unsigned int bytestream2_get_eof(PutByteContext *p)
int ff_lzw_decode_init(LZWState *p, int csize, const uint8_t *buf, int buf_size, int mode)
Initialize LZW decoder.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
static av_cold int init(AVCodecParserContext *s)
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Y , 16bpp, little-endian.
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
const uint8_t ff_reverse[256]
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb...
This structure stores compressed data.
static int tiff_unpack_fax(TiffContext *s, uint8_t *dst, int stride, const uint8_t *src, int size, int lines)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
CCITT Fax Group 3 and 4 decompression.