]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Fix skip and fast forward
authorMarten Richter <marten.richter@freenet.de>
Tue, 18 Sep 2012 18:10:05 +0000 (20:10 +0200)
committerMarten Richter <marten.richter@freenet.de>
Tue, 18 Sep 2012 18:10:05 +0000 (20:10 +0200)
videoomx.cc
videoomx.h

index 18e43cb797793b5c46e164cb76aac2acc431e2c5..13704f6942c9946dbce47d42b908a1f6863318fe 100644 (file)
@@ -1577,6 +1577,7 @@ int VideoOMX::DestroyInputBufsOMX() //need s to be called with locked mutex
        input_bufs_omx_free.clear();
        input_bufs_omx_present.clear();
        input_time_present.clear();
+       input_time_pts.clear();
        input_is_last.clear();
        input_bufs_omx_mutex.Unlock();
 
@@ -2026,7 +2027,7 @@ int VideoOMX::blank(void)
 ULLONG VideoOMX::getCurrentTimestamp()
 {
   if (iframemode) return 0;
-  return lastreftimePTS;
+  return cur_pts;
 }
 
 // to be removed
@@ -2126,6 +2127,7 @@ void VideoOMX::ResetTimeOffsets() {
   lastrefvideotime=0;
   lastreftimeOMX=0;
   lastreftimePTS=0;
+  cur_pts=0;
 }
 
 long long VideoOMX::GetCurrentSystemTime()
@@ -2237,12 +2239,13 @@ void VideoOMX::threadMethod()
                if (!paused) {
                        input_bufs_omx_mutex.Lock();
                        if (input_bufs_omx_present.size()>0) {
-
+                               cur_pts=input_time_pts.front();
                                pict=input_bufs_omx_present.front();
                                time=input_time_present.front();
                                islast=input_is_last.front();
                                input_bufs_omx_present.pop_front();
                                input_time_present.pop_front();
+                               input_time_pts.pop_front();
                                input_is_last.pop_front();
                        }
                        input_bufs_omx_mutex.Unlock();
@@ -2345,11 +2348,12 @@ void VideoOMX::DeinterlaceFix()
 }
 
 
-void VideoOMX::PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time,bool islast)
+void VideoOMX::PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time, long long pts,bool islast)
 {
        input_bufs_omx_mutex.Lock();
        input_bufs_omx_present.push_back(buffer);
        input_time_present.push_back(time);
+       input_time_pts.push_back(pts);
        input_is_last.push_back(islast);
        input_bufs_omx_mutex.Unlock();
 
@@ -2450,7 +2454,7 @@ UINT VideoOMX::DeliverMediaPacket(MediaPacket packet,
        if (packet.disconti) {
                firstsynched=false;
                if (cur_input_buf_omx) {
-                       PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,true);
+                       PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,lastreftimePTS, true);
                        cur_input_buf_omx=NULL;
                }
        }
@@ -2468,7 +2472,7 @@ UINT VideoOMX::DeliverMediaPacket(MediaPacket packet,
                if ( packet.synched ) {
                        if (cur_input_buf_omx) {
                                cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_ENDOFFRAME;
-                               PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,true);
+                               PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,lastreftimePTS,true);
                                cur_input_buf_omx=NULL;//write out old data
 
 
@@ -2542,7 +2546,7 @@ UINT VideoOMX::DeliverMediaPacket(MediaPacket packet,
                *samplepos+=cancopy;
                // push old buffer out
 
-               PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,false);
+               PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,lastreftimePTS,false);
                cur_input_buf_omx=NULL;
                // get5 new buffer
                input_bufs_omx_mutex.Lock();
@@ -2633,7 +2637,7 @@ bool VideoOMX::displayIFrame(const UCHAR* buffer, UINT length) {
 
                                        }
                                        cur_input_buf_omx->nTimeStamp = 0;
-                                       PutBufferToPres(cur_input_buf_omx, 0,false);
+                                       PutBufferToPres(cur_input_buf_omx, 0,0,false);
                                        cur_input_buf_omx = NULL;
 
                                        if (!cur_input_buf_omx) {
@@ -2688,7 +2692,8 @@ bool VideoOMX::displayIFrame(const UCHAR* buffer, UINT length) {
 
        }
        cur_input_buf_omx->nTimeStamp = 0;
-       PutBufferToPres(cur_input_buf_omx, 0,false);
+       
+       PutBufferToPres(cur_input_buf_omx, 0,0,false);
        cur_input_buf_omx = NULL;
 
 
@@ -2698,13 +2703,20 @@ bool VideoOMX::displayIFrame(const UCHAR* buffer, UINT length) {
 
 int VideoOMX::EnterIframePlayback()
 {
-       clock_mutex.Lock();
        if (cur_input_buf_omx) {
-               PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,true);
-
+               PutBufferToPres(cur_input_buf_omx, lastreftimeOMX, lastreftimePTS,true);
                cur_input_buf_omx = NULL;
        }
-       clock_mutex.Unlock();
+       input_bufs_omx_mutex.Lock();
+       while (input_bufs_omx_present.size()) {
+               input_bufs_omx_free.push_back(input_bufs_omx_present.front());
+               input_bufs_omx_present.pop_front();
+       }
+       input_time_present.clear();
+       input_time_pts.clear();
+       input_is_last.clear();
+       input_bufs_omx_mutex.Unlock();
+
        iframemode=true;
 
        return 1;
index be11fdf90691385b94a1d4c2b9a32903e5e8f933..9fd9caf2194ce319c8aa14528a6ac85f174837ec 100644 (file)
@@ -147,6 +147,7 @@ class VideoOMX : public Video, public Thread_TYPE
           long long startoffset;\r
           long long lastrefvideotime;\r
           long long lastrefaudiotime;\r
+          long long cur_pts;
           OMX_TICKS lastreftimeOMX;\r
           ULLONG lastreftimePTS;\r
 \r
@@ -234,11 +235,12 @@ class VideoOMX : public Video, public Thread_TYPE
           list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;\r
           list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_present;\r
           list<long long> input_time_present;\r
+          list<long long> input_time_pts;\r
           list<bool> input_is_last;\r
           Mutex input_bufs_omx_mutex;\r
           OMX_BUFFERHEADERTYPE* cur_input_buf_omx;\r
 \r
-          void PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time,bool is_last);\r
+          void PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time,long long pts, bool is_last);\r
           void threadMethod();\r
           void threadPostStopCleanup();\r
 \r