[Mesa-dev] [PATCH 9/9] st/va: add motion adaptive deinterlacing

Emil Velikov emil.l.velikov at gmail.com
Fri Dec 18 07:04:34 PST 2015


On 16 December 2015 at 20:14, Christian K├Ânig <deathsimple at 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 ?

> +         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 ?

> +      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);

-Emil


More information about the mesa-dev mailing list