Mercurial > libavcodec.hg
annotate flicvideo.c @ 3604:dad0296d4522 libavcodec
replace MULL with asm too, no significnat speedup but its probably better to not take any chances, some versions of gcc will almost certainly mess it up too if they can
author | michael |
---|---|
date | Tue, 22 Aug 2006 12:07:02 +0000 |
parents | cc0357a90e8f |
children | c8c591fe26f8 |
rev | line source |
---|---|
1624 | 1 /* |
2 * FLI/FLC Animation Video Decoder | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
3 * Copyright (C) 2003, 2004 the ffmpeg project |
1624 | 4 * |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1624 | 18 * |
19 */ | |
20 | |
21 /** | |
22 * @file flic.c | |
23 * Autodesk Animator FLI/FLC Video Decoder | |
24 * by Mike Melanson (melanson@pcisys.net) | |
25 * for more information on the .fli/.flc file format and all of its many | |
26 * variations, visit: | |
27 * http://www.compuphase.com/flic.htm | |
28 * | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
29 * This decoder outputs PAL8/RGB555/RGB565 and maybe one day RGB24 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
30 * colorspace data, depending on the FLC. To use this decoder, be |
1624 | 31 * sure that your demuxer sends the FLI file header to the decoder via |
32 * the extradata chunk in AVCodecContext. The chunk should be 128 bytes | |
33 * large. The only exception is for FLI files from the game "Magic Carpet", | |
34 * in which the header is only 12 bytes. | |
35 */ | |
36 | |
37 #include <stdio.h> | |
38 #include <stdlib.h> | |
39 #include <string.h> | |
40 #include <unistd.h> | |
41 | |
42 #include "common.h" | |
43 #include "avcodec.h" | |
44 #include "bswap.h" | |
45 | |
46 #define FLI_256_COLOR 4 | |
47 #define FLI_DELTA 7 | |
48 #define FLI_COLOR 11 | |
49 #define FLI_LC 12 | |
50 #define FLI_BLACK 13 | |
51 #define FLI_BRUN 15 | |
52 #define FLI_COPY 16 | |
53 #define FLI_MINI 18 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
54 #define FLI_DTA_BRUN 25 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
55 #define FLI_DTA_COPY 26 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
56 #define FLI_DTA_LC 27 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
57 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
58 #define FLI_TYPE_CODE (0xAF11) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
59 #define FLC_FLX_TYPE_CODE (0xAF12) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
60 #define FLC_DTA_TYPE_CODE (0xAF44) /* Marks an "Extended FLC" comes from Dave's Targa Animator (DTA) */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
61 #define FLC_MAGIC_CARPET_SYNTHETIC_TYPE_CODE (0xAF13) |
1624 | 62 |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
63 #define CHECK_PIXEL_PTR(n) \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
64 if (pixel_ptr + n > pixel_limit) { \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
65 av_log (s->avctx, AV_LOG_INFO, "Problem: pixel_ptr >= pixel_limit (%d >= %d)\n", \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
66 pixel_ptr + n, pixel_limit); \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
67 return -1; \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
68 } \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
69 |
1624 | 70 typedef struct FlicDecodeContext { |
71 AVCodecContext *avctx; | |
72 AVFrame frame; | |
73 | |
74 unsigned int palette[256]; | |
75 int new_palette; | |
76 int fli_type; /* either 0xAF11 or 0xAF12, affects palette resolution */ | |
77 } FlicDecodeContext; | |
78 | |
79 static int flic_decode_init(AVCodecContext *avctx) | |
80 { | |
81 FlicDecodeContext *s = (FlicDecodeContext *)avctx->priv_data; | |
82 unsigned char *fli_header = (unsigned char *)avctx->extradata; | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
83 int depth; |
1624 | 84 |
85 s->avctx = avctx; | |
86 avctx->has_b_frames = 0; | |
87 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
88 s->fli_type = LE_16(&fli_header[4]); /* Might be overridden if a Magic Carpet FLC */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
89 depth = LE_16(&fli_header[12]); |
2967 | 90 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
91 if (depth == 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
92 depth = 8; /* Some FLC generators set depth to zero, when they mean 8Bpp. Fix up here */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
93 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
94 |
1624 | 95 if (s->avctx->extradata_size == 12) { |
96 /* special case for magic carpet FLIs */ | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
97 s->fli_type = FLC_MAGIC_CARPET_SYNTHETIC_TYPE_CODE; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
98 } else if (s->avctx->extradata_size != 128) { |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
99 av_log(avctx, AV_LOG_ERROR, "Expected extradata of 12 or 128 bytes\n"); |
1624 | 100 return -1; |
101 } | |
102 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
103 if ((s->fli_type == FLC_FLX_TYPE_CODE) && (depth == 16)) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
104 depth = 15; /* Original Autodesk FLX's say the depth is 16Bpp when it is really 15Bpp */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
105 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
106 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
107 switch (depth) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
108 case 8 : avctx->pix_fmt = PIX_FMT_PAL8; break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
109 case 15 : avctx->pix_fmt = PIX_FMT_RGB555; break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
110 case 16 : avctx->pix_fmt = PIX_FMT_RGB565; break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
111 case 24 : avctx->pix_fmt = PIX_FMT_BGR24; /* Supposedly BGR, but havent any files to test with */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
112 av_log(avctx, AV_LOG_ERROR, "24Bpp FLC/FLX is unsupported due to no test files.\n"); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
113 return -1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
114 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
115 default : |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
116 av_log(avctx, AV_LOG_ERROR, "Unkown FLC/FLX depth of %d Bpp is unsupported.\n",depth); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
117 return -1; |
2967 | 118 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
119 |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
120 s->frame.data[0] = NULL; |
1624 | 121 s->new_palette = 0; |
122 | |
123 return 0; | |
124 } | |
125 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
126 static int flic_decode_frame_8BPP(AVCodecContext *avctx, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
127 void *data, int *data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
128 uint8_t *buf, int buf_size) |
1624 | 129 { |
130 FlicDecodeContext *s = (FlicDecodeContext *)avctx->priv_data; | |
131 | |
132 int stream_ptr = 0; | |
133 int stream_ptr_after_color_chunk; | |
134 int pixel_ptr; | |
135 int palette_ptr; | |
136 unsigned char palette_idx1; | |
137 unsigned char palette_idx2; | |
138 | |
139 unsigned int frame_size; | |
140 int num_chunks; | |
141 | |
142 unsigned int chunk_size; | |
143 int chunk_type; | |
144 | |
145 int i, j; | |
146 | |
147 int color_packets; | |
148 int color_changes; | |
149 int color_shift; | |
150 unsigned char r, g, b; | |
151 | |
152 int lines; | |
153 int compressed_lines; | |
154 int starting_line; | |
155 signed short line_packets; | |
156 int y_ptr; | |
157 signed char byte_run; | |
158 int pixel_skip; | |
159 int pixel_countdown; | |
160 unsigned char *pixels; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
161 int pixel_limit; |
2967 | 162 |
1624 | 163 s->frame.reference = 1; |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
164 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
165 if (avctx->reget_buffer(avctx, &s->frame) < 0) { |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
166 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); |
1624 | 167 return -1; |
168 } | |
169 | |
170 pixels = s->frame.data[0]; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
171 pixel_limit = s->avctx->height * s->frame.linesize[0]; |
1624 | 172 |
173 frame_size = LE_32(&buf[stream_ptr]); | |
174 stream_ptr += 6; /* skip the magic number */ | |
175 num_chunks = LE_16(&buf[stream_ptr]); | |
176 stream_ptr += 10; /* skip padding */ | |
177 | |
178 frame_size -= 16; | |
179 | |
180 /* iterate through the chunks */ | |
181 while ((frame_size > 0) && (num_chunks > 0)) { | |
182 chunk_size = LE_32(&buf[stream_ptr]); | |
183 stream_ptr += 4; | |
184 chunk_type = LE_16(&buf[stream_ptr]); | |
185 stream_ptr += 2; | |
186 | |
187 switch (chunk_type) { | |
188 case FLI_256_COLOR: | |
189 case FLI_COLOR: | |
190 stream_ptr_after_color_chunk = stream_ptr + chunk_size - 6; | |
191 s->new_palette = 1; | |
192 | |
2967 | 193 /* check special case: If this file is from the Magic Carpet |
194 * game and uses 6-bit colors even though it reports 256-color | |
1624 | 195 * chunks in a 0xAF12-type file (fli_type is set to 0xAF13 during |
196 * initialization) */ | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
197 if ((chunk_type == FLI_256_COLOR) && (s->fli_type != FLC_MAGIC_CARPET_SYNTHETIC_TYPE_CODE)) |
1624 | 198 color_shift = 0; |
199 else | |
200 color_shift = 2; | |
201 /* set up the palette */ | |
202 color_packets = LE_16(&buf[stream_ptr]); | |
203 stream_ptr += 2; | |
204 palette_ptr = 0; | |
205 for (i = 0; i < color_packets; i++) { | |
206 /* first byte is how many colors to skip */ | |
207 palette_ptr += buf[stream_ptr++]; | |
208 | |
209 /* next byte indicates how many entries to change */ | |
210 color_changes = buf[stream_ptr++]; | |
211 | |
212 /* if there are 0 color changes, there are actually 256 */ | |
213 if (color_changes == 0) | |
214 color_changes = 256; | |
215 | |
216 for (j = 0; j < color_changes; j++) { | |
217 | |
218 /* wrap around, for good measure */ | |
2422 | 219 if ((unsigned)palette_ptr >= 256) |
1624 | 220 palette_ptr = 0; |
221 | |
222 r = buf[stream_ptr++] << color_shift; | |
223 g = buf[stream_ptr++] << color_shift; | |
224 b = buf[stream_ptr++] << color_shift; | |
225 s->palette[palette_ptr++] = (r << 16) | (g << 8) | b; | |
226 } | |
227 } | |
228 | |
229 /* color chunks sometimes have weird 16-bit alignment issues; | |
230 * therefore, take the hardline approach and set the stream_ptr | |
231 * to the value calculated w.r.t. the size specified by the color | |
232 * chunk header */ | |
233 stream_ptr = stream_ptr_after_color_chunk; | |
234 | |
235 break; | |
236 | |
237 case FLI_DELTA: | |
238 y_ptr = 0; | |
239 compressed_lines = LE_16(&buf[stream_ptr]); | |
240 stream_ptr += 2; | |
241 while (compressed_lines > 0) { | |
242 line_packets = LE_16(&buf[stream_ptr]); | |
243 stream_ptr += 2; | |
244 if (line_packets < 0) { | |
245 line_packets = -line_packets; | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
246 y_ptr += line_packets * s->frame.linesize[0]; |
1624 | 247 } else { |
248 compressed_lines--; | |
249 pixel_ptr = y_ptr; | |
250 pixel_countdown = s->avctx->width; | |
251 for (i = 0; i < line_packets; i++) { | |
252 /* account for the skip bytes */ | |
253 pixel_skip = buf[stream_ptr++]; | |
254 pixel_ptr += pixel_skip; | |
255 pixel_countdown -= pixel_skip; | |
256 byte_run = buf[stream_ptr++]; | |
257 if (byte_run < 0) { | |
258 byte_run = -byte_run; | |
259 palette_idx1 = buf[stream_ptr++]; | |
260 palette_idx2 = buf[stream_ptr++]; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
261 CHECK_PIXEL_PTR(byte_run); |
1624 | 262 for (j = 0; j < byte_run; j++, pixel_countdown -= 2) { |
263 pixels[pixel_ptr++] = palette_idx1; | |
264 pixels[pixel_ptr++] = palette_idx2; | |
265 } | |
266 } else { | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
267 CHECK_PIXEL_PTR(byte_run * 2); |
1624 | 268 for (j = 0; j < byte_run * 2; j++, pixel_countdown--) { |
269 palette_idx1 = buf[stream_ptr++]; | |
270 pixels[pixel_ptr++] = palette_idx1; | |
271 } | |
272 } | |
273 } | |
274 | |
275 y_ptr += s->frame.linesize[0]; | |
276 } | |
277 } | |
278 break; | |
279 | |
280 case FLI_LC: | |
281 /* line compressed */ | |
282 starting_line = LE_16(&buf[stream_ptr]); | |
283 stream_ptr += 2; | |
284 y_ptr = 0; | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
285 y_ptr += starting_line * s->frame.linesize[0]; |
1624 | 286 |
287 compressed_lines = LE_16(&buf[stream_ptr]); | |
288 stream_ptr += 2; | |
289 while (compressed_lines > 0) { | |
290 pixel_ptr = y_ptr; | |
291 pixel_countdown = s->avctx->width; | |
292 line_packets = buf[stream_ptr++]; | |
293 if (line_packets > 0) { | |
294 for (i = 0; i < line_packets; i++) { | |
295 /* account for the skip bytes */ | |
296 pixel_skip = buf[stream_ptr++]; | |
297 pixel_ptr += pixel_skip; | |
298 pixel_countdown -= pixel_skip; | |
299 byte_run = buf[stream_ptr++]; | |
300 if (byte_run > 0) { | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
301 CHECK_PIXEL_PTR(byte_run); |
1624 | 302 for (j = 0; j < byte_run; j++, pixel_countdown--) { |
303 palette_idx1 = buf[stream_ptr++]; | |
304 pixels[pixel_ptr++] = palette_idx1; | |
305 } | |
306 } else { | |
307 byte_run = -byte_run; | |
308 palette_idx1 = buf[stream_ptr++]; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
309 CHECK_PIXEL_PTR(byte_run); |
1624 | 310 for (j = 0; j < byte_run; j++, pixel_countdown--) { |
311 pixels[pixel_ptr++] = palette_idx1; | |
312 } | |
313 } | |
314 } | |
315 } | |
316 | |
317 y_ptr += s->frame.linesize[0]; | |
318 compressed_lines--; | |
319 } | |
320 break; | |
321 | |
322 case FLI_BLACK: | |
323 /* set the whole frame to color 0 (which is usually black) */ | |
324 memset(pixels, 0, | |
325 s->frame.linesize[0] * s->avctx->height); | |
326 break; | |
327 | |
328 case FLI_BRUN: | |
329 /* Byte run compression: This chunk type only occurs in the first | |
330 * FLI frame and it will update the entire frame. */ | |
331 y_ptr = 0; | |
332 for (lines = 0; lines < s->avctx->height; lines++) { | |
333 pixel_ptr = y_ptr; | |
334 /* disregard the line packets; instead, iterate through all | |
335 * pixels on a row */ | |
336 stream_ptr++; | |
337 pixel_countdown = s->avctx->width; | |
338 while (pixel_countdown > 0) { | |
339 byte_run = buf[stream_ptr++]; | |
340 if (byte_run > 0) { | |
341 palette_idx1 = buf[stream_ptr++]; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
342 CHECK_PIXEL_PTR(byte_run); |
1624 | 343 for (j = 0; j < byte_run; j++) { |
344 pixels[pixel_ptr++] = palette_idx1; | |
345 pixel_countdown--; | |
346 if (pixel_countdown < 0) | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
347 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n", |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
348 pixel_countdown); |
1624 | 349 } |
350 } else { /* copy bytes if byte_run < 0 */ | |
351 byte_run = -byte_run; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
352 CHECK_PIXEL_PTR(byte_run); |
1624 | 353 for (j = 0; j < byte_run; j++) { |
354 palette_idx1 = buf[stream_ptr++]; | |
355 pixels[pixel_ptr++] = palette_idx1; | |
356 pixel_countdown--; | |
357 if (pixel_countdown < 0) | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
358 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n", |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
359 pixel_countdown); |
1624 | 360 } |
361 } | |
362 } | |
363 | |
364 y_ptr += s->frame.linesize[0]; | |
365 } | |
366 break; | |
367 | |
368 case FLI_COPY: | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
369 /* copy the chunk (uncompressed frame) */ |
1624 | 370 if (chunk_size - 6 > s->avctx->width * s->avctx->height) { |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
371 av_log(avctx, AV_LOG_ERROR, "In chunk FLI_COPY : source data (%d bytes) " \ |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
372 "bigger than image, skipping chunk\n", chunk_size - 6); |
1624 | 373 stream_ptr += chunk_size - 6; |
374 } else { | |
375 for (y_ptr = 0; y_ptr < s->frame.linesize[0] * s->avctx->height; | |
376 y_ptr += s->frame.linesize[0]) { | |
377 memcpy(&pixels[y_ptr], &buf[stream_ptr], | |
378 s->avctx->width); | |
379 stream_ptr += s->avctx->width; | |
380 } | |
381 } | |
382 break; | |
383 | |
384 case FLI_MINI: | |
385 /* some sort of a thumbnail? disregard this chunk... */ | |
386 stream_ptr += chunk_size - 6; | |
387 break; | |
388 | |
389 default: | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
390 av_log(avctx, AV_LOG_ERROR, "Unrecognized chunk type: %d\n", chunk_type); |
1624 | 391 break; |
392 } | |
393 | |
394 frame_size -= chunk_size; | |
395 num_chunks--; | |
396 } | |
397 | |
398 /* by the end of the chunk, the stream ptr should equal the frame | |
399 * size (minus 1, possibly); if it doesn't, issue a warning */ | |
400 if ((stream_ptr != buf_size) && (stream_ptr != buf_size - 1)) | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
401 av_log(avctx, AV_LOG_ERROR, "Processed FLI chunk where chunk size = %d " \ |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
402 "and final chunk ptr = %d\n", buf_size, stream_ptr); |
1624 | 403 |
404 /* make the palette available on the way out */ | |
405 // if (s->new_palette) { | |
406 if (1) { | |
407 memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); | |
408 s->frame.palette_has_changed = 1; | |
409 s->new_palette = 0; | |
410 } | |
411 | |
412 *data_size=sizeof(AVFrame); | |
413 *(AVFrame*)data = s->frame; | |
414 | |
415 return buf_size; | |
416 } | |
417 | |
3071
cc0357a90e8f
make some functions static (patch by Dieter < freebsd at sopwith.solgatos.com >)
aurel
parents:
3036
diff
changeset
|
418 static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
419 void *data, int *data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
420 uint8_t *buf, int buf_size) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
421 { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
422 /* Note, the only difference between the 15Bpp and 16Bpp */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
423 /* Format is the pixel format, the packets are processed the same. */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
424 FlicDecodeContext *s = (FlicDecodeContext *)avctx->priv_data; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
425 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
426 int stream_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
427 int pixel_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
428 unsigned char palette_idx1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
429 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
430 unsigned int frame_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
431 int num_chunks; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
432 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
433 unsigned int chunk_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
434 int chunk_type; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
435 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
436 int i, j; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
437 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
438 int lines; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
439 int compressed_lines; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
440 signed short line_packets; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
441 int y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
442 signed char byte_run; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
443 int pixel_skip; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
444 int pixel_countdown; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
445 unsigned char *pixels; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
446 int pixel; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
447 int pixel_limit; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
448 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
449 s->frame.reference = 1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
450 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
451 if (avctx->reget_buffer(avctx, &s->frame) < 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
452 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
453 return -1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
454 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
455 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
456 pixels = s->frame.data[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
457 pixel_limit = s->avctx->height * s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
458 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
459 frame_size = LE_32(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
460 stream_ptr += 6; /* skip the magic number */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
461 num_chunks = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
462 stream_ptr += 10; /* skip padding */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
463 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
464 frame_size -= 16; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
465 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
466 /* iterate through the chunks */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
467 while ((frame_size > 0) && (num_chunks > 0)) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
468 chunk_size = LE_32(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
469 stream_ptr += 4; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
470 chunk_type = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
471 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
472 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
473 switch (chunk_type) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
474 case FLI_256_COLOR: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
475 case FLI_COLOR: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
476 /* For some reason, it seems that non-paletised flics do include one of these */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
477 /* chunks in their first frame. Why i do not know, it seems rather extraneous */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
478 /* av_log(avctx, AV_LOG_ERROR, "Unexpected Palette chunk %d in non-paletised FLC\n",chunk_type);*/ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
479 stream_ptr = stream_ptr + chunk_size - 6; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
480 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
481 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
482 case FLI_DELTA: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
483 case FLI_DTA_LC: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
484 y_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
485 compressed_lines = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
486 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
487 while (compressed_lines > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
488 line_packets = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
489 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
490 if (line_packets < 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
491 line_packets = -line_packets; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
492 y_ptr += line_packets * s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
493 } else { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
494 compressed_lines--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
495 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
496 pixel_countdown = s->avctx->width; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
497 for (i = 0; i < line_packets; i++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
498 /* account for the skip bytes */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
499 pixel_skip = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
500 pixel_ptr += (pixel_skip*2); /* Pixel is 2 bytes wide */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
501 pixel_countdown -= pixel_skip; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
502 byte_run = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
503 if (byte_run < 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
504 byte_run = -byte_run; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
505 pixel = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
506 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
507 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
508 for (j = 0; j < byte_run; j++, pixel_countdown -= 2) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
509 *((signed short*)(&pixels[pixel_ptr])) = pixel; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
510 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
511 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
512 } else { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
513 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
514 for (j = 0; j < byte_run; j++, pixel_countdown--) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
515 *((signed short*)(&pixels[pixel_ptr])) = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
516 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
517 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
518 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
519 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
520 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
521 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
522 y_ptr += s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
523 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
524 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
525 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
526 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
527 case FLI_LC: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
528 av_log(avctx, AV_LOG_ERROR, "Unexpected FLI_LC chunk in non-paletised FLC\n"); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
529 stream_ptr = stream_ptr + chunk_size - 6; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
530 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
531 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
532 case FLI_BLACK: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
533 /* set the whole frame to 0x0000 which is balck in both 15Bpp and 16Bpp modes. */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
534 memset(pixels, 0x0000, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
535 s->frame.linesize[0] * s->avctx->height * 2); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
536 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
537 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
538 case FLI_BRUN: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
539 y_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
540 for (lines = 0; lines < s->avctx->height; lines++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
541 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
542 /* disregard the line packets; instead, iterate through all |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
543 * pixels on a row */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
544 stream_ptr++; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
545 pixel_countdown = (s->avctx->width * 2); |
2967 | 546 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
547 while (pixel_countdown > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
548 byte_run = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
549 if (byte_run > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
550 palette_idx1 = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
551 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
552 for (j = 0; j < byte_run; j++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
553 pixels[pixel_ptr++] = palette_idx1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
554 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
555 if (pixel_countdown < 0) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
556 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n", |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
557 pixel_countdown); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
558 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
559 } else { /* copy bytes if byte_run < 0 */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
560 byte_run = -byte_run; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
561 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
562 for (j = 0; j < byte_run; j++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
563 palette_idx1 = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
564 pixels[pixel_ptr++] = palette_idx1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
565 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
566 if (pixel_countdown < 0) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
567 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n", |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
568 pixel_countdown); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
569 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
570 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
571 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
572 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
573 /* Now FLX is strange, in that it is "byte" as opposed to "pixel" run length compressed. |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
574 * This doesnt give us any good oportunity to perform word endian conversion |
2967 | 575 * during decompression. So if its requried (ie, this isnt a LE target, we do |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
576 * a second pass over the line here, swapping the bytes. |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
577 */ |
2967 | 578 pixel = 0xFF00; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
579 if (0xFF00 != LE_16(&pixel)) /* Check if its not an LE Target */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
580 { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
581 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
582 pixel_countdown = s->avctx->width; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
583 while (pixel_countdown > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
584 *((signed short*)(&pixels[pixel_ptr])) = LE_16(&buf[pixel_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
585 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
586 } |
2967 | 587 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
588 y_ptr += s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
589 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
590 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
591 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
592 case FLI_DTA_BRUN: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
593 y_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
594 for (lines = 0; lines < s->avctx->height; lines++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
595 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
596 /* disregard the line packets; instead, iterate through all |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
597 * pixels on a row */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
598 stream_ptr++; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
599 pixel_countdown = s->avctx->width; /* Width is in pixels, not bytes */ |
2967 | 600 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
601 while (pixel_countdown > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
602 byte_run = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
603 if (byte_run > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
604 pixel = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
605 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
606 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
607 for (j = 0; j < byte_run; j++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
608 *((signed short*)(&pixels[pixel_ptr])) = pixel; |
2967 | 609 pixel_ptr += 2; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
610 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
611 if (pixel_countdown < 0) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
612 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n", |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
613 pixel_countdown); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
614 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
615 } else { /* copy pixels if byte_run < 0 */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
616 byte_run = -byte_run; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
617 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
618 for (j = 0; j < byte_run; j++) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
619 *((signed short*)(&pixels[pixel_ptr])) = LE_16(&buf[stream_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
620 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
621 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
622 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
623 if (pixel_countdown < 0) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
624 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n", |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
625 pixel_countdown); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
626 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
627 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
628 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
629 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
630 y_ptr += s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
631 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
632 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
633 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
634 case FLI_COPY: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
635 case FLI_DTA_COPY: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
636 /* copy the chunk (uncompressed frame) */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
637 if (chunk_size - 6 > (unsigned int)(s->avctx->width * s->avctx->height)*2) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
638 av_log(avctx, AV_LOG_ERROR, "In chunk FLI_COPY : source data (%d bytes) " \ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
639 "bigger than image, skipping chunk\n", chunk_size - 6); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
640 stream_ptr += chunk_size - 6; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
641 } else { |
2967 | 642 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
643 for (y_ptr = 0; y_ptr < s->frame.linesize[0] * s->avctx->height; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
644 y_ptr += s->frame.linesize[0]) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
645 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
646 pixel_countdown = s->avctx->width; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
647 pixel_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
648 while (pixel_countdown > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
649 *((signed short*)(&pixels[y_ptr + pixel_ptr])) = LE_16(&buf[stream_ptr+pixel_ptr]); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
650 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
651 pixel_countdown--; |
2967 | 652 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
653 stream_ptr += s->avctx->width*2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
654 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
655 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
656 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
657 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
658 case FLI_MINI: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
659 /* some sort of a thumbnail? disregard this chunk... */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
660 stream_ptr += chunk_size - 6; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
661 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
662 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
663 default: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
664 av_log(avctx, AV_LOG_ERROR, "Unrecognized chunk type: %d\n", chunk_type); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
665 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
666 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
667 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
668 frame_size -= chunk_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
669 num_chunks--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
670 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
671 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
672 /* by the end of the chunk, the stream ptr should equal the frame |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
673 * size (minus 1, possibly); if it doesn't, issue a warning */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
674 if ((stream_ptr != buf_size) && (stream_ptr != buf_size - 1)) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
675 av_log(avctx, AV_LOG_ERROR, "Processed FLI chunk where chunk size = %d " \ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
676 "and final chunk ptr = %d\n", buf_size, stream_ptr); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
677 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
678 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
679 *data_size=sizeof(AVFrame); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
680 *(AVFrame*)data = s->frame; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
681 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
682 return buf_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
683 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
684 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
685 static int flic_decode_frame_24BPP(AVCodecContext *avctx, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
686 void *data, int *data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
687 uint8_t *buf, int buf_size) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
688 { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
689 av_log(avctx, AV_LOG_ERROR, "24Bpp FLC Unsupported due to lack of test files.\n"); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
690 return -1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
691 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
692 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
693 static int flic_decode_frame(AVCodecContext *avctx, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
694 void *data, int *data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
695 uint8_t *buf, int buf_size) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
696 { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
697 if (avctx->pix_fmt == PIX_FMT_PAL8) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
698 return flic_decode_frame_8BPP(avctx, data, data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
699 buf, buf_size); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
700 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
701 else if ((avctx->pix_fmt == PIX_FMT_RGB555) || |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
702 (avctx->pix_fmt == PIX_FMT_RGB565)) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
703 return flic_decode_frame_15_16BPP(avctx, data, data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
704 buf, buf_size); |
2967 | 705 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
706 else if (avctx->pix_fmt == PIX_FMT_BGR24) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
707 return flic_decode_frame_24BPP(avctx, data, data_size, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
708 buf, buf_size); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
709 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
710 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
711 /* Shouldnt get here, ever as the pix_fmt is processed */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
712 /* in flic_decode_init and the above if should deal with */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
713 /* the finite set of possibilites allowable by here. */ |
2967 | 714 /* but in case we do, just error out. */ |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
715 av_log(avctx, AV_LOG_ERROR, "Unknown Format of FLC. My Science cant explain how this happened\n"); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
716 return -1; |
2967 | 717 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
718 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
719 |
1624 | 720 static int flic_decode_end(AVCodecContext *avctx) |
721 { | |
722 FlicDecodeContext *s = avctx->priv_data; | |
723 | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
724 if (s->frame.data[0]) |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
725 avctx->release_buffer(avctx, &s->frame); |
1624 | 726 |
727 return 0; | |
728 } | |
729 | |
730 AVCodec flic_decoder = { | |
731 "flic", | |
732 CODEC_TYPE_VIDEO, | |
733 CODEC_ID_FLIC, | |
734 sizeof(FlicDecodeContext), | |
735 flic_decode_init, | |
736 NULL, | |
737 flic_decode_end, | |
738 flic_decode_frame, | |
739 CODEC_CAP_DR1, | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
740 NULL, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
741 NULL, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
742 NULL, |
1624 | 743 NULL |
744 }; |