Mercurial > mplayer.hg
changeset 28638:7b16ccf423b4
Add support for VDPAU deinterlacing, pullup, denoise and sharpening.
Deinterlacing can not yet be toggled at runtime, and actually it does
not seem to work at all...
author | reimar |
---|---|
date | Fri, 20 Feb 2009 09:45:48 +0000 |
parents | 27dcce5e26c7 |
children | 0e0b2001d290 |
files | libvo/vo_vdpau.c |
diffstat | 1 files changed, 70 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_vdpau.c Thu Feb 19 16:08:07 2009 +0000 +++ b/libvo/vo_vdpau.c Fri Feb 20 09:45:48 2009 +0000 @@ -42,6 +42,7 @@ #include "x11_common.h" #include "aspect.h" #include "sub.h" +#include "subopt-helper.h" #include "libavcodec/vdpau.h" @@ -111,6 +112,8 @@ static VdpVideoMixerCreate *vdp_video_mixer_create; static VdpVideoMixerDestroy *vdp_video_mixer_destroy; static VdpVideoMixerRender *vdp_video_mixer_render; +static VdpVideoMixerSetFeatureEnables *vdp_video_mixer_set_feature_enables; +static VdpVideoMixerSetAttributeValues *vdp_video_mixer_set_attribute_values; static VdpPresentationQueueTargetDestroy *vdp_presentation_queue_target_destroy; static VdpPresentationQueueCreate *vdp_presentation_queue_create; @@ -132,6 +135,10 @@ static int output_surface_width, output_surface_height; static VdpVideoMixer video_mixer; +static int deint; +static int pullup; +static float denoise; +static float sharpen; static VdpDecoder decoder; static int decoder_max_refs; @@ -254,6 +261,10 @@ {VDP_FUNC_ID_VIDEO_MIXER_CREATE, &vdp_video_mixer_create}, {VDP_FUNC_ID_VIDEO_MIXER_DESTROY, &vdp_video_mixer_destroy}, {VDP_FUNC_ID_VIDEO_MIXER_RENDER, &vdp_video_mixer_render}, + {VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES, + &vdp_video_mixer_set_feature_enables}, + {VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES, + &vdp_video_mixer_set_attribute_values}, {VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY, &vdp_presentation_queue_target_destroy}, {VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, &vdp_presentation_queue_create}, @@ -310,7 +321,16 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) { #define VDP_NUM_MIXER_PARAMETER 3 +#define MAX_NUM_FEATURES 5 + int i; VdpStatus vdp_st; + int feature_count = 0; + VdpVideoMixerFeature features[MAX_NUM_FEATURES]; + VdpBool feature_enables[MAX_NUM_FEATURES]; + static const denoise_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL}; + const void * const denoise_value[] = {&denoise}; + static const sharpen_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL}; + const void * const sharpen_value[] = {&sharpen}; static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = { VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, @@ -321,13 +341,31 @@ &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_SPATIAL; + if (pullup) + features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE; + if (denoise) + features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION; + if (sharpen) + features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_SHARPNESS; - vdp_st = vdp_video_mixer_create(vdp_device, 0, 0, + vdp_st = vdp_video_mixer_create(vdp_device, feature_count, features, VDP_NUM_MIXER_PARAMETER, parameters, parameter_values, &video_mixer); CHECK_ST_ERROR("Error when calling vdp_video_mixer_create") + for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE; + if (feature_count) + vdp_video_mixer_set_feature_enables(video_mixer, feature_count, features, feature_enables); + if (denoise) + vdp_video_mixer_set_attribute_values(video_mixer, 1, denoise_attrib, denoise_value); + if (sharpen) + vdp_video_mixer_set_attribute_values(video_mixer, 1, sharpen_attrib, sharpen_value); + return 0; } @@ -711,15 +749,43 @@ dlclose(vdpau_lib_handle); } +static opt_t subopts[] = { + {"deint", OPT_ARG_INT, &deint, (opt_test_f)int_non_neg}, + {"pullup", OPT_ARG_BOOL, &pullup, NULL}, + {"denoise", OPT_ARG_FLOAT, &denoise, NULL}, + {"sharpen", OPT_ARG_FLOAT, &sharpen, NULL}, + {NULL} +}; + +static const char help_msg[] = + "\n-vo vdpau command line help:\n" + "Example: mplayer -vo vdpau:deint=2\n" + "\nOptions:\n" + " deint\n" + " 0: no deinterlacing\n" + " 1: temporal deinterlacing\n" + " 2: temporal-spatial deinterlacing\n" + " pullup\n" + " Try to apply inverse-telecine\n" + " denoise\n" + " Apply denoising, argument is strength from 0.0 to 1.0\n" + " sharpen\n" + " Apply sharpening or softening, argument is strength from -1.0 to 1.0\n" + ; + static int preinit(const char *arg) { int i; static const char *vdpaulibrary = "libvdpau.so.1"; static const char *vdpau_device_create = "vdp_device_create_x11"; - if (arg) { - mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Unknown subdevice: %s\n", arg); - return ENOSYS; + deint = 0; + pullup = 0; + denoise = 0; + sharpen = 0; + if (subopt_parse(arg, subopts) != 0) { + mp_msg(MSGT_VO, MSGL_FATAL, help_msg); + return -1; } vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY);