Étape 3A. Implémenter la méthode CheckInputType

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Il s’agit de l’étape 3A du tutoriel Écriture de filtres de transformation.

La méthode CTransformFilter::CheckInputType est appelée lorsque le filtre amont propose un type de média au filtre de transformation. Cette méthode prend un pointeur vers un objet CMediaType , qui est un wrapper mince pour la structure AM_MEDIA_TYPE . Dans cette méthode, vous devez examiner tous les champs pertinents de la structure AM_MEDIA_TYPE , y compris les champs du bloc de format. Vous pouvez utiliser les méthodes d’accesseur définies dans CMediaType ou référencer directement les membres de la structure. Si un champ n’est pas valide, retournez VFW_E_TYPE_NOT_ACCEPTED. Si le type multimédia entier est valide, retournez S_OK.

Par exemple, dans le filtre d’encodeur RLE, le type d’entrée doit être une vidéo RVB non compressée 8 bits ou 4 bits. Il n’y a aucune raison de prendre en charge d’autres formats d’entrée, tels que RVB 16 ou 24 bits, car le filtre doit les convertir en profondeur de bits inférieure, et DirectShow fournit déjà un filtre Color Space Converter à cet effet. L’exemple suivant suppose que l’encodeur prend en charge la vidéo 8 bits, mais pas la vidéo 4 bits :

HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
    if ((mtIn->majortype != MEDIATYPE_Video) ||
        (mtIn->subtype != MEDIASUBTYPE_RGB8) ||
        (mtIn->formattype != FORMAT_VideoInfo) || 
        (mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }

    VIDEOINFOHEADER *pVih = 
        reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
    if ((pVih->bmiHeader.biBitCount != 8) ||
        (pVih->bmiHeader.biCompression != BI_RGB))
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }

    // Check the palette table.
    if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }
    DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
    if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }

    // Everything is good.
    return S_OK;
}

Dans cet exemple, la méthode vérifie d’abord le type principal et le sous-type. Ensuite, il vérifie le type de format pour s’assurer que le bloc de format est une structure VIDEOINFOHEADER . Le filtre pourrait également prendre en charge VIDEOINFOHEADER2, mais dans ce cas, il n’y aurait aucun avantage réel. La structure VIDEOINFOHEADER2 ajoute la prise en charge de l’entrelacement et des pixels non carrés, qui ne sont pas susceptibles d’être pertinents dans la vidéo 8 bits.

Si le type de format est correct, l’exemple vérifie les membres biBitCount et biCompression de la structure VIDEOINFOHEADER pour vérifier que le format est RVB non compressé 8 bits. Comme le montre cet exemple, vous devez forcer le

pbFormat

pointeur vers la structure appropriée, en fonction du type de format. Toujours case activée le type DE FORMAT GUID (formattype) et la taille du bloc de format (cbFormat) avant de lancer le pointeur.

L’exemple vérifie également que le nombre d’entrées de palette est compatible avec la profondeur de bits et que le bloc de format est suffisamment grand pour contenir les entrées de palette. Si toutes ces informations sont correctes, la méthode retourne S_OK.

Suivant : Étape 3B. Implémentez la méthode GetMediaType.

Écriture de filtres DirectShow