void VideoRendererEVR::notifyResize(const QSize &size, Phonon::VideoWidget::AspectRatio aspectRatio, Phonon::VideoWidget::ScaleMode scaleMode) { if (!isActive()) { RECT dummyRect = { 0, 0, 0, 0}; ComPointer<IMFVideoDisplayControl> filterControl = getService<IMFVideoDisplayControl>(m_filter, MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl); filterControl->SetVideoPosition(0, &dummyRect); return; } const QSize vsize = videoSize(); internalNotifyResize(size, vsize, aspectRatio, scaleMode); RECT dstRectWin = { 0, 0, size.width(), size.height()}; // Resize the Stream output rect instead of the destination rect. // Hacky workaround for flicker in the areas outside of the destination rect // This way these areas don't exist MFVideoNormalizedRect streamOutputRect = { float(m_dstX) / float(size.width()), float(m_dstY) / float(size.height()), float(m_dstWidth + m_dstX) / float(size.width()), float(m_dstHeight + m_dstY) / float(size.height())}; ComPointer<IMFVideoMixerControl> filterMixer = getService<IMFVideoMixerControl>(m_filter, MR_VIDEO_MIXER_SERVICE, IID_IMFVideoMixerControl); ComPointer<IMFVideoDisplayControl> filterControl = getService<IMFVideoDisplayControl>(m_filter, MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl); filterMixer->SetStreamOutputRect(0, &streamOutputRect); filterControl->SetVideoPosition(0, &dstRectWin); }
void VideoRendererDefault::notifyResize(const QSize &size, Phonon::VideoWidget::AspectRatio aspectRatio, Phonon::VideoWidget::ScaleMode scaleMode) { if (!isActive()) { ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo); if (basic) { basic->SetDestinationPosition(0, 0, 0, 0); } return; } ComPointer<IVideoWindow> video(m_filter, IID_IVideoWindow); OAHWND owner; HRESULT hr = video->get_Owner(&owner); if (FAILED(hr)) { return; } const OAHWND newOwner = reinterpret_cast<OAHWND>(m_target->winId()); if (owner != newOwner) { video->put_Owner(newOwner); video->put_MessageDrain(newOwner); video->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); } //make sure the widget takes the whole size of the parent video->SetWindowPosition(0, 0, size.width(), size.height()); const QSize vsize = videoSize(); internalNotifyResize(size, vsize, aspectRatio, scaleMode); ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo); if (basic) { basic->SetDestinationPosition(m_dstX, m_dstY, m_dstWidth, m_dstHeight); } }