diff main/imafdecoder.cpp @ 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/imafdecoder.cpp	Mon Nov 04 17:15:52 2013 +0000
@@ -0,0 +1,212 @@
+//Jesús Corral García
+//Universidad de Málaga
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <QTextStream>
+#include <QString>
+#include "MainWindow.h"
+
+
+int audiotracks; //number of audio tracks contained inside the IM AF file
+
+int mainIMAFdecoder(QString outimaf){
+
+    FILE *imf,*audiotrack;
+    int d=0,i,j,sizemdat,audiosize;
+    int chunkoffset[64]; // if you want more than 64 tracks , change this value.
+    unsigned char dat,dat1,dat2,dat3;
+    QTextStream out(stdout);
+
+    imf = fopen (outimaf.toStdString().c_str(),"rb");
+
+    fseek (imf,0,SEEK_SET);
+    fseek (imf,24,SEEK_CUR); //jump to 'mdat'
+
+    fread(&dat, sizeof(unsigned char), 1, imf);
+    fread(&dat1, sizeof(unsigned char), 1, imf);
+    fread(&dat2, sizeof(unsigned char), 1, imf);
+    fread(&dat3, sizeof(unsigned char), 1, imf);
+
+    sizemdat = (dat<<24)  | (dat1<<16) | (dat2<<8) | (dat3);
+
+    if (sizemdat==1){ // if conformance file
+        fread(&dat, sizeof(unsigned char), 1, imf);
+        fread(&dat1, sizeof(unsigned char), 1, imf);
+        fread(&dat2, sizeof(unsigned char), 1, imf);
+        fread(&dat3, sizeof(unsigned char), 1, imf);
+        fread(&dat, sizeof(unsigned char), 1, imf);
+        fread(&dat1, sizeof(unsigned char), 1, imf);
+        fread(&dat2, sizeof(unsigned char), 1, imf);
+        fread(&dat3, sizeof(unsigned char), 1, imf);
+        fread(&dat, sizeof(unsigned char), 1, imf);
+        fread(&dat1, sizeof(unsigned char), 1, imf);
+        fread(&dat2, sizeof(unsigned char), 1, imf);
+        fread(&dat3, sizeof(unsigned char), 1, imf);
+        sizemdat = (dat<<24)  | (dat1<<16) | (dat2<<8) | (dat3);
+
+        fseek(imf,sizemdat-16,SEEK_CUR);
+    }
+   else {
+
+    fseek(imf, sizemdat-4, SEEK_CUR); // -4 because we have to sub the 4 bytes of size
+   }
+
+    fseek (imf,16,SEEK_CUR);
+    fseek (imf,96,SEEK_CUR); // next track id is placed 96 bytes after the last byte of type 'mvhd'
+
+    fread(&dat, sizeof(unsigned char), 1, imf);
+    fread(&dat1, sizeof(unsigned char), 1, imf);
+    fread(&dat2, sizeof(unsigned char), 1, imf);
+    fread(&dat3, sizeof(unsigned char), 1, imf);
+
+    audiotracks = ((dat<<24)  | (dat1<<16) | (dat2<<8) | (dat3)) -1 ; //read the number of audio tracks.It is ´-1´ because the field indicates the number of tracks +1
+
+
+    if (audiotracks == 12345678){
+
+        audiotracks = 6; // for the conformance file 2
+
+    }
+    for (j=1;j<=audiotracks;j++){
+
+        d=0;
+        while (d==0){
+
+         fread(&dat, sizeof(unsigned char), 1, imf);
+         fread(&dat1, sizeof(unsigned char), 1, imf);
+         fread(&dat2, sizeof(unsigned char), 1, imf);
+         fread(&dat3, sizeof(unsigned char), 1, imf);
+
+
+         if (dat == 0x68 && dat1 == 0x64 && dat2 == 0x6C && dat3 == 0x72) {  // 68646C72 = hdlr
+            d=1;
+         }
+
+         else{
+            fseek(imf, -3, SEEK_CUR); //if we have not readen ´hdlr´
+         }
+
+       } //close while
+
+       for (i=1;i<=8;i++){  //handler type is placed eight bytes after the last byte of type 'hdlr'
+
+            fread(&dat, sizeof(unsigned char), 1, imf);
+       }
+
+       fread(&dat, sizeof(unsigned char), 1, imf);//dat could be ´s´ (soun) or ´t´(text)
+
+       d=0;
+       if (dat==0x73){  //73 = ´s´
+
+             while (d==0){
+
+                fread(&dat, sizeof(unsigned char), 1, imf);
+                fread(&dat1, sizeof(unsigned char), 1, imf);
+                fread(&dat2, sizeof(unsigned char), 1, imf);
+                fread(&dat3, sizeof(unsigned char), 1, imf);
+
+                if (dat == 0x63 && dat1 == 0x6F && dat2 == 0x36 && dat3 == 0x34) {  // 636F3634 = co64
+                     d=1;
+                }
+                else if (dat == 0x73 && dat1 == 0x74 && dat2 == 0x63 && dat3 == 0x6F){ //7374636F = stco
+                    d=2;
+                }
+
+                else{
+                     fseek(imf, -3, SEEK_CUR); //if we have not readen ´stco´
+                }
+
+            } //close while
+             if (d==1){ // if co64
+                for (i=1;i<=12;i++){
+
+                fread(&dat, sizeof(unsigned char), 1, imf);
+                }
+             }
+             if (d==2){// if stco
+                for (i=1;i<=8;i++){
+
+                fread(&dat, sizeof(unsigned char), 1, imf);
+                }
+             }
+
+
+            fread(&dat, sizeof(unsigned char), 1, imf);
+            fread(&dat1, sizeof(unsigned char), 1, imf);
+            fread(&dat2, sizeof(unsigned char), 1, imf);
+            fread(&dat3, sizeof(unsigned char), 1, imf);
+
+            chunkoffset[j-1] = (dat<<24)  | (dat1<<16) | (dat2<<8) | (dat3);
+
+
+       }//close if
+
+
+   } //close for
+//At this point, we will look for a text track. If d=2 there are no lyrics
+    d=0;
+    while (d==0){
+
+      fread(&dat, sizeof(unsigned char), 1, imf);
+      fread(&dat1, sizeof(unsigned char), 1, imf);
+      fread(&dat2, sizeof(unsigned char), 1, imf);
+      fread(&dat3, sizeof(unsigned char), 1, imf);
+
+      if (feof (imf )){// if end of file -> no lyrics
+           d=2;
+      }
+      else if (dat == 0x68 && dat1 == 0x64 && dat2 == 0x6C && dat3 == 0x72) {  // 68646C72 = hdlr
+        d=1;
+      }
+      else{
+        fseek(imf, -3, SEEK_CUR); //if we have not readen ´hdlr´
+      }
+
+    } //close while
+
+
+// At this point, we know the position of the audio tracks in mdat and the number of tracks.
+// Now we will separate the audio tracks in several MP3.
+
+    fseek(imf, 0, SEEK_SET);
+    for (j=0;j<chunkoffset[0];j++) //advance to the position of the first audio track contained in mdat
+    {
+         fread(&dat, sizeof(unsigned char), 1, imf);
+    }
+
+    for(i=0;i<audiotracks-1;i++){
+
+
+          char buf[2];
+          sprintf(buf, "%d", i);// convert int to char
+          audiotrack =fopen (buf,"wb");
+
+          for (j=chunkoffset[i];j<chunkoffset[i+1];j++){
+             fread(&dat,sizeof(unsigned char),1,imf);
+             fwrite (&dat,sizeof(unsigned char),1,audiotrack);
+          }
+          fclose (audiotrack);
+
+   } // close for
+
+//last audio track
+
+    char buf[2];
+    sprintf(buf, "%d", audiotracks-1); //convert int to char
+    audiotrack =fopen (buf,"wb");
+    audiosize = chunkoffset[2]-chunkoffset[1]; //calculate the size of one audio track. Every audio track must be the same size
+    for (i=1;i<=audiosize;i++)
+    {
+        fread(&dat,sizeof(unsigned char),1,imf);
+        fwrite (&dat,sizeof(unsigned char),1,audiotrack);
+    }
+
+    fclose (audiotrack);
+    fclose (imf);
+    return d;
+
+
+
+}