[Libva] [PATCH] VPP: add vebox motion compensation support on HSW

Xiang, Haihao haihao.xiang at intel.com
Mon Oct 7 19:28:47 PDT 2013


Pushed.

Thanks
Haihao


> Signed-off-by: Zhong Li <zhong.li at intel.com>
> ---
>  src/gen75_vpp_vebox.c |   15 ++++++++++-----
>  src/i965_drv_video.c  |   15 ++++++++++++---
>  2 files changed, 22 insertions(+), 8 deletions(-)
> 
> diff --git a/src/gen75_vpp_vebox.c b/src/gen75_vpp_vebox.c
> index a973ed4..b09dcc8 100644
> --- a/src/gen75_vpp_vebox.c
> +++ b/src/gen75_vpp_vebox.c
> @@ -133,6 +133,7 @@ void hsw_veb_dndi_table(VADriverContextP ctx, struct intel_vebox_context *proc_c
>      unsigned int* p_table ;
>      int progressive_dn = 1;
>      int dndi_top_first = 0;
> +    int motion_compensated_enable = 0;
>  
>      if (proc_ctx->filters_mask & VPP_DNDI_DI) {
>          VAProcFilterParameterBufferDeinterlacing *di_param =
> @@ -141,6 +142,7 @@ void hsw_veb_dndi_table(VADriverContextP ctx, struct intel_vebox_context *proc_c
>  
>          progressive_dn = 0;
>          dndi_top_first = !(di_param->flags & VA_DEINTERLACING_BOTTOM_FIELD_FIRST);
> +        motion_compensated_enable = (di_param->algorithm == VAProcDeinterlacingMotionCompensated);
>      }
>  
>      /*
> @@ -199,7 +201,7 @@ void hsw_veb_dndi_table(VADriverContextP ctx, struct intel_vebox_context *proc_c
>                      100<< 16  |  // FMD #2 vertical difference th
>                      0  << 14  |  // CAT th1
>                      2  << 8   |  // FMD tear threshold
> -                    0  << 7   |  // MCDI Enable, use motion compensated deinterlace algorithm
> +                    motion_compensated_enable  << 7   |  // MCDI Enable, use motion compensated deinterlace algorithm
>                      progressive_dn  << 6   |  // progressive DN
>                      0  << 4   |  // reserved
>                      dndi_top_first  << 3   |  // DN/DI Top First
> @@ -543,7 +545,8 @@ void hsw_veb_state_command(VADriverContextP ctx, struct intel_vebox_context *pro
>          if (di_param->algorithm == VAProcDeinterlacingBob)
>              is_first_frame = 1;
>  
> -        if (di_param->algorithm == VAProcDeinterlacingMotionAdaptive &&
> +        if ((di_param->algorithm == VAProcDeinterlacingMotionAdaptive ||
> +            di_param->algorithm == VAProcDeinterlacingMotionCompensated) &&
>              proc_ctx->frame_order != -1)
>              di_output_frames_flag = 0; /* Output both Current Frame and Previous Frame */
>      }
> @@ -871,7 +874,8 @@ hsw_veb_surface_reference(VADriverContextP ctx,
>                  (VAProcFilterParameterBufferDeinterlacing *)proc_ctx->filter_di;
>  
>              if (di_param && 
> -                di_param->algorithm == VAProcDeinterlacingMotionAdaptive) {
> +                (di_param->algorithm == VAProcDeinterlacingMotionAdaptive || 
> +                di_param->algorithm == VAProcDeinterlacingMotionCompensated)) {
>                  if ((proc_ctx->filters_mask & VPP_DNDI_DN) &&
>                      proc_ctx->frame_order == 0) { /* DNDI */
>                      tmp_store = proc_ctx->frame_store[FRAME_OUT_CURRENT_DN];
> @@ -885,7 +889,7 @@ hsw_veb_surface_reference(VADriverContextP ctx,
>                      if (!pipe ||
>                          !pipe->num_forward_references ||
>                          pipe->forward_references[0] == VA_INVALID_ID) {
> -                        WARN_ONCE("A forward temporal reference is needed for Motion adaptive deinterlacing !!!\n");
> +                        WARN_ONCE("A forward temporal reference is needed for Motion adaptive/compensated deinterlacing !!!\n");
>  
>                          return VA_STATUS_ERROR_INVALID_PARAMETER;
>                      }
> @@ -925,7 +929,8 @@ hsw_veb_surface_reference(VADriverContextP ctx,
>              (VAProcFilterParameterBufferDeinterlacing *)proc_ctx->filter_di;
>  
>          if (di_param && 
> -            di_param->algorithm == VAProcDeinterlacingMotionAdaptive) {
> +            (di_param->algorithm == VAProcDeinterlacingMotionAdaptive || 
> +            di_param->algorithm == VAProcDeinterlacingMotionCompensated)) {
>              if (proc_ctx->frame_order == -1) {
>                  proc_ctx->frame_store[FRAME_OUT_CURRENT].surface_id = VA_INVALID_ID;
>                  proc_ctx->frame_store[FRAME_OUT_CURRENT].is_internal_surface = 0;
> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
> index 13b8e09..ddd032c 100755
> --- a/src/i965_drv_video.c
> +++ b/src/i965_drv_video.c
> @@ -287,6 +287,7 @@ static struct hw_codec_info gen75_hw_codec_info = {
>      .has_accelerated_putimage = 1,
>      .has_tiled_surface = 1,
>      .has_di_motion_adptive = 1,
> +    .has_di_motion_compensated = 1,
>      .has_blending = 1,
>  
>      .num_filters = 4,
> @@ -4643,7 +4644,13 @@ VAStatus i965_QueryVideoProcFilterCaps(
>                  i++;
>                  cap++;
>              }
> -        }
> +
> +            if (i965->codec_info->has_di_motion_compensated) {
> +                cap->type = VAProcDeinterlacingMotionCompensated;
> +                i++;
> +                cap++;
> +            }
> +       }
>  
>          break;
>  
> @@ -4749,9 +4756,11 @@ VAStatus i965_QueryVideoProcPipelineCaps(
>              VAProcFilterParameterBufferDeinterlacing *deint = (VAProcFilterParameterBufferDeinterlacing *)base;
>  
>              assert(deint->algorithm == VAProcDeinterlacingBob ||
> -                   deint->algorithm == VAProcDeinterlacingMotionAdaptive);
> +                   deint->algorithm == VAProcDeinterlacingMotionAdaptive ||
> +                   deint->algorithm == VAProcDeinterlacingMotionCompensated);
>              
> -            if (deint->algorithm == VAProcDeinterlacingMotionAdaptive)
> +            if (deint->algorithm == VAProcDeinterlacingMotionAdaptive ||
> +                deint->algorithm == VAProcDeinterlacingMotionCompensated);
>                  pipeline_cap->num_forward_references++;
>          }
>      }




More information about the Libva mailing list