summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorcehoyos <cehoyos@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-02-24 21:46:25 +0000
committercehoyos <cehoyos@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-02-24 21:46:25 +0000
commit4cfb4ba7d8cbd73b65a53722072dd6593bf55ac2 (patch)
tree72382c712b20cb681045b9ffd8cdd1ece774705a /libvo
parent48833d442fe73e553a4e7a5c92b2839aa7a25d38 (diff)
downloadmpv-4cfb4ba7d8cbd73b65a53722072dd6593bf55ac2.tar.bz2
mpv-4cfb4ba7d8cbd73b65a53722072dd6593bf55ac2.tar.xz
Enable Bob de-interlacing for VDPAU.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28719 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_vdpau.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/libvo/vo_vdpau.c b/libvo/vo_vdpau.c
index e60c36c3ab..d481cb1ee2 100644
--- a/libvo/vo_vdpau.c
+++ b/libvo/vo_vdpau.c
@@ -150,6 +150,7 @@ static int deint;
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(VdpChromaType vdp_chroma_type) {
&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 *mpi)
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"