diff --git a/va/va.c b/va/va.c index 4f06a34fc..06e989e0f 100644 --- a/va/va.c +++ b/va/va.c @@ -2286,3 +2286,23 @@ vaQueryVideoProcPipelineCaps( VA_TRACE_RET(dpy, status); return status; } + +VAStatus +vaCopy( + VADisplay dpy, + VACopyObject *dst, + VACopyObject *src, + VACopyOption option +) +{ + VAStatus va_status; + VADriverContextP ctx; + CHECK_DISPLAY(dpy); + ctx = CTX(dpy); + + if(ctx->vtable->vaCopy == NULL) + va_status = VA_STATUS_ERROR_UNIMPLEMENTED; + else + va_status = ctx->vtable->vaCopy( ctx, dst, src, option); + return va_status; +} diff --git a/va/va.h b/va/va.h index f3202dc32..9ed954a84 100644 --- a/va/va.h +++ b/va/va.h @@ -4730,6 +4730,56 @@ typedef struct _VAPictureHEVC */ #define VA_PICTURE_HEVC_RPS_LT_CURR 0x00000040 +typedef enum{ + VACopyObjectSurface = 0, + VACopyObjectBuffer = 1, +} VACopyObjectType; + +typedef struct _VACopyObject { + VACopyObjectType obj_type; // type of object. + union + { + VASurfaceID surface_id; + VABufferID buffer_id; + } object; + + uint32_t va_reserved[VA_PADDING_MEDIA]; +} VACopyObject; + +#define VA_COPY_SYNC_BLOCK 0x0 +#define VA_COPY_SYNC_NONBLOCK 0x1 + +#define VA_COPY_MODE_BALANCE 0x0 +#define VA_COPY_MODE_PERF 0x1 +#define VA_COPY_MODE_POWER_SAVING 0x2 + +typedef union _VACopyOption{ + struct { + /** \brief va copy synchronization, the value should be VA_COPY_SYNC_XXX + * if it equal VA_COPY_SYNC_NONBLOCK , sync handle should be retrieved. + */ + uint32_t va_copy_sync : 2; + /** \brief va copy mode, the value should be VA_COPY_MODE_XXX */ + uint32_t va_copy_mode : 4; + uint32_t reserved :26; + }bits; + uint32_t value; +}VACopyOption; + +/** \brief Copies an object. + * + * Copies specified object (surface or buffer). If non-blocking copy + * is requested (VA_COPY_NONBLOCK), then need vaSyncBuffer or vaSyncSurface/vaSyncSurface2 + * to sync the destination object. + * + * @param[in] dpy the VA display + * @param[in] dst Destination object to copy to + * @param[in] src Source object to copy from + * @param[in] option VA copy option + * @return VA_STATUS_SUCCESS if successful + */ +VAStatus vaCopy(VADisplay dpy, VACopyObject * dst, VACopyObject * src, VACopyOption option); + #include #include #include diff --git a/va/va_backend.h b/va/va_backend.h index 5ab8f6abb..abac41828 100644 --- a/va/va_backend.h +++ b/va/va_backend.h @@ -484,7 +484,6 @@ struct VADriverVTable uint32_t flags, /* in */ void *descriptor /* out */ ); - VAStatus (*vaSyncSurface2) ( VADriverContextP ctx, VASurfaceID surface, @@ -497,8 +496,15 @@ struct VADriverVTable uint64_t timeout_ns ); + VAStatus + (*vaCopy)( + VADriverContextP ctx, /* in */ + VACopyObject *dst, /* in */ + VACopyObject *src, /* in */ + VACopyOption option /* in */ + ); /** \brief Reserved bytes for future use, must be zero */ - unsigned long reserved[55]; + unsigned long reserved[54]; }; struct VADriverContext