mirror of https://github.com/mpv-player/mpv
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.
This commit is contained in:
parent
14d92a4685
commit
ca956af446
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue