1 #include "funcprotos.h"
17 static int is_keyframe(quicktime_trak_t *trak, int frame)
20 quicktime_stss_t *stss = &trak->mdia.minf.stbl.stss;
22 for(i = 0; i < stss->total_entries; i++)
24 if(stss->table[i].sample == frame) return 1;
30 void quicktime_delete_idx1(quicktime_idx1_t *idx1)
32 if(idx1->table) free(idx1->table);
35 void quicktime_read_idx1(quicktime_t *file,
36 quicktime_riff_t *riff,
37 quicktime_atom_t *parent_atom)
40 quicktime_idx1_t *idx1 = &riff->idx1;
42 //printf("quicktime_read_idx1 1 %llx\n", quicktime_position(file));
45 idx1->table_size = (parent_atom->end - quicktime_position(file)) / 16;
46 idx1->table_allocation = idx1->table_size;
47 idx1->table = calloc(sizeof(quicktime_idx1table_t), idx1->table_size);
48 //printf("quicktime_read_idx1 10\n");
50 // Store it in idx1 table now.
51 // Wait for full ix table discovery before converting to stco.
52 for(i = 0; i < idx1->table_size; i++)
54 quicktime_idx1table_t *idx1table = idx1->table + i;
56 quicktime_read_data(file, idx1table->tag, 4);
57 idx1table->flags = quicktime_read_int32_le(file);
58 idx1table->offset = quicktime_read_int32_le(file);
59 idx1table->size = quicktime_read_int32_le(file);
62 //printf("quicktime_read_idx1 100\n");
65 void quicktime_write_idx1(quicktime_t *file,
66 quicktime_idx1_t *idx1)
69 quicktime_idx1table_t *table = idx1->table;
70 int table_size = idx1->table_size;
75 quicktime_atom_write_header(file, &idx1->atom, "idx1");
77 for(i = 0; i < table_size; i++)
79 quicktime_idx1table_t *entry = &table[i];
80 quicktime_write_char32(file, entry->tag);
81 quicktime_write_int32_le(file, entry->flags);
82 quicktime_write_int32_le(file, entry->offset);
83 quicktime_write_int32_le(file, entry->size);
87 quicktime_atom_write_footer(file, &idx1->atom);
90 void quicktime_set_idx1_keyframe(quicktime_t *file,
91 quicktime_trak_t *trak,
94 quicktime_riff_t *riff = file->riff[0];
95 quicktime_hdrl_t *hdrl = &riff->hdrl;
96 quicktime_strl_t *strl = hdrl->strl[trak->tkhd.track_id - 1];
97 char *tag = strl->tag;
98 quicktime_idx1_t *idx1 = &riff->idx1;
102 // Search through entire index for right numbered tag.
103 // Since all the tracks are combined in the same index, this is unavoidable.
104 for(i = 0; i < idx1->table_size; i++)
106 quicktime_idx1table_t *idx1_table = &idx1->table[i];
107 if(!memcmp(idx1_table->tag, tag, 4))
110 if(counter == new_keyframe)
112 idx1_table->flags |= AVI_KEYFRAME;
119 void quicktime_update_idx1table(quicktime_t *file,
120 quicktime_trak_t *trak,
124 quicktime_riff_t *riff = file->riff[0];
125 quicktime_hdrl_t *hdrl = &riff->hdrl;
126 quicktime_strl_t *strl = hdrl->strl[trak->tkhd.track_id - 1];
127 char *tag = strl->tag;
128 quicktime_idx1_t *idx1 = &riff->idx1;
129 quicktime_movi_t *movi = &riff->movi;
130 quicktime_idx1table_t *idx1_table;
131 quicktime_stss_t *stss = &trak->mdia.minf.stbl.stss;
134 int keyframe_frame = idx1->table_size + 1;
136 // Set flag for keyframe
137 for(i = stss->total_entries - 1; i >= 0; i--)
139 if(stss->table[i].sample == keyframe_frame)
141 flags |= AVI_KEYFRAME;
145 if(stss->table[i].sample < keyframe_frame)
153 if(idx1->table_size >= idx1->table_allocation)
155 quicktime_idx1table_t *old_table = idx1->table;
156 int new_allocation = idx1->table_allocation * 2;
157 if(new_allocation < 1) new_allocation = 1;
158 idx1->table = calloc(1, sizeof(quicktime_idx1table_t) * new_allocation);
161 memcpy(idx1->table, old_table, sizeof(quicktime_idx1table_t) * idx1->table_size);
164 idx1->table_allocation = new_allocation;
169 idx1_table = &idx1->table[idx1->table_size];
170 memcpy(idx1_table->tag, tag, 4);
171 idx1_table->flags = flags;
172 idx1_table->offset = offset - 8 - movi->atom.start;
173 idx1_table->size = size;