annotate flicvideo.c @ 3389:de8cdb05117f libavcodec

simplify
author michael
date Sun, 02 Jul 2006 13:10:08 +0000
parents cc0357a90e8f
children c8c591fe26f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
1 /*
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
4 *
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
9 *
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
13 * Lesser General Public License for more details.
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
14 *
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
18 *
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
19 */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
20
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
21 /**
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
22 * @file flic.c
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
23 * Autodesk Animator FLI/FLC Video Decoder
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
24 * by Mike Melanson (melanson@pcisys.net)
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
25 * for more information on the .fli/.flc file format and all of its many
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
26 * variations, visit:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
27 * http://www.compuphase.com/flic.htm
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
31 * sure that your demuxer sends the FLI file header to the decoder via
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
32 * the extradata chunk in AVCodecContext. The chunk should be 128 bytes
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
33 * large. The only exception is for FLI files from the game "Magic Carpet",
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
34 * in which the header is only 12 bytes.
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
35 */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
36
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
37 #include <stdio.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
38 #include <stdlib.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
39 #include <string.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
40 #include <unistd.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
41
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
42 #include "common.h"
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
43 #include "avcodec.h"
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
44 #include "bswap.h"
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
45
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
46 #define FLI_256_COLOR 4
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
47 #define FLI_DELTA 7
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
48 #define FLI_COLOR 11
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
49 #define FLI_LC 12
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
50 #define FLI_BLACK 13
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
51 #define FLI_BRUN 15
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
52 #define FLI_COPY 16
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
70 typedef struct FlicDecodeContext {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
71 AVCodecContext *avctx;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
72 AVFrame frame;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
73
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
74 unsigned int palette[256];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
75 int new_palette;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
76 int fli_type; /* either 0xAF11 or 0xAF12, affects palette resolution */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
77 } FlicDecodeContext;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
78
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
79 static int flic_decode_init(AVCodecContext *avctx)
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
80 {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
81 FlicDecodeContext *s = (FlicDecodeContext *)avctx->priv_data;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
84
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
85 s->avctx = avctx;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
86 avctx->has_b_frames = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
95 if (s->avctx->extradata_size == 12) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
100 return -1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
101 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
121 s->new_palette = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
122
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
123 return 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
124 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
129 {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
130 FlicDecodeContext *s = (FlicDecodeContext *)avctx->priv_data;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
131
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
132 int stream_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
133 int stream_ptr_after_color_chunk;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
134 int pixel_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
135 int palette_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
136 unsigned char palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
137 unsigned char palette_idx2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
138
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
139 unsigned int frame_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
140 int num_chunks;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
141
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
142 unsigned int chunk_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
143 int chunk_type;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
144
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
145 int i, j;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
146
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
147 int color_packets;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
148 int color_changes;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
149 int color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
150 unsigned char r, g, b;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
151
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
152 int lines;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
153 int compressed_lines;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
154 int starting_line;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
155 signed short line_packets;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
156 int y_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
157 signed char byte_run;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
158 int pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
159 int pixel_countdown;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
162
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
167 return -1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
168 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
169
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
172
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
173 frame_size = LE_32(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
174 stream_ptr += 6; /* skip the magic number */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
175 num_chunks = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
176 stream_ptr += 10; /* skip padding */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
177
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
178 frame_size -= 16;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
179
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
180 /* iterate through the chunks */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
181 while ((frame_size > 0) && (num_chunks > 0)) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
182 chunk_size = LE_32(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
183 stream_ptr += 4;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
184 chunk_type = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
185 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
186
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
187 switch (chunk_type) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
188 case FLI_256_COLOR:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
189 case FLI_COLOR:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
190 stream_ptr_after_color_chunk = stream_ptr + chunk_size - 6;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
191 s->new_palette = 1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
192
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
193 /* check special case: If this file is from the Magic Carpet
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
194 * game and uses 6-bit colors even though it reports 256-color
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
195 * chunks in a 0xAF12-type file (fli_type is set to 0xAF13 during
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
198 color_shift = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
199 else
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
200 color_shift = 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
201 /* set up the palette */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
202 color_packets = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
203 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
204 palette_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
205 for (i = 0; i < color_packets; i++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
206 /* first byte is how many colors to skip */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
207 palette_ptr += buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
208
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
209 /* next byte indicates how many entries to change */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
210 color_changes = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
211
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
212 /* if there are 0 color changes, there are actually 256 */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
213 if (color_changes == 0)
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
214 color_changes = 256;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
215
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
216 for (j = 0; j < color_changes; j++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
217
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
218 /* wrap around, for good measure */
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 1881
diff changeset
219 if ((unsigned)palette_ptr >= 256)
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
220 palette_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
221
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
222 r = buf[stream_ptr++] << color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
223 g = buf[stream_ptr++] << color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
224 b = buf[stream_ptr++] << color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
225 s->palette[palette_ptr++] = (r << 16) | (g << 8) | b;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
226 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
227 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
228
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
229 /* color chunks sometimes have weird 16-bit alignment issues;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
230 * therefore, take the hardline approach and set the stream_ptr
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
231 * to the value calculated w.r.t. the size specified by the color
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
232 * chunk header */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
233 stream_ptr = stream_ptr_after_color_chunk;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
234
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
235 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
236
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
237 case FLI_DELTA:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
238 y_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
239 compressed_lines = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
240 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
241 while (compressed_lines > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
242 line_packets = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
243 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
244 if (line_packets < 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
247 } else {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
248 compressed_lines--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
249 pixel_ptr = y_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
250 pixel_countdown = s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
251 for (i = 0; i < line_packets; i++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
252 /* account for the skip bytes */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
253 pixel_skip = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
254 pixel_ptr += pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
255 pixel_countdown -= pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
256 byte_run = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
257 if (byte_run < 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
258 byte_run = -byte_run;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
259 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
262 for (j = 0; j < byte_run; j++, pixel_countdown -= 2) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
263 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
264 pixels[pixel_ptr++] = palette_idx2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
265 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
268 for (j = 0; j < byte_run * 2; j++, pixel_countdown--) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
269 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
270 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
271 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
272 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
273 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
274
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
275 y_ptr += s->frame.linesize[0];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
276 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
277 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
278 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
279
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
280 case FLI_LC:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
281 /* line compressed */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
282 starting_line = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
283 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
286
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
287 compressed_lines = LE_16(&buf[stream_ptr]);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
288 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
289 while (compressed_lines > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
290 pixel_ptr = y_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
291 pixel_countdown = s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
292 line_packets = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
293 if (line_packets > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
294 for (i = 0; i < line_packets; i++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
295 /* account for the skip bytes */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
296 pixel_skip = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
297 pixel_ptr += pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
298 pixel_countdown -= pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
299 byte_run = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
302 for (j = 0; j < byte_run; j++, pixel_countdown--) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
303 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
304 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
305 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
306 } else {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
307 byte_run = -byte_run;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
310 for (j = 0; j < byte_run; j++, pixel_countdown--) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
311 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
312 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
313 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
314 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
315 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
316
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
317 y_ptr += s->frame.linesize[0];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
318 compressed_lines--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
319 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
320 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
321
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
322 case FLI_BLACK:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
323 /* set the whole frame to color 0 (which is usually black) */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
324 memset(pixels, 0,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
325 s->frame.linesize[0] * s->avctx->height);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
326 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
327
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
328 case FLI_BRUN:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
329 /* Byte run compression: This chunk type only occurs in the first
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
330 * FLI frame and it will update the entire frame. */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
331 y_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
332 for (lines = 0; lines < s->avctx->height; lines++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
333 pixel_ptr = y_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
334 /* disregard the line packets; instead, iterate through all
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
335 * pixels on a row */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
336 stream_ptr++;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
337 pixel_countdown = s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
338 while (pixel_countdown > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
339 byte_run = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
340 if (byte_run > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
343 for (j = 0; j < byte_run; j++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
344 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
345 pixel_countdown--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
349 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
350 } else { /* copy bytes if byte_run < 0 */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
353 for (j = 0; j < byte_run; j++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
354 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
355 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
356 pixel_countdown--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
360 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
361 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
362 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
363
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
364 y_ptr += s->frame.linesize[0];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
365 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
366 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
367
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
373 stream_ptr += chunk_size - 6;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
374 } else {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
375 for (y_ptr = 0; y_ptr < s->frame.linesize[0] * s->avctx->height;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
376 y_ptr += s->frame.linesize[0]) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
377 memcpy(&pixels[y_ptr], &buf[stream_ptr],
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
378 s->avctx->width);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
379 stream_ptr += s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
380 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
381 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
382 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
383
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
384 case FLI_MINI:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
385 /* some sort of a thumbnail? disregard this chunk... */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
386 stream_ptr += chunk_size - 6;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
387 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
388
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
391 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
392 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
393
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
394 frame_size -= chunk_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
395 num_chunks--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
396 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
397
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
398 /* by the end of the chunk, the stream ptr should equal the frame
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
399 * size (minus 1, possibly); if it doesn't, issue a warning */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
403
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
404 /* make the palette available on the way out */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
405 // if (s->new_palette) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
406 if (1) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
407 memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
408 s->frame.palette_has_changed = 1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
409 s->new_palette = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
410 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
411
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
412 *data_size=sizeof(AVFrame);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
413 *(AVFrame*)data = s->frame;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
414
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
415 return buf_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
416 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
720 static int flic_decode_end(AVCodecContext *avctx)
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
721 {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
722 FlicDecodeContext *s = avctx->priv_data;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
726
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
727 return 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
728 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
729
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
730 AVCodec flic_decoder = {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
731 "flic",
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
732 CODEC_TYPE_VIDEO,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
733 CODEC_ID_FLIC,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
734 sizeof(FlicDecodeContext),
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
735 flic_decode_init,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
736 NULL,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
737 flic_decode_end,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
738 flic_decode_frame,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
743 NULL
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
744 };