st/va: Fix forward/backward referencing for deinterlacing
authorMark Thompson <sw@jkqxz.net>
Wed, 1 Mar 2017 20:07:09 +0000 (20:07 +0000)
committerChristian König <christian.koenig@amd.com>
Mon, 6 Mar 2017 13:05:05 +0000 (14:05 +0100)
The VAAPI documentation is not very clear here, but the intent
appears to be that a forward reference is forward from a frame in the
past, not forward to a frame in the future (that is, forward as in
forward prediction, not as in a forward reference in source code).
This interpretation is derived from other implementations, in
particular the i965 driver and the gstreamer client.

In order to match those other implementations, this patch swaps the
meaning of forward and backward references as they currently appear
for motion-adaptive deinterlacing.

Signed-off-by: Mark Thompson <sw@jkqxz.net>
Reviewed-by: Christian König <christian.koenig@amd.com>
src/gallium/state_trackers/va/postproc.c
src/gallium/state_trackers/va/surface.c

index 01e240f0167e7d57df524f78f4800397ea762736..fbec69aec35e84a8a3005dccde4ee5d633860f04 100644 (file)
@@ -184,13 +184,13 @@ vlVaApplyDeint(vlVaDriver *drv, vlVaContext *context,
 {
    vlVaSurface *prevprev, *prev, *next;
 
-   if (param->num_forward_references < 1 ||
-       param->num_backward_references < 2)
+   if (param->num_forward_references < 2 ||
+       param->num_backward_references < 1)
       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]);
+   prevprev = handle_table_get(drv->htab, param->forward_references[1]);
+   prev = handle_table_get(drv->htab, param->forward_references[0]);
+   next = handle_table_get(drv->htab, param->backward_references[0]);
 
    if (!prevprev || !prev || !next)
       return current;
index 0e1dbe0b109611189341a4525cffeee1341d84a6..b129e6c74f42e23208b688ec49c2964523ed58b9 100644 (file)
@@ -845,8 +845,8 @@ vlVaQueryVideoProcPipelineCaps(VADriverContextP ctx, VAContextID context,
       case VAProcFilterDeinterlacing: {
          VAProcFilterParameterBufferDeinterlacing *deint = buf->data;
          if (deint->algorithm == VAProcDeinterlacingMotionAdaptive) {
-            pipeline_cap->num_forward_references = 1;
-            pipeline_cap->num_backward_references = 2;
+            pipeline_cap->num_forward_references = 2;
+            pipeline_cap->num_backward_references = 1;
          }
          break;
       }