eo301@0
|
1 //
|
eo301@0
|
2 // main.c
|
eo301@0
|
3 // IM_AM Enco§er
|
eo301@0
|
4 //
|
eo301@0
|
5 // Created by eugenio oñate hospital on 14/06/12.
|
eo301@0
|
6 // Copyright (c) 2012 QM. All rights reserved.
|
eo301@0
|
7 //
|
eo301@8
|
8 //File input/output
|
eo301@0
|
9 #include <stdio.h>
|
eo301@8
|
10 //Standard library: numeric conversion, memory allocation...
|
eo301@0
|
11 #include <stdlib.h>
|
eo301@8
|
12 //Operations with strings
|
eo301@0
|
13 #include <string.h>
|
eo301@8
|
14 //Get the creation time: clock
|
eo301@0
|
15 #include <time.h>
|
eo301@0
|
16 #include "IM_AF Encoder.h"
|
eo301@0
|
17
|
eo301@0
|
18 /*Prototype*/
|
eo301@0
|
19
|
eo301@0
|
20 void filetypebx(FileTypeBox *ftyp);
|
eo301@1
|
21 int mdatbox(MediaDataBox *mdat, int, FILE *imf, FILE *song, int);
|
eo301@1
|
22 void moovheaderbox(MovieBox *moov, int, int, int, int, int, int);
|
eo301@1
|
23 int trackstructure(MovieBox *moov, int, int, int, int, char name[20]);
|
eo301@1
|
24 int samplecontainer(MovieBox *moov, int, int, char name[20]);
|
eo301@1
|
25 int sampledescription(MovieBox *moov, int);
|
eo301@1
|
26 int presetcontainer(MovieBox *moov, int,nametrack namet);
|
eo301@1
|
27 int rulescontainer(MovieBox *moov);
|
eo301@1
|
28 void writemoovbox(MovieBox moov, int numtrack,int totaltracks, FILE *imf);
|
eo301@1
|
29 int readTrack(MovieBox *moov, int, char name[20]);
|
eo301@1
|
30 int byterevers(int);
|
eo301@0
|
31
|
eo301@0
|
32
|
eo301@0
|
33 int main ()
|
eo301@0
|
34 {
|
eo301@0
|
35 //variables
|
eo301@0
|
36 FileTypeBox ftyp;
|
eo301@0
|
37 MediaDataBox mdat;
|
eo301@0
|
38 MovieBox moov;
|
eo301@1
|
39 // MetaBox meta;
|
eo301@1
|
40 nametrack namet;
|
eo301@1
|
41
|
eo301@0
|
42 FILE *imf;
|
eo301@1
|
43 int numtrack,totaltracks, sizemdat, durationTrack;
|
eo301@1
|
44
|
eo301@0
|
45 /* Obtain current time as seconds elapsed since the Epoch. */
|
eo301@0
|
46 time_t clock = time(NULL);
|
eo301@0
|
47
|
eo301@2
|
48 printf("\nWelcome to the IM_AF encoder\n");
|
eo301@0
|
49 printf("This program will allow you to create an IM_AF file.\n");
|
eo301@0
|
50 printf("How many tracks there will be in your IMAF file?\n");
|
eo301@0
|
51 scanf("%d",&totaltracks);
|
eo301@0
|
52 fflush(stdin);
|
eo301@0
|
53 while (totaltracks > maxtracks) {
|
eo301@2
|
54 printf("Sorry, for this version the number maximum ot tracks is %d\n",maxtracks);
|
eo301@0
|
55 printf("How many tracks there will be in your IMAF file:\n");
|
eo301@0
|
56 scanf("%d",&totaltracks);
|
eo301@0
|
57 }
|
eo301@0
|
58
|
eo301@0
|
59 //Create the file
|
eo301@0
|
60 imf = fopen ("/Users/eugin/Desktop/IM_AF Encoder/IM_AM Encoder/example1.ima","wb");
|
eo301@0
|
61 if (imf == NULL) {
|
eo301@0
|
62 printf("Error opening input file\n");
|
eo301@0
|
63 system("pause");
|
eo301@0
|
64 exit(1);
|
eo301@0
|
65 }
|
eo301@0
|
66
|
eo301@0
|
67 //Define the File Type Box
|
eo301@0
|
68 filetypebx(&ftyp);
|
eo301@0
|
69 fwrite(&ftyp, sizeof(FileTypeBox),1, imf);
|
eo301@0
|
70
|
eo301@0
|
71 //Media Data Box - Contains the audio
|
eo301@1
|
72 FILE *song;
|
eo301@2
|
73 char nametrack[20];
|
eo301@2
|
74 //Specify the path directory where there are the songs.
|
eo301@2
|
75 //If change folder, change the path here (3 times) and in readTrack function!!!
|
eo301@8
|
76 char pathdir[60] ="/Users/eugin/Desktop/IM_AF Encoder/Electro/";
|
eo301@1
|
77 int numtr, ex = 0;
|
eo301@1
|
78 for (numtr=0; numtr<totaltracks; numtr++) {
|
eo301@0
|
79
|
eo301@1
|
80 printf("Name of the track number: %d\n", numtr+1);
|
eo301@0
|
81 fflush(stdin);
|
eo301@0
|
82 scanf("%s", nametrack);
|
eo301@8
|
83 strcpy(pathdir, "/Users/eugin/Desktop/IM_AF Encoder/Electro/");
|
eo301@0
|
84 strcat(pathdir, nametrack);
|
eo301@1
|
85 ex = 0;
|
eo301@0
|
86 //Check if the track exist and then open it.
|
eo301@1
|
87 while (ex == 0){
|
eo301@0
|
88 song = fopen(pathdir, "rb");
|
eo301@0
|
89 if((song)==NULL) {
|
eo301@0
|
90 printf("Name does not exist. Try again:\n");
|
eo301@0
|
91 fflush(stdin);
|
eo301@0
|
92 scanf("%s", nametrack);
|
eo301@8
|
93 strcpy(pathdir, "/Users/eugin/Desktop/IM_AF Encoder/Electro/");
|
eo301@0
|
94 strcat(pathdir, nametrack);
|
eo301@0
|
95 }else{
|
eo301@1
|
96 ex = 1;
|
eo301@0
|
97 }
|
eo301@0
|
98 }
|
eo301@1
|
99 strcpy(namet[numtr].title, nametrack);
|
eo301@2
|
100
|
eo301@2
|
101 //Extract the samples from the audio file
|
eo301@1
|
102 sizemdat = mdatbox(&mdat, totaltracks, imf, song, numtr);
|
eo301@2
|
103
|
eo301@2
|
104 //Close the audio file
|
eo301@0
|
105 fclose(song);
|
eo301@0
|
106 }
|
eo301@2
|
107
|
eo301@1
|
108 //For each track write track information
|
eo301@1
|
109 u32 sizeTRAK = 0;
|
eo301@1
|
110 char name[20];
|
eo301@1
|
111 durationTrack = (sizemdat*8)/128;
|
eo301@1
|
112
|
eo301@1
|
113 for (numtrack = 0; numtrack < totaltracks; numtrack++) {
|
eo301@1
|
114 strcpy(name,namet[numtrack].title);
|
eo301@1
|
115 sizeTRAK = trackstructure(&moov, numtrack, clock, durationTrack,sizemdat, name)+ sizeTRAK;
|
eo301@1
|
116 }
|
eo301@1
|
117
|
eo301@1
|
118 //Presets
|
eo301@1
|
119 u32 sizePRCO;
|
eo301@2
|
120 sizePRCO = presetcontainer(&moov, totaltracks, namet); // Creates the preset, returns the size of the box.
|
eo301@1
|
121
|
eo301@1
|
122 //Rules
|
eo301@1
|
123 u32 sizeRUCO;
|
eo301@2
|
124 sizeRUCO = rulescontainer(&moov); // Creates the rules, returns the size of the box.
|
eo301@1
|
125
|
eo301@1
|
126 //Movie Header - Overall declarations
|
eo301@1
|
127 moovheaderbox(&moov, clock, sizeTRAK, sizePRCO, totaltracks, durationTrack, sizeRUCO);
|
eo301@1
|
128
|
eo301@2
|
129 //Writes the movie box into the file
|
eo301@2
|
130 writemoovbox(moov,numtrack, totaltracks, imf);
|
eo301@1
|
131
|
eo301@1
|
132 //Close File
|
eo301@1
|
133 fclose(imf);
|
eo301@2
|
134
|
eo301@2
|
135 printf("\nFile is created successfully, and ready to use!\n");
|
eo301@2
|
136
|
eo301@1
|
137 return 0;
|
eo301@1
|
138 }
|
eo301@1
|
139
|
eo301@1
|
140 void filetypebx(FileTypeBox *ftyp){
|
eo301@1
|
141 int swap;
|
eo301@1
|
142
|
eo301@1
|
143 swap = byterevers (24);
|
eo301@1
|
144 ftyp->size = swap;
|
eo301@1
|
145 swap = byterevers ('ftyp');
|
eo301@1
|
146 ftyp->type = swap;
|
eo301@1
|
147 swap = byterevers ('im03');
|
eo301@1
|
148 ftyp->major_brand = swap;
|
eo301@1
|
149 ftyp->minor_version = 0;
|
eo301@1
|
150 swap = byterevers ('im03');
|
eo301@1
|
151 ftyp->compatible_brands[0] = swap;
|
eo301@1
|
152 swap = byterevers ('isom');
|
eo301@1
|
153 ftyp->compatible_brands[1] = swap;
|
eo301@1
|
154 }
|
eo301@1
|
155
|
eo301@1
|
156 int mdatbox(MediaDataBox *mdat, int totaltracks, FILE *imf, FILE *song, int numtr){
|
eo301@1
|
157
|
eo301@1
|
158 int d, cnt, j, find = 0;
|
eo301@2
|
159 int dat = 0, dat1 = 0, dat2 = 0, dat3 = 0;
|
eo301@1
|
160 u32 size = 0, swap, sizeMDAT =0;
|
eo301@2
|
161 //Positonate the pointer at the end of the file to know the size of it
|
eo301@1
|
162 fseek(song, 0, SEEK_END);
|
eo301@1
|
163 size = ftell(song);
|
eo301@2
|
164 //Positionate the pointer at first
|
eo301@1
|
165 fseek(song, 0, SEEK_SET);
|
eo301@1
|
166 d=0;
|
eo301@1
|
167 cnt = 0;
|
eo301@2
|
168 //Find the header of the first frame (the beginning), when find it d=1 and jump out the loop.
|
eo301@2
|
169 // The header is 32 bytes. We find in groups of 8 bytes
|
eo301@2
|
170 // Contemplate all possible options of headers
|
eo301@1
|
171 while (d == 0) {
|
eo301@1
|
172 find = 0;
|
eo301@1
|
173 fread(&dat, sizeof(unsigned char), 1, song);
|
eo301@1
|
174 cnt++;
|
eo301@1
|
175
|
eo301@1
|
176 if (dat == 0xFF) {
|
eo301@2
|
177 cnt++; // cnt : stores the position of the pointer.
|
eo301@1
|
178 fread(&dat1, sizeof(unsigned char), 1, song);
|
eo301@1
|
179 cnt++;
|
eo301@1
|
180 fread(&dat2, sizeof(unsigned char), 1, song);
|
eo301@1
|
181 cnt++;
|
eo301@1
|
182 fread(&dat3, sizeof(unsigned char), 1, song);
|
eo301@1
|
183 if (dat1 == 0xFB && dat2 == 146 && dat3 == 64 ) {
|
eo301@2
|
184 find = 1; // find: if the header is found
|
eo301@2
|
185 d=1; // d: jump out the loop
|
eo301@1
|
186 }
|
eo301@1
|
187 if (dat1 == 0xFB && dat2 == 146 && dat3 == 96 ) {
|
eo301@1
|
188 d=1;
|
eo301@1
|
189 find = 1;
|
eo301@1
|
190 }
|
eo301@1
|
191 if (dat1 == 0xFB && dat2 == 144 && dat3 == 64 ) {
|
eo301@1
|
192 find = 1;
|
eo301@1
|
193 d=1;
|
eo301@1
|
194 }
|
eo301@1
|
195 if (dat1 == 0xFB && dat2 == 144 && dat3 == 96 ) {
|
eo301@1
|
196 find = 1;
|
eo301@1
|
197 d=1;
|
eo301@1
|
198 }
|
eo301@1
|
199 if (dat1 == 0xFB && dat2 == 146 && dat3 == 100 ) {
|
eo301@1
|
200 d=1;
|
eo301@1
|
201 find = 1;
|
eo301@1
|
202 }
|
eo301@1
|
203 if (dat1 == 0xFB && dat2 == 144 && dat3 == 100 ) {
|
eo301@1
|
204 find = 1;
|
eo301@1
|
205 d=1;
|
eo301@1
|
206 }
|
eo301@1
|
207 if (dat1 == 0xFA && dat2 == 146 && dat3 == 64 ) {
|
eo301@1
|
208 find = 1;
|
eo301@1
|
209 d=1;
|
eo301@1
|
210 }
|
eo301@1
|
211 if (dat1 == 0xFA && dat2 == 146 && dat3 == 96 ) {
|
eo301@1
|
212 d=1;
|
eo301@1
|
213 find = 1;
|
eo301@1
|
214 }
|
eo301@1
|
215 if (dat1 == 0xFA && dat2 == 144 && dat3 == 64 ) {
|
eo301@1
|
216 find = 1;
|
eo301@1
|
217 d=1;
|
eo301@1
|
218 }
|
eo301@1
|
219 if (dat1 == 0xFA && dat2 == 144 && dat3 == 96 ) {
|
eo301@1
|
220 find = 1;
|
eo301@1
|
221 d=1;
|
eo301@1
|
222 }
|
eo301@1
|
223 if (dat1 == 0xFA && dat2 == 146 && dat3 == 100 ) {
|
eo301@1
|
224 d=1;
|
eo301@1
|
225 find = 1;
|
eo301@1
|
226 }
|
eo301@1
|
227 if (dat1 == 0xFA && dat2 == 144 && dat3 == 100 ) {
|
eo301@1
|
228 find = 1;
|
eo301@1
|
229 d=1;
|
eo301@1
|
230 }
|
eo301@1
|
231 if (find == 0) {
|
eo301@1
|
232 fseek(song, -3, SEEK_CUR);
|
eo301@1
|
233 cnt = cnt - 3;
|
eo301@1
|
234 }
|
eo301@1
|
235 }
|
eo301@1
|
236 if (cnt == size) {
|
eo301@1
|
237 d = 1;
|
eo301@1
|
238 }
|
eo301@1
|
239 }
|
eo301@2
|
240 size = size - (cnt - 4); // Calculate the size of the samples. size = pos. end of file - pos. first header.
|
eo301@1
|
241 if (numtr == 0) {
|
eo301@2
|
242 sizeMDAT = size*totaltracks + 8; // size of the whole media box
|
eo301@1
|
243 swap = byterevers(sizeMDAT);
|
eo301@1
|
244 fwrite(&swap, sizeof(u32), 1, imf);
|
eo301@1
|
245 swap = byterevers('mdat');
|
eo301@1
|
246 mdat->type = swap;
|
eo301@1
|
247 fwrite(&mdat->type, sizeof(u32), 1, imf);
|
eo301@1
|
248 }
|
eo301@1
|
249 fseek(song, cnt - 4, SEEK_SET);
|
eo301@2
|
250 for (j=0; j<size; j++) { //read all the samples of one track and writes them in the IM AF file
|
eo301@1
|
251 fread(&mdat->data, sizeof(char), 1, song);
|
eo301@1
|
252 fwrite(&mdat->data, sizeof(char), 1, imf);
|
eo301@1
|
253 }
|
eo301@1
|
254 fclose(song);
|
eo301@1
|
255
|
eo301@1
|
256 return size;
|
eo301@1
|
257 }
|
eo301@1
|
258
|
eo301@1
|
259 int samplecontainer(MovieBox *moov, int numtrack, int sizemdat, char name[20]){
|
eo301@1
|
260
|
eo301@1
|
261 u32 sizeSTSD, sizeSTSZ, swap, num_samples, dat=0;
|
eo301@1
|
262
|
eo301@1
|
263 //Sample Description Box//
|
eo301@2
|
264 sizeSTSD = sampledescription(moov, numtrack);
|
eo301@2
|
265
|
eo301@1
|
266 //Sample size box//
|
eo301@1
|
267 swap = byterevers('stsz');
|
eo301@1
|
268 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
269 SampleSizeBox.type = swap;
|
eo301@1
|
270 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
271 SampleSizeBox.version = 0;
|
eo301@2
|
272 //Read Track: Frame size and Decoder Times
|
eo301@1
|
273 num_samples = readTrack(moov, numtrack, name);
|
eo301@1
|
274 sizeSTSZ = num_samples*4 + 20;
|
eo301@1
|
275 swap = byterevers(sizeSTSZ);
|
eo301@1
|
276 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
277 SampleSizeBox.size = swap;
|
eo301@1
|
278
|
eo301@1
|
279 //Time To Sample Box//
|
eo301@1
|
280 u32 sizetime, sizeSTTS;
|
eo301@1
|
281 sizetime = byterevers(moov->TrackBox[numtrack].MediaBox.MediaInformationBox.
|
eo301@1
|
282 SampleTableBox.TimeToSampleBox.entry_count);
|
eo301@1
|
283 sizeSTTS = 16 + sizetime*4*2;
|
eo301@1
|
284 swap = byterevers(sizeSTTS);
|
eo301@1
|
285 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
286 TimeToSampleBox.size = swap;
|
eo301@1
|
287 swap = byterevers('stts');
|
eo301@1
|
288 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
289 TimeToSampleBox.type = swap;
|
eo301@1
|
290 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
291 TimeToSampleBox.version = 0;
|
eo301@1
|
292
|
eo301@1
|
293 //Sample To Chunk//
|
eo301@1
|
294 u32 sizeSTSC = 28;
|
eo301@1
|
295 swap = byterevers(sizeSTSC);
|
eo301@1
|
296 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
297 SampleToChunk.size = swap;
|
eo301@1
|
298 swap = byterevers('stsc');
|
eo301@1
|
299 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
300 SampleToChunk.type = swap;
|
eo301@1
|
301 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
302 SampleToChunk.version = 0;
|
eo301@1
|
303 swap = byterevers(1);
|
eo301@1
|
304 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
305 SampleToChunk.entry_count = swap;
|
eo301@1
|
306 swap = byterevers(1);
|
eo301@1
|
307 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
308 SampleToChunk.first_chunk = swap;
|
eo301@1
|
309 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
310 SampleToChunk.samples_per_chunk = moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_count;
|
eo301@1
|
311 swap = byterevers(1);
|
eo301@1
|
312 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
313 SampleToChunk.sample_description_index = swap;
|
eo301@1
|
314
|
eo301@1
|
315 //Chunk Offset Box//
|
eo301@1
|
316 u32 sizeSTCO = 20;
|
eo301@1
|
317 swap = byterevers(sizeSTCO);
|
eo301@1
|
318 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
319 ChunkOffsetBox.size = swap;
|
eo301@1
|
320 swap = byterevers('stco');
|
eo301@1
|
321 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
322 ChunkOffsetBox.type = swap;
|
eo301@1
|
323 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
324 ChunkOffsetBox.version = 0;
|
eo301@1
|
325 swap = byterevers(1);
|
eo301@1
|
326 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
327 ChunkOffsetBox.entry_count = swap;
|
eo301@1
|
328 dat = 32 + sizemdat*numtrack;
|
eo301@1
|
329 swap = byterevers(dat);
|
eo301@1
|
330 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
331 ChunkOffsetBox.chunk_offset[numtrack] = swap;
|
eo301@1
|
332
|
eo301@1
|
333 //Sample Table Box //
|
eo301@1
|
334 u32 sizeSTBL = 8 + sizeSTSD + sizeSTSZ + sizeSTSC + sizeSTCO + sizeSTTS;
|
eo301@1
|
335 swap = byterevers(sizeSTBL);
|
eo301@1
|
336 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.size = swap;
|
eo301@1
|
337 swap = byterevers('stbl');
|
eo301@1
|
338 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.type =swap;
|
eo301@1
|
339
|
eo301@1
|
340 return sizeSTBL;
|
eo301@1
|
341 }
|
eo301@1
|
342
|
eo301@1
|
343 int sampledescription(MovieBox *moov, int numtrack){
|
eo301@1
|
344 u32 swap, sizeESD = 35;
|
eo301@1
|
345 swap = byterevers(sizeESD);
|
eo301@1
|
346 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
347 SampleDescriptionBox.AudioSampleEntry.ESbox.size = swap;
|
eo301@1
|
348 swap = byterevers('esds');
|
eo301@1
|
349 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
350 SampleDescriptionBox.AudioSampleEntry.ESbox.type = swap;
|
eo301@1
|
351 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
352 SampleDescriptionBox.AudioSampleEntry.ESbox.version = 0;
|
eo301@1
|
353
|
eo301@1
|
354 //ES Descriptor//
|
eo301@1
|
355 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
356 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.tag = 3;
|
eo301@1
|
357 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
358 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.length = 21;
|
eo301@1
|
359 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
360 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.ES_ID = 0;
|
eo301@1
|
361 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
362 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.mix = 0;
|
eo301@1
|
363
|
eo301@1
|
364 //Decoder config descriptor//
|
eo301@1
|
365 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
366 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
367 DecoderConfigDescriptor.tag = 4;
|
eo301@1
|
368 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
369 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
370 DecoderConfigDescriptor.length = 13;
|
eo301@1
|
371 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
372 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
373 DecoderConfigDescriptor.objectProfileInd = 0x6B;
|
eo301@1
|
374 swap = byterevers(0x150036B0);
|
eo301@1
|
375 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
376 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
377 DecoderConfigDescriptor.mix = swap;
|
eo301@1
|
378 swap = byterevers(128);
|
eo301@1
|
379 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
380 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
381 DecoderConfigDescriptor.maxBitRate = swap;
|
eo301@1
|
382 swap = byterevers(128);
|
eo301@1
|
383 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
384 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
385 DecoderConfigDescriptor.avgBitrate = swap;
|
eo301@1
|
386
|
eo301@1
|
387 //SLConfig Descriptor//
|
eo301@1
|
388 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
389 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
390 SLConfigDescriptor.tag = 6;
|
eo301@1
|
391 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
392 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
393 SLConfigDescriptor.length = 1;
|
eo301@1
|
394 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
395 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.
|
eo301@1
|
396 SLConfigDescriptor.predifined = 2;
|
eo301@1
|
397
|
eo301@1
|
398 //Audio Sample Entry//
|
eo301@1
|
399 u32 sizeMP4a = 36 + sizeESD;
|
eo301@1
|
400 swap = byterevers(sizeMP4a);
|
eo301@1
|
401 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
402 SampleDescriptionBox.AudioSampleEntry.size = swap;
|
eo301@1
|
403 swap = byterevers('mp4a');
|
eo301@1
|
404 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
405 SampleDescriptionBox.AudioSampleEntry.type =swap;
|
eo301@1
|
406 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
407 SampleDescriptionBox.AudioSampleEntry.reserved[0] = 0;
|
eo301@1
|
408 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
409 SampleDescriptionBox.AudioSampleEntry.reserved[1] = 0;
|
eo301@1
|
410 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
411 SampleDescriptionBox.AudioSampleEntry.reserved[2] = 0;
|
eo301@1
|
412 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
413 SampleDescriptionBox.AudioSampleEntry.reserved[3] = 0;
|
eo301@1
|
414 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
415 SampleDescriptionBox.AudioSampleEntry.reserved[4] = 0;
|
eo301@1
|
416 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
417 SampleDescriptionBox.AudioSampleEntry.reserved[5] = 0;
|
eo301@1
|
418 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
419 SampleDescriptionBox.AudioSampleEntry.data_reference_index = 256;
|
eo301@1
|
420 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
421 SampleDescriptionBox.AudioSampleEntry.reserved2[0] = 0;
|
eo301@1
|
422 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
423 SampleDescriptionBox.AudioSampleEntry.reserved2[1] = 0;
|
eo301@1
|
424 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
425 SampleDescriptionBox.AudioSampleEntry.channelcount = 512;
|
eo301@1
|
426 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
427 SampleDescriptionBox.AudioSampleEntry.samplesize = 4096; // 16 bits
|
eo301@1
|
428 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
429 SampleDescriptionBox.AudioSampleEntry.reserved3 = 0;
|
eo301@1
|
430 swap = 44100 << 16;
|
eo301@1
|
431 swap = byterevers(swap);
|
eo301@1
|
432 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
433 SampleDescriptionBox.AudioSampleEntry.samplerate = swap;
|
eo301@1
|
434
|
eo301@1
|
435 //Sample description box //
|
eo301@1
|
436 u32 sizeSTSD = 16 + sizeMP4a;
|
eo301@1
|
437 swap = byterevers(sizeSTSD);
|
eo301@1
|
438 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
439 SampleDescriptionBox.size = swap;
|
eo301@1
|
440 swap = byterevers('stsd');
|
eo301@1
|
441 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
442 SampleDescriptionBox.type = swap;
|
eo301@1
|
443 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
444 SampleDescriptionBox.version = 0;
|
eo301@1
|
445 swap = byterevers(1);
|
eo301@1
|
446 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
447 SampleDescriptionBox.entry_count = swap;
|
eo301@1
|
448
|
eo301@1
|
449 return sizeSTSD;
|
eo301@1
|
450 }
|
eo301@1
|
451
|
eo301@1
|
452 int readTrack (MovieBox *moov, int numtrack, char name[20]){
|
eo301@1
|
453
|
eo301@1
|
454 FILE *song;
|
eo301@1
|
455 int d=0, cnt = 0, i=0, j=0, cnt2 = 0, find = 0, swap, num_entr = 0;
|
eo301@2
|
456 int dat = 0, dat1 = 0, dat2 = 0, dat3 = 0, num_frame = 0, end =0, pos = 0;
|
eo301@2
|
457 u32 size[9000];
|
eo301@2
|
458 //Change path directory here
|
eo301@8
|
459 char pathdir[60] = "/Users/eugin/Desktop/IM_AF Encoder/Electro/";
|
eo301@1
|
460 strcat(pathdir, name);
|
eo301@2
|
461 //Open the audio file with the name introduced by the user
|
eo301@1
|
462 song = fopen (pathdir,"rb");
|
eo301@1
|
463 if (song == NULL) {
|
eo301@1
|
464 printf("Error opening input file\n");
|
eo301@1
|
465 system("pause");
|
eo301@1
|
466 exit(1);
|
eo301@1
|
467 }
|
eo301@2
|
468 //Calculate the size of the track
|
eo301@1
|
469 fseek(song, 0, SEEK_END);
|
eo301@1
|
470 end = ftell(song);
|
eo301@1
|
471 fseek(song, 0, SEEK_SET);
|
eo301@1
|
472 d=0, i=0;
|
eo301@2
|
473 //Search for each frame one by one, and extratcs the information
|
eo301@1
|
474 while (d == 0) {
|
eo301@1
|
475 find = 0;
|
eo301@1
|
476 fread(&dat, sizeof(unsigned char), 1, song);
|
eo301@1
|
477 cnt++;
|
eo301@1
|
478
|
eo301@1
|
479 if (dat == 0xFF) {
|
eo301@1
|
480 cnt++;
|
eo301@1
|
481 fread(&dat1, sizeof(unsigned char), 1, song);
|
eo301@1
|
482 cnt++;
|
eo301@1
|
483 fread(&dat2, sizeof(unsigned char), 1, song);
|
eo301@1
|
484 cnt++;
|
eo301@1
|
485 fread(&dat3, sizeof(unsigned char), 1, song);
|
eo301@1
|
486 if (dat1 == 0xFB && dat2 == 146 && dat3 == 64 ) {
|
eo301@2
|
487 pos = cnt - 4; //Pos of the beginning of the frame
|
eo301@2
|
488 size[num_frame] = pos - cnt2; //Size of one frame
|
eo301@2
|
489 cnt2 = pos; //Pos of the next frame
|
eo301@1
|
490 find = 1;
|
eo301@2
|
491 num_frame ++; //Number of frames
|
eo301@1
|
492 }
|
eo301@1
|
493 if (dat1 == 0xFB && dat2 == 146 && dat3 == 96 ) {
|
eo301@1
|
494 pos = cnt - 4;
|
eo301@2
|
495 size[num_frame] = pos - cnt2;
|
eo301@1
|
496 cnt2 = pos;
|
eo301@1
|
497 find = 1;
|
eo301@2
|
498 num_frame ++;
|
eo301@1
|
499 }
|
eo301@1
|
500 if (dat1 == 0xFB && dat2 == 144 && dat3 == 64 ) {
|
eo301@2
|
501 pos = cnt - 4;
|
eo301@2
|
502 size[num_frame] = pos - cnt2;
|
eo301@1
|
503 cnt2 = pos;
|
eo301@1
|
504 find = 1;
|
eo301@2
|
505 num_frame ++;
|
eo301@1
|
506 }
|
eo301@1
|
507 if (dat1 == 0xFB && dat2 == 144 && dat3 == 96 ) {
|
eo301@1
|
508 pos = cnt - 4;
|
eo301@2
|
509 size[num_frame] = pos - cnt2;
|
eo301@1
|
510 cnt2 = pos;
|
eo301@1
|
511 find = 1;
|
eo301@2
|
512 num_frame ++;
|
eo301@1
|
513 }
|
eo301@1
|
514 if (dat1 == 0xFB && dat2 == 146 && dat3 == 100 ) {
|
eo301@1
|
515 pos = cnt - 4;
|
eo301@2
|
516 size[num_frame] = pos - cnt2;
|
eo301@1
|
517 cnt2 = pos;
|
eo301@1
|
518 find = 1;
|
eo301@2
|
519 num_frame ++;
|
eo301@1
|
520 }
|
eo301@1
|
521 if (dat1 == 0xFB && dat2 == 144 && dat3 == 100 ) {
|
eo301@1
|
522 pos = cnt - 4;
|
eo301@2
|
523 size[num_frame] = pos - cnt2;
|
eo301@1
|
524 cnt2 = pos;
|
eo301@1
|
525 find = 1;
|
eo301@2
|
526 num_frame ++;
|
eo301@1
|
527 }
|
eo301@1
|
528 if (dat1 == 0xFA && dat2 == 146 && dat3 == 64 ) {
|
eo301@1
|
529 pos = cnt - 4;
|
eo301@2
|
530 size[num_frame] = pos - cnt2;
|
eo301@1
|
531 cnt2 = pos;
|
eo301@1
|
532 find = 1;
|
eo301@2
|
533 num_frame ++;
|
eo301@1
|
534 }
|
eo301@1
|
535 if (dat1 == 0xFA && dat2 == 146 && dat3 == 96 ) {
|
eo301@1
|
536 pos = cnt - 4;
|
eo301@2
|
537 size[num_frame] = pos - cnt2;
|
eo301@1
|
538 cnt2 = pos;
|
eo301@1
|
539 find = 1;
|
eo301@2
|
540 num_frame ++;
|
eo301@1
|
541 }
|
eo301@1
|
542 if (dat1 == 0xFA && dat2 == 144 && dat3 == 64 ) {
|
eo301@1
|
543 pos = cnt - 4;
|
eo301@2
|
544 size[num_frame] = pos - cnt2;
|
eo301@1
|
545 cnt2 = pos;
|
eo301@1
|
546 find = 1;
|
eo301@2
|
547 num_frame ++;
|
eo301@1
|
548 }
|
eo301@1
|
549 if (dat1 == 0xFA && dat2 == 144 && dat3 == 96 ) {
|
eo301@1
|
550 pos = cnt - 4;
|
eo301@2
|
551 size[num_frame] = pos - cnt2;
|
eo301@1
|
552 cnt2 = pos;
|
eo301@1
|
553 find = 1;
|
eo301@2
|
554 num_frame ++;
|
eo301@1
|
555 }
|
eo301@1
|
556 if (dat1 == 0xFA && dat2 == 146 && dat3 == 100 ) {
|
eo301@1
|
557 pos = cnt - 4;
|
eo301@2
|
558 size[num_frame] = pos - cnt2;
|
eo301@1
|
559 cnt2 = pos;
|
eo301@1
|
560 find = 1;
|
eo301@2
|
561 num_frame ++;
|
eo301@1
|
562 }
|
eo301@1
|
563 if (dat1 == 0xFA && dat2 == 144 && dat3 == 100 ) {
|
eo301@1
|
564 pos = cnt - 4;
|
eo301@2
|
565 size[num_frame] = pos - cnt2;
|
eo301@1
|
566 cnt2 = pos;
|
eo301@1
|
567 find = 1;
|
eo301@2
|
568 num_frame ++;
|
eo301@1
|
569 }
|
eo301@2
|
570 if (find == 0) { //In case it does not find the header.
|
eo301@2
|
571 //It keeps reading next data without jump any position
|
eo301@1
|
572 fseek(song, -3, SEEK_CUR);
|
eo301@1
|
573 cnt = cnt - 3;
|
eo301@1
|
574 }
|
eo301@1
|
575 }
|
eo301@1
|
576
|
eo301@1
|
577 if (cnt == end) {
|
eo301@1
|
578 pos = cnt;
|
eo301@2
|
579 size[num_frame] = pos - cnt2;
|
eo301@1
|
580 d = 1;
|
eo301@1
|
581 }
|
eo301@1
|
582 }
|
eo301@2
|
583
|
eo301@1
|
584 //Save Samples size//
|
eo301@2
|
585 swap = byterevers(num_frame);
|
eo301@1
|
586 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
587 SampleSizeBox.sample_count = swap;
|
eo301@1
|
588 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
589 SampleSizeBox.sample_size = 0;
|
eo301@1
|
590
|
eo301@2
|
591 for (i=0; i< num_frame; i++) {
|
eo301@1
|
592 swap = byterevers(size[i+1]);
|
eo301@1
|
593 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
594 SampleSizeBox.entry_size[i] = swap;
|
eo301@1
|
595 }
|
eo301@1
|
596
|
eo301@2
|
597 //Save Decoding Times//
|
eo301@2
|
598 //Writes manually the duration of each frame.
|
eo301@2
|
599 //Follows the following structure:
|
eo301@2
|
600 // 7 frames of 26 ms
|
eo301@2
|
601 // 1 frame of 27 ms
|
eo301@2
|
602 // ...
|
eo301@2
|
603 // And each 13 rows it writes
|
eo301@2
|
604 // 8 frames of 26 ms
|
eo301@2
|
605 // 1 frame of 27 ms
|
eo301@2
|
606 //It is done for adjusting the different durations of each frame.
|
eo301@2
|
607 // as they vary between 26.125 ms and 26.075 ms
|
eo301@1
|
608
|
eo301@1
|
609 swap = byterevers(1);
|
eo301@1
|
610 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
611 TimeToSampleBox.sample_count[0] = swap;
|
eo301@1
|
612 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
613 TimeToSampleBox.sample_delta[0] =0;
|
eo301@1
|
614 int t=0,k=1, l =0;
|
eo301@1
|
615 num_entr = 1;
|
eo301@1
|
616 j = 0;
|
eo301@2
|
617 for (i = 1; i< num_frame; i++) {
|
eo301@1
|
618 if (j == 8 && l == 0) {
|
eo301@1
|
619 swap = byterevers(7);
|
eo301@1
|
620 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
621 TimeToSampleBox.sample_count[num_entr] = swap;
|
eo301@1
|
622 swap = byterevers(26);
|
eo301@1
|
623 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
624 TimeToSampleBox.sample_delta[num_entr] =swap;
|
eo301@1
|
625 num_entr ++;
|
eo301@1
|
626
|
eo301@1
|
627 swap = byterevers(1);
|
eo301@1
|
628 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
629 TimeToSampleBox.sample_count[num_entr] = swap;
|
eo301@1
|
630 swap = byterevers(27);
|
eo301@1
|
631 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
632 TimeToSampleBox.sample_delta[num_entr] =swap;
|
eo301@1
|
633 num_entr++;
|
eo301@1
|
634 j=0;
|
eo301@1
|
635 dat = i;
|
eo301@1
|
636 if (k == 6 && t == 0) {
|
eo301@1
|
637 l = 1;
|
eo301@1
|
638 t = 1;
|
eo301@1
|
639 k = 1;
|
eo301@1
|
640 }
|
eo301@1
|
641 if (k == 6 && t ==1) {
|
eo301@1
|
642 l = 1;
|
eo301@1
|
643 k = 1;
|
eo301@1
|
644 }
|
eo301@1
|
645 k++;
|
eo301@1
|
646 }
|
eo301@1
|
647
|
eo301@1
|
648 if (j == 9 && l == 1) {
|
eo301@1
|
649
|
eo301@1
|
650 swap = byterevers(8);
|
eo301@1
|
651 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
652 TimeToSampleBox.sample_count[num_entr] = swap;
|
eo301@1
|
653 swap = byterevers(26);
|
eo301@1
|
654 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
655 TimeToSampleBox.sample_delta[num_entr] =swap;
|
eo301@1
|
656 num_entr ++;
|
eo301@1
|
657
|
eo301@1
|
658 swap = byterevers(1);
|
eo301@1
|
659 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
660 TimeToSampleBox.sample_count[num_entr] = swap;
|
eo301@1
|
661 swap = byterevers(27);
|
eo301@1
|
662 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
663 TimeToSampleBox.sample_delta[num_entr] =swap;
|
eo301@1
|
664 num_entr++;
|
eo301@1
|
665 j=0;
|
eo301@1
|
666 dat = i;
|
eo301@1
|
667 l = 0;
|
eo301@1
|
668 }
|
eo301@1
|
669 j++;
|
eo301@1
|
670 }
|
eo301@1
|
671
|
eo301@2
|
672 dat = num_frame - dat;
|
eo301@1
|
673
|
eo301@1
|
674 swap = byterevers(dat);
|
eo301@1
|
675 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
676 TimeToSampleBox.sample_count[num_entr] = swap;
|
eo301@1
|
677 swap = byterevers(26);
|
eo301@1
|
678 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
679 TimeToSampleBox.sample_delta[num_entr] =swap;
|
eo301@1
|
680 num_entr++;
|
eo301@1
|
681 swap = byterevers(num_entr);
|
eo301@1
|
682 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
683 TimeToSampleBox.entry_count = swap;
|
eo301@1
|
684
|
eo301@1
|
685 fclose(song);
|
eo301@2
|
686 return num_frame;
|
eo301@0
|
687
|
eo301@0
|
688 }
|
eo301@0
|
689
|
eo301@1
|
690 int trackstructure (MovieBox *moov, int numtrack, int clock,
|
eo301@1
|
691 int durationTrack, int sizemdat, char name[20]){
|
eo301@1
|
692 int swap;
|
eo301@1
|
693
|
eo301@1
|
694 //Sample Table Box
|
eo301@1
|
695 int sizeSTBL = 0;
|
eo301@1
|
696 sizeSTBL = samplecontainer(moov, numtrack,sizemdat, name);
|
eo301@0
|
697
|
eo301@1
|
698 //Data Entry Url Box
|
eo301@1
|
699 u32 sizeURL = 12;
|
eo301@1
|
700 swap = byterevers(sizeURL);
|
eo301@1
|
701 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
702 DataReferenceBox.DataEntryUrlBox.size = swap;
|
eo301@1
|
703 swap = byterevers('url ');
|
eo301@1
|
704 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
705 DataReferenceBox.DataEntryUrlBox.type = swap;
|
eo301@1
|
706 swap = byterevers(1);
|
eo301@1
|
707 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
708 DataReferenceBox.DataEntryUrlBox.flags = swap; // =1 Track in same file as movie atom.
|
eo301@1
|
709
|
eo301@1
|
710 //Data Reference
|
eo301@1
|
711 u32 sizeDREF = sizeURL+ 16;
|
eo301@1
|
712 swap = byterevers(sizeDREF);
|
eo301@1
|
713 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
714 DataReferenceBox.size = swap;
|
eo301@1
|
715 swap = byterevers('dref');
|
eo301@1
|
716 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
717 DataReferenceBox.type = swap;
|
eo301@1
|
718 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
719 DataReferenceBox.flags = 0;
|
eo301@1
|
720 swap = byterevers(1);
|
eo301@1
|
721 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.
|
eo301@1
|
722 DataReferenceBox.entry_count = swap;
|
eo301@1
|
723
|
eo301@1
|
724 //Data information Box//
|
eo301@1
|
725 u32 sizeDINF = sizeDREF + 8;
|
eo301@1
|
726 swap = byterevers(sizeDINF);
|
eo301@1
|
727 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.size = swap;
|
eo301@1
|
728 swap = byterevers('dinf');
|
eo301@1
|
729 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.type = swap;
|
eo301@1
|
730
|
eo301@1
|
731 //Sound Header Box //
|
eo301@1
|
732 u32 sizeSMHD = 16;
|
eo301@1
|
733 swap = byterevers(sizeSMHD);
|
eo301@1
|
734 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.size = swap;
|
eo301@1
|
735 swap = byterevers('smhd');
|
eo301@1
|
736 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.type = swap;
|
eo301@1
|
737 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.version = 0;
|
eo301@1
|
738 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.balance = 0;
|
eo301@1
|
739 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.reserved = 0;
|
eo301@1
|
740
|
eo301@1
|
741 //Media Information Box//
|
eo301@1
|
742 u32 sizeMINF = sizeDINF + sizeSMHD + sizeSTBL + 8;
|
eo301@1
|
743 swap = byterevers(sizeMINF);
|
eo301@1
|
744 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.size = swap;
|
eo301@1
|
745 swap = byterevers('minf');
|
eo301@1
|
746 moov->TrackBox[numtrack].MediaBox.MediaInformationBox.type = swap;
|
eo301@1
|
747
|
eo301@1
|
748 //Handler Box//
|
eo301@1
|
749 u32 sizeHDLR = 37;
|
eo301@1
|
750 swap = byterevers(sizeHDLR);
|
eo301@1
|
751 moov->TrackBox[numtrack].MediaBox.HandlerBox.size = swap;
|
eo301@1
|
752 swap = byterevers('hdlr');
|
eo301@1
|
753 moov->TrackBox[numtrack].MediaBox.HandlerBox.type = swap;
|
eo301@1
|
754 moov->TrackBox[numtrack].MediaBox.HandlerBox.version = 0;
|
eo301@1
|
755 moov->TrackBox[numtrack].MediaBox.HandlerBox.pre_defined = 0;
|
eo301@1
|
756 swap = byterevers('soun');
|
eo301@1
|
757 moov->TrackBox[numtrack].MediaBox.HandlerBox.handler_type = swap;
|
eo301@1
|
758 moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[0] = 0;
|
eo301@1
|
759 moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[1] = 0;
|
eo301@1
|
760 moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[2] = 0;
|
eo301@1
|
761 //swap = byterevers('soun');
|
eo301@1
|
762 //moov->TrackBox[numtrack].MediaBox.HandlerBox.data = swap;
|
eo301@1
|
763 moov->TrackBox[numtrack].MediaBox.HandlerBox.data[0] = 's';
|
eo301@1
|
764 moov->TrackBox[numtrack].MediaBox.HandlerBox.data[1] = 'o';
|
eo301@1
|
765 moov->TrackBox[numtrack].MediaBox.HandlerBox.data[2] = 'u';
|
eo301@1
|
766 moov->TrackBox[numtrack].MediaBox.HandlerBox.data[3] = 'n';
|
eo301@1
|
767 moov->TrackBox[numtrack].MediaBox.HandlerBox.data[4] = '\0';
|
eo301@1
|
768
|
eo301@1
|
769 //Media Header Box//
|
eo301@1
|
770 u32 sizeMDHD = 32;
|
eo301@1
|
771 swap = byterevers(sizeMDHD);
|
eo301@1
|
772 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.size = swap;
|
eo301@1
|
773 swap = byterevers('mdhd');
|
eo301@1
|
774 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.type = swap;
|
eo301@1
|
775 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.version = 0;
|
eo301@1
|
776 swap = byterevers(clock);
|
eo301@1
|
777 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.creation_time = swap;
|
eo301@1
|
778 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.modification_time = swap;
|
eo301@1
|
779 swap = byterevers(1000);
|
eo301@1
|
780 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.timescale = swap;
|
eo301@1
|
781 swap = byterevers(durationTrack);
|
eo301@1
|
782 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.duration = swap;
|
eo301@1
|
783 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.language = 0xC455;
|
eo301@1
|
784 moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.pre_defined = 0;
|
eo301@1
|
785
|
eo301@1
|
786 //Media Box//
|
eo301@1
|
787 u32 sizeMDIA = sizeMDHD + sizeHDLR + sizeMINF + 8;
|
eo301@1
|
788 swap = byterevers(sizeMDIA);
|
eo301@1
|
789 moov->TrackBox[numtrack].MediaBox.size = swap;
|
eo301@1
|
790 swap = byterevers('mdia');
|
eo301@1
|
791 moov->TrackBox[numtrack].MediaBox.type = swap;
|
eo301@1
|
792
|
eo301@1
|
793 //Track Header//
|
eo301@1
|
794 u32 sizeTKHD = 92;
|
eo301@1
|
795 swap = byterevers (sizeTKHD);
|
eo301@1
|
796 moov->TrackBox[numtrack].TrackHeaderBox.size = swap;
|
eo301@1
|
797 swap = byterevers ('tkhd');
|
eo301@1
|
798 moov->TrackBox[numtrack].TrackHeaderBox.type = swap ;
|
eo301@1
|
799 swap = byterevers (0x00000006);
|
eo301@1
|
800 moov->TrackBox[numtrack].TrackHeaderBox.version = swap;
|
eo301@1
|
801 swap = byterevers (clock);
|
eo301@1
|
802 moov->TrackBox[numtrack].TrackHeaderBox.creation_time = swap;
|
eo301@1
|
803 moov->TrackBox[numtrack].TrackHeaderBox.modification_time = swap;
|
eo301@1
|
804 swap = byterevers (numtrack+1);
|
eo301@1
|
805 moov->TrackBox[numtrack].TrackHeaderBox.track_ID = swap; //From 0x00000001 - 0x7FFFFFFF (dec 2147483647)
|
eo301@1
|
806 moov->TrackBox[numtrack].TrackHeaderBox.reserved = 0;
|
eo301@1
|
807 swap = byterevers (durationTrack);
|
eo301@1
|
808 moov->TrackBox[numtrack].TrackHeaderBox.duration = swap;
|
eo301@1
|
809 moov->TrackBox[numtrack].TrackHeaderBox.reserved2[0] = 0;
|
eo301@1
|
810 moov->TrackBox[numtrack].TrackHeaderBox.reserved2[1] = 0;
|
eo301@1
|
811 moov->TrackBox[numtrack].TrackHeaderBox.layer = 0;
|
eo301@1
|
812 moov->TrackBox[numtrack].TrackHeaderBox.alternate_group = 0;
|
eo301@1
|
813 moov->TrackBox[numtrack].TrackHeaderBox.volume = 0x1;
|
eo301@1
|
814 moov->TrackBox[numtrack].TrackHeaderBox.reserved3 = 0;
|
eo301@1
|
815 swap = byterevers (0x00010000);
|
eo301@1
|
816 moov->TrackBox[numtrack].TrackHeaderBox.matrix[0] = swap;
|
eo301@1
|
817 moov->TrackBox[numtrack].TrackHeaderBox.matrix[1] = 0;
|
eo301@1
|
818 moov->TrackBox[numtrack].TrackHeaderBox.matrix[2] = 0;
|
eo301@1
|
819 moov->TrackBox[numtrack].TrackHeaderBox.matrix[3] = 0;
|
eo301@1
|
820 moov->TrackBox[numtrack].TrackHeaderBox.matrix[4] = swap;
|
eo301@1
|
821 moov->TrackBox[numtrack].TrackHeaderBox.matrix[5] = 0;
|
eo301@1
|
822 moov->TrackBox[numtrack].TrackHeaderBox.matrix[6] = 0;
|
eo301@1
|
823 moov->TrackBox[numtrack].TrackHeaderBox.matrix[7] = 0;
|
eo301@1
|
824 swap = byterevers(0x40000000);
|
eo301@1
|
825 moov->TrackBox[numtrack].TrackHeaderBox.matrix[8] = swap;
|
eo301@1
|
826 moov->TrackBox[numtrack].TrackHeaderBox.width = 0; //just for video
|
eo301@1
|
827 moov->TrackBox[numtrack].TrackHeaderBox.height = 0; //just for video
|
eo301@1
|
828
|
eo301@1
|
829 //Track container
|
eo301@1
|
830 u32 sizeTRAK = sizeTKHD + sizeMDIA + 8;
|
eo301@1
|
831 swap = byterevers (sizeTRAK); // Size of one track
|
eo301@1
|
832 moov->TrackBox[numtrack].size = swap;
|
eo301@1
|
833 swap = byterevers ('trak');
|
eo301@1
|
834 moov->TrackBox[numtrack].type = swap;
|
eo301@1
|
835 return sizeTRAK;
|
eo301@1
|
836
|
eo301@1
|
837 }
|
eo301@1
|
838
|
eo301@1
|
839 int presetcontainer(MovieBox *moov, int totaltracks, nametrack namet){
|
eo301@1
|
840
|
eo301@1
|
841 int swap, i,j,flag, vol=0;
|
eo301@1
|
842 unsigned char numpres=0, prestype=0,defaultPreset;
|
eo301@1
|
843 char namepres1[14] = "static_track "; // 13
|
eo301@1
|
844 u32 sizePRST = 0;
|
eo301@1
|
845
|
eo301@2
|
846 printf("\nPresets:\n");
|
eo301@1
|
847 printf("Static track volume preset: invariant volume related to each track \n");
|
eo301@1
|
848 printf(" --------------------------------------\n");
|
eo301@1
|
849 numpres = 1;
|
eo301@2
|
850
|
eo301@1
|
851 //Preset Box//
|
eo301@1
|
852 for (i=0; i<numpres; i++) {
|
eo301@1
|
853 printf("Preset number %d: %s\n",i+1,namepres1);
|
eo301@1
|
854 strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, namepres1);
|
eo301@1
|
855 sizePRST = 16 + 14 + 4*totaltracks + totaltracks;
|
eo301@1
|
856 swap = byterevers(sizePRST);
|
eo301@1
|
857 moov->PresetContainerBox.PresetBox[i].size = swap;
|
eo301@1
|
858 prestype = 0;
|
eo301@1
|
859
|
eo301@1
|
860 moov->PresetContainerBox.PresetBox[i].num_preset_elements = totaltracks;
|
eo301@1
|
861 swap = byterevers('prst');
|
eo301@1
|
862 moov->PresetContainerBox.PresetBox[i].type = swap;
|
eo301@1
|
863
|
eo301@1
|
864 flag = 0x02; // Display Enable Edit Disable
|
eo301@1
|
865 swap = byterevers(flag);
|
eo301@1
|
866 moov->PresetContainerBox.PresetBox[i].flags = swap;
|
eo301@1
|
867
|
eo301@1
|
868 moov->PresetContainerBox.PresetBox[i].preset_ID = i+1;
|
eo301@1
|
869
|
eo301@1
|
870 moov->PresetContainerBox.PresetBox[i].preset_type = prestype;
|
eo301@1
|
871 moov->PresetContainerBox.PresetBox[i].preset_global_volume = 100;
|
eo301@1
|
872
|
eo301@1
|
873 for (j=0; j<totaltracks; j++) {
|
eo301@1
|
874 swap = byterevers(j+1);
|
eo301@1
|
875 moov->PresetContainerBox.PresetBox[i].presElemId[j].preset_element_ID = swap;
|
eo301@1
|
876 }
|
eo301@2
|
877 //Enter values (two options):
|
eo301@2
|
878 // In loop
|
eo301@1
|
879 for (j=0; j<totaltracks; j++) {
|
eo301@2
|
880 vol = 70 - 10*(j+1);
|
eo301@2
|
881 // vol = 20*(j+1);
|
eo301@2
|
882 printf("Enter volume for %s = %d\n",namet[j].title,vol*2);
|
eo301@1
|
883 // scanf("%d",&vol);
|
eo301@1
|
884 // printf("Vol: %d\n",vol);
|
eo301@1
|
885 moov->PresetContainerBox.PresetBox[i].presVolumElem[j].preset_volume_element = vol; //*0.02
|
eo301@1
|
886 }
|
eo301@1
|
887
|
eo301@2
|
888 // Or one by one
|
eo301@2
|
889 /* moov->PresetContainerBox.PresetBox[i].presVolumElem[0].preset_volume_element = 20;
|
eo301@2
|
890 printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox.
|
eo301@2
|
891 PresetBox[i].presVolumElem[0].preset_volume_element*2);
|
eo301@2
|
892 moov->PresetContainerBox.PresetBox[i].presVolumElem[1].preset_volume_element = 40;
|
eo301@2
|
893 printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox.
|
eo301@2
|
894 PresetBox[i].presVolumElem[1].preset_volume_element*2);
|
eo301@2
|
895 moov->PresetContainerBox.PresetBox[i].presVolumElem[2].preset_volume_element = 20;
|
eo301@2
|
896 printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox.
|
eo301@2
|
897 PresetBox[i].presVolumElem[2].preset_volume_element*2);
|
eo301@2
|
898 moov->PresetContainerBox.PresetBox[i].presVolumElem[3].preset_volume_element = 50;
|
eo301@2
|
899 printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox.
|
eo301@2
|
900 PresetBox[i].presVolumElem[3].preset_volume_element*2);
|
eo301@2
|
901 moov->PresetContainerBox.PresetBox[i].presVolumElem[4].preset_volume_element = 52;
|
eo301@2
|
902 printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox.
|
eo301@2
|
903 PresetBox[i].presVolumElem[4].preset_volume_element*2);
|
eo301@2
|
904 */ }
|
eo301@1
|
905
|
eo301@1
|
906 //Preset Container//
|
eo301@1
|
907 u32 sizePRCO = sizePRST + 10;
|
eo301@1
|
908 swap = byterevers(sizePRCO);
|
eo301@1
|
909 moov->PresetContainerBox.size = swap;
|
eo301@1
|
910 swap = byterevers('prco');
|
eo301@1
|
911 moov->PresetContainerBox.type = swap;
|
eo301@1
|
912 defaultPreset = 1;
|
eo301@1
|
913 moov->PresetContainerBox.default_preset_ID = defaultPreset; // Indicates initial preset activated.
|
eo301@1
|
914 moov->PresetContainerBox.num_preset = numpres;
|
eo301@1
|
915
|
eo301@1
|
916 return sizePRCO;
|
eo301@1
|
917 }
|
eo301@1
|
918
|
eo301@1
|
919 int rulescontainer(MovieBox *moov){
|
eo301@1
|
920 int swap;
|
eo301@1
|
921 u32 sizeRUSC, elementID, key_elem, sizeRUMX;
|
eo301@1
|
922
|
eo301@1
|
923 moov->RulesContainer.num_selection_rules = 256; //u16 invert
|
eo301@2
|
924 // moov->RulesContainer.num_selection_rules = 0;
|
eo301@2
|
925 moov->RulesContainer.num_mixing_rules = 256; //u16 invert
|
eo301@1
|
926
|
eo301@1
|
927 //Selection Rules
|
eo301@1
|
928 sizeRUSC = 19 + 14;
|
eo301@2
|
929 // sizeRUSC = 0;
|
eo301@1
|
930 swap = byterevers(sizeRUSC);
|
eo301@1
|
931 moov->RulesContainer.SelectionRules.size = swap;
|
eo301@1
|
932 swap = byterevers('rusc');
|
eo301@1
|
933 moov->RulesContainer.SelectionRules.type = swap;
|
eo301@1
|
934 moov->RulesContainer.SelectionRules.version = 0;
|
eo301@1
|
935 moov->RulesContainer.SelectionRules.selection_rule_ID = 256;
|
eo301@1
|
936 moov->RulesContainer.SelectionRules.selection_rule_type = 2;
|
eo301@2
|
937 elementID = 3;
|
eo301@1
|
938 swap = byterevers(elementID);
|
eo301@1
|
939 moov->RulesContainer.SelectionRules.element_ID = swap;
|
eo301@1
|
940 strcpy(moov->RulesContainer.SelectionRules.rule_description,"Not mute rule");
|
eo301@2
|
941 printf("\nRules:\n");
|
eo301@2
|
942 printf("Rule 1: Not mute for channel %d\n",elementID);
|
eo301@1
|
943
|
eo301@1
|
944 //Mixing Rule
|
eo301@2
|
945 sizeRUMX = 23 + 17;
|
eo301@1
|
946 swap = byterevers(sizeRUMX);
|
eo301@1
|
947 moov->RulesContainer.MixingRules.size = swap;
|
eo301@1
|
948 swap = byterevers('rumx');
|
eo301@1
|
949 moov->RulesContainer.MixingRules.type = swap;
|
eo301@1
|
950 moov->RulesContainer.MixingRules.version = 0;
|
eo301@2
|
951 moov->RulesContainer.MixingRules.mixing_rule_ID = 512;
|
eo301@2
|
952 // moov->RulesContainer.MixingRules.mixing_type = 0; // Equivalence rule
|
eo301@2
|
953 moov->RulesContainer.MixingRules.mixing_type = 2; // Upper rule
|
eo301@1
|
954 elementID = 1;
|
eo301@1
|
955 swap = byterevers(elementID);
|
eo301@1
|
956 moov->RulesContainer.MixingRules.element_ID = swap;
|
eo301@1
|
957 key_elem = 2;
|
eo301@1
|
958 swap = byterevers(key_elem);
|
eo301@1
|
959 moov->RulesContainer.MixingRules.key_elem_ID = swap;
|
eo301@2
|
960 strcpy(moov->RulesContainer.MixingRules.mix_description, "Lower rule");
|
eo301@2
|
961 printf("Rule 2: Lower rule between channel %d and %d\n",elementID,key_elem);
|
eo301@2
|
962 // strcpy(moov->RulesContainer.MixingRules.mix_description, "Equivalence rule");
|
eo301@2
|
963 // printf("Rule 2: Equivalence rule\n");
|
eo301@1
|
964
|
eo301@1
|
965 //Rule container
|
eo301@1
|
966 u32 sizeRUCO = 12 + sizeRUSC + sizeRUMX;
|
eo301@1
|
967 swap = byterevers(sizeRUCO);
|
eo301@1
|
968 moov->RulesContainer.size = swap;
|
eo301@1
|
969 swap = byterevers('ruco');
|
eo301@1
|
970 moov->RulesContainer.type = swap;
|
eo301@1
|
971
|
eo301@1
|
972 return sizeRUCO;
|
eo301@1
|
973 }
|
eo301@1
|
974
|
eo301@1
|
975 void moovheaderbox (MovieBox *moov,int clock, int sizeTRAK, int sizePRCO, int totaltracks,
|
eo301@1
|
976 int durationTrack, int sizeRUCO){
|
eo301@1
|
977 int swap;
|
eo301@1
|
978
|
eo301@1
|
979 //MovieHeader
|
eo301@1
|
980 u32 sizeMVHD = 108;
|
eo301@1
|
981 swap = byterevers (sizeMVHD);
|
eo301@1
|
982 moov->MovieHeaderBox.size = swap;
|
eo301@1
|
983 swap = byterevers ('mvhd');
|
eo301@1
|
984 moov->MovieHeaderBox.type = swap;
|
eo301@1
|
985 moov->MovieHeaderBox.version = 0;
|
eo301@1
|
986 swap = byterevers (clock);
|
eo301@1
|
987 moov->MovieHeaderBox.creation_time = swap;
|
eo301@1
|
988 moov->MovieHeaderBox.modification_time = swap;
|
eo301@1
|
989 swap = byterevers (1000);
|
eo301@1
|
990 moov->MovieHeaderBox.timescale = swap;
|
eo301@1
|
991 swap = byterevers (durationTrack);
|
eo301@1
|
992 moov->MovieHeaderBox.duration = swap;
|
eo301@1
|
993 swap = byterevers (0x00010000);
|
eo301@1
|
994 moov->MovieHeaderBox.rate = swap;
|
eo301@1
|
995 swap = byterevers (1);
|
eo301@0
|
996 moov->MovieHeaderBox.volume = 1;
|
eo301@0
|
997 moov->MovieHeaderBox.reserved=0;
|
eo301@0
|
998 moov->MovieHeaderBox.reserved2[0] = 0;
|
eo301@0
|
999 moov->MovieHeaderBox.reserved2[1] = 0;
|
eo301@1
|
1000 swap = byterevers (0x00010000);
|
eo301@1
|
1001 moov->MovieHeaderBox.matrix[0] = swap;
|
eo301@0
|
1002 moov->MovieHeaderBox.matrix[1] = 0;
|
eo301@0
|
1003 moov->MovieHeaderBox.matrix[2] = 0;
|
eo301@0
|
1004 moov->MovieHeaderBox.matrix[3] = 0;
|
eo301@1
|
1005 moov->MovieHeaderBox.matrix[4] = swap;
|
eo301@0
|
1006 moov->MovieHeaderBox.matrix[5] = 0;
|
eo301@0
|
1007 moov->MovieHeaderBox.matrix[6] = 0;
|
eo301@1
|
1008 moov->MovieHeaderBox.matrix[7] = 0;
|
eo301@1
|
1009 swap = byterevers (0x40000000);
|
eo301@0
|
1010 moov->MovieHeaderBox.matrix[8] = 0x40000000;
|
eo301@0
|
1011 moov->MovieHeaderBox.pre_defined[0] = 0;
|
eo301@0
|
1012 moov->MovieHeaderBox.pre_defined[1] = 0;
|
eo301@0
|
1013 moov->MovieHeaderBox.pre_defined[2] = 0;
|
eo301@0
|
1014 moov->MovieHeaderBox.pre_defined[3] = 0;
|
eo301@0
|
1015 moov->MovieHeaderBox.pre_defined[4] = 0;
|
eo301@0
|
1016 moov->MovieHeaderBox.pre_defined[5] = 0;
|
eo301@1
|
1017 swap = byterevers (totaltracks + 1);
|
eo301@1
|
1018 moov->MovieHeaderBox.next_track_ID = swap;
|
eo301@1
|
1019
|
eo301@1
|
1020 //MovieBox
|
eo301@1
|
1021 u32 sizeMOOV = sizeMVHD + sizeTRAK + sizePRCO + sizeRUCO + 8;
|
eo301@1
|
1022 swap = byterevers (sizeMOOV); //Size movie: Taking into account number tracks
|
eo301@1
|
1023 moov->size = swap;
|
eo301@1
|
1024 swap = byterevers ('moov');
|
eo301@1
|
1025 moov->type = swap;
|
eo301@0
|
1026 }
|
eo301@0
|
1027
|
eo301@1
|
1028 void writemoovbox(MovieBox moov, int numtrack,int totaltracks, FILE *imf){
|
eo301@1
|
1029 //Write movie box//
|
eo301@1
|
1030 fwrite(&moov.size, sizeof(u32), 1, imf);
|
eo301@1
|
1031 fwrite(&moov.type, sizeof(u32), 1, imf);
|
eo301@1
|
1032 //Movie header//
|
eo301@1
|
1033 fwrite(&moov.MovieHeaderBox, sizeof(moov.MovieHeaderBox), 1, imf);
|
eo301@1
|
1034 //Track container//
|
eo301@1
|
1035 for (numtrack = 0; numtrack < totaltracks; numtrack++) {
|
eo301@1
|
1036 fwrite(&moov.TrackBox[numtrack].size, sizeof(u32), 1, imf);
|
eo301@1
|
1037 fwrite(&moov.TrackBox[numtrack].type, sizeof(u32), 1, imf);
|
eo301@1
|
1038 //Trck header//
|
eo301@1
|
1039 fwrite(&moov.TrackBox[numtrack].TrackHeaderBox,
|
eo301@1
|
1040 sizeof(moov.TrackBox[numtrack].TrackHeaderBox), 1, imf);
|
eo301@1
|
1041 //Media Box//
|
eo301@1
|
1042 fwrite(&moov.TrackBox[numtrack].MediaBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1043 fwrite(&moov.TrackBox[numtrack].MediaBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1044 //Media Header//
|
eo301@1
|
1045 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaHeaderBox,
|
eo301@1
|
1046 sizeof(moov.TrackBox[numtrack].MediaBox.MediaHeaderBox), 1, imf);
|
eo301@1
|
1047 //Handler Box//
|
eo301@1
|
1048 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1049 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1050 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.version, sizeof(u32), 1, imf);
|
eo301@1
|
1051 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.pre_defined, sizeof(u32), 1, imf);
|
eo301@1
|
1052 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.handler_type, sizeof(u32), 1, imf);
|
eo301@1
|
1053 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[0], sizeof(u32), 1, imf);
|
eo301@1
|
1054 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[1], sizeof(u32), 1, imf);
|
eo301@1
|
1055 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[2], sizeof(u32), 1, imf);
|
eo301@1
|
1056 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[0], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1057 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[1], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1058 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[2], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1059 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[3], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1060 fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[4], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1061 //Media inforamtion box//
|
eo301@1
|
1062 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1063 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1064 //Sound media header//
|
eo301@1
|
1065 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox,
|
eo301@1
|
1066 sizeof(moov.TrackBox[numtrack].MediaBox.
|
eo301@1
|
1067 MediaInformationBox.SoundMediaHeaderBox), 1, imf);
|
eo301@1
|
1068 //Data reference//
|
eo301@1
|
1069 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox,
|
eo301@1
|
1070 sizeof(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox), 1, imf);
|
eo301@1
|
1071 //Sample table box//
|
eo301@1
|
1072 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1073 size, sizeof(u32), 1, imf);
|
eo301@1
|
1074 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1075 type, sizeof(u32), 1, imf);
|
eo301@1
|
1076
|
eo301@1
|
1077 int i, swap, pos;
|
eo301@1
|
1078 //Time to sample box//
|
eo301@1
|
1079 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1080 TimeToSampleBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1081 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1082 TimeToSampleBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1083 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1084 TimeToSampleBox.version, sizeof(u32), 1, imf);
|
eo301@1
|
1085 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1086 TimeToSampleBox.entry_count, sizeof(u32), 1, imf);
|
eo301@1
|
1087
|
eo301@1
|
1088 swap = byterevers(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1089 TimeToSampleBox.entry_count);
|
eo301@1
|
1090 pos = swap;
|
eo301@1
|
1091
|
eo301@1
|
1092 for (i=0; i<pos; i++) {
|
eo301@1
|
1093
|
eo301@1
|
1094 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1095 TimeToSampleBox.sample_count[i], sizeof(u32), 1, imf);
|
eo301@1
|
1096 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1097 TimeToSampleBox.sample_delta[i], sizeof(u32), 1, imf);
|
eo301@1
|
1098 }
|
eo301@1
|
1099
|
eo301@1
|
1100 //Sample description box//
|
eo301@1
|
1101 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1102 SampleDescriptionBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1103 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1104 SampleDescriptionBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1105 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1106 SampleDescriptionBox.version, sizeof(u32), 1, imf);
|
eo301@1
|
1107 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1108 SampleDescriptionBox.entry_count, sizeof(u32), 1, imf);
|
eo301@1
|
1109 //Audio Sample entry//
|
eo301@1
|
1110 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1111 SampleDescriptionBox.AudioSampleEntry.size, sizeof(u32), 1, imf);
|
eo301@1
|
1112 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1113 SampleDescriptionBox.AudioSampleEntry.type, sizeof(u32), 1, imf);
|
eo301@1
|
1114 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1115 SampleDescriptionBox.AudioSampleEntry.reserved[0], sizeof(unsigned char), 6, imf);
|
eo301@1
|
1116 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1117 SampleDescriptionBox.AudioSampleEntry.data_reference_index, sizeof(u16), 1, imf);
|
eo301@1
|
1118 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1119 SampleDescriptionBox.AudioSampleEntry.reserved2[0], sizeof(u32), 2, imf);
|
eo301@1
|
1120 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1121 SampleDescriptionBox.AudioSampleEntry.channelcount, sizeof(u16), 1, imf);
|
eo301@1
|
1122 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1123 SampleDescriptionBox.AudioSampleEntry.samplesize, sizeof(u16), 1, imf);
|
eo301@1
|
1124 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1125 SampleDescriptionBox.AudioSampleEntry.reserved3, sizeof(u32), 1, imf);
|
eo301@1
|
1126 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1127 SampleDescriptionBox.AudioSampleEntry.samplerate, sizeof(u32), 1, imf);
|
eo301@1
|
1128 //ESDBox//
|
eo301@1
|
1129 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1130 SampleDescriptionBox.AudioSampleEntry.ESbox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1131 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1132 SampleDescriptionBox.AudioSampleEntry.ESbox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1133 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1134 SampleDescriptionBox.AudioSampleEntry.ESbox.version, sizeof(u32), 1, imf);
|
eo301@1
|
1135 //ES Descriptor//
|
eo301@1
|
1136 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1137 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.tag
|
eo301@1
|
1138 , sizeof(unsigned char), 1, imf);
|
eo301@1
|
1139 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1140 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.length
|
eo301@1
|
1141 , sizeof(unsigned char), 1, imf);
|
eo301@1
|
1142 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1143 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.ES_ID
|
eo301@1
|
1144 , sizeof(u16), 1, imf);
|
eo301@1
|
1145 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1146 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.mix
|
eo301@1
|
1147 , sizeof(unsigned char), 1, imf);
|
eo301@1
|
1148 //Decoder Config//
|
eo301@1
|
1149 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1150 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1151 tag, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1152 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1153 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1154 length, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1155 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1156 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1157 objectProfileInd, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1158 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1159 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1160 mix, sizeof(u32), 1, imf);
|
eo301@1
|
1161 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1162 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1163 maxBitRate, sizeof(u32), 1, imf);
|
eo301@1
|
1164 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1165 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1166 avgBitrate, sizeof(u32), 1, imf);
|
eo301@1
|
1167 /* //DecoderSpecificInfo//
|
eo301@1
|
1168 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1169 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1170 DecoderSpecificInfo.tag, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1171 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1172 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1173 DecoderSpecificInfo.length, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1174 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1175 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1176 DecoderSpecificInfo.decSpecificInfoData[0], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1177 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1178 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor.
|
eo301@1
|
1179 DecoderSpecificInfo.decSpecificInfoData[1], sizeof(unsigned char), 1, imf);
|
eo301@1
|
1180 */ //SLConfig//
|
eo301@1
|
1181 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1182 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.SLConfigDescriptor.
|
eo301@1
|
1183 tag, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1184 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1185 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.SLConfigDescriptor.
|
eo301@1
|
1186 length, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1187 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1188 SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.SLConfigDescriptor.
|
eo301@1
|
1189 predifined, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1190
|
eo301@0
|
1191
|
eo301@1
|
1192 //Sample Size box//
|
eo301@1
|
1193 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1194 SampleSizeBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1195 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1196 SampleSizeBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1197 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1198 SampleSizeBox.version, sizeof(u32), 1, imf);
|
eo301@1
|
1199 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1200 SampleSizeBox.sample_size, sizeof(u32), 1, imf);
|
eo301@1
|
1201 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1202 SampleSizeBox.sample_count, sizeof(u32), 1, imf);
|
eo301@1
|
1203 swap = byterevers(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1204 SampleSizeBox.sample_count);
|
eo301@1
|
1205 for(i=0; i<swap; i++){
|
eo301@1
|
1206 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1207 SampleSizeBox.entry_size[i], sizeof(u32), 1, imf);
|
eo301@1
|
1208 }
|
eo301@1
|
1209
|
eo301@1
|
1210 //Sample to chunk box//
|
eo301@1
|
1211 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1212 SampleToChunk.size, sizeof(u32), 1, imf);
|
eo301@1
|
1213 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1214 SampleToChunk.type, sizeof(u32), 1, imf);
|
eo301@1
|
1215 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1216 SampleToChunk.version, sizeof(u32), 1, imf);
|
eo301@1
|
1217 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1218 SampleToChunk.entry_count, sizeof(u32), 1, imf);
|
eo301@1
|
1219 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1220 SampleToChunk.first_chunk, sizeof(u32), 1, imf);
|
eo301@1
|
1221 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1222 SampleToChunk.samples_per_chunk, sizeof(u32), 1, imf);
|
eo301@1
|
1223 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1224 SampleToChunk.sample_description_index, sizeof(u32), 1, imf);
|
eo301@0
|
1225
|
eo301@1
|
1226 //Chunk offset//
|
eo301@1
|
1227 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1228 ChunkOffsetBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1229 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1230 ChunkOffsetBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1231 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1232 ChunkOffsetBox.version, sizeof(u32), 1, imf);
|
eo301@1
|
1233 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1234 ChunkOffsetBox.entry_count, sizeof(u32), 1, imf);
|
eo301@1
|
1235 fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.
|
eo301@1
|
1236 ChunkOffsetBox.chunk_offset[numtrack], sizeof(u32), 1, imf);
|
eo301@1
|
1237 }
|
eo301@1
|
1238
|
eo301@1
|
1239 //Preset Container//
|
eo301@1
|
1240 fwrite(&moov.PresetContainerBox.size, sizeof(u32), 1, imf);
|
eo301@1
|
1241 fwrite(&moov.PresetContainerBox.type, sizeof(u32), 1, imf);
|
eo301@1
|
1242 fwrite(&moov.PresetContainerBox.num_preset, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1243 fwrite(&moov.PresetContainerBox.default_preset_ID, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1244 //Preset Box
|
eo301@1
|
1245 int j,i;
|
eo301@1
|
1246 for (i=0; i<moov.PresetContainerBox.num_preset; i++) {
|
eo301@1
|
1247 fwrite(&moov.PresetContainerBox.PresetBox[i].size, sizeof(u32), 1, imf);
|
eo301@1
|
1248 fwrite(&moov.PresetContainerBox.PresetBox[i].type, sizeof(u32), 1, imf);
|
eo301@1
|
1249 fwrite(&moov.PresetContainerBox.PresetBox[i].flags, sizeof(u32), 1, imf);
|
eo301@1
|
1250 fwrite(&moov.PresetContainerBox.PresetBox[i].preset_ID, sizeof(unsigned char), 1, imf);
|
eo301@1
|
1251 fwrite(&moov.PresetContainerBox.PresetBox[i].num_preset_elements,
|
eo301@1
|
1252 sizeof(unsigned char), 1, imf);
|
eo301@1
|
1253 for (j=0; j< moov.PresetContainerBox.PresetBox[i].num_preset_elements; j++) {
|
eo301@1
|
1254 fwrite(&moov.PresetContainerBox.PresetBox[i].presElemId[j].
|
eo301@1
|
1255 preset_element_ID, sizeof(u32), 1, imf);
|
eo301@1
|
1256 }
|
eo301@1
|
1257 fwrite(&moov.PresetContainerBox.PresetBox[i].preset_type , sizeof(unsigned char), 1, imf);
|
eo301@1
|
1258 fwrite(&moov.PresetContainerBox.PresetBox[i].preset_global_volume,
|
eo301@1
|
1259 sizeof(unsigned char), 1, imf);
|
eo301@1
|
1260 for (j=0; j< moov.PresetContainerBox.PresetBox[i].num_preset_elements; j++) {
|
eo301@1
|
1261 fwrite(&moov.PresetContainerBox.PresetBox[i].presVolumElem[j].
|
eo301@1
|
1262 preset_volume_element,sizeof(unsigned char), 1, imf);
|
eo301@1
|
1263 }
|
eo301@1
|
1264 for (j=0; j<14; j++) {
|
eo301@1
|
1265 fwrite(&moov.PresetContainerBox.PresetBox[i].preset_name[j], sizeof(char), 1, imf);
|
eo301@1
|
1266 }
|
eo301@1
|
1267 }
|
eo301@1
|
1268
|
eo301@1
|
1269 //Rules Container//
|
eo301@1
|
1270 fwrite(&moov.RulesContainer.size, sizeof(u32), 1, imf);
|
eo301@1
|
1271 fwrite(&moov.RulesContainer.type, sizeof(u32), 1, imf);
|
eo301@1
|
1272 fwrite(&moov.RulesContainer.num_selection_rules, sizeof(u16), 1, imf);
|
eo301@1
|
1273 fwrite(&moov.RulesContainer.num_mixing_rules, sizeof(u16), 1, imf);
|
eo301@1
|
1274 //Selection Rules//
|
eo301@1
|
1275 fwrite(&moov.RulesContainer.SelectionRules.size, sizeof(u32), 1, imf);
|
eo301@1
|
1276 fwrite(&moov.RulesContainer.SelectionRules.type, sizeof(u32), 1, imf);
|
eo301@1
|
1277 fwrite(&moov.RulesContainer.SelectionRules.version, sizeof(u32), 1, imf);
|
eo301@1
|
1278 fwrite(&moov.RulesContainer.SelectionRules.selection_rule_ID, sizeof(u16), 1, imf);
|
eo301@1
|
1279 fwrite(&moov.RulesContainer.SelectionRules.selection_rule_type,
|
eo301@1
|
1280 sizeof(unsigned char), 1, imf);
|
eo301@1
|
1281 fwrite(&moov.RulesContainer.SelectionRules.element_ID, sizeof(u32), 1, imf);
|
eo301@1
|
1282 for(i=0; i<14; i++){
|
eo301@1
|
1283 fwrite(&moov.RulesContainer.SelectionRules.rule_description[i],
|
eo301@1
|
1284 sizeof(char), 1, imf);
|
eo301@1
|
1285 }
|
eo301@1
|
1286 //Mixing Rules//
|
eo301@1
|
1287 fwrite(&moov.RulesContainer.MixingRules.size, sizeof(u32), 1, imf);
|
eo301@1
|
1288 fwrite(&moov.RulesContainer.MixingRules.type, sizeof(u32), 1, imf);
|
eo301@1
|
1289 fwrite(&moov.RulesContainer.MixingRules.version, sizeof(u32), 1, imf);
|
eo301@1
|
1290 fwrite(&moov.RulesContainer.MixingRules.mixing_rule_ID, sizeof(u16), 1, imf);
|
eo301@1
|
1291 fwrite(&moov.RulesContainer.MixingRules.mixing_type,sizeof(unsigned char), 1, imf);
|
eo301@1
|
1292 fwrite(&moov.RulesContainer.MixingRules.element_ID, sizeof(u32), 1, imf);
|
eo301@1
|
1293 fwrite(&moov.RulesContainer.MixingRules.key_elem_ID, sizeof(u32), 1, imf);
|
eo301@2
|
1294 for(i=0; i<17; i++){
|
eo301@1
|
1295 fwrite(&moov.RulesContainer.MixingRules.mix_description[i],
|
eo301@1
|
1296 sizeof(char), 1, imf);
|
eo301@1
|
1297 }
|
eo301@1
|
1298
|
eo301@1
|
1299 }
|
eo301@0
|
1300
|
eo301@1
|
1301 int byterevers(num){
|
eo301@1
|
1302 int swapped;
|
eo301@1
|
1303 swapped = ((num>>24)&0xff) | // move byte 3 to byte 0
|
eo301@1
|
1304 ((num<<8)&0xff0000) | // move byte 1 to byte 2
|
eo301@1
|
1305 ((num>>8)&0xff00) | // move byte 2 to byte 1
|
eo301@1
|
1306 ((num<<24)&0xff000000); // byte 0 to byte 3
|
eo301@1
|
1307 return swapped;
|
eo301@1
|
1308 }
|
eo301@0
|
1309
|
eo301@1
|
1310
|
eo301@1
|
1311
|