annotate IM_AF Encoder/IM_AM Encoder/main.c @ 8:c51c0b844461 tip

Ok
author Eugenio Oñate Hospital <eo301@eecs.qmul.ac.uk>
date Tue, 28 Aug 2012 12:20:04 +0100
parents 1636a6250528
children
rev   line source
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