Am 18.12.2015 um 16:04 schrieb Emil Velikov:
On 16 December 2015 at 20:14, Christian König <deathsim...@vodafone.de> wrote:
@@ -174,6 +175,51 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv,
vlVaContext *context,
return VA_STATUS_SUCCESS;
}
+static struct pipe_video_buffer *
+vlVaApplyDeint(vlVaDriver *drv, vlVaContext *context,
+ VAProcPipelineParameterBuffer *param,
+ struct pipe_video_buffer *current,
+ unsigned field)
+{
+ vlVaSurface *prevprev, *prev, *next;
+
+ if (param->num_forward_references < 1 ||
+ param->num_backward_references < 2)
+ return current;
+
+ prevprev = handle_table_get(drv->htab, param->backward_references[1]);
+ prev = handle_table_get(drv->htab, param->backward_references[0]);
+ next = handle_table_get(drv->htab, param->forward_references[0]);
+
+ if (!prevprev || !prev || !next)
+ return current;
+
+ if (context->deint && (context->deint->video_width != current->width ||
+ context->deint->video_height != current->height)) {
+ vl_deint_filter_cleanup(context->deint);
+ FREE(context->deint);
+ context->deint = NULL;
+ }
+
+ if (!context->deint) {
+ context->deint = MALLOC(sizeof(struct vl_deint_filter));
+ if (!vl_deint_filter_init(context->deint, drv->pipe, current->width,
+ current->height, false, false)) {
Tear down the old one, if we succeed ?
Nope, if we don't succeed to create the new one we don't want to keep
the old one either.
E.g. we don't want a deinterlace for the incorrect resolution around.
+ FREE(context->deint);
+ context->deint = NULL;
+ return current;
+ }
+ }
+
+ if (!vl_deint_filter_check_buffers(context->deint, prevprev->buffer,
+ prev->buffer, current, next->buffer))
On failure, teardown the newly created deint ?
NAK, failure here is normal. For motion adaptive deinterlacing we fail
for the first few frames/fields until we have enough to actually do the
calculation.
+ return current;
+
+ vl_deint_filter_render(context->deint, prevprev->buffer, prev->buffer,
+ current, next->buffer, field);
+ return context->deint->video_buffer;
+}
+
VAStatus
vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext
*context, vlVaBuffer *buf)
{
@@ -222,6 +271,14 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver
*drv, vlVaContext *contex
deinterlace = VL_COMPOSITOR_WEAVE;
break;
+ case VAProcDeinterlacingMotionAdaptive:
+ if (deint->flags & VA_DEINTERLACING_BOTTOM_FIELD)
+ src = vlVaApplyDeint(drv, context, param, src, 1);
+ else
+ src = vlVaApplyDeint(drv, context, param, src, 0);
nit: one can also use
src = vlVaApplyDeint(drv, context, param, src,
deint->flags & VA_DEINTERLACING_BOTTOM_FIELD);
Fair enough, I fixed that one.
Any further comments or can I push this patch?
Regards,
Christian.
-Emil
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev