00001 #include "colormodels.h"
00002 #include "funcprotos.h"
00003 #include "quicktime.h"
00004 #include "workarounds.h"
00005 #include "v408.h"
00006
00007 #include <stdint.h>
00008 #include <stdlib.h>
00009
00010 typedef struct
00011 {
00012 unsigned char *work_buffer;
00013 } quicktime_v408_codec_t;
00014
00015 static int delete_codec(quicktime_video_map_t *vtrack)
00016 {
00017 quicktime_v408_codec_t *codec;
00018
00019 codec = ((quicktime_codec_t*)vtrack->codec)->priv;
00020 if(codec->work_buffer) free(codec->work_buffer);
00021 free(codec);
00022 return 0;
00023 }
00024
00025 static int reads_colormodel(quicktime_t *file,
00026 int colormodel,
00027 int track)
00028 {
00029 return (colormodel == BC_RGB888 ||
00030 colormodel == BC_RGBA8888 ||
00031 colormodel == BC_RGB161616 ||
00032 colormodel == BC_RGBA16161616 ||
00033 colormodel == BC_YUV888 ||
00034 colormodel == BC_YUVA8888 ||
00035 colormodel == BC_YUV161616 ||
00036 colormodel == BC_YUVA16161616 ||
00037 colormodel == BC_RGB8 ||
00038 colormodel == BC_RGB565 ||
00039 colormodel == BC_BGR888 ||
00040 colormodel == BC_BGR8888);
00041 }
00042
00043 static int writes_colormodel(quicktime_t *file,
00044 int colormodel,
00045 int track)
00046 {
00047 return (colormodel == BC_RGB888 ||
00048 colormodel == BC_RGBA8888 ||
00049 colormodel == BC_RGB161616 ||
00050 colormodel == BC_RGBA16161616 ||
00051 colormodel == BC_YUV888 ||
00052 colormodel == BC_YUVA8888 ||
00053 colormodel == BC_YUV161616 ||
00054 colormodel == BC_YUVA16161616);
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
00071 {
00072 int i;
00073 int64_t bytes;
00074 int result = 0;
00075 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
00076 quicktime_v408_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
00077 int width = vtrack->track->tkhd.track_width;
00078 int height = vtrack->track->tkhd.track_height;
00079 unsigned char **input_rows;
00080 if(!codec->work_buffer)
00081 codec->work_buffer = malloc(vtrack->track->tkhd.track_width *
00082 vtrack->track->tkhd.track_height *
00083 4);
00084
00085
00086 quicktime_set_video_position(file, vtrack->current_position, track);
00087 bytes = quicktime_frame_size(file, vtrack->current_position, track);
00088 result = !quicktime_read_data(file, codec->work_buffer, bytes);
00089
00090
00091
00092 input_rows = malloc(sizeof(unsigned char*) * height);
00093 for(i = 0; i < height; i++)
00094 input_rows[i] = codec->work_buffer + i * width * 4;
00095
00096 cmodel_transfer(row_pointers,
00097 input_rows,
00098 row_pointers[0],
00099 row_pointers[1],
00100 row_pointers[2],
00101 0,
00102 0,
00103 0,
00104 file->in_x,
00105 file->in_y,
00106 file->in_w,
00107 file->in_h,
00108 0,
00109 0,
00110 file->out_w,
00111 file->out_h,
00112 BC_UYVA8888,
00113 file->color_model,
00114 0,
00115 width,
00116 file->out_w);
00117
00118 free(input_rows);
00119
00120 return result;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129 static int encode(quicktime_t *file, unsigned char **row_pointers, int track)
00130 {
00131 int64_t offset = quicktime_position(file);
00132 quicktime_video_map_t *vtrack = &(file->vtracks[track]);
00133 quicktime_v408_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
00134 quicktime_trak_t *trak = vtrack->track;
00135 int width = vtrack->track->tkhd.track_width;
00136 int height = vtrack->track->tkhd.track_height;
00137 int bytes = width * height * 4;
00138 int result = 0;
00139 unsigned char **output_rows;
00140 int i;
00141 quicktime_atom_t chunk_atom;
00142 if(!codec->work_buffer)
00143 codec->work_buffer = malloc(vtrack->track->tkhd.track_width *
00144 vtrack->track->tkhd.track_height *
00145 4);
00146
00147
00148 output_rows = malloc(sizeof(unsigned char*) * height);
00149 for(i = 0; i < height; i++)
00150 output_rows[i] = codec->work_buffer + i * width * 4;
00151
00152 cmodel_transfer(output_rows,
00153 row_pointers,
00154 0,
00155 0,
00156 0,
00157 row_pointers[0],
00158 row_pointers[1],
00159 row_pointers[2],
00160 0,
00161 0,
00162 width,
00163 height,
00164 0,
00165 0,
00166 width,
00167 height,
00168 file->color_model,
00169 BC_UYVA8888,
00170 0,
00171 width,
00172 width);
00173
00174 quicktime_write_chunk_header(file, trak, &chunk_atom);
00175 result = !quicktime_write_data(file, codec->work_buffer, bytes);
00176 quicktime_write_chunk_footer(file,
00177 trak,
00178 vtrack->current_chunk,
00179 &chunk_atom,
00180 1);
00181
00182 vtrack->current_chunk++;
00183
00184 free(output_rows);
00185 return result;
00186 }
00187
00188 void quicktime_init_codec_v408(quicktime_video_map_t *vtrack)
00189 {
00190 quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
00191
00192
00193 codec_base->priv = calloc(1, sizeof(quicktime_v408_codec_t));
00194 codec_base->delete_vcodec = delete_codec;
00195 codec_base->decode_video = decode;
00196 codec_base->encode_video = encode;
00197 codec_base->decode_audio = 0;
00198 codec_base->encode_audio = 0;
00199 codec_base->reads_colormodel = reads_colormodel;
00200 codec_base->writes_colormodel = writes_colormodel;
00201 codec_base->fourcc = QUICKTIME_YUVA4444;
00202 codec_base->title = "Component Y'CbCrA 8-bit 4:4:4:4";
00203 codec_base->desc = "Component Y'CbCrA 8-bit 4:4:4:4";
00204 }
00205