initial commit
[goodguy/history.git] / cinelerra-5.0 / quicktime / v410.c
1 #include "colormodels.h"
2 #include "funcprotos.h"
3 #include "quicktime.h"
4 #include "workarounds.h"
5 #include "v410.h"
6
7 #include <stdint.h>
8 #include <stdlib.h>
9
10 typedef struct
11 {
12         unsigned char *work_buffer;
13 } quicktime_v410_codec_t;
14
15 static void delete_codec(quicktime_video_map_t *vtrack)
16 {
17         quicktime_v410_codec_t *codec;
18
19         codec = ((quicktime_codec_t*)vtrack->codec)->priv;
20         if(codec->work_buffer) free(codec->work_buffer);
21         free(codec);
22 }
23
24 static int reads_colormodel(quicktime_t *file, 
25                 int colormodel, 
26                 int track)
27 {
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);
40 }
41
42 static int writes_colormodel(quicktime_t *file, 
43                 int colormodel, 
44                 int track)
45 {
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);
54 }
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
70 {
71         int i;
72         int64_t bytes;
73         int result = 0;
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 *
82                         4);
83
84
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);
88
89
90
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;
94
95         cmodel_transfer(row_pointers, 
96                 input_rows,
97                 row_pointers[0],
98                 row_pointers[1],
99                 row_pointers[2],
100                 0,
101                 0,
102                 0,
103                 file->in_x, 
104                 file->in_y, 
105                 file->in_w, 
106                 file->in_h,
107                 0, 
108                 0, 
109                 file->out_w, 
110                 file->out_h,
111                 BC_YUV101010, 
112                 file->color_model,
113                 0,
114                 width,
115                 file->out_w);
116
117         free(input_rows);
118
119         return result;
120 }
121
122
123
124
125
126
127
128 static int encode(quicktime_t *file, unsigned char **row_pointers, int track)
129 {
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;
137         int result = 0;
138         unsigned char **output_rows;
139         int i;
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 *
144                         4);
145
146
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;
150
151         cmodel_transfer(output_rows, 
152                 row_pointers,
153                 0,
154                 0,
155                 0,
156                 row_pointers[0],
157                 row_pointers[1],
158                 row_pointers[2],
159                 0, 
160                 0, 
161                 width, 
162                 height,
163                 0, 
164                 0, 
165                 width, 
166                 height,
167                 file->color_model,
168                 BC_YUV101010, 
169                 0,
170                 width,
171                 width);
172
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++;
178         
179         free(output_rows);
180         return result;
181 }
182
183 void quicktime_init_codec_v410(quicktime_video_map_t *vtrack)
184 {
185         quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
186
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";
199 }
200