Mercurial > hg > sonic-visualiser
diff main/IMAFencoder.c @ 634:ba338234c001 imaf_enc
IMAF load code from Jesus Corral Garcia
author | Chris Cannam |
---|---|
date | Mon, 04 Nov 2013 17:15:52 +0000 |
parents | |
children | 767789a78984 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/IMAFencoder.c Mon Nov 04 17:15:52 2013 +0000 @@ -0,0 +1,2976 @@ +//***********************************************************// +// Interactive Music Audio Format (IMAF) ENCODER // +// Version 2.0 // +// // +// Eugenio Oñate Hospital // +// Jesús Corral García & Costantino Taglialatela // +// // +// Copyright (c) 2013 Centre for Digital Music (C4DM) // +// Queen Mary University of London. All rights reserved. // +//***********************************************************// +// main.c // +//***********************************************************// + +//File input/output +#include <stdio.h> +//Standard library: numeric conversion, memory allocation... +#include <stdlib.h> +//Operations with strings +#include <string.h> +//Get the creation time: clock +#include <time.h> +#include "IMAFencoder.h" +//Qt libraries +#include <QTextStream> +#include <QMessageBox> +#include <QByteArray> + + +/*Prototype*/ +void filetypebx(FileTypeBox *ftyp); +int mdatbox(MediaDataBox *mdat, int, FILE *imf, FILE *song, FILE *text, int, int, u32); +void moovheaderbox(MovieBox *moov, int, int, int, int, int, int, int); +int trackstructure(MovieBox *moov, int, int, int, int,const char *name); +int samplecontainer(MovieBox *moov, int, int, const char *name); +int sampledescription(MovieBox *moov, int); +int presetcontainer(MovieBox *moov, int, int *vol_values, int type, int fade_in); +int rulescontainer(MovieBox *moov, int SelRuleType, int SelRule_PAR1, int SelRule_PAR2, + int MixRuleType, int MixRule_PAR1, int MixRule_PAR2, int MixRule_PAR3, int MixRule_PAR4); +void writemoovbox(MovieBox moov, int numtrack,int totaltracks, FILE *imf, FILE *text); +int readTrack(MovieBox *moov, int,const char *name); + +// Timed Text Functions +int trackstructure_text (MovieBox *moov, int numtrack, int clock, int durationTrack, int sizemdat,const char *textfile,FILE *text,int totaltracks); +int samplecontainer_text(MovieBox *moov, int numtrack, int sizemdat, const char *textfiles,int totaltracks); +int aux (FILE *text,int num,int num1,int num2,int num3,int *sal); +int getTextSize (FILE *text); +// Group and Preset functions +int groupcontainer(MovieBox *moov, int *group_tracks, int grp_vol, QString grp_name, + QString grp_description, int totaltracks); +void writepresets(MovieBox moov, int numtrack,int totaltracks, FILE *imf); // NOT YET USED + +// MetaData and JPEG Image functions +int metacontainer (MetaBox *meta); +u32 getImageSize(const char *imag); +void insertImage (MetaBox *meta, FILE **imf, u32 imagesize, const char *imagedir); +void writemetabox(MetaBox meta, FILE *imf); + +int bytereverse(int num); +int bytereverse16(int num); +int size_phrase[1000];//the total number of bytes in a phrase including modifiers +int phrases;//the number of phrases in the whole text + + +// Qt Widget for the "Exit Window" +class ExitWindow : public QWidget +{ + public: + ExitWindow(); + private: + QMessageBox *file_created; +}; + +ExitWindow::ExitWindow() +{ + file_created = new QMessageBox(); + file_created->setFixedSize(400,200); // doesn't seem to work + file_created->setWindowTitle("IM AF Encoder"); + file_created->setText("IM AF file successfully created!"); + file_created->show(); +} + +int mainIMAFencoder (int totaltracks, QString files_path[maxtracks],QString outimaf, + QString picturefile, QString textfile, int vol_values[maxtracks], bool HasImageFile, + int SelRuleType, int SelRule_PAR1, int SelRule_PAR2, + int MixRuleType, int MixRule_PAR1, int MixRule_PAR2, int MixRule_PAR3, int MixRule_PAR4, + int group_tracks[maxtracks], int group_volume, QString group_name, QString group_description, + int pres_type, int fade_in) +{ + //Variables + FileTypeBox ftyp; + MediaDataBox mdat; + MovieBox moov; + MetaBox meta; + + //Media Data Box - Contains the audio + FILE *song; //MP3 + u32 sizeTRAK = 0; + int numtr; + //Output File + FILE *imf; //IMA + int numtrack, sizemdat, durationTrack; + //Image + u32 imagesize; + QTextStream out (stdout); + //Timed-Text + FILE *text; + int sizetext; + const char *c_str1[8];//change this value to support more than 8 audio tracks + const char *c_str2; + + //Groups, Presets, Rules and Metadata boxes sizes + u32 sizeGRCO, sizePRCO, sizeRUCO, sizeMETA; + + /* Obtain current time as seconds elapsed since the Epoch. */ + time_t clock = time(NULL); + + + //INPUT: Image + if (HasImageFile){ + c_str2= picturefile.toStdString().c_str(); //convert QString to const char + imagesize = getImageSize(c_str2);//calculate the size of the jpeg + } else { //if there is no image, the size is 0 + imagesize = 0; + } + + //INPUT: Timed-Text + c_str2= textfile.toStdString().c_str(); //convert Qstring to const char + text = fopen(c_str2, "rb"); + sizetext= getTextSize (text); //calculate the size of the text + if((text)==NULL) { + // do something + } + + //Create OUTPUT file (.ima) + imf = fopen (outimaf.toStdString().c_str(),"wb"); + + //Define the File Type Box + filetypebx(&ftyp); + fwrite(&ftyp, sizeof(FileTypeBox),1, imf); + //AUDIO + //Put the tracks in Media Data Box + for (numtr=0; numtr<totaltracks; numtr++) { + c_str1[numtr]= files_path[numtr].toStdString().c_str(); //convert Qstring to const char + song = fopen(c_str1[numtr], "rb"); + + //Extract the samples from the audio file and the text + sizemdat = mdatbox(&mdat, totaltracks, imf, song, text, numtr, sizetext, imagesize);//sizemdat is the size of one audio track + + fclose(song); //Close the audio file + }//close for + + //For each track write track information + durationTrack = (sizemdat*8)/128; + + for (numtrack = 0; numtrack < totaltracks; numtrack++) { + c_str1[numtrack]= files_path[numtrack].toStdString().c_str(); //convert QString to const char + sizeTRAK = trackstructure(&moov, numtrack, clock, durationTrack,sizemdat,c_str1[numtrack])+ sizeTRAK; + } +//At this point, the variable sizeTRAK will be the sum of the size of the box ´trak´ in all the audio tracks. +//The size of the box trak of the text track will be added after. + + if (HasImageFile){ + //Meta + sizeMETA = metacontainer(&meta); + + //Read the image from the JPEG file and write it in the IMAF file + c_str2= picturefile.toStdString().c_str(); //convert Qstring to const char + insertImage(&meta, &imf, imagesize,c_str2); + } + + //Groups + sizeGRCO = groupcontainer(&moov, group_tracks, group_volume, group_name, group_description, totaltracks); //Creates the group, returns the size of the box + + //Presets + sizePRCO = presetcontainer(&moov, totaltracks, vol_values, pres_type, fade_in); // Creates the preset, returns the size of the box. + + //Rules + sizeRUCO = rulescontainer(&moov, SelRuleType, SelRule_PAR1, SelRule_PAR2, + MixRuleType, MixRule_PAR1, MixRule_PAR2, MixRule_PAR3, MixRule_PAR4); // Creates the rules, returns the size of the box. + + //Text track + c_str2= textfile.toStdString().c_str(); //convert Qstring to const char + sizeTRAK = trackstructure_text (&moov, numtrack, clock, durationTrack, sizemdat, c_str2, text, totaltracks) + sizeTRAK; + + //Movie Header - Overall declarations + moovheaderbox(&moov, clock, sizeTRAK, sizePRCO, totaltracks, durationTrack, sizeRUCO, sizeGRCO); // -> enter sizeGRCO instead of 0 + + //Writes the movie box into the file + writemoovbox(moov, numtrack, totaltracks, imf, text); + + //Writes the meta box into the IMAF file + if (HasImageFile){ + writemetabox(meta,imf); + } + + //Close Files and show exit dialog window + fclose(imf); + fclose (text); + ExitWindow *window = new ExitWindow(); +} + + + +void filetypebx(FileTypeBox *ftyp){ + int swap; + + swap = bytereverse(24);// 24 is the size of the box "ftyp" + ftyp->size = swap; + swap = bytereverse('ftyp'); + ftyp->type = swap; + swap = bytereverse('im02'); // Conformance point 3 (see ISO/IEC 23000-12:2010/FDAM 1:2011(E)) + ftyp->major_brand = swap; + ftyp->minor_version = 0; + swap = bytereverse('im02'); // Conformance point 3 (see ISO/IEC 23000-12:2010/FDAM 1:2011(E)) + ftyp->compatible_brands[0] = swap; + swap = bytereverse('isom'); + ftyp->compatible_brands[1] = swap; +} + +int mdatbox(MediaDataBox *mdat, int totaltracks, FILE *imf, FILE *song, FILE *text, int numtr, int sizetext, u32 imagesize){ + + int d=0, cnt=0, j, find = 0, sizestring = 0, i = 0,cnt2=0,highlight_end_time=0; + int dat = 0, dat1 = 0, dat2 = 0, dat3 = 0,k=0; + u32 size = 0, swap, sizeMDAT = 0; + unsigned char c1=0,c2=0,numwords=0,initposition[3000],endposition[3000]; + + //Positionate the pointer at the end of the file to know the size of it + fseek(song, 0, SEEK_END); + size = ftell(song); + //Positionate the pointer at first + fseek(song, 0, SEEK_SET); + + initposition[0]=0; // this array saves the position of the first letter of a word in a phrase + phrases=0;// this variable saves the number of phrases in the whole text + + //Find the header of the first frame (the beginning), when find it d=1 and jump out the loop. + // The header is 32 bytes. We find in groups of 8 bytes + // Contemplate all possible options of headers + while (d == 0) { + find = 0; + fread(&dat, sizeof(unsigned char), 1, song); + cnt++; + + if (dat == 0xFF) { + cnt++; // cnt : stores the position of the pointer. + fread(&dat1, sizeof(unsigned char), 1, song); + cnt++; + fread(&dat2, sizeof(unsigned char), 1, song); + cnt++; + fread(&dat3, sizeof(unsigned char), 1, song); + if (dat1 == 0xFB && dat2 == 146 && dat3 == 64 ) { + find = 1; // find: if the header is found + d=1; // d: jump out the loop + } + if (dat1 == 0xFB && dat2 == 146 && dat3 == 96 ) { + d=1; + find = 1; + } + if (dat1 == 0xFB && dat2 == 144 && dat3 == 64 ) { + find = 1; + d=1; + } + if (dat1 == 0xFB && dat2 == 144 && dat3 == 96 ) { + find = 1; + d=1; + } + if (dat1 == 0xFB && dat2 == 146 && dat3 == 100 ) { + d=1; + find = 1; + } + if (dat1 == 0xFB && dat2 == 144 && dat3 == 100 ) { + find = 1; + d=1; + } + if (dat1 == 0xFA && dat2 == 146 && dat3 == 64 ) { + find = 1; + d=1; + } + if (dat1 == 0xFA && dat2 == 146 && dat3 == 96 ) { + d=1; + find = 1; + } + if (dat1 == 0xFA && dat2 == 144 && dat3 == 64 ) { + find = 1; + d=1; + } + if (dat1 == 0xFA && dat2 == 144 && dat3 == 96 ) { + find = 1; + d=1; + } + if (dat1 == 0xFA && dat2 == 146 && dat3 == 100 ) { + d=1; + find = 1; + } + if (dat1 == 0xFA && dat2 == 144 && dat3 == 100 ) { + find = 1; + d=1; + } + if (find == 0) { + fseek(song, -3, SEEK_CUR); // if 3 last bytes in the header are not correct + cnt = cnt - 3; + } + } // close if + if (cnt == size) { //if we have readen all the bytes in the audio file + d = 1; + } + }//close while + size = size - (cnt - 4); // Calculate the size of the samples. size = pos. end of file - pos. first header. + if (numtr == 0) { //if it is the first audio track the code writes the mdat size + sizeMDAT = size*totaltracks + 8 + sizetext + imagesize; // size of the whole media box -> INCLUDING IMAGE and TEXT SIZE.The text size does not include modifiers + swap = bytereverse(sizeMDAT); + fwrite(&swap, sizeof(u32), 1, imf); + swap = bytereverse('mdat'); + mdat->type = swap; + fwrite(&mdat->type, sizeof(u32), 1, imf); + } + fseek(song, cnt - 4, SEEK_SET); + for (j=0; j<size; j++) { //read all the samples of one track and writes them in the IM AF file + fread(&mdat->data, sizeof(char), 1, song); + fwrite(&mdat->data, sizeof(char), 1, imf); + } + + // copy the text in the 3gp to the ima and add the text modifiers + + cnt=0;// the total number of bytes of the whole text including modifiers + fseek(text,0,SEEK_CUR); + sizestring=0;//number of bytes of a phrase (without modifiers) + initposition[0]=0;// this array saves the initial position of a word + if(numtr==totaltracks-1){ // writes the text after the samples of all the audio tracks + j=0;cnt=0; + while(j<sizetext){ //this loop reads the whole text + cnt2=0;//the total number of bytes of a phrase including the modifiers + fread(&c1,sizeof(char),1,text); + fread(&c2,sizeof(char),1,text); + fwrite(&c1,sizeof(char),1,imf);//two bytes of sizestring + fwrite(&c2,sizeof(char),1,imf); + sizestring = (c1<<8) | (c2);//sizestring is the size of one phrase contained in 3gp + j=j+2; + cnt=cnt+2; + cnt2=cnt2+2; + phrases++;//the number of phrases in the whole text + numwords=0;// the number of words in a phrase + initposition[0]=0;//this array saves the first position of a word in a phrase + endposition[0]=0;// this array saves the last position of a word in a phrase + k=0;//the index for endposition array and initposition array + for(i=0;i< sizestring;i++){ + fread(&mdat->data,sizeof(char),1,text); + fwrite(&mdat->data,sizeof(char),1,imf); + j++; + cnt=cnt+1; + cnt2=cnt2+1; + if(mdat->data==0x20){ //a blank space separates two words. 0x20 = blank space + + numwords++; + endposition[k]=i; + initposition[k+1]=i+1; + k++; + } + + + } //close for + endposition[k]=sizestring-1;//saves the last position of the last word in a phrase + numwords++; + + + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//hclr size + fwrite(&mdat->data,sizeof(char),1,imf);//hclr size + fwrite(&mdat->data,sizeof(char),1,imf);//hclr size + mdat->data=0x0C; + fwrite(&mdat->data,sizeof(char),1,imf); //hclr size + fwrite("h",sizeof(char),1,imf); + fwrite("c",sizeof(char),1,imf); + fwrite("l",sizeof(char),1,imf); + fwrite("r",sizeof(char),1,imf); + mdat->data=0xFF; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight color rgba + mdat->data=0x62; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight color rgba + mdat->data=0x04; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight color rgba + mdat->data=0xFF; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight color rgba + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf); //krok size + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//krok size + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//krok size + mdat->data=14+(8*numwords); + fwrite(&mdat->data,sizeof(char),1,imf); //krok size + fwrite("k",sizeof(char),1,imf); + fwrite("r",sizeof(char),1,imf); + fwrite("o",sizeof(char),1,imf); + fwrite("k",sizeof(char),1,imf); + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-start-time + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-start-time + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-start-time + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-start-time + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//entry-count + mdat->data=numwords; + fwrite(&mdat->data,sizeof(char),1,imf);//entry-count + + for(i=0;i<numwords;i++){ + + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-end-time + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-end-time + + + if(i==numwords-1){ //if it is the last word in a phrase we put this value + mdat->data=0xFF; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-end-time + mdat->data=0xFF; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-end-time + + } + + else{ //if it is not the last word in a phrase + + highlight_end_time = (i+1)*(11/numwords);//change the value '11' in order to increase o decrease the speed of highlight + mdat->data= highlight_end_time; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-end-time + mdat->data=0xFF; + fwrite(&mdat->data,sizeof(char),1,imf);//highlight-end-time + + + } + + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//startcharoffset + mdat->data=initposition[i]; + fwrite(&mdat->data,sizeof(char),1,imf);//startcharoffset + mdat->data=0x00; + fwrite(&mdat->data,sizeof(char),1,imf);//endcharoffset + mdat->data=endposition[i]+1; + fwrite(&mdat->data,sizeof(char),1,imf);//endcharoffset + + }//close for + + cnt=cnt+26+(numwords*8);//cnt is the number of bytes of the whole text including modifiers + cnt2=cnt2+26+(numwords*8); //cnt2 is the number of bytes of a phrase including the modifiers + + size_phrase[phrases-1]=cnt2 ; + + } //close while + + sizeMDAT = size*totaltracks + 8 + cnt + imagesize; // size value must include image and text sizes + swap = bytereverse(sizeMDAT); + fseek(imf,-(sizeMDAT-imagesize),SEEK_CUR); //overwrittes sizeMDAT with the total size (Image is yet to be written in the file at this point) + fwrite(&swap, sizeof(u32), 1, imf); + fseek(imf,(sizeMDAT-imagesize)-4,SEEK_CUR); // (Image is yet to be written in the file at this point) + } // close if (numtr==totaltracks-1) + + fclose(song); + + return size; +} + +int samplecontainer(MovieBox *moov, int numtrack, int sizemdat, const char *name){ + + u32 sizeSTSD, sizeSTSZ, swap, num_samples, dat=0; + u32 sizetime, sizeSTTS; //Time to Sample Box + u32 sizeSTSC = 28; //Sample to Chunck + u32 sizeSTCO = 20; //Chunck offset + u32 sizeSTBL; //Sample Table Box // + + //Sample Description Box// + sizeSTSD = sampledescription(moov, numtrack); + + //Sample size box// + swap = bytereverse('stsz'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.version = 0; + //Read Track: Frame size and Decoder Times + num_samples = readTrack(moov, numtrack, name); + sizeSTSZ = num_samples*4 + 20; + swap = bytereverse(sizeSTSZ); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.size = swap; + + //Time To Sample Box// + sizetime = bytereverse(moov->TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.TimeToSampleBox.entry_count); + sizeSTTS = 16 + sizetime*4*2; + swap = bytereverse(sizeSTTS); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.size = swap; + swap = bytereverse('stts'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.version = 0; + + //Sample To Chunk// + swap = bytereverse(sizeSTSC); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.size = swap; + swap = bytereverse('stsc'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.version = 0; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.entry_count = swap; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.first_chunk = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.samples_per_chunk = moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_count; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.sample_description_index = swap; + + //Chunk Offset Box// + swap = bytereverse(sizeSTCO); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.size = swap; + swap = bytereverse('stco'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.version = 0; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.entry_count = swap; + dat = 32 + sizemdat*numtrack; + swap = bytereverse(dat); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.chunk_offset[numtrack] = swap; + + //Sample Table Box // + sizeSTBL = 8 + sizeSTSD + sizeSTSZ + sizeSTSC + sizeSTCO + sizeSTTS; + swap = bytereverse(sizeSTBL); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.size = swap; + swap = bytereverse('stbl'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.type =swap; + + return sizeSTBL; +} + +int sampledescription(MovieBox *moov, int numtrack){ + + u32 swap, sizeESD = 35; + + u32 sizeMP4a; //Audio Sample Entry// + u32 sizeSTSD; //Sample description box // + + + swap = bytereverse(sizeESD); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.size = swap; + swap = bytereverse('esds'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.version = 0; + + //ES Descriptor// + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.tag = 3; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.length = 21; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.ES_ID = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.mix = 0; + + //Decoder config descriptor// + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + DecoderConfigDescriptor.tag = 4; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + DecoderConfigDescriptor.length = 13; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + DecoderConfigDescriptor.objectProfileInd = 0x6B; + swap = bytereverse(0x150036B0); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + DecoderConfigDescriptor.mix = swap; + swap = bytereverse(128); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + DecoderConfigDescriptor.maxBitRate = swap; + swap = bytereverse(128); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + DecoderConfigDescriptor.avgBitrate = swap; + + //SLConfig Descriptor// + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + SLConfigDescriptor.tag = 6; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + SLConfigDescriptor.length = 1; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor. + SLConfigDescriptor.predifined = 2; + + //Audio Sample Entry// + sizeMP4a = 36 + sizeESD; + swap = bytereverse(sizeMP4a); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.size = swap; + swap = bytereverse('mp4a'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.type =swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[0] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[1] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[2] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[3] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[4] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[5] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.data_reference_index = bytereverse16(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved2[0] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved2[1] = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.channelcount = 512; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.samplesize = 4096; // 16 bits + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved3 = 0; + swap = 44100 << 16; + swap = bytereverse(swap); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.samplerate = swap; + + //Sample description box // + sizeSTSD = 16 + sizeMP4a; + swap = bytereverse(sizeSTSD); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.size = swap; + swap = bytereverse('stsd'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.version = 0; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.entry_count = swap; + + return sizeSTSD; +} + +int readTrack (MovieBox *moov, int numtrack,const char *name){ + + int t=0,k=1, l =0; + + FILE *song; + int d=0, cnt = 0, i=0, j=0, cnt2 = 0, find = 0, swap, num_entr = 0; + int dat = 0, dat1 = 0, dat2 = 0, dat3 = 0, num_frame = 0, end =0, pos = 0; + u32 size[9000]; + + //Open the audio file with the name introduced by the user + song = fopen (name,"rb"); + if (song == NULL) { + printf("Error opening input file\n"); + system("pause"); + exit(1); + } + //Calculate the size of the track + fseek(song, 0, SEEK_END); + end = ftell(song); + fseek(song, 0, SEEK_SET); + d=0, i=0; + //Search for each frame one by one, and extratcs the information + while (d == 0) { + find = 0; + fread(&dat, sizeof(unsigned char), 1, song); + cnt++; + + if (dat == 0xFF) { + cnt++; + fread(&dat1, sizeof(unsigned char), 1, song); + cnt++; + fread(&dat2, sizeof(unsigned char), 1, song); + cnt++; + fread(&dat3, sizeof(unsigned char), 1, song); + if (dat1 == 0xFB && dat2 == 146 && dat3 == 64 ) { + pos = cnt - 4; //Pos of the beginning of the frame + size[num_frame] = pos - cnt2; //Size of one frame + cnt2 = pos; //Pos of the next frame + find = 1; + num_frame ++; //Number of frames + } + if (dat1 == 0xFB && dat2 == 146 && dat3 == 96 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFB && dat2 == 144 && dat3 == 64 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFB && dat2 == 144 && dat3 == 96 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFB && dat2 == 146 && dat3 == 100 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFB && dat2 == 144 && dat3 == 100 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFA && dat2 == 146 && dat3 == 64 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFA && dat2 == 146 && dat3 == 96 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFA && dat2 == 144 && dat3 == 64 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFA && dat2 == 144 && dat3 == 96 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFA && dat2 == 146 && dat3 == 100 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (dat1 == 0xFA && dat2 == 144 && dat3 == 100 ) { + pos = cnt - 4; + size[num_frame] = pos - cnt2; + cnt2 = pos; + find = 1; + num_frame ++; + } + if (find == 0) { //In case it does not find the header. + //It keeps reading next data without jump any position + fseek(song, -3, SEEK_CUR); + cnt = cnt - 3; + } + } + + if (cnt == end) { + pos = cnt; + size[num_frame] = pos - cnt2; + d = 1; + } + } + + //Save Samples size// + swap = bytereverse(num_frame); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_count = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_size = 0; + + for (i=0; i< num_frame; i++) { + swap = bytereverse(size[i+1]); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.entry_size[i] = swap; + } + + //Save Decoding Times// + //Writes manually the duration of each frame. + //Follows the following structure: + // 7 frames of 26 ms + // 1 frame of 27 ms + // ... + // And each 13 rows it writes + // 8 frames of 26 ms + // 1 frame of 27 ms + //It is done for adjusting the different durations of each frame. + // as they vary between 26.125 ms and 26.075 ms + + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[0] = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[0] =0; + // int t=0,k=1, l =0; + num_entr = 1; + j = 0; + for (i = 1; i< num_frame; i++) { + if (j == 8 && l == 0) { + swap = bytereverse(7); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[num_entr] = swap; + swap = bytereverse(26); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[num_entr] =swap; + num_entr ++; + + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[num_entr] = swap; + swap = bytereverse(27); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[num_entr] =swap; + num_entr++; + j=0; + dat = i; + if (k == 6 && t == 0) { + l = 1; + t = 1; + k = 1; + } + if (k == 6 && t ==1) { + l = 1; + k = 1; + } + k++; + } + + if (j == 9 && l == 1) { + + swap = bytereverse(8); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[num_entr] = swap; + swap = bytereverse(26); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[num_entr] =swap; + num_entr ++; + + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[num_entr] = swap; + swap = bytereverse(27); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[num_entr] =swap; + num_entr++; + j=0; + dat = i; + l = 0; + } + j++; + } + + dat = num_frame - dat; + + swap = bytereverse(dat); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[num_entr] = swap; + swap = bytereverse(26); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[num_entr] =swap; + num_entr++; + swap = bytereverse(num_entr); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.entry_count = swap; + + fclose(song); + return num_frame; + +} + +int trackstructure (MovieBox *moov, int numtrack, int clock, + int durationTrack, int sizemdat,const char *name){ + int swap; + + int sizeSTBL; //Sample Table Box + u32 sizeURL; //Data Entry Url Box + u32 sizeDREF; //Data Reference + u32 sizeSMHD; //Sound Header Box + u32 sizeDINF; //Data information Box + u32 sizeMINF; //Media Information Box// + u32 sizeHDLR; //Handler Box// + u32 sizeMDHD; //Media Header Box// + u32 sizeMDIA; //Media Box// + u32 sizeTKHD; //Track Header// + u32 sizeTRAK; //Track container + + //Sample Table Box + sizeSTBL = 0; + sizeSTBL = samplecontainer(moov, numtrack,sizemdat, name); + + //Data Entry Url Box + sizeURL = 12; + swap = bytereverse(sizeURL); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.DataEntryUrlBox.size = swap; + swap = bytereverse('url '); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.DataEntryUrlBox.type = swap; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.DataEntryUrlBox.flags = swap; // =1 Track in same file as movie atom. + + //Data Reference + sizeDREF = sizeURL+ 16; + swap = bytereverse(sizeDREF); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.size = swap; + swap = bytereverse('dref'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.flags = 0; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.entry_count = swap; + + //Data information Box// + sizeDINF = sizeDREF + 8; + swap = bytereverse(sizeDINF); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.size = swap; + swap = bytereverse('dinf'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.type = swap; + + //Sound Header Box // + sizeSMHD = 16; + swap = bytereverse(sizeSMHD); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.size = swap; + swap = bytereverse('smhd'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.version = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.balance = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox.reserved = 0; + + //Media Information Box// + sizeMINF = sizeDINF + sizeSMHD + sizeSTBL + 8; + swap = bytereverse(sizeMINF); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.size = swap; + swap = bytereverse('minf'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.type = swap; + + //Handler Box// + sizeHDLR = 37; + swap = bytereverse(sizeHDLR); + moov->TrackBox[numtrack].MediaBox.HandlerBox.size = swap; + swap = bytereverse('hdlr'); + moov->TrackBox[numtrack].MediaBox.HandlerBox.type = swap; + moov->TrackBox[numtrack].MediaBox.HandlerBox.version = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.pre_defined = 0; + swap = bytereverse('soun'); + moov->TrackBox[numtrack].MediaBox.HandlerBox.handler_type = swap; + moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[0] = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[1] = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[2] = 0; + //swap = bytereverse('soun'); + //moov->TrackBox[numtrack].MediaBox.HandlerBox.data = swap; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[0] = 's'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[1] = 'o'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[2] = 'u'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[3] = 'n'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[4] = '\0'; + + //Media Header Box// + sizeMDHD = 32; + swap = bytereverse(sizeMDHD); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.size = swap; + swap = bytereverse('mdhd'); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.version = 0; + swap = bytereverse(clock); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.creation_time = swap; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.modification_time = swap; + swap = bytereverse(1000); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.timescale = swap; + swap = bytereverse(durationTrack); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.duration = swap; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.language = 0xC455; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.pre_defined = 0; + + //Media Box// + sizeMDIA = sizeMDHD + sizeHDLR + sizeMINF + 8; + swap = bytereverse(sizeMDIA); + moov->TrackBox[numtrack].MediaBox.size = swap; + swap = bytereverse('mdia'); + moov->TrackBox[numtrack].MediaBox.type = swap; + + //Track Header// + sizeTKHD = 92; + swap = bytereverse (sizeTKHD); + moov->TrackBox[numtrack].TrackHeaderBox.size = swap; + swap = bytereverse ('tkhd'); + moov->TrackBox[numtrack].TrackHeaderBox.type = swap ; + swap = bytereverse (0x00000006); + moov->TrackBox[numtrack].TrackHeaderBox.version = swap; + swap = bytereverse (clock); + moov->TrackBox[numtrack].TrackHeaderBox.creation_time = swap; + moov->TrackBox[numtrack].TrackHeaderBox.modification_time = swap; + swap = bytereverse (numtrack+1); + moov->TrackBox[numtrack].TrackHeaderBox.track_ID = swap; //From 0x00000001 - 0x7FFFFFFF (dec 2147483647) + moov->TrackBox[numtrack].TrackHeaderBox.reserved = 0; + swap = bytereverse (durationTrack); + moov->TrackBox[numtrack].TrackHeaderBox.duration = swap; + moov->TrackBox[numtrack].TrackHeaderBox.reserved2[0] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.reserved2[1] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.layer = 0; + moov->TrackBox[numtrack].TrackHeaderBox.alternate_group = 0; + moov->TrackBox[numtrack].TrackHeaderBox.volume = 0x1; + moov->TrackBox[numtrack].TrackHeaderBox.reserved3 = 0; + swap = bytereverse (0x00010000); + moov->TrackBox[numtrack].TrackHeaderBox.matrix[0] = swap; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[1] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[2] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[3] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[4] = swap; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[5] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[6] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[7] = 0; + swap = bytereverse(0x40000000); + moov->TrackBox[numtrack].TrackHeaderBox.matrix[8] = swap; + moov->TrackBox[numtrack].TrackHeaderBox.width = 0; //just for video + moov->TrackBox[numtrack].TrackHeaderBox.height = 0; //just for video + + //Track container + sizeTRAK = sizeTKHD + sizeMDIA + 8; + swap = bytereverse (sizeTRAK); // Size of one track + moov->TrackBox[numtrack].size = swap; + swap = bytereverse ('trak'); + moov->TrackBox[numtrack].type = swap; + return sizeTRAK; + +} + +int groupcontainer(MovieBox *moov, int *group_tracks, int grp_vol, QString grp_name, + QString grp_description, int totaltracks) { + + int i, j, k, numgroups, sizeCont; + int numel = 0; + int sizeBox = 0; + int tempsize = 0; + int active, activenum, addsize; + +// ADDED FOR SV + for (j=0; j<totaltracks; j++){ + if (group_tracks[j]==1){ + numel++; + } + } + + if (numel==0){ + numgroups = 0; + }else{ + numgroups = 1; + } +// + + moov->GroupContainerBox.num_groups = bytereverse16(numgroups); + + for (i=0; i<numgroups; i++){ + addsize = 0; + tempsize = 0; + moov->GroupContainerBox.GroupBox[i].group_ID = bytereverse(2147483649+i+1); // group_ID shall be represented from 0x80000000 to 0xFFFFFFFF + strcpy(moov->GroupContainerBox.GroupBox[i].group_name, grp_name.toStdString().c_str()); + strcpy(moov->GroupContainerBox.GroupBox[i].group_description, grp_description.toStdString().c_str()); + +// numel = 0; // uncomment for more than one group and remove initial "for" with numel + k = 0; + for (j=0; j<totaltracks; j++){ + if (group_tracks[j]==1){ + moov->GroupContainerBox.GroupBox[i].groupElemId[k].element_ID = bytereverse(j+1); +// numel++; // uncomment for more than one group and remove initial "for" with numel + addsize += 4; + k++; + } + } + moov->GroupContainerBox.GroupBox[i].num_elements = bytereverse16(numel); + +// printf("Choose the activation mode: "); +// printf("Activation mode\n"); +// printf(" - Switch on the MINIMUN number of elements (0, if no Min/Max rule) [0]\n"); +// printf(" - Switch on the MAXIMUM number of elements (All tracks, if no Min/Max rule) [1]\n"); +// printf(" - Switch on the defined number of elements (ONLY IF there is Min/Max rule) [2]\n"); +// scanf("%d",&active); +// fflush(stdin); + + active = 1; // ADDED FOR SV, All tracks enabled + + moov->GroupContainerBox.GroupBox[i].group_activation_mode = active; + activenum = 0; + moov->GroupContainerBox.GroupBox[i].group_activation_elements_number = activenum; + if (active==2){ + printf("Activation elements number: "); + scanf("%d",&activenum); + moov->GroupContainerBox.GroupBox[i].group_activation_elements_number = bytereverse16(activenum); + addsize += 2; + } + + moov->GroupContainerBox.GroupBox[i].group_reference_volume = bytereverse16(grp_vol*256/100); // define 8.8 fixed point + + tempsize = 75 + addsize; // ---> before was 66 + addsize; + moov->GroupContainerBox.GroupBox[i].size = bytereverse(tempsize); + moov->GroupContainerBox.GroupBox[i].type = bytereverse('grup'); + moov->GroupContainerBox.GroupBox[i].version = bytereverse(0x02); // flags = Display enable, Edit disable + + sizeBox += tempsize; + + } // close for (numgroups) + + sizeCont = sizeBox + 10; + + moov->GroupContainerBox.size = bytereverse(sizeCont); + moov->GroupContainerBox.type = bytereverse('grco'); + + return sizeCont; +} + +int presetcontainer(MovieBox *moov, int totaltracks, int *vol_values, int prestype, int fade_in){ + + int temp, i, j, k, m, t, vol; + int numpres, eq; + //char name[50]; + u32 sizePRST = 0; + u32 sizePRCO = 0; + u32 sizeEQ; + u32 addsize = 0; + int updates = 0; + + numpres = 1; // ADDED FOR SV + + //Preset Box// + for (i=0; i<numpres; i++) { +// printf("\nPRESET LIST:\n"); +// printf(" - Static track volume [0]\n"); +// printf(" - Static object volume [1]\n"); +// printf(" - Dynamic track volume [2]\n"); +// printf(" - Dynamic object volume [3]\n"); +// printf(" - Dynamic track approximated volume [4]\n"); +// printf(" - Dynamic object approximated volume [5]\n"); +// printf(" - Static track volume with Equalization [6]\n"); // count preset_type from 8 +// printf(" - Static object volume with Equalization [7]\n"); +// printf(" - Dynamic track volume with Equalization [8]\n"); +// printf(" - Dynamic object volume with Equalization [9]\n"); +// printf(" - Dynamic track approximated with Equalization [10]\n"); +// printf(" - Dynamic object approximated with Equalization [11]\n"); +// printf("\nPlease make your choice: "); +// scanf("%d", &prestype); +// fflush(stdin); + + //PresetBOX + // Box size specified in respective case + moov->PresetContainerBox.PresetBox[i].type = bytereverse('prst'); + moov->PresetContainerBox.PresetBox[i].flags = bytereverse(0x02); // Display Enable Edit Disable + moov->PresetContainerBox.PresetBox[i].preset_ID = i+1; + moov->PresetContainerBox.PresetBox[i].num_preset_elements = totaltracks; // All the tracks are involved in the preset + for (j=0; j<totaltracks; j++) { + moov->PresetContainerBox.PresetBox[i].presElemId[j].preset_element_ID = bytereverse(j+1); + } + moov->PresetContainerBox.PresetBox[i].preset_global_volume = 100; + +// prestype = 0; // ADDED FOR SV + + switch (prestype) { + case 0: moov->PresetContainerBox.PresetBox[i].preset_type = 0; + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Static track volume preset"); + + for (j=0; j<totaltracks; j++) { + vol = vol_values[j]*2; + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].preset_volume_element = vol/2; //*0.02 + } + + addsize = totaltracks; + break; + case 1: moov->PresetContainerBox.PresetBox[i].preset_type = 1; + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Static object volume preset"); + + for (j=0; j<totaltracks; j++) { + moov->PresetContainerBox.PresetBox[i].StaticObjectVolume.InputCH[j].num_input_channel = num_ch; + } + moov->PresetContainerBox.PresetBox[i].StaticObjectVolume.output_channel_type = 1; // STEREO (2 output channels) + for (j=0; j<totaltracks; j++){ + for (k=0; k<num_ch; k++){ + for (m=0; m<num_ch; m++){ + moov->PresetContainerBox.PresetBox[i].StaticObjectVolume.presElVol[j]. + Input[k].Output[m].preset_volume_element = (100-(20*m))/2; // INPUT BY USER + } + } + } + + addsize = totaltracks + 1+ totaltracks*num_ch*num_ch; + break; + case 2: moov->PresetContainerBox.PresetBox[i].preset_type = 2; + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic track volume preset"); + + updates = 2; // volume changes + moov->PresetContainerBox.PresetBox[i].DynamicTrackVolume.num_updates = bytereverse16(updates); + for (j=0; j<updates; j++){ // INPUT BY USER + moov->PresetContainerBox.PresetBox[i].DynamicTrackVolume. + DynamicChange[j].updated_sample_number = bytereverse16(100+(j*100)); // *0.026 = time in seconds + for (k=0; k<totaltracks; k++){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackVolume. + DynamicChange[j].presVolumElem[k].preset_volume_element = (50*j)/2; // INPUT BY USER + } + } + + addsize = 2 + updates*(2 + totaltracks); + break; + case 3: moov->PresetContainerBox.PresetBox[i].preset_type = 3; + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic object volume preset"); + + updates = 2; // volume changes + moov->PresetContainerBox.PresetBox[i].DynamicObjectVolume.num_updates = bytereverse16(updates); // INPUT BY USER (maybe...) + for (j=0; j<totaltracks; j++) { + moov->PresetContainerBox.PresetBox[i].DynamicObjectVolume.InputCH[j].num_input_channel = 2; + } + moov->PresetContainerBox.PresetBox[i].DynamicObjectVolume.output_channel_type = 1; // STEREO (2 output channels) + for (j=0; j<updates; j++){ // INPUT BY USER + moov->PresetContainerBox.PresetBox[i].DynamicObjectVolume. + DynamicChange[j].updated_sample_number = bytereverse16(0+(j*500)); // *0.026 = time in seconds + for (k=0; k<totaltracks; k++){ + for (m=0; m<num_ch; m++){ + for (t=0; t<num_ch; t++){ + moov->PresetContainerBox.PresetBox[i].DynamicObjectVolume.DynamicChange[j]. + presElVol[k].Input[m].Output[t].preset_volume_element = (25*(j+1)); // INPUT BY USER + } + } + } + } + + addsize = 2 + totaltracks + 1 + updates*(2 + totaltracks*num_ch*num_ch); + break; + case 4: moov->PresetContainerBox.PresetBox[i].preset_type = 4; + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic track approximated volume"); + + updates = 2; // volume changes + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.num_updates = bytereverse16(updates); + for (j=0; j<updates; j++){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].start_sample_number = bytereverse16(100); // *0.026 = time in seconds - INPUT BY USER + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].duration_update = bytereverse16(500); // *0.026 = time in seconds -INPUT BY USER + for (k=0; k<totaltracks; k++){ + if (fade_in){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[j]. + presElVol[k].end_preset_volume_element = (50*j); // Fade IN + } else { + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[j]. + presElVol[k].end_preset_volume_element = (100-(100*j))/2; // Fade OUT + } + } + } + + /* // some code for test + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[2].start_sample_number = bytereverse16(1100); + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[2].duration_update = bytereverse16(250); + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[2].presElVol[0].end_preset_volume_element = 50; + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[2].presElVol[1].end_preset_volume_element = 50; + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[3].start_sample_number = bytereverse16(1100); + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[3].duration_update = bytereverse16(250); + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[3].presElVol[0].end_preset_volume_element = 1; + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[3].presElVol[1].end_preset_volume_element = 1; + */ + + addsize = 2 + updates*(2 + 2 + totaltracks); + break; + case 5: moov->PresetContainerBox.PresetBox[i].preset_type = 5; // NOT YET IMPLEMENTED INTO THE PLAYER! + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic object approximated volume"); + + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + + updates = 2; // volume changes + moov->PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.num_updates = bytereverse16(updates); + for (j=0; j<totaltracks; j++) { + moov->PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.InputCH[j].num_input_channel = 2; + } + moov->PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.output_channel_type = 1; // STEREO (2 output channels) + for (j=0; j<updates; j++){ + moov->PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume. + DynamicChange[j].start_sample_number = bytereverse16(100); // *0.026 = time in seconds - INPUT BY USER + moov->PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume. + DynamicChange[j].duration_update = bytereverse16(250); // *0.026 = time in seconds - INPUT BY USER + for (k=0; k<totaltracks; k++){ + for (m=0; m<num_ch; m++){ + for (t=0; t<num_ch; t++){ + moov->PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.DynamicChange[j]. + presElVol[k].Input[m].Output[t].preset_volume_element = (100*j)/2; // INPUT BY USER + } + } + } + } + + addsize = 2 + totaltracks + 1 + updates*( 2 + 2 + totaltracks*num_ch*num_ch); + break; + case 6: moov->PresetContainerBox.PresetBox[i].preset_type = 8; + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Static track volume with Equalization"); + + eq = 0; addsize = 0; + for (j=0; j<totaltracks; j++) { + //printf("Enter volume for %s : ",namet[j].title); + scanf("%d",&vol); + fflush(stdin); + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].preset_volume_element = vol/2; //*0.02 + + // Equalization + printf("EQ Filter on this element? [1] Yes - [0] No : "); + scanf("%d",&eq); + fflush(stdin); + + if (eq == 1){ + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.num_eq_filters = 1; + for (k=0; k<moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.num_eq_filters; k++){ + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.Filter[k].filter_type = 4; // HPF + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.Filter[k]. + filter_reference_frequency = bytereverse16(5000); // 10kHz + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.Filter[k].filter_gain = -10; + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.Filter[k].filter_bandwidth = 4; + addsize += 5; + } //close for + }else{ + moov->PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.num_eq_filters = 0; + } //close if/else + } //close for + + addsize += totaltracks + totaltracks; //add preset_volume and num_eq_filters size + break; + case 7: moov->PresetContainerBox.PresetBox[i].preset_type = 9; // NOT YET IMPLEMENTED INTO THE PLAYER! + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Static object volume with Equalization"); + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + case 8: moov->PresetContainerBox.PresetBox[i].preset_type = 10; // NOT YET IMPLEMENTED INTO THE PLAYER! + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic track volume with Equalization"); + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + case 9: moov->PresetContainerBox.PresetBox[i].preset_type = 11; // NOT YET IMPLEMENTED INTO THE PLAYER! + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic object volume with Equalization"); + break; + case 10: moov->PresetContainerBox.PresetBox[i].preset_type = 12; // NOT YET IMPLEMENTED INTO THE PLAYER! + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic track approximated with Equalization"); + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + + eq = 0; addsize = 0; + updates = 2; // volume changes + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.num_updates = bytereverse16(updates); + for (j=0; j<updates; j++){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].start_sample_number = bytereverse16(100); // *0.026 = time in seconds - INPUT BY USER + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].duration_update = bytereverse16(500); // *0.026 = time in seconds -INPUT BY USER + for (k=0; k<totaltracks; k++){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[j]. + presElVol[k].end_preset_volume_element = (50*j); // Fade IN, change in (100-(100*j))/2 for Fade OUT -INPUT BY USER + + // Equalization + //printf("EQ Filter on %s ? [1] Yes - [0] No : ",namet[k].title); + scanf("%d",&eq); + fflush(stdin); + + if (eq == 1){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.num_eq_filters = 1; + for (t=0; t<moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.num_eq_filters; t++){ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].filter_type = 4; // HPF + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].filter_reference_frequency = bytereverse16(5000); // 10kHz + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].end_filter_gain = -10; + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].filter_bandwidth = 4; + addsize += 5; + } //close for + }else{ + moov->PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.num_eq_filters = 0; + } //close if/else + } //close for (k) + } //close for (j) + + addsize += 2 + updates*(2 + 2 + totaltracks*(1+1)); + break; + case 11: moov->PresetContainerBox.PresetBox[i].preset_type = 13; // NOT YET IMPLEMENTED INTO THE PLAYER! + strcpy(moov->PresetContainerBox.PresetBox[i].preset_name, "Dynamic object approximated with Equalization"); + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + default: printf("ERROR in PRESET CONTAINER"); + system("pause"); + exit(1); + break; + + } //close switch + + temp = 16 + 50 + 4*totaltracks + addsize; // size PresetBox[i] + moov->PresetContainerBox.PresetBox[i].size = bytereverse(temp); + + sizePRST += temp; // size of all Preset Boxes + + } //close for + + //Preset Container// + sizePRCO += sizePRST + 10; + moov->PresetContainerBox.size = bytereverse(sizePRCO); + moov->PresetContainerBox.type = bytereverse('prco'); + moov->PresetContainerBox.default_preset_ID = 1; // Indicates initial preset activated. + moov->PresetContainerBox.num_preset = numpres; + + return sizePRCO; + +} //close function + +int rulescontainer(MovieBox *moov, int SelRuleType, int SelRule_PAR1, int SelRule_PAR2, + int MixRuleType, int MixRule_PAR1, int MixRule_PAR2, + int MixRule_PAR3, int MixRule_PAR4) { + + int swap; + u32 add_size = 0; //for SelectionRulesBox + u32 sizeRUSC, sizeRUCO, sizeRUMX; + + + //Selection Rules + moov->RulesContainer.num_selection_rules = bytereverse16(1); + moov->RulesContainer.SelectionRules.selection_rule_ID = bytereverse16(1); + + switch (SelRuleType) { + + case 0: moov->RulesContainer.SelectionRules.selection_rule_type = 0; + moov->RulesContainer.SelectionRules.element_ID = bytereverse(2147483649+1); // Must be the same ID of the group + moov->RulesContainer.SelectionRules.min_num_elements = bytereverse16(SelRule_PAR1); + moov->RulesContainer.SelectionRules.max_num_elements = bytereverse16(SelRule_PAR2); + strcpy(moov->RulesContainer.SelectionRules.rule_description,"Min/Max Rule"); + add_size = 4; + break; + case 1: moov->RulesContainer.SelectionRules.selection_rule_type = 1; + moov->RulesContainer.SelectionRules.element_ID = bytereverse(SelRule_PAR1); + moov->RulesContainer.SelectionRules.key_element_ID =bytereverse(SelRule_PAR2); + strcpy(moov->RulesContainer.SelectionRules.rule_description,"Exclusion Rule"); + add_size = 4; + break; + case 2: moov->RulesContainer.SelectionRules.selection_rule_type = 2; + moov->RulesContainer.SelectionRules.element_ID = bytereverse(SelRule_PAR1); + strcpy(moov->RulesContainer.SelectionRules.rule_description,"Not mute Rule"); + add_size = 0; + break; + case 3: moov->RulesContainer.SelectionRules.selection_rule_type = 3; + moov->RulesContainer.SelectionRules.element_ID = bytereverse(SelRule_PAR1); + moov->RulesContainer.SelectionRules.key_element_ID =bytereverse(SelRule_PAR2); + strcpy(moov->RulesContainer.SelectionRules.rule_description,"Implication Rule"); + add_size = 4; + break; + default: printf("ERROR in RULES CONTAINER/Selection Rules"); + system("pause"); + break; + } + + sizeRUSC = 19 + 20 + add_size; + moov->RulesContainer.SelectionRules.size = bytereverse(sizeRUSC); + moov->RulesContainer.SelectionRules.type = bytereverse('rusc'); + moov->RulesContainer.SelectionRules.version = 0; + + //Mixing Rule + moov->RulesContainer.num_mixing_rules = bytereverse16(1); + moov->RulesContainer.MixingRules.mixing_rule_ID = bytereverse16(1); + + switch (MixRuleType) { + + case 0: moov->RulesContainer.MixingRules.mixing_type = 0; + moov->RulesContainer.MixingRules.element_ID = bytereverse(MixRule_PAR1); + moov->RulesContainer.MixingRules.key_elem_ID = bytereverse(MixRule_PAR2); + strcpy(moov->RulesContainer.MixingRules.mix_description, "Equivalence rule"); + break; + case 1: moov->RulesContainer.MixingRules.mixing_type = 1; + moov->RulesContainer.MixingRules.element_ID = bytereverse(MixRule_PAR2); + moov->RulesContainer.MixingRules.key_elem_ID = bytereverse(MixRule_PAR1); + strcpy(moov->RulesContainer.MixingRules.mix_description, "Upper rule"); + break; + case 2: moov->RulesContainer.MixingRules.mixing_type = 2; + moov->RulesContainer.MixingRules.element_ID = bytereverse(MixRule_PAR2); + moov->RulesContainer.MixingRules.key_elem_ID = bytereverse(MixRule_PAR1); + strcpy(moov->RulesContainer.MixingRules.mix_description, "Lower rule"); + break; + case 3: moov->RulesContainer.MixingRules.mixing_type = 3; + moov->RulesContainer.MixingRules.element_ID = bytereverse(MixRule_PAR1); + moov->RulesContainer.MixingRules.min_volume = bytereverse16(1 + MixRule_PAR3*2.5); // 8.8 fixed point + moov->RulesContainer.MixingRules.max_volume = bytereverse16(1 + MixRule_PAR4*2.5); // 8.8 fixed point + strcpy(moov->RulesContainer.MixingRules.mix_description, "Limit rule"); + break; + default: printf("ERROR in RULES CONTAINER/Mixing Rules"); + system("pause"); + exit(1); + break; + } + + sizeRUMX = 23 + 17; + moov->RulesContainer.MixingRules.size = bytereverse(sizeRUMX); + moov->RulesContainer.MixingRules.type = bytereverse('rumx'); + moov->RulesContainer.MixingRules.version = 0; + + //Rule container + sizeRUCO = 12 + sizeRUSC + sizeRUMX; + swap = bytereverse(sizeRUCO); + moov->RulesContainer.size = swap; + swap = bytereverse('ruco'); + moov->RulesContainer.type = swap; + + return sizeRUCO; + +} // close function + +void moovheaderbox (MovieBox *moov, int clock, int sizeTRAK, int sizePRCO, int totaltracks, + int durationTrack, int sizeRUCO, int sizeGRCO) { + int swap; + u32 sizeMOOV; //MovieBox + + //MovieHeader + u32 sizeMVHD = 108; + swap = bytereverse (sizeMVHD); + moov->MovieHeaderBox.size = swap; + swap = bytereverse ('mvhd'); + moov->MovieHeaderBox.type = swap; + moov->MovieHeaderBox.version = 0; + swap = bytereverse (clock); + moov->MovieHeaderBox.creation_time = swap; + moov->MovieHeaderBox.modification_time = swap; + swap = bytereverse (1000); + moov->MovieHeaderBox.timescale = swap; + swap = bytereverse (durationTrack); + moov->MovieHeaderBox.duration = swap; + swap = bytereverse (0x00010000); + moov->MovieHeaderBox.rate = swap; + swap = bytereverse (1); + moov->MovieHeaderBox.volume = 1; + moov->MovieHeaderBox.reserved=0; + moov->MovieHeaderBox.reserved2[0] = 0; + moov->MovieHeaderBox.reserved2[1] = 0; + swap = bytereverse (0x00010000); + moov->MovieHeaderBox.matrix[0] = swap; + moov->MovieHeaderBox.matrix[1] = 0; + moov->MovieHeaderBox.matrix[2] = 0; + moov->MovieHeaderBox.matrix[3] = 0; + moov->MovieHeaderBox.matrix[4] = swap; + moov->MovieHeaderBox.matrix[5] = 0; + moov->MovieHeaderBox.matrix[6] = 0; + moov->MovieHeaderBox.matrix[7] = 0; + swap = bytereverse (0x40000000); + moov->MovieHeaderBox.matrix[8] = 0x40000000; + moov->MovieHeaderBox.pre_defined[0] = 0; + moov->MovieHeaderBox.pre_defined[1] = 0; + moov->MovieHeaderBox.pre_defined[2] = 0; + moov->MovieHeaderBox.pre_defined[3] = 0; + moov->MovieHeaderBox.pre_defined[4] = 0; + moov->MovieHeaderBox.pre_defined[5] = 0; + swap = bytereverse (totaltracks + 1); + moov->MovieHeaderBox.next_track_ID = swap; + + //MovieBox + sizeMOOV = sizeMVHD + sizeTRAK + sizePRCO + sizeRUCO + sizeGRCO + 8; + swap = bytereverse (sizeMOOV); //Size movie: Taking into account number tracks + moov->size = swap; + swap = bytereverse ('moov'); + moov->type = swap; +} + + +void writemoovbox(MovieBox moov, int numtrack,int totaltracks, FILE *imf, FILE *text) +{ + int i, j, k, m, t, swap, pos, temp, type; + int cnt = 0, cnt2 = 0, d = 0, dat = 0, dat1 = 0, dat2 = 0, dat3 = 0, size = 0; + u16 numgroups, numel; + + + //Write movie box// + fwrite(&moov.size, sizeof(u32), 1, imf); + fwrite(&moov.type, sizeof(u32), 1, imf); + //Movie header// + fwrite(&moov.MovieHeaderBox, sizeof(moov.MovieHeaderBox), 1, imf); + //Track container// + for (numtrack = 0; numtrack < totaltracks; numtrack++) { + fwrite(&moov.TrackBox[numtrack].size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].type, sizeof(u32), 1, imf); + //Trck header// + fwrite(&moov.TrackBox[numtrack].TrackHeaderBox, sizeof(moov.TrackBox[numtrack].TrackHeaderBox), 1, imf); + //Media Box// + fwrite(&moov.TrackBox[numtrack].MediaBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.type, sizeof(u32), 1, imf); + //Media Header// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaHeaderBox, + sizeof(moov.TrackBox[numtrack].MediaBox.MediaHeaderBox), 1, imf); + //Handler Box// + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.pre_defined, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.handler_type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[0], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[1], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[2], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[0], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[1], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[2], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[3], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[4], sizeof(unsigned char), 1, imf); + //Media inforamtion box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.type, sizeof(u32), 1, imf); + //Sound media header// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox, + sizeof(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SoundMediaHeaderBox), 1, imf); + //Data reference// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox, + sizeof(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox), 1, imf); + //Sample table box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.type, sizeof(u32), 1, imf); + + //Time to sample box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.entry_count, sizeof(u32), 1, imf); + + swap = bytereverse(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.entry_count); + pos = swap; + + for (i=0; i<pos; i++) { + + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[i], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[i], sizeof(u32), 1, imf); + } + + //Sample description box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.entry_count, sizeof(u32), 1, imf); + //Audio Sample entry// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved[0], sizeof(unsigned char), 6, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.data_reference_index, sizeof(u16), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved2[0], sizeof(u32), 2, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.channelcount, sizeof(u16), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.samplesize, sizeof(u16), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.reserved3, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.samplerate, sizeof(u32), 1, imf); + //ESDBox// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.version, sizeof(u32), 1, imf); + //ES Descriptor// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.tag + , sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.length + , sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.ES_ID + , sizeof(u16), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.mix + , sizeof(unsigned char), 1, imf); + //Decoder Config// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + tag, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + length, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + objectProfileInd, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + mix, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + maxBitRate, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + avgBitrate, sizeof(u32), 1, imf); +/* //DecoderSpecificInfo// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + DecoderSpecificInfo.tag, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + DecoderSpecificInfo.length, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + DecoderSpecificInfo.decSpecificInfoData[0], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.DecoderConfigDescriptor. + DecoderSpecificInfo.decSpecificInfoData[1], sizeof(unsigned char), 1, imf); + */ //SLConfig// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.SLConfigDescriptor. + tag, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.SLConfigDescriptor. + length, sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.AudioSampleEntry.ESbox.ES_Descriptor.SLConfigDescriptor. + predifined, sizeof(unsigned char), 1, imf); + + + //Sample Size box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_count, sizeof(u32), 1, imf); + swap = bytereverse(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_count); + for(i=0; i<swap; i++){ + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.entry_size[i], sizeof(u32), 1, imf); + } + + //Sample to chunk box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.entry_count, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.first_chunk, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.samples_per_chunk, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.sample_description_index, sizeof(u32), 1, imf); + + //Chunk offset// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.entry_count, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.chunk_offset[numtrack], sizeof(u32), 1, imf); + } + + //Group Container + fwrite(&moov.GroupContainerBox.size, sizeof(u32), 1, imf); + fwrite(&moov.GroupContainerBox.type, sizeof(u32), 1, imf); + fwrite(&moov.GroupContainerBox.num_groups, sizeof(u16), 1, imf); + //Group Box + numgroups = bytereverse16(moov.GroupContainerBox.num_groups); + for(i=0; i<numgroups; i++){ + fwrite(&moov.GroupContainerBox.GroupBox[i].size, sizeof(u32), 1, imf); + fwrite(&moov.GroupContainerBox.GroupBox[i].type, sizeof(u32), 1, imf); + fwrite(&moov.GroupContainerBox.GroupBox[i].version, sizeof(u32), 1, imf); + fwrite(&moov.GroupContainerBox.GroupBox[i].group_ID, sizeof(u32), 1, imf); + fwrite(&moov.GroupContainerBox.GroupBox[i].num_elements, sizeof(u16), 1, imf); + numel = bytereverse16(moov.GroupContainerBox.GroupBox[i].num_elements); + for(j=0; j<numel; j++){ + fwrite(&moov.GroupContainerBox.GroupBox[i].groupElemId[j].element_ID, sizeof(u32), 1, imf); + } + fwrite(&moov.GroupContainerBox.GroupBox[i].group_activation_mode, sizeof(unsigned char), 1, imf); + if(moov.GroupContainerBox.GroupBox[i].group_activation_mode==2){ + fwrite(&moov.GroupContainerBox.GroupBox[i].group_activation_elements_number, sizeof(u16), 1, imf); + } + fwrite(&moov.GroupContainerBox.GroupBox[i].group_reference_volume, sizeof(u16), 1, imf); + for (j=0; j<22; j++) { + fwrite(&moov.GroupContainerBox.GroupBox[i].group_name[j], sizeof(char), 1, imf); + } + for (j=0; j<32; j++) { + fwrite(&moov.GroupContainerBox.GroupBox[i].group_description[j], sizeof(char), 1, imf); + } + + } + + //PresetContainerBox + fwrite(&moov.PresetContainerBox.size, sizeof(u32), 1, imf); + fwrite(&moov.PresetContainerBox.type, sizeof(u32), 1, imf); + fwrite(&moov.PresetContainerBox.num_preset, sizeof(unsigned char), 1, imf); + fwrite(&moov.PresetContainerBox.default_preset_ID, sizeof(unsigned char), 1, imf); + + //Preset Box + for (i=0; i<moov.PresetContainerBox.num_preset; i++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].size, sizeof(u32), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].type, sizeof(u32), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].flags, sizeof(u32), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].preset_ID, sizeof(unsigned char), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].num_preset_elements, sizeof(unsigned char), 1, imf); + for (j=0; j< moov.PresetContainerBox.PresetBox[i].num_preset_elements; j++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].presElemId[j]. + preset_element_ID, sizeof(u32), 1, imf); + } + fwrite(&moov.PresetContainerBox.PresetBox[i].preset_type , sizeof(unsigned char), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].preset_global_volume, sizeof(unsigned char), 1, imf); + + type = moov.PresetContainerBox.PresetBox[i].preset_type; + + switch(type){ + + case 0: for (j=0; j< moov.PresetContainerBox.PresetBox[i].num_preset_elements; j++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j]. + preset_volume_element,sizeof(unsigned char), 1, imf); + } + break; + case 1: for (j=0; j<num_ch; j++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticObjectVolume.InputCH[j]. + num_input_channel,sizeof(unsigned char), 1, imf); + } + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticObjectVolume.output_channel_type, sizeof(unsigned char), 1, imf); + for (j=0; j<totaltracks; j++){ + for (k=0; k<num_ch; k++){ + for (m=0; m<num_ch; m++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticObjectVolume.presElVol[j]. + Input[k].Output[m].preset_volume_element, sizeof(unsigned char), 1, imf); + } + } + } + break; + case 2: fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackVolume.num_updates, sizeof(u16), 1, imf); + temp = bytereverse16(moov.PresetContainerBox.PresetBox[i].DynamicTrackVolume.num_updates); + for (j=0; j<temp; j++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackVolume. + DynamicChange[j].updated_sample_number, sizeof(u16), 1, imf); + for (k=0; k<totaltracks; k++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackVolume.DynamicChange[j]. + presVolumElem[k].preset_volume_element, sizeof(unsigned char), 1, imf); + } + } + break; + case 3: fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectVolume.num_updates, sizeof(u16), 1, imf); + for (j=0; j<totaltracks; j++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectVolume.InputCH[j].num_input_channel, sizeof(u8), 1, imf); + } + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectVolume.output_channel_type, sizeof(u8), 1, imf); + temp = bytereverse16(moov.PresetContainerBox.PresetBox[i].DynamicObjectVolume.num_updates); + for (j=0; j<temp; j++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectVolume. + DynamicChange[j].updated_sample_number, sizeof(u16), 1, imf); + for (k=0; k<totaltracks; k++){ + for (m=0; m<num_ch; m++){ + for (t=0; t<num_ch; t++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectVolume.DynamicChange[j]. + presElVol[k].Input[m].Output[t].preset_volume_element, sizeof(u8), 1, imf); + } + } + } + } + break; + case 4: fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.num_updates, sizeof(u16), 1, imf); + temp = bytereverse16(moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.num_updates); + for (j=0; j<temp; j++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].start_sample_number, sizeof(u16), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].duration_update, sizeof(u16), 1, imf); + for (k=0; k<totaltracks; k++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[j]. + presElVol[k].end_preset_volume_element, sizeof(unsigned char), 1, imf); + } + } + break; + case 5: // NOT YET IMPLEMENTED INTO THE PLAYER! + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.num_updates, sizeof(u16), 1, imf); + for (j=0; j<totaltracks; j++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.InputCH[j].num_input_channel, sizeof(u8), 1, imf); + } + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.output_channel_type, sizeof(u8), 1, imf); + temp = bytereverse16(moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.num_updates); + for (j=0; j<temp; j++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume. + DynamicChange[j].start_sample_number, sizeof(u16), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume. + DynamicChange[j].duration_update, sizeof(u16), 1, imf); + for (k=0; k<totaltracks; k++){ + for (m=0; m<num_ch; m++){ + for (t=0; t<num_ch; t++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicObjectApproxVolume.DynamicChange[j]. + presElVol[k].Input[m].Output[t].preset_volume_element, sizeof(u8), 1, imf); + } + } + } + } + break; + case 6: printf("\nERROR WRITING PRESET CONTAINER IN OUTPUT FILE - Not valid case (6)\n"); + system("pause"); + exit(1); + break; + case 7: printf("\nERROR WRITING PRESET CONTAINER IN OUTPUT FILE - Not valid case (7)\n"); + system("pause"); + exit(1); + break; + case 8: for (j=0; j< moov.PresetContainerBox.PresetBox[i].num_preset_elements; j++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j]. + preset_volume_element,sizeof(unsigned char), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.num_eq_filters, sizeof(u8), 1, imf); + //EQ + if (moov.PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.num_eq_filters != 0) { + for (k=0; k<moov.PresetContainerBox.PresetBox[i].StaticTrackVolume.presVolumElem[j].EQ.num_eq_filters; k++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume. + presVolumElem[j].EQ.Filter[k].filter_type, sizeof(u8), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume. + presVolumElem[j].EQ.Filter[k].filter_reference_frequency, sizeof(u16), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume. + presVolumElem[j].EQ.Filter[k].filter_gain, sizeof(u8), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].StaticTrackVolume. + presVolumElem[j].EQ.Filter[k].filter_bandwidth, sizeof(u8), 1, imf); + } //close for + } //close if + } + break; + case 9: // NOT YET IMPLEMENTED INTO THE PLAYER! + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + case 10:// NOT YET IMPLEMENTED INTO THE PLAYER! + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + case 11:// NOT YET IMPLEMENTED INTO THE PLAYER! + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + case 12:// NOT YET IMPLEMENTED INTO THE PLAYER! + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.num_updates, sizeof(u16), 1, imf); + temp = bytereverse16(moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.num_updates); + for (j=0; j<temp; j++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].start_sample_number, sizeof(u16), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].duration_update, sizeof(u16), 1, imf); + for (k=0; k<totaltracks; k++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume.DynamicChange[j]. + presElVol[k].end_preset_volume_element, sizeof(u8), 1, imf); + //EQ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.num_eq_filters, sizeof(u8), 1, imf); + if(moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.num_eq_filters != 0){ + for (t=0; t<moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.num_eq_filters; t++){ + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].filter_type, sizeof(u8), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].filter_reference_frequency, sizeof(u16), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].end_filter_gain, sizeof(u8), 1, imf); + fwrite(&moov.PresetContainerBox.PresetBox[i].DynamicTrackApproxVolume. + DynamicChange[j].presElVol[k].EQ.Filter[t].filter_bandwidth, sizeof(u8), 1, imf); + } // close for (t) + }//close if + + }// close for (k) + } //close for (j) + break; + case 13:// NOT YET IMPLEMENTED INTO THE PLAYER! + printf("\n\nTHIS PRESET IS NOT YET IMPLEMENTED INTO THE PLAYER!!! PLAYER MAY CRASH WITH THIS FILE!!!\n\n"); + break; + default: printf("\nERROR WRITING PRESET CONTAINER IN OUTPUT FILE - Not valid case (default)\n"); + system("pause"); + exit(1); + break; + + } // close switch + + for (j=0; j<50; j++) { + fwrite(&moov.PresetContainerBox.PresetBox[i].preset_name[j], sizeof(char), 1, imf); + } + + } // close for + + + //Rules Container// + fwrite(&moov.RulesContainer.size, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.type, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.num_selection_rules, sizeof(u16), 1, imf); + fwrite(&moov.RulesContainer.num_mixing_rules, sizeof(u16), 1, imf); + //Selection Rules// + fwrite(&moov.RulesContainer.SelectionRules.size, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.SelectionRules.type, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.SelectionRules.version, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.SelectionRules.selection_rule_ID, sizeof(u16), 1, imf); + fwrite(&moov.RulesContainer.SelectionRules.selection_rule_type, sizeof(unsigned char), 1, imf); + fwrite(&moov.RulesContainer.SelectionRules.element_ID, sizeof(u32), 1, imf); + + swap = moov.RulesContainer.SelectionRules.selection_rule_type; + if ( swap==0 ) { + fwrite(&moov.RulesContainer.SelectionRules.min_num_elements, sizeof(u16), 1, imf); + fwrite(&moov.RulesContainer.SelectionRules.max_num_elements, sizeof(u16), 1, imf); + } + if ( swap==1 || swap ==3 ){ + fwrite(&moov.RulesContainer.SelectionRules.key_element_ID, sizeof(u32), 1, imf); + } + + for(i=0; i<20; i++){ + fwrite(&moov.RulesContainer.SelectionRules.rule_description[i], sizeof(char), 1, imf); + } + + //Mixing Rules// + fwrite(&moov.RulesContainer.MixingRules.size, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.MixingRules.type, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.MixingRules.version, sizeof(u32), 1, imf); + fwrite(&moov.RulesContainer.MixingRules.mixing_rule_ID, sizeof(u16), 1, imf); + fwrite(&moov.RulesContainer.MixingRules.mixing_type,sizeof(unsigned char), 1, imf); + fwrite(&moov.RulesContainer.MixingRules.element_ID, sizeof(u32), 1, imf); + + swap = moov.RulesContainer.MixingRules.mixing_type; + if( swap==3 ){ + fwrite(&moov.RulesContainer.MixingRules.min_volume, sizeof(u16), 1, imf); + fwrite(&moov.RulesContainer.MixingRules.max_volume, sizeof(u16), 1, imf); + } else { + fwrite(&moov.RulesContainer.MixingRules.key_elem_ID, sizeof(u32), 1, imf); + } + for(i=0; i<17; i++){ + fwrite(&moov.RulesContainer.MixingRules.mix_description[i], + sizeof(char), 1, imf); + } + + //TIMED TEXT + fwrite(&moov.TrackBox[numtrack].size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].type, sizeof(u32), 1, imf); + //Track header// + fwrite(&moov.TrackBox[numtrack].TrackHeaderBox, + sizeof(moov.TrackBox[numtrack].TrackHeaderBox), 1, imf); + //Media Box// + fwrite(&moov.TrackBox[numtrack].MediaBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.type, sizeof(u32), 1, imf); + //Media Header// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaHeaderBox, + sizeof(moov.TrackBox[numtrack].MediaBox.MediaHeaderBox), 1, imf); + //Handler Box// + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.pre_defined, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.handler_type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[0], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[1], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.reserved[2], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[0], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[1], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[2], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[3], sizeof(unsigned char), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.HandlerBox.data[4], sizeof(unsigned char), 1, imf); + //Media information box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.type, sizeof(u32), 1, imf); + //Null media header// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.NullMediaHeaderBox.size, + sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.NullMediaHeaderBox.type, + sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.NullMediaHeaderBox.flags, + sizeof(u32), 1, imf); + //Data Information + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.size,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.type,sizeof(u32),1,imf); + //Data Reference + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.size,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.type,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.flags,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.entry_count,sizeof(u32),1,imf); + //Data Entry URL + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryUrlBox.size,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryUrlBox.type,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryUrlBox.flags,sizeof(u32),1,imf); + //Sample table box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + type, sizeof(u32), 1, imf); + //Time to sample box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.entry_count, sizeof(u32), 1, imf); + swap = bytereverse(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.entry_count); + pos = swap; + + for (i=0; i<pos; i++) { + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_count[i], sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.sample_delta[i], sizeof(u32), 1, imf); + } + + //Sample description box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.entry_count, sizeof(u32), 1, imf); + //tx3g + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.size,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.type,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.a,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.b,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.displayFlags,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.horizontaljustification,sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.verticaljustification,sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[0],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[1],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[2],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[3],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.top,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.left,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.bottom,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.right,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.startChar,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.endChar,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.fontID,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.facestyleflags,sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.fontsize,sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[0],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[1],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[2],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[3],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.size,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.type,sizeof(u32),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.entrycount,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.fontID,sizeof(u16),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.fontnamelenght,sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[0],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[1],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[2],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[3],sizeof(u8),1,imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox. + SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[4],sizeof(u8),1,imf); + //Sample Size box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_count, sizeof(u32), 1, imf); + swap = bytereverse(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.sample_count); + + for(i=0; i<swap; i++){ + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.entry_size[i], sizeof(u32), 1, imf); + } + + //Sample to chunk box// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.entry_count, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.first_chunk, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.samples_per_chunk, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.sample_description_index, sizeof(u32), 1, imf); + + //Chunk offset// + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.size, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.type, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.version, sizeof(u32), 1, imf); + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.entry_count, sizeof(u32), 1, imf); + swap=0x00; + fwrite(&swap,sizeof(u32),1,imf); + for (i=0;i<bytereverse(moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.entry_count);i++){ + + fwrite(&moov.TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.chunk_offset[i], sizeof(u32), 1, imf); + } + + //Song Image// + /* Go to function "writemeta" */ + +} + + +void writepresets(MovieBox moov, int numtrack,int totaltracks, FILE *imf) { + + //int i, j, k, m, t, temp, type; + + // this function is executed in "writemoovbox"; + // to be implemented as standalone +} + +// Fill the MetaBox + +int metacontainer(MetaBox *meta) { + //int swap; + + u32 sizeMETA; + u32 sizeHDLR = 36; + u32 sizeDINF; + u32 sizeDREF = 0; //16 + u32 sizeURL = 0; //12 + u32 sizeILOC = 36 - 2; + u32 sizeIINF; + u32 sizeINFE = 44; + u32 sizeXML = 12 + 2000; + char name[6] = "image"; + char type_content[18] = "application/other"; + char encoding[4] = "jpg"; + + //METADATA + char xml[2000] = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><Mpeg7 xmlns=\"urn:mpeg:mpeg7:schema:2001\"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:mpeg7=\"urn:mpeg:mpeg7:schema:2001\"xmlns:xml=\"http://www.w3.org/XML/1998/namespace\"xsi:schemaLocation=\"urn:mpeg:mpeg7:schema:2001 Mpeg7-2001.xsd\"><Description xsi:type=\"CreationDescriptionType\"><CreationInformation><Creation><Title type=\"songTitle\">IMAF Song</Title><Title type=\"albumTitle\">Encoder</Title><Abstract><FreeTextAnnotation>QMUL</FreeTextAnnotation></Abstract><Creator><Role href=\"urn:mpeg:mpeg7:RoleCS:2001:PERFORMER\"/><Agent xsi:type=\"PersonType\"><Name><FamilyName></FamilyName><GivenName>Frank Sinatra</GivenName></Name></Agent></Creator><CreationCoordinates><Date><TimePoint>2013</TimePoint></Date></CreationCoordinates><CopyrightString></CopyrightString></Creation><Classification><Genre href=\"urn:id3:cs:ID3genreCS:v1:12\"><Name>Electro</Name></Genre></Classification></CreationInformation></Description><Description xsi:type=\"SemanticDescriptionType\"> <Semantics> <SemanticBase xsi:type=\"SemanticStateType\"><AttributeValuePair><Attribute><TermUse href=\"urn:mpeg:maf:cs:musicplayer:CollectionElementsCS:2007:assetNum\"/></Attribute><IntegerValue>07</IntegerValue></AttributeValuePair><AttributeValuePair><Attribute><TermUse href=\"urn:mpeg:maf:cs:musicplayer:CollectionElementsCS:2013:assetTot\"/></Attribute><IntegerValue>11</IntegerValue></AttributeValuePair></SemanticBase></Semantics></Description><Description xsi:type=\"SemanticDescriptionType\"><MediaInformation><MediaIdentification><EntityIdentifier></EntityIdentifier></MediaIdentification></MediaInformation></Description></Mpeg7>"; + + sizeDINF = 8;// + sizeDREF + sizeURL; + sizeIINF = 14 + sizeINFE; + sizeMETA = 12 + sizeHDLR + sizeDINF + sizeILOC + sizeIINF + sizeXML; + + meta->size = bytereverse(sizeMETA); + meta->type = bytereverse('meta'); + meta->version = 0; + //HandlerBox + meta->theHandler.size = bytereverse(sizeHDLR); + meta->theHandler.type = bytereverse('hdlr'); + meta->theHandler.version = 0; + meta->theHandler.pre_defined = 0; + meta->theHandler.handler_type = bytereverse('meta'); + meta->theHandler.reserved[0] = 0; + meta->theHandler.reserved[1] = 0; + meta->theHandler.reserved[2] = 0; + meta->theHandler.name[0] = bytereverse('m'); + meta->theHandler.name[1] = bytereverse('p'); + meta->theHandler.name[2] = bytereverse('7'); + meta->theHandler.name[3] = bytereverse('t'); + //DataInformationBox + meta->file_locations.size = bytereverse(sizeDINF); + meta->file_locations.type = bytereverse('dinf'); + /* + //DataReferenceBox + meta->file_locations.DataReferenceBox.size = bytereverse(sizeDREF); + meta->file_locations.DataReferenceBox.type = bytereverse('dref'); + meta->file_locations.DataReferenceBox.flags = bytereverse(0); // CHECK THIS VALUE + meta->file_locations.DataReferenceBox.entry_count = bytereverse(1); + //DataEntryUrlBox + meta->file_locations.DataReferenceBox.DataEntryUrlBox.size = bytereverse(sizeURL); + meta->file_locations.DataReferenceBox.DataEntryUrlBox.type = bytereverse('url '); // 'url ' with blank space + meta->file_locations.DataReferenceBox.DataEntryUrlBox.flags = bytereverse(0); // CHECK THIS VALUE + */ + //item_location + meta->item_locations.size = bytereverse(sizeILOC); + meta->item_locations.type = bytereverse('iloc'); + meta->item_locations.version = 0; + meta->item_locations.offset_size = 68; // 0100|0100 offset_size = 4 + lenght_size = 4 + //meta->item_locations.lenght_size = 4; //already included + meta->item_locations.base_offset_size = 64; // 0100|0000 base_offset_size = 4 + reserved = 0 + //meta->item_locations.reserved = 0; //already included + meta->item_locations.item_count = bytereverse16(1); + meta->item_locations.item_ID = bytereverse16(1); + meta->item_locations.data_reference_index = 0; + //meta->item_locations.base_offset = bytereverse(); // corresponding to iloc_offset in insertImage function + meta->item_locations.extent_count = bytereverse16(1); + //meta->item_locations.extent_offset = bytereverse(); // corresponding to iloc_offset in insertImage function + //meta->item_locations.extent_length = bytereverse(); // corresponding to imagesize in insertImage function + + //ItemInfoBox + meta->item_infos.size = bytereverse(sizeIINF); + meta->item_infos.type = bytereverse('iinf'); + meta->item_infos.version = 0; + meta->item_infos.entry_count = bytereverse16(1); + + //info_entry + meta->item_infos.info_entry.size = bytereverse(sizeINFE); + meta->item_infos.info_entry.type = bytereverse('infe'); + meta->item_infos.info_entry.version = 0; + meta->item_infos.info_entry.item_ID = bytereverse16(1); + meta->item_infos.info_entry.item_protection_index = 0; + strcpy(meta->item_infos.info_entry.item_name, name); + strcpy(meta->item_infos.info_entry.content_type, type_content); + strcpy(meta->item_infos.info_entry.content_encoding, encoding); + + //XMLBox (MetaData) + meta->XMLBox.size = bytereverse(sizeXML); + meta->XMLBox.type = bytereverse('xml '); + meta->XMLBox.version = 0; + strcpy(meta->XMLBox.string, xml); + + return sizeMETA; +} + +//Read the image's size +u32 getImageSize(const char *imagedir){ + u32 size; + FILE *img; + + img = fopen(imagedir,"rb"); + + //Calculate size of the picture + fseek(img,0,SEEK_END); + size = ftell(img); + fclose(img); + + return size; +} +//Read the text´s size +int getTextSize (FILE *text){ + + int d=0,sizetext=0,dat=0,dat1=0,dat2=0,dat3=0; + + //TEXT-FILE + //Find mdat in text file in order to know the size of the text file + d=0; + while(d==0){ + + fread (&dat,sizeof(unsigned char),1,text); //read a byte and saves it in dat + fread (&dat1,sizeof(unsigned char),1,text); + fread (&dat2,sizeof(unsigned char),1,text); + fread (&dat3,sizeof(unsigned char),1,text); + fseek(text,-3,SEEK_CUR); + + if(dat == 0x6D && dat1 == 0x64 && dat2 == 0x61 && dat3 == 0x74){ // 6D646174 = mdat + d=1; + } + + } //close while + + fseek (text,-5,SEEK_CUR);//positionate the pointer at the first byte of size + fread (&dat,sizeof(unsigned char),1,text); //first byte of size + fread (&dat1,sizeof(unsigned char),1,text);//second byte of size + fread (&dat2,sizeof(unsigned char),1,text);//third byte of size + fread (&dat3,sizeof(unsigned char),1,text);//fourth byte of size + + sizetext = (dat<<24) | (dat1<<16) | (dat2<<8) | (dat3); + sizetext = sizetext-8-16; //4 bytes of size and 4 bytes of type and 16 bytes of padding + + fseek (text,20,SEEK_CUR);//Advance 20 bytes, because the pointer must advance 20 bytes to read the size of the first string.This is because of the way that Quicktime creates the 3gp + + return sizetext; + + +} + +//Read the JPEG file + +void insertImage (MetaBox *meta, FILE **imf, u32 imagesize, const char *imagedir) { + + FILE *img; + u64 iloc_offset = 0; + unsigned char *imgbuffer; + + img = fopen(imagedir,"rb"); + + // Binary reading + fseek(img,0,SEEK_SET); + imgbuffer= (unsigned char*)malloc(sizeof(unsigned char)*imagesize); + fread(imgbuffer, 1, imagesize, img); + fclose(img); + + // Find position in the IMAF file and write the image + iloc_offset = ftell(*imf); + fwrite(imgbuffer,1,imagesize, *imf); + + // Set image size and offset values + meta->item_locations.base_offset = bytereverse(iloc_offset); + meta->item_locations.extent_length = bytereverse(imagesize); + meta->item_locations.extent_offset = bytereverse(iloc_offset); + +} + + +void writemetabox(MetaBox meta, FILE *imf) { + + int i=0; + + //MetaBox + fwrite(&meta.size, sizeof(u32), 1, imf); + fwrite(&meta.type, sizeof(u32), 1, imf); + fwrite(&meta.version, sizeof(u32), 1, imf); + //Handler + fwrite(&meta.theHandler.size, sizeof(u32), 1, imf); + fwrite(&meta.theHandler.type, sizeof(u32), 1, imf); + fwrite(&meta.theHandler.version, sizeof(u32), 1, imf); + fwrite(&meta.theHandler.pre_defined, sizeof(u32), 1, imf); + fwrite(&meta.theHandler.handler_type, sizeof(u32), 1, imf); + fwrite(&meta.theHandler.reserved[0], sizeof(u32), 1, imf); + fwrite(&meta.theHandler.reserved[1], sizeof(u32), 1, imf); + fwrite(&meta.theHandler.reserved[2], sizeof(u32), 1, imf); + fwrite(&meta.theHandler.name[0], sizeof(unsigned char), 1, imf); + fwrite(&meta.theHandler.name[1], sizeof(unsigned char), 1, imf); + fwrite(&meta.theHandler.name[2], sizeof(unsigned char), 1, imf); + fwrite(&meta.theHandler.name[3], sizeof(unsigned char), 1, imf); + //Data Information Box + fwrite(&meta.file_locations.size, sizeof(u32), 1, imf); + fwrite(&meta.file_locations.type, sizeof(u32), 1, imf); + /* + //Data Reference + fwrite(&meta.file_locations.DataReferenceBox.size, sizeof(u32), 1, imf); + fwrite(&meta.file_locations.DataReferenceBox.type, sizeof(u32), 1, imf); + fwrite(&meta.file_locations.DataReferenceBox.flags, sizeof(u32), 1, imf); + fwrite(&meta.file_locations.DataReferenceBox.entry_count, sizeof(u32), 1, imf); + + fwrite(&meta.file_locations.DataReferenceBox.DataEntryUrlBox.size, sizeof(u32), 1, imf); + fwrite(&meta.file_locations.DataReferenceBox.DataEntryUrlBox.type, sizeof(u32), 1, imf); + fwrite(&meta.file_locations.DataReferenceBox.DataEntryUrlBox.flags, sizeof(u32), 1, imf); + */ + //Item Location Box + fwrite(&meta.item_locations.size, sizeof(u32), 1, imf); + fwrite(&meta.item_locations.type, sizeof(u32), 1, imf); + fwrite(&meta.item_locations.version, sizeof(u32), 1, imf); + fwrite(&meta.item_locations.offset_size, sizeof(unsigned char), 1, imf); + //fwrite(&meta.item_locations.lenght_size, sizeof(unsigned char), 1, imf); + fwrite(&meta.item_locations.base_offset_size, sizeof(unsigned char), 1, imf); + //fwrite(&meta.item_locations.reserved, sizeof(unsigned char), 1, imf); + fwrite(&meta.item_locations.item_count, sizeof(u16), 1, imf); + fwrite(&meta.item_locations.item_ID, sizeof(u16), 1, imf); + fwrite(&meta.item_locations.data_reference_index, sizeof(u16), 1, imf); + fwrite(&meta.item_locations.base_offset, sizeof(u32), 1, imf); + fwrite(&meta.item_locations.extent_count, sizeof(u16), 1, imf); + fwrite(&meta.item_locations.extent_offset, sizeof(u32), 1, imf); + fwrite(&meta.item_locations.extent_length, sizeof(u32), 1, imf); + //Item Info + fwrite(&meta.item_infos.size, sizeof(u32), 1, imf); + fwrite(&meta.item_infos.type, sizeof(u32), 1, imf); + fwrite(&meta.item_infos.version, sizeof(u32), 1, imf); + fwrite(&meta.item_infos.entry_count, sizeof(u16), 1, imf); + //Info Entry + fwrite(&meta.item_infos.info_entry.size, sizeof(u32), 1, imf); + fwrite(&meta.item_infos.info_entry.type, sizeof(u32), 1, imf); + fwrite(&meta.item_infos.info_entry.version, sizeof(u32), 1, imf); + fwrite(&meta.item_infos.info_entry.item_ID, sizeof(u16), 1, imf); + fwrite(&meta.item_infos.info_entry.item_protection_index, sizeof(u16), 1, imf); + for (i=0; i<6; i++){ + fwrite(&meta.item_infos.info_entry.item_name[i], sizeof(char), 1, imf); + } + for (i=0; i<18; i++){ + fwrite(&meta.item_infos.info_entry.content_type[i], sizeof(char), 1, imf); + } + for (i=0; i<4; i++){ + fwrite(&meta.item_infos.info_entry.content_encoding[i], sizeof(char), 1, imf); + } + //XML for metadata + fwrite(&meta.XMLBox.size, sizeof(u32), 1, imf); + fwrite(&meta.XMLBox.type, sizeof(u32), 1, imf); + fwrite(&meta.XMLBox.version, sizeof(u32), 1, imf); + for(i=0; i<2000; i++){ + fwrite(&meta.XMLBox.string[i], sizeof(char), 1, imf); + } + +} + +//TIMED-TEXT's funcionts +int trackstructure_text (MovieBox *moov, int numtrack, int clock, + int durationTrack, int sizemdat, const char *textfile,FILE *text,int totaltracks ) { // creates the text trak structure + int swap; + u32 sizeURL; + u32 sizeDREF; + u32 sizeDINF; + u32 sizeSMHD; + u32 sizeMINF; + u32 sizeHDLR; + u32 sizeMDHD; + u32 sizeMDIA; + u32 sizeTKHD; + u32 sizeTRAK; + + + //Sample Table Box + int sizeSTBL = 0; + + sizeSTBL = samplecontainer_text(moov, numtrack,sizemdat, textfile,totaltracks); + + //Data Entry Url Box + sizeURL = 12; + swap = bytereverse(sizeURL); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.DataEntryUrlBox.size = swap; + swap = bytereverse('url '); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.DataEntryUrlBox.type = swap; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.DataEntryUrlBox.flags = swap; // =1 Track in same file as movie atom. + + //Data Reference + sizeDREF = sizeURL+ 16; + swap = bytereverse(sizeDREF); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.size = swap; + swap = bytereverse('dref'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.flags = 0; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox. + DataReferenceBox.entry_count = swap; + + //Data information Box// + sizeDINF = sizeDREF + 8; + swap = bytereverse(sizeDINF); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.size = swap; + swap = bytereverse('dinf'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.DataInformationBox.type = swap; + + + //Null Media Header Box + swap = bytereverse(12); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.NullMediaHeaderBox.size = swap ; + swap = bytereverse ('nmhd'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.NullMediaHeaderBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.NullMediaHeaderBox.flags = 0; + + //Media Information Box// + sizeMINF = sizeDINF + sizeSTBL + 8 + 12; + swap = bytereverse(sizeMINF); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.size = swap; + swap = bytereverse('minf'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.type = swap; + + //Handler Box// + sizeHDLR = 37; + swap = bytereverse(sizeHDLR); + moov->TrackBox[numtrack].MediaBox.HandlerBox.size = swap; + swap = bytereverse('hdlr'); + moov->TrackBox[numtrack].MediaBox.HandlerBox.type = swap; + moov->TrackBox[numtrack].MediaBox.HandlerBox.version = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.pre_defined = 0; + swap = bytereverse('text'); + moov->TrackBox[numtrack].MediaBox.HandlerBox.handler_type = swap; + moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[0] = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[1] = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.reserved[2] = 0; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[0] = 't'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[1] = 'e'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[2] = 'x'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[3] = 't'; + moov->TrackBox[numtrack].MediaBox.HandlerBox.data[4] = '\0'; + + //Media Header Box// + sizeMDHD = 32; + swap = bytereverse(sizeMDHD); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.size = swap; + swap = bytereverse('mdhd'); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.version = 0; + swap = bytereverse(clock); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.creation_time = swap; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.modification_time = swap; + swap = bytereverse(1000); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.timescale = swap; + swap = bytereverse(durationTrack); + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.duration = swap; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.language = 0xC455; + moov->TrackBox[numtrack].MediaBox.MediaHeaderBox.pre_defined = 0; + + //Media Box// + sizeMDIA = sizeMDHD + sizeHDLR + sizeMINF + 8; + swap = bytereverse(sizeMDIA); + moov->TrackBox[numtrack].MediaBox.size = swap; + swap = bytereverse('mdia'); + moov->TrackBox[numtrack].MediaBox.type = swap; + + //Track Header// + sizeTKHD = 92; + swap = bytereverse (sizeTKHD); + moov->TrackBox[numtrack].TrackHeaderBox.size = swap; + swap = bytereverse ('tkhd'); + moov->TrackBox[numtrack].TrackHeaderBox.type = swap ; + swap = bytereverse (0x00000007); + moov->TrackBox[numtrack].TrackHeaderBox.version = swap; + swap = bytereverse (clock); + moov->TrackBox[numtrack].TrackHeaderBox.creation_time = swap; + moov->TrackBox[numtrack].TrackHeaderBox.modification_time = swap; + moov->TrackBox[numtrack].TrackHeaderBox.track_ID = bytereverse(12345678); + moov->TrackBox[numtrack].TrackHeaderBox.reserved = 0; + swap = bytereverse (durationTrack); + moov->TrackBox[numtrack].TrackHeaderBox.duration = swap; + moov->TrackBox[numtrack].TrackHeaderBox.reserved2[0] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.reserved2[1] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.layer = 0; + moov->TrackBox[numtrack].TrackHeaderBox.alternate_group = 0; + moov->TrackBox[numtrack].TrackHeaderBox.volume = 0; + moov->TrackBox[numtrack].TrackHeaderBox.reserved3 = 0; + swap = bytereverse (0x00010000); + moov->TrackBox[numtrack].TrackHeaderBox.matrix[0] = swap; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[1] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[2] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[3] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[4] = swap; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[5] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[6] = 0; + moov->TrackBox[numtrack].TrackHeaderBox.matrix[7] = 0; + swap = bytereverse(0x40000000); + moov->TrackBox[numtrack].TrackHeaderBox.matrix[8] = swap; + moov->TrackBox[numtrack].TrackHeaderBox.width =0; + moov->TrackBox[numtrack].TrackHeaderBox.height = 0; + + //Track container + sizeTRAK = sizeTKHD + sizeMDIA + 8; + swap = bytereverse (sizeTRAK); // Size of one track + moov->TrackBox[numtrack].size = swap; + swap = bytereverse ('trak'); + moov->TrackBox[numtrack].type = swap; + + return sizeTRAK; +} + + +int aux (FILE *text,int num,int num1,int num2,int num3,int *sal) { + int dat=0,dat1=0,dat2=0,dat3=0,size=0,d=0,cnt=0,i=0; + fseek(text,0,SEEK_SET); + d=0; + while(d==0){ + + fread (&dat,sizeof(unsigned char),1,text); + cnt++; + fread (&dat1,sizeof(unsigned char),1,text); + cnt++; + fread (&dat2,sizeof(unsigned char),1,text); + cnt++; + fread (&dat3,sizeof(unsigned char),1,text); + cnt++; + fseek(text, -3 ,SEEK_CUR); + if(dat == num && dat1 == num1 && dat2 == num2 && dat3 == num3){ + + d=1; + } + + else{ + + cnt=cnt-3; + } + + } //end while + + + fseek (text,0,SEEK_SET);//positionate the pointer at first + + cnt=cnt-7;//size is located 7 bytes before type + for (d=1;d<=cnt;d++){ + + fread (&dat,sizeof(unsigned char),1,text); + + } + fread (&dat1,sizeof(unsigned char),1,text); + fread (&dat2,sizeof(unsigned char),1,text); + fread (&dat3,sizeof(unsigned char),1,text); + + size = (dat<<24) | (dat1<<16) | (dat2<<8) | (dat3); + + for (i=1;i<=8;i++) { //advance sample_size + fread (&dat,sizeof(unsigned char),1,text); + } + fread(&dat,1,1,text); + fread(&dat1,1,1,text); + fread(&dat2,1,1,text); + fread(&dat3,1,1,text); + + *sal = (dat<<24) | (dat1<<16) | (dat2<<8) | (dat3); + + + return size; + +} + +int samplecontainer_text(MovieBox *moov, int numtrack, int sizemdat,const char *textfiles,int totaltracks) { + + u32 sizeSTSD, sizeSTSZ, swap,i=0; + u32 sizeSTTS; + u32 sizeSTSC = 0; + u32 sizeSTCO = 0; + u32 sizeSTBL=0; + int dat=0,dat1=0,dat2=0,dat3=0,sal=0, samplecount=0; + + //Sample Description Box// + FILE *text; + + text=fopen ( textfiles,"rb"); + fseek(text,0,SEEK_CUR); + + //stsd + + sizeSTSD =16+64; + swap = bytereverse(sizeSTSD); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.size = swap; + swap = bytereverse('stsd'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.version = 0; + swap = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleDescriptionBox.entry_count = swap; + + + //tx3g + swap = bytereverse(64); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.size=swap; + swap = bytereverse('tx3g'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.type=swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.a=0; + swap=bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.b=swap; + swap = bytereverse(0x00000800);//continuous karaoke + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.displayFlags = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.horizontaljustification=0x01; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.verticaljustification=0x01; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[0]= 0x00; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[1]= 0x00; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[2]= 0x00; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.backgroundcolorrgba[3]= 0xFF; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.top=0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.left=0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.bottom=0x6400; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.right=0x2C01; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.startChar=0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.endChar=0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.fontID=0x0100; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.facestyleflags=0x01; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.fontsize=0x0A; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[0]=0xFF; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[1]=0xFF; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[2]=0xFF; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.textcolorrgba[3]=0xFF; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.size =0x12000000; + swap =bytereverse('ftab'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.type =swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.entrycount=0x0100; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.fontID =0x0200; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.fontnamelenght =0x05; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[0] =0x53; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[1] =0x65; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[2] =0x72; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[3] =0x69; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.TextSampleEntry.FontTableBox.font[4] =0x66; + + //stsz + + sizeSTSZ=aux(text,0x73,0x74,0x73,0x7A,&sal)+4; // the function aux looks for the box stsz in 3gp file and returns the size + swap = bytereverse('stsz'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.version = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_size=0; + + fseek(text,0,SEEK_CUR); + + fread(&dat,1,1,text); //read sample_count + fread(&dat1,1,1,text); + fread(&dat2,1,1,text); + fread(&dat3,1,1,text); + + samplecount = (dat<<24) | (dat1<<16) | (dat2<<8) | (dat3); + + swap= bytereverse(samplecount); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_count=swap; + + for (i=1;i<=samplecount;i++){ + + swap = bytereverse(size_phrase[i-1]); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.entry_size[i-1]=swap; + } + + sizeSTSZ= 20 + bytereverse(moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_count)*4; + swap = bytereverse(sizeSTSZ); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleSizeBox.size = swap; + + + //Time To Sample Box// + + fseek (text,0,SEEK_SET);//positionate the pointer at first + sizeSTTS=aux(text,0x73,0x74,0x74,0x73,&sal); + + swap = bytereverse(sizeSTTS); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.size = swap; + swap = bytereverse('stts'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + TimeToSampleBox.version = 0; + swap = bytereverse(sal); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.TimeToSampleBox.entry_count=swap; + fseek(text,0,SEEK_CUR); + for(i=1;i<=sal;i++){ + + fread(&dat,1,1,text);//read count + fread(&dat1,1,1,text); + fread(&dat2,1,1,text); + fread(&dat3,1,1,text); + + dat = (dat<<24) | (dat1<<16) | (dat2<<8) | (dat3); + + + swap = bytereverse(dat); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.TimeToSampleBox.sample_count[i-1]=swap; + fread(&dat,1,1,text);//read delta + + fread(&dat1,1,1,text); + + fread(&dat2,1,1,text); + + fread(&dat3,1,1,text); + + + dat = (dat<<24) | (dat1<<16) | (dat2<<8) | (dat3); + + swap = bytereverse(dat/0.6);// the input text file has time_scale = 600 but the audio has time scale=1000 + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.TimeToSampleBox.sample_delta[i-1]=swap; + } + + //Sample To Chunk// + + dat=0; + fseek (text,0,SEEK_SET);//positionate the pointer at first + sizeSTSC = aux(text,0x73,0x74,0x73,0x63,&sal); + dat=sal; + swap = bytereverse(sizeSTSC); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.size = swap; + swap = bytereverse('stsc'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.version = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + SampleToChunk.entry_count = bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleToChunk.first_chunk=bytereverse(1); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleToChunk.samples_per_chunk=moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox.sample_count; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.SampleToChunk.sample_description_index = bytereverse(1); + + //Chunk Offset Box// + sizeSTCO=24; + swap = bytereverse(sizeSTCO); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.size = swap; + swap = bytereverse('co64'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.type = swap; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.version = 0; + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.entry_count = bytereverse(1); + dat=32+sizemdat*totaltracks; + swap=bytereverse(dat); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox. + ChunkOffsetBox.chunk_offset [0]= swap; + + //Sample Table Box // + sizeSTBL = 8 + sizeSTSD + sizeSTSZ + sizeSTSC + sizeSTCO + sizeSTTS; + swap = bytereverse(sizeSTBL); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.size = swap; + swap = bytereverse('stbl'); + moov->TrackBox[numtrack].MediaBox.MediaInformationBox.SampleTableBox.type =swap; + return sizeSTBL; +} + +//AUX Functions for endianness + +int bytereverse(int num) { + int swapped; + swapped = ((num>>24)&0xff) | // move byte 3 to byte 0 + ((num<<8)&0xff0000) | // move byte 1 to byte 2 + ((num>>8)&0xff00) | // move byte 2 to byte 1 + ((num<<24)&0xff000000); // byte 0 to byte 3 + return swapped; +} +int bytereverse16(int num) { + int swapped; + swapped = ( ((num<<8)&0xff00) | // move byte 1 to byte 2 + ((num>>8)&0x00ff) ); // byte 2 to byte 1 + return swapped; +}