allow ffmpeg video to resample curr_pos, add bluray format
[goodguy/history.git] / cinelerra-5.0 / quicktime / v308.c
1 #include "colormodels.h"
2 #include "funcprotos.h"
3 #include "quicktime.h"
4 #include "workarounds.h"
5 #include "v308.h"
6
7 #include <stdint.h>
8 #include <stdlib.h>
9
10
11 typedef struct
12 {
13         unsigned char *work_buffer;
14 } quicktime_v308_codec_t;
15
16 static void delete_codec(quicktime_video_map_t *vtrack)
17 {
18         quicktime_v308_codec_t *codec;
19
20         codec = ((quicktime_codec_t*)vtrack->codec)->priv;
21         if(codec->work_buffer) free(codec->work_buffer);
22         free(codec);
23 }
24
25 static int reads_colormodel(quicktime_t *file, 
26                 int colormodel, 
27                 int track)
28 {
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);
43 }
44
45 static int writes_colormodel(quicktime_t *file, 
46                 int colormodel, 
47                 int track)
48 {
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);
59 }
60
61
62 static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
63 {
64         unsigned char *data, **input_rows;
65         int i, row_size, result;
66         quicktime_video_map_t *vtrack = &(file->vtracks[track]);
67         quicktime_v308_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 * 3;
71         if(!codec->work_buffer)
72                 codec->work_buffer = (unsigned char *)malloc(bytes);
73         data = codec->work_buffer;
74
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);
78
79         input_rows = (unsigned char **)malloc(sizeof(*input_rows) * height);
80         row_size = 3 * width;
81         for( i=0; i<height; ++i ) input_rows[i] = data + i*row_size;
82
83         cmodel_transfer(row_pointers, input_rows,
84                 row_pointers[0], row_pointers[1], row_pointers[2],
85                 0, 0, 0,
86                 file->in_x, file->in_y, file->in_w, file->in_h,
87                 0, 0, file->out_w, file->out_h,
88                 BC_VYU888, file->color_model,
89                 0, width, file->out_w);
90
91         free(input_rows);
92         return result;
93 }
94
95
96 static int encode(quicktime_t *file, unsigned char **row_pointers, int track)
97 {
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_v308_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 * 3;
108         if(!codec->work_buffer)
109                 codec->work_buffer = (unsigned char *)malloc(bytes);
110         data = codec->work_buffer;
111
112         output_rows = (unsigned char **)malloc(sizeof(*output_rows) * height);
113         row_size = 3 * width;
114         for( i=0; i<height; ++i ) output_rows[i] = data + i*row_size;
115
116         cmodel_transfer(output_rows, row_pointers,
117                 0, 0, 0,
118                 row_pointers[0], row_pointers[1], row_pointers[2],
119                 0, 0, width, height,
120                 0, 0, width, height,
121                 file->color_model, BC_VYU888, 
122                 0, width, width);
123
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++;
128         
129         free(output_rows);
130         return result;
131 }
132
133 void quicktime_init_codec_v308(quicktime_video_map_t *vtrack)
134 {
135         quicktime_codec_t *codec_base = (quicktime_codec_t*)vtrack->codec;
136
137 /* Init public items */
138         codec_base->priv = calloc(1, sizeof(quicktime_v308_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_YUV444;
147         codec_base->title = "Component Y'CbCr 8-bit 4:4:4";
148         codec_base->desc = "Component Y'CbCr 8-bit 4:4:4";
149 }
150