<div dir="ltr">Hi Christian,<div><br></div><div>Thanks for the review.</div><div><br></div><div>I don't understand the compositor code fully yet. How can I create a unscaled image with it?</div><div><br></div><div>Regards,</div><div>Nayan.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 17, 2016 at 9:15 PM, Christian König <span dir="ltr"><<a href="mailto:deathsimple@vodafone.de" target="_blank">deathsimple@vodafone.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Really nice work. I now understand where your problem is with the scaled surface.<br>
<br>
Please see the further comments below.<div><div class="h5"><br>
<br>
Am 16.06.2016 um 20:15 schrieb Nayan Deshmukh:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
v2: fix a typo and add a newline to code<br>
<br>
Signed-off-by: Nayan Deshmukh <<a href="mailto:nayan26deshmukh@gmail.com" target="_blank">nayan26deshmukh@gmail.com</a>><br>
---<br>
src/gallium/state_trackers/vdpau/mixer.c | 53 +++++++++++++++++++++---<br>
src/gallium/state_trackers/vdpau/vdpau_private.h | 6 +++<br>
2 files changed, 54 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c<br>
index 65c3ce2..751c7e5 100644<br>
--- a/src/gallium/state_trackers/vdpau/mixer.c<br>
+++ b/src/gallium/state_trackers/vdpau/mixer.c<br>
@@ -82,7 +82,6 @@ vlVdpVideoMixerCreate(VdpDevice device,<br>
switch (features[i]) {<br>
/* they are valid, but we doesn't support them */<br>
case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:<br>
- case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:<br>
@@ -110,6 +109,9 @@ vlVdpVideoMixerCreate(VdpDevice device,<br>
vmixer->luma_key.supported = true;<br>
break;<br>
+ case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
+ vmixer->bicubic.supported = true;<br>
+ break;<br>
default: goto no_params;<br>
}<br>
}<br>
@@ -202,6 +204,11 @@ vlVdpVideoMixerDestroy(VdpVideoMixer mixer)<br>
vl_matrix_filter_cleanup(vmixer->sharpness.filter);<br>
FREE(vmixer->sharpness.filter);<br>
}<br>
+<br>
+ if (vmixer->bicubic.filter) {<br>
+ vl_bicubic_filter_cleanup(vmixer->bicubic.filter);<br>
+ FREE(vmixer->bicubic.filter);<br>
+ }<br>
pipe_mutex_unlock(vmixer->device->mutex);<br>
DeviceReference(&vmixer->device, NULL);<br>
@@ -344,7 +351,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,<br>
}<br>
vl_compositor_set_dst_clip(&vmixer->cstate, RectToPipe(destination_rect, &clip));<br>
- if (!vmixer->noise_reduction.filter && !vmixer->sharpness.filter)<br>
+ if (!vmixer->noise_reduction.filter && !vmixer->sharpness.filter && !vmixer->bicubic.filter)<br>
vlVdpSave4DelayedRendering(vmixer->device, destination_surface, &vmixer->cstate);<br>
else {<br>
vl_compositor_render(&vmixer->cstate, compositor, dst->surface, &dst->dirty_area, true);<br>
@@ -359,6 +366,10 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,<br>
if (vmixer->sharpness.filter)<br>
vl_matrix_filter_render(vmixer->sharpness.filter,<br>
dst->sampler_view, dst->surface);<br>
+<br>
+ if (vmixer->bicubic.filter)<br>
+ vl_bicubic_filter_render(vmixer->bicubic.filter,<br>
+ dst->sampler_view, dst->surface);<br>
</blockquote>
<br></div></div>
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.<br>
<br>
That is rather suboptimal. It would be better to let the compositor create an unscaled image and then scale it using bicubic filtering.<br>
<br>
Regards,<br>
Christian.<div class="HOEnZb"><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
}<br>
pipe_mutex_unlock(vmixer->device->mutex);<br>
@@ -461,6 +472,28 @@ vlVdpVideoMixerUpdateSharpnessFilter(vlVdpVideoMixer *vmixer)<br>
}<br>
/**<br>
+ * Update the bicubic filter<br>
+ */<br>
+static void<br>
+vlVdpVideoMixerUpdateBicubicFilter(vlVdpVideoMixer *vmixer)<br>
+{<br>
+ assert(vmixer);<br>
+<br>
+ /* if present remove the old filter first */<br>
+ if (vmixer->bicubic.filter) {<br>
+ vl_bicubic_filter_cleanup(vmixer->bicubic.filter);<br>
+ FREE(vmixer->bicubic.filter);<br>
+ vmixer->bicubic.filter = NULL;<br>
+ }<br>
+ /* and create a new filter as needed */<br>
+ if (vmixer->bicubic.enabled) {<br>
+ vmixer->bicubic.filter = MALLOC(sizeof(struct vl_bicubic_filter));<br>
+ vl_bicubic_filter_init(vmixer->bicubic.filter, vmixer->device->context,<br>
+ vmixer->video_width, vmixer->video_height);<br>
+ }<br>
+}<br>
+<br>
+/**<br>
* Retrieve whether features were requested at creation time.<br>
*/<br>
VdpStatus<br>
@@ -483,7 +516,6 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer,<br>
switch (features[i]) {<br>
/* they are valid, but we doesn't support them */<br>
case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:<br>
- case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:<br>
@@ -512,6 +544,10 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer,<br>
feature_supports[i] = vmixer->luma_key.supported;<br>
break;<br>
+ case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
+ feature_supports[i] = vmixer->bicubic.supported;<br>
+ break;<br>
+<br>
default:<br>
return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE;<br>
}<br>
@@ -544,7 +580,6 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,<br>
switch (features[i]) {<br>
/* they are valid, but we doesn't support them */<br>
case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:<br>
- case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:<br>
@@ -578,6 +613,11 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,<br>
vmixer->luma_key.luma_min, vmixer->luma_key.luma_max);<br>
break;<br>
+ case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
+ vmixer->bicubic.enabled = feature_enables[i];<br>
+ vlVdpVideoMixerUpdateBicubicFilter(vmixer);<br>
+ break;<br>
+<br>
default:<br>
pipe_mutex_unlock(vmixer->device->mutex);<br>
return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE;<br>
@@ -612,7 +652,6 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer,<br>
/* they are valid, but we doesn't support them */<br>
case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL:<br>
case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL:<br>
- case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3:<br>
case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4:<br>
@@ -636,6 +675,10 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer,<br>
feature_enables[i] = vmixer->luma_key.enabled;<br>
break;<br>
+ case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:<br>
+ feature_enables[i] = vmixer->bicubic.enabled;<br>
+ break;<br>
+<br>
default:<br>
return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE;<br>
}<br>
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h<br>
index 8673c6a..bcd4bb1 100644<br>
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h<br>
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h<br>
@@ -45,6 +45,7 @@<br>
#include "os/os_thread.h"<br>
#include "vl/vl_video_buffer.h"<br>
+#include "vl/vl_bicubic_filter.h"<br>
#include "vl/vl_compositor.h"<br>
#include "vl/vl_csc.h"<br>
#include "vl/vl_deint_filter.h"<br>
@@ -373,6 +374,11 @@ typedef struct<br>
} deint;<br>
struct {<br>
+ bool supported, enabled;<br>
+ struct vl_bicubic_filter *filter;<br>
+ } bicubic;<br>
+<br>
+ struct {<br>
bool supported, enabled;<br>
unsigned level;<br>
struct vl_median_filter *filter;<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div>