[mythtv] MythTv with Via XvMc MPEG Decoding: Motion jitter

Terry Barnaby terry1 at beam.ltd.uk
Sun Sep 19 05:08:26 EDT 2004


Hi All,

Further to my problems with MythTv 0.16 and large amounts of
picture motion jitter, I have added some instrumentation code
to look at the timings of Frame display. The following
lists the output and the insrumentation code used.
I believe it shows that there is quite a problem with the MythTv Video
sync when VSYNC interrupt is used.
I have not delved any further yet ....

My System:
M10000 Via system running Fedora Core 2.
Kernel 2.6.7 with DRM from CVS date 2004-9-12.
Unichrome Via X driver from CVS 2004-9-16, AGP-DMA enabled
Unichrome Via libXvMC library from CVS 2004-9-16
MythTv from CVS + XvMC QMatrix mods.
Connected to PAL TV running with 50Hz VSYNC


Using RTC timeing
=======================================
Here the picture quality is fine.
FrameTime:  40.04ms Diff:   0.04ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.06ms Diff:   0.06ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  39.07ms Diff:  -0.93ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.09ms Diff:   0.09ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.04ms Diff:   0.04ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.11ms Diff:   0.11ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  39.96ms Diff:  -0.04ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.03ms Diff:   0.03ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.05ms Diff:   0.05ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.05ms Diff:   0.05ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.04ms Diff:   0.04ms PeakDiff:  40.13ms VsyncAdjust:      0
FrameTime:  40.05ms Diff:   0.05ms PeakDiff:  40.13ms VsyncAdjust:      0


Using VSYNC interrupt with KeepPhase
=======================================
Here the picture motion is very jumpy.
VSyncWait: Refresh:  16650 MDelay:  19348 VBlank: 2
FrameTime:  40.01ms Diff:   0.01ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  17304 VBlank: 2
FrameTime:  40.03ms Diff:   0.03ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  14961 VBlank: 1
FrameTime:  19.99ms Diff: -20.01ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  33377 VBlank: 3
FrameTime:  60.01ms Diff:  20.01ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  11294 VBlank: 1
FrameTime:  20.01ms Diff: -19.99ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  29399 VBlank: 2
FrameTime:  40.00ms Diff:   0.00ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  27391 VBlank: 2
FrameTime:  40.02ms Diff:   0.02ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  25371 VBlank: 2
FrameTime:  40.00ms Diff:  -0.00ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  39794 VBlank: 3
FrameTime:  60.04ms Diff:  20.04ms PeakDiff:  60.04ms VsyncAdjust:  16650
VSyncWait: Refresh:  16650 MDelay:  17494 VBlank: 2
FrameTime:  39.98ms Diff:  -0.02ms PeakDiff:  60.04ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  15767 VBlank: 1
FrameTime:  20.01ms Diff: -19.99ms PeakDiff:  60.04ms VsyncAdjust:      0



Using VSYNC interrupt without KeepPhase
=======================================
Here the picture motion is fine
FrameTime:  40.00ms Diff:   0.00ms PeakDiff:  59.96ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  31159 VBlank: 2
FrameTime:  40.01ms Diff:   0.01ms PeakDiff:  59.96ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  30834 VBlank: 2
FrameTime:  40.03ms Diff:   0.03ms PeakDiff:  59.96ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  31129 VBlank: 2
FrameTime:  39.99ms Diff:  -0.01ms PeakDiff:  59.96ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  31099 VBlank: 2
FrameTime:  40.00ms Diff:   0.00ms PeakDiff:  59.96ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  31055 VBlank: 2
FrameTime:  40.01ms Diff:   0.01ms PeakDiff:  59.96ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  30740 VBlank: 2
FrameTime:  40.01ms Diff:   0.01ms PeakDiff:  59.96ms VsyncAdjust:      0


