annotate tiffenc.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents 2b72f9bc4f06
children ce8de7773485
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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;
95f58f0b70fc remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents: 4782
diff changeset
136 add_entry(s, tag, type, 1, type == TIFF_SHORT ? &w : &dw);
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;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
225
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
226 s->compr = TIFF_PACKBITS;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
227 if (avctx->compression_level == 0) {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
228 s->compr = TIFF_RAW;
4799
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
229 } 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
230 s->compr = TIFF_LZW;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
231 #ifdef CONFIG_ZLIB
4799
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
232 } else if ((avctx->compression_level >= 3)) {
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
233 s->compr = TIFF_DEFLATE;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
234 #endif
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
235 }
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 s->width = avctx->width;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
238 s->height = avctx->height;
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
239 s->subsampling[0] = 1;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
240 s->subsampling[1] = 1;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
241
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
242 switch (avctx->pix_fmt) {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
243 case PIX_FMT_RGB24:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
244 s->bpp = 24;
4791
caafad01dec0 s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents: 4786
diff changeset
245 s->photometric_interpretation = 2;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
246 break;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
247 case PIX_FMT_GRAY8:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
248 s->bpp = 8;
4791
caafad01dec0 s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents: 4786
diff changeset
249 s->photometric_interpretation = 1;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
250 break;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
251 case PIX_FMT_PAL8:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
252 s->bpp = 8;
4791
caafad01dec0 s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents: 4786
diff changeset
253 s->photometric_interpretation = 3;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
254 break;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
255 case PIX_FMT_MONOBLACK:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
256 s->bpp = 1;
4791
caafad01dec0 s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents: 4786
diff changeset
257 s->photometric_interpretation = 1;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
258 break;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
259 case PIX_FMT_MONOWHITE:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
260 s->bpp = 1;
4791
caafad01dec0 s/invert/photometric_interpretation/ patch by Kamil Nowosad k.nowosad students mimuw edu pl
michael
parents: 4786
diff changeset
261 s->photometric_interpretation = 0;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
262 break;
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
263 case PIX_FMT_YUV420P:
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
264 case PIX_FMT_YUV422P:
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
265 case PIX_FMT_YUV444P:
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
266 case PIX_FMT_YUV410P:
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
267 case PIX_FMT_YUV411P:
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
268 s->photometric_interpretation = 6;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
269 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
270 &shift_h, &shift_v);
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
271 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
272 s->subsampling[0] = 1 << shift_h;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
273 s->subsampling[1] = 1 << shift_v;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
274 s->bpp_tab_size = 3;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
275 is_yuv = 1;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
276 break;
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
277 default:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
278 av_log(s->avctx, AV_LOG_ERROR,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
279 "This colors format is not supported\n");
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
280 return -1;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
281 }
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
282 if (!is_yuv)
4839
1a5c08c07cfb cosmetics: indentation
diego
parents: 4799
diff changeset
283 s->bpp_tab_size = (s->bpp >> 3);
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
284
4799
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
285 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
286 //best choose for DEFLATE
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
287 s->rps = s->height;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
288 else
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
289 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
290 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
291
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
292 strips = (s->height - 1) / s->rps + 1;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
293
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
294 if (check_size(s, 8))
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
295 goto fail;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
296
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
297 // write header
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
298 bytestream_put_le16(&ptr, 0x4949);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
299 bytestream_put_le16(&ptr, 42);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
300
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
301 offset = ptr;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
302 bytestream_put_le32(&ptr, 0);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
303
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
304 strip_sizes = av_mallocz(sizeof(*strip_sizes) * strips);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
305 strip_offsets = av_mallocz(sizeof(*strip_offsets) * strips);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
306
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
307 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
308 * 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
309 if (is_yuv){
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
310 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
311 if (yuv_line == NULL){
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
312 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
313 goto fail;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
314 }
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
315 }
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
316
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
317 #ifdef CONFIG_ZLIB
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
318 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
319 uint8_t *zbuf;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
320 int zlen, zn;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
321 int j;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
322
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
323 zlen = bytes_per_row * s->rps;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
324 zbuf = av_malloc(zlen);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
325 strip_offsets[0] = ptr - buf;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
326 zn = 0;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
327 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
328 if (is_yuv){
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
329 pack_yuv(s, yuv_line, j);
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
330 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
331 j += s->subsampling[1] - 1;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
332 }
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
333 else
4847
1a8865f72b04 cosmetics: Fix indentation.
diego
parents: 4839
diff changeset
334 memcpy(zbuf + j * bytes_per_row,
1a8865f72b04 cosmetics: Fix indentation.
diego
parents: 4839
diff changeset
335 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
336 zn += bytes_per_row;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
337 }
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
338 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
339 av_free(zbuf);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
340 if (n<0) {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
341 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
342 goto fail;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
343 }
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
344 ptr += n;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
345 strip_sizes[0] = ptr - buf - strip_offsets[0];
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
346 } else
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
347 #endif
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
348 {
4799
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
349 if(s->compr == TIFF_LZW)
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
350 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
351 for (i = 0; i < s->height; i++) {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
352 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
353 if(s->compr == TIFF_LZW){
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
354 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
355 }
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
356 strip_offsets[i / s->rps] = ptr - buf;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
357 }
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
358 if (is_yuv){
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
359 pack_yuv(s, yuv_line, i);
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
360 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
361 i += s->subsampling[1] - 1;
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
362 }
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
363 else
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
364 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
365 ptr, bytes_per_row, s->compr);
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
366 if (n < 0) {
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
367 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
368 goto fail;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
369 }
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
370 strip_sizes[i / s->rps] += n;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
371 ptr += n;
4799
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
372 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
373 int ret;
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
374 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
375 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
376 ptr += ret;
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
377 }
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
378 }
4799
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
379 if(s->compr == TIFF_LZW)
812f759a7c59 TIFF-LZW encoding support by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents: 4792
diff changeset
380 av_free(s->lzws);
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
381 }
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 s->num_entries = 0;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
384
4786
95f58f0b70fc remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents: 4782
diff changeset
385 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
386 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
387 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
388
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
389 if (s->bpp_tab_size)
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
390 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
391
4786
95f58f0b70fc remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents: 4782
diff changeset
392 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
393 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
394 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
395
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
396 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
397 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
398
4786
95f58f0b70fc remove compound literals gcc 2.95 doesnt support taking an address of a compound literal
michael
parents: 4782
diff changeset
399 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
400 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
401 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
402 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
403 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
404
9e471439d2e8 fix tiff regression test (bitexact flag was ignoredwhich caused the
michael
parents: 4847
diff changeset
405 if(!(avctx->flags & CODEC_FLAG_BITEXACT))
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
406 add_entry(s, TIFF_SOFTWARE_NAME, TIFF_STRING,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
407 strlen(LIBAVCODEC_IDENT) + 1, LIBAVCODEC_IDENT);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
408
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
409 if (avctx->pix_fmt == PIX_FMT_PAL8) {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
410 uint16_t pal[256 * 3];
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
411 for (i = 0; i < 256; i++) {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
412 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
413 pal[i] = ((rgb >> 16) & 0xff) * 257;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
414 pal[i + 256] = ((rgb >> 8 ) & 0xff) * 257;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
415 pal[i + 512] = ( rgb & 0xff) * 257;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
416 }
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
417 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
418 }
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
419 if (is_yuv){
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
420 /** according to CCIR Recommendation 601.1 */
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
421 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
422 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
423 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
424 }
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
425 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
426
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
427 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
428 goto fail;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
429 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
430 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
431 bytestream_put_le32(&ptr, 0);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
432
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
433 ret = ptr - buf;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
434
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
435 fail:
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
436 av_free(strip_sizes);
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
437 av_free(strip_offsets);
4792
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
438 av_free(yuv_line);
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
439 return ret;
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
440 }
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 AVCodec tiff_encoder = {
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
443 "tiff",
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
444 CODEC_TYPE_VIDEO,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
445 CODEC_ID_TIFF,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
446 sizeof(TiffEncoderContext),
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
447 NULL,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
448 encode_frame,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
449 NULL,
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 0,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
452 NULL,
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
453 .pix_fmts =
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
454 (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
455 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
456 PIX_FMT_YUV420P, PIX_FMT_YUV422P,
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
457 PIX_FMT_YUV444P, PIX_FMT_YUV410P,
d8b17a09a114 YUV support patch by (Kamil Nowosad k.nowosad students mimuw edu pl)
michael
parents: 4791
diff changeset
458 PIX_FMT_YUV411P
4774
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
459 -1}
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
460
0860efc2f02b tiff encoder by (Bartlomiej Wolowiec b.wolowiec students mimuw edu pl)
michael
parents:
diff changeset
461 };