00001 #include "funcprotos.h"
00002 #include "quicktime.h"
00003
00004
00005 void quicktime_stsd_init(quicktime_stsd_t *stsd)
00006 {
00007 stsd->version = 0;
00008 stsd->flags = 0;
00009 stsd->total_entries = 0;
00010 }
00011
00012 void quicktime_stsd_init_table(quicktime_stsd_t *stsd)
00013 {
00014 if(!stsd->total_entries)
00015 {
00016 stsd->total_entries = 1;
00017 stsd->table = (quicktime_stsd_table_t*)calloc(1, sizeof(quicktime_stsd_table_t) * stsd->total_entries);
00018 quicktime_stsd_table_init(&(stsd->table[0]));
00019 }
00020 }
00021
00022 void quicktime_stsd_init_video(quicktime_t *file,
00023 quicktime_stsd_t *stsd,
00024 int frame_w,
00025 int frame_h,
00026 float frame_rate,
00027 char *compression)
00028 {
00029 quicktime_stsd_table_t *table;
00030 quicktime_stsd_init_table(stsd);
00031
00032 table = &(stsd->table[0]);
00033
00034
00035 quicktime_copy_char32(table->format, compression);
00036
00037 table->width = frame_w;
00038
00039 table->height = frame_h;
00040
00041 table->frames_per_sample = 1;
00042
00043 table->depth = 24;
00044
00045 table->ctab_id = 65535;
00046
00047 }
00048
00049 void quicktime_stsd_init_audio(quicktime_t *file,
00050 quicktime_stsd_t *stsd,
00051 int channels,
00052 int sample_rate,
00053 int bits,
00054 char *compressor)
00055 {
00056 quicktime_stsd_table_t *table;
00057 quicktime_stsd_init_table(stsd);
00058 table = &(stsd->table[0]);
00059
00060 quicktime_copy_char32(table->format, compressor);
00061 table->channels = channels;
00062 table->sample_size = bits;
00063 table->sample_rate = sample_rate;
00064 }
00065
00066 void quicktime_stsd_delete(quicktime_stsd_t *stsd)
00067 {
00068 int i;
00069 if(stsd->total_entries)
00070 {
00071 for(i = 0; i < stsd->total_entries; i++)
00072 quicktime_stsd_table_delete(&(stsd->table[i]));
00073 free(stsd->table);
00074 }
00075
00076 stsd->total_entries = 0;
00077 }
00078
00079 void quicktime_stsd_dump(void *minf_ptr, quicktime_stsd_t *stsd)
00080 {
00081 int i;
00082 printf(" sample description\n");
00083 printf(" version %d\n", stsd->version);
00084 printf(" flags %d\n", stsd->flags);
00085 printf(" total_entries %d\n", stsd->total_entries);
00086
00087 for(i = 0; i < stsd->total_entries; i++)
00088 {
00089 quicktime_stsd_table_dump(minf_ptr, &(stsd->table[i]));
00090 }
00091 }
00092
00093 void quicktime_read_stsd(quicktime_t *file, quicktime_minf_t *minf, quicktime_stsd_t *stsd)
00094 {
00095 int i;
00096 quicktime_atom_t leaf_atom;
00097
00098 stsd->version = quicktime_read_char(file);
00099 stsd->flags = quicktime_read_int24(file);
00100 stsd->total_entries = quicktime_read_int32(file);
00101 stsd->table = (quicktime_stsd_table_t*)calloc(1, sizeof(quicktime_stsd_table_t) * stsd->total_entries);
00102 for(i = 0; i < stsd->total_entries; i++)
00103 {
00104 quicktime_stsd_table_init(&(stsd->table[i]));
00105
00106 quicktime_read_stsd_table(file, minf, &(stsd->table[0]));
00107 }
00108 }
00109
00110 void quicktime_write_stsd(quicktime_t *file, quicktime_minf_t *minf, quicktime_stsd_t *stsd)
00111 {
00112 quicktime_atom_t atom;
00113 int i;
00114 quicktime_atom_write_header(file, &atom, "stsd");
00115
00116 quicktime_write_char(file, stsd->version);
00117 quicktime_write_int24(file, stsd->flags);
00118 quicktime_write_int32(file, stsd->total_entries);
00119 for(i = 0; i < stsd->total_entries; i++)
00120 {
00121 quicktime_write_stsd_table(file, minf, stsd->table);
00122 }
00123
00124 quicktime_atom_write_footer(file, &atom);
00125 }
00126
00127
00128