Perodically changes to
======================
Here the picture motion is slightly jumpy
VSyncWait: Refresh:  16650 MDelay:  33428 VBlank: 3
FrameTime:  60.01ms Diff:  20.01ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  13170 VBlank: 1
FrameTime:  20.00ms Diff: -19.99ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  33393 VBlank: 3
FrameTime:  60.01ms Diff:  20.01ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  13222 VBlank: 1
FrameTime:  20.01ms Diff: -19.99ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  33389 VBlank: 3
FrameTime:  60.01ms Diff:  20.01ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  13312 VBlank: 1
FrameTime:  20.01ms Diff: -19.99ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  33382 VBlank: 3
FrameTime:  60.01ms Diff:  20.02ms PeakDiff:  20.09ms VsyncAdjust:      0
VSyncWait: Refresh:  16650 MDelay:  13284 VBlank: 1
FrameTime:  20.00ms Diff: -20.00ms PeakDiff:  20.09ms VsyncAdjust:      0


Instrumentation Code
====================
--- 
/src/homeSys/devel/MythTv/mythtv_0.16/mythtv_cvs/libs/libmythtv/NuppelVideoPlayer.cpp    
2004-09-13 07:09:23.000000000 +0100
+++ NuppelVideoPlayer.cpp    2004-09-19 09:29:47.000000000 +0100
@@ -1194,6 +1194,15 @@
     }
 }
 
+// Get current time in seconds
+double getTime()
+{
+    struct timeval    tp;
+   
+    gettimeofday(&tp, NULL);
+    return ((double) tp.tv_sec + (double) tp.tv_usec * 1e-6);
+}
+
 void NuppelVideoPlayer::AVSync(void)
 {
     float           diverge;
@@ -1233,6 +1242,35 @@
         }
 
         videosync->WaitForFrame(avsync_adjustment);
+
+#ifndef BEAM_ZAP
+{
+static double lastTime = 0.0;
+static double peak = 0.0;
+static int    c = 0;
+double    tnow = 0.0;
+double    d = 0.0;
+double    da = 0.0;
+
+    print_verbose_messages = VB_IMPORTANT | VB_PLAYBACK;
+
+    tnow = getTime();
+    if(lastTime > 0.0){
+        d = (tnow - lastTime) - (1.0 / 25.0);
+        da = fabs(d);
+        if(da > peak)
+            peak = da;
+    }
+//    printf("Raw: %4.4f Abs: %4.4f\n", (tnow - lastTime) - (1.0 / 
25.0), fabs((tnow - lastTime) - (1.0 / 25.0)));
+    printf("FrameTime: %6.2fms Diff: %6.2fms PeakDiff: %6.2fms 
VsyncAdjust: %6d\n", (tnow - lastTime) * 1000, d * 1000, peak * 1000, 
avsync_adjustment);
+    lastTime = tnow;
+    c++;
+    if(c > 200){
+        peak = 0;
+        c = 0;
+    }
+}
+#endif
         avsync_adjustment = 0;
 
         // Display the frame
--- 
/src/homeSys/devel/MythTv/mythtv_0.16/mythtv_cvs/libs/libmythtv/vsync.cpp    
2004-08-28 19:45:34.000000000 +0100
+++ vsync.cpp    2004-09-19 09:43:11.342518473 +0100
@@ -276,10 +282,13 @@
         blank.request.type = DRM_VBLANK_RELATIVE;
         blank.request.sequence =
             (int)(ceil((double)m_delay / m_refresh_interval));
+printf("VSyncWait: Refresh: %6d MDelay: %6d VBlank: %d\n", 
m_refresh_interval, m_delay, blank.request.sequence);
         drmWaitVBlank(m_dri_fd, &blank);
     }
 
+#ifdef BEAM_ZAP
     KeepPhase();
+#endif
    
     UpdateNexttrigger();
 }


Terry Barnaby wrote:

