MpvInstance::MpvInstance(PlayerPluginInterface *playerInterface,
QObject *parent)
- : QObject{parent}, m_player{playerInterface} {
+ : QObject{parent}, m_player{playerInterface}, m_handle{
+ mpv::Handle::create()} {
qCDebug(mpvBackend) << "Initialize";
- m_handle = mpv_create();
-
- Q_CHECK_PTR(m_handle);
qCDebug(mpvBackend()).nospace()
<< "Client API version: " << (mpv_client_api_version() >> 16) << '.'
<< (mpv_client_api_version() & ~(~0u << 16));
- int error = mpv_initialize(m_handle);
+ int error = mpv_initialize(m_handle.get());
if (error) {
qCCritical(mpvBackend) << "Error initializing mpv"
<< mpv_error_string(error);
return;
}
- mpv_set_wakeup_callback(m_handle, mpvWakeupCb, this);
+ mpv_set_wakeup_callback(m_handle.get(), mpvWakeupCb, this);
{
const auto ret =
- mpv_observe_property(m_handle, 0, "pause", MPV_FORMAT_FLAG);
+ mpv_observe_property(m_handle.get(), 0, "pause", MPV_FORMAT_FLAG);
qCDebug(mpvBackend) << "register pause" << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, "duration", MPV_FORMAT_DOUBLE);
+ mpv_observe_property(m_handle.get(), 0, "duration", MPV_FORMAT_DOUBLE);
qCDebug(mpvBackend) << "register duration" << ret;
}
{
- const auto ret =
- mpv_observe_property(m_handle, 0, "playback-time", MPV_FORMAT_DOUBLE);
+ const auto ret = mpv_observe_property(m_handle.get(), 0, "playback-time",
+ MPV_FORMAT_DOUBLE);
qCDebug(mpvBackend) << "register playback-time" << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, VOLUME, MPV_FORMAT_DOUBLE);
+ mpv_observe_property(m_handle.get(), 0, VOLUME, MPV_FORMAT_DOUBLE);
qCDebug(mpvBackend) << "register" << VOLUME << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, "track-list", MPV_FORMAT_NODE);
+ mpv_observe_property(m_handle.get(), 0, "track-list", MPV_FORMAT_NODE);
qCDebug(mpvBackend) << "register track-list" << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, "vid", MPV_FORMAT_STRING);
+ mpv_observe_property(m_handle.get(), 0, "vid", MPV_FORMAT_STRING);
qCDebug(mpvBackend) << "register vid" << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, "aid", MPV_FORMAT_STRING);
+ mpv_observe_property(m_handle.get(), 0, "aid", MPV_FORMAT_STRING);
qCDebug(mpvBackend) << "register aid" << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, "sid", MPV_FORMAT_STRING);
+ mpv_observe_property(m_handle.get(), 0, "sid", MPV_FORMAT_STRING);
qCDebug(mpvBackend) << "register sid" << ret;
}
{
- const auto ret =
- mpv_observe_property(m_handle, 0, "chapter-list", MPV_FORMAT_NODE);
+ const auto ret = mpv_observe_property(m_handle.get(), 0, "chapter-list",
+ MPV_FORMAT_NODE);
qCDebug(mpvBackend) << "register chapter-list" << ret;
}
{
const auto ret =
- mpv_observe_property(m_handle, 0, "idle-active", MPV_FORMAT_NODE);
+ mpv_observe_property(m_handle.get(), 0, "idle-active", MPV_FORMAT_FLAG);
qCDebug(mpvBackend) << "register chapter-list" << ret;
}
{
- const auto ret = mpv_request_log_messages(m_handle, "info");
+ const auto ret = mpv_request_log_messages(m_handle.get(), "info");
qCDebug(mpvBackend) << "request log messages" << ret;
}
{
MpvInstance::~MpvInstance() {
qCDebug(mpvBackend) << "Deinitialize";
- mpv_terminate_destroy(m_handle);
+ mpv_terminate_destroy(m_handle.get());
}
VideoRendererBase *MpvInstance::createRenderer(VideoUpdateInterface *vui) {
const QByteArray tmp = source.toLocalFile().toUtf8();
const char *args[] = {"loadfile", tmp.constData(), nullptr};
- mpv_command_async(m_handle, 1, args);
+ mpv_command_async(m_handle.get(), 1, args);
pause();
m_currentlyLoading = source;
void MpvInstance::processMpvEvents() {
struct mpv_event *event = nullptr;
do {
- event = mpv_wait_event(m_handle, 0);
+ event = mpv_wait_event(m_handle.get(), 0);
if (event->event_id == MPV_EVENT_NONE)
break;
qCDebug(mpvVerboseBackend).nospace()
QMetaObject::invokeMethod(self, "processMpvEvents", Qt::QueuedConnection);
}
-VideoRendererMpv::VideoRendererMpv(mpv_handle *handle,
+VideoRendererMpv::VideoRendererMpv(mpv::Handle handle,
VideoUpdateInterface *vui)
- : m_handle{handle} {
+ : m_handle{std::move(handle)} {
qCDebug(mpvBackend, "VideoRendererMpv::VideoRendererMpv");
mpv_opengl_init_params opengl_init_params;
opengl_init_params.get_proc_address = getProcAddress;
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &opengl_init_params},
{MPV_RENDER_PARAM_INVALID, nullptr}};
- int error = mpv_render_context_create(&m_renderCtx, m_handle, render_params);
- if (error) {
- qCCritical(mpvBackend())
- << "Error initializing mpv ogl context:" << mpv_error_string(error);
- m_renderCtx = nullptr;
- }
- if (!m_renderCtx) {
- qCDebug(mpvBackend) << "Error obtaining mpv render context";
- return;
+ {
+ mpv_render_context *ctx = nullptr;
+ int error = mpv_render_context_create(&ctx, m_handle.get(), render_params);
+ if (error) {
+ qCCritical(mpvBackend()) << "Error initializing mpv render context:"
+ << mpv_error_string(error);
+ ctx = nullptr;
+ }
+ if (!ctx) {
+ qCDebug(mpvBackend) << "Error obtaining mpv render context";
+ return;
+ }
+ m_renderCtx = mpv::RenderContextHandle::create(ctx);
}
qCDebug(mpvBackend, "setting callback");
- mpv_render_context_set_update_callback(m_renderCtx, mpvUpdate, vui);
+ mpv_render_context_set_update_callback(m_renderCtx.get(), mpvUpdate, vui);
qCDebug(mpvBackend, "initializing gl context");
qCDebug(mpvBackend, "all done");
}
VideoRendererMpv::~VideoRendererMpv() {
- if (m_renderCtx) {
- mpv_render_context_free(m_renderCtx);
- m_renderCtx = nullptr;
- }
}
void VideoRendererMpv::render(QOpenGLFramebufferObject *fbo) {
opengl_fbo.internal_format = fbo->format().internalTextureFormat();
mpv_render_param render_param{MPV_RENDER_PARAM_OPENGL_FBO, &opengl_fbo};
- int error = mpv_render_context_render(m_renderCtx, &render_param);
+ int error = mpv_render_context_render(m_renderCtx.get(), &render_param);
if (error)
qCCritical(mpvBackend) << "Error rendering mpv frame:"
<< mpv_error_string(error);