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",