begin parsing work on AAC info parsing
git-svn-id: https://svn.musicpd.org/mpd/trunk@345 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
9ab67e7581
commit
1bb75913c3
106
src/tag.c
106
src/tag.c
|
@ -173,7 +173,111 @@ MpdTag * mp3TagDup(char * utf8file) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_FAAD
|
#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 * mp4DataDup(char * utf8file, int * mp4MetadataFound) {
|
||||||
MpdTag * ret = NULL;
|
MpdTag * ret = NULL;
|
||||||
FILE * fh;
|
FILE * fh;
|
||||||
|
|
Loading…
Reference in New Issue