void VideoDisplay::OnSizeEvent(wxSizeEvent &event) { if (freeSize) { videoSize = GetClientSize() * scale_factor; PositionVideo(); zoomValue = double(viewport_height) / con->videoController->GetHeight(); zoomBox->ChangeValue(wxString::Format("%g%%", zoomValue * 100.)); } else { PositionVideo(); } }
void VideoDisplay::OnSizeEvent(wxSizeEvent &event) { if (freeSize) { videoSize = GetClientSize() * scale_factor; PositionVideo(); zoomValue = double(viewport_height) / con->project->VideoProvider()->GetHeight(); zoomBox->ChangeValue(fmt_wx("%g%%", zoomValue * 100.)); con->ass->Properties.video_zoom = zoomValue; } else { PositionVideo(); } }
void VideoDisplay::UpdateSize() { auto provider = con->project->VideoProvider(); if (!provider || !IsShownOnScreen()) return; videoSize.Set(provider->GetWidth(), provider->GetHeight()); videoSize *= zoomValue; if (con->videoController->GetAspectRatioType() != AspectRatio::Default) videoSize.SetWidth(videoSize.GetHeight() * con->videoController->GetAspectRatioValue()); wxEventBlocker blocker(this); if (freeSize) { wxWindow *top = GetParent(); while (!top->IsTopLevel()) top = top->GetParent(); wxSize cs = GetClientSize(); wxSize oldSize = top->GetSize(); top->SetSize(top->GetSize() + videoSize / scale_factor - cs); SetClientSize(cs + top->GetSize() - oldSize); } else { SetMinClientSize(videoSize / scale_factor); SetMaxClientSize(videoSize / scale_factor); GetGrandParent()->Layout(); } PositionVideo(); }
void VideoDisplay::UpdateSize() { if (!con->videoController->IsLoaded() || !IsShownOnScreen()) return; videoSize.Set(con->videoController->GetWidth(), con->videoController->GetHeight()); videoSize *= zoomValue; if (con->videoController->GetAspectRatioType() != 0) videoSize.SetWidth(videoSize.GetHeight() * con->videoController->GetAspectRatioValue()); wxEventBlocker blocker(this); if (freeSize) { wxWindow *top = GetParent(); while (!top->IsTopLevel()) top = top->GetParent(); wxSize cs = GetClientSize(); wxSize oldSize = top->GetSize(); top->SetSize(top->GetSize() + videoSize - cs); SetClientSize(cs + top->GetSize() - oldSize); } else { SetMinClientSize(videoSize); SetMaxClientSize(videoSize); GetGrandParent()->Layout(); } PositionVideo(); }
void VideoDisplay::Render() try { if (!con->project->VideoProvider() || !InitContext() || (!videoOut && !pending_frame)) return; if (!videoOut) videoOut = agi::make_unique<VideoOutGL>(); if (!tool) cmd::call("video/tool/cross", con); try { if (pending_frame) { videoOut->UploadFrameData(*pending_frame); pending_frame.reset(); } } catch (const VideoOutInitException& err) { wxLogError( "Failed to initialize video display. Closing other running " "programs and updating your video card drivers may fix this.\n" "Error message reported: %s", err.GetMessage()); con->project->CloseVideo(); return; } catch (const VideoOutRenderException& err) { wxLogError( "Could not upload video frame to graphics card.\n" "Error message reported: %s", err.GetMessage()); return; } if (videoSize.GetWidth() == 0) videoSize.SetWidth(1); if (videoSize.GetHeight() == 0) videoSize.SetHeight(1); if (!viewport_height || !viewport_width) PositionVideo(); videoOut->Render(viewport_left, viewport_bottom, viewport_width, viewport_height); E(glViewport(0, std::min(viewport_bottom, 0), videoSize.GetWidth(), videoSize.GetHeight())); E(glMatrixMode(GL_PROJECTION)); E(glLoadIdentity()); E(glOrtho(0.0f, videoSize.GetWidth() / scale_factor, videoSize.GetHeight() / scale_factor, 0.0f, -1000.0f, 1000.0f)); if (OPT_GET("Video/Overscan Mask")->GetBool()) { double ar = con->videoController->GetAspectRatioValue(); // Based on BBC's guidelines: http://www.bbc.co.uk/guidelines/dq/pdf/tv/tv_standards_london.pdf // 16:9 or wider if (ar > 1.75) { DrawOverscanMask(.1f, .05f); DrawOverscanMask(0.035f, 0.035f); } // Less wide than 16:9 (use 4:3 standard) else { DrawOverscanMask(.067f, .05f); DrawOverscanMask(0.033f, 0.035f); } } if ((mouse_pos || !autohideTools->GetBool()) && tool) tool->Draw(); SwapBuffers(); } catch (const agi::Exception &err) { wxLogError( "An error occurred trying to render the video frame on the screen.\n" "Error message reported: %s", err.GetMessage()); con->project->CloseVideo(); }