decompress_buffer=NULL;
decompress_buffer_size=0;
decompress_buffer_filled=0;
+ mp3sameheader=0;
+ mp3sameheadercount=0;
}
//inspired by libav parsing code
while (test+1<size) {
if (data[test]==0xFF && (data[test+1] &0xe0)==0xe0) {
+ //sanity check inspired by libav
+
+
const int sample_rates[4]={44100,48000,32000,0};
const short bitrate_tab[2][3][15] = { { { 0, 32, 64, 96, 128, 160,
192, 224, 256, 288, 320, 352, 384, 416, 448 }, { 0, 32, 48,
frame_size=(temp_frame_size*144000)/(sample_rate<<lsf);
frame_size=frame_size+padding;
}
+ unsigned int sameheadertest=(data[test]<<24)|(data[test+1]<<16) |(data[test+2]<<8);
+ const unsigned mask=(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)); // from libav
+ if (!mp3sameheader) {
+ mp3sameheader=sameheadertest;
+ mp3sameheadercount=2;
+ }
+ if ((mp3sameheader& mask)== (sameheadertest &mask)) mp3sameheadercount++;
+ else mp3sameheadercount=0;
+ mp3sameheader=sameheadertest;
+
//Log::getInstance()->log("Audio", Log::DEBUG, "FRAME: %d %d %d %d %d %d %d",lsf,layer,bitrate_index,sample_rate,padding,temp_frame_size, frame_size);
- //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME DIAG: %x %x %x ",data[test],data[test+1],data[test+2]);
- *framesize=frame_size;
+ //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME DIAG: %x %x %x %d",data[test],data[test+1],data[test+2],mp3sameheadercount);
- return test; // probably FrameSync
+ if (mp3sameheadercount>4) {
+ *framesize=frame_size;
+ return test; // probably FrameSync
+ } //skip it if the header changes too frequently
}
test++;
}
if (packet.type != lastAType) {//Format Change //Push data out !
firstsynched = false;
achange=true;
+ mp3sameheader=0;
Log::getInstance()->log("Audio", Log::DEBUG,"Notice audio type change %d %d", packet.type,lastAType);
lastAType = packet.type;
decompress_buffer_filled=0;