changeset 28684:75aebdf41ee9

Enable Bob de-interlacing for VDPAU.
author cehoyos
date Tue, 24 Feb 2009 21:46:25 +0000
parents f522a9649b97
children 254b194b6518
files libvo/vo_vdpau.c
diffstat 1 files changed, 26 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_vdpau.c	Tue Feb 24 19:28:14 2009 +0000
+++ b/libvo/vo_vdpau.c	Tue Feb 24 21:46:25 2009 +0000
@@ -150,6 +150,7 @@
 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 @@
 {
     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 @@
         &vid_height,
         &vdp_chroma_type
     };
-    if (deint == 1)
+    if (deint == 2)
         features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
-    if (deint == 2)
+    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 @@
                                                     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 @@
     "\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"