3 * Copyright (c) 2007 Bartlomiej Wolowiec
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * @author Bartlomiej Wolowiec
31 #include "bytestream.h"
36 #define TIFF_MAX_ENTRY 32
38 /** sizes of various TIFF field types (string size = 1)*/
39 static const uint8_t type_sizes2
[6] = {
43 typedef struct TiffEncoderContext
{
44 AVCodecContext
*avctx
;
47 int width
; ///< picture width
48 int height
; ///< picture height
49 unsigned int bpp
; ///< bits per pixel
50 int compr
; ///< compression level
51 int bpp_tab_size
; ///< bpp_tab size
52 int photometric_interpretation
; ///< photometric interpretation
53 int strips
; ///< number of strips
54 int rps
; ///< row per strip
55 uint8_t entries
[TIFF_MAX_ENTRY
*12]; ///< entires in header
56 int num_entries
; ///< number of entires
57 uint8_t **buf
; ///< actual position in buffer
58 uint8_t *buf_start
; ///< pointer to first byte in buffer
59 int buf_size
; ///< buffer size
60 uint16_t subsampling
[2]; ///< YUV subsampling factors
61 struct LZWEncodeState
*lzws
; ///< LZW Encode state
66 * Check free space in buffer
67 * @param s Tiff context
68 * @param need Needed bytes
69 * @return 0 - ok, 1 - no free space
71 inline static int check_size(TiffEncoderContext
* s
, uint64_t need
)
73 if (s
->buf_size
< *s
->buf
- s
->buf_start
+ need
) {
74 *s
->buf
= s
->buf_start
+ s
->buf_size
+ 1;
75 av_log(s
->avctx
, AV_LOG_ERROR
, "Buffer is too small\n");
82 * Put n values to buffer
84 * @param p Pointer to pointer to output buffer
85 * @param n Number of values
86 * @param val Pointer to values
87 * @param type Type of values
88 * @param flip =0 - normal copy, >0 - flip
90 static void tnput(uint8_t ** p
, int n
, const uint8_t * val
, enum TiffTypes type
,
94 #ifdef WORDS_BIGENDIAN
95 flip
^= ((int[]) {0, 0, 0, 1, 3, 3})[type
];
97 for (i
= 0; i
< n
* type_sizes2
[type
]; i
++)
98 *(*p
)++ = val
[i
^ flip
];
102 * Add entry to directory in tiff header.
103 * @param s Tiff context
104 * @param tag Tag that identifies the entry
105 * @param type Entry type
106 * @param count The number of values
107 * @param ptr_val Pointer to values
109 static void add_entry(TiffEncoderContext
* s
,
110 enum TiffTags tag
, enum TiffTypes type
, int count
,
113 uint8_t *entries_ptr
= s
->entries
+ 12 * s
->num_entries
;
115 assert(s
->num_entries
< TIFF_MAX_ENTRY
);
117 bytestream_put_le16(&entries_ptr
, tag
);
118 bytestream_put_le16(&entries_ptr
, type
);
119 bytestream_put_le32(&entries_ptr
, count
);
121 if (type_sizes
[type
] * count
<= 4) {
122 tnput(&entries_ptr
, count
, ptr_val
, type
, 0);
124 bytestream_put_le32(&entries_ptr
, *s
->buf
- s
->buf_start
);
125 check_size(s
, count
* type_sizes2
[type
]);
126 tnput(s
->buf
, count
, ptr_val
, type
, 0);
132 static void add_entry1(TiffEncoderContext
* s
,
133 enum TiffTags tag
, enum TiffTypes type
, int val
){
136 add_entry(s
, tag
, type
, 1, type
== TIFF_SHORT
? (void *)&w
: (void *)&dw
);
140 * Encode one strip in tiff file
142 * @param s Tiff context
143 * @param src Input buffer
144 * @param dst Output buffer
145 * @param n Size of input buffer
146 * @param compr Compression method
147 * @return Number of output bytes. If an output error is encountered, -1 returned
149 static int encode_strip(TiffEncoderContext
* s
, const int8_t * src
,
150 uint8_t * dst
, int n
, int compr
)
156 case TIFF_ADOBE_DEFLATE
:
158 unsigned long zlen
= s
->buf_size
- (*s
->buf
- s
->buf_start
);
159 if (compress(dst
, &zlen
, src
, n
) != Z_OK
) {
160 av_log(s
->avctx
, AV_LOG_ERROR
, "Compressing failed\n");
167 if (check_size(s
, n
))
172 return ff_rle_encode(dst
, s
->buf_size
- (*s
->buf
- s
->buf_start
), src
, 1, n
, 2, 0xff, -1, 0);
174 return ff_lzw_encode(s
->lzws
, src
, n
);
180 static void pack_yuv(TiffEncoderContext
* s
, uint8_t * dst
, int lnum
)
182 AVFrame
*p
= &s
->picture
;
184 int w
= (s
->width
- 1) / s
->subsampling
[0] + 1;
185 uint8_t *pu
= &p
->data
[1][lnum
/ s
->subsampling
[1] * p
->linesize
[1]];
186 uint8_t *pv
= &p
->data
[2][lnum
/ s
->subsampling
[1] * p
->linesize
[2]];
187 for (i
= 0; i
< w
; i
++){
188 for (j
= 0; j
< s
->subsampling
[1]; j
++)
189 for (k
= 0; k
< s
->subsampling
[0]; k
++)
190 *dst
++ = p
->data
[0][(lnum
+ j
) * p
->linesize
[0] +
191 i
* s
->subsampling
[0] + k
];
197 static int encode_frame(AVCodecContext
* avctx
, unsigned char *buf
,
198 int buf_size
, void *data
)
200 TiffEncoderContext
*s
= avctx
->priv_data
;
201 AVFrame
*pict
= data
;
202 AVFrame
*const p
= (AVFrame
*) & s
->picture
;
208 uint32_t *strip_sizes
= NULL
;
209 uint32_t *strip_offsets
= NULL
;
211 uint32_t res
[2] = { 72, 1 }; // image resolution (72/1)
212 static const uint16_t bpp_tab
[] = { 8, 8, 8, 8 };
215 uint8_t *yuv_line
= NULL
;
216 int shift_h
, shift_v
;
220 s
->buf_size
= buf_size
;
223 p
->pict_type
= FF_I_TYPE
;
225 avctx
->coded_frame
= &s
->picture
;
227 s
->compr
= TIFF_PACKBITS
;
228 if (avctx
->compression_level
== 0) {
230 } else if(avctx
->compression_level
== 2) {
233 } else if ((avctx
->compression_level
>= 3)) {
234 s
->compr
= TIFF_DEFLATE
;
238 s
->width
= avctx
->width
;
239 s
->height
= avctx
->height
;
240 s
->subsampling
[0] = 1;
241 s
->subsampling
[1] = 1;
243 switch (avctx
->pix_fmt
) {
246 s
->photometric_interpretation
= 2;
250 s
->photometric_interpretation
= 1;
254 s
->photometric_interpretation
= 3;
256 case PIX_FMT_MONOBLACK
:
258 s
->photometric_interpretation
= 1;
260 case PIX_FMT_MONOWHITE
:
262 s
->photometric_interpretation
= 0;
264 case PIX_FMT_YUV420P
:
265 case PIX_FMT_YUV422P
:
266 case PIX_FMT_YUV444P
:
267 case PIX_FMT_YUV410P
:
268 case PIX_FMT_YUV411P
:
269 s
->photometric_interpretation
= 6;
270 avcodec_get_chroma_sub_sample(avctx
->pix_fmt
,
272 s
->bpp
= 8 + (16 >> (shift_h
+ shift_v
));
273 s
->subsampling
[0] = 1 << shift_h
;
274 s
->subsampling
[1] = 1 << shift_v
;
279 av_log(s
->avctx
, AV_LOG_ERROR
,
280 "This colors format is not supported\n");
284 s
->bpp_tab_size
= (s
->bpp
>> 3);
286 if (s
->compr
== TIFF_DEFLATE
|| s
->compr
== TIFF_ADOBE_DEFLATE
|| s
->compr
== TIFF_LZW
)
287 //best choose for DEFLATE
290 s
->rps
= FFMAX(8192 / (((s
->width
* s
->bpp
) >> 3) + 1), 1); // suggest size of strip
291 s
->rps
= ((s
->rps
- 1) / s
->subsampling
[1] + 1) * s
->subsampling
[1]; // round rps up
293 strips
= (s
->height
- 1) / s
->rps
+ 1;
295 if (check_size(s
, 8))
299 bytestream_put_le16(&ptr
, 0x4949);
300 bytestream_put_le16(&ptr
, 42);
303 bytestream_put_le32(&ptr
, 0);
305 strip_sizes
= av_mallocz(sizeof(*strip_sizes
) * strips
);
306 strip_offsets
= av_mallocz(sizeof(*strip_offsets
) * strips
);
308 bytes_per_row
= (((s
->width
- 1)/s
->subsampling
[0] + 1) * s
->bpp
309 * s
->subsampling
[0] * s
->subsampling
[1] + 7) >> 3;
311 yuv_line
= av_malloc(bytes_per_row
);
312 if (yuv_line
== NULL
){
313 av_log(s
->avctx
, AV_LOG_ERROR
, "Not enough memory\n");
319 if (s
->compr
== TIFF_DEFLATE
|| s
->compr
== TIFF_ADOBE_DEFLATE
) {
324 zlen
= bytes_per_row
* s
->rps
;
325 zbuf
= av_malloc(zlen
);
326 strip_offsets
[0] = ptr
- buf
;
328 for (j
= 0; j
< s
->rps
; j
++) {
330 pack_yuv(s
, yuv_line
, j
);
331 memcpy(zbuf
+ zn
, yuv_line
, bytes_per_row
);
332 j
+= s
->subsampling
[1] - 1;
335 memcpy(zbuf
+ j
* bytes_per_row
,
336 p
->data
[0] + j
* p
->linesize
[0], bytes_per_row
);
339 n
= encode_strip(s
, zbuf
, ptr
, zn
, s
->compr
);
342 av_log(s
->avctx
, AV_LOG_ERROR
, "Encode strip failed\n");
346 strip_sizes
[0] = ptr
- buf
- strip_offsets
[0];
350 if(s
->compr
== TIFF_LZW
)
351 s
->lzws
= av_malloc(ff_lzw_encode_state_size
);
352 for (i
= 0; i
< s
->height
; i
++) {
353 if (strip_sizes
[i
/ s
->rps
] == 0) {
354 if(s
->compr
== TIFF_LZW
){
355 ff_lzw_encode_init(s
->lzws
, ptr
, s
->buf_size
- (*s
->buf
- s
->buf_start
), 12);
357 strip_offsets
[i
/ s
->rps
] = ptr
- buf
;
360 pack_yuv(s
, yuv_line
, i
);
361 n
= encode_strip(s
, yuv_line
, ptr
, bytes_per_row
, s
->compr
);
362 i
+= s
->subsampling
[1] - 1;
365 n
= encode_strip(s
, p
->data
[0] + i
* p
->linesize
[0],
366 ptr
, bytes_per_row
, s
->compr
);
368 av_log(s
->avctx
, AV_LOG_ERROR
, "Encode strip failed\n");
371 strip_sizes
[i
/ s
->rps
] += n
;
373 if(s
->compr
== TIFF_LZW
&& (i
==s
->height
-1 || i
%s
->rps
== s
->rps
-1)){
375 ret
= ff_lzw_encode_flush(s
->lzws
);
376 strip_sizes
[(i
/ s
->rps
)] += ret
;
380 if(s
->compr
== TIFF_LZW
)
386 add_entry1(s
,TIFF_SUBFILE
, TIFF_LONG
, 0);
387 add_entry1(s
,TIFF_WIDTH
, TIFF_LONG
, s
->width
);
388 add_entry1(s
,TIFF_HEIGHT
, TIFF_LONG
, s
->height
);
391 add_entry(s
, TIFF_BPP
, TIFF_SHORT
, s
->bpp_tab_size
, bpp_tab
);
393 add_entry1(s
,TIFF_COMPR
, TIFF_SHORT
, s
->compr
);
394 add_entry1(s
,TIFF_INVERT
, TIFF_SHORT
, s
->photometric_interpretation
);
395 add_entry(s
, TIFF_STRIP_OFFS
, TIFF_LONG
, strips
, strip_offsets
);
398 add_entry1(s
,TIFF_SAMPLES_PER_PIXEL
, TIFF_SHORT
, s
->bpp_tab_size
);
400 add_entry1(s
,TIFF_ROWSPERSTRIP
, TIFF_LONG
, s
->rps
);
401 add_entry(s
, TIFF_STRIP_SIZE
, TIFF_LONG
, strips
, strip_sizes
);
402 add_entry(s
, TIFF_XRES
, TIFF_RATIONAL
, 1, res
);
403 add_entry(s
, TIFF_YRES
, TIFF_RATIONAL
, 1, res
);
404 add_entry1(s
,TIFF_RES_UNIT
, TIFF_SHORT
, 2);
406 if(!(avctx
->flags
& CODEC_FLAG_BITEXACT
))
407 add_entry(s
, TIFF_SOFTWARE_NAME
, TIFF_STRING
,
408 strlen(LIBAVCODEC_IDENT
) + 1, LIBAVCODEC_IDENT
);
410 if (avctx
->pix_fmt
== PIX_FMT_PAL8
) {
411 uint16_t pal
[256 * 3];
412 for (i
= 0; i
< 256; i
++) {
413 uint32_t rgb
= *(uint32_t *) (p
->data
[1] + i
* 4);
414 pal
[i
] = ((rgb
>> 16) & 0xff) * 257;
415 pal
[i
+ 256] = ((rgb
>> 8 ) & 0xff) * 257;
416 pal
[i
+ 512] = ( rgb
& 0xff) * 257;
418 add_entry(s
, TIFF_PAL
, TIFF_SHORT
, 256 * 3, pal
);
421 /** according to CCIR Recommendation 601.1 */
422 uint32_t refbw
[12] = {15, 1, 235, 1, 128, 1, 240, 1, 128, 1, 240, 1};
423 add_entry(s
, TIFF_YCBCR_SUBSAMPLING
, TIFF_SHORT
, 2, s
->subsampling
);
424 add_entry(s
, TIFF_REFERENCE_BW
, TIFF_RATIONAL
, 6, refbw
);
426 bytestream_put_le32(&offset
, ptr
- buf
); // write offset to dir
428 if (check_size(s
, 6 + s
->num_entries
* 12))
430 bytestream_put_le16(&ptr
, s
->num_entries
); // write tag count
431 bytestream_put_buffer(&ptr
, s
->entries
, s
->num_entries
* 12);
432 bytestream_put_le32(&ptr
, 0);
437 av_free(strip_sizes
);
438 av_free(strip_offsets
);
443 AVCodec tiff_encoder
= {
447 sizeof(TiffEncoderContext
),
455 (enum PixelFormat
[]) {PIX_FMT_RGB24
, PIX_FMT_PAL8
, PIX_FMT_GRAY8
,
456 PIX_FMT_MONOBLACK
, PIX_FMT_MONOWHITE
,
457 PIX_FMT_YUV420P
, PIX_FMT_YUV422P
,
458 PIX_FMT_YUV444P
, PIX_FMT_YUV410P
,
461 .long_name
= NULL_IF_CONFIG_SMALL("TIFF image"),