summaryrefslogtreecommitdiffstats
path: root/video/out/gl_common.h
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-11-04 00:00:18 +0100
committerwm4 <wm4@nowhere>2013-11-04 00:11:07 +0100
commit571e697a7c557d10bcc9130915c431829981d877 (patch)
tree027490a8aca629a9c3d321556b5bc6da5159d844 /video/out/gl_common.h
parent6f17410f88fd3765b6598b4e706b1d03ee85efe8 (diff)
downloadmpv-571e697a7c557d10bcc9130915c431829981d877.tar.bz2
mpv-571e697a7c557d10bcc9130915c431829981d877.tar.xz
vo_opengl: add infrastructure for hardware decoding OpenGL interop
Most hardware decoding APIs provide some OpenGL interop. This allows using vo_opengl, without having to read the video data back from GPU. This requires adding a backend for each hardware decoding API. (Each backend is an entry in gl_hwdec_vaglx[].) The backends expose video data as a set of OpenGL textures. Add infrastructure to support this. The next commit will add support for VA-API.
Diffstat (limited to 'video/out/gl_common.h')
-rw-r--r--video/out/gl_common.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/video/out/gl_common.h b/video/out/gl_common.h
index ecff698ac8..d8d07de06a 100644
--- a/video/out/gl_common.h
+++ b/video/out/gl_common.h
@@ -164,6 +164,44 @@ void mpgl_set_backend_w32(MPGLContext *ctx);
void mpgl_set_backend_x11(MPGLContext *ctx);
void mpgl_set_backend_wayland(MPGLContext *ctx);
+struct mp_hwdec_info;
+
+struct gl_hwdec {
+ const struct gl_hwdec_driver *driver;
+ struct mp_log *log;
+ struct MPGLContext *mpgl;
+ struct mp_hwdec_info *info;
+ // For free use by hwdec driver
+ void *priv;
+ // hwdec backends must set this to an IMGFMT_ that has an equivalent
+ // internal representation in gl_video.c as the hardware texture.
+ // It's used to build the rendering chain, and also as screenshot format.
+ int converted_imgfmt;
+};
+
+struct gl_hwdec_driver {
+ // Same name as used by mp_hwdec_info->load_api()
+ const char *api_name;
+ // Test whether the given IMGFMT_ is supported.
+ bool (*query_format)(int imgfmt);
+ // Create the hwdec device. It must fill in hw->info, if applicable.
+ int (*create)(struct gl_hwdec *hw);
+ // Prepare for rendering video. (E.g. create textures.)
+ // Called on initialization, and every time the video size changes.
+ int (*reinit)(struct gl_hwdec *hw, int w, int h);
+ // Return textures that contain the given hw_image.
+ // Note that the caller keeps a reference to hw_image until unbind_image
+ // is called, so the callee doesn't need to do that.
+ int (*load_image)(struct gl_hwdec *hw, struct mp_image *hw_image,
+ GLuint *out_textures);
+ // Undo load_image(). The user of load_image() calls this when the textures
+ // are not needed anymore.
+ void (*unload_image)(struct gl_hwdec *hw);
+ void (*destroy)(struct gl_hwdec *hw);
+};
+
+extern const struct gl_hwdec_driver *mpgl_hwdec_drivers[];
+
void *mp_getdladdr(const char *s);
void mpgl_load_functions(GL *gl, void *(*getProcAddress)(const GLubyte *),