1 #include "funcprotos.h"
6 void quicktime_stts_init(quicktime_stts_t *stts)
10 stts->total_entries = 0;
13 void quicktime_stts_init_table(quicktime_stts_t *stts)
15 if(!stts->total_entries)
17 stts->total_entries = 1;
18 stts->table = (quicktime_stts_table_t*)malloc(sizeof(quicktime_stts_table_t) * stts->total_entries);
22 void quicktime_stts_init_video(quicktime_t *file, quicktime_stts_t *stts, int time_scale, float frame_rate)
24 quicktime_stts_table_t *table;
25 quicktime_stts_init_table(stts);
26 table = &(stts->table[0]);
28 table->sample_count = 0; /* need to set this when closing */
29 table->sample_duration = time_scale / frame_rate;
30 //printf("quicktime_stts_init_video %d %f\n", time_scale, frame_rate);
33 void quicktime_stts_init_audio(quicktime_t *file, quicktime_stts_t *stts, int sample_rate)
35 quicktime_stts_table_t *table;
36 quicktime_stts_init_table(stts);
37 table = &(stts->table[0]);
39 table->sample_count = 0; /* need to set this when closing */
40 table->sample_duration = 1;
43 void quicktime_stts_append_audio(quicktime_t *file,
44 quicktime_stts_t *stts,
47 quicktime_stts_table_t *table;
48 if(stts->total_entries)
49 table = &(stts->table[stts->total_entries - 1]);
55 // Expand existing entry
56 if(table && table->sample_count)
58 if(table->sample_duration == sample_duration)
60 table->sample_count++;
65 // Override existing entry
66 if(table && table->sample_count == 0)
68 table->sample_duration = sample_duration;
69 table->sample_count = 1;
74 stts->total_entries++;
75 stts->table = realloc(stts->table,
76 sizeof(quicktime_stts_table_t) * stts->total_entries);
77 table = &(stts->table[stts->total_entries - 1]);
78 table->sample_duration = sample_duration;
79 table->sample_count = 1;
83 int64_t quicktime_stts_total_samples(quicktime_t *file,
84 quicktime_stts_t *stts)
88 for(i = 0; i < stts->total_entries; i++)
90 result += stts->table[i].sample_count;
96 void quicktime_stts_delete(quicktime_stts_t *stts)
98 if(stts->total_entries) free(stts->table);
99 stts->total_entries = 0;
102 void quicktime_stts_dump(quicktime_stts_t *stts)
105 printf(" time to sample\n");
106 printf(" version %d\n", stts->version);
107 printf(" flags %ld\n", stts->flags);
108 printf(" total_entries %ld\n", stts->total_entries);
109 for(i = 0; i < stts->total_entries; i++)
111 printf(" count %ld duration %ld\n",
112 stts->table[i].sample_count, stts->table[i].sample_duration);
116 void quicktime_read_stts(quicktime_t *file, quicktime_stts_t *stts)
119 stts->version = quicktime_read_char(file);
120 stts->flags = quicktime_read_int24(file);
121 stts->total_entries = quicktime_read_int32(file);
123 stts->table = (quicktime_stts_table_t*)malloc(sizeof(quicktime_stts_table_t) * stts->total_entries);
124 for(i = 0; i < stts->total_entries; i++)
126 stts->table[i].sample_count = quicktime_read_int32(file);
127 stts->table[i].sample_duration = quicktime_read_int32(file);
131 void quicktime_write_stts(quicktime_t *file, quicktime_stts_t *stts)
134 quicktime_atom_t atom;
135 quicktime_atom_write_header(file, &atom, "stts");
137 quicktime_write_char(file, stts->version);
138 quicktime_write_int24(file, stts->flags);
139 quicktime_write_int32(file, stts->total_entries);
140 for(i = 0; i < stts->total_entries; i++)
142 quicktime_write_int32(file, stts->table[i].sample_count);
143 quicktime_write_int32(file, stts->table[i].sample_duration);
146 quicktime_atom_write_footer(file, &atom);
149 // Return the sample which contains the start_time argument.
150 // Stores the actual starting time of the sample in the start_time argument.
151 int quicktime_time_to_sample(quicktime_stts_t *stts, int64_t *start_time)
153 int64_t cur_time = 0, stime = *start_time;
154 int i = 0, entries = stts->total_entries, result = 0;
155 quicktime_stts_table_t *stts_table = &stts->table[0];
157 while( i < entries ) {
158 int64_t count = stts_table->sample_count;
159 int64_t end_time = cur_time + count * stts_table->sample_duration;
160 if( end_time > stime ) break;
170 stime = (stime - cur_time) / stts_table->sample_duration;
172 *start_time = cur_time + stime * stts_table->sample_duration;
176 int64_t quicktime_chunk_to_samples(quicktime_stts_t *stts, long chunk)
178 int64_t cur_time = 0; long chunks = 0;
179 int i = 0, entries = stts->total_entries;
180 quicktime_stts_table_t *stts_table = &stts->table[0];
182 while( i < entries ) {
183 int64_t count = stts_table->sample_count;
184 int64_t end_time = cur_time + count * stts_table->sample_duration;
185 long end_chunk = chunks + count;
186 if( end_chunk > chunk ) break;
192 if( i >= entries ) return cur_time;
194 return cur_time + (chunk - chunks) * stts_table->sample_duration;