eo301@0: // eo301@0: // main.c eo301@0: // IM_AM Enco§er eo301@0: // eo301@0: // Created by eugenio oñate hospital on 14/06/12. eo301@0: // Copyright (c) 2012 QM. All rights reserved. eo301@0: // eo301@8: //File input/output eo301@0: #include eo301@8: //Standard library: numeric conversion, memory allocation... eo301@0: #include eo301@8: //Operations with strings eo301@0: #include eo301@8: //Get the creation time: clock eo301@0: #include eo301@0: #include "IM_AF Encoder.h" eo301@0: eo301@0: /*Prototype*/ eo301@0: eo301@0: void filetypebx(FileTypeBox *ftyp); eo301@1: int mdatbox(MediaDataBox *mdat, int, FILE *imf, FILE *song, int); eo301@1: void moovheaderbox(MovieBox *moov, int, int, int, int, int, int); eo301@1: int trackstructure(MovieBox *moov, int, int, int, int, char name[20]); eo301@1: int samplecontainer(MovieBox *moov, int, int, char name[20]); eo301@1: int sampledescription(MovieBox *moov, int); eo301@1: int presetcontainer(MovieBox *moov, int,nametrack namet); eo301@1: int rulescontainer(MovieBox *moov); eo301@1: void writemoovbox(MovieBox moov, int numtrack,int totaltracks, FILE *imf); eo301@1: int readTrack(MovieBox *moov, int, char name[20]); eo301@1: int byterevers(int); eo301@0: eo301@0: eo301@0: int main () eo301@0: { eo301@0: //variables eo301@0: FileTypeBox ftyp; eo301@0: MediaDataBox mdat; eo301@0: MovieBox moov; eo301@1: // MetaBox meta; eo301@1: nametrack namet; eo301@1: eo301@0: FILE *imf; eo301@1: int numtrack,totaltracks, sizemdat, durationTrack; eo301@1: eo301@0: /* Obtain current time as seconds elapsed since the Epoch. */ eo301@0: time_t clock = time(NULL); eo301@0: eo301@2: printf("\nWelcome to the IM_AF encoder\n"); eo301@0: printf("This program will allow you to create an IM_AF file.\n"); eo301@0: printf("How many tracks there will be in your IMAF file?\n"); eo301@0: scanf("%d",&totaltracks); eo301@0: fflush(stdin); eo301@0: while (totaltracks > maxtracks) { eo301@2: printf("Sorry, for this version the number maximum ot tracks is %d\n",maxtracks); eo301@0: printf("How many tracks there will be in your IMAF file:\n"); eo301@0: scanf("%d",&totaltracks); eo301@0: } eo301@0: eo301@0: //Create the file eo301@0: imf = fopen ("/Users/eugin/Desktop/IM_AF Encoder/IM_AM Encoder/example1.ima","wb"); eo301@0: if (imf == NULL) { eo301@0: printf("Error opening input file\n"); eo301@0: system("pause"); eo301@0: exit(1); eo301@0: } eo301@0: eo301@0: //Define the File Type Box eo301@0: filetypebx(&ftyp); eo301@0: fwrite(&ftyp, sizeof(FileTypeBox),1, imf); eo301@0: eo301@0: //Media Data Box - Contains the audio eo301@1: FILE *song; eo301@2: char nametrack[20]; eo301@2: //Specify the path directory where there are the songs. eo301@2: //If change folder, change the path here (3 times) and in readTrack function!!! eo301@8: char pathdir[60] ="/Users/eugin/Desktop/IM_AF Encoder/Electro/"; eo301@1: int numtr, ex = 0; eo301@1: for (numtr=0; numtrsize = swap; eo301@1: swap = byterevers ('ftyp'); eo301@1: ftyp->type = swap; eo301@1: swap = byterevers ('im03'); eo301@1: ftyp->major_brand = swap; eo301@1: ftyp->minor_version = 0; eo301@1: swap = byterevers ('im03'); eo301@1: ftyp->compatible_brands[0] = swap; eo301@1: swap = byterevers ('isom'); eo301@1: ftyp->compatible_brands[1] = swap; eo301@1: } eo301@1: eo301@1: int mdatbox(MediaDataBox *mdat, int totaltracks, FILE *imf, FILE *song, int numtr){ eo301@1: eo301@1: int d, cnt, j, find = 0; eo301@2: int dat = 0, dat1 = 0, dat2 = 0, dat3 = 0; eo301@1: u32 size = 0, swap, sizeMDAT =0; eo301@2: //Positonate the pointer at the end of the file to know the size of it eo301@1: fseek(song, 0, SEEK_END); eo301@1: size = ftell(song); eo301@2: //Positionate the pointer at first eo301@1: fseek(song, 0, SEEK_SET); eo301@1: d=0; eo301@1: cnt = 0; eo301@2: //Find the header of the first frame (the beginning), when find it d=1 and jump out the loop. eo301@2: // The header is 32 bytes. We find in groups of 8 bytes eo301@2: // Contemplate all possible options of headers eo301@1: while (d == 0) { eo301@1: find = 0; eo301@1: fread(&dat, sizeof(unsigned char), 1, song); eo301@1: cnt++; eo301@1: eo301@1: if (dat == 0xFF) { eo301@2: cnt++; // cnt : stores the position of the pointer. eo301@1: fread(&dat1, sizeof(unsigned char), 1, song); eo301@1: cnt++; eo301@1: fread(&dat2, sizeof(unsigned char), 1, song); eo301@1: cnt++; eo301@1: fread(&dat3, sizeof(unsigned char), 1, song); eo301@1: if (dat1 == 0xFB && dat2 == 146 && dat3 == 64 ) { eo301@2: find = 1; // find: if the header is found eo301@2: d=1; // d: jump out the loop eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 146 && dat3 == 96 ) { eo301@1: d=1; eo301@1: find = 1; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 144 && dat3 == 64 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 144 && dat3 == 96 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 146 && dat3 == 100 ) { eo301@1: d=1; eo301@1: find = 1; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 144 && dat3 == 100 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 146 && dat3 == 64 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 146 && dat3 == 96 ) { eo301@1: d=1; eo301@1: find = 1; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 144 && dat3 == 64 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 144 && dat3 == 96 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 146 && dat3 == 100 ) { eo301@1: d=1; eo301@1: find = 1; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 144 && dat3 == 100 ) { eo301@1: find = 1; eo301@1: d=1; eo301@1: } eo301@1: if (find == 0) { eo301@1: fseek(song, -3, SEEK_CUR); eo301@1: cnt = cnt - 3; eo301@1: } eo301@1: } eo301@1: if (cnt == size) { eo301@1: d = 1; eo301@1: } eo301@1: } eo301@2: size = size - (cnt - 4); // Calculate the size of the samples. size = pos. end of file - pos. first header. eo301@1: if (numtr == 0) { eo301@2: sizeMDAT = size*totaltracks + 8; // size of the whole media box eo301@1: swap = byterevers(sizeMDAT); eo301@1: fwrite(&swap, sizeof(u32), 1, imf); eo301@1: swap = byterevers('mdat'); eo301@1: mdat->type = swap; eo301@1: fwrite(&mdat->type, sizeof(u32), 1, imf); eo301@1: } eo301@1: fseek(song, cnt - 4, SEEK_SET); eo301@2: for (j=0; jdata, sizeof(char), 1, song); eo301@1: fwrite(&mdat->data, sizeof(char), 1, imf); eo301@1: } eo301@1: fclose(song); eo301@1: eo301@1: return size; eo301@1: } eo301@1: eo301@1: int samplecontainer(MovieBox *moov, int numtrack, int sizemdat, char name[20]){ eo301@1: eo301@1: u32 sizeSTSD, sizeSTSZ, swap, num_samples, dat=0; eo301@1: eo301@1: //Sample Description Box// eo301@2: sizeSTSD = sampledescription(moov, numtrack); eo301@2: eo301@1: //Sample size box// eo301@1: swap = byterevers('stsz'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleSizeBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleSizeBox.version = 0; eo301@2: //Read Track: Frame size and Decoder Times eo301@1: num_samples = readTrack(moov, numtrack, name); eo301@1: sizeSTSZ = num_samples*4 + 20; eo301@1: swap = byterevers(sizeSTSZ); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleSizeBox.size = swap; eo301@1: eo301@1: //Time To Sample Box// eo301@1: u32 sizetime, sizeSTTS; eo301@1: sizetime = byterevers(moov->TrackBox[numtrack].MediaBox.MediaInformationBox. eo301@1: SampleTableBox.TimeToSampleBox.entry_count); eo301@1: sizeSTTS = 16 + sizetime*4*2; eo301@1: swap = byterevers(sizeSTTS); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.size = swap; eo301@1: swap = byterevers('stts'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.version = 0; eo301@1: eo301@1: //Sample To Chunk// eo301@1: u32 sizeSTSC = 28; eo301@1: swap = byterevers(sizeSTSC); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.size = swap; eo301@1: swap = byterevers('stsc'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.version = 0; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.entry_count = swap; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.first_chunk = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.samples_per_chunk = moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_count; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleToChunk.sample_description_index = swap; eo301@1: eo301@1: //Chunk Offset Box// eo301@1: u32 sizeSTCO = 20; eo301@1: swap = byterevers(sizeSTCO); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: ChunkOffsetBox.size = swap; eo301@1: swap = byterevers('stco'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: ChunkOffsetBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: ChunkOffsetBox.version = 0; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: ChunkOffsetBox.entry_count = swap; eo301@1: dat = 32 + sizemdat*numtrack; eo301@1: swap = byterevers(dat); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: ChunkOffsetBox.chunk_offset[numtrack] = swap; eo301@1: eo301@1: //Sample Table Box // eo301@1: u32 sizeSTBL = 8 + sizeSTSD + sizeSTSZ + sizeSTSC + sizeSTCO + sizeSTTS; eo301@1: swap = byterevers(sizeSTBL); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.size = swap; eo301@1: swap = byterevers('stbl'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.type =swap; eo301@1: eo301@1: return sizeSTBL; eo301@1: } eo301@1: eo301@1: int sampledescription(MovieBox *moov, int numtrack){ eo301@1: u32 swap, sizeESD = 35; eo301@1: swap = byterevers(sizeESD); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.size = swap; eo301@1: swap = byterevers('esds'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.version = 0; eo301@1: eo301@1: //ES Descriptor// eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.tag = 3; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.length = 21; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.ES_ID = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.mix = 0; eo301@1: eo301@1: //Decoder config descriptor// eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: DecoderConfigDescriptor.tag = 4; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: DecoderConfigDescriptor.length = 13; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: DecoderConfigDescriptor.objectProfileInd = 0x6B; eo301@1: swap = byterevers(0x150036B0); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: DecoderConfigDescriptor.mix = swap; eo301@1: swap = byterevers(128); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: DecoderConfigDescriptor.maxBitRate = swap; eo301@1: swap = byterevers(128); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: DecoderConfigDescriptor.avgBitrate = swap; eo301@1: eo301@1: //SLConfig Descriptor// eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: SLConfigDescriptor.tag = 6; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: SLConfigDescriptor.length = 1; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. eo301@1: SLConfigDescriptor.predifined = 2; eo301@1: eo301@1: //Audio Sample Entry// eo301@1: u32 sizeMP4a = 36 + sizeESD; eo301@1: swap = byterevers(sizeMP4a); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.size = swap; eo301@1: swap = byterevers('mp4a'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.type =swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved[0] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved[1] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved[2] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved[3] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved[4] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved[5] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.data_reference_index = 256; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved2[0] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved2[1] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.channelcount = 512; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.samplesize = 4096; // 16 bits eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.reserved3 = 0; eo301@1: swap = 44100 << 16; eo301@1: swap = byterevers(swap); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.AudioSampleEntry.samplerate = swap; eo301@1: eo301@1: //Sample description box // eo301@1: u32 sizeSTSD = 16 + sizeMP4a; eo301@1: swap = byterevers(sizeSTSD); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.size = swap; eo301@1: swap = byterevers('stsd'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.version = 0; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleDescriptionBox.entry_count = swap; eo301@1: eo301@1: return sizeSTSD; eo301@1: } eo301@1: eo301@1: int readTrack (MovieBox *moov, int numtrack, char name[20]){ eo301@1: eo301@1: FILE *song; eo301@1: int d=0, cnt = 0, i=0, j=0, cnt2 = 0, find = 0, swap, num_entr = 0; eo301@2: int dat = 0, dat1 = 0, dat2 = 0, dat3 = 0, num_frame = 0, end =0, pos = 0; eo301@2: u32 size[9000]; eo301@2: //Change path directory here eo301@8: char pathdir[60] = "/Users/eugin/Desktop/IM_AF Encoder/Electro/"; eo301@1: strcat(pathdir, name); eo301@2: //Open the audio file with the name introduced by the user eo301@1: song = fopen (pathdir,"rb"); eo301@1: if (song == NULL) { eo301@1: printf("Error opening input file\n"); eo301@1: system("pause"); eo301@1: exit(1); eo301@1: } eo301@2: //Calculate the size of the track eo301@1: fseek(song, 0, SEEK_END); eo301@1: end = ftell(song); eo301@1: fseek(song, 0, SEEK_SET); eo301@1: d=0, i=0; eo301@2: //Search for each frame one by one, and extratcs the information eo301@1: while (d == 0) { eo301@1: find = 0; eo301@1: fread(&dat, sizeof(unsigned char), 1, song); eo301@1: cnt++; eo301@1: eo301@1: if (dat == 0xFF) { eo301@1: cnt++; eo301@1: fread(&dat1, sizeof(unsigned char), 1, song); eo301@1: cnt++; eo301@1: fread(&dat2, sizeof(unsigned char), 1, song); eo301@1: cnt++; eo301@1: fread(&dat3, sizeof(unsigned char), 1, song); eo301@1: if (dat1 == 0xFB && dat2 == 146 && dat3 == 64 ) { eo301@2: pos = cnt - 4; //Pos of the beginning of the frame eo301@2: size[num_frame] = pos - cnt2; //Size of one frame eo301@2: cnt2 = pos; //Pos of the next frame eo301@1: find = 1; eo301@2: num_frame ++; //Number of frames eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 146 && dat3 == 96 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 144 && dat3 == 64 ) { eo301@2: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 144 && dat3 == 96 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 146 && dat3 == 100 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFB && dat2 == 144 && dat3 == 100 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 146 && dat3 == 64 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 146 && dat3 == 96 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 144 && dat3 == 64 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 144 && dat3 == 96 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 146 && dat3 == 100 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@1: if (dat1 == 0xFA && dat2 == 144 && dat3 == 100 ) { eo301@1: pos = cnt - 4; eo301@2: size[num_frame] = pos - cnt2; eo301@1: cnt2 = pos; eo301@1: find = 1; eo301@2: num_frame ++; eo301@1: } eo301@2: if (find == 0) { //In case it does not find the header. eo301@2: //It keeps reading next data without jump any position eo301@1: fseek(song, -3, SEEK_CUR); eo301@1: cnt = cnt - 3; eo301@1: } eo301@1: } eo301@1: eo301@1: if (cnt == end) { eo301@1: pos = cnt; eo301@2: size[num_frame] = pos - cnt2; eo301@1: d = 1; eo301@1: } eo301@1: } eo301@2: eo301@1: //Save Samples size// eo301@2: swap = byterevers(num_frame); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleSizeBox.sample_count = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleSizeBox.sample_size = 0; eo301@1: eo301@2: for (i=0; i< num_frame; i++) { eo301@1: swap = byterevers(size[i+1]); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: SampleSizeBox.entry_size[i] = swap; eo301@1: } eo301@1: eo301@2: //Save Decoding Times// eo301@2: //Writes manually the duration of each frame. eo301@2: //Follows the following structure: eo301@2: // 7 frames of 26 ms eo301@2: // 1 frame of 27 ms eo301@2: // ... eo301@2: // And each 13 rows it writes eo301@2: // 8 frames of 26 ms eo301@2: // 1 frame of 27 ms eo301@2: //It is done for adjusting the different durations of each frame. eo301@2: // as they vary between 26.125 ms and 26.075 ms eo301@1: eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_count[0] = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_delta[0] =0; eo301@1: int t=0,k=1, l =0; eo301@1: num_entr = 1; eo301@1: j = 0; eo301@2: for (i = 1; i< num_frame; i++) { eo301@1: if (j == 8 && l == 0) { eo301@1: swap = byterevers(7); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_count[num_entr] = swap; eo301@1: swap = byterevers(26); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_delta[num_entr] =swap; eo301@1: num_entr ++; eo301@1: eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_count[num_entr] = swap; eo301@1: swap = byterevers(27); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_delta[num_entr] =swap; eo301@1: num_entr++; eo301@1: j=0; eo301@1: dat = i; eo301@1: if (k == 6 && t == 0) { eo301@1: l = 1; eo301@1: t = 1; eo301@1: k = 1; eo301@1: } eo301@1: if (k == 6 && t ==1) { eo301@1: l = 1; eo301@1: k = 1; eo301@1: } eo301@1: k++; eo301@1: } eo301@1: eo301@1: if (j == 9 && l == 1) { eo301@1: eo301@1: swap = byterevers(8); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_count[num_entr] = swap; eo301@1: swap = byterevers(26); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_delta[num_entr] =swap; eo301@1: num_entr ++; eo301@1: eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_count[num_entr] = swap; eo301@1: swap = byterevers(27); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_delta[num_entr] =swap; eo301@1: num_entr++; eo301@1: j=0; eo301@1: dat = i; eo301@1: l = 0; eo301@1: } eo301@1: j++; eo301@1: } eo301@1: eo301@2: dat = num_frame - dat; eo301@1: eo301@1: swap = byterevers(dat); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_count[num_entr] = swap; eo301@1: swap = byterevers(26); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.sample_delta[num_entr] =swap; eo301@1: num_entr++; eo301@1: swap = byterevers(num_entr); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.entry_count = swap; eo301@1: eo301@1: fclose(song); eo301@2: return num_frame; eo301@0: eo301@0: } eo301@0: eo301@1: int trackstructure (MovieBox *moov, int numtrack, int clock, eo301@1: int durationTrack, int sizemdat, char name[20]){ eo301@1: int swap; eo301@1: eo301@1: //Sample Table Box eo301@1: int sizeSTBL = 0; eo301@1: sizeSTBL = samplecontainer(moov, numtrack,sizemdat, name); eo301@0: eo301@1: //Data Entry Url Box eo301@1: u32 sizeURL = 12; eo301@1: swap = byterevers(sizeURL); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.DataEntryUrlBox.size = swap; eo301@1: swap = byterevers('url '); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.DataEntryUrlBox.type = swap; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.DataEntryUrlBox.flags = swap; // =1 Track in same file as movie atom. eo301@1: eo301@1: //Data Reference eo301@1: u32 sizeDREF = sizeURL+ 16; eo301@1: swap = byterevers(sizeDREF); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.size = swap; eo301@1: swap = byterevers('dref'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.flags = 0; eo301@1: swap = byterevers(1); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. eo301@1: DataReferenceBox.entry_count = swap; eo301@1: eo301@1: //Data information Box// eo301@1: u32 sizeDINF = sizeDREF + 8; eo301@1: swap = byterevers(sizeDINF); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.size = swap; eo301@1: swap = byterevers('dinf'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.type = swap; eo301@1: eo301@1: //Sound Header Box // eo301@1: u32 sizeSMHD = 16; eo301@1: swap = byterevers(sizeSMHD); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.size = swap; eo301@1: swap = byterevers('smhd'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.version = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.balance = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.reserved = 0; eo301@1: eo301@1: //Media Information Box// eo301@1: u32 sizeMINF = sizeDINF + sizeSMHD + sizeSTBL + 8; eo301@1: swap = byterevers(sizeMINF); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.size = swap; eo301@1: swap = byterevers('minf'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaInformationBox.type = swap; eo301@1: eo301@1: //Handler Box// eo301@1: u32 sizeHDLR = 37; eo301@1: swap = byterevers(sizeHDLR); eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.size = swap; eo301@1: swap = byterevers('hdlr'); eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.version = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.pre_defined = 0; eo301@1: swap = byterevers('soun'); eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.handler_type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[0] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[1] = 0; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[2] = 0; eo301@1: //swap = byterevers('soun'); eo301@1: //moov->TrackBox[numtrack].MediaBox.HandlerBox.data = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.data[0] = 's'; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.data[1] = 'o'; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.data[2] = 'u'; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.data[3] = 'n'; eo301@1: moov->TrackBox[numtrack].MediaBox.HandlerBox.data[4] = '\0'; eo301@1: eo301@1: //Media Header Box// eo301@1: u32 sizeMDHD = 32; eo301@1: swap = byterevers(sizeMDHD); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.size = swap; eo301@1: swap = byterevers('mdhd'); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.type = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.version = 0; eo301@1: swap = byterevers(clock); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.creation_time = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.modification_time = swap; eo301@1: swap = byterevers(1000); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.timescale = swap; eo301@1: swap = byterevers(durationTrack); eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.duration = swap; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.language = 0xC455; eo301@1: moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.pre_defined = 0; eo301@1: eo301@1: //Media Box// eo301@1: u32 sizeMDIA = sizeMDHD + sizeHDLR + sizeMINF + 8; eo301@1: swap = byterevers(sizeMDIA); eo301@1: moov->TrackBox[numtrack].MediaBox.size = swap; eo301@1: swap = byterevers('mdia'); eo301@1: moov->TrackBox[numtrack].MediaBox.type = swap; eo301@1: eo301@1: //Track Header// eo301@1: u32 sizeTKHD = 92; eo301@1: swap = byterevers (sizeTKHD); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.size = swap; eo301@1: swap = byterevers ('tkhd'); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.type = swap ; eo301@1: swap = byterevers (0x00000006); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.version = swap; eo301@1: swap = byterevers (clock); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.creation_time = swap; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.modification_time = swap; eo301@1: swap = byterevers (numtrack+1); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.track_ID = swap; //From 0x00000001 - 0x7FFFFFFF (dec 2147483647) eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.reserved = 0; eo301@1: swap = byterevers (durationTrack); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.duration = swap; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.reserved2[0] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.reserved2[1] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.layer = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.alternate_group = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.volume = 0x1; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.reserved3 = 0; eo301@1: swap = byterevers (0x00010000); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[0] = swap; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[1] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[2] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[3] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[4] = swap; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[5] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[6] = 0; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[7] = 0; eo301@1: swap = byterevers(0x40000000); eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.matrix[8] = swap; eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.width = 0; //just for video eo301@1: moov->TrackBox[numtrack].TrackHeaderBox.height = 0; //just for video eo301@1: eo301@1: //Track container eo301@1: u32 sizeTRAK = sizeTKHD + sizeMDIA + 8; eo301@1: swap = byterevers (sizeTRAK); // Size of one track eo301@1: moov->TrackBox[numtrack].size = swap; eo301@1: swap = byterevers ('trak'); eo301@1: moov->TrackBox[numtrack].type = swap; eo301@1: return sizeTRAK; eo301@1: eo301@1: } eo301@1: eo301@1: int presetcontainer(MovieBox *moov, int totaltracks, nametrack namet){ eo301@1: eo301@1: int swap, i,j,flag, vol=0; eo301@1: unsigned char numpres=0, prestype=0,defaultPreset; eo301@1: char namepres1[14] = "static_track "; // 13 eo301@1: u32 sizePRST = 0; eo301@1: eo301@2: printf("\nPresets:\n"); eo301@1: printf("Static track volume preset: invariant volume related to each track \n"); eo301@1: printf(" --------------------------------------\n"); eo301@1: numpres = 1; eo301@2: eo301@1: //Preset Box// eo301@1: for (i=0; iPresetContainerBox.PresetBox[i].preset_name, namepres1); eo301@1: sizePRST = 16 + 14 + 4*totaltracks + totaltracks; eo301@1: swap = byterevers(sizePRST); eo301@1: moov->PresetContainerBox.PresetBox[i].size = swap; eo301@1: prestype = 0; eo301@1: eo301@1: moov->PresetContainerBox.PresetBox[i].num_preset_elements = totaltracks; eo301@1: swap = byterevers('prst'); eo301@1: moov->PresetContainerBox.PresetBox[i].type = swap; eo301@1: eo301@1: flag = 0x02; // Display Enable Edit Disable eo301@1: swap = byterevers(flag); eo301@1: moov->PresetContainerBox.PresetBox[i].flags = swap; eo301@1: eo301@1: moov->PresetContainerBox.PresetBox[i].preset_ID = i+1; eo301@1: eo301@1: moov->PresetContainerBox.PresetBox[i].preset_type = prestype; eo301@1: moov->PresetContainerBox.PresetBox[i].preset_global_volume = 100; eo301@1: eo301@1: for (j=0; jPresetContainerBox.PresetBox[i].presElemId[j].preset_element_ID = swap; eo301@1: } eo301@2: //Enter values (two options): eo301@2: // In loop eo301@1: for (j=0; jPresetContainerBox.PresetBox[i].presVolumElem[j].preset_volume_element = vol; //*0.02 eo301@1: } eo301@1: eo301@2: // Or one by one eo301@2: /* moov->PresetContainerBox.PresetBox[i].presVolumElem[0].preset_volume_element = 20; eo301@2: printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox. eo301@2: PresetBox[i].presVolumElem[0].preset_volume_element*2); eo301@2: moov->PresetContainerBox.PresetBox[i].presVolumElem[1].preset_volume_element = 40; eo301@2: printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox. eo301@2: PresetBox[i].presVolumElem[1].preset_volume_element*2); eo301@2: moov->PresetContainerBox.PresetBox[i].presVolumElem[2].preset_volume_element = 20; eo301@2: printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox. eo301@2: PresetBox[i].presVolumElem[2].preset_volume_element*2); eo301@2: moov->PresetContainerBox.PresetBox[i].presVolumElem[3].preset_volume_element = 50; eo301@2: printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox. eo301@2: PresetBox[i].presVolumElem[3].preset_volume_element*2); eo301@2: moov->PresetContainerBox.PresetBox[i].presVolumElem[4].preset_volume_element = 52; eo301@2: printf("Enter volume for %s = %d\n",namet[j].title,moov->PresetContainerBox. eo301@2: PresetBox[i].presVolumElem[4].preset_volume_element*2); eo301@2: */ } eo301@1: eo301@1: //Preset Container// eo301@1: u32 sizePRCO = sizePRST + 10; eo301@1: swap = byterevers(sizePRCO); eo301@1: moov->PresetContainerBox.size = swap; eo301@1: swap = byterevers('prco'); eo301@1: moov->PresetContainerBox.type = swap; eo301@1: defaultPreset = 1; eo301@1: moov->PresetContainerBox.default_preset_ID = defaultPreset; // Indicates initial preset activated. eo301@1: moov->PresetContainerBox.num_preset = numpres; eo301@1: eo301@1: return sizePRCO; eo301@1: } eo301@1: eo301@1: int rulescontainer(MovieBox *moov){ eo301@1: int swap; eo301@1: u32 sizeRUSC, elementID, key_elem, sizeRUMX; eo301@1: eo301@1: moov->RulesContainer.num_selection_rules = 256; //u16 invert eo301@2: // moov->RulesContainer.num_selection_rules = 0; eo301@2: moov->RulesContainer.num_mixing_rules = 256; //u16 invert eo301@1: eo301@1: //Selection Rules eo301@1: sizeRUSC = 19 + 14; eo301@2: // sizeRUSC = 0; eo301@1: swap = byterevers(sizeRUSC); eo301@1: moov->RulesContainer.SelectionRules.size = swap; eo301@1: swap = byterevers('rusc'); eo301@1: moov->RulesContainer.SelectionRules.type = swap; eo301@1: moov->RulesContainer.SelectionRules.version = 0; eo301@1: moov->RulesContainer.SelectionRules.selection_rule_ID = 256; eo301@1: moov->RulesContainer.SelectionRules.selection_rule_type = 2; eo301@2: elementID = 3; eo301@1: swap = byterevers(elementID); eo301@1: moov->RulesContainer.SelectionRules.element_ID = swap; eo301@1: strcpy(moov->RulesContainer.SelectionRules.rule_description,"Not mute rule"); eo301@2: printf("\nRules:\n"); eo301@2: printf("Rule 1: Not mute for channel %d\n",elementID); eo301@1: eo301@1: //Mixing Rule eo301@2: sizeRUMX = 23 + 17; eo301@1: swap = byterevers(sizeRUMX); eo301@1: moov->RulesContainer.MixingRules.size = swap; eo301@1: swap = byterevers('rumx'); eo301@1: moov->RulesContainer.MixingRules.type = swap; eo301@1: moov->RulesContainer.MixingRules.version = 0; eo301@2: moov->RulesContainer.MixingRules.mixing_rule_ID = 512; eo301@2: // moov->RulesContainer.MixingRules.mixing_type = 0; // Equivalence rule eo301@2: moov->RulesContainer.MixingRules.mixing_type = 2; // Upper rule eo301@1: elementID = 1; eo301@1: swap = byterevers(elementID); eo301@1: moov->RulesContainer.MixingRules.element_ID = swap; eo301@1: key_elem = 2; eo301@1: swap = byterevers(key_elem); eo301@1: moov->RulesContainer.MixingRules.key_elem_ID = swap; eo301@2: strcpy(moov->RulesContainer.MixingRules.mix_description, "Lower rule"); eo301@2: printf("Rule 2: Lower rule between channel %d and %d\n",elementID,key_elem); eo301@2: // strcpy(moov->RulesContainer.MixingRules.mix_description, "Equivalence rule"); eo301@2: // printf("Rule 2: Equivalence rule\n"); eo301@1: eo301@1: //Rule container eo301@1: u32 sizeRUCO = 12 + sizeRUSC + sizeRUMX; eo301@1: swap = byterevers(sizeRUCO); eo301@1: moov->RulesContainer.size = swap; eo301@1: swap = byterevers('ruco'); eo301@1: moov->RulesContainer.type = swap; eo301@1: eo301@1: return sizeRUCO; eo301@1: } eo301@1: eo301@1: void moovheaderbox (MovieBox *moov,int clock, int sizeTRAK, int sizePRCO, int totaltracks, eo301@1: int durationTrack, int sizeRUCO){ eo301@1: int swap; eo301@1: eo301@1: //MovieHeader eo301@1: u32 sizeMVHD = 108; eo301@1: swap = byterevers (sizeMVHD); eo301@1: moov->MovieHeaderBox.size = swap; eo301@1: swap = byterevers ('mvhd'); eo301@1: moov->MovieHeaderBox.type = swap; eo301@1: moov->MovieHeaderBox.version = 0; eo301@1: swap = byterevers (clock); eo301@1: moov->MovieHeaderBox.creation_time = swap; eo301@1: moov->MovieHeaderBox.modification_time = swap; eo301@1: swap = byterevers (1000); eo301@1: moov->MovieHeaderBox.timescale = swap; eo301@1: swap = byterevers (durationTrack); eo301@1: moov->MovieHeaderBox.duration = swap; eo301@1: swap = byterevers (0x00010000); eo301@1: moov->MovieHeaderBox.rate = swap; eo301@1: swap = byterevers (1); eo301@0: moov->MovieHeaderBox.volume = 1; eo301@0: moov->MovieHeaderBox.reserved=0; eo301@0: moov->MovieHeaderBox.reserved2[0] = 0; eo301@0: moov->MovieHeaderBox.reserved2[1] = 0; eo301@1: swap = byterevers (0x00010000); eo301@1: moov->MovieHeaderBox.matrix[0] = swap; eo301@0: moov->MovieHeaderBox.matrix[1] = 0; eo301@0: moov->MovieHeaderBox.matrix[2] = 0; eo301@0: moov->MovieHeaderBox.matrix[3] = 0; eo301@1: moov->MovieHeaderBox.matrix[4] = swap; eo301@0: moov->MovieHeaderBox.matrix[5] = 0; eo301@0: moov->MovieHeaderBox.matrix[6] = 0; eo301@1: moov->MovieHeaderBox.matrix[7] = 0; eo301@1: swap = byterevers (0x40000000); eo301@0: moov->MovieHeaderBox.matrix[8] = 0x40000000; eo301@0: moov->MovieHeaderBox.pre_defined[0] = 0; eo301@0: moov->MovieHeaderBox.pre_defined[1] = 0; eo301@0: moov->MovieHeaderBox.pre_defined[2] = 0; eo301@0: moov->MovieHeaderBox.pre_defined[3] = 0; eo301@0: moov->MovieHeaderBox.pre_defined[4] = 0; eo301@0: moov->MovieHeaderBox.pre_defined[5] = 0; eo301@1: swap = byterevers (totaltracks + 1); eo301@1: moov->MovieHeaderBox.next_track_ID = swap; eo301@1: eo301@1: //MovieBox eo301@1: u32 sizeMOOV = sizeMVHD + sizeTRAK + sizePRCO + sizeRUCO + 8; eo301@1: swap = byterevers (sizeMOOV); //Size movie: Taking into account number tracks eo301@1: moov->size = swap; eo301@1: swap = byterevers ('moov'); eo301@1: moov->type = swap; eo301@0: } eo301@0: eo301@1: void writemoovbox(MovieBox moov, int numtrack,int totaltracks, FILE *imf){ eo301@1: //Write movie box// eo301@1: fwrite(&moov.size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.type, sizeof(u32), 1, imf); eo301@1: //Movie header// eo301@1: fwrite(&moov.MovieHeaderBox, sizeof(moov.MovieHeaderBox), 1, imf); eo301@1: //Track container// eo301@1: for (numtrack = 0; numtrack < totaltracks; numtrack++) { eo301@1: fwrite(&moov.TrackBox[numtrack].size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].type, sizeof(u32), 1, imf); eo301@1: //Trck header// eo301@1: fwrite(&moov.TrackBox[numtrack].TrackHeaderBox, eo301@1: sizeof(moov.TrackBox[numtrack].TrackHeaderBox), 1, imf); eo301@1: //Media Box// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.type, sizeof(u32), 1, imf); eo301@1: //Media Header// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaHeaderBox, eo301@1: sizeof(moov.TrackBox[numtrack].MediaBox.MediaHeaderBox), 1, imf); eo301@1: //Handler Box// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.type, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.version, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.pre_defined, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.handler_type, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[0], sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[1], sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[2], sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[0], sizeof(unsigned char), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[1], sizeof(unsigned char), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[2], sizeof(unsigned char), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[3], sizeof(unsigned char), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[4], sizeof(unsigned char), 1, imf); eo301@1: //Media inforamtion box// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.type, sizeof(u32), 1, imf); eo301@1: //Sound media header// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox, eo301@1: sizeof(moov.TrackBox[numtrack].MediaBox. eo301@1: MediaInformationBox.SoundMediaHeaderBox), 1, imf); eo301@1: //Data reference// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox, eo301@1: sizeof(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox), 1, imf); eo301@1: //Sample table box// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: type, sizeof(u32), 1, imf); eo301@1: eo301@1: int i, swap, pos; eo301@1: //Time to sample box// eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.size, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.type, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.version, sizeof(u32), 1, imf); eo301@1: fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.entry_count, sizeof(u32), 1, imf); eo301@1: eo301@1: swap = byterevers(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. eo301@1: TimeToSampleBox.entry_count); eo301@1: pos = swap; eo301@1: eo301@1: for (i=0; i>24)&0xff) | // move byte 3 to byte 0 eo301@1: ((num<<8)&0xff0000) | // move byte 1 to byte 2 eo301@1: ((num>>8)&0xff00) | // move byte 2 to byte 1 eo301@1: ((num<<24)&0xff000000); // byte 0 to byte 3 eo301@1: return swapped; eo301@1: } eo301@0: eo301@1: eo301@1: