Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
[Funkce přidružená k této stránce DirectShow je starší funkce. Bylo nahrazeno MediaPlayer, IMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]
DirectShow obsahuje šablonu třídy, IMediaObjectImpl, pro implementaci DMO. Šablona zpracovává řadu úkolů "účetnictví", například ověřování vstupních parametrů. Pomocí šablony se můžete zaměřit na funkce specifické pro vaši funkci DMO. Šablona navíc pomáhá zajistit, abyste vytvořili robustní implementaci. Šablona je definována v souboru hlaviček Dmoimpl.h, který se nachází v adresáři Include sady SDK.
Šablona IMediaObjectImpl dědí rozhraní IMediaObject. Chcete-li vytvořit objekt DMO pomocí šablony, definujte novou třídu odvozenou z IMediaObjectImpl. Šablona implementuje všechny metody IMediaObject. Ve většině případů šablona volá odpovídající privátní metodu odvozené třídy. Šablona poskytuje následující funkce:
- Základní kontrola parametrů Metody šablony ověřují, že požadované parametry nejsou NULL, že indexy datových proudů jsou v povoleném rozsahu a že příznaky jsou platné.
- Zamykání. Metody šablony volají dvě interní metody, Lock a Unlock, pro serializaci operací v rámci DMO. Tato funkce zajišťuje, že DMO je bezpečné pro přístup z více vláken.
- Typy médií. Šablona ukládá typy médií nastavené klientem a poskytuje metody přistupování pro typy médií.
- Streamování. Šablona brání streamování, dokud klient nenastaví typy médií pro všechny nepovinné datové proudy. Zajišťuje také, že IMediaObject::AllocateStreamingResources metoda je volána před zahájením streamování, což zaručuje přidělení prostředků.
Odvozená třída musí implementovat IUnknown rozhraní; šablona toto rozhraní neposkytuje. Můžete použít knihovnu Active Template Library (ATL) k implementaci IUnknown, nebo můžete poskytnout jinou implementaci. Šablona také neimplementuje mechanismus uzamčení. Odvozená třída musí implementovat Lock a Unlock metody. Pokud třídu vytvoříte pomocí knihovny ATL, můžete použít výchozí implementace ATL.
deklarování odvozené třídy
Šablona třídy IMediaObjectImpl je deklarována následujícím způsobem:
template <class _DERIVED_, int NUMBEROFINPUTS, int NUMBEROFOUTPUTS>
class IMediaObjectImpl : public ImediaObject
Tři parametry šablony jsou _DERIVED_, NUMBEROFINPUTS a NUMBEROFOUTPUTS. Nastavte _DERIVED_ rovno jménu vaší třídy. Další dva parametry definují počet vstupních datových proudů a výstupních datových proudů v DMO. Pokud například chcete vytvořit třídu DMO s názvem CMyDmo, která podporuje jeden vstupní datový proud a dva výstupní streamy, použijte následující deklaraci:
class CMyDmo : public IMediaObjectImpl<CMyDmo, 1, 2>
Zbývající část této části popisuje, jak šablona implementuje různé metody v IMediaObject.
metody nastavení typů médií
Následující metody nastavují nebo načítají typy médií v objektu DMO:
- GetInputType, GetOutputType. Tyto metody vrací upřednostňované typy médií podle čísla datového proudu a indexu typu. Šablona volá InternalGetInputType nebo InternalGetOutputType v odvozené třídě.
- SetInputType, SetOutputType. Tyto metody nastaví typ média ve streamu, otestují typ média nebo vymažou typ média. Chcete-li ověřit typ média, šablona volá InternalCheckInputType nebo InternalCheckOutputType v odvozené třídě. Odvozená třída vrátí S_OK, aby typ přijala, nebo DMO_E_INVALIDTYPE, aby typ odmítla. Šablona řídí nastavení nebo vymazání typu média.
- GetInputCurrentType, GetOutputCurrentType. Tyto metody vrátí aktuální typ média pro datový proud nebo DMO_E_TYPE_NOT_SET, pokud není nastaven žádný typ. Šablona tyto metody zcela implementuje.
informační metody
Následující metody poskytují informace o objektu DMO.
- GetInputMaxLatency, SetInputMaxLatency. Tyto metody načítají nebo nastavují maximální latenci. Šablona volá InternalGetInputMaxLatency nebo InternalSetInputMaxLatency odvozené třídy.
- GetInputSizeInfo, GetOutputSizeInfo. Tyto metody vracejí požadavky na vyrovnávací paměť DMO pro zadaný datový proud. Pokud v daném datovém proudu nebyl nastaven žádný typ média, šablona vrátí DMO_E_TYPE_NOT_SET. Jinak volá InternalGetInputSizeInfo nebo InternalGetOutputSizeInfo v rámci odvozené třídy.
- GetInputStreamInfo, GetOutputStreamInfo. Tyto metody vrací různé příznaky, které označují, jak má klient formátovat data. Šablona volá InternalGetInputStreamInfo nebo InternalGetOutputStreamInfo u instance odvozené třídy.
- GetStreamCount. Tato metoda vrátí počet vstupních a výstupních datových proudů. Šablona implementuje tuto metodu pomocí parametrů šablony.
metody přidělování prostředků
- Metoda AllocateStreamingResources přiděluje všechny prostředky, které DMO potřebuje před zahájením streamování. Metoda FreeStreamingResources uvolní stejné prostředky. Šablona volá InternalAllocateStreamingResources a InternalFreeStreamingResources.
Klient DMO není povinen volat tyto metody, ale šablona automaticky volá AllocateStreamingResources před zahájením streamování. Proto DMO může předpokládat, že v okamžiku volání ProcessInput jsou prostředky správně přiděleny. Ten DMO by měl volat FreeStreamingResources ve svém destruktoru.
Také, když šablona volá InternalAllocateStreamingResources, nastaví interní příznak, aby tuto metodu znovu nevolala, dokud nevolá InternalFreeStreamingResources. Tím se zajistí, že se prostředky nechtěně nepřidělí, což by mohlo způsobit úniky paměti.
Metody pro streamování
K streamování dat se používají následující metody:
- GetInputStatus. Tato metoda označuje, zda DMO může přijmout vstup v tuto chvíli. Šablona volá InternalAcceptingInput na objektu odvozené třídy. Pokud DMO může přijmout vstup, odvozená třída vrátí S_OK a šablona nastaví bit DMO_INPUT_STATUSF_ACCEPT_DATA v parametru dwFlags. V opačném případě odvozená třída vrátí S_FALSE a šablona nastaví dwFlags na nulu.
- ProcessInput. Tato metoda zpracovává vstupní vyrovnávací paměť. Šablona volá AllocateStreamingResources, popsané výše. Potom volá InternalAcceptingInput v odvozené třídě. Pokud DMO dokáže přijmout nový vstup, šablona volá InternalProcessInput.
- ProcessOutput. Tato metoda zpracovává sadu výstupních vyrovnávacích pamětí, jednu vyrovnávací paměť pro každý výstupní datový proud. Šablona volá AllocateStreamingResources a pak InternalProcessOutput.
- diskontinuita. Tato metoda signalizuje přerušení ve vstupním datovém proudu. Šablona volá InternalAcceptingInput odvozené třídy. Pokud tato metoda vrátí S_OK, šablona zavolá metodu InternalDiscontinuity na odvozenou třídu.
- Vyprázdnit. Tato metoda vyprázdní DMO. Šablona volá InternalFlush u odvozené třídy. DMO by měl zahodit všechny vstupní vyrovnávací paměti, které stále uchovává ke zpracování.
Šablona neposkytuje žádnou přímou podporu pro rozhraní IMediaObjectInPlace.
Metody pro uzamčení
Uzamčení se používá k ochraně stavu DMO v prostředí s více vlákny. V projektu ATL způsobí metoda IMediaObject::Lock konflikt názvu s metodou ATL Lock. Chcete-li vyřešit konflikt, šablona přejmenuje metodu IMediaObject na DMOLock. Při kompilaci odvozené třídy definujte FIX_LOCK_NAME před zahrnutím souboru hlaviček Dmo.h:
#define FIX_LOCK_NAME
#include <dmo.h>
Tato direktiva způsobí, že preprocesor nahradí DMOLock pro Lock v deklaraci rozhraní IMediaObject. Aplikace stále mohou vyvolat metodu pomocí názvu Lock, protože pořadí vtable se nezmění. Metoda DMOLock volá Lock nebo Unlock na odvozené třídě. Pokud k implementaci odvozené třídy používáte ATL, jsou tyto metody již definovány atL, takže není nutný žádný další kód. Pokud nepoužíváte ATL, musíte ve své odvozené třídě poskytnout metody Lock a Unlock.
Šablona automaticky uzamkne objekt DMO v každé z metod IMediaObject. Odvozená třída může potřebovat uzamknout DMO uvnitř jiných veřejných metod, které implementuje (například pokud podporuje IMediaObjectInPlace). Šablona třídy také poskytuje interní pomocnou třídu, IMediaObjectImpl::LockIt, což je užitečné pro uzamčení a odemknutí objektu DMO.
souhrnu
U následujících metod IMediaObject šablona volá odpovídající metodu se stejnou signaturou v odvozené třídě. Odvozená třída musí implementovat všechny metody uvedené ve druhém sloupci.
| IMediaObject – metoda | Odvozená třída – metoda |
|---|---|
| AllocateStreamingResources | InternalAllocateStreamingResources |
| přerušení | InternalDiscontinuity |
| Propláchnutí | InternalFlush |
| ZdarmaStreamingovéZdroje | InternalFreeStreamingResources |
| GetInputMaxLatency | InternalGetInputMaxLatency |
| GetInputSizeInfo | InternalGetInputSizeInfo |
| GetInputStreamInfo | InternalGetInputStreamInfo |
| GetInputType | InternalGetInputType |
| GetOutputSizeInfo | InternalGetOutputSizeInfo |
| GetOutputStreamInfo | InternalGetOutputStreamInfo |
| GetOutputType | InternalGetOutputType |
| ZpracovatVstup | InternalProcessInput |
| ProcessOutput | InternalProcessOutput |
| SetInputMaxLatency | InternalSetInputMaxLatency |
Pro zbývající IMediaObject metody neexistuje 1:1 korespondence mezi metodami šablony a metodami odvozené třídy. Následující tabulka shrnuje, které metody jsou plně implementovány šablonou a které metody volají jiné metody odvozené třídy.
| IMediaObject – metoda | Metoda odvozené třídy |
|---|---|
| ZískejTypVstupníhoProudu | Plně implementováno |
| GetOutputCurrentType | Plně implementováno |
| GetStreamCount | Plně implementováno |
| GetInputStatus | InternalAcceptingInput |
| Lock (implementovaný jako DMOLock) | Uzamknout, odemknout |
| SetInputType | InternalCheckInputType |
| SetOutputType | InternalCheckOutputType |
Související témata