All pastes #1761152 Raw Edit

Someone

public text v1 · immutable
#1761152 ·published 2010-01-22 04:56 UTC
rendered paste body
Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 23236)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -692,21 +692,15 @@
     long double diff = (max(desiredFrame - frameseekadjust, 0LL)) * AV_TIME_BASE / fps;
     ts += (long long)diff;
 
+    VERBOSE(VB_IMPORTANT, "av_seek_frame -- start");
     if (av_seek_frame(ic, -1, ts, AVSEEK_FLAG_BACKWARD) < 0)
     {
         VERBOSE(VB_IMPORTANT, LOC_ERR
                 <<"av_seek_frame(ic, -1, "<<ts<<", 0) -- error");
         return false;
     }
+    VERBOSE(VB_IMPORTANT, "av_seek_frame -- stop");
 
-    // If seeking to start of stream force a DTS and start_time of zero as
-    // libav sometimes returns the end of the stream instead.
-    if (desiredFrame <= 1)
-    {
-        av_update_cur_dts(ic, st, 0);
-        ic->start_time = 0;
-    }
-
     int normalframes = 0;
 
     if (st->cur_dts != (int64_t)AV_NOPTS_VALUE)
@@ -719,8 +713,13 @@
             int64_t st1 = av_rescale(ic->start_time,
                                     st->time_base.den,
                                     AV_TIME_BASE * (int64_t)st->time_base.num);
-            adj_cur_dts = lsb3full(adj_cur_dts, st1, st->pts_wrap_bits);
-
+            // If seeking near the start of stream sometimes the adjusted current dts time 
+            // is less than the start time (possibly due to the AVSEEK_FLAG_BACKWARD flag ?).
+            // If so, set adjusted current dts to zero.
+            if (adj_cur_dts < st1)
+                adj_cur_dts = 0;
+            else
+                adj_cur_dts = lsb3full(adj_cur_dts, st1, st->pts_wrap_bits);
         }
 
         long long newts = av_rescale(adj_cur_dts,
@@ -731,6 +730,8 @@
         framesPlayed = lastKey;
         framesRead = lastKey;
 
+        VERBOSE(VB_IMPORTANT, LOC + QString("av_seek_frame returned frame %1")
+                .arg(lastKey));
         normalframes = desiredFrame - framesPlayed;
         normalframes = max(normalframes, 0);
         no_dts_hack = false;