[MPlayer-cvslog] r28719 - trunk/libvo/vo_vdpau.c

cehoyos subversion at mplayerhq.hu
Tue Feb 24 22:46:26 CET 2009


Author: cehoyos
Date: Tue Feb 24 22:46:25 2009
New Revision: 28719

Log:
Enable Bob de-interlacing for VDPAU.

Modified:
   trunk/libvo/vo_vdpau.c

Modified: trunk/libvo/vo_vdpau.c
==============================================================================
--- trunk/libvo/vo_vdpau.c	Tue Feb 24 20:28:14 2009	(r28718)
+++ trunk/libvo/vo_vdpau.c	Tue Feb 24 22:46:25 2009	(r28719)
@@ -150,6 +150,7 @@ static int                              
 static int                                pullup;
 static float                              denoise;
 static float                              sharpen;
+static int                                top_field_first;
 
 static VdpDecoder                         decoder;
 static int                                decoder_max_refs;
@@ -200,24 +201,34 @@ static void video_to_output_surface(void
 {
     VdpTime dummy;
     VdpStatus vdp_st;
-    VdpOutputSurface output_surface = output_surfaces[surface_num];
+    int i;
     if (vid_surface_num < 0)
         return;
 
-    vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue,
-                                                             output_surface,
-                                                             &dummy);
-    CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle")
+    // we would need to provide 2 past and 1 future frames to allow advanced
+    // deinterlacing, which is not really possible currently.
+    for (i = 0; i <= !!deint; i++) {
+        int field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME;
+        VdpOutputSurface output_surface;
+        if (i)
+            flip_page();
+        if (deint)
+            field = top_field_first == i ?
+                    VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD:
+                    VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
+        output_surface = output_surfaces[surface_num];
+        vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue,
+                                                                 output_surface,
+                                                                 &dummy);
+        CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle")
 
-    // we would need to provide past and future frames to allow deinterlacing,
-    // which is not really possible currently. Deinterlacing is supposed to fall
-    // back to bob deinterlacing, but that seems not to work either.
     vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0,
-                                    VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME,
+                                    field,
                                     0, NULL, surface_render[vid_surface_num].surface, 0, NULL, &src_rect_vid,
                                     output_surface,
                                     NULL, &out_rect_vid, 0, NULL);
     CHECK_ST_WARNING("Error when calling vdp_video_mixer_render")
+    }
 }
 
 static void resize(void)
@@ -381,9 +392,9 @@ static int create_vdp_mixer(VdpChromaTyp
         &vid_height,
         &vdp_chroma_type
     };
-    if (deint == 1)
-        features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
     if (deint == 2)
+        features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
+    if (deint == 3)
         features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL;
     if (pullup)
         features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE;
@@ -817,6 +828,7 @@ static uint32_t draw_image(mp_image_t *m
                                                     mpi->stride); // pitch
         CHECK_ST_ERROR("Error when calling vdp_video_surface_put_bits_y_cb_cr")
     }
+    top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST);
 
     video_to_output_surface();
     return VO_TRUE;
@@ -932,8 +944,9 @@ static const char help_msg[] =
     "\nOptions:\n"
     "  deint\n"
     "    0: no deinterlacing\n"
-    "    1: temporal deinterlacing (not yet working)\n"
-    "    2: temporal-spatial deinterlacing (not yet working)\n"
+    "    1: bob deinterlacing (current fallback)\n"
+    "    2: temporal deinterlacing (not yet working)\n"
+    "    3: temporal-spatial deinterlacing (not yet working)\n"
     "  pullup\n"
     "    Try to apply inverse-telecine (needs deinterlacing, not working)\n"
     "  denoise\n"



More information about the MPlayer-cvslog mailing list