> Hi,
>
> I have got a bit further on this issue.
> In MythTv the frame sync system, has changed quite a bit and is
> now performed in the vsync.c file. This now chooses what
> it thinks is the best timing system to use.
> On the Via M10000 system the vsync algorithem chooses to
> use the DRM vsync interrupt system. This is fine by me (as I
> added the VSYNC Interrupt :) ), but it appears to cause
> frame output instability. If you disable the DRM vsync interrupt
> system (comment out in VideoSync::BestMethod()) so that MythTv uses
> the linux RTC, all looks much better.
>
> Delving into the DRM vsync interrupt system, there is a call
> to VideoSync::KeepPhase() in DRMVideoSync::WaitForFrame().
> This seems to be the root of the problem. Remove this and
> things appear fine (I am at work viewing on a VGA monitor rather
> than PAL TV). With KeepPhase() the peak discrepancy in
> the frame display time is around 26ms and without it it is
> around 10ms. I note that the Vsync interrupt at work is
> 60Hz when connected to a VGA screen with my X-Server mode lines.
>
> The code in VideoSync::KeepPhase() doesn't seem right to me ...
>
> void VideoSync::KeepPhase()
> {
>     // Keep our nexttrigger from drifting too close to the exact retrace.
>     // If delay is near zero, some frames will be delay < 0 and others
>     // delay > 0 which would cause continous rapid fire stuttering.
>     // This method is only useful for those sync methods where 
> WaitForFrame
>     // targets hardware retrace rather than targeting nexttrigger.
>
>     // cerr << m_delay << endl;
>     if (m_delay < -(m_refresh_interval/2))
>         OffsetTimeval(m_nexttrigger, 200);
>     else if (m_delay > -500)
>         OffsetTimeval(m_nexttrigger, -2000);
> }
>
>
> Terry
>
> Terry Barnaby wrote:
>
>> Hi All,
>>
>> I have just had a chance to look at the motion "artifacts" problem
>> with using the latest Via XvMc MPEG Decoding with MythTv.
>>
>> There is a large amount of motion jitter on the display. I have
>> narrowed this down to some problem with MythTv 0.16 CVS.
>>
>> My System:
>> M10000 Via system running Fedora Core 2.
>> Kernel 2.6.7 with DRM from CVS date 2004-9-12.
>> Unichrome Via X driver from CVS 2004-9-16, AGP-DMA enabled
>> Unichrome Via libXvMC library from CVS 2004-9-16
>> MythTv from CVS + XvMC QMatrix mods.
>>
>> My Tests:
>> 1. Using MythTv 0.16 CVS there is a large amount of jitter both using
>>     the Via XvMc MPEG Decoding and the internal software decode
>>     with Xv display output.
>>     I am unable to turn on Vertical sync mode with 0.16, it seems
>>     to have been removed (experemental AV sync).
>>
>> 2. Using MythTv 0.15.1 the display looks good with both the Via XvMc
>>     MPEG Decoding and the internal software decode with Xv display
>>     output. Using Via XvMc MPEG decoding CPU usage is about 12%.
>>     If I enable Vertical sync mode the picture quality is still
>>     very good, but additionally when a jump forward in the video
>>     is performed (cursor right key) the display restarts quickly
>>     and cleanly. Without Vertical sync mode there is a period of
>>     about 3 seconds of display sluggishness.
>>
>> So the motion jitter problem seems to be an issue with a new
>> synchronisation scheme in MythTv. Note I am running MythTv as root
>> still so the Real-time mode is enabled.
>>
>> The Chroma QMatrix code does not seem to have made much difference
>> that I can see as yet, but I have been focassing on the motion 
>> problems ....
>>
>> I will investigate further today.
>>
>> Terry
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> mythtv-dev mailing list
>> mythtv-dev at mythtv.org
>> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>mythtv-dev mailing list
>mythtv-dev at mythtv.org
>http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev
>  
>


More information about the mythtv-dev mailing list