00001 #include "funcprotos.h"
00002 #include "quicktime.h"
00003 #include <string.h>
00004
00005
00006 void quicktime_delete_indx(quicktime_indx_t *indx)
00007 {
00008 int i;
00009 if(indx->table)
00010 {
00011 for(i = 0; i < indx->table_size; i++)
00012 {
00013 quicktime_indxtable_t *indx_table = &indx->table[i];
00014 if(indx_table->ix) quicktime_delete_ix(indx_table->ix);
00015 }
00016 free(indx->table);
00017 }
00018 }
00019
00020 void quicktime_init_indx(quicktime_t *file,
00021 quicktime_indx_t *indx,
00022 quicktime_strl_t *strl)
00023 {
00024 indx->longs_per_entry = 4;
00025 indx->index_subtype = 0;
00026 indx->index_type = AVI_INDEX_OF_INDEXES;
00027 memcpy(indx->chunk_id, strl->tag, 4);
00028 }
00029
00030 void quicktime_update_indx(quicktime_t *file,
00031 quicktime_indx_t *indx,
00032 quicktime_ix_t *ix)
00033 {
00034 quicktime_indxtable_t *indx_table;
00035
00036
00037 if(indx->table_size >= indx->table_allocation)
00038 {
00039 quicktime_indxtable_t *old_table = indx->table;
00040 int new_allocation = indx->table_allocation * 2;
00041 if(new_allocation < 1) new_allocation = 1;
00042 indx->table = calloc(1, sizeof(quicktime_indxtable_t) * new_allocation);
00043 if(old_table)
00044 {
00045 memcpy(indx->table, old_table, sizeof(quicktime_indxtable_t) * indx->table_size);
00046 free(old_table);
00047 }
00048 indx->table_allocation = new_allocation;
00049 }
00050
00051
00052 indx_table = &indx->table[indx->table_size++];
00053 indx_table->index_offset = ix->atom.start - 8;
00054 indx_table->index_size = ix->atom.size;
00055 indx_table->duration = ix->table_size;
00056 }
00057
00058
00059
00060 void quicktime_finalize_indx(quicktime_t *file)
00061 {
00062 int i, j;
00063 quicktime_riff_t *riff = file->riff[0];
00064 quicktime_hdrl_t *hdrl = &riff->hdrl;
00065 quicktime_strl_t *strl;
00066 quicktime_indx_t *indx;
00067 quicktime_atom_t junk_atom;
00068 int junk_size;
00069
00070
00071 for(i = 0; i < file->moov.total_tracks; i++)
00072 {
00073 strl = hdrl->strl[i];
00074 indx = &strl->indx;
00075
00076
00077 quicktime_set_position(file, strl->indx_offset);
00078 quicktime_atom_write_header(file, &indx->atom, "indx");
00079
00080 quicktime_write_int16_le(file, indx->longs_per_entry);
00081
00082 quicktime_write_char(file, indx->index_subtype);
00083
00084 quicktime_write_char(file, indx->index_type);
00085
00086 quicktime_write_int32_le(file, indx->table_size);
00087
00088 quicktime_write_char32(file, indx->chunk_id);
00089
00090 quicktime_write_int32_le(file, 0);
00091 quicktime_write_int32_le(file, 0);
00092 quicktime_write_int32_le(file, 0);
00093
00094
00095 for(j = 0; j < indx->table_size; j++)
00096 {
00097 quicktime_indxtable_t *indx_table = &indx->table[j];
00098 quicktime_write_int64_le(file, indx_table->index_offset);
00099 quicktime_write_int32_le(file, indx_table->index_size);
00100 quicktime_write_int32_le(file, indx_table->duration);
00101 }
00102
00103 quicktime_atom_write_footer(file, &indx->atom);
00104
00105
00106
00107
00108 junk_size = strl->padding_size - indx->atom.size - 8;
00109 quicktime_atom_write_header(file, &junk_atom, "JUNK");
00110 for(j = 0; j < junk_size; j += 4)
00111 quicktime_write_int32_le(file, 0);
00112 quicktime_atom_write_footer(file, &junk_atom);
00113
00114 }
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 void quicktime_read_indx(quicktime_t *file,
00126 quicktime_strl_t *strl,
00127 quicktime_atom_t *parent_atom)
00128 {
00129 quicktime_indx_t *indx = &strl->indx;
00130 quicktime_indxtable_t *indx_table;
00131 quicktime_ix_t *ix;
00132 int i;
00133 int64_t offset;
00134
00135 indx->longs_per_entry = quicktime_read_int16_le(file);
00136 indx->index_subtype = quicktime_read_char(file);
00137 indx->index_type = quicktime_read_char(file);
00138 indx->table_size = quicktime_read_int32_le(file);
00139 quicktime_read_char32(file, indx->chunk_id);
00140 quicktime_read_int32_le(file);
00141 quicktime_read_int32_le(file);
00142 quicktime_read_int32_le(file);
00143
00144
00145
00146
00147 indx->table = calloc(indx->table_size, sizeof(quicktime_indxtable_t));
00148 for(i = 0; i < indx->table_size; i++)
00149 {
00150 indx_table = &indx->table[i];
00151 indx_table->index_offset = quicktime_read_int64_le(file);
00152 indx_table->index_size = quicktime_read_int32_le(file);
00153 indx_table->duration = quicktime_read_int32_le(file);
00154 offset = quicktime_position(file);
00155
00156 indx_table->ix = calloc(indx->table_size, sizeof(quicktime_ix_t*));
00157
00158
00159 ix = indx_table->ix = calloc(1, sizeof(quicktime_ix_t));
00160 quicktime_set_position(file, indx_table->index_offset);
00161 quicktime_read_ix(file, ix);
00162 quicktime_set_position(file, offset);
00163 }
00164
00165
00166 }
00167
00168
00169
00170