Przeplot wideo
W tym temacie opisano, jak źródła multimediów i dekodatory powinny obsługiwać zawartość wideo z przeplotem.
Aby poprawnie zdekodować i renderować przeplatane wideo, potrzebne są następujące informacje:
Progresywne lub przeplatane. Strumień wideo może zawierać ramki progresywne, ramki z przeplotem lub kombinację obu tych ramek.
Dominacja pola. Dominacja pola opisuje, które pole pojawia się jako pierwsze, górne pole lub dolne pole.
Powtórz pierwsze pole. Ta flaga jest używana w ściąganiu 3:2, gdy ramka jest progresywna, ale strumień jest przeplatany. W tym kontekście pierwszym polem może być górne lub dolne pole.
Przeplatane pola lub jedno pole. Przykład może zawierać jedno pole lub dwa przeplatane pola. Jeśli próbka zawiera jedno pole, wysokość próbki wynosi połowę wysokości ramki, ponieważ próbka zawiera tylko połowę linii skanowania dla ramki. Pola przeplatane są zalecane, chyba że właściwości zawartości źródłowej określają inaczej.
Każda z tych cech może ulec zmianie z jednej próbki na następną. Jednak składniki wideo muszą wiedzieć coś o ogólnej zawartości przed rozpoczęciem przesyłania strumieniowego. Jeśli na przykład wideo jest przeplatane, ulepszony moduł renderowania wideo (EVR) musi zarezerwować pamięć wideo na potrzeby usuwania przeplotu. Jeśli wideo jest całkowicie progresywne, z drugiej strony EVR może zoptymalizować potok renderowania. Dodanie kroku deinterlacingu do potoku zwiększa opóźnienie renderowania.
Informacje o przeplotach są przechowywane w dwóch miejscach:
Ogólne informacje o przeplotach w strumieniu są umieszczane w typie nośnika. Aby uzyskać więcej informacji na temat typów multimediów, zobacz Typy multimediów.
Informacje, które można zmienić przy użyciu każdej próbki, są umieszczane w przykładzie jako atrybut. Aby uzyskać więcej informacji na temat przykładów, zobacz Media Samples.
Informacje o przeplotu w typie nośnika
Atrybut MF_MT_INTERLACE_MODE w typie nośnika opisuje sposób przeplotu strumienia jako całości. Wartość tego atrybutu jest członkiem wyliczenia MFVideoInterlaceMode. Typ nośnika wideo powinien zawsze mieć ten atrybut.
- Jeśli strumień zawiera tylko ramki progresywne, bez ramek przeplotowych, użyj MFVideoInterlace_Progressive.
- Jeśli strumień zawiera tylko ramki z przeplotem, a każda próbka zawiera dwa przeplatane pola, użyj MFVideoInterlace_FieldInterleavedUpperFirst lub MFVideoInterlace_FieldInterleavedLowerFirst.
- Jeśli strumień zawiera tylko ramki z przeplotem, a każda próbka zawiera jedno pole, użyj MFVideoInterlace_FieldSingleUpper lub MFVideoInterlace_FieldSingleLower. Jeśli pola są alternatywne między górnymi i dolnymi, nie ma znaczenia, która z tych dwóch wartości jest używana. Jeśli format zawiera tylko górne pola lub tylko dolne pola, ustaw wartość odpowiadającą zawartości.
- Jeśli strumień zawiera mieszankę ramek przeplatanych i progresywnych lub jeśli przełączniki dominacji pola, ustaw typ nośnika na MFVideoInterlace_MixedInterlaceOrProgressive. Użyj przykładowych atrybutów, aby opisać każdą ramkę.
Poniższa tabela zawiera podsumowanie tego atrybutu.
MF_MT_INTERLACE_MODE | Introligatorska? | Próbki | Pierwsze pole |
---|---|---|---|
MFVideoInterlace_Progressive | Nie | Ramka progresywna | Nie dotyczy |
MFVideoInterlace_FieldInterleavedUpperFirst | Tak | Pola przeplatane | Pierwszy górny |
MFVideoInterlace_FieldInterleavedLowerFirst | Tak | Pola przeplatane | Pierwszy dolny |
MFVideoInterlace_FieldSingleUpper | Tak | Jedno pole | Pierwszy górny |
MFVideoInterlace_FieldSingleLower | Tak | Jedno pole | Pierwszy dolny |
MFVideoInterlace_MixedInterlaceOrProgressive | Może się różnić | Przeplatane pola lub ramki progresywne | Może się różnić |
Nie można mieszać przeplatanych pól i pojedynczych pól. Przełączenie z jednego do drugiego wymaga zmiany typu nośnika.
Flagi przeplotu dla przykładów
Informacje, które mogą zmienić się z jednej próbki na następną, są wskazywane przy użyciu przykładowych atrybutów. Użyj interfejsuIMFSample, aby pobrać lub ustawić te atrybuty.
Wszystkie atrybuty przeplotu wymienione w tej sekcji mają wartości logiczne. W rzeczywistości każdy z tych atrybutów może mieć trzy wartości: true, FALSElub nie ustawiono. Jeśli atrybut nie jest ustawiony, wartość jest pobierana z typu nośnika. Jeśli atrybut jest ustawiony, wartość zastępuje typ nośnika. Niektóre kombinacje flag i typów multimediów są nieprawidłowe.
Atrybut | Opis |
---|---|
MFSampleExtension_Interlaced | Jeśli true, ramka jest przeplatana. Jeśli false, ramka jest progresywna. Ustaw ten atrybut na każdym przykładzie, jeśli typ nośnika jest MFVideoInterlace_MixedInterlaceOrProgressive. |
MFSampleExtension_BottomFieldFirst | Znaczenie tej flagi zależy od tego, czy próbki zawierają przeplatane pola, czy pojedyncze pola.
|
MFSampleExtension_RepeatFirstField | Jeśli true, pierwsze pole zostanie powtórzone. Jeśli wartość FALSE lub nie jest ustawiona, pierwsze pole nie zostanie powtórzone. |
MFSampleExtension_SingleField | Jeśli true, przykład zawiera jedno pole. Jeśli false, przykład zawiera przeplatane pola. |
W poniższej tabeli przedstawiono, które flagi są wymagane, opcjonalne lub zabronione, na podstawie typu nośnika.
Typ nośnika | Flaga przeplotowa | Flaga BottomFieldFirst | RepeatFirstField Flaga | Flaga pojedynczego pola |
---|---|---|---|---|
Postępowy | Fakultatywny; w przypadku ustawienia musi mieć wartość FALSE. | Nie ustawiaj. | Nie ustawiaj. | Nie ustawiaj. |
Pola przeplatane | Fakultatywny; w przypadku ustawienia musi mieć wartość TRUE. | Fakultatywny; jeśli jest ustawiona, musi być zgodna z typem nośnika. | Nie ustawiaj. | Fakultatywny; w przypadku ustawienia musi mieć wartość FALSE. |
Pojedyncze pola | Fakultatywny; w przypadku ustawienia musi mieć wartość TRUE. | Wymagane. | Nie ustawiaj. | Ustaw wartość true. |
Mieszany | Wymagane. | Wymagane. | Wymagane. | Fakultatywny; w przypadku ustawienia musi mieć wartość FALSE. |
W przypadkach, gdy atrybut jest opcjonalny, typ nośnika już definiuje informacje. Jest prawidłowy, aby ustawić atrybut do dopasowania, ale nie jest wymagany.
Na przykład jeśli typ nośnika jest MFVideoInterlace_Progressive, oznacza to, że wszystkie ramki w strumieniu są progresywne. W związku z tym można ustawić atrybut MFSampleExtension_Interlaced na wartość FALSElub pozostawić atrybut niezastawiony.
Zalecenia
Ta sekcja zawiera zalecenia dotyczące różnych typów zawartości.
- Wideo to wszystkie ramki progresywne.
Ustaw typ nośnika na MFVideoInterlace_Progressive.
Nie należy ustawiać atrybutu MFSampleExtension_Interlaced ani ustawiać go na wartość FALSE na każdej ramce.
Nie należy ustawiać atrybutów MFSampleExtension_BottomFieldFirst, MFSampleExtension_RepeatFirstFieldani MFSampleExtension_SingleField.
- Film jest wszystkimi polami przeplatanymi z tą samą dominacją pola. Przykłady zawierają przeplatane pola.
Ustaw typ nośnika na MFVideoInterlace_FieldInterleavedUpperFirst lub MFVideoInterlace_FieldInterleavedLowerFirst.
Nie należy ustawiać atrybutu MFSampleExtension_Interlaced ani ustawiać go na wartość true na każdej ramce.
Nie należy ustawiać atrybutu MFSampleExtension_BottomFieldFirst ani ustawiać wartości dla każdej ramki tak, aby odpowiadała typowi nośnika.
Nie należy ustawiać atrybutu MFSampleExtension_RepeatFirstField ani ustawiać go na wartość FALSE na każdej ramce.
Nie należy ustawiać atrybutu MFSampleExtension_SingleField ani ustawiać go na wartość FALSE na każdej ramce.
- Film zawiera mieszankę ramek przeplatanych i progresywnych, z powtarzającymi się polami i różną dominacją pola (na przykład wideo DVD).
Ustaw typ nośnika na MFVideoInterlace_MixedInterlaceOrProgressive.
Na każdej ramce ustaw atrybuty MFSampleExtension_Interlaced, MFSampleExtension_BottomFieldFirsti MFSampleExtension_RepeatFirstField.
Nie należy ustawiać atrybutu MFSampleExtension_SingleField ani ustawiać go na wartość FALSE na każdej ramce.
- Wideo jest przeplatane i przykłady zawierają pojedyncze pola.
Ustaw typ nośnika na MFVideoInterlace_FieldSingleUpper lub MFVideoInterlace_FieldSingleLower.
Na każdej ramce ustaw atrybut MFSampleExtension_BottomFieldFirst.
Nie należy ustawiać atrybutu MFSampleExtension_Interlaced ani ustawiać go na wartość true na każdej ramce.
Nie należy ustawiać atrybutu MFSampleExtension_RepeatFirstField ani ustawiać go na wartość FALSE na każdej ramce.
Nie należy ustawiać atrybutu MFSampleExtension_SingleField ani ustawiać go na wartość true na każdej ramce.
Większość zawartości wideo należy do jednej z tych kategorii.
Mapowania MPEG-2
W przypadku zawartości MPEG-2 użyj następujących mapowań, aby przekonwertować flagi MPEG-2 na przykładowe atrybuty programu Media Foundation.
picture_structure
Wartość | Przykładowy atrybut |
---|---|
ramka | MFSampleExtension_SingleField = FALSE |
top_field |
MFSampleExtension_SingleField = true MFSampleExtension_BottomFieldFirst = FALSE |
bottom_field |
MFSampleExtension_SingleField = true MFSampleExtension_BottomFieldFirst = true |
progressive_frame
Wartość | Przykładowy atrybut |
---|---|
0 | MFSampleExtension_Interlaced = true |
1 | MFSampleExtension_Interlaced = FALSE |
top_field_first
Wartość | Przykładowy atrybut |
---|---|
0 | MFSampleExtension_BottomFieldFirst = true |
1 | MFSampleExtension_BottomFieldFirst = FALSE |
repeat_first_field
Wartość | Przykładowy atrybut |
---|---|
0 | MFSampleExtension_RepeatFirstField = FALSE |
1 | MFSampleExtension_RepeatFirstField = true |
przykłady Single-Field
Jeśli typ nośnika jest MFVideoInterlace_FieldSingleUpper lub MFVideoInterlace_FieldSingleLower, oznacza to, że każda próbka zawiera jedno pole. Jednak typ nośnika opisuje całą ramkę. W związku z tym każdy bufor zawiera tylko połowę liczby wierszy pól podanych w typie nośnika. Jeśli na przykład typ nośnika opisuje wideo jako 720 × 480, każde pole zawiera 240 wierszy skanowania, a zatem każdy bufor zawiera tylko 240 wierszy pikseli. Jeśli piszesz składnik, który akceptuje typy multimediów z przykładami z pojedynczym polem, należy wziąć pod uwagę ten fakt podczas uzyskiwania dostępu do danych w buforze.
Ta sama zasada ma zastosowanie do przysłony geometrycznej (atrybutMF_MT_GEOMETRIC_APERTURE) i minimalnej przysłony wyświetlania (MF_MT_MINIMUM_DISPLAY_APERTURE atrybutu). Te regiony są określane pod względem całej ramki, a nie poszczególnych pól.
Mapowania directshow
W programie DirectShow informacje o przeplotach na próbkę znajdują się w dwTypeSpecificFlags składowej struktury AM_SAMPLE2_PROPERTIES. W poniższej tabeli przedstawiono równoważne atrybuty programu Media Foundation.
Przykładowa flaga DirectShow | Przykładowy atrybut programu Media Foundation |
---|---|
AM_VIDEO_FLAG_INTERLEAVED_FRAME | MFSampleExtension_SingleField = FALSE. |
AM_VIDEO_FLAG_FIELD1 |
MFSampleExtension_Interlaced = true. MFSampleExtension_SingleField = true. MFSampleExtension_BottomFieldFirst = FALSE. |
AM_VIDEO_FLAG_FIELD2 |
MFSampleExtension_Interlaced = true. MFSampleExtension_SingleField = true. MFSampleExtension_BottomFieldFirst = true. |
AM_VIDEO_FLAG_WEAVE | MFSampleExtension_Interlaced = false. (Ta flaga wskazuje, że sterownik nie powinien deinterlace dwóch pól). |
AM_VIDEO_FLAG_FIELD1FIRST | MFSampleExtension_BottomFieldFirst = FALSE. Jeśli zawartość jest przeplatana i flaga AM_VIDEO_FLAG_FIELD1FIRST nie jest obecna, ustaw ten atrybut na wartość true. |
AM_VIDEO_FLAG_REPEAT_FIELD | MFSampleExtension_RepeatFirstField = true. Jeśli flaga AM_VIDEO_FLAG_REPEAT_FIELD nie jest obecna, ustaw ten atrybut na wartość FALSE. |
Jeśli przykład DirectShow nie zawiera przykładowych flag, użyj wartości dwInterlaceFlags ze struktury VIDEOINFOHEADER2:
Flaga przeplotu DirectShow | Przykładowy atrybut programu Media Foundation |
---|---|
AMINTERLACE_IsInterlaced | MFSampleExtension_Interlaced = true. |
AMINTERLACE_1FieldPerSample | MFSampleExtension_SingleField = true. |
AMINTERLACE_Field1First | MFSampleExtension_BottomFieldFirst = FALSE. |
Tematy pokrewne