int lsf=0;
int mpeg2=0;
int layer=4-(data[test+2]&0x03)>>1;
- int bitrate_index=data[test+2]&0xf0>>4;
+ 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=1;
}
int sample_rate=sample_rates[ (data[test+2]&0x0C)>>2]>>(lsf+mpeg2);
- int frame_size=bitrate_tab[lsf][layer - 1][bitrate_index];
+ int frame_size=0;
+ int temp_frame_size=bitrate_tab[lsf][layer - 1][bitrate_index];
if (layer==1) {
- frame_size=(frame_size*12000)/sample_rate;
+ frame_size=(temp_frame_size*12000)/sample_rate;
frame_size=(frame_size+padding)*4;
} else if (layer==2) {
- frame_size=(frame_size*144000)/sample_rate;
+ frame_size=(temp_frame_size*144000)/sample_rate;
frame_size=frame_size+padding;
} else {
- frame_size=(frame_size*144000)/(sample_rate<<lsf);
+ frame_size=(temp_frame_size*144000)/(sample_rate<<lsf);
frame_size=frame_size+padding;
}
- //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME: %d %d %d %d %d %d",lsf,layer,bitrate_index,sample_rate,padding,framesize);
+ //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;
return test; // probably FrameSync
bool donotdecompress=false;
unsigned int gotframesize=0;
- if (!decompress_buffer_filled) { // only do this if no old data is present
+ // if (!decompress_buffer_filled) { // only do this if no old data is present
int adv = 0;
switch (packet.type) {
case MPTYPE_MPEG_AUDIO:
}
break;
};
- if (adv > 0) {
+ if (adv > 0 /*&& !decompress_buffer_filled*/) {
incoming_paket_libav.data += adv;
incoming_paket_libav.size-=adv;
haveToCopy -= adv;
}
- } //
+ // } //
if (gotframesize>0 && gotframesize>haveToCopy) {
donotdecompress=true;
}
libav_mutex.Unlock();
// Log::getInstance()->log("Audio", Log::DEBUG,"libav out");
- len = avcodec_decode_audio4(current_context, decode_frame_libav,
+ int save_size=incoming_paket_libav.size;
+
+ if (gotframesize<=incoming_paket_libav.size) {
+ if (gotframesize>0) incoming_paket_libav.size=gotframesize;
+ len = avcodec_decode_audio4(current_context, decode_frame_libav,
&gotta, &incoming_paket_libav);
+ } else {
+ //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME:E %d %d",gotframesize,incoming_paket_libav.size);
+ gotta=0;
+ len=0;
+ }
+ //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME:T %d",len);
+ incoming_paket_libav.size=save_size;
//Log::getInstance()->log("Audio", Log::DEBUG, "libav out1");
pthread_setcancelstate(oldcancelstate, NULL);
pthread_setcanceltype(oldcanceltype, NULL);
if (decompress_buffer_filled) { // reset to normal decoding
if (len>0) {
- Log::getInstance()->log("Audio", Log::DEBUG,"saved audio: %d",len);
+ //Log::getInstance()->log("Audio", Log::DEBUG,"saved audio: %d",len);
haveToCopy -= min(len-decompress_buffer_filled,0);
*samplepos += min(len-decompress_buffer_filled,0);
//if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);