[Mesa-dev] [PATCH] st/vdpau: use bicubic filter for scaling
Nayan Deshmukh
nayan26deshmukh at gmail.com
Sat Jun 18 04:24:56 UTC 2016
Hi Christian,
Thanks for the review.
I don't understand the compositor code fully yet. How can I create a
unscaled image with it?
Regards,
Nayan.
On Fri, Jun 17, 2016 at 9:15 PM, Christian König <deathsimple at vodafone.de>
wrote:
> Really nice work. I now understand where your problem is with the scaled
> surface.
>
> Please see the further comments below.
>
>
> Am 16.06.2016 um 20:15 schrieb Nayan Deshmukh:
>
>> v2: fix a typo and add a newline to code
>>
>> Signed-off-by: Nayan Deshmukh <nayan26deshmukh at gmail.com>
>> ---
>> src/gallium/state_trackers/vdpau/mixer.c | 53
>> +++++++++++++++++++++---
>> src/gallium/state_trackers/vdpau/vdpau_private.h | 6 +++
>> 2 files changed, 54 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/vdpau/mixer.c
>> b/src/gallium/state_trackers/vdpau/mixer.c
>> index 65c3ce2..751c7e5 100644
>> --- a/src/gallium/state_trackers/vdpau/mixer.c
>> +++ b/src/gallium/state_trackers/vdpau/mixer.c
>> @@ -82,7 +82,6 @@ vlVdpVideoMixerCreate(VdpDevice device,
>> switch (features[i]) {
>> /* they are valid, but we doesn't support them */
>> case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:
>> - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:
>> @@ -110,6 +109,9 @@ vlVdpVideoMixerCreate(VdpDevice device,
>> vmixer->luma_key.supported = true;
>> break;
>> + case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> + vmixer->bicubic.supported = true;
>> + break;
>> default: goto no_params;
>> }
>> }
>> @@ -202,6 +204,11 @@ vlVdpVideoMixerDestroy(VdpVideoMixer mixer)
>> vl_matrix_filter_cleanup(vmixer->sharpness.filter);
>> FREE(vmixer->sharpness.filter);
>> }
>> +
>> + if (vmixer->bicubic.filter) {
>> + vl_bicubic_filter_cleanup(vmixer->bicubic.filter);
>> + FREE(vmixer->bicubic.filter);
>> + }
>> pipe_mutex_unlock(vmixer->device->mutex);
>> DeviceReference(&vmixer->device, NULL);
>> @@ -344,7 +351,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
>> }
>> vl_compositor_set_dst_clip(&vmixer->cstate,
>> RectToPipe(destination_rect, &clip));
>> - if (!vmixer->noise_reduction.filter && !vmixer->sharpness.filter)
>> + if (!vmixer->noise_reduction.filter && !vmixer->sharpness.filter &&
>> !vmixer->bicubic.filter)
>> vlVdpSave4DelayedRendering(vmixer->device, destination_surface,
>> &vmixer->cstate);
>> else {
>> vl_compositor_render(&vmixer->cstate, compositor, dst->surface,
>> &dst->dirty_area, true);
>> @@ -359,6 +366,10 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
>> if (vmixer->sharpness.filter)
>> vl_matrix_filter_render(vmixer->sharpness.filter,
>> dst->sampler_view, dst->surface);
>> +
>> + if (vmixer->bicubic.filter)
>> + vl_bicubic_filter_render(vmixer->bicubic.filter,
>> + dst->sampler_view, dst->surface);
>>
>
> What you do here is first using the compositor to merge and scale the
> surfaces and then apply bicubic filtering on the already scaled surface.
>
> That is rather suboptimal. It would be better to let the compositor create
> an unscaled image and then scale it using bicubic filtering.
>
> Regards,
> Christian.
>
>
> }
>> pipe_mutex_unlock(vmixer->device->mutex);
>> @@ -461,6 +472,28 @@
>> vlVdpVideoMixerUpdateSharpnessFilter(vlVdpVideoMixer *vmixer)
>> }
>> /**
>> + * Update the bicubic filter
>> + */
>> +static void
>> +vlVdpVideoMixerUpdateBicubicFilter(vlVdpVideoMixer *vmixer)
>> +{
>> + assert(vmixer);
>> +
>> + /* if present remove the old filter first */
>> + if (vmixer->bicubic.filter) {
>> + vl_bicubic_filter_cleanup(vmixer->bicubic.filter);
>> + FREE(vmixer->bicubic.filter);
>> + vmixer->bicubic.filter = NULL;
>> + }
>> + /* and create a new filter as needed */
>> + if (vmixer->bicubic.enabled) {
>> + vmixer->bicubic.filter = MALLOC(sizeof(struct vl_bicubic_filter));
>> + vl_bicubic_filter_init(vmixer->bicubic.filter,
>> vmixer->device->context,
>> + vmixer->video_width, vmixer->video_height);
>> + }
>> +}
>> +
>> +/**
>> * Retrieve whether features were requested at creation time.
>> */
>> VdpStatus
>> @@ -483,7 +516,6 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer,
>> switch (features[i]) {
>> /* they are valid, but we doesn't support them */
>> case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:
>> - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:
>> @@ -512,6 +544,10 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer,
>> feature_supports[i] = vmixer->luma_key.supported;
>> break;
>> + case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> + feature_supports[i] = vmixer->bicubic.supported;
>> + break;
>> +
>> default:
>> return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE;
>> }
>> @@ -544,7 +580,6 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,
>> switch (features[i]) {
>> /* they are valid, but we doesn't support them */
>> case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:
>> - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:
>> @@ -578,6 +613,11 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,
>> vmixer->luma_key.luma_min,
>> vmixer->luma_key.luma_max);
>> break;
>> + case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> + vmixer->bicubic.enabled = feature_enables[i];
>> + vlVdpVideoMixerUpdateBicubicFilter(vmixer);
>> + break;
>> +
>> default:
>> pipe_mutex_unlock(vmixer->device->mutex);
>> return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE;
>> @@ -612,7 +652,6 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer,
>> /* they are valid, but we doesn't support them */
>> case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL:
>> case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:
>> - case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:
>> case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:
>> @@ -636,6 +675,10 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer,
>> feature_enables[i] = vmixer->luma_key.enabled;
>> break;
>> + case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
>> + feature_enables[i] = vmixer->bicubic.enabled;
>> + break;
>> +
>> default:
>> return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE;
>> }
>> diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h
>> b/src/gallium/state_trackers/vdpau/vdpau_private.h
>> index 8673c6a..bcd4bb1 100644
>> --- a/src/gallium/state_trackers/vdpau/vdpau_private.h
>> +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
>> @@ -45,6 +45,7 @@
>> #include "os/os_thread.h"
>> #include "vl/vl_video_buffer.h"
>> +#include "vl/vl_bicubic_filter.h"
>> #include "vl/vl_compositor.h"
>> #include "vl/vl_csc.h"
>> #include "vl/vl_deint_filter.h"
>> @@ -373,6 +374,11 @@ typedef struct
>> } deint;
>> struct {
>> + bool supported, enabled;
>> + struct vl_bicubic_filter *filter;
>> + } bicubic;
>> +
>> + struct {
>> bool supported, enabled;
>> unsigned level;
>> struct vl_median_filter *filter;
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160618/7fae7ace/attachment.html>
More information about the mesa-dev
mailing list