3 #include "colormodels.h"
4 #include "funcprotos.h"
10 unsigned char *work_buffer;
12 unsigned char *output_temp;
13 } quicktime_rle_codec_t;
16 static void delete_codec(quicktime_video_map_t *vtrack)
18 quicktime_rle_codec_t *codec;
19 codec = ((quicktime_codec_t*)vtrack->codec)->priv;
20 if(codec->work_buffer) free(codec->work_buffer);
21 if(codec->output_temp) free(codec->output_temp);
25 static int reads_colormodel(quicktime_t *file,
29 return (colormodel == BC_RGB888);
32 static int source_cmodel(quicktime_t *file, int track)
34 int depth = quicktime_video_depth(file, track);
43 static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
45 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
46 quicktime_trak_t *trak = vtrack->track;
47 quicktime_rle_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
48 int depth = quicktime_video_depth(file, track);
49 int width = trak->tkhd.track_width;
50 int height = trak->tkhd.track_height;
58 unsigned char *row_ptr;
60 unsigned char *buffer_end;
64 unsigned char **temp_rows = malloc(sizeof(unsigned char*) * height);
65 int cmodel = source_cmodel(file, track);
68 quicktime_set_video_position(file, vtrack->current_position, track);
69 size = quicktime_frame_size(file, vtrack->current_position, track);
70 row_bytes = depth / 8 * width;
71 pixel_size = depth / 8;
73 if(size <= 8) return 0;
74 if(codec->buffer_size < size && codec->work_buffer)
76 free(codec->work_buffer);
77 codec->work_buffer = 0;
79 if(!codec->work_buffer)
81 codec->work_buffer = malloc(size);
82 codec->buffer_size = size;
85 quicktime_read_data(file, (char*)codec->work_buffer, size);
86 ptr = codec->work_buffer;
87 buffer_end = ptr + size;
93 header = (ptr[0] << 8) | ptr[1];
99 start_line = (ptr[0] << 8) | ptr[1];
101 total_lines = (ptr[0] << 8) | ptr[1];
108 total_lines = height;
112 if(cmodel != file->color_model ||
115 file->in_w != width ||
116 file->in_h != height ||
117 file->out_w != width ||
118 file->out_h != height)
123 if(!codec->output_temp)
124 codec->output_temp = calloc(1, height * row_bytes);
125 row_ptr = codec->output_temp + start_line * row_bytes;
126 for(i = 0; i < height; i++)
127 temp_rows[i] = codec->output_temp + i * row_bytes;
131 row_ptr = row_pointers[start_line];
132 for(i = 0; i < height; i++)
133 temp_rows[i] = row_pointers[i];
142 pixel = row_ptr + (skip - 1) * pixel_size;
144 while(ptr < buffer_end &&
145 (code = (char)*ptr++) != -1)
150 pixel += (*ptr++ - 1) * pixel_size;
153 // Run length encoded
180 row_ptr += row_bytes;
188 cmodel_transfer(row_pointers,
218 void quicktime_init_codec_rle(quicktime_video_map_t *vtrack)
220 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
221 // quicktime_rle_codec_t *codec = (quicktime_rle_codec_t*)codec_base->priv;
222 codec_base->priv = calloc(1, sizeof(quicktime_rle_codec_t));
223 codec_base->delete_vcodec = delete_codec;
224 codec_base->decode_video = decode;
225 codec_base->reads_colormodel = reads_colormodel;
226 codec_base->fourcc = QUICKTIME_RLE;
227 codec_base->title = "RLE";
228 codec_base->desc = "Run length encoding";