if (size<=2) return size; // silly;
unsigned int test=0;
*framesize=0;
+ //inspired by libav parsing code
while (test+1<size) {
- if (data[test]==0xFF && (data[test+1] &0xe0)==0xe0) return test; // probably FrameSync
+ if (data[test]==0xFF && (data[test+1] &0xe0)==0xe0) {
+ 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,
+ 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 }, {
+ 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224,
+ 256, 320 } }, { { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144,
+ 160, 176, 192, 224, 256 }, { 0, 8, 16, 24, 32, 40, 48, 56,
+ 64, 80, 96, 112, 128, 144, 160 }, { 0, 8, 16, 24, 32, 40,
+ 48, 56, 64, 80, 96, 112, 128, 144, 160 } } };
+ int lsf=0;
+ int mpeg2=0;
+ int layer=4-(data[test+2]&0x03)>>1;
+ int bitrate_index=data[test+2]&0xf0>>4;
+ int padding=(data[test+2]&2)>>1;
+ if (0x10 & data[test+1]) {
+ lsf=((data[test+1]) &0x8)?0:1;
+ mpeg2=0;
+ } else {
+ lsf=1;
+ mpeg2=1;
+ }
+ int sample_rate=sample_rates[ (data[test+2]&0x0C)>>2]>>(lsf+mpeg2);
+ int frame_size=bitrate_tab[lsf][layer - 1][bitrate_index];
+ if (layer==1) {
+ frame_size=(frame_size*12000)/sample_rate;
+ frame_size=(frame_size+padding)*4;
+ } else if (layer==2) {
+ frame_size=(frame_size*144000)/sample_rate;
+ frame_size=frame_size+padding;
+ } else {
+ frame_size=(frame_size*144000)/(sample_rate<<lsf);
+ frame_size=frame_size+padding;
+ }
+ *framesize=frame_size;
+
+ return test; // probably FrameSync
+ }
test++;
}
return size;
min(haveToCopy,decompress_buffer_size-decompress_buffer_filled));
incoming_paket_libav.size = decompress_buffer_filled
+min(haveToCopy,decompress_buffer_size-decompress_buffer_filled);
- //Log::getInstance()->log("Audio", Log::DEBUG,"Use saved audio buffer %d %d %d",packet.type,decompress_buffer_filled,packet.synced);
+ //Log::getInstance()->log("Audio", Log::DEBUG,"Use saved audio buffer %d %d %d",packet.type,decompress_buffer_filled,packet.synched);
} else {
incoming_paket_libav.data =(uint8_t*) buffer+packet.pos_buffer+*samplepos;
incoming_paket_libav.size = haveToCopy;