Mercurial > libavformat.hg
comparison idcin.c @ 295:bff1a372ae38 libavformat
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
author | melanson |
---|---|
date | Thu, 30 Oct 2003 05:40:58 +0000 |
parents | 9fa2ec3b9982 |
children | c152849ee643 |
comparison
equal
deleted
inserted
replaced
294:6091b76cfc2a | 295:bff1a372ae38 |
---|---|
88 int next_chunk_is_video; | 88 int next_chunk_is_video; |
89 int audio_present; | 89 int audio_present; |
90 | 90 |
91 int64_t pts; | 91 int64_t pts; |
92 | 92 |
93 /* keep reference to extradata but never free it */ | 93 AVPaletteControl palctrl; |
94 void *extradata; | |
95 } IdcinDemuxContext; | 94 } IdcinDemuxContext; |
96 | 95 |
97 static int idcin_probe(AVProbeData *p) | 96 static int idcin_probe(AVProbeData *p) |
98 { | 97 { |
99 unsigned int number; | 98 unsigned int number; |
173 st->codec.extradata = av_malloc(HUFFMAN_TABLE_SIZE); | 172 st->codec.extradata = av_malloc(HUFFMAN_TABLE_SIZE); |
174 if (get_buffer(pb, st->codec.extradata, HUFFMAN_TABLE_SIZE) != | 173 if (get_buffer(pb, st->codec.extradata, HUFFMAN_TABLE_SIZE) != |
175 HUFFMAN_TABLE_SIZE) | 174 HUFFMAN_TABLE_SIZE) |
176 return -EIO; | 175 return -EIO; |
177 /* save a reference in order to transport the palette */ | 176 /* save a reference in order to transport the palette */ |
178 idcin->extradata = st->codec.extradata; | 177 st->codec.palctrl = &idcin->palctrl; |
179 | 178 |
180 /* if sample rate is 0, assume no audio */ | 179 /* if sample rate is 0, assume no audio */ |
181 if (sample_rate) { | 180 if (sample_rate) { |
182 idcin->audio_present = 1; | 181 idcin->audio_present = 1; |
183 st = av_new_stream(s, 0); | 182 st = av_new_stream(s, 0); |
225 int ret; | 224 int ret; |
226 unsigned int command; | 225 unsigned int command; |
227 unsigned int chunk_size; | 226 unsigned int chunk_size; |
228 IdcinDemuxContext *idcin = (IdcinDemuxContext *)s->priv_data; | 227 IdcinDemuxContext *idcin = (IdcinDemuxContext *)s->priv_data; |
229 ByteIOContext *pb = &s->pb; | 228 ByteIOContext *pb = &s->pb; |
230 AVPaletteControl *palette_control = (AVPaletteControl *)idcin->extradata; | |
231 int i; | 229 int i; |
232 int palette_scale; | 230 int palette_scale; |
231 unsigned char r, g, b; | |
232 unsigned char palette_buffer[768]; | |
233 | 233 |
234 if (url_feof(&s->pb)) | 234 if (url_feof(&s->pb)) |
235 return -EIO; | 235 return -EIO; |
236 | 236 |
237 if (idcin->next_chunk_is_video) { | 237 if (idcin->next_chunk_is_video) { |
238 command = get_le32(pb); | 238 command = get_le32(pb); |
239 if (command == 2) { | 239 if (command == 2) { |
240 return -EIO; | 240 return -EIO; |
241 } else if (command == 1) { | 241 } else if (command == 1) { |
242 /* trigger a palette change */ | 242 /* trigger a palette change */ |
243 palette_control->palette_changed = 1; | 243 idcin->palctrl.palette_changed = 1; |
244 if (get_buffer(pb, palette_control->palette, 768) != 768) | 244 if (get_buffer(pb, palette_buffer, 768) != 768) |
245 return -EIO; | 245 return -EIO; |
246 /* scale the palette as necessary */ | 246 /* scale the palette as necessary */ |
247 palette_scale = 2; | 247 palette_scale = 2; |
248 for (i = 0; i < 768; i++) | 248 for (i = 0; i < 768; i++) |
249 if (palette_control->palette[i] > 63) { | 249 if (palette_buffer[i] > 63) { |
250 palette_scale = 0; | 250 palette_scale = 0; |
251 break; | 251 break; |
252 } | 252 } |
253 | 253 |
254 if (palette_scale) | 254 for (i = 0; i < 256; i++) { |
255 for (i = 0; i < 768; i++) | 255 r = palette_buffer[i * 3 ] << palette_scale; |
256 palette_control->palette[i] <<= palette_scale; | 256 g = palette_buffer[i * 3 + 1] << palette_scale; |
257 b = palette_buffer[i * 3 + 2] << palette_scale; | |
258 idcin->palctrl.palette[i] = (r << 16) | (g << 8) | (b); | |
259 } | |
257 } | 260 } |
258 | 261 |
259 chunk_size = get_le32(pb); | 262 chunk_size = get_le32(pb); |
260 /* skip the number of decoded bytes (always equal to width * height) */ | 263 /* skip the number of decoded bytes (always equal to width * height) */ |
261 url_fseek(pb, 4, SEEK_CUR); | 264 url_fseek(pb, 4, SEEK_CUR); |
291 return ret; | 294 return ret; |
292 } | 295 } |
293 | 296 |
294 static int idcin_read_close(AVFormatContext *s) | 297 static int idcin_read_close(AVFormatContext *s) |
295 { | 298 { |
299 | |
296 return 0; | 300 return 0; |
297 } | 301 } |
298 | 302 |
299 static AVInputFormat idcin_iformat = { | 303 static AVInputFormat idcin_iformat = { |
300 "idcin", | 304 "idcin", |