[MPlayer-dev-eng] [PATCH]Implement advanced deinterlacing for vdpau with SW decoders, try 3
Carl Eugen Hoyos
cehoyos at rainbow.studorg.tuwien.ac.at
Sun Mar 15 19:14:06 CET 2009
Hi!
Attached is a new version of the patch allowing to use advanced
deinterlacing with vo vdpau for non-hardware-accelerated codecs.
Note that the last (perhaps "cleaner") version was totally broken, while
this one actually works.
Please comment, Carl Eugen
-------------- next part --------------
Index: libvo/vo_vdpau.c
===================================================================
--- libvo/vo_vdpau.c (revision 28934)
+++ libvo/vo_vdpau.c (working copy)
@@ -152,6 +152,7 @@
static VdpVideoMixer video_mixer;
static int deint;
static int deint_type;
+static int deint_counter;
static int pullup;
static float denoise;
static float sharpen;
@@ -212,11 +213,14 @@
VdpTime dummy;
VdpStatus vdp_st;
int i;
- if (vid_surface_num < 0)
+ VdpVideoSurface const past_pict[2] =
+ {surface_render[(vid_surface_num - 2) & 3].surface,
+ surface_render[(vid_surface_num - 3) & 3].surface};
+ int current_pict = (deint > 2) ? (vid_surface_num-1) & 3 : vid_surface_num;
+ if (vid_surface_num < 0 ||
+ surface_render[current_pict].surface == VDP_INVALID_HANDLE)
return;
- // 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 > 1); i++) {
int field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME;
VdpOutputSurface output_surface;
@@ -236,9 +240,10 @@
CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle")
vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0,
- field, 0, NULL,
- surface_render[vid_surface_num].surface,
- 0, NULL, &src_rect_vid,
+ field, 2, past_pict,
+ surface_render[current_pict].surface,
+ 1, &surface_render[vid_surface_num].surface,
+ &src_rect_vid,
output_surface,
NULL, &out_rect_vid, 0, NULL);
CHECK_ST_WARNING("Error when calling vdp_video_mixer_render")
@@ -407,7 +412,6 @@
&vid_height,
&vdp_chroma_type
};
- if (deint == 3)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
if (deint == 4)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL;
@@ -425,6 +429,8 @@
CHECK_ST_ERROR("Error when calling vdp_video_mixer_create")
for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE;
+ if (deint < 3)
+ feature_enables[0] = VDP_FALSE;
if (feature_count)
vdp_video_mixer_set_feature_enables(video_mixer, feature_count, features, feature_enables);
if (denoise)
@@ -837,10 +843,11 @@
if (IMGFMT_IS_VDPAU(image_format)) {
struct vdpau_render_state *rndr = mpi->priv;
vid_surface_num = rndr - surface_render;
+ deint = FFMIN(deint, 2);
} else if (!(mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)) {
VdpStatus vdp_st;
void *destdata[3] = {mpi->planes[0], mpi->planes[2], mpi->planes[1]};
- struct vdpau_render_state *rndr = get_surface(0);
+ struct vdpau_render_state *rndr = get_surface(deint_counter);
vid_surface_num = rndr - surface_render;
vdp_st = vdp_video_surface_put_bits_y_cb_cr(rndr->surface,
VDP_YCBCR_FORMAT_YV12,
@@ -851,6 +858,7 @@
top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST);
video_to_output_surface();
+ deint_counter = (deint_counter + 1) & 3;
return VO_TRUE;
}
@@ -984,6 +992,7 @@
deint = 0;
deint_type = 3;
+ deint_counter = 0;
pullup = 0;
denoise = 0;
sharpen = 0;
@@ -1087,6 +1096,18 @@
deint = *(int*)data;
if (deint)
deint = deint_type;
+ if (deint_type > 2) {
+ VdpStatus vdp_st;
+ VdpVideoMixerFeature features[1] =
+ {deint_type == 3 ?
+ VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL :
+ VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL};
+ VdpBool feature_enables[1] = {deint ? VDP_TRUE : VDP_FALSE};
+ vdp_st = vdp_video_mixer_set_feature_enables(video_mixer, 1,
+ features,
+ feature_enables);
+ CHECK_ST_WARNING("Error changing deinterlacing settings")
+ }
return VO_TRUE;
case VOCTRL_PAUSE:
return (int_pause = 1);
More information about the MPlayer-dev-eng
mailing list