Étape 5 : ajouter la fonctionnalité vidéo
Cette rubrique est l’étape 5 de la lecture audio/vidéo du didacticiel dans DirectShow. le code complet est présenté dans la rubrique exemple de lecture DirectShow.
Pour vous assurer que la vidéo s’affiche correctement, l’application doit répondre aux messages WM _ Paint, WM _ Sizeet WM _ DISPLAYCHANGE comme suit.
Gérer _ les messages de peinture WM
Lorsque l’application reçoit un message de _ peinture WM , le convertisseur vidéo peut avoir besoin de redessiner la dernière image vidéo. Pour le filtre EVR ( Enhanced Video Renderer ), appelez IMFVideoDisplayControl :: RepaintVideo.
HRESULT CEVR::Repaint(HWND hwnd, HDC hdc)
{
if (m_pVideoDisplay)
{
return m_pVideoDisplay->RepaintVideo();
}
else
{
return S_OK;
}
}
Pour le filtre de convertisseur de mixage vidéo 9 (VMR-9), appelez IVMRWindowlessControl9 :: RepaintVideo.
HRESULT CVMR9::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Pour le filtre de convertisseur de mixage vidéo 7 (VMR-7), appelez IVMRWindowlessControl :: RepaintVideo.
HRESULT CVMR7::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Gérer _ les messages de taille WM
Si la taille de la fenêtre vidéo change, avertissez le convertisseur vidéo pour redimensionner la vidéo. Pour EVR, appelez IMFVideoDisplayControl :: SetVideoPosition.
HRESULT CEVR::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pVideoDisplay == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pVideoDisplay->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pVideoDisplay->SetVideoPosition(NULL, &rc);
}
}
Pour VMR-9, appelez IVMRWindowlessControl9 :: SetVideoPosition.
HRESULT CVMR9::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pWindowless == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pWindowless->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pWindowless->SetVideoPosition(NULL, &rc);
}
}
Pour VMR-7, appelez IVMRWindowlessControl :: SetVideoPosition.
HRESULT CVMR7::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pWindowless == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pWindowless->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pWindowless->SetVideoPosition(NULL, &rc);
}
}
Gérer _ les messages WM DISPLAYCHANGE
Si le mode d’affichage change, vous devez notifier le filtre VMR-9 ou VMR-7. Pour VMR-9, appelez IVMRWindowlessControl9 ::D isplaymodechanged.
HRESULT CVMR9::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
Pour VMR-7, appelez IVMRWindowlessControl ::D isplaymodechanged.
HRESULT CVMR7::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
Le EVR n’a pas besoin d’être notifié lorsque le mode d’affichage change.
étape 6 : gérer les événements de Graph.