diff options
author | 2013-12-02 21:17:26 +0100 | |
---|---|---|
committer | 2013-12-02 21:26:17 +0100 | |
commit | ca956af446387f409f51160c1d2c674f70788bda (patch) | |
tree | f902d17aaf883211d58c24b1a050a5a7eaaa9c08 | |
parent | 14d92a4685417610e63307926a799cd5c43b1940 (diff) |
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.
-rw-r--r-- | video/out/gl_common.h | 3 | ||||
-rw-r--r-- | video/out/gl_hwdec_vda.c | 17 | ||||
-rw-r--r-- | 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; |