Mercurial > libavcodec.hg
annotate flicvideo.c @ 11601:29fda2500178 libavcodec
Avoid the use of the symbol ff_expr_s for referencing AVExpr.
This way we have to deal only with struct AVExpr and AVExpr, which is
slightly less confusing as the association between the two symbols is
obvious.
author | stefano |
---|---|
date | Sun, 11 Apr 2010 18:44:51 +0000 |
parents | 8a4984c5cacc |
children | 7dd2a45249a9 |
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 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3071
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3071
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3071
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1624 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3071
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1624 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3071
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1624 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3071
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1624 | 20 */ |
21 | |
22 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8717
diff
changeset
|
23 * @file libavcodec/flicvideo.c |
1624 | 24 * Autodesk Animator FLI/FLC Video Decoder |
25 * by Mike Melanson (melanson@pcisys.net) | |
26 * for more information on the .fli/.flc file format and all of its many | |
27 * variations, visit: | |
28 * http://www.compuphase.com/flic.htm | |
29 * | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
30 * 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
|
31 * colorspace data, depending on the FLC. To use this decoder, be |
1624 | 32 * sure that your demuxer sends the FLI file header to the decoder via |
33 * the extradata chunk in AVCodecContext. The chunk should be 128 bytes | |
34 * large. The only exception is for FLI files from the game "Magic Carpet", | |
35 * in which the header is only 12 bytes. | |
36 */ | |
37 | |
38 #include <stdio.h> | |
39 #include <stdlib.h> | |
40 #include <string.h> | |
41 | |
8573
2acf0ae7b041
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
7040
diff
changeset
|
42 #include "libavutil/intreadwrite.h" |
1624 | 43 #include "avcodec.h" |
44 | |
45 #define FLI_256_COLOR 4 | |
46 #define FLI_DELTA 7 | |
47 #define FLI_COLOR 11 | |
48 #define FLI_LC 12 | |
49 #define FLI_BLACK 13 | |
50 #define FLI_BRUN 15 | |
51 #define FLI_COPY 16 | |
52 #define FLI_MINI 18 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
53 #define FLI_DTA_BRUN 25 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
54 #define FLI_DTA_COPY 26 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
55 #define FLI_DTA_LC 27 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
56 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
57 #define FLI_TYPE_CODE (0xAF11) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
58 #define FLC_FLX_TYPE_CODE (0xAF12) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
59 #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
|
60 #define FLC_MAGIC_CARPET_SYNTHETIC_TYPE_CODE (0xAF13) |
1624 | 61 |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
62 #define CHECK_PIXEL_PTR(n) \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
63 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
|
64 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
|
65 pixel_ptr + n, pixel_limit); \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
66 return -1; \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
67 } \ |
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
68 |
1624 | 69 typedef struct FlicDecodeContext { |
70 AVCodecContext *avctx; | |
71 AVFrame frame; | |
72 | |
73 unsigned int palette[256]; | |
74 int new_palette; | |
75 int fli_type; /* either 0xAF11 or 0xAF12, affects palette resolution */ | |
76 } FlicDecodeContext; | |
77 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6488
diff
changeset
|
78 static av_cold int flic_decode_init(AVCodecContext *avctx) |
1624 | 79 { |
4827 | 80 FlicDecodeContext *s = avctx->priv_data; |
1624 | 81 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
|
82 int depth; |
1624 | 83 |
84 s->avctx = avctx; | |
85 | |
4364 | 86 s->fli_type = AV_RL16(&fli_header[4]); /* Might be overridden if a Magic Carpet FLC */ |
2967 | 87 |
5632 | 88 depth = 0; |
1624 | 89 if (s->avctx->extradata_size == 12) { |
90 /* 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
|
91 s->fli_type = FLC_MAGIC_CARPET_SYNTHETIC_TYPE_CODE; |
5632 | 92 depth = 8; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
93 } else if (s->avctx->extradata_size != 128) { |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
94 av_log(avctx, AV_LOG_ERROR, "Expected extradata of 12 or 128 bytes\n"); |
1624 | 95 return -1; |
5632 | 96 } else { |
97 depth = AV_RL16(&fli_header[12]); | |
98 } | |
99 | |
100 if (depth == 0) { | |
101 depth = 8; /* Some FLC generators set depth to zero, when they mean 8Bpp. Fix up here */ | |
1624 | 102 } |
103 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
104 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
|
105 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
|
106 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
107 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
108 switch (depth) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
109 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 return -1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
115 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
116 default : |
4627 | 117 av_log(avctx, AV_LOG_ERROR, "Unknown FLC/FLX depth of %d Bpp is unsupported.\n",depth); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
118 return -1; |
2967 | 119 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
120 |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
121 s->frame.data[0] = NULL; |
1624 | 122 s->new_palette = 0; |
123 | |
124 return 0; | |
125 } | |
126 | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
127 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
|
128 void *data, int *data_size, |
6237 | 129 const uint8_t *buf, int buf_size) |
1624 | 130 { |
4827 | 131 FlicDecodeContext *s = avctx->priv_data; |
1624 | 132 |
133 int stream_ptr = 0; | |
134 int stream_ptr_after_color_chunk; | |
135 int pixel_ptr; | |
136 int palette_ptr; | |
137 unsigned char palette_idx1; | |
138 unsigned char palette_idx2; | |
139 | |
140 unsigned int frame_size; | |
141 int num_chunks; | |
142 | |
143 unsigned int chunk_size; | |
144 int chunk_type; | |
145 | |
146 int i, j; | |
147 | |
148 int color_packets; | |
149 int color_changes; | |
150 int color_shift; | |
151 unsigned char r, g, b; | |
152 | |
153 int lines; | |
154 int compressed_lines; | |
155 int starting_line; | |
156 signed short line_packets; | |
157 int y_ptr; | |
4199 | 158 int byte_run; |
1624 | 159 int pixel_skip; |
160 int pixel_countdown; | |
161 unsigned char *pixels; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
162 int pixel_limit; |
2967 | 163 |
1624 | 164 s->frame.reference = 1; |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
165 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
|
166 if (avctx->reget_buffer(avctx, &s->frame) < 0) { |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
167 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); |
1624 | 168 return -1; |
169 } | |
170 | |
171 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
|
172 pixel_limit = s->avctx->height * s->frame.linesize[0]; |
1624 | 173 |
4364 | 174 frame_size = AV_RL32(&buf[stream_ptr]); |
1624 | 175 stream_ptr += 6; /* skip the magic number */ |
4364 | 176 num_chunks = AV_RL16(&buf[stream_ptr]); |
1624 | 177 stream_ptr += 10; /* skip padding */ |
178 | |
179 frame_size -= 16; | |
180 | |
181 /* iterate through the chunks */ | |
182 while ((frame_size > 0) && (num_chunks > 0)) { | |
4364 | 183 chunk_size = AV_RL32(&buf[stream_ptr]); |
1624 | 184 stream_ptr += 4; |
4364 | 185 chunk_type = AV_RL16(&buf[stream_ptr]); |
1624 | 186 stream_ptr += 2; |
187 | |
188 switch (chunk_type) { | |
189 case FLI_256_COLOR: | |
190 case FLI_COLOR: | |
191 stream_ptr_after_color_chunk = stream_ptr + chunk_size - 6; | |
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 */ | |
4364 | 202 color_packets = AV_RL16(&buf[stream_ptr]); |
1624 | 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++) { | |
4045 | 217 unsigned int entry; |
1624 | 218 |
219 /* wrap around, for good measure */ | |
2422 | 220 if ((unsigned)palette_ptr >= 256) |
1624 | 221 palette_ptr = 0; |
222 | |
223 r = buf[stream_ptr++] << color_shift; | |
224 g = buf[stream_ptr++] << color_shift; | |
225 b = buf[stream_ptr++] << color_shift; | |
4045 | 226 entry = (r << 16) | (g << 8) | b; |
227 if (s->palette[palette_ptr] != entry) | |
228 s->new_palette = 1; | |
229 s->palette[palette_ptr++] = entry; | |
1624 | 230 } |
231 } | |
232 | |
233 /* color chunks sometimes have weird 16-bit alignment issues; | |
234 * therefore, take the hardline approach and set the stream_ptr | |
235 * to the value calculated w.r.t. the size specified by the color | |
236 * chunk header */ | |
237 stream_ptr = stream_ptr_after_color_chunk; | |
238 | |
239 break; | |
240 | |
241 case FLI_DELTA: | |
242 y_ptr = 0; | |
4364 | 243 compressed_lines = AV_RL16(&buf[stream_ptr]); |
1624 | 244 stream_ptr += 2; |
245 while (compressed_lines > 0) { | |
4364 | 246 line_packets = AV_RL16(&buf[stream_ptr]); |
1624 | 247 stream_ptr += 2; |
4234
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
248 if ((line_packets & 0xC000) == 0xC000) { |
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
249 // line skip opcode |
1624 | 250 line_packets = -line_packets; |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
251 y_ptr += line_packets * s->frame.linesize[0]; |
4234
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
252 } else if ((line_packets & 0xC000) == 0x4000) { |
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
253 av_log(avctx, AV_LOG_ERROR, "Undefined opcode (%x) in DELTA_FLI\n", line_packets); |
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
254 } else if ((line_packets & 0xC000) == 0x8000) { |
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
255 // "last byte" opcode |
e560d163e7a8
Implement DELTA_FLI opcodes correctly. Patch by Steven Johnson
alex
parents:
4233
diff
changeset
|
256 pixels[y_ptr + s->frame.linesize[0] - 1] = line_packets & 0xff; |
1624 | 257 } else { |
258 compressed_lines--; | |
259 pixel_ptr = y_ptr; | |
260 pixel_countdown = s->avctx->width; | |
261 for (i = 0; i < line_packets; i++) { | |
262 /* account for the skip bytes */ | |
263 pixel_skip = buf[stream_ptr++]; | |
264 pixel_ptr += pixel_skip; | |
265 pixel_countdown -= pixel_skip; | |
4199 | 266 byte_run = (signed char)(buf[stream_ptr++]); |
1624 | 267 if (byte_run < 0) { |
268 byte_run = -byte_run; | |
269 palette_idx1 = buf[stream_ptr++]; | |
270 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
|
271 CHECK_PIXEL_PTR(byte_run); |
1624 | 272 for (j = 0; j < byte_run; j++, pixel_countdown -= 2) { |
273 pixels[pixel_ptr++] = palette_idx1; | |
274 pixels[pixel_ptr++] = palette_idx2; | |
275 } | |
276 } else { | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
277 CHECK_PIXEL_PTR(byte_run * 2); |
1624 | 278 for (j = 0; j < byte_run * 2; j++, pixel_countdown--) { |
279 palette_idx1 = buf[stream_ptr++]; | |
280 pixels[pixel_ptr++] = palette_idx1; | |
281 } | |
282 } | |
283 } | |
284 | |
285 y_ptr += s->frame.linesize[0]; | |
286 } | |
287 } | |
288 break; | |
289 | |
290 case FLI_LC: | |
291 /* line compressed */ | |
4364 | 292 starting_line = AV_RL16(&buf[stream_ptr]); |
1624 | 293 stream_ptr += 2; |
294 y_ptr = 0; | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
295 y_ptr += starting_line * s->frame.linesize[0]; |
1624 | 296 |
4364 | 297 compressed_lines = AV_RL16(&buf[stream_ptr]); |
1624 | 298 stream_ptr += 2; |
299 while (compressed_lines > 0) { | |
300 pixel_ptr = y_ptr; | |
301 pixel_countdown = s->avctx->width; | |
302 line_packets = buf[stream_ptr++]; | |
303 if (line_packets > 0) { | |
304 for (i = 0; i < line_packets; i++) { | |
305 /* account for the skip bytes */ | |
306 pixel_skip = buf[stream_ptr++]; | |
307 pixel_ptr += pixel_skip; | |
308 pixel_countdown -= pixel_skip; | |
4199 | 309 byte_run = (signed char)(buf[stream_ptr++]); |
1624 | 310 if (byte_run > 0) { |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
311 CHECK_PIXEL_PTR(byte_run); |
1624 | 312 for (j = 0; j < byte_run; j++, pixel_countdown--) { |
313 palette_idx1 = buf[stream_ptr++]; | |
314 pixels[pixel_ptr++] = palette_idx1; | |
315 } | |
4233
5e05fadc93d1
support byte_run=0 case in DELTA_FLI (this case means only skip pixels)
alex
parents:
4232
diff
changeset
|
316 } else if (byte_run < 0) { |
1624 | 317 byte_run = -byte_run; |
318 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
|
319 CHECK_PIXEL_PTR(byte_run); |
1624 | 320 for (j = 0; j < byte_run; j++, pixel_countdown--) { |
321 pixels[pixel_ptr++] = palette_idx1; | |
322 } | |
323 } | |
324 } | |
325 } | |
326 | |
327 y_ptr += s->frame.linesize[0]; | |
328 compressed_lines--; | |
329 } | |
330 break; | |
331 | |
332 case FLI_BLACK: | |
333 /* set the whole frame to color 0 (which is usually black) */ | |
334 memset(pixels, 0, | |
335 s->frame.linesize[0] * s->avctx->height); | |
336 break; | |
337 | |
338 case FLI_BRUN: | |
339 /* Byte run compression: This chunk type only occurs in the first | |
340 * FLI frame and it will update the entire frame. */ | |
341 y_ptr = 0; | |
342 for (lines = 0; lines < s->avctx->height; lines++) { | |
343 pixel_ptr = y_ptr; | |
344 /* disregard the line packets; instead, iterate through all | |
345 * pixels on a row */ | |
346 stream_ptr++; | |
347 pixel_countdown = s->avctx->width; | |
348 while (pixel_countdown > 0) { | |
4199 | 349 byte_run = (signed char)(buf[stream_ptr++]); |
1624 | 350 if (byte_run > 0) { |
351 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
|
352 CHECK_PIXEL_PTR(byte_run); |
1624 | 353 for (j = 0; j < byte_run; j++) { |
354 pixels[pixel_ptr++] = palette_idx1; | |
355 pixel_countdown--; | |
356 if (pixel_countdown < 0) | |
4539 | 357 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) at line %d\n", |
358 pixel_countdown, lines); | |
1624 | 359 } |
360 } else { /* copy bytes if byte_run < 0 */ | |
361 byte_run = -byte_run; | |
2825
faa53103dde0
tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents:
2422
diff
changeset
|
362 CHECK_PIXEL_PTR(byte_run); |
1624 | 363 for (j = 0; j < byte_run; j++) { |
364 palette_idx1 = buf[stream_ptr++]; | |
365 pixels[pixel_ptr++] = palette_idx1; | |
366 pixel_countdown--; | |
367 if (pixel_countdown < 0) | |
4539 | 368 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) at line %d\n", |
369 pixel_countdown, lines); | |
1624 | 370 } |
371 } | |
372 } | |
373 | |
374 y_ptr += s->frame.linesize[0]; | |
375 } | |
376 break; | |
377 | |
378 case FLI_COPY: | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
379 /* copy the chunk (uncompressed frame) */ |
1624 | 380 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
|
381 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
|
382 "bigger than image, skipping chunk\n", chunk_size - 6); |
1624 | 383 stream_ptr += chunk_size - 6; |
384 } else { | |
385 for (y_ptr = 0; y_ptr < s->frame.linesize[0] * s->avctx->height; | |
386 y_ptr += s->frame.linesize[0]) { | |
387 memcpy(&pixels[y_ptr], &buf[stream_ptr], | |
388 s->avctx->width); | |
389 stream_ptr += s->avctx->width; | |
390 } | |
391 } | |
392 break; | |
393 | |
394 case FLI_MINI: | |
395 /* some sort of a thumbnail? disregard this chunk... */ | |
396 stream_ptr += chunk_size - 6; | |
397 break; | |
398 | |
399 default: | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
400 av_log(avctx, AV_LOG_ERROR, "Unrecognized chunk type: %d\n", chunk_type); |
1624 | 401 break; |
402 } | |
403 | |
404 frame_size -= chunk_size; | |
405 num_chunks--; | |
406 } | |
407 | |
408 /* by the end of the chunk, the stream ptr should equal the frame | |
409 * size (minus 1, possibly); if it doesn't, issue a warning */ | |
410 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
|
411 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
|
412 "and final chunk ptr = %d\n", buf_size, stream_ptr); |
1624 | 413 |
414 /* make the palette available on the way out */ | |
4045 | 415 memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); |
416 if (s->new_palette) { | |
1624 | 417 s->frame.palette_has_changed = 1; |
418 s->new_palette = 0; | |
419 } | |
420 | |
421 *data_size=sizeof(AVFrame); | |
422 *(AVFrame*)data = s->frame; | |
423 | |
424 return buf_size; | |
425 } | |
426 | |
3071
cc0357a90e8f
make some functions static (patch by Dieter < freebsd at sopwith.solgatos.com >)
aurel
parents:
3036
diff
changeset
|
427 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
|
428 void *data, int *data_size, |
6237 | 429 const uint8_t *buf, int buf_size) |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
430 { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
431 /* 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
|
432 /* Format is the pixel format, the packets are processed the same. */ |
4827 | 433 FlicDecodeContext *s = avctx->priv_data; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
434 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
435 int stream_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
436 int pixel_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
437 unsigned char palette_idx1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
438 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
439 unsigned int frame_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
440 int num_chunks; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
441 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
442 unsigned int chunk_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
443 int chunk_type; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
444 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
445 int i, j; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
446 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
447 int lines; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
448 int compressed_lines; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
449 signed short line_packets; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
450 int y_ptr; |
4199 | 451 int byte_run; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
452 int pixel_skip; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
453 int pixel_countdown; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
454 unsigned char *pixels; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
455 int pixel; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
456 int pixel_limit; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
457 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
458 s->frame.reference = 1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
459 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
|
460 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
|
461 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
|
462 return -1; |
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 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
465 pixels = s->frame.data[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
466 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
|
467 |
4364 | 468 frame_size = AV_RL32(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
469 stream_ptr += 6; /* skip the magic number */ |
4364 | 470 num_chunks = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
471 stream_ptr += 10; /* skip padding */ |
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 frame_size -= 16; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
474 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
475 /* iterate through the chunks */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
476 while ((frame_size > 0) && (num_chunks > 0)) { |
4364 | 477 chunk_size = AV_RL32(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
478 stream_ptr += 4; |
4364 | 479 chunk_type = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
480 stream_ptr += 2; |
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 switch (chunk_type) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
483 case FLI_256_COLOR: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
484 case FLI_COLOR: |
6488 | 485 /* For some reason, it seems that non-palettized flics do |
486 * include one of these chunks in their first frame. | |
487 * Why I do not know, it seems rather extraneous. */ | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
488 /* 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
|
489 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
|
490 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
491 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
492 case FLI_DELTA: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
493 case FLI_DTA_LC: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
494 y_ptr = 0; |
4364 | 495 compressed_lines = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
496 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
497 while (compressed_lines > 0) { |
4364 | 498 line_packets = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
499 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
500 if (line_packets < 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
501 line_packets = -line_packets; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
502 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
|
503 } else { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
504 compressed_lines--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
505 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
506 pixel_countdown = s->avctx->width; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
507 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
|
508 /* account for the skip bytes */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
509 pixel_skip = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
510 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
|
511 pixel_countdown -= pixel_skip; |
4199 | 512 byte_run = (signed char)(buf[stream_ptr++]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
513 if (byte_run < 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
514 byte_run = -byte_run; |
4364 | 515 pixel = AV_RL16(&buf[stream_ptr]); |
2907
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 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
518 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
|
519 *((signed short*)(&pixels[pixel_ptr])) = pixel; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
520 pixel_ptr += 2; |
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 } else { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
523 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
524 for (j = 0; j < byte_run; j++, pixel_countdown--) { |
4364 | 525 *((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
526 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
527 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
528 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
529 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
530 } |
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 y_ptr += s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
533 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
534 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
535 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
536 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
537 case FLI_LC: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
538 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
|
539 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
|
540 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
541 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
542 case FLI_BLACK: |
4235 | 543 /* set the whole frame to 0x0000 which is black in both 15Bpp and 16Bpp modes. */ |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
544 memset(pixels, 0x0000, |
4232 | 545 s->frame.linesize[0] * s->avctx->height); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
546 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
547 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
548 case FLI_BRUN: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
549 y_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
550 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
|
551 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
552 /* 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
|
553 * pixels on a row */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
554 stream_ptr++; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
555 pixel_countdown = (s->avctx->width * 2); |
2967 | 556 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
557 while (pixel_countdown > 0) { |
4199 | 558 byte_run = (signed char)(buf[stream_ptr++]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
559 if (byte_run > 0) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
560 palette_idx1 = buf[stream_ptr++]; |
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 pixels[pixel_ptr++] = palette_idx1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
564 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
565 if (pixel_countdown < 0) |
4539 | 566 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) (linea%d)\n", |
567 pixel_countdown, lines); | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
568 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
569 } 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
|
570 byte_run = -byte_run; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
571 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
572 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
|
573 palette_idx1 = buf[stream_ptr++]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
574 pixels[pixel_ptr++] = palette_idx1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
575 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
576 if (pixel_countdown < 0) |
4539 | 577 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) at line %d\n", |
578 pixel_countdown, lines); | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
579 } |
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 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
582 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
583 /* Now FLX is strange, in that it is "byte" as opposed to "pixel" run length compressed. |
5127 | 584 * This does not give us any good oportunity to perform word endian conversion |
585 * during decompression. So if it is required (i.e., this is not a LE target, we do | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
586 * 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
|
587 */ |
9985 | 588 #if HAVE_BIGENDIAN |
5155 | 589 pixel_ptr = y_ptr; |
590 pixel_countdown = s->avctx->width; | |
591 while (pixel_countdown > 0) { | |
4364 | 592 *((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[pixel_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
593 pixel_ptr += 2; |
5155 | 594 } |
5154
b683b5f78fab
replace endian detection hack with #ifdef WORDS_BIGENDIAN
mru
parents:
5129
diff
changeset
|
595 #endif |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
596 y_ptr += s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
597 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
598 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
599 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
600 case FLI_DTA_BRUN: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
601 y_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
602 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
|
603 pixel_ptr = y_ptr; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
604 /* 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
|
605 * pixels on a row */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
606 stream_ptr++; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
607 pixel_countdown = s->avctx->width; /* Width is in pixels, not bytes */ |
2967 | 608 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
609 while (pixel_countdown > 0) { |
4199 | 610 byte_run = (signed char)(buf[stream_ptr++]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
611 if (byte_run > 0) { |
4364 | 612 pixel = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
613 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
614 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
615 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
|
616 *((signed short*)(&pixels[pixel_ptr])) = pixel; |
2967 | 617 pixel_ptr += 2; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
618 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
619 if (pixel_countdown < 0) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
620 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
|
621 pixel_countdown); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
622 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
623 } 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
|
624 byte_run = -byte_run; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
625 CHECK_PIXEL_PTR(byte_run); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
626 for (j = 0; j < byte_run; j++) { |
4364 | 627 *((signed short*)(&pixels[pixel_ptr])) = AV_RL16(&buf[stream_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
628 stream_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
629 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
630 pixel_countdown--; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
631 if (pixel_countdown < 0) |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
632 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
|
633 pixel_countdown); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
634 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
635 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
636 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
637 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
638 y_ptr += s->frame.linesize[0]; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
639 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
640 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
641 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
642 case FLI_COPY: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
643 case FLI_DTA_COPY: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
644 /* copy the chunk (uncompressed frame) */ |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
645 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
|
646 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
|
647 "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
|
648 stream_ptr += chunk_size - 6; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
649 } else { |
2967 | 650 |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
651 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
|
652 y_ptr += s->frame.linesize[0]) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
653 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
654 pixel_countdown = s->avctx->width; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
655 pixel_ptr = 0; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
656 while (pixel_countdown > 0) { |
4364 | 657 *((signed short*)(&pixels[y_ptr + pixel_ptr])) = AV_RL16(&buf[stream_ptr+pixel_ptr]); |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
658 pixel_ptr += 2; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
659 pixel_countdown--; |
2967 | 660 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
661 stream_ptr += s->avctx->width*2; |
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 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
664 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
665 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
666 case FLI_MINI: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
667 /* 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
|
668 stream_ptr += chunk_size - 6; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
669 break; |
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 default: |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
672 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
|
673 break; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
674 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
675 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
676 frame_size -= chunk_size; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
677 num_chunks--; |
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 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
680 /* 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
|
681 * 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
|
682 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
|
683 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
|
684 "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
|
685 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
686 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
687 *data_size=sizeof(AVFrame); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
688 *(AVFrame*)data = s->frame; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
689 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
690 return buf_size; |
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_24BPP(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, |
6237 | 695 const uint8_t *buf, int buf_size) |
2907
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 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
|
698 return -1; |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
699 } |
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 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
|
702 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
703 AVPacket *avpkt) |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
704 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
705 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
706 int buf_size = avpkt->size; |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
707 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
|
708 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
|
709 buf, buf_size); |
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 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
|
712 (avctx->pix_fmt == PIX_FMT_RGB565)) { |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
713 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
|
714 buf, buf_size); |
2967 | 715 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
716 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
|
717 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
|
718 buf, buf_size); |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
719 } |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
720 |
5127 | 721 /* Should not get here, ever as the pix_fmt is processed */ |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
722 /* 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
|
723 /* the finite set of possibilites allowable by here. */ |
5127 | 724 /* But in case we do, just error out. */ |
725 av_log(avctx, AV_LOG_ERROR, "Unknown FLC format, my science cannot explain how this happened.\n"); | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
726 return -1; |
2967 | 727 } |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
728 |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
729 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6488
diff
changeset
|
730 static av_cold int flic_decode_end(AVCodecContext *avctx) |
1624 | 731 { |
732 FlicDecodeContext *s = avctx->priv_data; | |
733 | |
1759
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
734 if (s->frame.data[0]) |
e73a3b86565f
Use reget buffer instead of copying from prev frame
rtognimp
parents:
1624
diff
changeset
|
735 avctx->release_buffer(avctx, &s->frame); |
1624 | 736 |
737 return 0; | |
738 } | |
739 | |
740 AVCodec flic_decoder = { | |
741 "flic", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
9985
diff
changeset
|
742 AVMEDIA_TYPE_VIDEO, |
1624 | 743 CODEC_ID_FLIC, |
744 sizeof(FlicDecodeContext), | |
745 flic_decode_init, | |
746 NULL, | |
747 flic_decode_end, | |
748 flic_decode_frame, | |
749 CODEC_CAP_DR1, | |
2907
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
750 NULL, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
751 NULL, |
f7114e03d8dd
support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents:
2825
diff
changeset
|
752 NULL, |
6717 | 753 NULL, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
754 .long_name = NULL_IF_CONFIG_SMALL("Autodesk Animator Flic video"), |
1624 | 755 }; |