mirror of https://github.com/mpv-player/mpv
vo_opengl_old: use new option API
This commit is contained in:
parent
5e0ee41617
commit
1ff35c3a20
|
@ -876,6 +876,14 @@ int mpgl_find_backend(const char *name)
|
|||
return -2;
|
||||
}
|
||||
|
||||
int mpgl_validate_backend_opt(const struct m_option *opt, struct bstr name,
|
||||
struct bstr param)
|
||||
{
|
||||
char s[20];
|
||||
snprintf(s, sizeof(s), "%.*s", BSTR_P(param));
|
||||
return mpgl_find_backend(s) >= -1 ? 1 : M_OPT_INVALID;
|
||||
}
|
||||
|
||||
static MPGLContext *init_backend(struct vo *vo, MPGLSetBackendFn set_backend)
|
||||
{
|
||||
MPGLContext *ctx = talloc_ptrtype(NULL, ctx);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include "config.h"
|
||||
#include "core/mp_msg.h"
|
||||
#include "core/bstr.h"
|
||||
|
||||
#include "vo.h"
|
||||
#include "video/csputils.h"
|
||||
|
@ -154,6 +155,10 @@ bool mpgl_config_window(struct MPGLContext *ctx, int gl_caps, uint32_t d_width,
|
|||
|
||||
int mpgl_find_backend(const char *name);
|
||||
|
||||
struct m_option;
|
||||
int mpgl_validate_backend_opt(const struct m_option *opt, struct bstr name,
|
||||
struct bstr param);
|
||||
|
||||
void mpgl_set_backend_cocoa(MPGLContext *ctx);
|
||||
void mpgl_set_backend_w32(MPGLContext *ctx);
|
||||
void mpgl_set_backend_x11(MPGLContext *ctx);
|
||||
|
|
|
@ -343,20 +343,12 @@ err_out:
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int validate_backend_opt(const m_option_t *opt, struct bstr name,
|
||||
struct bstr param)
|
||||
{
|
||||
char s[20];
|
||||
snprintf(s, sizeof(s), "%.*s", BSTR_P(param));
|
||||
return mpgl_find_backend(s) >= -1 ? 1 : M_OPT_INVALID;
|
||||
}
|
||||
|
||||
#define OPT_BASE_STRUCT struct gl_priv
|
||||
const struct m_option options[] = {
|
||||
OPT_FLAG("glfinish", use_glFinish, 0),
|
||||
OPT_INT("swapinterval", swap_interval, 0, OPTDEF_INT(1)),
|
||||
OPT_FLAG("debug", use_gl_debug, 0),
|
||||
OPT_STRING_VALIDATE("backend", backend, 0, validate_backend_opt),
|
||||
OPT_STRING_VALIDATE("backend", backend, 0, mpgl_validate_backend_opt),
|
||||
OPT_FLAG("sw", allow_sw, 0),
|
||||
|
||||
OPT_SUBSTRUCT("", renderer_opts, gl_video_conf, 0),
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include "config.h"
|
||||
#include "talloc.h"
|
||||
#include "core/mp_msg.h"
|
||||
#include "core/subopt-helper.h"
|
||||
#include "core/m_option.h"
|
||||
#include "vo.h"
|
||||
#include "video/vfcap.h"
|
||||
#include "video/mp_image.h"
|
||||
|
@ -97,6 +97,7 @@ struct gl_priv {
|
|||
int custom_trect;
|
||||
int mipmap_gen;
|
||||
int stereo_mode;
|
||||
char *backend_arg;
|
||||
|
||||
struct mp_csp_equalizer video_eq;
|
||||
|
||||
|
@ -109,7 +110,7 @@ struct gl_priv {
|
|||
struct mp_rect dst_rect; // video rectangle on output window
|
||||
struct mp_osd_res osd_res;
|
||||
|
||||
unsigned int slice_height;
|
||||
int slice_height;
|
||||
};
|
||||
|
||||
static int glFindFormat(uint32_t format, int have_texture_rg, int *bpp,
|
||||
|
@ -2071,176 +2072,22 @@ static void uninit(struct vo *vo)
|
|||
struct gl_priv *p = vo->priv;
|
||||
|
||||
uninitGl(vo);
|
||||
free(p->custom_prog);
|
||||
p->custom_prog = NULL;
|
||||
free(p->custom_tex);
|
||||
p->custom_tex = NULL;
|
||||
mpgl_uninit(p->glctx);
|
||||
p->glctx = NULL;
|
||||
p->gl = NULL;
|
||||
}
|
||||
|
||||
static int backend_valid(void *arg)
|
||||
{
|
||||
return mpgl_find_backend(*(const char **)arg) >= -1;
|
||||
}
|
||||
|
||||
static int preinit(struct vo *vo, const char *arg)
|
||||
{
|
||||
struct gl_priv *p = talloc_zero(vo, struct gl_priv);
|
||||
vo->priv = p;
|
||||
struct gl_priv *p = vo->priv;
|
||||
|
||||
*p = (struct gl_priv) {
|
||||
.many_fmts = 1,
|
||||
.use_yuv = -1,
|
||||
.colorspace = MP_CSP_DETAILS_DEFAULTS,
|
||||
.filter_strength = 0.5,
|
||||
.use_rectangle = -1,
|
||||
.ati_hack = -1,
|
||||
.force_pbo = -1,
|
||||
.swap_interval = 1,
|
||||
.custom_prog = NULL,
|
||||
.custom_tex = NULL,
|
||||
.custom_tlin = 1,
|
||||
.osd_color = 0xffffff,
|
||||
};
|
||||
|
||||
char *backend_arg = NULL;
|
||||
|
||||
//essentially unused; for legacy warnings only
|
||||
int user_colorspace = 0;
|
||||
int levelconv = -1;
|
||||
int aspect = -1;
|
||||
|
||||
const opt_t subopts[] = {
|
||||
{"manyfmts", OPT_ARG_BOOL, &p->many_fmts, NULL},
|
||||
{"scaled-osd", OPT_ARG_BOOL, &p->scaled_osd, NULL},
|
||||
{"ycbcr", OPT_ARG_BOOL, &p->use_ycbcr, NULL},
|
||||
{"slice-height", OPT_ARG_INT, &p->slice_height, int_non_neg},
|
||||
{"rectangle", OPT_ARG_INT, &p->use_rectangle,int_non_neg},
|
||||
{"yuv", OPT_ARG_INT, &p->use_yuv, int_non_neg},
|
||||
{"lscale", OPT_ARG_INT, &p->lscale, int_non_neg},
|
||||
{"cscale", OPT_ARG_INT, &p->cscale, int_non_neg},
|
||||
{"filter-strength", OPT_ARG_FLOAT, &p->filter_strength, NULL},
|
||||
{"noise-strength", OPT_ARG_FLOAT, &p->noise_strength, NULL},
|
||||
{"ati-hack", OPT_ARG_BOOL, &p->ati_hack, NULL},
|
||||
{"force-pbo", OPT_ARG_BOOL, &p->force_pbo, NULL},
|
||||
{"glfinish", OPT_ARG_BOOL, &p->use_glFinish, NULL},
|
||||
{"swapinterval", OPT_ARG_INT, &p->swap_interval,NULL},
|
||||
{"customprog", OPT_ARG_MSTRZ,&p->custom_prog, NULL},
|
||||
{"customtex", OPT_ARG_MSTRZ,&p->custom_tex, NULL},
|
||||
{"customtlin", OPT_ARG_BOOL, &p->custom_tlin, NULL},
|
||||
{"customtrect", OPT_ARG_BOOL, &p->custom_trect, NULL},
|
||||
{"mipmapgen", OPT_ARG_BOOL, &p->mipmap_gen, NULL},
|
||||
{"osdcolor", OPT_ARG_INT, &p->osd_color, NULL},
|
||||
{"stereo", OPT_ARG_INT, &p->stereo_mode, NULL},
|
||||
{"sw", OPT_ARG_BOOL, &p->allow_sw, NULL},
|
||||
{"backend", OPT_ARG_MSTRZ,&backend_arg, backend_valid},
|
||||
// Removed options.
|
||||
// They are only parsed to notify the user about the replacements.
|
||||
{"aspect", OPT_ARG_BOOL, &aspect, NULL},
|
||||
{"colorspace", OPT_ARG_INT, &user_colorspace, NULL},
|
||||
{"levelconv", OPT_ARG_INT, &levelconv, NULL},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
if (subopt_parse(arg, subopts) != 0) {
|
||||
mp_msg(MSGT_VO, MSGL_FATAL,
|
||||
"\n-vo opengl_old command line help:\n"
|
||||
"Example: mpv -vo opengl_old:slice-height=4\n"
|
||||
"\nOptions:\n"
|
||||
" nomanyfmts\n"
|
||||
" Disable extended color formats for OpenGL 1.2 and later\n"
|
||||
" slice-height=<0-...>\n"
|
||||
" Slice size for texture transfer, 0 for whole image\n"
|
||||
" scaled-osd\n"
|
||||
" Render OSD at movie resolution and scale it\n"
|
||||
" rectangle=<0,1,2>\n"
|
||||
" 0: use power-of-two textures\n"
|
||||
" 1: use texture_rectangle\n"
|
||||
" 2: use texture_non_power_of_two\n"
|
||||
" ati-hack\n"
|
||||
" Workaround ATI bug with PBOs\n"
|
||||
" force-pbo\n"
|
||||
" Force use of PBO even if this involves an extra memcpy\n"
|
||||
" glfinish\n"
|
||||
" Call glFinish() before swapping buffers\n"
|
||||
" swapinterval=<n>\n"
|
||||
" Interval in displayed frames between to buffer swaps.\n"
|
||||
" 1 is equivalent to enable VSYNC, 0 to disable VSYNC.\n"
|
||||
" Requires GLX_SGI_swap_control support to work.\n"
|
||||
" ycbcr\n"
|
||||
" also try to use the GL_MESA_ycbcr_texture extension\n"
|
||||
" yuv=<n>\n"
|
||||
" 0: use software YUV to RGB conversion.\n"
|
||||
" 1: deprecated, will use yuv=2 (used to be nVidia register combiners).\n"
|
||||
" 2: use fragment program.\n"
|
||||
" 3: use fragment program with gamma correction.\n"
|
||||
" 4: use fragment program with gamma correction via lookup.\n"
|
||||
" 5: use ATI-specific method (for older cards).\n"
|
||||
" 6: use lookup via 3D texture.\n"
|
||||
" lscale=<n>\n"
|
||||
" 0: use standard bilinear scaling for luma.\n"
|
||||
" 1: use improved bicubic scaling for luma.\n"
|
||||
" 2: use cubic in X, linear in Y direction scaling for luma.\n"
|
||||
" 3: as 1 but without using a lookup texture.\n"
|
||||
" 4: experimental unsharp masking (sharpening).\n"
|
||||
" 5: experimental unsharp masking (sharpening) with larger radius.\n"
|
||||
" cscale=<n>\n"
|
||||
" as lscale but for chroma (2x slower with little visible effect).\n"
|
||||
" filter-strength=<value>\n"
|
||||
" set the effect strength for some lscale/cscale filters\n"
|
||||
" noise-strength=<value>\n"
|
||||
" set how much noise to add. 1.0 is suitable for dithering to 6 bit.\n"
|
||||
" customprog=<filename>\n"
|
||||
" use a custom YUV conversion program\n"
|
||||
" customtex=<filename>\n"
|
||||
" use a custom YUV conversion lookup texture\n"
|
||||
" nocustomtlin\n"
|
||||
" use GL_NEAREST scaling for customtex texture\n"
|
||||
" customtrect\n"
|
||||
" use texture_rectangle for customtex texture\n"
|
||||
" mipmapgen\n"
|
||||
" generate mipmaps for the video image (use with TXB in customprog)\n"
|
||||
" osdcolor=<0xAARRGGBB>\n"
|
||||
" use the given color for the OSD\n"
|
||||
" stereo=<n>\n"
|
||||
" 0: normal display\n"
|
||||
" 1: side-by-side to red-cyan stereo\n"
|
||||
" 2: side-by-side to green-magenta stereo\n"
|
||||
" 3: side-by-side to quadbuffer stereo\n"
|
||||
" sw\n"
|
||||
" allow using a software renderer, if such is detected\n"
|
||||
" backend=<sys>\n"
|
||||
" auto: auto-select (default)\n"
|
||||
" cocoa: Cocoa/OSX\n"
|
||||
" win: Win32/WGL\n"
|
||||
" x11: X11/GLX\n"
|
||||
" wayland: Wayland/EGL\n"
|
||||
"\n");
|
||||
return -1;
|
||||
}
|
||||
if (user_colorspace != 0 || levelconv != -1) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "[gl] \"colorspace\" and \"levelconv\" "
|
||||
"suboptions have been removed. Use options --colormatrix and"
|
||||
" --colormatrix-input-range/--colormatrix-output-range instead.\n");
|
||||
return -1;
|
||||
}
|
||||
if (aspect != -1) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "[gl] \"noaspect\" suboption has been "
|
||||
"removed. Use --noaspect instead.\n");
|
||||
return -1;
|
||||
}
|
||||
if (p->use_yuv == 1) {
|
||||
mp_msg(MSGT_VO, MSGL_WARN, "[gl] yuv=1 (nVidia register combiners) have"
|
||||
" been removed, using yuv=2 instead.\n");
|
||||
p->use_yuv = 2;
|
||||
}
|
||||
|
||||
char *backend = talloc_strdup(vo, backend_arg);
|
||||
free(backend_arg);
|
||||
|
||||
p->glctx = mpgl_init(vo, backend);
|
||||
p->glctx = mpgl_init(vo, p->backend_arg);
|
||||
if (!p->glctx)
|
||||
goto err_out;
|
||||
p->gl = p->glctx->gl;
|
||||
|
@ -2322,6 +2169,8 @@ static int control(struct vo *vo, uint32_t request, void *data)
|
|||
return r;
|
||||
}
|
||||
|
||||
#define OPT_BASE_STRUCT struct gl_priv
|
||||
|
||||
const struct vo_driver video_out_opengl_old = {
|
||||
.info = &(const vo_info_t) {
|
||||
"OpenGL",
|
||||
|
@ -2337,4 +2186,47 @@ const struct vo_driver video_out_opengl_old = {
|
|||
.draw_osd = draw_osd,
|
||||
.flip_page = flip_page,
|
||||
.uninit = uninit,
|
||||
.priv_size = sizeof(struct gl_priv),
|
||||
.priv_defaults = &(const struct gl_priv) {
|
||||
.many_fmts = 1,
|
||||
.use_yuv = -1,
|
||||
.colorspace = MP_CSP_DETAILS_DEFAULTS,
|
||||
.filter_strength = 0.5,
|
||||
.use_rectangle = -1,
|
||||
.ati_hack = -1,
|
||||
.force_pbo = -1,
|
||||
.swap_interval = 1,
|
||||
.custom_prog = NULL,
|
||||
.custom_tex = NULL,
|
||||
.custom_tlin = 1,
|
||||
.osd_color = 0xffffff,
|
||||
},
|
||||
.options = (const struct m_option[]) {
|
||||
OPT_FLAG("manyfmts", many_fmts, 0),
|
||||
OPT_FLAG("scaled-osd", scaled_osd, 0),
|
||||
OPT_FLAG("ycbcr", use_ycbcr, 0),
|
||||
OPT_INT("slice-height", slice_height, M_OPT_MIN, .min = 0),
|
||||
OPT_INT("rectangle", use_rectangle, M_OPT_MIN, .min = -1),
|
||||
OPT_INT("yuv", use_yuv, M_OPT_MIN, .min = -1),
|
||||
OPT_INT("lscale", lscale, M_OPT_MIN, .min = 0),
|
||||
OPT_INT("cscale", cscale, M_OPT_MIN, .min = 0),
|
||||
OPT_FLOAT("filter-strength", filter_strength, 0),
|
||||
OPT_FLOAT("noise-strength", noise_strength, 0),
|
||||
OPT_CHOICE("ati-hack", ati_hack, 0,
|
||||
({"auto", -1}, {"no", 0}, {"yes", 1})),
|
||||
OPT_CHOICE("force-pbo", force_pbo, 0,
|
||||
({"auto", -1}, {"no", 0}, {"yes", 1})),
|
||||
OPT_FLAG("glfinish", use_glFinish, 0),
|
||||
OPT_INT("swapinterval", swap_interval, 0),
|
||||
OPT_STRING("customprog", custom_prog, 0),
|
||||
OPT_STRING("customtex", custom_tex, 0),
|
||||
OPT_FLAG("customtlin", custom_tlin, 0),
|
||||
OPT_FLAG("customtrect", custom_trect, 0),
|
||||
OPT_FLAG("mipmapgen", mipmap_gen, 0),
|
||||
OPT_INT("osdcolor", osd_color, 0),
|
||||
OPT_INT("stereo", stereo_mode, 0),
|
||||
OPT_FLAG("sw", allow_sw, 0),
|
||||
OPT_STRING_VALIDATE("backend", backend_arg, 0, mpgl_validate_backend_opt),
|
||||
{0}
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue