initial commit
[goodguy/history.git] / cinelerra-5.0 / quicktime / stsd.c
1 #include "funcprotos.h"
2 #include "quicktime.h"
3
4
5 void quicktime_stsd_init(quicktime_stsd_t *stsd)
6 {
7         stsd->version = 0;
8         stsd->flags = 0;
9         stsd->total_entries = 0;
10 }
11
12 void quicktime_stsd_init_table(quicktime_stsd_t *stsd)
13 {
14         if(!stsd->total_entries)
15         {
16                 stsd->total_entries = 1;
17                 stsd->table = (quicktime_stsd_table_t*)calloc(1, sizeof(quicktime_stsd_table_t) * stsd->total_entries);
18                 quicktime_stsd_table_init(&(stsd->table[0]));
19         }
20 }
21
22 void quicktime_stsd_init_video(quicktime_t *file, 
23                                                                 quicktime_stsd_t *stsd, 
24                                                                 int frame_w,
25                                                                 int frame_h, 
26                                                                 float frame_rate,
27                                                                 char *compression)
28 {
29         quicktime_stsd_table_t *table;
30         quicktime_stsd_init_table(stsd);
31 //printf("quicktime_stsd_init_video 1\n");
32         table = &(stsd->table[0]);
33 //printf("quicktime_stsd_init_video 1\n");
34
35         quicktime_copy_char32(table->format, compression);
36 //printf("quicktime_stsd_init_video 1\n");
37         table->width = frame_w;
38 //printf("quicktime_stsd_init_video 1\n");
39         table->height = frame_h;
40 //printf("quicktime_stsd_init_video 1\n");
41         table->frames_per_sample = 1;
42 //printf("quicktime_stsd_init_video 1\n");
43         table->depth = 24;
44 //printf("quicktime_stsd_init_video 1\n");
45         table->ctab_id = 65535;
46 //printf("quicktime_stsd_init_video 2\n");
47 }
48
49 void quicktime_stsd_init_audio(quicktime_t *file, 
50                                                         quicktime_stsd_t *stsd, 
51                                                         int channels,
52                                                         int sample_rate, 
53                                                         int bits, 
54                                                         char *compressor)
55 {
56         quicktime_stsd_table_t *table;
57         quicktime_stsd_init_table(stsd);
58         table = &(stsd->table[0]);
59
60         quicktime_copy_char32(table->format, compressor);
61         table->channels = channels;
62         table->sample_size = bits;
63         table->sample_rate = sample_rate;
64 }
65
66 void quicktime_stsd_delete(quicktime_stsd_t *stsd)
67 {
68         int i;
69         if(stsd->total_entries)
70         {
71                 for(i = 0; i < stsd->total_entries; i++)
72                         quicktime_stsd_table_delete(&(stsd->table[i]));
73                 free(stsd->table);
74         }
75
76         stsd->total_entries = 0;
77 }
78
79 void quicktime_stsd_dump(void *minf_ptr, quicktime_stsd_t *stsd)
80 {
81         int i;
82         printf("     sample description\n");
83         printf("      version %d\n", stsd->version);
84         printf("      flags %ld\n", stsd->flags);
85         printf("      total_entries %ld\n", stsd->total_entries);
86         
87         for(i = 0; i < stsd->total_entries; i++)
88         {
89                 quicktime_stsd_table_dump(minf_ptr, &(stsd->table[i]));
90         }
91 }
92
93 void quicktime_read_stsd(quicktime_t *file, quicktime_minf_t *minf, quicktime_stsd_t *stsd)
94 {
95         int i;
96
97         stsd->version = quicktime_read_char(file);
98         stsd->flags = quicktime_read_int24(file);
99         stsd->total_entries = quicktime_read_int32(file);
100         stsd->table = (quicktime_stsd_table_t*)calloc(1, sizeof(quicktime_stsd_table_t) * stsd->total_entries);
101         for(i = 0; i < stsd->total_entries; i++)
102         {
103                 quicktime_stsd_table_init(&(stsd->table[i]));
104 //              quicktime_read_stsd_table(file, minf, &(stsd->table[i]));
105                 quicktime_read_stsd_table(file, minf, &(stsd->table[0]));
106         }
107 }
108
109 void quicktime_write_stsd(quicktime_t *file, quicktime_minf_t *minf, quicktime_stsd_t *stsd)
110 {
111         quicktime_atom_t atom;
112         int i;
113         quicktime_atom_write_header(file, &atom, "stsd");
114
115         quicktime_write_char(file, stsd->version);
116         quicktime_write_int24(file, stsd->flags);
117         quicktime_write_int32(file, stsd->total_entries);
118         for(i = 0; i < stsd->total_entries; i++)
119         {
120                 quicktime_write_stsd_table(file, minf, stsd->table);
121         }
122
123         quicktime_atom_write_footer(file, &atom);
124 }
125
126
127