Informationen zu Medientypen (DirectShow)

Da DirectShow modular ist, ist eine Möglichkeit erforderlich, das Format der Daten an jedem Punkt im Filterdiagramm zu beschreiben. Betrachten Sie beispielsweise die AVI-Wiedergabe. Daten gelangen in das Diagramm als Stream von CSV-Blöcken. Diese werden in Video- und Audiostreams analysiert. Der Videostream besteht aus Videoframes, die wahrscheinlich komprimiert sind. Nach der Decodierung ist der Videostream eine Reihe von unkomprimierten Bitmaps. Der Audiostream durchläuft einen ähnlichen Prozess.

Medientypen: Darstellung von Formaten durch DirectShow

Der Medientyp ist eine universelle und erweiterbare Möglichkeit, digitale Medienformate zu beschreiben. Wenn zwei Filter eine Verbindung herstellen, stimmen sie mit einem Medientyp überein. Der Medientyp gibt an, welche Art von Daten der Upstreamfilter an den Downstreamfilter übermittelt, sowie das physische Layout der Daten. Wenn sich zwei Filter nicht auf einen Medientyp einigen können, stellen sie keine Verbindung her.

Bei einigen Anwendungen müssen Sie sich nie um Medientypen kümmern. Bei der Dateiwiedergabe verarbeitet DirectShow beispielsweise alle Details. Andere Arten von Anwendungen müssen möglicherweise direkt mit Medientypen arbeiten.

Medientypen werden mithilfe der AM _ MEDIA _ TYPE-Struktur definiert. Diese Struktur enthält die folgenden Informationen:

  • Haupttyp: Der Haupttyp ist eine GUID, die die Gesamtkategorie der Daten definiert. Zu den Haupttypen gehören Video, Audio, nicht analysierter Bytestream, CSV-Daten usw.

  • Untertyp: Der Untertyp ist eine weitere GUID, die das Format weiter definiert. Beispielsweise gibt es innerhalb des Haupttyps des Videos Untertypen für RGB-24, RGB-32, UYVY usw. Im Audiobereich gibt es PCM-Audio, MPEG-1-Nutzlast und andere. Der Untertyp stellt mehr Informationen als der Haupttyp bereit, definiert aber nicht alles über das Format. Videountertypen definieren beispielsweise nicht die Bildgröße oder die Bildfrequenz. Diese werden durch den unten beschriebenen Formatblock definiert.

  • Formatblock: Der Formatblock ist ein Datenblock, der das Format detailliert beschreibt. Der Formatblock wird getrennt von der AM _ MEDIA _ TYPE-Struktur zugeordnet. Der pbFormat-Member der AM MEDIA _ _ TYPE-Struktur zeigt auf den Formatblock.

    Der pbFormat-Member ist vom Typ *void * _ , da sich das Layout des Formatblocks je nach Medientyp ändert. Pcm-Audio verwendet beispielsweise eine _WAVEFORMATEX-Struktur. * Video verwendet verschiedene Strukturen, einschließlich VIDEOINFOHEADER und VIDEOINFOHEADER2. Der Formattype-Member der AM MEDIA _ _ TYPE-Struktur ist eine GUID, die angibt, welche Struktur im Formatblock enthalten ist. Jeder Formatstruktur wird eine GUID zugewiesen. Der cbFormat-Member gibt die Größe des Formatblocks an. Überprüfen Sie diese Werte immer, bevor Sie den pbFormat-Zeiger dereferenzieren.

Wenn der Formatblock ausgefüllt ist, enthalten Haupttyp und Untertyp redundante Informationen. Haupttyp und Untertyp bieten jedoch eine bequeme Möglichkeit, Formate ohne vollständigen Formatblock zu identifizieren. Beispielsweise können Sie ein generisches 24-Bit-RGB-Format (MEDIASUBTYPE RGB24) angeben, ohne alle informationen zu _ kennen, die von der VIDEOINFOHEADER-Struktur benötigt werden, z. B. Bildgröße und Bildfrequenz.

Beispielsweise kann ein Filter den folgenden Code verwenden, um einen Medientyp zu überprüfen:

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

Die AM _ MEDIA _ TYPE-Struktur enthält auch einige optionale Felder. Diese können verwendet werden, um zusätzliche Informationen bereitzustellen, aber filter sind nicht erforderlich, um sie zu verwenden:

  • lSampleSize. Wenn dieses Feld ungleich 0 (null) ist, wird die Größe der einzelnen Stichproben definiert. Wenn er 0 (null) ist, gibt dies an, dass sich die Stichprobengröße von Sample zu Sample ändern kann.
  • bFixedSizeSamples. Wenn dieses boolesche Flag TRUE ist, bedeutet dies, dass der Wert in lSampleSize gültig ist. Andernfalls sollten Sie lSampleSize ignorieren.
  • bTemporalCompression. Wenn dieses boolesche Flag FALSE ist, bedeutet dies, dass alle Frames Keyframes sind.

Filter Graph und die zugehörigen Komponenten