Étape 3B. Implémenter la méthode GetMediaType

[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 3B du tutoriel Écriture de filtres de transformation.

Notes

Cette étape n’est pas obligatoire pour les filtres qui dérivent de CTransInPlaceFilter.

 

La méthode CTransformFilter::GetMediaType retourne l’un des types de sortie préférés du filtre, référencé par numéro d’index. Cette méthode n’est jamais appelée, sauf si la broche d’entrée du filtre est déjà connectée. Par conséquent, vous pouvez utiliser le type de média de la connexion amont pour déterminer les types de sortie préférés.

Un encodeur offre généralement un seul type préféré, représentant le format cible. Les décodeurs prennent généralement en charge une gamme de formats de sortie et les offrent par ordre décroissant de qualité ou d’efficacité. Par exemple, la liste peut être UYVY, Y211, RVB-24, RVB-565, RVB-555 et RVB-8, dans cet ordre. Les filtres d’effet peuvent nécessiter une correspondance exacte entre le format de sortie et le format d’entrée.

L’exemple suivant retourne un type de sortie unique, qui est construit en modifiant le type d’entrée pour spécifier la compression RLE8 :

HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ASSERT(m_pInput->IsConnected());
    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
        if (FAILED(hr))
        {
            return hr;
        }
        FOURCCMap fccMap = FCC('MRLE'); 
        pMediaType->subtype = static_cast<GUID>(fccMap);
        pMediaType->SetVariableSize();
        pMediaType->SetTemporalCompression(FALSE);

        ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
        VIDEOINFOHEADER *pVih =
            reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
        pVih->bmiHeader.biCompression = BI_RLE8;
        pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader); 
        return S_OK;
    }
    // else
    return VFW_S_NO_MORE_ITEMS;
}

Dans cet exemple, la méthode appelle IPin::ConnectionMediaType pour obtenir le type d’entrée à partir de la broche d’entrée. Il modifie ensuite certains des champs pour indiquer le format de compression, comme suit :

  • Il affecte un nouveau GUID de sous-type, qui est construit à partir du code FOURCC « MRLE », à l’aide de la classe FOURCCMap .
  • Il appelle la méthode CMediaType::SetVariableSize , qui définit l’indicateur bFixedSizeSamples sur FALSE et le membre lSampleSize sur zéro, indiquant des exemples de taille variable.
  • Il appelle la méthode CMediaType::SetTemporalCompression avec la valeur FALSE, indiquant que chaque image est une image clé. (Ce champ n’est qu’informationnel, vous pouvez donc l’ignorer en toute sécurité.)
  • Il définit le champ biCompression sur BI_RLE8.
  • Il définit le champ biSizeImage sur la taille de l’image.

Suivant : Étape 3C. Implémentez la méthode CheckTransform.

Écriture de filtres DirectShow