annotate flicvideo.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 55339937018e
children
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 *
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
15 * Lesser General Public License for more details.
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
16 *
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
24 * Autodesk Animator FLI/FLC Video Decoder
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
25 * by Mike Melanson (melanson@pcisys.net)
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
26 * for more information on the .fli/.flc file format and all of its many
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
27 * variations, visit:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
28 * http://www.compuphase.com/flic.htm
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
32 * sure that your demuxer sends the FLI file header to the decoder via
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
33 * the extradata chunk in AVCodecContext. The chunk should be 128 bytes
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
34 * large. The only exception is for FLI files from the game "Magic Carpet",
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
35 * in which the header is only 12 bytes.
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
36 */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
37
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
38 #include <stdio.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
39 #include <stdlib.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
40 #include <string.h>
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
43 #include "avcodec.h"
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
44
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
45 #define FLI_256_COLOR 4
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
46 #define FLI_DELTA 7
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
47 #define FLI_COLOR 11
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
48 #define FLI_LC 12
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
49 #define FLI_BLACK 13
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
50 #define FLI_BRUN 15
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
51 #define FLI_COPY 16
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
69 typedef struct FlicDecodeContext {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
70 AVCodecContext *avctx;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
71 AVFrame frame;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
72
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
73 unsigned int palette[256];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
74 int new_palette;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
75 int fli_type; /* either 0xAF11 or 0xAF12, affects palette resolution */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
76 } FlicDecodeContext;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
79 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
80 FlicDecodeContext *s = avctx->priv_data;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
83
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
84 s->avctx = avctx;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
85
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
86 s->fli_type = AV_RL16(&fli_header[4]); /* Might be overridden if a Magic Carpet FLC */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
87
5632
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
88 depth = 0;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
89 if (s->avctx->extradata_size == 12) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
95 return -1;
5632
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
96 } else {
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
97 depth = AV_RL16(&fli_header[12]);
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
98 }
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
99
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
100 if (depth == 0) {
cdc40afde7b8 Fix issue 123 (Support Magic-carpet fli version,
melanson
parents: 5215
diff changeset
101 depth = 8; /* Some FLC generators set depth to zero, when they mean 8Bpp. Fix up here */
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
102 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
e112ff86e261 typo: unkown->unknown
alex
parents: 4539
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
122 s->new_palette = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
123
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
124 return 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
125 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
michael
parents: 5632
diff changeset
129 const uint8_t *buf, int buf_size)
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
130 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
131 FlicDecodeContext *s = avctx->priv_data;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
132
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
133 int stream_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
134 int stream_ptr_after_color_chunk;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
135 int pixel_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
136 int palette_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
137 unsigned char palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
138 unsigned char palette_idx2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
139
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
140 unsigned int frame_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
141 int num_chunks;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
142
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
143 unsigned int chunk_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
144 int chunk_type;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
145
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
146 int i, j;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
147
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
148 int color_packets;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
149 int color_changes;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
150 int color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
151 unsigned char r, g, b;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
152
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
153 int lines;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
154 int compressed_lines;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
155 int starting_line;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
156 signed short line_packets;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
157 int y_ptr;
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
158 int byte_run;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
159 int pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
160 int pixel_countdown;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
161 unsigned char *pixels;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
162 unsigned int pixel_limit;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
163
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
168 return -1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
169 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
170
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
173
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
174 frame_size = AV_RL32(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
175 stream_ptr += 6; /* skip the magic number */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
176 num_chunks = AV_RL16(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
177 stream_ptr += 10; /* skip padding */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
178
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
179 frame_size -= 16;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
180
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
181 /* iterate through the chunks */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
182 while ((frame_size > 0) && (num_chunks > 0)) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
183 chunk_size = AV_RL32(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
184 stream_ptr += 4;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
185 chunk_type = AV_RL16(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
186 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
187
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
188 switch (chunk_type) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
189 case FLI_256_COLOR:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
190 case FLI_COLOR:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
191 stream_ptr_after_color_chunk = stream_ptr + chunk_size - 6;
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 */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
202 color_packets = AV_RL16(&buf[stream_ptr]);
1624
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++) {
4045
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
217 unsigned int entry;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
218
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
219 /* wrap around, for good measure */
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 1881
diff changeset
220 if ((unsigned)palette_ptr >= 256)
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
221 palette_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
222
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
223 r = buf[stream_ptr++] << color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
224 g = buf[stream_ptr++] << color_shift;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
225 b = buf[stream_ptr++] << color_shift;
4045
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
226 entry = (r << 16) | (g << 8) | b;
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
227 if (s->palette[palette_ptr] != entry)
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
228 s->new_palette = 1;
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
229 s->palette[palette_ptr++] = entry;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
230 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
231 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
232
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
233 /* color chunks sometimes have weird 16-bit alignment issues;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
234 * therefore, take the hardline approach and set the stream_ptr
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
235 * to the value calculated w.r.t. the size specified by the color
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
236 * chunk header */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
237 stream_ptr = stream_ptr_after_color_chunk;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
238
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
239 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
240
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
241 case FLI_DELTA:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
242 y_ptr = 0;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
243 compressed_lines = AV_RL16(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
244 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
245 while (compressed_lines > 0) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
246 line_packets = AV_RL16(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
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
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
256 pixel_ptr= y_ptr + s->frame.linesize[0] - 1;
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
257 CHECK_PIXEL_PTR(0);
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
258 pixels[pixel_ptr] = line_packets & 0xff;
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
259 } else {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
260 compressed_lines--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
261 pixel_ptr = y_ptr;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
262 CHECK_PIXEL_PTR(0);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
263 pixel_countdown = s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
264 for (i = 0; i < line_packets; i++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
265 /* account for the skip bytes */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
266 pixel_skip = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
267 pixel_ptr += pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
268 pixel_countdown -= pixel_skip;
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
269 byte_run = (signed char)(buf[stream_ptr++]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
270 if (byte_run < 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
271 byte_run = -byte_run;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
272 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
273 palette_idx2 = buf[stream_ptr++];
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
274 CHECK_PIXEL_PTR(byte_run * 2);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
275 for (j = 0; j < byte_run; j++, pixel_countdown -= 2) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
276 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
277 pixels[pixel_ptr++] = palette_idx2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
278 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
279 } else {
2825
faa53103dde0 tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents: 2422
diff changeset
280 CHECK_PIXEL_PTR(byte_run * 2);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
281 for (j = 0; j < byte_run * 2; j++, pixel_countdown--) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
282 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
283 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
284 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
285 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
286 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
287
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
288 y_ptr += s->frame.linesize[0];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
289 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
290 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
291 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
292
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
293 case FLI_LC:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
294 /* line compressed */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
295 starting_line = AV_RL16(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
296 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
297 y_ptr = 0;
1759
e73a3b86565f Use reget buffer instead of copying from prev frame
rtognimp
parents: 1624
diff changeset
298 y_ptr += starting_line * s->frame.linesize[0];
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
299
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
300 compressed_lines = AV_RL16(&buf[stream_ptr]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
301 stream_ptr += 2;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
302 while (compressed_lines > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
303 pixel_ptr = y_ptr;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
304 CHECK_PIXEL_PTR(0);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
305 pixel_countdown = s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
306 line_packets = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
307 if (line_packets > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
308 for (i = 0; i < line_packets; i++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
309 /* account for the skip bytes */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
310 pixel_skip = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
311 pixel_ptr += pixel_skip;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
312 pixel_countdown -= pixel_skip;
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
313 byte_run = (signed char)(buf[stream_ptr++]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
314 if (byte_run > 0) {
2825
faa53103dde0 tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents: 2422
diff changeset
315 CHECK_PIXEL_PTR(byte_run);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
316 for (j = 0; j < byte_run; j++, pixel_countdown--) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
317 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
318 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
319 }
4233
5e05fadc93d1 support byte_run=0 case in DELTA_FLI (this case means only skip pixels)
alex
parents: 4232
diff changeset
320 } else if (byte_run < 0) {
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
321 byte_run = -byte_run;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
322 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
323 CHECK_PIXEL_PTR(byte_run);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
324 for (j = 0; j < byte_run; j++, pixel_countdown--) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
325 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
326 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
327 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
328 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
329 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
330
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
331 y_ptr += s->frame.linesize[0];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
332 compressed_lines--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
333 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
334 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
335
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
336 case FLI_BLACK:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
337 /* set the whole frame to color 0 (which is usually black) */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
338 memset(pixels, 0,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
339 s->frame.linesize[0] * s->avctx->height);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
340 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
341
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
342 case FLI_BRUN:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
343 /* Byte run compression: This chunk type only occurs in the first
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
344 * FLI frame and it will update the entire frame. */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
345 y_ptr = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
346 for (lines = 0; lines < s->avctx->height; lines++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
347 pixel_ptr = y_ptr;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
348 /* disregard the line packets; instead, iterate through all
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
349 * pixels on a row */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
350 stream_ptr++;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
351 pixel_countdown = s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
352 while (pixel_countdown > 0) {
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
353 byte_run = (signed char)(buf[stream_ptr++]);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
354 if (byte_run > 0) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
355 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
356 CHECK_PIXEL_PTR(byte_run);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
357 for (j = 0; j < byte_run; j++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
358 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
359 pixel_countdown--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
360 if (pixel_countdown < 0)
4539
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
361 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) at line %d\n",
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
362 pixel_countdown, lines);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
363 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
364 } else { /* copy bytes if byte_run < 0 */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
365 byte_run = -byte_run;
2825
faa53103dde0 tinfoil patch: make sure that pixel pointer does not go out of bounds
melanson
parents: 2422
diff changeset
366 CHECK_PIXEL_PTR(byte_run);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
367 for (j = 0; j < byte_run; j++) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
368 palette_idx1 = buf[stream_ptr++];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
369 pixels[pixel_ptr++] = palette_idx1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
370 pixel_countdown--;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
371 if (pixel_countdown < 0)
4539
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
372 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) at line %d\n",
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
373 pixel_countdown, lines);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
374 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
375 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
376 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
377
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
378 y_ptr += s->frame.linesize[0];
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
379 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
380 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
381
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
382 case FLI_COPY:
1759
e73a3b86565f Use reget buffer instead of copying from prev frame
rtognimp
parents: 1624
diff changeset
383 /* copy the chunk (uncompressed frame) */
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
384 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
385 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
386 "bigger than image, skipping chunk\n", chunk_size - 6);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
387 stream_ptr += chunk_size - 6;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
388 } else {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
389 for (y_ptr = 0; y_ptr < s->frame.linesize[0] * s->avctx->height;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
390 y_ptr += s->frame.linesize[0]) {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
391 memcpy(&pixels[y_ptr], &buf[stream_ptr],
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
392 s->avctx->width);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
393 stream_ptr += s->avctx->width;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
394 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
395 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
396 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
397
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
398 case FLI_MINI:
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
399 /* some sort of a thumbnail? disregard this chunk... */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
400 stream_ptr += chunk_size - 6;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
401 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
402
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
403 default:
1759
e73a3b86565f Use reget buffer instead of copying from prev frame
rtognimp
parents: 1624
diff changeset
404 av_log(avctx, AV_LOG_ERROR, "Unrecognized chunk type: %d\n", chunk_type);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
405 break;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
406 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
407
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
408 frame_size -= chunk_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
409 num_chunks--;
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 /* by the end of the chunk, the stream ptr should equal the frame
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
413 * size (minus 1, possibly); if it doesn't, issue a warning */
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
414 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
415 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
416 "and final chunk ptr = %d\n", buf_size, stream_ptr);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
417
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
418 /* make the palette available on the way out */
4045
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
419 memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE);
1bf7bc44430f correct signaling of palette change
alex
parents: 3947
diff changeset
420 if (s->new_palette) {
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
421 s->frame.palette_has_changed = 1;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
422 s->new_palette = 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
423 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
424
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
425 *data_size=sizeof(AVFrame);
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
426 *(AVFrame*)data = s->frame;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
427
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
428 return buf_size;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
429 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
430
3071
cc0357a90e8f make some functions static (patch by Dieter < freebsd at sopwith.solgatos.com >)
aurel
parents: 3036
diff changeset
431 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
432 void *data, int *data_size,
6237
michael
parents: 5632
diff changeset
433 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
434 {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
435 /* 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
436 /* Format is the pixel format, the packets are processed the same. */
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
437 FlicDecodeContext *s = avctx->priv_data;
2907
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 int stream_ptr = 0;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
440 int pixel_ptr;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
441 unsigned char palette_idx1;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
442
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
443 unsigned int frame_size;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
444 int num_chunks;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
445
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
446 unsigned int chunk_size;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
447 int chunk_type;
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 int i, j;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
450
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
451 int lines;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
452 int compressed_lines;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
453 signed short line_packets;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
454 int y_ptr;
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
455 int byte_run;
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
456 int pixel_skip;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
457 int pixel_countdown;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
458 unsigned char *pixels;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
459 int pixel;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
460 unsigned int pixel_limit;
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
461
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
462 s->frame.reference = 1;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
463 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
464 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
465 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
466 return -1;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
467 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
468
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
469 pixels = s->frame.data[0];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
470 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
471
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
472 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
473 stream_ptr += 6; /* skip the magic number */
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
474 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
475 stream_ptr += 10; /* skip padding */
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
476
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
477 frame_size -= 16;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
478
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
479 /* iterate through the chunks */
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
480 while ((frame_size > 0) && (num_chunks > 0)) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
481 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
482 stream_ptr += 4;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
483 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
484 stream_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
485
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
486 switch (chunk_type) {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
487 case FLI_256_COLOR:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
488 case FLI_COLOR:
6488
ecbe9565dcae typo fixes
diego
parents: 6237
diff changeset
489 /* For some reason, it seems that non-palettized flics do
ecbe9565dcae typo fixes
diego
parents: 6237
diff changeset
490 * include one of these chunks in their first frame.
ecbe9565dcae typo fixes
diego
parents: 6237
diff changeset
491 * 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
492 /* 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
493 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
494 break;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
495
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
496 case FLI_DELTA:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
497 case FLI_DTA_LC:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
498 y_ptr = 0;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
499 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
500 stream_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
501 while (compressed_lines > 0) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
502 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
503 stream_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
504 if (line_packets < 0) {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
505 line_packets = -line_packets;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
506 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
507 } else {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
508 compressed_lines--;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
509 pixel_ptr = y_ptr;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
510 CHECK_PIXEL_PTR(0);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
511 pixel_countdown = s->avctx->width;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
512 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
513 /* account for the skip bytes */
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
514 pixel_skip = buf[stream_ptr++];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
515 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
516 pixel_countdown -= pixel_skip;
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
517 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
518 if (byte_run < 0) {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
519 byte_run = -byte_run;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
520 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
521 stream_ptr += 2;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
522 CHECK_PIXEL_PTR(2 * byte_run);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
523 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
524 *((signed short*)(&pixels[pixel_ptr])) = pixel;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
525 pixel_ptr += 2;
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 } else {
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
528 CHECK_PIXEL_PTR(2 * byte_run);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
529 for (j = 0; j < byte_run; j++, pixel_countdown--) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
530 *((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
531 stream_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
532 pixel_ptr += 2;
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 }
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 y_ptr += s->frame.linesize[0];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
538 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
539 }
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_LC:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
543 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
544 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
545 break;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
546
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
547 case FLI_BLACK:
4235
lu_zero
parents: 4234
diff changeset
548 /* 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
549 memset(pixels, 0x0000,
4232
cb5e46ee0495 10l memory corruption bug found by Steven Johnson
alex
parents: 4199
diff changeset
550 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
551 break;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
552
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
553 case FLI_BRUN:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
554 y_ptr = 0;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
555 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
556 pixel_ptr = y_ptr;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
557 /* 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
558 * pixels on a row */
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
559 stream_ptr++;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
560 pixel_countdown = (s->avctx->width * 2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
561
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
562 while (pixel_countdown > 0) {
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
563 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
564 if (byte_run > 0) {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
565 palette_idx1 = buf[stream_ptr++];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
566 CHECK_PIXEL_PTR(byte_run);
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
567 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
568 pixels[pixel_ptr++] = palette_idx1;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
569 pixel_countdown--;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
570 if (pixel_countdown < 0)
4539
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
571 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) (linea%d)\n",
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
572 pixel_countdown, lines);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
573 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
574 } 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
575 byte_run = -byte_run;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
576 CHECK_PIXEL_PTR(byte_run);
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
577 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
578 palette_idx1 = buf[stream_ptr++];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
579 pixels[pixel_ptr++] = palette_idx1;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
580 pixel_countdown--;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
581 if (pixel_countdown < 0)
4539
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
582 av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d) at line %d\n",
956ccc32d4e9 display line number when printing error
alex
parents: 4364
diff changeset
583 pixel_countdown, lines);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
584 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
585 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
586 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
587
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
588 /* Now FLX is strange, in that it is "byte" as opposed to "pixel" run length compressed.
5127
4dbe6578f811 misc spelling fixes
diego
parents: 4962
diff changeset
589 * This does not give us any good oportunity to perform word endian conversion
4dbe6578f811 misc spelling fixes
diego
parents: 4962
diff changeset
590 * 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
591 * 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
592 */
9985
266bf83f634d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 9981
diff changeset
593 #if HAVE_BIGENDIAN
5155
2ac6e904300b fix indentation
mru
parents: 5154
diff changeset
594 pixel_ptr = y_ptr;
2ac6e904300b fix indentation
mru
parents: 5154
diff changeset
595 pixel_countdown = s->avctx->width;
2ac6e904300b fix indentation
mru
parents: 5154
diff changeset
596 while (pixel_countdown > 0) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
597 *((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
598 pixel_ptr += 2;
5155
2ac6e904300b fix indentation
mru
parents: 5154
diff changeset
599 }
5154
b683b5f78fab replace endian detection hack with #ifdef WORDS_BIGENDIAN
mru
parents: 5129
diff changeset
600 #endif
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
601 y_ptr += s->frame.linesize[0];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
602 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
603 break;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
604
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
605 case FLI_DTA_BRUN:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
606 y_ptr = 0;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
607 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
608 pixel_ptr = y_ptr;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
609 /* 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
610 * pixels on a row */
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
611 stream_ptr++;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
612 pixel_countdown = s->avctx->width; /* Width is in pixels, not bytes */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
613
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
614 while (pixel_countdown > 0) {
4199
214d3d9b69dc Fix possible overflows. Found by Steven Johnson
alex
parents: 4045
diff changeset
615 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
616 if (byte_run > 0) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
617 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
618 stream_ptr += 2;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
619 CHECK_PIXEL_PTR(2 * byte_run);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
620 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
621 *((signed short*)(&pixels[pixel_ptr])) = pixel;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
622 pixel_ptr += 2;
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
623 pixel_countdown--;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
624 if (pixel_countdown < 0)
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
625 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
626 pixel_countdown);
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 } 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
629 byte_run = -byte_run;
12526
55339937018e Fix several security issues in flicvideo.c
michael
parents: 11644
diff changeset
630 CHECK_PIXEL_PTR(2 * byte_run);
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
631 for (j = 0; j < byte_run; j++) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
632 *((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
633 stream_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
634 pixel_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
635 pixel_countdown--;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
636 if (pixel_countdown < 0)
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
637 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
638 pixel_countdown);
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 }
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
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
643 y_ptr += s->frame.linesize[0];
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
644 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
645 break;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
646
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
647 case FLI_COPY:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
648 case FLI_DTA_COPY:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
649 /* copy the chunk (uncompressed frame) */
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
650 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
651 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
652 "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
653 stream_ptr += chunk_size - 6;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
654 } else {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
655
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
656 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
657 y_ptr += s->frame.linesize[0]) {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
658
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
659 pixel_countdown = s->avctx->width;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
660 pixel_ptr = 0;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
661 while (pixel_countdown > 0) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4235
diff changeset
662 *((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
663 pixel_ptr += 2;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
664 pixel_countdown--;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
665 }
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
666 stream_ptr += s->avctx->width*2;
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 }
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 case FLI_MINI:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
672 /* 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
673 stream_ptr += chunk_size - 6;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
674 break;
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 default:
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
677 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
678 break;
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
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
681 frame_size -= chunk_size;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
682 num_chunks--;
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 /* 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
686 * 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
687 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
688 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
689 "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
690
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 *data_size=sizeof(AVFrame);
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
693 *(AVFrame*)data = s->frame;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
694
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
695 return 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
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
698 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
699 void *data, int *data_size,
6237
michael
parents: 5632
diff changeset
700 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
701 {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
702 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
703 return -1;
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
704 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
705
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
706 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
707 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
708 AVPacket *avpkt)
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
709 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
710 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
711 int buf_size = avpkt->size;
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
712 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
713 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
714 buf, buf_size);
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
715 }
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_RGB555) ||
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
717 (avctx->pix_fmt == PIX_FMT_RGB565)) {
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
718 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
719 buf, buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
720 }
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
721 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
722 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
723 buf, buf_size);
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
724 }
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
725
5127
4dbe6578f811 misc spelling fixes
diego
parents: 4962
diff changeset
726 /* 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
727 /* 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
728 /* the finite set of possibilites allowable by here. */
5127
4dbe6578f811 misc spelling fixes
diego
parents: 4962
diff changeset
729 /* But in case we do, just error out. */
4dbe6578f811 misc spelling fixes
diego
parents: 4962
diff changeset
730 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
731 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2907
diff changeset
732 }
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
733
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
734
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6488
diff changeset
735 static av_cold int flic_decode_end(AVCodecContext *avctx)
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
736 {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
737 FlicDecodeContext *s = avctx->priv_data;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
738
1759
e73a3b86565f Use reget buffer instead of copying from prev frame
rtognimp
parents: 1624
diff changeset
739 if (s->frame.data[0])
e73a3b86565f Use reget buffer instead of copying from prev frame
rtognimp
parents: 1624
diff changeset
740 avctx->release_buffer(avctx, &s->frame);
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
741
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
742 return 0;
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
743 }
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
744
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
745 AVCodec flic_decoder = {
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
746 "flic",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9985
diff changeset
747 AVMEDIA_TYPE_VIDEO,
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
748 CODEC_ID_FLIC,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
749 sizeof(FlicDecodeContext),
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
750 flic_decode_init,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
751 NULL,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
752 flic_decode_end,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
753 flic_decode_frame,
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
754 CODEC_CAP_DR1,
2907
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
755 NULL,
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
756 NULL,
f7114e03d8dd support for FLX and DTA extensions in the FLIC format, courtesy of
melanson
parents: 2825
diff changeset
757 NULL,
6717
5df0c730234d Add some long names to AVCodec declarations.
diego
parents: 6517
diff changeset
758 NULL,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6763
diff changeset
759 .long_name = NULL_IF_CONFIG_SMALL("Autodesk Animator Flic video"),
1624
46dee16488ae yep, FLI support
melanson
parents:
diff changeset
760 };