Mercurial > libavcodec.hg
annotate tiffenc.c @ 7351:1502ba3beb72 libavcodec
The codebook generator algorithm involves picking three
different codebook centroids ("high utility", "low
utility" and "closest to the low utility one"). This
change avoid the corner case of choosing two times the
same centroid.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 03:54:31 +0000 |
parents | e943e1409077 |
children | 7a463923ecd1 |
rev | line source |
---|---|
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
1 /* |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
2 * TIFF image encoder |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
3 * Copyright (c) 2007 Bartlomiej Wolowiec |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
4 * |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
5 * This file is part of FFmpeg. |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
6 * |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
11 * |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
16 * |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
20 */ |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
21 |
4782
bca8924ed36c
Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents:
4774
diff
changeset
|
22 /** |
bca8924ed36c
Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents:
4774
diff
changeset
|
23 * TIFF image encoder |
bca8924ed36c
Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents:
4774
diff
changeset
|
24 * @file tiffenc.c |
bca8924ed36c
Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents:
4774
diff
changeset
|
25 * @author Bartlomiej Wolowiec |
bca8924ed36c
Add some Doxygen comments, by Kamil Nowosad, k.nowosad students.mimuw.edu pl.
diego
parents:
4774
diff
changeset
|
26 */ |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
27 #include "avcodec.h" |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
28 #ifdef CONFIG_ZLIB |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
29 #include <zlib.h> |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
30 #endif |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
31 #include "bytestream.h" |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
32 #include "tiff.h" |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
33 #include "rle.h" |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
34 #include "lzw.h" |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
35 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
36 #define TIFF_MAX_ENTRY 32 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
37 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
38 /** sizes of various TIFF field types (string size = 1)*/ |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
39 static const uint8_t type_sizes2[6] = { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
40 0, 1, 1, 2, 4, 8 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
41 }; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
42 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
43 typedef struct TiffEncoderContext { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
44 AVCodecContext *avctx; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
45 AVFrame picture; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
46 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
47 int width; ///< picture width |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
48 int height; ///< picture height |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
49 unsigned int bpp; ///< bits per pixel |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
50 int compr; ///< compression level |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
51 int bpp_tab_size; ///< bpp_tab size |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
52 int photometric_interpretation; ///< photometric interpretation |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
53 int strips; ///< number of strips |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
54 int rps; ///< row per strip |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
55 uint8_t entries[TIFF_MAX_ENTRY*12]; ///< entires in header |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
56 int num_entries; ///< number of entires |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
57 uint8_t **buf; ///< actual position in buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
58 uint8_t *buf_start; ///< pointer to first byte in buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
59 int buf_size; ///< buffer size |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
60 uint16_t subsampling[2]; ///< YUV subsampling factors |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
61 struct LZWEncodeState *lzws; ///< LZW Encode state |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
62 } TiffEncoderContext; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
63 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
64 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
65 /** |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
66 * Check free space in buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
67 * @param s Tiff context |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
68 * @param need Needed bytes |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
69 * @return 0 - ok, 1 - no free space |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
70 */ |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
71 inline static int check_size(TiffEncoderContext * s, uint64_t need) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
72 { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
73 if (s->buf_size < *s->buf - s->buf_start + need) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
74 *s->buf = s->buf_start + s->buf_size + 1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
75 av_log(s->avctx, AV_LOG_ERROR, "Buffer is too small\n"); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
76 return 1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
77 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
78 return 0; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
79 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
80 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
81 /** |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
82 * Put n values to buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
83 * |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
84 * @param p Pointer to pointer to output buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
85 * @param n Number of values |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
86 * @param val Pointer to values |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
87 * @param type Type of values |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
88 * @param flip =0 - normal copy, >0 - flip |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
89 */ |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
90 static void tnput(uint8_t ** p, int n, const uint8_t * val, enum TiffTypes type, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
91 int flip) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
92 { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
93 int i; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
94 #ifdef WORDS_BIGENDIAN |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
95 flip ^= ((int[]) {0, 0, 0, 1, 3, 3})[type]; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
96 #endif |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
97 for (i = 0; i < n * type_sizes2[type]; i++) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
98 *(*p)++ = val[i ^ flip]; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
99 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
100 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
101 /** |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
102 * Add entry to directory in tiff header. |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
103 * @param s Tiff context |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
104 * @param tag Tag that identifies the entry |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
105 * @param type Entry type |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
106 * @param count The number of values |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
107 * @param ptr_val Pointer to values |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
108 */ |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
109 static void add_entry(TiffEncoderContext * s, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
110 enum TiffTags tag, enum TiffTypes type, int count, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
111 const void *ptr_val) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
112 { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
113 uint8_t *entries_ptr = s->entries + 12 * s->num_entries; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
114 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
115 assert(s->num_entries < TIFF_MAX_ENTRY); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
116 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
117 bytestream_put_le16(&entries_ptr, tag); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
118 bytestream_put_le16(&entries_ptr, type); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
119 bytestream_put_le32(&entries_ptr, count); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
120 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
121 if (type_sizes[type] * count <= 4) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
122 tnput(&entries_ptr, count, ptr_val, type, 0); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
123 } else { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
124 bytestream_put_le32(&entries_ptr, *s->buf - s->buf_start); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
125 check_size(s, count * type_sizes2[type]); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
126 tnput(s->buf, count, ptr_val, type, 0); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
127 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
128 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
129 s->num_entries++; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
130 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
131 |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
132 static void add_entry1(TiffEncoderContext * s, |
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
133 enum TiffTags tag, enum TiffTypes type, int val){ |
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
134 uint16_t w = val; |
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
135 uint32_t dw= val; |
6313 | 136 add_entry(s, tag, type, 1, type == TIFF_SHORT ? (void *)&w : (void *)&dw); |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
137 } |
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
138 |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
139 /** |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
140 * Encode one strip in tiff file |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
141 * |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
142 * @param s Tiff context |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
143 * @param src Input buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
144 * @param dst Output buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
145 * @param n Size of input buffer |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
146 * @param compr Compression method |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
147 * @return Number of output bytes. If an output error is encountered, -1 returned |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
148 */ |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
149 static int encode_strip(TiffEncoderContext * s, const int8_t * src, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
150 uint8_t * dst, int n, int compr) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
151 { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
152 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
153 switch (compr) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
154 #ifdef CONFIG_ZLIB |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
155 case TIFF_DEFLATE: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
156 case TIFF_ADOBE_DEFLATE: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
157 { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
158 unsigned long zlen = s->buf_size - (*s->buf - s->buf_start); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
159 if (compress(dst, &zlen, src, n) != Z_OK) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
160 av_log(s->avctx, AV_LOG_ERROR, "Compressing failed\n"); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
161 return -1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
162 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
163 return zlen; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
164 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
165 #endif |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
166 case TIFF_RAW: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
167 if (check_size(s, n)) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
168 return -1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
169 memcpy(dst, src, n); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
170 return n; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
171 case TIFF_PACKBITS: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
172 return ff_rle_encode(dst, s->buf_size - (*s->buf - s->buf_start), src, 1, n, 2, 0xff, -1, 0); |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
173 case TIFF_LZW: |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
174 return ff_lzw_encode(s->lzws, src, n); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
175 default: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
176 return -1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
177 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
178 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
179 |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
180 static void pack_yuv(TiffEncoderContext * s, uint8_t * dst, int lnum) |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
181 { |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
182 AVFrame *p = &s->picture; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
183 int i, j, k; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
184 int w = (s->width - 1) / s->subsampling[0] + 1; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
185 uint8_t *pu = &p->data[1][lnum / s->subsampling[1] * p->linesize[1]]; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
186 uint8_t *pv = &p->data[2][lnum / s->subsampling[1] * p->linesize[2]]; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
187 for (i = 0; i < w; i++){ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
188 for (j = 0; j < s->subsampling[1]; j++) |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
189 for (k = 0; k < s->subsampling[0]; k++) |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
190 *dst++ = p->data[0][(lnum + j) * p->linesize[0] + |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
191 i * s->subsampling[0] + k]; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
192 *dst++ = *pu++; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
193 *dst++ = *pv++; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
194 } |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
195 } |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
196 |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
197 static int encode_frame(AVCodecContext * avctx, unsigned char *buf, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
198 int buf_size, void *data) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
199 { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
200 TiffEncoderContext *s = avctx->priv_data; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
201 AVFrame *pict = data; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
202 AVFrame *const p = (AVFrame *) & s->picture; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
203 int i; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
204 int n; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
205 uint8_t *ptr = buf; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
206 uint8_t *offset; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
207 uint32_t strips; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
208 uint32_t *strip_sizes = NULL; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
209 uint32_t *strip_offsets = NULL; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
210 int bytes_per_row; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
211 uint32_t res[2] = { 72, 1 }; // image resolution (72/1) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
212 static const uint16_t bpp_tab[] = { 8, 8, 8, 8 }; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
213 int ret = -1; |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
214 int is_yuv = 0; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
215 uint8_t *yuv_line = NULL; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
216 int shift_h, shift_v; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
217 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
218 s->buf_start = buf; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
219 s->buf = &ptr; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
220 s->buf_size = buf_size; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
221 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
222 *p = *pict; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
223 p->pict_type = FF_I_TYPE; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
224 p->key_frame = 1; |
6919 | 225 avctx->coded_frame= &s->picture; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
226 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
227 s->compr = TIFF_PACKBITS; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
228 if (avctx->compression_level == 0) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
229 s->compr = TIFF_RAW; |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
230 } else if(avctx->compression_level == 2) { |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
231 s->compr = TIFF_LZW; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
232 #ifdef CONFIG_ZLIB |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
233 } else if ((avctx->compression_level >= 3)) { |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
234 s->compr = TIFF_DEFLATE; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
235 #endif |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
236 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
237 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
238 s->width = avctx->width; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
239 s->height = avctx->height; |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
240 s->subsampling[0] = 1; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
241 s->subsampling[1] = 1; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
242 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
243 switch (avctx->pix_fmt) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
244 case PIX_FMT_RGB24: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
245 s->bpp = 24; |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
246 s->photometric_interpretation = 2; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
247 break; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
248 case PIX_FMT_GRAY8: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
249 s->bpp = 8; |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
250 s->photometric_interpretation = 1; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
251 break; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
252 case PIX_FMT_PAL8: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
253 s->bpp = 8; |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
254 s->photometric_interpretation = 3; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
255 break; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
256 case PIX_FMT_MONOBLACK: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
257 s->bpp = 1; |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
258 s->photometric_interpretation = 1; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
259 break; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
260 case PIX_FMT_MONOWHITE: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
261 s->bpp = 1; |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
262 s->photometric_interpretation = 0; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
263 break; |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
264 case PIX_FMT_YUV420P: |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
265 case PIX_FMT_YUV422P: |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
266 case PIX_FMT_YUV444P: |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
267 case PIX_FMT_YUV410P: |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
268 case PIX_FMT_YUV411P: |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
269 s->photometric_interpretation = 6; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
270 avcodec_get_chroma_sub_sample(avctx->pix_fmt, |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
271 &shift_h, &shift_v); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
272 s->bpp = 8 + (16 >> (shift_h + shift_v)); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
273 s->subsampling[0] = 1 << shift_h; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
274 s->subsampling[1] = 1 << shift_v; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
275 s->bpp_tab_size = 3; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
276 is_yuv = 1; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
277 break; |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
278 default: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
279 av_log(s->avctx, AV_LOG_ERROR, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
280 "This colors format is not supported\n"); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
281 return -1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
282 } |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
283 if (!is_yuv) |
4839 | 284 s->bpp_tab_size = (s->bpp >> 3); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
285 |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
286 if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE || s->compr == TIFF_LZW) |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
287 //best choose for DEFLATE |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
288 s->rps = s->height; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
289 else |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
290 s->rps = FFMAX(8192 / (((s->width * s->bpp) >> 3) + 1), 1); // suggest size of strip |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
291 s->rps = ((s->rps - 1) / s->subsampling[1] + 1) * s->subsampling[1]; // round rps up |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
292 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
293 strips = (s->height - 1) / s->rps + 1; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
294 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
295 if (check_size(s, 8)) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
296 goto fail; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
297 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
298 // write header |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
299 bytestream_put_le16(&ptr, 0x4949); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
300 bytestream_put_le16(&ptr, 42); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
301 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
302 offset = ptr; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
303 bytestream_put_le32(&ptr, 0); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
304 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
305 strip_sizes = av_mallocz(sizeof(*strip_sizes) * strips); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
306 strip_offsets = av_mallocz(sizeof(*strip_offsets) * strips); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
307 |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
308 bytes_per_row = (((s->width - 1)/s->subsampling[0] + 1) * s->bpp |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
309 * s->subsampling[0] * s->subsampling[1] + 7) >> 3; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
310 if (is_yuv){ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
311 yuv_line = av_malloc(bytes_per_row); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
312 if (yuv_line == NULL){ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
313 av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n"); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
314 goto fail; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
315 } |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
316 } |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
317 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
318 #ifdef CONFIG_ZLIB |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
319 if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
320 uint8_t *zbuf; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
321 int zlen, zn; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
322 int j; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
323 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
324 zlen = bytes_per_row * s->rps; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
325 zbuf = av_malloc(zlen); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
326 strip_offsets[0] = ptr - buf; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
327 zn = 0; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
328 for (j = 0; j < s->rps; j++) { |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
329 if (is_yuv){ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
330 pack_yuv(s, yuv_line, j); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
331 memcpy(zbuf + zn, yuv_line, bytes_per_row); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
332 j += s->subsampling[1] - 1; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
333 } |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
334 else |
4847 | 335 memcpy(zbuf + j * bytes_per_row, |
336 p->data[0] + j * p->linesize[0], bytes_per_row); | |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
337 zn += bytes_per_row; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
338 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
339 n = encode_strip(s, zbuf, ptr, zn, s->compr); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
340 av_free(zbuf); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
341 if (n<0) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
342 av_log(s->avctx, AV_LOG_ERROR, "Encode strip failed\n"); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
343 goto fail; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
344 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
345 ptr += n; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
346 strip_sizes[0] = ptr - buf - strip_offsets[0]; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
347 } else |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
348 #endif |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
349 { |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
350 if(s->compr == TIFF_LZW) |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
351 s->lzws = av_malloc(ff_lzw_encode_state_size); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
352 for (i = 0; i < s->height; i++) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
353 if (strip_sizes[i / s->rps] == 0) { |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
354 if(s->compr == TIFF_LZW){ |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
355 ff_lzw_encode_init(s->lzws, ptr, s->buf_size - (*s->buf - s->buf_start), 12); |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
356 } |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
357 strip_offsets[i / s->rps] = ptr - buf; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
358 } |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
359 if (is_yuv){ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
360 pack_yuv(s, yuv_line, i); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
361 n = encode_strip(s, yuv_line, ptr, bytes_per_row, s->compr); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
362 i += s->subsampling[1] - 1; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
363 } |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
364 else |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
365 n = encode_strip(s, p->data[0] + i * p->linesize[0], |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
366 ptr, bytes_per_row, s->compr); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
367 if (n < 0) { |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
368 av_log(s->avctx, AV_LOG_ERROR, "Encode strip failed\n"); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
369 goto fail; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
370 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
371 strip_sizes[i / s->rps] += n; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
372 ptr += n; |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
373 if(s->compr == TIFF_LZW && (i==s->height-1 || i%s->rps == s->rps-1)){ |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
374 int ret; |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
375 ret = ff_lzw_encode_flush(s->lzws); |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
376 strip_sizes[(i / s->rps )] += ret ; |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
377 ptr += ret; |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
378 } |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
379 } |
4799
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
380 if(s->compr == TIFF_LZW) |
812f759a7c59
TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
4792
diff
changeset
|
381 av_free(s->lzws); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
382 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
383 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
384 s->num_entries = 0; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
385 |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
386 add_entry1(s,TIFF_SUBFILE, TIFF_LONG, 0); |
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
387 add_entry1(s,TIFF_WIDTH, TIFF_LONG, s->width); |
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
388 add_entry1(s,TIFF_HEIGHT, TIFF_LONG, s->height); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
389 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
390 if (s->bpp_tab_size) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
391 add_entry(s, TIFF_BPP, TIFF_SHORT, s->bpp_tab_size, bpp_tab); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
392 |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
393 add_entry1(s,TIFF_COMPR, TIFF_SHORT, s->compr); |
4791
caafad01dec0
s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents:
4786
diff
changeset
|
394 add_entry1(s,TIFF_INVERT, TIFF_SHORT, s->photometric_interpretation); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
395 add_entry(s, TIFF_STRIP_OFFS, TIFF_LONG, strips, strip_offsets); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
396 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
397 if (s->bpp_tab_size) |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
398 add_entry1(s,TIFF_SAMPLES_PER_PIXEL, TIFF_SHORT, s->bpp_tab_size); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
399 |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
400 add_entry1(s,TIFF_ROWSPERSTRIP, TIFF_LONG, s->rps); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
401 add_entry(s, TIFF_STRIP_SIZE, TIFF_LONG, strips, strip_sizes); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
402 add_entry(s, TIFF_XRES, TIFF_RATIONAL, 1, res); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
403 add_entry(s, TIFF_YRES, TIFF_RATIONAL, 1, res); |
4786
95f58f0b70fc
remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents:
4782
diff
changeset
|
404 add_entry1(s,TIFF_RES_UNIT, TIFF_SHORT, 2); |
4850
9e471439d2e8
fix tiff regression test (bitexact flag was ignoredwhich caused the
michael
parents:
4847
diff
changeset
|
405 |
9e471439d2e8
fix tiff regression test (bitexact flag was ignoredwhich caused the
michael
parents:
4847
diff
changeset
|
406 if(!(avctx->flags & CODEC_FLAG_BITEXACT)) |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
407 add_entry(s, TIFF_SOFTWARE_NAME, TIFF_STRING, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
408 strlen(LIBAVCODEC_IDENT) + 1, LIBAVCODEC_IDENT); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
409 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
410 if (avctx->pix_fmt == PIX_FMT_PAL8) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
411 uint16_t pal[256 * 3]; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
412 for (i = 0; i < 256; i++) { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
413 uint32_t rgb = *(uint32_t *) (p->data[1] + i * 4); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
414 pal[i] = ((rgb >> 16) & 0xff) * 257; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
415 pal[i + 256] = ((rgb >> 8 ) & 0xff) * 257; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
416 pal[i + 512] = ( rgb & 0xff) * 257; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
417 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
418 add_entry(s, TIFF_PAL, TIFF_SHORT, 256 * 3, pal); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
419 } |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
420 if (is_yuv){ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
421 /** according to CCIR Recommendation 601.1 */ |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
422 uint32_t refbw[12] = {15, 1, 235, 1, 128, 1, 240, 1, 128, 1, 240, 1}; |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
423 add_entry(s, TIFF_YCBCR_SUBSAMPLING, TIFF_SHORT, 2, s->subsampling); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
424 add_entry(s, TIFF_REFERENCE_BW, TIFF_RATIONAL, 6, refbw); |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
425 } |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
426 bytestream_put_le32(&offset, ptr - buf); // write offset to dir |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
427 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
428 if (check_size(s, 6 + s->num_entries * 12)) |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
429 goto fail; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
430 bytestream_put_le16(&ptr, s->num_entries); // write tag count |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
431 bytestream_put_buffer(&ptr, s->entries, s->num_entries * 12); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
432 bytestream_put_le32(&ptr, 0); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
433 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
434 ret = ptr - buf; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
435 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
436 fail: |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
437 av_free(strip_sizes); |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
438 av_free(strip_offsets); |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
439 av_free(yuv_line); |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
440 return ret; |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
441 } |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
442 |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
443 AVCodec tiff_encoder = { |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
444 "tiff", |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
445 CODEC_TYPE_VIDEO, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
446 CODEC_ID_TIFF, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
447 sizeof(TiffEncoderContext), |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
448 NULL, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
449 encode_frame, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
450 NULL, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
451 NULL, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
452 0, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
453 NULL, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
454 .pix_fmts = |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
455 (enum PixelFormat[]) {PIX_FMT_RGB24, PIX_FMT_PAL8, PIX_FMT_GRAY8, |
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
456 PIX_FMT_MONOBLACK, PIX_FMT_MONOWHITE, |
4792
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
457 PIX_FMT_YUV420P, PIX_FMT_YUV422P, |
d8b17a09a114
YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents:
4791
diff
changeset
|
458 PIX_FMT_YUV444P, PIX_FMT_YUV410P, |
6570 | 459 PIX_FMT_YUV411P, |
6788 | 460 PIX_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6919
diff
changeset
|
461 .long_name = NULL_IF_CONFIG_SMALL("TIFF image"), |
4774
0860efc2f02b
tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff
changeset
|
462 }; |