mirror of
https://github.com/mpv-player/mpv
synced 2025-03-04 05:07:51 +00:00
DOCS/client_api_examples: qtexample: resize to video size
This is pretty imperfect, but it's just a demo. The main purpose is clarifying how and when to get the video size. In theory, retrieving the properties this way has a race condition: after reading dwidth, the video could resize again. But the worst that can happen are mismatching dwidth/dheight values, and the MPV_EVENT_VIDEO_RECONFIG event would be immediately received again, which would fix the mismatch. You could read the full video-out-params property to absolutely avoid it, but it's not worth the trouble.
This commit is contained in:
parent
ac2047e02e
commit
930c61b64c
@ -45,6 +45,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
mpv_container = new QWidget(this);
|
||||
setCentralWidget(mpv_container);
|
||||
mpv_container->setAttribute(Qt::WA_NativeWindow);
|
||||
// If you have a HWND, use: int64_t wid = (intptr_t)hwnd;
|
||||
int64_t wid = mpv_container->winId();
|
||||
mpv_set_option(mpv, "wid", MPV_FORMAT_INT64, &wid);
|
||||
|
||||
@ -84,6 +85,26 @@ void MainWindow::handle_mpv_event(mpv_event *event)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MPV_EVENT_VIDEO_RECONFIG: {
|
||||
// Retrieve the new video size.
|
||||
int64_t w, h;
|
||||
if (mpv_get_property(mpv, "dwidth", MPV_FORMAT_INT64, &w) >= 0 &&
|
||||
mpv_get_property(mpv, "dheight", MPV_FORMAT_INT64, &h) >= 0 &&
|
||||
w > 0 && h > 0)
|
||||
{
|
||||
// Force Qt to resize the mpv window to video size. You probably
|
||||
// want to do something more sophisticated here, because:
|
||||
// A) it prevents the user from making the window smaller for no
|
||||
// reason (I was unsure how to make Qt do the right thing)
|
||||
// B) the MPV_EVENT_VIDEO_RECONFIG event doesn't necessarily imply
|
||||
// a resize, and you should check yourself if the video
|
||||
// dimensions really changed
|
||||
// mpv itself will scale/letter box the video to the container size
|
||||
// if the video doesn't fit.
|
||||
mpv_container->setMinimumSize(w, h);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MPV_EVENT_SHUTDOWN: {
|
||||
mpv_terminate_destroy(mpv);
|
||||
mpv = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user