Udostępnij przez


Informacje o MFTs

Przekształcenia programu Media Foundation (MFTs) zapewniają ogólny model przetwarzania danych multimedialnych. MFTs są używane do dekodatorów, koderów i cyfrowych procesorów sygnałów (DSP). Krótko mówiąc, wszystko, co znajduje się w przepływie danych multimedialnych między źródłem multimediów a odbiornikiem multimediów, jest MFT.

W przypadku większości aplikacji szczegóły przetwarzania danych MFT są ukryte przez wyższe warstwy architektury programu Media Foundation. Wiele aplikacji Media Foundation nigdy nie wykona bezpośrednich wywołań do MFT. Jednak z pewnością istnieje możliwość hostowania MFT bezpośrednio w aplikacji.

MFTs to ewolucja modelu transformacji po raz pierwszy wprowadzona za pomocą obiektów multimedialnych DirectX (DMO). W rzeczywistości stosunkowo łatwo jest utworzyć transformację, która obsługuje oba modele. W porównaniu z obiektami DMO wymagane zachowania jednostek MFT są bardziej wyraźnie określone, co ułatwia napisanie poprawnej implementacji. Ponadto MFTs może obsługiwać przyspieszane sprzętowo przetwarzanie wideo.

Ten temat zawiera krótkie omówienie modelu przetwarzania MFT, koncentrując się na ogólnym projekcie, a nie na konkretnych wywołaniach metod. Aby uzyskać bardziej szczegółowy opis krok po kroku, zobacz Podstawowy Model Przetwarzania MFT.

Strumienie

Rozwiązanie MFT ma strumienie wejściowe i strumienie wyjściowe. Strumienie wejściowe odbierają dane, a strumienie wyjściowe generują dane. Na przykład dekoder ma jeden strumień wejściowy, który odbiera zakodowane dane i jeden strumień wyjściowy, który generuje zdekodowane dane.

Strumienie na MFT nie są reprezentowane jako odrębne obiekty COM. Zamiast tego każdy strumień ma wyznaczony identyfikator strumienia, a metody w interfejsie IMFTransform przyjmują identyfikatory strumienia jako parametry wejściowe.

Niektóre MFT mają stałą liczbę strumieni. Na przykład dekodatory i kodery zwykle mają dokładnie jedno wejście i jedno wyjście. Inne MFT-y mają dynamiczną liczbę strumieni. Jeśli platforma MFT obsługuje strumienie dynamiczne, klient może dodać nowe strumienie wejściowe. Klient nie może dodawać strumieni wyjściowych, ale MFT może dodawać lub usuwać strumienie wyjściowe podczas przetwarzania. Na przykład multipleksery zazwyczaj umożliwiają klientowi dodawanie strumieni wejściowych i posiadanie jednego wyjścia dla strumienia multipleksowanego. Demultipleksery działają na odwrót: mają jedno wejście, ale dynamiczną liczbę strumieni wyjściowych, która zależy od zawartości strumienia wejściowego. Poniższa ilustracja przedstawia różnicę między multiplekserem a demultiplekserem.

diagram przedstawiający koder/dekoder (1 wejście, 1 wyjście), multiplekser (2 wejścia, 1 wyjście) i demultiplexer (1 wejście, 2 wyjścia)

Typy multimediów

Po pierwszym utworzeniu protokołu MFT żaden ze strumieni nie ma ustalonego formatu. Przed rozpoczęciem przetwarzania danych przez MFT klient musi ustawić formaty strumieni. Na przykład w przypadku dekodera format wejściowy jest formatem kompresji używanym w oryginalnym pliku źródłowym, a format wyjściowy jest formatem nieskompresowanym, takim jak wideo PCM lub RGB. Formaty strumieni są opisane przy użyciu typów multimediów .

