Passaggio 3B. Implementare il metodo GetMediaType

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo è il passaggio 3B dell'esercitazione Scrittura di filtri di trasformazione.

Nota

Questo passaggio non è necessario per i filtri che derivano da CTransInPlaceFilter.

 

Il metodo CTransformFilter::GetMediaType restituisce uno dei tipi di output preferiti del filtro, a cui fa riferimento il numero di indice. Questo metodo non viene mai chiamato a meno che il pin di input del filtro non sia già connesso. Pertanto, è possibile usare il tipo di supporto dalla connessione upstream per determinare i tipi di output preferiti.

Un codificatore offre in genere un singolo tipo preferito, che rappresenta il formato di destinazione. I decodificatori supportano in genere una gamma di formati di output e li offrono in ordine decrescente di qualità o efficienza. Ad esempio, l'elenco potrebbe essere UYVY, Y211, RGB-24, RGB-565, RGB-555 e RGB-8, in tale ordine. I filtri effetto possono richiedere una corrispondenza esatta tra il formato di output e il formato di input.

Nell'esempio seguente viene restituito un singolo tipo di output, costruito modificando il tipo di input per specificare la compressione 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;
}

In questo esempio il metodo chiama IPin::ConnectionMediaType per ottenere il tipo di input dal pin di input. Vengono quindi modificati alcuni campi per indicare il formato di compressione, come indicato di seguito:

  • Assegna un nuovo GUID di sottotipo, costruito dal codice FOURCC 'MRLE', usando la classe FOURCCMap .
  • Chiama il metodo CMediaType::SetVariableSize , che imposta il flag bFixedSizeSamples su FALSE e il membro lSampleSize su zero, che indica esempi di dimensioni variabili.
  • Chiama il metodo CMediaType::SetTemporalCompression con il valore FALSE, a indicare che ogni fotogramma è un fotogramma chiave. Questo campo è solo informativo, quindi è possibile ignorarlo in modo sicuro.
  • Imposta il campo biCompression su BI_RLE8.
  • Imposta il campo biSizeImage sulle dimensioni dell'immagine.

Passaggio 3C. Implementare il metodo CheckTransform.

Scrittura di filtri DirectShow