We temporary buffers so that we don't read and write to the same surface at the same time.
Signed-off-by: Nayan Deshmukh <nayan26deshm...@gmail.com> --- src/gallium/state_trackers/vdpau/mixer.c | 54 ++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index 56b667d..ff6750f 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -239,9 +239,10 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, enum vl_compositor_deinterlace deinterlace; struct u_rect rect, clip, *prect, dirty_area; unsigned i, layer = 0; - struct pipe_video_buffer *video_buffer; + struct pipe_video_buffer *video_buffer, templ, *video_buffer_output, *video_buffer_temp = NULL; struct pipe_sampler_view *sampler_view, **sampler_views; struct pipe_surface *surface, **surfaces; + struct pipe_context *pipe; vlVdpVideoMixer *vmixer; vlVdpSurface *surf; @@ -325,19 +326,48 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, } } - surfaces = video_buffer->get_surfaces(video_buffer); - sampler_views = video_buffer->get_sampler_view_planes(video_buffer); + video_buffer_output = video_buffer; - for(i = 0; i < VL_MAX_SURFACES; ++i) { - if(sampler_views[i] != NULL && surfaces[i] != NULL) { - if (vmixer->noise_reduction.filter) + if (vmixer->noise_reduction.filter || vmixer->sharpness.filter) { + pipe = vmixer->device->context; + + memset(&templ, 0, sizeof(templ)); + templ.buffer_format = video_buffer->buffer_format; + templ.chroma_format = video_buffer->chroma_format; + templ.width = video_buffer->width; + templ.height = video_buffer->height; + templ.interlaced = video_buffer->interlaced; + + } + + if (vmixer->noise_reduction.filter) { + sampler_views = video_buffer->get_sampler_view_planes(video_buffer_output); + video_buffer_output = vl_video_buffer_create(pipe, &templ); + surfaces = video_buffer_output->get_surfaces(video_buffer_output); + + for(i = 0; i < VL_MAX_SURFACES; ++i) { + if(sampler_views[i] != NULL && surfaces[i] != NULL) vl_median_filter_render(vmixer->noise_reduction.filter, sampler_views[i], surfaces[i]); + } + } - if (vmixer->sharpness.filter) + if (vmixer->sharpness.filter) { + sampler_views = video_buffer_output->get_sampler_view_planes(video_buffer_output); + /* + * To keep a pointer to the buffer allocated + * if noise reduction is enabled so that it + * can be destroyed in the end + */ + if (video_buffer_output != video_buffer) + video_buffer_temp = video_buffer_output; + video_buffer_output = vl_video_buffer_create(pipe, &templ); + surfaces = video_buffer_output->get_surfaces(video_buffer_output); + + for (i = 0; i < VL_MAX_SURFACES; ++i) { + if (sampler_views[i] != NULL && surfaces[i] != NULL) vl_matrix_filter_render(vmixer->sharpness.filter, sampler_views[i], surfaces[i]); - } } @@ -349,7 +379,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, rect.y1 = surf->templat.height; prect = ▭ } - vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, video_buffer, prect, NULL, deinterlace); + vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, video_buffer_output, prect, NULL, deinterlace); if(vmixer->bicubic.filter) { struct pipe_context *pipe; @@ -421,6 +451,12 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, pipe_surface_reference(&surface, NULL); } } + + if(video_buffer_output != video_buffer) + video_buffer_output->destroy(video_buffer_output); + if(video_buffer_temp != NULL) + video_buffer_temp->destroy(video_buffer_temp); + pipe_mutex_unlock(vmixer->device->mutex); return VDP_STATUS_OK; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev