1 #include "colormodels.h"
2 #include "funcprotos.h"
4 #include "workarounds.h"
12 unsigned char *work_buffer;
13 } quicktime_v410_codec_t;
15 static void delete_codec(quicktime_video_map_t *vtrack)
17 quicktime_v410_codec_t *codec;
19 codec = ((quicktime_codec_t*)vtrack->codec)->priv;
20 if(codec->work_buffer) free(codec->work_buffer);
24 static int reads_colormodel(quicktime_t *file,
28 return (colormodel == BC_RGB888 ||
29 colormodel == BC_RGBA8888 ||
30 colormodel == BC_RGB161616 ||
31 colormodel == BC_RGBA16161616 ||
32 colormodel == BC_YUV888 ||
33 colormodel == BC_YUVA8888 ||
34 colormodel == BC_YUV161616 ||
35 colormodel == BC_YUVA16161616 ||
36 colormodel == BC_RGB8 ||
37 colormodel == BC_RGB565 ||
38 colormodel == BC_BGR888 ||
39 colormodel == BC_BGR8888);
42 static int writes_colormodel(quicktime_t *file,
46 return (colormodel == BC_RGB888 ||
47 colormodel == BC_RGBA8888 ||
48 colormodel == BC_RGB161616 ||
49 colormodel == BC_RGBA16161616 ||
50 colormodel == BC_YUV888 ||
51 colormodel == BC_YUVA8888 ||
52 colormodel == BC_YUV161616 ||
53 colormodel == BC_YUVA16161616);
69 static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
74 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
75 quicktime_v410_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
76 int width = vtrack->track->tkhd.track_width;
77 int height = vtrack->track->tkhd.track_height;
78 unsigned char **input_rows;
79 if(!codec->work_buffer)
80 codec->work_buffer = malloc(vtrack->track->tkhd.track_width *
81 vtrack->track->tkhd.track_height *
85 quicktime_set_video_position(file, vtrack->current_position, track);
86 bytes = quicktime_frame_size(file, vtrack->current_position, track);
87 result = !quicktime_read_data(file, (char*)codec->work_buffer, bytes);
91 input_rows = malloc(sizeof(unsigned char*) * height);
92 for(i = 0; i < height; i++)
93 input_rows[i] = codec->work_buffer + i * width * 4;
95 cmodel_transfer(row_pointers,
128 static int encode(quicktime_t *file, unsigned char **row_pointers, int track)
130 // int64_t offset = quicktime_position(file);
131 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
132 quicktime_v410_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
133 quicktime_trak_t *trak = vtrack->track;
134 int width = vtrack->track->tkhd.track_width;
135 int height = vtrack->track->tkhd.track_height;
136 int bytes = width * height * 4;
138 unsigned char **output_rows;
140 quicktime_atom_t chunk_atom;
141 if(!codec->work_buffer)
142 codec->work_buffer = malloc(vtrack->track->tkhd.track_width *
143 vtrack->track->tkhd.track_height *
147 output_rows = malloc(sizeof(unsigned char*) * height);
148 for(i = 0; i < height; i++)
149 output_rows[i] = codec->work_buffer + i * width * 4;
151 cmodel_transfer(output_rows,
173 quicktime_write_chunk_header(file, trak, &chunk_atom);
174 result = !quicktime_write_data(file, (char*)codec->work_buffer, bytes);
175 quicktime_write_chunk_footer(file, trak, vtrack->current_chunk, &chunk_atom, 1);
176 //printf("quicktime_encode_yv12 2\n");
177 vtrack->current_chunk++;
183 void quicktime_init_codec_v410(quicktime_video_map_t *vtrack)
185 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
187 /* Init public items */
188 codec_base->priv = calloc(1, sizeof(quicktime_v410_codec_t));
189 codec_base->delete_vcodec = delete_codec;
190 codec_base->decode_video = decode;
191 codec_base->encode_video = encode;
192 codec_base->decode_audio = 0;
193 codec_base->encode_audio = 0;
194 codec_base->reads_colormodel = reads_colormodel;
195 codec_base->writes_colormodel = writes_colormodel;
196 codec_base->fourcc = QUICKTIME_YUV444_10bit;
197 codec_base->title = "Component Y'CbCr 10-bit 4:4:4";
198 codec_base->desc = "Component Y'CbCr 10-bit 4:4:4";