Étape 2 : déclarer CVideoRenderer et les classes dérivées
Cette rubrique est l’étape 2 de la lecture audio/vidéo du didacticiel dans DirectShow. le code complet est présenté dans la rubrique exemple de lecture DirectShow.
DirectShow fournit plusieurs filtres différents qui restituent la vidéo :
- Filtre de convertisseur vidéo amélioré (EVR)
- Filtre de convertisseur de mixage vidéo 9 (VMR-9)
- Filtre de convertisseur de mixage vidéo 7 (VMR-7)
Pour plus d’informations sur les différences entre ces filtres, consultez choix du convertisseur vidéo approprié.
Dans ce didacticiel, la classe abstraite suivante est utilisée pour encapsuler le filtre de convertisseur vidéo.
// Abstract class to manage the video renderer filter.
// Specific implementations handle the VMR-7, VMR-9, or EVR filter.
class CVideoRenderer
{
public:
virtual ~CVideoRenderer() {};
virtual BOOL HasVideo() const = 0;
virtual HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd) = 0;
virtual HRESULT FinalizeGraph(IGraphBuilder *pGraph) = 0;
virtual HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc) = 0;
virtual HRESULT Repaint(HWND hwnd, HDC hdc) = 0;
virtual HRESULT DisplayModeChanged() = 0;
};
Remarques :
- La
HasVideométhode retourne la valeur true si le convertisseur vidéo a été créé. - La
AddToGraphméthode ajoute le convertisseur vidéo au graphique de filtre. - La
FinalizeGraphméthode termine l’étape de création de graphiques. - La
UpdateVideoWindowméthode met à jour le rectangle de destination de la vidéo. - La
Repaintméthode redessine le frame vidéo actuel. - La
DisplayModeChangedméthode gère les modifications du mode d’affichage.
Chacune de ces méthodes est décrite en détail plus loin dans ce didacticiel.
Ensuite, déclarez une classe dérivée pour encapsuler chacun des trois convertisseurs vidéo : EVR, VMR-9 et VMR-7.
CEVR, classe
La CEVR classe gère le EVR. Elle contient un pointeur vers les interfaces IBaseFilter et IMFVideoDisplayControl de EVR.
// Manages the EVR video renderer filter.
class CEVR : public CVideoRenderer
{
IBaseFilter *m_pEVR;
IMFVideoDisplayControl *m_pVideoDisplay;
public:
CEVR();
~CEVR();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
CVMR9, classe
La CVMR9 classe gère VMR-9. Il contient un pointeur vers l’interface IVMRWindowlessControl9 .
// Manages the VMR-9 video renderer filter.
class CVMR9 : public CVideoRenderer
{
IVMRWindowlessControl9 *m_pWindowless;
public:
CVMR9();
~CVMR9();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
CVMR7, classe
La CVMR7 classe gère VMR-7. Il contient un pointeur vers l’interface IVMRWindowlessControl .
// Manages the VMR-7 video renderer filter.
class CVMR7 : public CVideoRenderer
{
IVMRWindowlessControl *m_pWindowless;
public:
CVMR7();
~CVMR7();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
Étape 3 : générer le filtre Graph.