1 #include "colormodels.h"
2 #include "funcprotos.h"
4 #include "workarounds.h"
13 unsigned char *work_buffer;
14 } quicktime_v408_codec_t;
16 static void delete_codec(quicktime_video_map_t *vtrack)
18 quicktime_v408_codec_t *codec;
20 codec = ((quicktime_codec_t*)vtrack->codec)->priv;
21 if(codec->work_buffer) free(codec->work_buffer);
25 static int reads_colormodel(quicktime_t *file,
29 return (colormodel == BC_RGB888 ||
30 colormodel == BC_RGB_FLOAT ||
31 colormodel == BC_RGBA_FLOAT ||
32 colormodel == BC_RGBA8888 ||
33 colormodel == BC_RGB161616 ||
34 colormodel == BC_RGBA16161616 ||
35 colormodel == BC_YUV888 ||
36 colormodel == BC_YUVA8888 ||
37 colormodel == BC_YUV161616 ||
38 colormodel == BC_YUVA16161616 ||
39 colormodel == BC_RGB8 ||
40 colormodel == BC_RGB565 ||
41 colormodel == BC_BGR888 ||
42 colormodel == BC_BGR8888);
45 static int writes_colormodel(quicktime_t *file,
49 return (colormodel == BC_RGB888 ||
50 colormodel == BC_RGB_FLOAT ||
51 colormodel == BC_RGBA_FLOAT ||
52 colormodel == BC_RGBA8888 ||
53 colormodel == BC_RGB161616 ||
54 colormodel == BC_RGBA16161616 ||
55 colormodel == BC_YUV888 ||
56 colormodel == BC_YUVA8888 ||
57 colormodel == BC_YUV161616 ||
58 colormodel == BC_YUVA16161616);
62 static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
64 unsigned char *data, **input_rows;
65 int i, row_size, result;
66 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
67 quicktime_v408_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
68 int width = vtrack->track->tkhd.track_width;
69 int height = vtrack->track->tkhd.track_height;
70 int sz = width * height, bytes = sz * 4;
71 if(!codec->work_buffer)
72 codec->work_buffer = (unsigned char *)malloc(bytes);
73 data = codec->work_buffer;
75 quicktime_set_video_position(file, vtrack->current_position, track);
76 bytes = quicktime_frame_size(file, vtrack->current_position, track);
77 result = !quicktime_read_data(file, (char*)codec->work_buffer, bytes);
79 input_rows = (unsigned char **)malloc(sizeof(*input_rows) * height);
81 for( i=0; i<height; ++i ) input_rows[i] = data + i*row_size;
83 cmodel_transfer(row_pointers, input_rows,
84 row_pointers[0], row_pointers[1], row_pointers[2],
86 file->in_x, file->in_y, file->in_w, file->in_h,
87 0, 0, file->out_w, file->out_h,
88 BC_UYVA8888, file->color_model,
89 0, width, file->out_w);
96 static int encode(quicktime_t *file, unsigned char **row_pointers, int track)
98 // int64_t offset = quicktime_position(file);
99 unsigned char *data, **output_rows;
100 int i, row_size, result;
101 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
102 quicktime_v408_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
103 quicktime_trak_t *trak = vtrack->track;
104 quicktime_atom_t chunk_atom;
105 int width = vtrack->track->tkhd.track_width;
106 int height = vtrack->track->tkhd.track_height;
107 int sz = width * height, bytes = sz * 4;
108 if(!codec->work_buffer)
109 codec->work_buffer = (unsigned char *)malloc(bytes);
110 data = codec->work_buffer;
112 output_rows = (unsigned char **)malloc(sizeof(*output_rows) * height);
113 row_size = 4 * width;
114 for( i=0; i<height; ++i ) output_rows[i] = data + i*row_size;
116 cmodel_transfer(output_rows, row_pointers,
118 row_pointers[0], row_pointers[1], row_pointers[2],
121 file->color_model, BC_UYVA8888,
124 quicktime_write_chunk_header(file, trak, &chunk_atom);
125 result = !quicktime_write_data(file, (char*)codec->work_buffer, bytes);
126 quicktime_write_chunk_footer(file, trak, vtrack->current_chunk, &chunk_atom, 1);
127 vtrack->current_chunk++;
133 void quicktime_init_codec_v408(quicktime_video_map_t *vtrack)
135 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
137 /* Init public items */
138 codec_base->priv = calloc(1, sizeof(quicktime_v408_codec_t));
139 codec_base->delete_vcodec = delete_codec;
140 codec_base->decode_video = decode;
141 codec_base->encode_video = encode;
142 codec_base->decode_audio = 0;
143 codec_base->encode_audio = 0;
144 codec_base->reads_colormodel = reads_colormodel;
145 codec_base->writes_colormodel = writes_colormodel;
146 codec_base->fourcc = QUICKTIME_YUVA4444;
147 codec_base->title = "Component Y'CbCr 8-bit 4:4:4:4";
148 codec_base->desc = "Component Y'CbCr 8-bit 4:4:4:4";