]> git.vomp.tv Git - vompclient.git/commitdiff
Increase streaming buffers, start video only at independent frames, remove buffer...
authorMarten Richter <marten.richter@freenet.de>
Sun, 28 Oct 2012 18:40:47 +0000 (19:40 +0100)
committerMarten Richter <marten.richter@freenet.de>
Sun, 28 Oct 2012 18:40:47 +0000 (19:40 +0100)
audioomx.cc
defines.h
playerlivetv.cc
videoomx.cc
videoomx.h

index 14627d92a690651335cf83a057449b623cca8197..978f9b328e6e26ce9d9cb002507e592db84ae6ef 100644 (file)
@@ -1673,14 +1673,14 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
 
        //Log::getInstance()->log("Audio", Log::DEBUG, "DeliverMediaPacketOMX time %lld",packet.presentation_time);
 
-       if (packet.synched && packet.presentation_time <= 0) {
+/*     if (packet.synched && packet.presentation_time <= 0) {
                *samplepos = packet.length;
                firstsynched = false;
                lsync=true;
                Log::getInstance()->log("Audio", Log::DEBUG,
                                "DeliverMediaPacketOMX Frameskip");
                return packet.length;
-       }
+       }*/
 
 
 
index 76f36c86dee274b74a2edc8b674fd52f76942605..aec5c863050caf73fa0ce66c2f5da90e75a82195 100644 (file)
--- a/defines.h
+++ b/defines.h
@@ -51,6 +51,7 @@ long long getTimeMS();
   #define STRTOUL strtoul\r
   #define CLOSESOCKET closesocket\r
   #define DEFAULT_TCP_WINDOWSIZENR 1  /*=2048*/\r
+  #define PLAYER_MAX_STREAMING_BUFFERS 120 // for video in uints of 50000 KB\r
 \r
   #define VOMP_HAS_EXIT\r
 \r
@@ -112,6 +113,7 @@ long long getTimeMS();
   // #define  VPE_LIBAV_MPEG2_TRANSCODING\r
 \r
   #define DEFAULT_TCP_WINDOWSIZENR 6  /*=2048*/\r
+  #define PLAYER_MAX_STREAMING_BUFFERS 120 // for video in uints of 50000 KB\r
   #define TV_NORM_SWITCHABLE\r
   #define HANDLE_VT_SWITCHING\r
 \r
@@ -129,6 +131,7 @@ long long getTimeMS();
   #define Video_TYPE VideoMVP\r
   #define Surface_TYPE SurfaceMVP //deprecated\r
   #define DEFAULT_TCP_WINDOWSIZENR 1  /*=2048*/\r
+  #define PLAYER_MAX_STREAMING_BUFFERS 11 // for video in uints of 50000 KB\r
   #define PAL_WSS\r
   #define MVP_REMOTE_TYPES\r
 \r
@@ -147,6 +150,7 @@ long long getTimeMS();
   #define Video_TYPE VideoNMT\r
   #define Surface_TYPE SurfaceDirectFB //deprecated\r
   #define DEFAULT_TCP_WINDOWSIZENR 1  /*=2048*/\r
+  #define PLAYER_MAX_STREAMING_BUFFERS 11 // for video in uints of 50000 KB\r
 \r
   #define VOMP_LINUX_CLOCK  CLOCK_REALTIME\r
 \r
index 7d42f72316f7e17041842f4f3188122eb0b102c8..bbd3928b3c5c7a99c301396dbe8d5c4a53b775be 100644 (file)
@@ -301,7 +301,7 @@ void PlayerLiveTV::streamReceive(ULONG flag, void* data, ULONG len)
     messageQueue->postMessageFromOuterSpace(m);\r
   }\r
         \r
