É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 :

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 HasVideo méthode retourne la valeur true si le convertisseur vidéo a été créé.
  • La AddToGraph méthode ajoute le convertisseur vidéo au graphique de filtre.
  • La FinalizeGraph méthode termine l’étape de création de graphiques.
  • La UpdateVideoWindow méthode met à jour le rectangle de destination de la vidéo.
  • La Repaint méthode redessine le frame vidéo actuel.
  • La DisplayModeChanged mé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.

Lecture audio/vidéo en DirectShow

Utilisation du convertisseur de mixage vidéo

Rendu vidéo