changeset 20244:81a514f118d2

Implement bob (pseudo?) deinterlacing for xvmc. Patch from Tomas Janousek (tomi at nomi cz) with modifications by Carl Eugen Hoyos (cehoyos at ag or at) and me.
author reimar
date Sun, 15 Oct 2006 18:27:34 +0000
parents 71b630145e75
children dcb263f32986
files DOCS/man/de/mplayer.1 DOCS/man/en/mplayer.1 libvo/vo_xvmc.c
diffstat 3 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/de/mplayer.1	Sun Oct 15 18:15:19 2006 +0000
+++ b/DOCS/man/de/mplayer.1	Sun Oct 15 18:27:34 2006 +0000
@@ -3230,6 +3230,10 @@
 Benötigt für einwandfreies Benchmarking von Treibern, die den Bildpuffer nur
 bei einem Monitor-Retrace ändern (nVidia).
 Voreinstellung ist, die Bildwiedergabe nicht zu deaktivieren (nobenchmark).
+.IPs (no)bobdeint
+Sehr einfacher Deinterlacer.
+Sieht m\366glicherweise nicht besser als -vf tfields=1 aus, ist aber
+der einzige Deinterlacer, der mit xvmc funktioniert. (Standard: nobobdeint)
 .IPs (no)queue
 Frames werden in einer Queue angeordnet, um der Videohardware weitergehendes
 paralleles Arbeiten zu ermöglichen.
--- a/DOCS/man/en/mplayer.1	Sun Oct 15 18:15:19 2006 +0000
+++ b/DOCS/man/en/mplayer.1	Sun Oct 15 18:27:34 2006 +0000
@@ -3087,6 +3087,10 @@
 Necessary for proper benchmarking of drivers that change
 image buffers on monitor retrace only (nVidia).
 Default is not to disable image display (nobenchmark).
+.IPs (no)bobdeint
+Very simple deinterlacer.
+Might not look better than -vf tfields=1,
+but it's the only deinterlacer for xvmc (default: nobobdeint).
 .IPs (no)queue
 Queue frames for display to allow more parallel work of the video hardware.
 May add a small (not noticeable) constant A/V desync (default: noqueue).
--- a/libvo/vo_xvmc.c	Sun Oct 15 18:15:19 2006 +0000
+++ b/libvo/vo_xvmc.c	Sun Oct 15 18:27:34 2006 +0000
@@ -51,6 +51,8 @@
 static int first_frame;//draw colorkey on first frame
 static int use_queue;
 static int xv_port_request = 0;
+static int bob_deinterlace;
+static int top_field_first;
 
 static int image_width,image_height;
 static uint32_t  drwX,drwY;
@@ -345,6 +347,7 @@
 // the surface have passed vf system without been skiped, it will be displayed
    rndr->state |= MP_XVMC_STATE_DISPLAY_PENDING;
    p_render_surface_to_show = rndr;
+   top_field_first = mpi->fields & MP_IMGFIELD_TOP_FIRST;
    return VO_TRUE;
 }
 
@@ -363,6 +366,7 @@
   {  "benchmark", OPT_ARG_BOOL, &benchmark,       NULL },
   {  "sleep",     OPT_ARG_BOOL, &use_sleep,       NULL },
   {  "queue",     OPT_ARG_BOOL, &use_queue,       NULL },
+  {  "bobdeint",  OPT_ARG_BOOL, &bob_deinterlace, NULL },
   {  NULL }
 };
 
@@ -400,6 +404,7 @@
    benchmark = 0; //disable PutImageto allow faster display than screen refresh
    use_sleep = 0;
    use_queue = 0;
+   bob_deinterlace = 0;
 
    /* parse suboptions */
    if ( subopt_parse( arg, subopts ) != 0 )
@@ -1014,6 +1019,7 @@
 static void put_xvmc_image(xvmc_render_state_t * p_render_surface, int draw_ck){
 int rez;
 int clipX,clipY,clipW,clipH;
+int i;
 
    if(p_render_surface == NULL)
       return;
@@ -1029,15 +1035,19 @@
    if(benchmark)
       return;
 
+   for (i = 1; i <= bob_deinterlace + 1; i++) {
+   int field = top_field_first ? i : i ^ 3;
    rez = XvMCPutSurface(mDisplay, p_render_surface->p_surface, 
                         vo_window,
                         0, 0, image_width, image_height,
                         clipX, clipY, clipW, clipH,
-                        3);//p_render_surface_to_show->display_flags);
+                        bob_deinterlace ? field : 3);
+                        //p_render_surface_to_show->display_flags);
    if(rez != Success){
       printf("vo_xvmc: PutSurface failer, critical error %d!\n",rez);
       assert(0);
    }
+   }
    XFlush(mDisplay);
 }