[Libva] [PATCH V2 4/6] Enable the output to XV only user set the render mode attribute to overlay.

Xiang, Haihao haihao.xiang at intel.com
Tue Sep 24 00:41:51 PDT 2013


On Thu, 2013-09-19 at 16:07 +0800, Ung, Teng En wrote: 
> Signed-off-by: Ung, Teng En <teng.en.ung at intel.com>
> ---
>  src/i965_drv_video.c | 11 +++++++++++
>  src/i965_output_xv.c | 46 +++++++++++++++++++++++++++++++++++++++-------
>  src/i965_output_xv.h |  4 ++++
>  3 files changed, 54 insertions(+), 7 deletions(-)
> 
> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
> index fb23c8d..d2b8456 100755
> --- a/src/i965_drv_video.c
> +++ b/src/i965_drv_video.c
> @@ -2532,6 +2532,17 @@ i965_SetDisplayAttributes(
>              src_attrib->value > dst_attrib->max_value)
>              return VA_STATUS_ERROR_INVALID_PARAMETER;
>  
> +#ifdef HAVE_X11_XV
> +        if (dst_attrib->type == VADisplayAttribRenderMode) {
> +            if ((src_attrib->value == VA_RENDER_MODE_LOCAL_OVERLAY)) {
> +                if (!i965_output_xv_enable(ctx))
> +                    return VA_STATUS_ERROR_OPERATION_FAILED; 
> +            } else {
> +                i965_output_xv_disable(ctx);
> +            } 
> +        }
> +#endif
> +
>          dst_attrib->value = src_attrib->value;
>          /* XXX: track modified attributes through timestamps */
>      }
> diff --git a/src/i965_output_xv.c b/src/i965_output_xv.c
> index 0138e99..d884ed1 100644
> --- a/src/i965_output_xv.c
> +++ b/src/i965_output_xv.c
> @@ -96,7 +96,6 @@ i965_output_xv_init(VADriverContextP ctx)
>  {
>      struct i965_driver_data * const i965 = i965_driver_data(ctx);
>      unsigned short major = 0, minor = 0;
> -    int port_id = 0;
>  
>      if (va_xvQueryVersion(ctx, &major, &minor) != VA_XV_STATUS_SUCCESS)
>          goto error;
> @@ -111,12 +110,6 @@ i965_output_xv_init(VADriverContextP ctx)
>          i965->xv_output->vaxv_format_index = -1;
>      }
>  
> -    if ((va_xvFindAndReservePort(ctx, &port_id) != VA_XV_STATUS_SUCCESS) && 
> -        (!port_id)) 
> -        goto error;
> -
> -    i965->xv_output->vaxv_port = port_id;
> -
>      return true;
>  
>  error :
> @@ -152,6 +145,45 @@ i965_output_xv_terminate(VADriverContextP ctx)
>      i965->xv_output = NULL;
>  }
>  
> +bool i965_output_xv_enable(VADriverContextP ctx)
> +{
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +    int port_id = 0;
> +
> +    /* If the port alreay grabed, just return true */
> +    if (i965->xv_output->vaxv_port)
> +        return true;
> +
> +    if ((va_xvFindAndReservePort(ctx, &port_id) != VA_XV_STATUS_SUCCESS) && 
> +        (!port_id)) 
> +        return false;
> +
> +    i965->xv_output->vaxv_port = port_id;
> +
> +    return true;
> +}
> +
> +void i965_output_xv_disable(VADriverContextP ctx)
> +{
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +    struct va_xv_output * const xv_output = i965->xv_output;
> +    int i = 0;
> +
> +    if (!xv_output)
> +        return;
> +
> +    if (xv_output->vaxv_port) {
> +        va_xvFreePort(ctx, xv_output->vaxv_port);
> +        xv_output->vaxv_port = 0;
> +    }
> +
> +    for (i = 0; i < (NUM_VAXV_BUF - 1); ++i) {
> +        if (xv_output->va_surf_id[i]) {

Check it against VA_INVALID_SURFACE too.

> +             i965_DestroyVAXVBuffer(ctx, xv_output, i);
> +        }
> +    }
> +}
> +
>  VAStatus
>  i965_put_surface_xv(
>      VADriverContextP    ctx,
> diff --git a/src/i965_output_xv.h b/src/i965_output_xv.h
> index 7d0cb91..0d39996 100644
> --- a/src/i965_output_xv.h
> +++ b/src/i965_output_xv.h
> @@ -46,4 +46,8 @@ i965_put_surface_xv(
>      unsigned int        flags
>  );
>  
> +bool i965_output_xv_enable(VADriverContextP ctx);
> +
> +void i965_output_xv_disable(VADriverContextP ctx);
> +
>  #endif /* I965_OUTPUT_XV_H */




More information about the Libva mailing list