annotate fli.c @ 4710:701976d7a7d1

fast header checker added
author arpi
date Thu, 14 Feb 2002 23:41:00 +0000
parents f78d2b53aa48
children 62eb233b12ed
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
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
42 return malloc(width * height * sizeof (unsigned int));
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;
9200edf69d1d initial commit
melanson
parents:
diff changeset
55 int pixel_ptr;
9200edf69d1d initial commit
melanson
parents:
diff changeset
56 int palette_ptr1;
9200edf69d1d initial commit
melanson
parents:
diff changeset
57 int palette_ptr2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
58
9200edf69d1d initial commit
melanson
parents:
diff changeset
59 unsigned int frame_size;
9200edf69d1d initial commit
melanson
parents:
diff changeset
60 int num_chunks;
9200edf69d1d initial commit
melanson
parents:
diff changeset
61
9200edf69d1d initial commit
melanson
parents:
diff changeset
62 unsigned int chunk_size;
9200edf69d1d initial commit
melanson
parents:
diff changeset
63 int chunk_type;
9200edf69d1d initial commit
melanson
parents:
diff changeset
64
9200edf69d1d initial commit
melanson
parents:
diff changeset
65 int i, j;
9200edf69d1d initial commit
melanson
parents:
diff changeset
66
9200edf69d1d initial commit
melanson
parents:
diff changeset
67 int color_packets;
9200edf69d1d initial commit
melanson
parents:
diff changeset
68 int color_changes;
9200edf69d1d initial commit
melanson
parents:
diff changeset
69 int color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
70
9200edf69d1d initial commit
melanson
parents:
diff changeset
71 int lines;
9200edf69d1d initial commit
melanson
parents:
diff changeset
72 int compressed_lines;
9200edf69d1d initial commit
melanson
parents:
diff changeset
73 int starting_line;
9200edf69d1d initial commit
melanson
parents:
diff changeset
74 signed short line_packets;
9200edf69d1d initial commit
melanson
parents:
diff changeset
75 int y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
76 int line_inc = width * bytes_per_pixel;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
77 signed char byte_run;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
78 int pixel_skip;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
79 int update_whole_frame = 0; // Palette change flag
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
80 unsigned int *fli_ghost_image = (unsigned int *)context;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
81 int ghost_pixel_ptr;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
82 int ghost_y_ptr;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
83
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
84 frame_size = LE_32(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
85 stream_ptr += 6; // skip the magic number
9200edf69d1d initial commit
melanson
parents:
diff changeset
86 num_chunks = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
87 stream_ptr += 10; // skip padding
9200edf69d1d initial commit
melanson
parents:
diff changeset
88
9200edf69d1d initial commit
melanson
parents:
diff changeset
89 // iterate through the chunks
9200edf69d1d initial commit
melanson
parents:
diff changeset
90 frame_size -= 16;
9200edf69d1d initial commit
melanson
parents:
diff changeset
91 while ((frame_size > 0) && (num_chunks > 0))
9200edf69d1d initial commit
melanson
parents:
diff changeset
92 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
93 chunk_size = LE_32(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
94 stream_ptr += 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
95 chunk_type = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
96 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
97
9200edf69d1d initial commit
melanson
parents:
diff changeset
98 switch (chunk_type)
9200edf69d1d initial commit
melanson
parents:
diff changeset
99 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
100 case FLI_256_COLOR:
9200edf69d1d initial commit
melanson
parents:
diff changeset
101 case FLI_COLOR:
9200edf69d1d initial commit
melanson
parents:
diff changeset
102 if (chunk_type == FLI_COLOR)
9200edf69d1d initial commit
melanson
parents:
diff changeset
103 color_scale = 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
104 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
105 color_scale = 1;
9200edf69d1d initial commit
melanson
parents:
diff changeset
106 // set up the palette
9200edf69d1d initial commit
melanson
parents:
diff changeset
107 color_packets = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
108 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
109 palette_ptr1 = 0;
9200edf69d1d initial commit
melanson
parents:
diff changeset
110 for (i = 0; i < color_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
111 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
112 // first byte is how many colors to skip
9200edf69d1d initial commit
melanson
parents:
diff changeset
113 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
114 // wrap around, for good measure
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
115 if (palette_ptr1 >= PALETTE_SIZE)
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
116 palette_ptr1 = 0;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
117 // next byte indicates how many entries to change
9200edf69d1d initial commit
melanson
parents:
diff changeset
118 color_changes = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
119 // if there are 0 color changes, there are actually 256
9200edf69d1d initial commit
melanson
parents:
diff changeset
120 if (color_changes == 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
121 color_changes = 256;
9200edf69d1d initial commit
melanson
parents:
diff changeset
122 for (j = 0; j < color_changes; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
123 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
124 palette[palette_ptr1++] = encoded[stream_ptr + 2] * color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
125 palette[palette_ptr1++] = encoded[stream_ptr + 1] * color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
126 palette[palette_ptr1++] = encoded[stream_ptr + 0] * color_scale;
9200edf69d1d initial commit
melanson
parents:
diff changeset
127 palette_ptr1++;
9200edf69d1d initial commit
melanson
parents:
diff changeset
128 stream_ptr += 3;
9200edf69d1d initial commit
melanson
parents:
diff changeset
129 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
130 }
3509
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
131 // it seems that a color packet has to be an even number of bytes
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
132 // so account for a pad byte
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
133 if (stream_ptr & 0x01)
21c7b77b3e83 fixed endian-ness for FLI and MS Video 1 decoders; fixed padding bug in
melanson
parents: 3185
diff changeset
134 stream_ptr++;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
135 /* 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
136 update_whole_frame = 1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
137 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
138
9200edf69d1d initial commit
melanson
parents:
diff changeset
139 case FLI_DELTA:
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
140 y_ptr = ghost_y_ptr = 0;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
141 compressed_lines = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
142 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
143 while (compressed_lines > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
144 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
145 line_packets = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
146 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
147 if (line_packets < 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
148 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
149 line_packets = -line_packets;
9200edf69d1d initial commit
melanson
parents:
diff changeset
150 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
151 ghost_y_ptr += (line_packets * width);
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
152 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
153 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
154 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
155 pixel_ptr = y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
156 ghost_pixel_ptr = ghost_y_ptr;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
157 for (i = 0; i < line_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
158 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
159 // 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
160 pixel_skip = encoded[stream_ptr++];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
161 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
162 ghost_pixel_ptr += pixel_skip;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
163 byte_run = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
164 if (byte_run < 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
165 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
166 byte_run = -byte_run;
9200edf69d1d initial commit
melanson
parents:
diff changeset
167 palette_ptr1 = encoded[stream_ptr++] * 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
168 palette_ptr2 = encoded[stream_ptr++] * 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
169 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
170 {
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
171 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
172 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
173 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
174 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
175 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
176 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
177
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
178 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr2;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
179 decoded[pixel_ptr++] = palette[palette_ptr2 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
180 decoded[pixel_ptr++] = palette[palette_ptr2 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
181 decoded[pixel_ptr++] = palette[palette_ptr2 + 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 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
185 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
186 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
187 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
188 for (j = 0; j < byte_run * 2; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
189 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
190 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
191 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
192 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
193 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
194 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
195 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
196 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
197 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
198 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
199 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
200 y_ptr += line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
201 ghost_y_ptr += width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
202 compressed_lines--;
9200edf69d1d initial commit
melanson
parents:
diff changeset
203 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
204 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
205 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
206
9200edf69d1d initial commit
melanson
parents:
diff changeset
207 case FLI_LC:
9200edf69d1d initial commit
melanson
parents:
diff changeset
208 // line compressed
9200edf69d1d initial commit
melanson
parents:
diff changeset
209 starting_line = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
210 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
211 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
212 ghost_y_ptr = starting_line * width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
213
9200edf69d1d initial commit
melanson
parents:
diff changeset
214 compressed_lines = LE_16(&encoded[stream_ptr]);
9200edf69d1d initial commit
melanson
parents:
diff changeset
215 stream_ptr += 2;
9200edf69d1d initial commit
melanson
parents:
diff changeset
216 while (compressed_lines > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
217 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
218 pixel_ptr = y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
219 ghost_pixel_ptr = ghost_y_ptr;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
220 line_packets = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
221 if (line_packets > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
222 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
223 for (i = 0; i < line_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
224 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
225 // 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
226 pixel_skip = encoded[stream_ptr++];
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
227 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
228 ghost_pixel_ptr += pixel_skip;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
229 byte_run = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
230 if (byte_run > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
231 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
232 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
233 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
234 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
235 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
236 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
237 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
238 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
239 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
240 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
241 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
242 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
243 else
9200edf69d1d initial commit
melanson
parents:
diff changeset
244 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
245 byte_run = -byte_run;
9200edf69d1d initial commit
melanson
parents:
diff changeset
246 palette_ptr1 = encoded[stream_ptr++] * 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
247 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
248 {
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
249 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
250 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
251 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
252 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
253 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
254 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
255 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
256 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
257 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
258 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
259
9200edf69d1d initial commit
melanson
parents:
diff changeset
260 y_ptr += line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
261 ghost_y_ptr += width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
262 compressed_lines--;
9200edf69d1d initial commit
melanson
parents:
diff changeset
263 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
264 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
265
9200edf69d1d initial commit
melanson
parents:
diff changeset
266 case FLI_BLACK:
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
267 // 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
268 // clearing the ghost image and trigger a full frame update
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
269 memset(fli_ghost_image, 0, width * height * sizeof(unsigned int));
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
270 update_whole_frame = 1;
3155
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_BRUN:
9200edf69d1d initial commit
melanson
parents:
diff changeset
274 // byte run compression
9200edf69d1d initial commit
melanson
parents:
diff changeset
275 y_ptr = 0;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
276 ghost_y_ptr = 0;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
277 for (lines = 0; lines < height; lines++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
278 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
279 pixel_ptr = y_ptr;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
280 ghost_pixel_ptr = ghost_y_ptr;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
281 line_packets = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
282 for (i = 0; i < line_packets; i++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
283 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
284 byte_run = encoded[stream_ptr++];
9200edf69d1d initial commit
melanson
parents:
diff changeset
285 if (byte_run > 0)
9200edf69d1d initial commit
melanson
parents:
diff changeset
286 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
287 palette_ptr1 = encoded[stream_ptr++] * 4;
9200edf69d1d initial commit
melanson
parents:
diff changeset
288 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
289 {
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
290 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
291 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
292 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
293 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
294 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
295 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
296 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
297 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
298 else // copy bytes if byte_run < 0
9200edf69d1d initial commit
melanson
parents:
diff changeset
299 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
300 byte_run = -byte_run;
9200edf69d1d initial commit
melanson
parents:
diff changeset
301 for (j = 0; j < byte_run; j++)
9200edf69d1d initial commit
melanson
parents:
diff changeset
302 {
9200edf69d1d initial commit
melanson
parents:
diff changeset
303 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
304 fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
305 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
9200edf69d1d initial commit
melanson
parents:
diff changeset
306 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
9200edf69d1d initial commit
melanson
parents:
diff changeset
307 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
3185
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
308 if (bytes_per_pixel == 4) /* 32bpp */
a1205b22a5f4 32bpp support added
alex
parents: 3155
diff changeset
309 pixel_ptr++;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
310 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
311 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
312 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
313
9200edf69d1d initial commit
melanson
parents:
diff changeset
314 y_ptr += line_inc;
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
315 ghost_y_ptr += width;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
316 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
317 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
318
9200edf69d1d initial commit
melanson
parents:
diff changeset
319 case FLI_COPY:
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
320 // 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
321 // schedule the whole frame to be updated
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
322 memcpy(fli_ghost_image, &encoded[stream_ptr], chunk_size - 6);
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
323 stream_ptr += chunk_size - 6;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
324 update_whole_frame = 1;
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
325 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
326
9200edf69d1d initial commit
melanson
parents:
diff changeset
327 case FLI_MINI:
9200edf69d1d initial commit
melanson
parents:
diff changeset
328 // sort of a thumbnail? disregard this chunk...
9200edf69d1d initial commit
melanson
parents:
diff changeset
329 stream_ptr += chunk_size - 6;
9200edf69d1d initial commit
melanson
parents:
diff changeset
330 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
331
9200edf69d1d initial commit
melanson
parents:
diff changeset
332 default:
9200edf69d1d initial commit
melanson
parents:
diff changeset
333 printf ("FLI: Unrecognized chunk type: %d\n", chunk_type);
9200edf69d1d initial commit
melanson
parents:
diff changeset
334 break;
9200edf69d1d initial commit
melanson
parents:
diff changeset
335 }
9200edf69d1d initial commit
melanson
parents:
diff changeset
336
9200edf69d1d initial commit
melanson
parents:
diff changeset
337 frame_size -= chunk_size;
9200edf69d1d initial commit
melanson
parents:
diff changeset
338 num_chunks--;
9200edf69d1d initial commit
melanson
parents:
diff changeset
339 }
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
340
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
341 if (update_whole_frame)
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
342 {
4692
f78d2b53aa48 a few quick fixes to the FLI decoder
melanson
parents: 4688
diff changeset
343 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
344 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
345 {
4692
f78d2b53aa48 a few quick fixes to the FLI decoder
melanson
parents: 4688
diff changeset
346 palette_ptr1 = fli_ghost_image[ghost_pixel_ptr++];
4687
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
347 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
348 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
349 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
350 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
351 pixel_ptr++;
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
352 }
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
353 }
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
354
2973e997c4a5 some obscure bug fixes to the FLI decoder, with many thanks to Roberto
melanson
parents: 3737
diff changeset
355 // by the end of the chunk, the stream ptr should equal the frame
4688
68582b4ce881 cosmetic fix
melanson
parents: 4687
diff changeset
356 // 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
357 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
358 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
359 " warning: processed FLI chunk where encoded size = %d\n" \
4688
68582b4ce881 cosmetic fix
melanson
parents: 4687
diff changeset
360 " 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
361 encoded_size, stream_ptr);
3155
9200edf69d1d initial commit
melanson
parents:
diff changeset
362 }