}
-int AudioOMX::ChangeAudioPortConfig() //clock aka omx mutex needs to be locked
+int AudioOMX::ChangeAudioPortConfig(bool disport) //clock aka omx mutex needs to be locked
{
OMX_ERRORTYPE error;
//Ok first fidle a working configuration
if (passthrough) {
// TODO coding
} else {
+ //VideoOMX* video=(VideoOMX*)Video::getInstance();
+ /*if (disport) {
+ if (!video->ChangeComponentState(omx_aud_rend, OMX_StateIdle)) {
+ Log::getInstance()->log("Audio", Log::DEBUG,
+ "omx_aud_rend ChangeComponentState Execute CAP");
+ return 0;
+ }
+ video->DisablePort(omx_aud_rend,omx_rend_input_port,false);
+ DestroyInputBufsOMX();
+ }*/
OMX_AUDIO_PARAM_PCMMODETYPE audio_pcm;
memset(&audio_pcm, 0, sizeof(audio_pcm));
audio_pcm.nSize = sizeof(audio_pcm);
Log::getInstance()->log("Audio", Log::DEBUG,
"Init OMX_IndexParamAudioPcm failed %x %d", error,
omx_rend_input_port);
- DeAllocateCodecsOMX();
+ //DeAllocateCodecsOMX();
return 0;
}
+ /*if (disport) {
+ video->EnablePort(omx_aud_rend,omx_rend_input_port,false);
+ PrepareInputBufsOMX();
+ if (!video->ChangeComponentState(omx_aud_rend, OMX_StateExecuting)) {
+ Log::getInstance()->log("Audio", Log::DEBUG,
+ "omx_aud_rend ChangeComponentState Execute CAP");
+ return 0;
+ }
+
+ }*/
}
}
- if (!ChangeAudioPortConfig()){
+ if (!ChangeAudioPortConfig(false)){
Log::getInstance()->log("Audio", Log::NOTICE, "Change AudioPortConfig failed");
video->UnlockClock();
DeAllocateCodecsOMX();
paused = true;
VideoOMX *vw = (VideoOMX*) Video::getInstance();
vw->LockClock();
- OMX_ERRORTYPE error;
- error = OMX_SendCommand(omx_aud_rend, OMX_CommandFlush,
- omx_rend_input_port, NULL);
- if (error != OMX_ErrorNone) {
- Log::getInstance()->log("Audio", Log::DEBUG,
- "OMX_Flush rend in failed %x", error);
+ if (omx_running) {
+ OMX_ERRORTYPE error;
+ error = OMX_SendCommand(omx_aud_rend, OMX_CommandFlush,
+ omx_rend_input_port, NULL);
+ if (error != OMX_ErrorNone) {
+ Log::getInstance()->log("Audio", Log::DEBUG,
+ "OMX_Flush rend in failed %x", error);
+ }
}
vw->UnlockClock();
vw->clockPause();
}
#endif
-unsigned int AudioOMX::AdvanceMpAudioSync(UCHAR *data,unsigned int size)
+unsigned int AudioOMX::AdvanceMpAudioSync(UCHAR *data,unsigned int size,unsigned int *framesize)
{
if (size<=2) return size; // silly;
unsigned int test=0;
+ *framesize=0;
while (test+1<size) {
if (data[test]==0xFF && (data[test+1] &0xe0)==0xe0) return test; // probably FrameSync
test++;
return size;
}
-unsigned int AudioOMX::AdvanceAc3AudioSync(UCHAR *data,unsigned int size)
+unsigned int AudioOMX::AdvanceAc3AudioSync(UCHAR *data,unsigned int size,unsigned int *framesize)
{
- if (size<=2) return size; // silly;
+ if (size<=4) return size; // silly;
+ const int frm_size_tab[] = { 64, 64, 80, 80, 96, 96, 112, 112, 128, 128,
+ 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384, 384, 448,
+ 448, 512, 512, 640, 640, 768, 768, 896, 896, 1024, 1024, 1152,
+ 1152, 1280, 1280, };
unsigned int test=0;
- while (test+1<size) {
- if (data[test]==0x0B && data[test+1]==0x77) return test; // probably FrameSync
+ *framesize=20000; //if we do not find a start code do not decompress
+ while (test+4<size) {
+ if (data[test]==0x0B && data[test+1]==0x77) {
+ // now figure out the length of the frame
+ unsigned char code=data[test+4];
+ unsigned char fscod=(code& 0xC0)>>6;
+ unsigned char frmsize=(code &0x3f);
+ if (fscod!=0) Log::getInstance()->log("Audio", Log::DEBUG, "warning we only support 48 KHz sampling rate");
+ *framesize=frm_size_tab[frmsize]*2;
+ return test; // probably FrameSync
+ }
test++;
}
return size;
cur_input_buf_omx = NULL;
}
vw->LockClock();
- if (!ChangeAudioPortConfig()) {
+ if (!ChangeAudioPortConfig(true)) {
Log::getInstance()->log("Audio", Log::DEBUG,
"Changing audio port config failed", error);
}
input_bufs_omx_mutex.Unlock();
}
-
if (cur_input_buf_omx->nFilledLen == 0) {//will only be changed on first packet
if (packet.synched) {
//Log::getInstance()->log("Audio", Log::DEBUG,
//Log::getInstance()->log("Audio", Log::DEBUG, "libav in %d %d",
// framesize, current_context->frame_size);
+ bool donotdecompress=false;
+ unsigned int gotframesize=0;
if (!decompress_buffer_filled) { // only do this if no old data is present
int adv = 0;
switch (packet.type) {
case MPTYPE_MPEG_AUDIO:
case MPTYPE_MPEG_AUDIO_LAYER3: {
adv = AdvanceMpAudioSync(incoming_paket_libav.data,
- incoming_paket_libav.size);
+ incoming_paket_libav.size,&gotframesize);
}
- break;
+ break;
case MPTYPE_AC3:
case MPTYPE_AC3_PRE13: {
adv = AdvanceAc3AudioSync(incoming_paket_libav.data,
- incoming_paket_libav.size);
+ incoming_paket_libav.size,&gotframesize);
}
- break;
+ break;
};
if (adv > 0) {
incoming_paket_libav.data += adv;
haveToCopy -= adv;
*samplepos += adv;
- if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
- else framesize=haveToCopy;
+ /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
+ else*/ framesize=haveToCopy;
//Log::getInstance()->log("Audio", Log::DEBUG,"Advance by %d %d from %d",adv,packet.type,*samplepos );
if (haveToCopy <= 0) {
- // Log::getInstance()->log("Audio", Log::DEBUG,"No sync code in packet remove %d",packet.type);
- *samplepos=packet.length;
- return packet.length;
+ // Log::getInstance()->log("Audio", Log::DEBUG,"No sync code in packet remove %d",packet.type);
+ *samplepos=packet.length;
+ return packet.length;
}
- break;
+
+
} //
- // else Log::getInstance()->log("Audio", Log::DEBUG,"Loop run" );
+
+ if (gotframesize>0 && gotframesize>haveToCopy) {
+ donotdecompress=true;
+ errcount=100; // exit loop
+ }
+ // else Log::getInstance()->log("Audio", Log::DEBUG,"Loop run" );
}
- int oldcancelstate;
- int oldcanceltype;
- pthread_testcancel();
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
- libav_mutex.Lock();
- if (!omx_running || !mp23codec_context_libav
- || !ac3codec_context_libav) {
+ if (!donotdecompress) {
+ int oldcancelstate;
+ int oldcanceltype;
+ pthread_testcancel();
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
+ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
+ libav_mutex.Lock();
+ if (!omx_running || !mp23codec_context_libav
+ || !ac3codec_context_libav) {
+ libav_mutex.Unlock();
+ return *samplepos;
+ }
libav_mutex.Unlock();
- return *samplepos;
- }
- libav_mutex.Unlock();
- // Log::getInstance()->log("Audio", Log::DEBUG,"libav out");
- len = avcodec_decode_audio4(current_context, decode_frame_libav,
- &gotta, &incoming_paket_libav);
- //Log::getInstance()->log("Audio", Log::DEBUG, "libav out1");
- pthread_setcancelstate(oldcancelstate, NULL);
- pthread_setcanceltype(oldcanceltype, NULL);
- pthread_testcancel();
+ // Log::getInstance()->log("Audio", Log::DEBUG,"libav out");
+ len = avcodec_decode_audio4(current_context, decode_frame_libav,
+ &gotta, &incoming_paket_libav);
+ //Log::getInstance()->log("Audio", Log::DEBUG, "libav out1");
+ pthread_setcancelstate(oldcancelstate, NULL);
+ pthread_setcanceltype(oldcanceltype, NULL);
+ pthread_testcancel();
+ } else {
+ gotta=0;
+ len=0;
+ }
//Log::getInstance()->log("Audio", Log::DEBUG, "libav out2");
if (!omx_running) {
libav_mutex.Unlock();
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);
- else framesize=haveToCopy;
+ //if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
+ /*else*/ framesize=haveToCopy;
} else {
framesize=haveToCopy;
}
haveToCopy -= len;
*samplepos += len;
errcount=0;
- if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
- else framesize=haveToCopy;
+ /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
+ else*/framesize=haveToCopy;
} else {
errcount++;
framesize=haveToCopy;
if ((target_time - current_time) < 0000LL) { //skip a bit more
skip = true; // we are too slow
skipping = true;
- /* Log::getInstance()->log("Video", Log::DEBUG,"Skipping frames2 %lld %lld %d",target_time-current_time,pts,Demuxer::getInstance()->getFrameRate());
+/* Log::getInstance()->log("Video", Log::DEBUG,"Skipping frames2 %lld %lld %d",target_time-current_time,pts,Demuxer::getInstance()->getFrameRate());
Log::getInstance()->log("Video", Log::DEBUG, "skip detail pts: %lld target: %lld sys: %lld off: %lld diff %lld",pts,target_time,current_time,offset,
target_time-current_time);*/
} else {
target_time+=offset;
//Log::getInstance()->log("Video", Log::DEBUG, "Wait for display pts: %lld tg: %lld sys: %lld off: %lld diff %lld po: %lld",pts,target_time,current_time,offset,
// target_time-current_time,playbacktimeoffset);
- if ((target_time-current_time)>2000000LL) target_time=current_time+2000000LL; // something is wrong do not wait too long
+ if ((target_time-current_time)>1000000LL) target_time=current_time+1000000LL; // something is wrong do not wait too long
//Log::getInstance()->log("Video", Log::DEBUG, "Wait for display pts: %lld tg: %lld sys: %lld off: %lld diff %lld po: %lld",pts,target_time,current_time,offset,
// target_time-current_time,playbacktimeoffset);
//Log::getInstance()->log("Video", Log::DEBUG, "threadMethod Frameskip");
} else {
- // Log::getInstance()->log("Video", Log::DEBUG,
- // "prot empty this buffer in");
+ Log::getInstance()->log("Video", Log::DEBUG,
+ "prot empty this buffer in");
OMX_ERRORTYPE error = ProtOMXEmptyThisBuffer(omx_vid_dec, pict);
if (error != OMX_ErrorNone) {
Log::getInstance()->log("Video", Log::DEBUG,
"OMX_EmptyThisBuffer failed %x", error);
}
- // Log::getInstance()->log("Video", Log::DEBUG,
- // "prot empty this buffer out");
+ Log::getInstance()->log("Video", Log::DEBUG,
+ "prot empty this buffer out");
if (deint_first_frame && dodeint) DeinterlaceFix();
if (islast) FrameWaitforDisplay(time);
}