summaryrefslogtreecommitdiffstats
path: root/video/vaapi.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-03-17 18:22:35 +0100
committerwm4 <wm4@nowhere>2014-03-17 18:22:35 +0100
commit49d13f76ca727488de8622a8d176b5f71853bc61 (patch)
tree03a8a9f3ae0d2372075f563ad4220fc571f81e38 /video/vaapi.c
parent31fc5e85636f8e7b3bec5f133cb82b78e3c86ddb (diff)
downloadmpv-49d13f76ca727488de8622a8d176b5f71853bc61.tar.bz2
mpv-49d13f76ca727488de8622a8d176b5f71853bc61.tar.xz
vaapi: make struct va_surface private
It's not really needed to be public. Other code can just use mp_image. The only disadvantage is that the other code needs to call an accessor to get the VASurfaceID.
Diffstat (limited to 'video/vaapi.c')
-rw-r--r--video/vaapi.c86
1 files changed, 44 insertions, 42 deletions
diff --git a/video/vaapi.c b/video/vaapi.c
index edb16ffd48..1574f3bab9 100644
--- a/video/vaapi.c
+++ b/video/vaapi.c
@@ -159,6 +159,13 @@ VAImageFormat *va_image_format_from_imgfmt(const struct va_image_formats *format
return NULL;
}
+struct va_surface {
+ VASurfaceID id; // VA_INVALID_ID if unallocated
+ int w, h, rt_format; // parameters of allocated image (0/0/-1 unallocated)
+
+ struct va_surface_priv *p;
+};
+
typedef struct va_surface_priv {
struct mp_vaapi_ctx *ctx;
VADisplay display;
@@ -166,6 +173,24 @@ typedef struct va_surface_priv {
bool is_derived; // is image derived by vaDeriveImage()?
} va_surface_priv_t;
+VASurfaceID va_surface_id(struct mp_image *mpi)
+{
+ return mpi && mpi->imgfmt == IMGFMT_VAAPI ?
+ (VASurfaceID)(uintptr_t)mpi->planes[3] : VA_INVALID_ID;
+}
+
+static struct va_surface *va_surface_in_mp_image(struct mp_image *mpi)
+{
+ return mpi && mpi->imgfmt == IMGFMT_VAAPI ?
+ (struct va_surface*)mpi->planes[0] : NULL;
+}
+
+int va_surface_rt_format(struct mp_image *mpi)
+{
+ struct va_surface *surface = va_surface_in_mp_image(mpi);
+ return surface ? surface->rt_format : 0;
+}
+
static void va_surface_destroy(struct va_surface *surface)
{
if (!surface)
@@ -262,7 +287,7 @@ static VAImage *va_surface_image_alloc(struct va_surface *surface,
// img must be a VAAPI surface; make sure its internal VAImage is allocated
// to a format corresponding to imgfmt (or return an error).
-int va_surface_image_alloc_imgfmt(struct mp_image *img, int imgfmt)
+int va_surface_alloc_imgfmt(struct mp_image *img, int imgfmt)
{
struct va_surface *surface = va_surface_in_mp_image(img);
if (!surface)
@@ -276,23 +301,6 @@ int va_surface_image_alloc_imgfmt(struct mp_image *img, int imgfmt)
return 0;
}
-VASurfaceID va_surface_id_in_mp_image(const struct mp_image *mpi)
-{
- return mpi && mpi->imgfmt == IMGFMT_VAAPI ?
- (VASurfaceID)(uintptr_t)mpi->planes[3] : VA_INVALID_ID;
-}
-
-struct va_surface *va_surface_in_mp_image(struct mp_image *mpi)
-{
- return mpi && mpi->imgfmt == IMGFMT_VAAPI ?
- (struct va_surface*)mpi->planes[0] : NULL;
-}
-
-VASurfaceID va_surface_id(const struct va_surface *surface)
-{
- return surface ? surface->id : VA_INVALID_ID;
-}
-
bool va_image_map(struct mp_vaapi_ctx *ctx, VAImage *image, struct mp_image *mpi)
{
int imgfmt = va_fourcc_to_imgfmt(image->format.fourcc);
@@ -326,44 +334,37 @@ bool va_image_unmap(struct mp_vaapi_ctx *ctx, VAImage *image)
return CHECK_VA_STATUS(ctx, "vaUnmapBuffer()");
}
-bool va_surface_upload(struct va_surface *surface, struct mp_image *mpi)
+// va_dst: copy destination, must be IMGFMT_VAAPI
+// sw_src: copy source, must be a software surface
+int va_surface_upload(struct mp_image *va_dst, struct mp_image *sw_src)
{
+ struct va_surface *surface = va_surface_in_mp_image(va_dst);
+ if (!surface)
+ return -1;
va_surface_priv_t *p = surface->p;
VAImageFormat *format =
- va_image_format_from_imgfmt(p->ctx->image_formats, mpi->imgfmt);
+ va_image_format_from_imgfmt(p->ctx->image_formats, sw_src->imgfmt);
if (!format)
- return false;
+ return -1;
if (!va_surface_image_alloc(surface, format))
- return false;
+ return -1;
struct mp_image img;
if (!va_image_map(p->ctx, &p->image, &img))
- return false;
- mp_image_copy(&img, mpi);
+ return -1;
+ mp_image_copy(&img, sw_src);
va_image_unmap(p->ctx, &p->image);
if (!p->is_derived) {
VAStatus status = vaPutImage2(p->display, surface->id,
p->image.image_id,
- 0, 0, mpi->w, mpi->h,
- 0, 0, mpi->w, mpi->h);
+ 0, 0, sw_src->w, sw_src->h,
+ 0, 0, sw_src->w, sw_src->h);
if (!CHECK_VA_STATUS(p->ctx, "vaPutImage()"))
- return false;
+ return -1;
}
- return true;
-}
-
-// va_dst: copy destination, must be IMGFMT_VAAPI
-// sw_src: copy source, must be a software surface
-int va_surface_upload_image(struct mp_image *va_dst, struct mp_image *sw_src)
-{
- struct va_surface *surface = va_surface_in_mp_image(va_dst);
- if (!surface)
- return -1;
- if (!va_surface_upload(surface, sw_src))
- return -1;
return 0;
}
@@ -402,11 +403,12 @@ static struct mp_image *try_download(struct va_surface *surface,
}
// pool is optional (used for allocating returned images).
-// Note: unlike va_surface_upload(), this will attempt to (re)create the
-// VAImage stored with the va_surface.
-struct mp_image *va_surface_download(struct va_surface *surface,
+struct mp_image *va_surface_download(struct mp_image *src,
struct mp_image_pool *pool)
{
+ struct va_surface *surface = va_surface_in_mp_image(src);
+ if (!surface)
+ return NULL;
struct mp_vaapi_ctx *ctx = surface->p->ctx;
VAStatus status = vaSyncSurface(surface->p->display, surface->id);
if (!CHECK_VA_STATUS(ctx, "vaSyncSurface()"))