Mercurial > libavcodec.hg
annotate iff.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | ffb3668ff7af |
children |
rev | line source |
---|---|
11074 | 1 /* |
2 * IFF PBM/ILBM bitmap decoder | |
3 * Copyright (c) 2010 Peter Ross <pross@xvid.org> | |
11661
7a5f3c94b9ad
Switch some ints to unsigned (they can only have positive values, this allows
rbultje
parents:
11660
diff
changeset
|
4 * Copyright (c) 2010 Sebastian Vater <cdgs.basty@googlemail.com> |
11074 | 5 * |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
24 * @file |
11074 | 25 * IFF PBM/ILBM bitmap decoder |
26 */ | |
27 | |
12372
914f484bb476
Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents:
12128
diff
changeset
|
28 #include "libavcore/imgutils.h" |
11074 | 29 #include "bytestream.h" |
30 #include "avcodec.h" | |
11175 | 31 #include "get_bits.h" |
11395
5b9d41da4152
IFF: move ff_cmap_read_palette() prototype to a header file
mru
parents:
11336
diff
changeset
|
32 #include "iff.h" |
11175 | 33 |
34 typedef struct { | |
35 AVFrame frame; | |
11678
e1dd1ff1ab27
Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents:
11663
diff
changeset
|
36 int planesize; |
11175 | 37 uint8_t * planebuf; |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
38 int init; // 1 if buffer and palette data already initialized, 0 otherwise |
11175 | 39 } IffContext; |
11074 | 40 |
11691
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
41 #define LUT8_PART(plane, v) \ |
12128 | 42 AV_LE2NE64C(UINT64_C(0x0000000)<<32 | v) << plane, \ |
43 AV_LE2NE64C(UINT64_C(0x1000000)<<32 | v) << plane, \ | |
44 AV_LE2NE64C(UINT64_C(0x0010000)<<32 | v) << plane, \ | |
45 AV_LE2NE64C(UINT64_C(0x1010000)<<32 | v) << plane, \ | |
46 AV_LE2NE64C(UINT64_C(0x0000100)<<32 | v) << plane, \ | |
47 AV_LE2NE64C(UINT64_C(0x1000100)<<32 | v) << plane, \ | |
48 AV_LE2NE64C(UINT64_C(0x0010100)<<32 | v) << plane, \ | |
49 AV_LE2NE64C(UINT64_C(0x1010100)<<32 | v) << plane, \ | |
50 AV_LE2NE64C(UINT64_C(0x0000001)<<32 | v) << plane, \ | |
51 AV_LE2NE64C(UINT64_C(0x1000001)<<32 | v) << plane, \ | |
52 AV_LE2NE64C(UINT64_C(0x0010001)<<32 | v) << plane, \ | |
53 AV_LE2NE64C(UINT64_C(0x1010001)<<32 | v) << plane, \ | |
54 AV_LE2NE64C(UINT64_C(0x0000101)<<32 | v) << plane, \ | |
55 AV_LE2NE64C(UINT64_C(0x1000101)<<32 | v) << plane, \ | |
56 AV_LE2NE64C(UINT64_C(0x0010101)<<32 | v) << plane, \ | |
57 AV_LE2NE64C(UINT64_C(0x1010101)<<32 | v) << plane | |
11691
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
58 |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
59 #define LUT8(plane) { \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
60 LUT8_PART(plane, 0x0000000), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
61 LUT8_PART(plane, 0x1000000), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
62 LUT8_PART(plane, 0x0010000), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
63 LUT8_PART(plane, 0x1010000), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
64 LUT8_PART(plane, 0x0000100), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
65 LUT8_PART(plane, 0x1000100), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
66 LUT8_PART(plane, 0x0010100), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
67 LUT8_PART(plane, 0x1010100), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
68 LUT8_PART(plane, 0x0000001), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
69 LUT8_PART(plane, 0x1000001), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
70 LUT8_PART(plane, 0x0010001), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
71 LUT8_PART(plane, 0x1010001), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
72 LUT8_PART(plane, 0x0000101), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
73 LUT8_PART(plane, 0x1000101), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
74 LUT8_PART(plane, 0x0010101), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
75 LUT8_PART(plane, 0x1010101), \ |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
76 } |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
77 |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
78 // 8 planes * 8-bit mask |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
79 static const uint64_t plane8_lut[8][256] = { |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
80 LUT8(0), LUT8(1), LUT8(2), LUT8(3), |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
81 LUT8(4), LUT8(5), LUT8(6), LUT8(7), |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
82 }; |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
83 |
11700 | 84 #define LUT32(plane) { \ |
85 0, 0, 0, 0, \ | |
86 0, 0, 0, 1 << plane, \ | |
87 0, 0, 1 << plane, 0, \ | |
88 0, 0, 1 << plane, 1 << plane, \ | |
89 0, 1 << plane, 0, 0, \ | |
90 0, 1 << plane, 0, 1 << plane, \ | |
91 0, 1 << plane, 1 << plane, 0, \ | |
92 0, 1 << plane, 1 << plane, 1 << plane, \ | |
93 1 << plane, 0, 0, 0, \ | |
94 1 << plane, 0, 0, 1 << plane, \ | |
95 1 << plane, 0, 1 << plane, 0, \ | |
96 1 << plane, 0, 1 << plane, 1 << plane, \ | |
97 1 << plane, 1 << plane, 0, 0, \ | |
98 1 << plane, 1 << plane, 0, 1 << plane, \ | |
99 1 << plane, 1 << plane, 1 << plane, 0, \ | |
100 1 << plane, 1 << plane, 1 << plane, 1 << plane, \ | |
101 } | |
102 | |
103 // 32 planes * 4-bit mask * 4 lookup tables each | |
104 static const uint32_t plane32_lut[32][16*4] = { | |
105 LUT32( 0), LUT32( 1), LUT32( 2), LUT32( 3), | |
106 LUT32( 4), LUT32( 5), LUT32( 6), LUT32( 7), | |
107 LUT32( 8), LUT32( 9), LUT32(10), LUT32(11), | |
108 LUT32(12), LUT32(13), LUT32(14), LUT32(15), | |
109 LUT32(16), LUT32(17), LUT32(18), LUT32(19), | |
110 LUT32(20), LUT32(21), LUT32(22), LUT32(23), | |
111 LUT32(24), LUT32(25), LUT32(26), LUT32(27), | |
112 LUT32(28), LUT32(29), LUT32(30), LUT32(31), | |
113 }; | |
114 | |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
115 // Gray to RGB, required for palette table of grayscale images with bpp < 8 |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
116 static av_always_inline uint32_t gray2rgb(const uint32_t x) { |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
117 return x << 16 | x << 8 | x; |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
118 } |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
119 |
11074 | 120 /** |
121 * Convert CMAP buffer (stored in extradata) to lavc palette format | |
122 */ | |
123 int ff_cmap_read_palette(AVCodecContext *avctx, uint32_t *pal) | |
124 { | |
11678
e1dd1ff1ab27
Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents:
11663
diff
changeset
|
125 int count, i; |
11074 | 126 |
127 if (avctx->bits_per_coded_sample > 8) { | |
128 av_log(avctx, AV_LOG_ERROR, "bit_per_coded_sample > 8 not supported\n"); | |
129 return AVERROR_INVALIDDATA; | |
130 } | |
131 | |
132 count = 1 << avctx->bits_per_coded_sample; | |
11718
f2beca0bbf98
Handle palette underflows, fill remaining space with black (zero) data.
rbultje
parents:
11717
diff
changeset
|
133 // If extradata is smaller than actually needed, fill the remaining with black. |
f2beca0bbf98
Handle palette underflows, fill remaining space with black (zero) data.
rbultje
parents:
11717
diff
changeset
|
134 count = FFMIN(avctx->extradata_size / 3, count); |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
135 if (count) { |
11726
7c35c611faa4
Reindent after r23124. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11725
diff
changeset
|
136 for (i=0; i < count; i++) { |
7c35c611faa4
Reindent after r23124. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11725
diff
changeset
|
137 pal[i] = 0xFF000000 | AV_RB24( avctx->extradata + i*3 ); |
7c35c611faa4
Reindent after r23124. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11725
diff
changeset
|
138 } |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
139 } else { // Create gray-scale color palette for bps < 8 |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
140 count = 1 << avctx->bits_per_coded_sample; |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
141 |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
142 for (i=0; i < count; i++) { |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
143 pal[i] = 0xFF000000 | gray2rgb((i * 255) >> avctx->bits_per_coded_sample); |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
144 } |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
145 } |
11074 | 146 return 0; |
147 } | |
148 | |
149 static av_cold int decode_init(AVCodecContext *avctx) | |
150 { | |
11175 | 151 IffContext *s = avctx->priv_data; |
11480
534872e7ab38
Make iff.c:decode_init return the value returned by
stefano
parents:
11395
diff
changeset
|
152 int err; |
11074 | 153 |
11175 | 154 if (avctx->bits_per_coded_sample <= 8) { |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
155 avctx->pix_fmt = (avctx->bits_per_coded_sample < 8 || |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
156 avctx->extradata_size) ? PIX_FMT_PAL8 |
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
157 : PIX_FMT_GRAY8; |
11175 | 158 } else if (avctx->bits_per_coded_sample <= 32) { |
159 avctx->pix_fmt = PIX_FMT_BGR32; | |
160 } else { | |
161 return AVERROR_INVALIDDATA; | |
162 } | |
11074 | 163 |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
164 if ((err = av_image_check_size(avctx->width, avctx->height, 0, avctx))) |
11699
83b49b0997e8
Ensure that width and height are > 0. avcodec_open() itself only checks that
rbultje
parents:
11693
diff
changeset
|
165 return err; |
11679 | 166 s->planesize = FFALIGN(avctx->width, 16) >> 3; // Align plane size in bits to word-boundary |
11175 | 167 s->planebuf = av_malloc(s->planesize + FF_INPUT_BUFFER_PADDING_SIZE); |
168 if (!s->planebuf) | |
169 return AVERROR(ENOMEM); | |
170 | |
171 s->frame.reference = 1; | |
172 | |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
173 return 0; |
11074 | 174 } |
175 | |
176 /** | |
11660 | 177 * Decode interleaved plane buffer up to 8bpp |
178 * @param dst Destination buffer | |
179 * @param buf Source buffer | |
180 * @param buf_size | |
181 * @param plane plane number to decode as | |
182 */ | |
11693
3ec57be57312
Remove "bps" parameter to decodeplane8/32(), it's unused.
rbultje
parents:
11692
diff
changeset
|
183 static void decodeplane8(uint8_t *dst, const uint8_t *buf, int buf_size, int plane) |
11660 | 184 { |
11691
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
185 const uint64_t *lut = plane8_lut[plane]; |
11717
269ce565c70b
Move a while(..){..} -> do{..}while(..), slightly faster.
rbultje
parents:
11700
diff
changeset
|
186 do { |
11691
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
187 uint64_t v = AV_RN64A(dst) | lut[*buf++]; |
24827da9c8dc
Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11679
diff
changeset
|
188 AV_WN64A(dst, v); |
11692 | 189 dst += 8; |
11717
269ce565c70b
Move a while(..){..} -> do{..}while(..), slightly faster.
rbultje
parents:
11700
diff
changeset
|
190 } while (--buf_size); |
11660 | 191 } |
192 | |
193 /** | |
194 * Decode interleaved plane buffer up to 24bpp | |
11175 | 195 * @param dst Destination buffer |
196 * @param buf Source buffer | |
197 * @param buf_size | |
198 * @param plane plane number to decode as | |
11074 | 199 */ |
11700 | 200 static void decodeplane32(uint32_t *dst, const uint8_t *buf, int buf_size, int plane) |
11660 | 201 { |
11700 | 202 const uint32_t *lut = plane32_lut[plane]; |
203 do { | |
204 unsigned mask = (*buf >> 2) & ~3; | |
205 dst[0] |= lut[mask++]; | |
206 dst[1] |= lut[mask++]; | |
207 dst[2] |= lut[mask++]; | |
208 dst[3] |= lut[mask]; | |
209 mask = (*buf++ << 2) & 0x3F; | |
210 dst[4] |= lut[mask++]; | |
211 dst[5] |= lut[mask++]; | |
212 dst[6] |= lut[mask++]; | |
213 dst[7] |= lut[mask]; | |
214 dst += 8; | |
215 } while (--buf_size); | |
11074 | 216 } |
217 | |
11738 | 218 /** |
12024 | 219 * Decode one complete byterun1 encoded line. |
11738 | 220 * |
221 * @param dst the destination buffer where to store decompressed bitstream | |
222 * @param dst_size the destination plane size in bytes | |
223 * @param buf the source byterun1 compressed bitstream | |
224 * @param buf_end the EOF of source byterun1 compressed bitstream | |
225 * @return number of consumed bytes in byterun1 compressed bitstream | |
226 */ | |
227 static int decode_byterun(uint8_t *dst, int dst_size, | |
228 const uint8_t *buf, const uint8_t *const buf_end) { | |
229 const uint8_t *const buf_start = buf; | |
230 unsigned x; | |
231 for (x = 0; x < dst_size && buf < buf_end;) { | |
232 unsigned length; | |
233 const int8_t value = *buf++; | |
234 if (value >= 0) { | |
235 length = value + 1; | |
236 memcpy(dst + x, buf, FFMIN3(length, dst_size - x, buf_end - buf)); | |
237 buf += length; | |
238 } else if (value > -128) { | |
239 length = -value + 1; | |
240 memset(dst + x, *buf++, FFMIN(length, dst_size - x)); | |
241 } else { // noop | |
242 continue; | |
243 } | |
244 x += length; | |
245 } | |
246 return buf - buf_start; | |
247 } | |
248 | |
11074 | 249 static int decode_frame_ilbm(AVCodecContext *avctx, |
250 void *data, int *data_size, | |
251 AVPacket *avpkt) | |
252 { | |
11175 | 253 IffContext *s = avctx->priv_data; |
11074 | 254 const uint8_t *buf = avpkt->data; |
11678
e1dd1ff1ab27
Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents:
11663
diff
changeset
|
255 int buf_size = avpkt->size; |
11187 | 256 const uint8_t *buf_end = buf+buf_size; |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
257 int y, plane, res; |
11074 | 258 |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
259 if (s->init) { |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
260 if ((res = avctx->reget_buffer(avctx, &s->frame)) < 0) { |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
261 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
262 return res; |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
263 } |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
264 } else if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) { |
11074 | 265 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
266 return res; |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
267 } else if (avctx->bits_per_coded_sample <= 8 && avctx->pix_fmt != PIX_FMT_GRAY8) { |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
268 if ((res = ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1])) < 0) |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
269 return res; |
11074 | 270 } |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
271 s->init = 1; |
11074 | 272 |
11719
30356abc8604
Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents:
11718
diff
changeset
|
273 if (avctx->codec_tag == MKTAG('I','L','B','M')) { // interleaved |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
274 if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) { |
11720 | 275 for(y = 0; y < avctx->height; y++ ) { |
276 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ]; | |
277 memset(row, 0, avctx->width); | |
278 for (plane = 0; plane < avctx->bits_per_coded_sample && buf < buf_end; plane++) { | |
279 decodeplane8(row, buf, FFMIN(s->planesize, buf_end - buf), plane); | |
280 buf += s->planesize; | |
281 } | |
282 } | |
283 } else { // PIX_FMT_BGR32 | |
284 for(y = 0; y < avctx->height; y++ ) { | |
285 uint8_t *row = &s->frame.data[0][y*s->frame.linesize[0]]; | |
286 memset(row, 0, avctx->width << 2); | |
287 for (plane = 0; plane < avctx->bits_per_coded_sample && buf < buf_end; plane++) { | |
288 decodeplane32((uint32_t *) row, buf, FFMIN(s->planesize, buf_end - buf), plane); | |
289 buf += s->planesize; | |
290 } | |
11662
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
291 } |
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
292 } |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
293 } else if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) { // IFF-PBM |
11719
30356abc8604
Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents:
11718
diff
changeset
|
294 for(y = 0; y < avctx->height; y++ ) { |
30356abc8604
Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents:
11718
diff
changeset
|
295 uint8_t *row = &s->frame.data[0][y * s->frame.linesize[0]]; |
30356abc8604
Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents:
11718
diff
changeset
|
296 memcpy(row, buf, FFMIN(avctx->width, buf_end - buf)); |
11914
317c18e0b753
IFF PBM decoder: Add a pad byte if image width is odd <aleksi dot nurmi at gmail dot com>
pross
parents:
11806
diff
changeset
|
297 buf += avctx->width + (avctx->width % 2); // padding if odd |
11719
30356abc8604
Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents:
11718
diff
changeset
|
298 } |
30356abc8604
Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents:
11718
diff
changeset
|
299 } |
11074 | 300 |
301 *data_size = sizeof(AVFrame); | |
11175 | 302 *(AVFrame*)data = s->frame; |
11074 | 303 return buf_size; |
304 } | |
305 | |
306 static int decode_frame_byterun1(AVCodecContext *avctx, | |
307 void *data, int *data_size, | |
308 AVPacket *avpkt) | |
309 { | |
11175 | 310 IffContext *s = avctx->priv_data; |
11074 | 311 const uint8_t *buf = avpkt->data; |
11678
e1dd1ff1ab27
Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents:
11663
diff
changeset
|
312 int buf_size = avpkt->size; |
11074 | 313 const uint8_t *buf_end = buf+buf_size; |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
314 int y, plane, res; |
11074 | 315 |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
316 if (s->init) { |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
317 if ((res = avctx->reget_buffer(avctx, &s->frame)) < 0) { |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
318 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
319 return res; |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
320 } |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
321 } else if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) { |
11074 | 322 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
323 return res; |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
324 } else if (avctx->bits_per_coded_sample <= 8 && avctx->pix_fmt != PIX_FMT_GRAY8) { |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
325 if ((res = ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1])) < 0) |
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
326 return res; |
11074 | 327 } |
11806
8d8ca3eb8389
Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents:
11738
diff
changeset
|
328 s->init = 1; |
11074 | 329 |
11662
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
330 if (avctx->codec_tag == MKTAG('I','L','B','M')) { //interleaved |
11725
e9537b2d70ce
Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents:
11720
diff
changeset
|
331 if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) { |
11663 | 332 for(y = 0; y < avctx->height ; y++ ) { |
333 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ]; | |
334 memset(row, 0, avctx->width); | |
335 for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) { | |
11738 | 336 buf += decode_byterun(s->planebuf, s->planesize, buf, buf_end); |
11693
3ec57be57312
Remove "bps" parameter to decodeplane8/32(), it's unused.
rbultje
parents:
11692
diff
changeset
|
337 decodeplane8(row, s->planebuf, s->planesize, plane); |
11662
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
338 } |
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
339 } |
11663 | 340 } else { //PIX_FMT_BGR32 |
11662
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
341 for(y = 0; y < avctx->height ; y++ ) { |
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
342 uint8_t *row = &s->frame.data[0][y*s->frame.linesize[0]]; |
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
343 memset(row, 0, avctx->width << 2); |
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
344 for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) { |
11738 | 345 buf += decode_byterun(s->planebuf, s->planesize, buf, buf_end); |
11693
3ec57be57312
Remove "bps" parameter to decodeplane8/32(), it's unused.
rbultje
parents:
11692
diff
changeset
|
346 decodeplane32((uint32_t *) row, s->planebuf, s->planesize, plane); |
11175 | 347 } |
11074 | 348 } |
11662
33e4b0d712c8
Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents:
11661
diff
changeset
|
349 } |
11663 | 350 } else { |
351 for(y = 0; y < avctx->height ; y++ ) { | |
352 uint8_t *row = &s->frame.data[0][y*s->frame.linesize[0]]; | |
11738 | 353 buf += decode_byterun(row, avctx->width, buf, buf_end); |
11074 | 354 } |
355 } | |
356 | |
357 *data_size = sizeof(AVFrame); | |
11175 | 358 *(AVFrame*)data = s->frame; |
11074 | 359 return buf_size; |
360 } | |
361 | |
362 static av_cold int decode_end(AVCodecContext *avctx) | |
363 { | |
11175 | 364 IffContext *s = avctx->priv_data; |
365 if (s->frame.data[0]) | |
366 avctx->release_buffer(avctx, &s->frame); | |
367 av_freep(&s->planebuf); | |
11074 | 368 return 0; |
369 } | |
370 | |
371 AVCodec iff_ilbm_decoder = { | |
372 "iff_ilbm", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11480
diff
changeset
|
373 AVMEDIA_TYPE_VIDEO, |
11074 | 374 CODEC_ID_IFF_ILBM, |
11175 | 375 sizeof(IffContext), |
11074 | 376 decode_init, |
377 NULL, | |
378 decode_end, | |
379 decode_frame_ilbm, | |
380 CODEC_CAP_DR1, | |
381 .long_name = NULL_IF_CONFIG_SMALL("IFF ILBM"), | |
382 }; | |
383 | |
384 AVCodec iff_byterun1_decoder = { | |
385 "iff_byterun1", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11480
diff
changeset
|
386 AVMEDIA_TYPE_VIDEO, |
11074 | 387 CODEC_ID_IFF_BYTERUN1, |
11175 | 388 sizeof(IffContext), |
11074 | 389 decode_init, |
390 NULL, | |
391 decode_end, | |
392 decode_frame_byterun1, | |
393 CODEC_CAP_DR1, | |
394 .long_name = NULL_IF_CONFIG_SMALL("IFF ByteRun1"), | |
395 }; |