]> git.vomp.tv Git - vompclient.git/commitdiff
Various audio related improvements and bugfixes
authorMarten Richter <marten.richter@freenet.de>
Sun, 16 Sep 2012 10:40:16 +0000 (12:40 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sun, 16 Sep 2012 14:00:07 +0000 (16:00 +0200)
audioomx.cc
audioomx.h
player.cc
playerlivetv.cc
videoomx.cc

index 4b11e8084c23ee5f9a51677712955b38fa787e90..f4a8aec734f1539b783ce1b9070cf76d84378da4 100644 (file)
@@ -474,7 +474,7 @@ int AudioOMX::ChangeAudioDestination() //clock aka omx mutex needs to be locked
 
 }
 
-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
@@ -549,7 +549,17 @@ int AudioOMX::ChangeAudioPortConfig() //clock aka omx mutex needs to be locked
                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);
@@ -572,9 +582,19 @@ int AudioOMX::ChangeAudioPortConfig() //clock aka omx mutex needs to be locked
                                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;
+                               }
+
+                       }*/
 
                }
        }
@@ -806,7 +826,7 @@ int AudioOMX::AllocateCodecsOMX()
 
 
 
-       if (!ChangeAudioPortConfig()){
+       if (!ChangeAudioPortConfig(false)){
                    Log::getInstance()->log("Audio", Log::NOTICE, "Change AudioPortConfig failed");
                    video->UnlockClock();
                    DeAllocateCodecsOMX();
@@ -1152,13 +1172,15 @@ int AudioOMX::pause() {
                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();
@@ -1244,10 +1266,11 @@ int AudioOMX::test()
 }
 #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++;
@@ -1255,12 +1278,25 @@ unsigned int AudioOMX::AdvanceMpAudioSync(UCHAR *data,unsigned int size)
        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;
@@ -1364,7 +1400,7 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
                        cur_input_buf_omx = NULL;
                }
                vw->LockClock();
-               if (!ChangeAudioPortConfig()) {
+               if (!ChangeAudioPortConfig(true)) {
                        Log::getInstance()->log("Audio", Log::DEBUG,
                                        "Changing audio port config failed", error);
                }
@@ -1418,7 +1454,6 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
                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,
@@ -1495,59 +1530,72 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
                        //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();
@@ -1559,8 +1607,8 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
                                        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;
                                }
@@ -1574,8 +1622,8 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
                                        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;
index bd72c562719117d16d9601ff6fc1a0dcbb4e4bfd..2bd71c807ba173c571737e74e5a84342628de36e 100644 (file)
@@ -116,8 +116,8 @@ class AudioOMX : public Audio
 \r
 \r
 \r
-       unsigned int AdvanceAc3AudioSync(UCHAR *data,unsigned int size);\r
-       unsigned int AdvanceMpAudioSync(UCHAR *data,unsigned int size);\r
+       unsigned int AdvanceAc3AudioSync(UCHAR *data,unsigned int size,unsigned int *framesize);\r
+       unsigned int AdvanceMpAudioSync(UCHAR *data,unsigned int size,unsigned int *framesize);\r
 \r
 \r
     void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* bulibaver);\r
@@ -143,7 +143,7 @@ class AudioOMX : public Audio
        int PrepareInputBufsOMX();\r
        int DestroyInputBufsOMX();\r
 \r
-       int ChangeAudioPortConfig();\r
+       int ChangeAudioPortConfig(bool disport);\r
        int ChangeAudioDestination();\r
        long long correctAudioLatency(long long pts,int addsamples,int srate);\r
 \r
index f2c9d10a3fdc9fd08b93e1c76a4eeb2e8269f36e..1650ed482d3d8b121d6df5ecb95b92266fb62349 100644 (file)
--- a/player.cc
+++ b/player.cc
@@ -93,11 +93,11 @@ int Player::init(bool p_isPesRecording,double framespersecond)
   unsigned int demux_video_size=2097152;\r
   unsigned int demux_audio_size=524288;\r
   if (video->supportsh264()) {\r
-         demux_video_size*=5*1;//5;\r
+         demux_video_size*=5*2;//5;\r
 \r
   }\r
   if (audio->maysupportAc3()) {\r
-         demux_audio_size*=2;\r
+         //demux_audio_size*=2;\r
   }\r
  \r
   if (!demuxer->init(this, audio, video,teletext, demux_video_size,demux_audio_size,65536, framespersecond, subtitles))\r
index cd48c55b9a53923da55bbf5801e927317bb64929..e9644897f1303cd1a6e6a2d4b0fc1d4ff740e0ad 100644 (file)
@@ -81,7 +81,7 @@ int PlayerLiveTV::init()
 \r
    }\r
    if (audio->maysupportAc3()) {\r
-         demux_audio_size*=2;\r
+         //demux_audio_size*=2;\r
    }\r
 \r
   int text_fak=video->getTeletextBufferFaktor();\r
index cd4d242334ab9af00007b4a881d79c00fffc37de..25444c1641c4fb33d3505d76ae850fb66e5e5b1f 100644 (file)
@@ -2105,7 +2105,7 @@ bool VideoOMX::FrameSkip(long long pts)
                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 {
@@ -2129,7 +2129,7 @@ void VideoOMX::FrameWaitforDisplay(long long pts)
        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);
 
@@ -2192,15 +2192,15 @@ void VideoOMX::threadMethod()
                                //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);
                        }