annotate fli.c @ 5133:9841a86d66f9

Initial ogg demuxer. No seeking, a/v sync is broken. Support avi with ogg/vorbis audio.
author albeu
date Sat, 16 Mar 2002 14:32:03 +0000
parents 6d753f5dde1e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
1 /*
9200edf69d1d initial commit
melanson
parents:
diff changeset
2 FLI Decoder for MPlayer
9200edf69d1d initial commit
melanson
parents:
diff changeset
3
9200edf69d1d initial commit
melanson
parents:
diff changeset
4 (C) 2001 Mike Melanson
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
5
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
6 32bpp support (c) alex
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
7
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
8 Additional code and bug fixes by Roberto Togni
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
9
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
10 For information on the FLI format, as well as various traps to
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
11 avoid while programming one, visit:
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
12 http://www.pcisys.net/~melanson/codecs/
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
13 */
9200edf69d1d initial commit
melanson
parents:
diff changeset
14
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
15 #include <stdio.h>
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
16 #include <stdlib.h>
3509
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
17 #include "config.h"
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
18 #include "bswap.h"
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
19 #include "mp_msg.h"
3509
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
20
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
21 #define LE_16(x) (le2me_16(*(unsigned short *)(x)))
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
22 #define LE_32(x) (le2me_32(*(unsigned int *)(x)))
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
23
9200edf69d1d initial commit
melanson
parents:
diff changeset
24 #define FLI_256_COLOR 4
9200edf69d1d initial commit
melanson
parents:
diff changeset
25 #define FLI_DELTA 7
9200edf69d1d initial commit
melanson
parents:
diff changeset
26 #define FLI_COLOR 11
9200edf69d1d initial commit
melanson
parents:
diff changeset
27 #define FLI_LC 12
9200edf69d1d initial commit
melanson
parents:
diff changeset
28 #define FLI_BLACK 13
9200edf69d1d initial commit
melanson
parents:
diff changeset
29 #define FLI_BRUN 15
9200edf69d1d initial commit
melanson
parents:
diff changeset
30 #define FLI_COPY 16
9200edf69d1d initial commit
melanson
parents:
diff changeset
31 #define FLI_MINI 18
9200edf69d1d initial commit
melanson
parents:
diff changeset
32
9200edf69d1d initial commit
melanson
parents:
diff changeset
33 // 256 RGB entries; 25% of these bytes will be unused, but it's faster
9200edf69d1d initial commit
melanson
parents:
diff changeset
34 // to index 4-byte entries
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
35 #define PALETTE_SIZE 1024
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
36 static unsigned char palette[PALETTE_SIZE];
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
37
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
38 void *init_fli_decoder(int width, int height)
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
39 {
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
40 memset(palette, 0, PALETTE_SIZE);
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
41
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
42 return malloc(width * height * sizeof (unsigned char));
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
43 }
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
44
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
45 void decode_fli_frame(
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
46 unsigned char *encoded,
9200edf69d1d initial commit
melanson
parents:
diff changeset
47 int encoded_size,
9200edf69d1d initial commit
melanson
parents:
diff changeset
48 unsigned char *decoded,
9200edf69d1d initial commit
melanson
parents:
diff changeset
49 int width,
9200edf69d1d initial commit
melanson
parents:
diff changeset
50 int height,
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
51 int bytes_per_pixel,
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
52 void *context)
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
53 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
54 int stream_ptr = 0;
4887
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
55 int stream_ptr_after_color_chunk;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
56 int pixel_ptr;
9200edf69d1d initial commit
melanson
parents:
diff changeset
57 int palette_ptr1;
9200edf69d1d initial commit
melanson
parents:
diff changeset
58 int palette_ptr2;
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
59 unsigned char palette_idx1;
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
60 unsigned char palette_idx2;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
61
9200edf69d1d initial commit
melanson
parents:
diff changeset
62 unsigned int frame_size;
9200edf69d1d initial commit
melanson
parents:
diff changeset
63 int num_chunks;
9200edf69d1d initial commit
melanson
parents:
diff changeset
64
9200edf69d1d initial commit
melanson
parents:
diff changeset
65 unsigned int chunk_size;
9200edf69d1d initial commit
melanson
parents:
diff changeset
66 int chunk_type;
9200edf69d1d initial commit
melanson
parents:
diff changeset
67
9200edf69d1d initial commit
melanson
parents:
diff changeset
68 int i, j;
9200edf69d1d initial commit
melanson
parents:
diff changeset
69
9200edf69d1d initial commit
melanson
parents:
diff changeset
70 int color_packets;
9200edf69d1d initial commit
melanson
parents:
diff changeset
71 int color_changes;
9200edf69d1d initial commit
melanson
parents:
diff changeset
72 int color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
73
9200edf69d1d initial commit
melanson
parents:
diff changeset
74 int lines;
9200edf69d1d initial commit
melanson
parents:
diff changeset
75 int compressed_lines;
9200edf69d1d initial commit
melanson
parents:
diff changeset
76 int starting_line;
9200edf69d1d initial commit
melanson
parents:
diff changeset
77 signed short line_packets;
9200edf69d1d initial commit
melanson
parents:
diff changeset
78 int y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
79 int line_inc = width * bytes_per_pixel;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
80 signed char byte_run;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
81 int pixel_skip;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
82 int update_whole_frame = 0; // Palette change flag
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
83 unsigned char *fli_ghost_image = (unsigned char *)context;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
84 int ghost_pixel_ptr;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
85 int ghost_y_ptr;
4887
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
86
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
87 frame_size = LE_32(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
88 stream_ptr += 6; // skip the magic number
9200edf69d1d initial commit
melanson
parents:
diff changeset
89 num_chunks = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
90 stream_ptr += 10; // skip padding
9200edf69d1d initial commit
melanson
parents:
diff changeset
91
9200edf69d1d initial commit
melanson
parents:
diff changeset
92 // iterate through the chunks
9200edf69d1d initial commit
melanson
parents:
diff changeset
93 frame_size -= 16;
9200edf69d1d initial commit
melanson
parents:
diff changeset
94 while ((frame_size > 0) && (num_chunks > 0))
9200edf69d1d initial commit
melanson
parents:
diff changeset
95 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
96 chunk_size = LE_32(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
97 stream_ptr += 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
98 chunk_type = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
99 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
100
9200edf69d1d initial commit
melanson
parents:
diff changeset
101 switch (chunk_type)
9200edf69d1d initial commit
melanson
parents:
diff changeset
102 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
103 case FLI_256_COLOR:
9200edf69d1d initial commit
melanson
parents:
diff changeset
104 case FLI_COLOR:
4887
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
105 stream_ptr_after_color_chunk = stream_ptr + chunk_size - 6;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
106 if (chunk_type == FLI_COLOR)
9200edf69d1d initial commit
melanson
parents:
diff changeset
107 color_scale = 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
108 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
109 color_scale = 1;
9200edf69d1d initial commit
melanson
parents:
diff changeset
110 // set up the palette
9200edf69d1d initial commit
melanson
parents:
diff changeset
111 color_packets = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
112 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
113 palette_ptr1 = 0;
9200edf69d1d initial commit
melanson
parents:
diff changeset
114 for (i = 0; i < color_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
115 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
116 // first byte is how many colors to skip
9200edf69d1d initial commit
melanson
parents:
diff changeset
117 palette_ptr1 += (encoded[stream_ptr++] * 4);
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
118 // wrap around, for good measure
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
119 if (palette_ptr1 >= PALETTE_SIZE)
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
120 palette_ptr1 = 0;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
121 // next byte indicates how many entries to change
9200edf69d1d initial commit
melanson
parents:
diff changeset
122 color_changes = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
123 // if there are 0 color changes, there are actually 256
9200edf69d1d initial commit
melanson
parents:
diff changeset
124 if (color_changes == 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
125 color_changes = 256;
9200edf69d1d initial commit
melanson
parents:
diff changeset
126 for (j = 0; j < color_changes; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
127 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
128 palette[palette_ptr1++] = encoded[stream_ptr + 2] * color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
129 palette[palette_ptr1++] = encoded[stream_ptr + 1] * color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
130 palette[palette_ptr1++] = encoded[stream_ptr + 0] * color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
131 palette_ptr1++;
9200edf69d1d initial commit
melanson
parents:
diff changeset
132 stream_ptr += 3;
9200edf69d1d initial commit
melanson
parents:
diff changeset
133 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
134 }
4887
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
135
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
136 // color chunks sometimes have weird 16-bit alignment issues;
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
137 // therefore, take the hardline approach and set the stream_ptr
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
138 // to the value calculate w.r.t. the size specified by the color
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
139 // chunk header
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
140 stream_ptr = stream_ptr_after_color_chunk;
6d753f5dde1e fixed another color chunk issue
melanson
parents: 4719
diff changeset
141
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
142 /* Palette has changed, must update frame */
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
143 update_whole_frame = 1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
144 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
145
9200edf69d1d initial commit
melanson
parents:
diff changeset
146 case FLI_DELTA:
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
147 y_ptr = ghost_y_ptr = 0;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
148 compressed_lines = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
149 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
150 while (compressed_lines > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
151 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
152 line_packets = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
153 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
154 if (line_packets < 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
155 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
156 line_packets = -line_packets;
9200edf69d1d initial commit
melanson
parents:
diff changeset
157 y_ptr += (line_packets * line_inc);
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
158 ghost_y_ptr += (line_packets * width);
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
159 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
160 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
161 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
162 pixel_ptr = y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
163 ghost_pixel_ptr = ghost_y_ptr;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
164 for (i = 0; i < line_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
165 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
166 // account for the skip bytes
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
167 pixel_skip = encoded[stream_ptr++];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
168 pixel_ptr += pixel_skip * bytes_per_pixel;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
169 ghost_pixel_ptr += pixel_skip;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
170 byte_run = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
171 if (byte_run < 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
172 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
173 byte_run = -byte_run;
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
174 palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
175 palette_ptr2 = (palette_idx2 = encoded[stream_ptr++]) * 4;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
176 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
177 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
178 fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
179 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
180 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
181 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
182 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
183 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
184
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
185 fli_ghost_image[ghost_pixel_ptr++] = palette_idx2;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
186 decoded[pixel_ptr++] = palette[palette_ptr2 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
187 decoded[pixel_ptr++] = palette[palette_ptr2 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
188 decoded[pixel_ptr++] = palette[palette_ptr2 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
189 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
190 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
191 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
192 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
193 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
194 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
195 for (j = 0; j < byte_run * 2; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
196 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
197 palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
198 fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
199 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
200 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
201 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
202 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
203 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
204 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
205 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
206 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
207 y_ptr += line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
208 ghost_y_ptr += width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
209 compressed_lines--;
9200edf69d1d initial commit
melanson
parents:
diff changeset
210 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
211 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
212 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
213
9200edf69d1d initial commit
melanson
parents:
diff changeset
214 case FLI_LC:
9200edf69d1d initial commit
melanson
parents:
diff changeset
215 // line compressed
9200edf69d1d initial commit
melanson
parents:
diff changeset
216 starting_line = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
217 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
218 y_ptr = starting_line * line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
219 ghost_y_ptr = starting_line * width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
220
9200edf69d1d initial commit
melanson
parents:
diff changeset
221 compressed_lines = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
222 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
223 while (compressed_lines > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
224 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
225 pixel_ptr = y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
226 ghost_pixel_ptr = ghost_y_ptr;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
227 line_packets = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
228 if (line_packets > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
229 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
230 for (i = 0; i < line_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
231 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
232 // account for the skip bytes
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
233 pixel_skip = encoded[stream_ptr++];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
234 pixel_ptr += pixel_skip * bytes_per_pixel;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
235 ghost_pixel_ptr += pixel_skip;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
236 byte_run = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
237 if (byte_run > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
238 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
239 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
240 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
241 palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
242 fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
243 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
244 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
245 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
246 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
247 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
248 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
249 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
250 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
251 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
252 byte_run = -byte_run;
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
253 palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
254 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
255 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
256 fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
257 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
258 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
259 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
260 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
261 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
262 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
263 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
264 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
265 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
266
9200edf69d1d initial commit
melanson
parents:
diff changeset
267 y_ptr += line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
268 ghost_y_ptr += width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
269 compressed_lines--;
9200edf69d1d initial commit
melanson
parents:
diff changeset
270 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
271 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
272
9200edf69d1d initial commit
melanson
parents:
diff changeset
273 case FLI_BLACK:
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
274 // set the whole frame to color 0 (which is usually black) by
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
275 // clearing the ghost image and trigger a full frame update
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
276 memset(fli_ghost_image, 0, width * height * sizeof(unsigned char));
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
277 update_whole_frame = 1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
278 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
279
9200edf69d1d initial commit
melanson
parents:
diff changeset
280 case FLI_BRUN:
9200edf69d1d initial commit
melanson
parents:
diff changeset
281 // byte run compression
9200edf69d1d initial commit
melanson
parents:
diff changeset
282 y_ptr = 0;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
283 ghost_y_ptr = 0;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
284 for (lines = 0; lines < height; lines++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
285 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
286 pixel_ptr = y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
287 ghost_pixel_ptr = ghost_y_ptr;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
288 line_packets = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
289 for (i = 0; i < line_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
290 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
291 byte_run = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
292 if (byte_run > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
293 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
294 palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
295 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
296 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
297 fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
298 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
299 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
300 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
301 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
302 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
303 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
304 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
305 else // copy bytes if byte_run < 0
9200edf69d1d initial commit
melanson
parents:
diff changeset
306 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
307 byte_run = -byte_run;
9200edf69d1d initial commit
melanson
parents:
diff changeset
308 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
309 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
310 palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
311 fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
312 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
313 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
314 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
315 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
316 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
317 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
318 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
319 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
320
9200edf69d1d initial commit
melanson
parents:
diff changeset
321 y_ptr += line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
322 ghost_y_ptr += width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
323 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
324 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
325
9200edf69d1d initial commit
melanson
parents:
diff changeset
326 case FLI_COPY:
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
327 // copy the chunk (uncompressed frame) to the ghost image and
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
328 // schedule the whole frame to be updated
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
329 if (chunk_size - 6 > width * height)
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
330 {
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
331 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
332 "FLI: in chunk FLI_COPY : source data (%d bytes) bigger than image," \
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
333 " skipping chunk\n",
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
334 chunk_size - 6);
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
335 break;
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
336 }
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
337 else
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
338 memcpy(fli_ghost_image, &encoded[stream_ptr], chunk_size - 6);
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
339 stream_ptr += chunk_size - 6;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
340 update_whole_frame = 1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
341 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
342
9200edf69d1d initial commit
melanson
parents:
diff changeset
343 case FLI_MINI:
9200edf69d1d initial commit
melanson
parents:
diff changeset
344 // sort of a thumbnail? disregard this chunk...
9200edf69d1d initial commit
melanson
parents:
diff changeset
345 stream_ptr += chunk_size - 6;
9200edf69d1d initial commit
melanson
parents:
diff changeset
346 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
347
9200edf69d1d initial commit
melanson
parents:
diff changeset
348 default:
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
349 mp_msg (MSGT_DECVIDEO, MSGL_WARN,
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
350 "FLI: Unrecognized chunk type: %d\n", chunk_type);
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
351 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
352 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
353
9200edf69d1d initial commit
melanson
parents:
diff changeset
354 frame_size -= chunk_size;
9200edf69d1d initial commit
melanson
parents:
diff changeset
355 num_chunks--;
9200edf69d1d initial commit
melanson
parents:
diff changeset
356 }
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
357
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
358 if (update_whole_frame)
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
359 {
4692
f78d2b53aa48 a few quick fixes to the FLI decoder
melanson
parents: 4688
diff changeset
360 pixel_ptr = ghost_pixel_ptr = 0;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
361 while (pixel_ptr < (width * height * bytes_per_pixel))
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
362 {
4719
62eb233b12ed shrink the size of the ghost image, courtesy of Roberto Togni
melanson
parents: 4692
diff changeset
363 palette_ptr1 = fli_ghost_image[ghost_pixel_ptr++] * 4;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
364 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
365 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
366 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
367 if (bytes_per_pixel == 4) /* 32bpp */
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
368 pixel_ptr++;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
369 }
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
370 }
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
371
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
372 // by the end of the chunk, the stream ptr should equal the frame
4688
68582b4ce881 cosmetic fix
melanson
parents: 4687
diff changeset
373 // size (minus 1, possibly); if it doesn't, issue a warning
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
374 if ((stream_ptr != encoded_size) && (stream_ptr != encoded_size - 1))
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
375 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
376 " warning: processed FLI chunk where encoded size = %d\n" \
4688
68582b4ce881 cosmetic fix
melanson
parents: 4687
diff changeset
377 " and final chunk ptr = %d\n",
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
378 encoded_size, stream_ptr);
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
379 }