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

Il s’agit de l’étape 3B du didacticiel écriture de filtres de transformation.

Notes

Cette étape n’est pas requise 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 à partir de la connexion en amont pour déterminer les types de sortie préférés.

Un encodeur offre généralement un type par défaut unique, représentant le format cible. Les décodeurs prennent généralement en charge une plage de formats de sortie et les proposent dans l’ordre décroissant de la qualité ou de l’efficacité. Par exemple, la liste peut être UYVY, Y211, RGB-24, RGB-565, RGB-555 et RGB-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, 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 récupérer le type d’entrée à partir de la broche d’entrée. Ensuite, il modifie certains champs pour indiquer le format de compression, comme suit :

  • Il assigne un nouveau GUID de sous-type, construit à partir du code FOURCC « MRLE », à l’aide de la classe FOURCCMap .
  • Elle appelle la méthode CMediaType :: SetVariableSize , qui définit l’indicateur bFixedSizeSamples sur false et le membre lSampleSize sur zéro, ce qui indique des échantillons de taille variable.
  • Elle appelle la méthode CMediaType :: SetTemporalCompression avec la valeur false, ce qui indique que chaque frame est une image clé. (Ce champ est à titre d’information uniquement. vous pouvez donc l’ignorer en toute sécurité.)
  • Il définit le champ de décompression sur bi _ RLE8.
  • Elle définit le champ biSizeImage sur la taille de l’image.

Suivant : étape 3c. implémentez la méthode CheckTransform.

écriture de filtres de DirectShow