annotate fli.c @ 4804:62a281be07ce

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