-  if (streamChunks.size() < 11)\r
+  if (streamChunks.size() < PLAYER_MAX_STREAMING_BUFFERS)\r
   {\r
     StreamChunk s;\r
     s.data = data;\r
@@ -783,7 +783,7 @@ void PlayerLiveTV::threadMethod()
 \r
       if (state == S_PREBUFFERING)\r
       {\r
-         logger->log("PlayerLiveTV", Log::DEBUG, "chunk mark3");\r
+        // logger->log("PlayerLiveTV", Log::DEBUG, "chunk mark3");\r
         ++preBufferCount;\r
         ULONG percentDone = (ULONG)(preBufferCount / (float)preBufferAmount * 100);\r
         logger->log("PlayerLiveTV", Log::DEBUG, "Prebuffering %lu%%", percentDone);\r
index 770e9c91e35e2c5ad8f5682f67a8d297446a5315..548c58df4e3648cca564de791c570690f1a185c2 100644 (file)
@@ -145,6 +145,9 @@ OMX_ERRORTYPE VideoOMX::EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN O
 
        //Log::getInstance()->log("Video", Log::NOTICE, "EmptyBufferDone");
        VideoOMX *video=(VideoOMX *)getInstance();
+/*     long long temp =buffer->nTimeStamp.nLowPart
+                                                               | ((long long) buffer->nTimeStamp.nHighPart << 32);
+       Log::getInstance()->log("Video", Log::NOTICE, "EBD Video %lld  %x",temp,buffer->nFlags);*/
        video->ReturnEmptyOMXBuffer(buffer);
        return OMX_ErrorNone;
 
@@ -767,6 +770,18 @@ int VideoOMX::getClockVideoandInit()
 
 
        OMX_TIME_CONFIG_CLOCKSTATETYPE clock_conf;
+       memset(&clock_conf,0,sizeof(clock_conf));
+       clock_conf.nSize=sizeof(clock_conf);
+       clock_conf.nVersion.nVersion=OMX_VERSION;
+       clock_conf.eState=OMX_TIME_ClockStateStopped;
+       clock_conf.nStartTime=intToOMXTicks(0);
+       clock_conf.nOffset=intToOMXTicks(0);
+       error=OMX_SetConfig(omx_clock,OMX_IndexConfigTimeClockState,&clock_conf);
+       if (error!=OMX_ErrorNone) {
+               Log::getInstance()->log("Video", Log::DEBUG, "VuI Clock IndexConfigTimeClockState failed %x", error);
+       }
+
+
        memset(&clock_conf,0,sizeof(clock_conf));
        clock_conf.nSize=sizeof(clock_conf);
        clock_conf.nVersion.nVersion=OMX_VERSION;
@@ -2309,10 +2324,34 @@ OMX_ERRORTYPE VideoOMX::ProtOMXEmptyThisBuffer(OMX_HANDLETYPE handle, OMX_BUFFER
        // protect the call to empty this buffer
        int oldcancelstate;
        int oldcanceltype;
+/*     long long temp =buffer->nTimeStamp.nLowPart
+                                                       | ((long long) buffer->nTimeStamp.nHighPart << 32);*/
+
        pthread_testcancel();
        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
        pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
        clock_mutex.Lock();
+// Diagnosis code
+/*     OMX_ERRORTYPE error;
+       OMX_TIME_CONFIG_TIMESTAMPTYPE timestamp;
+       memset(&timestamp, 0, sizeof(timestamp));
+       timestamp.nSize = sizeof(timestamp);
+       timestamp.nVersion.nVersion = OMX_VERSION;
+       timestamp.nPortIndex =omx_clock_output_port;
+
+       error = OMX_GetConfig(omx_clock, OMX_IndexConfigTimeCurrentMediaTime,
+                       &timestamp);
+
+       if (error != OMX_ErrorNone) {
+               Log::getInstance()->log("Audio", Log::DEBUG,
+                               "Init OMX_IndexConfigAudioRenderingLatencyfailed %x %d", error,
+                               omx_rend_input_port);
+       }
+       long long temp2 =timestamp.nTimestamp.nLowPart
+                                                               | ((long long) timestamp.nTimestamp.nHighPart << 32);
+
+
+       Log::getInstance()->log("Video", Log::NOTICE, "OMXETB %x %lld %lld %x",handle,temp,temp2,buffer->nFlags);*/
        OMX_ERRORTYPE ret_val;
        ret_val=OMX_EmptyThisBuffer(handle,buffer);
        clock_mutex.Unlock();
@@ -2322,6 +2361,43 @@ OMX_ERRORTYPE VideoOMX::ProtOMXEmptyThisBuffer(OMX_HANDLETYPE handle, OMX_BUFFER
        return ret_val;
 }
 
+bool VideoOMX::detectIFrame(const UCHAR *buffer,unsigned int length)
+{
+       const UCHAR* curbuf=buffer;
+       const UCHAR* curbufend=buffer+length;
+       unsigned int detector=0xFFFFFFFF;
+       bool gotaud=false; // have seen access unit delimiter
+
+       while (curbuf!=curbufend) {
+               detector<<=8;
+               detector|=*curbuf;
+               if (h264) {
+                       if (detector==0x00000109) {
+                               gotaud=true;
+                               detector=0xFFFFFFFF;
+                       } else if (gotaud &&detector==0x00000001) {
+                               curbuf++;
+                               if (curbuf!=curbufend) {
+                                       unsigned char picttype=(*curbuf)& 0x1F;
+                                       return picttype==0x07;
+                               }
+                       }
+               } else {
+                       if (detector==0x00000100) {
+                               curbuf++;
+                               if (curbuf==curbufend) return false;
+                               curbuf++;
+                               if (curbuf==curbufend) return false;
+                               unsigned char picttype=((*curbuf) >> 3) & 0x07;
+                               return picttype==1;
+                       }
+               }
+               curbuf++;
+       }
+
+       return false; // no frame found
+}
+
 void VideoOMX::PrepareMediaSample(const MediaPacketList& mplist,UINT samplepos)
 {
         
@@ -2372,13 +2448,13 @@ UINT VideoOMX::DeliverMediaPacket(MediaPacket packet,
        if (paused) return 0; //Block if we pause
 
        //Log::getInstance()->log("Video", Log::DEBUG, "DeliverMediaPacketOMX time %lld",packet.presentation_time);
-       if (packet.synched && packet.presentation_time <= 2000000) {
+/*     if (packet.synched && packet.presentation_time <= 0) {
                *samplepos = packet.length;
                firstsynched = false;
                Log::getInstance()->log("Video", Log::DEBUG,
                                "DeliverMediaPacketOMX Frameskip");
                return packet.length;
-       }
+       }*/
 
        /*if (packet.synched && FrameSkip(packet.presentation_time)) {
                *samplepos=packet.length;
@@ -2424,6 +2500,13 @@ UINT VideoOMX::DeliverMediaPacket(MediaPacket packet,
        //                      buffer[packet.pos_buffer+0],buffer[packet.pos_buffer+1],buffer[packet.pos_buffer+2],buffer[packet.pos_buffer+3]);
                *samplepos+=headerstrip;
                if ( packet.synched ) {
+                       if (!firstsynched) {
+                         // check if this is an I frame, the decoder does not like non I frames at startup!
+                         if (!detectIFrame(buffer,packet.length)) {
+                                 *samplepos=packet.length;//if we have not processed at least one
+                                 return packet.length;//synched packet ignore it!
+                         }
+                       }
                        if (cur_input_buf_omx) {
                                cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_ENDOFFRAME;
                                PutBufferToPres(cur_input_buf_omx);
index fe931d83d799c56519832d0def3cb995534c744d..332c38caea1aacb6e7e586626676aef7ca49cf76 100644 (file)
@@ -182,6 +182,8 @@ class VideoOMX : public Video
                                                     const UCHAR* bulibaver,\r
                                                     UINT *samplepos);\r
 \r
+          bool detectIFrame(const UCHAR *buffer,unsigned int length);\r
+\r
           int PrepareInputBufsOMX();\r
           int DestroyInputBufsOMX();\r
 \r