From ca956af446387f409f51160c1d2c674f70788bda Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Mon, 2 Dec 2013 21:17:26 +0100 Subject: gl_video: change internal API for hwdec mp_image download Previous API worked under the assumption that download_image is always called after map_image. In practice this is true, but it's better to have a much generic API that doesn't depend on the order in which the functions are called. --- video/out/gl_common.h | 3 ++- video/out/gl_hwdec_vda.c | 17 +++++++++-------- video/out/gl_video.c | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/video/out/gl_common.h b/video/out/gl_common.h index 64490b7098..f9d4685a6b 100644 --- a/video/out/gl_common.h +++ b/video/out/gl_common.h @@ -203,7 +203,8 @@ struct gl_hwdec_driver { // are not needed anymore. void (*unmap_image)(struct gl_hwdec *hw); // Return a mp_image downloaded from the GPU (optional) - struct mp_image *(*download_image)(struct gl_hwdec *hw); + struct mp_image *(*download_image)(struct gl_hwdec *hw, + struct mp_image *hw_image); void (*destroy)(struct gl_hwdec *hw); }; diff --git a/video/out/gl_hwdec_vda.c b/video/out/gl_hwdec_vda.c index 65615bac6b..945a57bb1c 100644 --- a/video/out/gl_hwdec_vda.c +++ b/video/out/gl_hwdec_vda.c @@ -102,14 +102,15 @@ static int map_image(struct gl_hwdec *hw, struct mp_image *hw_image, static void unmap_image(struct gl_hwdec *hw) { } -static struct mp_image *download_image(struct gl_hwdec *hw) +static struct mp_image *download_image(struct gl_hwdec *hw, + struct mp_image *hw_image) { - struct priv *p = hw->priv; - CVPixelBufferLockBaseAddress(p->pbuf, 0); - void *base = CVPixelBufferGetBaseAddress(p->pbuf); - size_t width = CVPixelBufferGetWidth(p->pbuf); - size_t height = CVPixelBufferGetHeight(p->pbuf); - size_t stride = CVPixelBufferGetBytesPerRow(p->pbuf); + CVPixelBufferRef pbuf = (CVPixelBufferRef)hw_image->planes[3]; + CVPixelBufferLockBaseAddress(pbuf, 0); + void *base = CVPixelBufferGetBaseAddress(pbuf); + size_t width = CVPixelBufferGetWidth(pbuf); + size_t height = CVPixelBufferGetHeight(pbuf); + size_t stride = CVPixelBufferGetBytesPerRow(pbuf); struct mp_image img = {0}; mp_image_setfmt(&img, IMGFMT_UYVY); @@ -118,7 +119,7 @@ static struct mp_image *download_image(struct gl_hwdec *hw) img.stride[0] = stride; struct mp_image *image = mp_image_new_copy(&img); - CVPixelBufferUnlockBaseAddress(p->pbuf, 0); + CVPixelBufferUnlockBaseAddress(pbuf, 0); return image; } diff --git a/video/out/gl_video.c b/video/out/gl_video.c index 2660dacf7a..b3728eef44 100644 --- a/video/out/gl_video.c +++ b/video/out/gl_video.c @@ -1700,7 +1700,8 @@ struct mp_image *gl_video_download_image(struct gl_video *p) return NULL; if (p->hwdec_active && p->hwdec->driver->download_image) { - struct mp_image *dlimage = p->hwdec->driver->download_image(p->hwdec); + struct mp_image *dlimage = + p->hwdec->driver->download_image(p->hwdec, vimg->hwimage); if (dlimage) mp_image_set_attributes(dlimage, &p->image_params); return dlimage; -- cgit v1.2.3