0

I am trying to create a Video Player inside GTKmm, for this I am using mpv. The documentation says, that I can embed the video player using an OpenGL view. However, I am having difficulties implementing the player inside a GTKmm app.

I have a GLWindow, that contains a GLArea which should then contain the video player. The problem is, that when I try to initialize the mpv render context, I get an error, telling me that the OpenGL was not initialized.

The following is my Constructor for the main window that I have:

    GLWindow::GLWindow(): GLArea_{}
    {
        set_title("GL Area");
        set_default_size(400, 600);
        setlocale(LC_NUMERIC, "C");

        VBox_.property_margin() = 12;
        VBox_.set_spacing(6);
        add(VBox_);

        GLArea_.set_hexpand(true);
        GLArea_.set_vexpand(true);
        GLArea_.set_auto_render(true);
        GLArea_.set_required_version(4, 0);
        VBox_.add(GLArea_);

        mpv = mpv_create();
        if (!mpv)
            throw std::runtime_error("Unable to create mpv context");

        mpv_set_option_string(mpv, "terminal", "yes");
        mpv_set_option_string(mpv, "msg-level", "all=v");
        if (mpv_initialize(mpv) < 0)
            throw std::runtime_error("could not initialize mpv context");
        mpv_render_param params[] = {
                {MPV_RENDER_PARAM_API_TYPE, const_cast<char*>(MPV_RENDER_API_TYPE_OPENGL)},
                {MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, static_cast<void*>(new (mpv_opengl_init_params){
                        .get_proc_address = get_proc_address,
                })},
                {MPV_RENDER_PARAM_INVALID}
        };
        if (mpv_render_context_create(&mpv_gl, mpv, params) < 0)
            throw std::runtime_error("Failed to create render context");

        mpv_render_context_set_update_callback(mpv_gl, GLWindow::onUpdate, this);

    }

As far as I know, this should just initialize the video player view, but the problem arises when I try to create the render context with mpv_render_context_create. I get the following error on that line:

[libmpv_render] glGetString(GL_VERSION) returned NULL.
[libmpv_render] OpenGL not initialized.

Then the app terminates with a SIGSEGV Signal.

The problem may be from my get_proc_address function, currently I have only implemented it for linux, it looks like the following:

static void *get_proc_address(void *ctx, const char *name) {
    return (void *)glXGetProcAddress(reinterpret_cast<const GLubyte *>(name));
}

To be honest, I am overwhelmed as to why the OpenGL context is not being created. How do I have to adjust my GTKmm app to allow the mpv video player to initialize correctly?

J.Paravicini
  • 882
  • 12
  • 39

1 Answers1

0

As the error suggested, the problem was that there was no OpenGL context. The GLArea is not instantly created, there is an event signal_realize on the GLArea when the OpenGL view has been created. I had to listen to that event, and in there initialize the mpv variables after setting GLArea.make_current(), to set the GLArea's context to the one we want to connect to mpv

J.Paravicini
  • 882
  • 12
  • 39