W zależności od wewnętrznego stanu MFT może ona zawierać listę możliwych typów multimediów dla każdego strumienia. Tej listy można użyć jako wskazówki podczas ustawiania typów multimediów. Ustawienie typu nośnika w jednym strumieniu może zmienić listę możliwych typów dla drugiego strumienia. Na przykład dekoder zwykle nie może podać żadnych typów danych wyjściowych, dopóki klient nie ustawia typu danych wejściowych. Typ danych wejściowych zawiera informacje, których dekoder potrzebuje, aby zwrócić listę możliwych typów wyjściowych.

Aby ustawić typ nośnika w strumieniu, wywołaj metodę IMFTransform::SetInputType lub IMFTransform::SetOutputType. Aby uzyskać listę możliwych typów multimediów dla strumienia, wywołaj metodę IMFTransform::GetInputAvailableType lub IMFTransform::GetOutputAvailableType.

Przetwarzanie danych

Gdy klient ustawia typy multimediów w strumieniach, usługa MFT jest gotowa do przetwarzania danych. Aby tak się stało, klient naprzemiennie dostarcza dane wejściowe do MFT i pobiera dane wyjściowe z MFT.

Metoda ProcessInput pobiera wskaźnik do próbki multimediów przydzielonej przez klienta. Próbka medialna zawiera jeden lub więcej buforów, a każdy bufor zawiera dane wejściowe do przetworzenia przez MFT.

Metoda ProcessOutput obsługuje dwa różne modele alokacji: MFT przydziela bufory wyjściowe lub klient przydziela bufory wyjściowe. Niektóre MFT obsługują oba modele alokacji, ale nie jest wymagane, aby platforma MFT obsługiwała oba te modele. Na przykład MFT może wymagać od klienta przydzielenia buforów wyjściowych. Metoda IMFTransform::GetOutputStreamInfo zwraca informacje o strumieniu wyjściowym, w tym model alokacji, który obsługuje MFT.

MFTs są zaprojektowane tak, aby buforować jak najmniej danych, aby zminimalizować opóźnienia w ścieżce przetwarzania. W związku z tym w danym momencie MFT może sygnalizować jeden z następujących warunków:

  • MFT wymaga większej ilości danych wejściowych. W tym stanie MFT nie może wygenerować danych wyjściowych, dopóki klient nie wywoła ProcessInput co najmniej raz.
  • MFT nie zaakceptuje więcej danych wejściowych, dopóki klient nie wywoła ProcessOutput co najmniej raz.

Załóżmy na przykład, że używasz dekodera wideo do dekodowania strumienia wideo zawierającego kombinację klatek kluczowych i klatek delta. Początkowo MFT wymaga pewnych danych wejściowych, zanim będzie można zdekodować dowolne ramki. Klient wywołuje ProcessInput w celu dostarczenia pierwszej ramki. Załóżmy, że pierwsza ramka jest ramką delta (przykładowo na poniższym diagramie oznaczoną jako "P" dla przewidywanej ramki). Dekoder przechowuje tę ramkę, ale nie może wygenerować żadnych danych wyjściowych, aż do momentu, gdy uzyska następną ramkę kluczową.

diagram przedstawiający mft, który wymaga danych wejściowych, wskazując na przewidywaną ramkę

Klient nadal wywołuje ProcessInput i w końcu osiąga następną kluczową ramkę (pokazaną na następnym diagramie jako "I" dla ramki wewnątrzkodowanej). Teraz dekoder ma wystarczającą liczbę ramek, aby rozpocząć dekodowanie. W tym momencie zatrzymuje akceptowanie danych wejściowych, a klient musi wywołać ProcessOutput, aby uzyskać zdekodowane ramki.

diagram pokazujący mft, który nie przyjmuje danych wejściowych, wskazując jedną ramkę zakodowaną wewnętrznie i trzy prognozowane ramki

Najprostszym podejściem dla klienta jest po prostu naprzemienne wywoływanie ProcessInput i ProcessOutput. Bardziej zaawansowany algorytm opisano w temacie Basic MFT Processing Model.

Fundacja Medialna przekształca się