summaryrefslogtreecommitdiffstats
path: root/video/out/opengl/hwdec.c
diff options
context:
space:
mode:
authorMartin Herkt <lachs0r@srsfckn.biz>2017-02-12 01:01:56 +0100
committerMartin Herkt <lachs0r@srsfckn.biz>2017-02-12 01:01:56 +0100
commit35aa705c3ece8293652ffcf449c71fe80b96e722 (patch)
tree7c0fb34ec96204cbcd867a973b2476689919a5b4 /video/out/opengl/hwdec.c
parent10a005df0c981050afc35184a42173bea7ea2527 (diff)
parent3739d1318fdb658bb6037bfe06bb6cefb3b50a09 (diff)
downloadmpv-35aa705c3ece8293652ffcf449c71fe80b96e722.tar.bz2
mpv-35aa705c3ece8293652ffcf449c71fe80b96e722.tar.xz
Merge branch 'master' into release/current
Diffstat (limited to 'video/out/opengl/hwdec.c')
-rw-r--r--video/out/opengl/hwdec.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/video/out/opengl/hwdec.c b/video/out/opengl/hwdec.c
index 261931a8d4..ab365df8ff 100644
--- a/video/out/opengl/hwdec.c
+++ b/video/out/opengl/hwdec.c
@@ -22,6 +22,7 @@
#include "common/common.h"
#include "common/msg.h"
+#include "options/m_config.h"
#include "hwdec.h"
extern const struct gl_hwdec_driver gl_hwdec_vaegl;
@@ -110,6 +111,68 @@ struct gl_hwdec *gl_hwdec_load_api(struct mp_log *log, GL *gl,
return NULL;
}
+// Load by option name.
+struct gl_hwdec *gl_hwdec_load(struct mp_log *log, GL *gl,
+ struct mpv_global *g,
+ struct mp_hwdec_devices *devs,
+ const char *name)
+{
+ int g_hwdec_api;
+ mp_read_option_raw(g, "hwdec", &m_option_type_choice, &g_hwdec_api);
+ if (!name || !name[0])
+ name = m_opt_choice_str(mp_hwdec_names, g_hwdec_api);
+
+ int api_id = HWDEC_NONE;
+ for (int n = 0; mp_hwdec_names[n].name; n++) {
+ if (name && strcmp(mp_hwdec_names[n].name, name) == 0)
+ api_id = mp_hwdec_names[n].value;
+ }
+
+ for (int n = 0; mpgl_hwdec_drivers[n]; n++) {
+ const struct gl_hwdec_driver *drv = mpgl_hwdec_drivers[n];
+ if (name && strcmp(drv->name, name) == 0) {
+ struct gl_hwdec *r = load_hwdec_driver(log, gl, g, devs, drv, false);
+ if (r)
+ return r;
+ }
+ }
+
+ return gl_hwdec_load_api(log, gl, g, devs, api_id);
+}
+
+int gl_hwdec_validate_opt(struct mp_log *log, const m_option_t *opt,
+ struct bstr name, struct bstr param)
+{
+ bool help = bstr_equals0(param, "help");
+ if (help)
+ mp_info(log, "Available hwdecs:\n");
+ for (int n = 0; mpgl_hwdec_drivers[n]; n++) {
+ const struct gl_hwdec_driver *drv = mpgl_hwdec_drivers[n];
+ const char *api_name = m_opt_choice_str(mp_hwdec_names, drv->api);
+ if (help) {
+ mp_info(log, " %s [%s]\n", drv->name, api_name);
+ } else if (bstr_equals0(param, drv->name) ||
+ bstr_equals0(param, api_name))
+ {
+ return 1;
+ }
+ }
+ if (help) {
+ mp_info(log, " auto (loads best)\n"
+ " (other --hwdec values)\n"
+ "Setting an empty string means use --hwdec.\n");
+ return M_OPT_EXIT;
+ }
+ if (!param.len)
+ return 1; // "" is treated specially
+ for (int n = 0; mp_hwdec_names[n].name; n++) {
+ if (bstr_equals0(param, mp_hwdec_names[n].name))
+ return 1;
+ }
+ mp_fatal(log, "No hwdec backend named '%.*s' found!\n", BSTR_P(param));
+ return M_OPT_INVALID;
+}
+
void gl_hwdec_uninit(struct gl_hwdec *hwdec)
{
if (hwdec)