Festlegen von Medientypen in einem DMO
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Bevor ein DMO Daten verarbeiten kann, muss der Client den Medientyp für jeden Stream festlegen. (Es gibt eine kleinere Ausnahme von dieser Regel. Weitere Informationen finden Sie unter Optionale Streams.) Rufen Sie die IMediaObject::GetStreamCount-Methode auf, um die Anzahl der Streams zu ermitteln:
DWORD cInput = 0, cOutput = 0;
pDMO->GetStreamCount(&cInput, &cOutput);
Diese Methode gibt zwei Werte zurück: die Anzahl der Eingaben und die Anzahl der Ausgaben. Diese Werte sind für die Lebensdauer des DMO festgelegt.
Bevorzugte Typen
Für jeden Stream weist der DMO eine Liste möglicher Medientypen in der Reihenfolge der Präferenz zu. Die bevorzugten Typen können beispielsweise 32-RGB, 24-Bit-RGB und 16-Bit-RGB in dieser Reihenfolge sein. Wenn der Client die Medientypen festlegt, kann er diese Listen als Hinweis verwenden. Um einen bevorzugten Typ für einen Stream abzurufen, rufen Sie die IMediaObject::GetInputType-Methode oder die IMediaObject::GetOutputType-Methode auf. Geben Sie die Streamnummer und einen Indexwert für den Typ an (beginnend bei 0). Der folgende Code ruft beispielsweise den ersten bevorzugten Typ aus dem ersten Eingabedatenstrom ab:
DMO_MEDIA_TYPE mt
hr = pDMO->GetInputType(0, 0, &mt)
if (SUCCEEDED(hr))
{
// Examine this media type (not shown).
/* ... */
// Free the format block.
MoFreeMediaType(&mt);
}
Um alle bevorzugten Medientypen für einen bestimmten Datenstrom aufzulisten, verwenden Sie eine Schleife, die den Typindex erhöht, bis die Methode DMO_E_NO_MORE_ITEMS zurückgibt, wie im folgenden Beispiel gezeigt:
DMO_MEDIA_TYPE mt;
DWORD dwType = 0;
while (hr = pDMO->GetInputType(0, dwType, &mt), SUCCEEDED(hr))
{
// Examine this media type (not shown).
/* ... */
// Free the format block.
MoFreeMediaType(&mt);
++dwType;
}
Beachten Sie die folgenden Punkte zu bevorzugten Typen:
- Die DMO gibt möglicherweise einen Typ zurück, der keinen Formatblock aufweist. Beispielsweise könnte ein DMO einen Videotyp angeben, z. B. 24-Bit-RGB, ohne die Breite und Höhe des Bilds anzugeben. Wenn Sie den Typ festlegen, müssen Sie jedoch einen vollständigen Formatblock angeben. (Einige Medientypen, z. B. MIDI, erfordern nie einen Formatblock, in diesem Fall gilt diese Bemerkung nicht.)
- Die DMO muss nicht jede kombination von bevorzugten Typen unterstützen, die sie zurückgibt. Wenn ein DMO beispielsweise über zwei Streams verfügt und jeder Stream vier bevorzugte Typen aufweist, gibt es 16 mögliche Kombinationen, aber nicht alle sind garantiert gültig.
- Wenn der Client den Medientyp für einen Stream festlegt, aktualisiert die DMO möglicherweise die bevorzugten Typen für andere Streams, um den neuen Zustand widerzuspiegeln. Dies ist jedoch nicht erforderlich.
- Für einige Streams bietet die DMO möglicherweise keine bevorzugten Typen. In der Regel sollte eine DMO mindestens einige bevorzugte Typen für einige Streams anbieten.
- Die DMO muss keine vollständige Liste der Medientypen anbieten, die sie akzeptieren kann. Es kann "unadvertisierte" Typen geben, die von der DMO unterstützt, aber nicht als bevorzugte Typen angeboten werden.
Kurz gesagt, der Client sollte die bevorzugten Typen nur als Richtlinien behandeln. Die einzige Möglichkeit, um zu wissen, welche Typen unterstützt werden, besteht darin, sie zu testen, wie im nächsten Abschnitt beschrieben.
Festlegen des Medientyps für einen Stream
Verwenden Sie die Methoden IMediaObject::SetInputType und IMediaObject::SetOutputType , um den Typ für jeden Stream festzulegen. Sie müssen eine DMO_MEDIA_TYPE Struktur angeben, die eine vollständige Beschreibung des Medientyps enthält. Im folgenden Beispiel wird der Medientyp für den Eingabestream 0 mit 44,1 kHz 16-Bit-Stereo-PCM-Audio festgelegt:
DMO_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(DMO_MEDIA_TYPE));
// Allocate memory for the format block.
HRESULT hr = MoInitMediaType(&mt, sizeof(WAVEFORMATEX));
if (SUCCEEDED(hr))
{
// Set the type GUIDs.
mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;
// Initialize the format block.
WAVEFORMATEX *pWave = reinterpret_cast<WAVEFORMATEX*>(mt.pbFormat);
pWave->wFormatTag = WAVE_FORMAT_PCM;
pWave->nChannels = 2;
pWave->nSamplesPerSec = 44100;
pWave->wBitsPerSample = 16;
pWave->nBlockAlign = (pWave->nChannels * pWave->wBitsPerSample) / 8;
pWave->nAvgBytesPerSec = pWave->nSamplesPerSec * pWave->nBlockAlign;
pWave->cbSize = 0;
// Set the media type.
hr = pDMO->SetInputType(0, &mt, 0);
// Release the format block.
MoFreeMediaType(&mt);
}
Um einen Medientyp zu testen, ohne ihn festzulegen, rufen Sie SetInputType oder SetOutputType mit dem flag DMO_SET_TYPEF_TEST_ONLY auf. Die -Methode gibt S_OK zurück, wenn der Typ akzeptabel ist, oder S_FALSE andernfalls:
if (S_OK == pDMO->SetInputType(0, &mt, DMO_SET_TYPEF_TEST_ONLY)
{
// Media type is OK.
}
Da sich die Einstellungen für einen Stream auf einen anderen Stream auswirken können, müssen Sie möglicherweise den Medientyp eines Datenstroms löschen. Rufen Sie hierzu SetInputType oder SetOutputType mit dem flag DMO_SET_TYPEF_CLEAR auf.
Bei einem Decoder-DMO legt der Client in der Regel zuerst den Eingabetyp fest und wählt dann einen Ausgabetyp aus. Bei einem Encoder-DMO legt der Client zuerst den Ausgabetyp und dann den Eingabetyp fest.
Zugehörige Themen