]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Fix segfault in clockunpause and enhance video frame skipping
authorMarten Richter <marten.richter@freenet.de>
Mon, 10 Sep 2012 06:44:44 +0000 (08:44 +0200)
committerMarten Richter <marten.richter@freenet.de>
Mon, 10 Sep 2012 06:44:44 +0000 (08:44 +0200)
videoomx.cc

index 7bda5c7a42506e7bf4c40ac2150d89d20848af23..63374e6091858ebd727c23dc61d951cbb616c149 100644 (file)
@@ -677,19 +677,20 @@ void VideoOMX::clockUnpause()
 {
        OMX_ERRORTYPE error;
        clock_mutex.Lock();
-       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_ClockStateRunning;
-       clock_conf.nStartTime=0;
-       clock_conf.nOffset=0;
-       clock_conf.nWaitMask=OMX_CLOCKPORT1;
-       error=OMX_SetConfig(omx_clock,OMX_IndexConfigTimeClockState,&clock_conf);
-       if (error!=OMX_ErrorNone) {
-               Log::getInstance()->log("Video", Log::DEBUG, "ClockUnpause IndexConfigTimeClockState failed %x", error);
+       if (clock_references>0) {
+               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_ClockStateRunning;
+               clock_conf.nStartTime=0;
+               clock_conf.nOffset=0;
+               clock_conf.nWaitMask=OMX_CLOCKPORT1;
+               error=OMX_SetConfig(omx_clock,OMX_IndexConfigTimeClockState,&clock_conf);
+               if (error!=OMX_ErrorNone) {
+                       Log::getInstance()->log("Video", Log::DEBUG, "ClockUnpause IndexConfigTimeClockState failed %x", error);
+               }
        }
-
        clock_mutex.Unlock();
 }
 
@@ -698,17 +699,19 @@ void VideoOMX::clockPause()
 {
        OMX_ERRORTYPE error;
        clock_mutex.Lock();
-       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=0;
-       clock_conf.nOffset=0;
-       clock_conf.nWaitMask=OMX_CLOCKPORT1;
-       error=OMX_SetConfig(omx_clock,OMX_IndexConfigTimeClockState,&clock_conf);
-       if (error!=OMX_ErrorNone) {
-               Log::getInstance()->log("Video", Log::DEBUG, "ClockUnpause IndexConfigTimeClockState failed %x", error);
+       if (clock_references>0) {
+               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=0;
+               clock_conf.nOffset=0;
+               clock_conf.nWaitMask=OMX_CLOCKPORT1;
+               error=OMX_SetConfig(omx_clock,OMX_IndexConfigTimeClockState,&clock_conf);
+               if (error!=OMX_ErrorNone) {
+                       Log::getInstance()->log("Video", Log::DEBUG, "ClockUnpause IndexConfigTimeClockState failed %x", error);
+               }
        }
        clock_mutex.Unlock();
 }
@@ -2297,11 +2300,11 @@ OMX_ERRORTYPE VideoOMX::ProtOMXEmptyThisBuffer(OMX_HANDLETYPE handle, OMX_BUFFER
 
 void VideoOMX::PrepareMediaSample(const MediaPacketList& mplist,UINT samplepos)
 {
-  mediapackets.clear();
-  list<MediaPacket>::const_iterator begin=mplist.begin();
-  list<MediaPacket>::const_iterator itty=mplist.begin();
-  advance(itty,min(mplist.size(),50));
-  mediapackets.insert(mediapackets.begin(),begin,itty);//front
+       mediapackets.clear();
+       list<MediaPacket>::const_iterator begin=mplist.begin();
+       list<MediaPacket>::const_iterator itty=mplist.begin();
+       advance(itty,min(mplist.size(),10));
+       mediapackets.insert(mediapackets.begin(),begin,itty);//front
 }
 
 UINT VideoOMX::DeliverMediaSample(UCHAR* buffer, UINT *samplepos)
@@ -2344,7 +2347,13 @@ UINT VideoOMX::DeliverMediaPacket(MediaPacket packet,
        if (!omx_running) return 0; // if we are not runnig do not do this
        if (paused) return 0; //Block if we pause
 
-       long long current_media_time=GetCurrentSystemTime()+playbacktimeoffset;
+       if (packet.synched && FrameSkip(packet.presentation_time)) {
+               *samplepos=packet.length;
+               Log::getInstance()->log("Video", Log::DEBUG, "DeliverMediaPacketOMX Frameskip");
+                               *samplepos=packet.length;
+               return packet.length;
+       }
+       //long long current_media_time=GetCurrentSystemTime()+playbacktimeoffset;
 /*     if (packet.synched &&
                        (packet.presentation_time<0 /*|| // preroll skip frames
                        (packet.presentation_time+5000000LL)<(current_media_time)*)) { // we are late skip