diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tag.c | 106 |
1 files changed, 105 insertions, 1 deletions
@@ -173,7 +173,111 @@ MpdTag * mp3TagDup(char * utf8file) { #endif #ifdef HAVE_FAAD -/* copied from FAAD2 frontend */ +typedef struct { + long bytesIntoBuffer; + long bytesConsumed; + long fileOffset; + unsigned char *buffer; + int atEof; + FILE *infile; +} AacBuffer; + +void fillAacBuffer(AacBuffer *b) { + if(b->bytesConsumed > 0) { + int bread; + + if(b->bytesIntoBuffer) { + memmove((void *)b->buffer,(void*)(b->buffer+ + b->bytesConsumed),b->bytesIntoBuffer); + } + + if(!b->atEof) { + bread = fread((void *)(b->buffer+b->bytesIntoBuffer),1, + b->bytesConsumed,b->infile); + if(bread!=b->bytesConsumed) b->atEof = 1; + b->bytesIntoBuffer+=bread; + } + + b->bytesConsumed = 0; + + if(b->bytesIntoBuffer > 3) { + if(memcmp(b->buffer,"TAG",3)==0) b->bytesIntoBuffer = 0; + } + if(b->bytesIntoBuffer > 11) { + if(memcmp(b->buffer,"LYRICSBEGIN",11)==0) { + b->bytesIntoBuffer = 0; + } + } + if(b->bytesIntoBuffer > 8) { + if(memcmp(b->buffer,"APETAGEX",8)==0) { + b->bytesIntoBuffer = 0; + } + } + } +} + +void advanceAacBuffer(AacBuffer * b, int bytes) { + b->fileOffset+=bytes; + b->bytesConsumed = bytes; + b->bytesIntoBuffer-=bytes; +} + +static int adtsSampleRates[] = {96000,88200,64000,48000,44100,32000,24000,22050, + 16000,12000,11025,8000,7350,0,0,0}; + +int adtsParse(AacBuffer * b, float * length) { + int frames, frameLength; + int tFrameLength = 0; + int sampleRate = 0; + float framesPerSec, bytesPerFrame; + + /* Read all frames to ensure correct time and bitrate */ + for(frames = 0; ;frames++) { + fillAacBuffer(b); + + if(b->bytesIntoBuffer > 7) { + /* check syncword */ + if (!((b->buffer[0] == 0xFF) && + ((b->buffer[1] & 0xF6) == 0xF0))) + { + break; + } + + if(frames==0) { + sampleRate = adtsSampleRates[ + (b->buffer[2]&0x3c)>>2]; + } + + frameLength = ((((unsigned int)b->buffer[3] & 0x3)) + << 11) | (((unsigned int)b->buffer[4]) + << 3) | (b->buffer[5] >> 5); + + tFrameLength+=frameLength; + + if(frameLength > b->bytesIntoBuffer) break; + + advanceAacBuffer(b,frameLength); + } + else break; + } + + framesPerSec = (float)sampleRate/1024.0; + if(frames!=0) { + bytesPerFrame = (float)tFrameLength/(float)(frames*1000); + } + else bytesPerFrame = 0; + if(framesPerSec!=0) *length = (float)frames/framesPerSec; + else *length = 1; + + return 1; +} + +MpdTag * aacTagDup(char * utf8file) { + MpdTag * ret = NULL; + + return ret; +} + MpdTag * mp4DataDup(char * utf8file, int * mp4MetadataFound) { MpdTag * ret = NULL; FILE * fh; |