Videoflätning
Det här avsnittet beskriver hur mediekällor och avkodare ska hantera sammanflätat videoinnehåll.
För att avkoda och återge sammanflätad video korrekt krävs följande information:
Progressiv eller sammanflätad. En videoström kan innehålla progressiva ramar, sammanflätade ramar eller en blandning av båda.
Fältdominans. Fältdominans beskriver vilket fält som visas först, det övre fältet eller det nedre fältet.
Upprepa det första fältet. Den här flaggan används i 3:2-hämtningen när ramen är progressiv men strömmen är sammanflätad. I det här sammanhanget kan det första fältet vara det övre eller nedre fältet.
Mellanlagrade fält eller enkla fält. Ett exempel kan innehålla antingen ett enda fält eller två interfolierade fält. Om ett exempel innehåller ett enda fält är exempelhöjden hälften av bildrutehöjden, eftersom exemplet endast innehåller hälften av genomsökningslinjerna för en ram. Interfolierade fält rekommenderas om inte källinnehållets egenskaper avgör något annat.
Alla dessa egenskaper kan ändras från ett exempel till ett annat. Videokomponenter behöver dock veta något om det övergripande innehållet innan strömningen börjar. Om videon till exempel är sammanflätad måste den förbättrade videoåtergivningen (EVR) reservera videominne för deinterlacing. Om videon är helt progressiv kan EVR å andra sidan optimera återgivningspipelinen. Om du lägger till ett deinterlacing-steg i pipelinen ökar svarstiden för återgivningen.
Information om sammanflätning lagras på två platser:
Allmän information om sammanflätningen i en ström placeras i medietypen. Mer information om medietyper finns i Medietyper.
Information som kan ändras med varje exempel placeras i exemplet som ett attribut. Mer information om exempel finns i Media Samples.
Sammanflätningsinformation i medietypen
Attributet MF_MT_INTERLACE_MODE på medietypen beskriver hur strömmen som helhet är sammanflätad. Värdet för det här attributet är medlem i MFVideoInterlaceMode uppräkning. En videomedietyp bör alltid ha det här attributet.
- Om strömmen endast innehåller progressiva ramar, utan sammanflätade bildrutor, använder du MFVideoInterlace_Progressive.
- Om strömmen endast innehåller sammanflätade bildrutor och varje exempel innehåller två interfolierade fält använder du MFVideoInterlace_FieldInterleavedUpperFirst eller MFVideoInterlace_FieldInterleavedLowerFirst.
- Om strömmen endast innehåller sammanflätade bildrutor och varje exempel innehåller ett enda fält använder du MFVideoInterlace_FieldSingleUpper eller MFVideoInterlace_FieldSingleLower. Om fälten växlar mellan övre och nedre, spelar det ingen roll vilket av dessa två värden som används. Om formatet bara innehåller övre fält, eller bara lägre fält, anger du det värde som motsvarar innehållet.
- Om strömmen innehåller en blandning av sammanflätade och progressiva ramar, eller om fältdominansen växlar, anger du medietypen till MFVideoInterlace_MixedInterlaceOrProgressive. Använd exempelattribut för att beskriva varje bildruta.
Följande tabell sammanfattar det här attributet.
MF_MT_INTERLACE_MODE | Sammanflätad? | Prover | Första fältet |
---|---|---|---|
MFVideoInterlace_Progressive | Nej | Progressiv ram | Ej tillämpligt |
MFVideoInterlace_FieldInterleavedUpperFirst | Ja | Interfolierade fält | Övre först |
MFVideoInterlace_FieldInterleavedLowerFirst | Ja | Interfolierade fält | Lägre först |
MFVideoInterlace_FieldSingleUpper | Ja | Enskilt fält | Övre först |
MFVideoInterlace_FieldSingleLower | Ja | Enskilt fält | Lägre först |
MFVideoInterlace_MixedInterlaceOrProgressive | Kan variera | Mellanlagrade fält eller progressiva ramar | Kan variera |
Interfolierade fält och enkla fält kan inte blandas. Om du växlar från en till en annan krävs en ändring av medietypen.
Sammanfläta flaggor på exempel
Information som kan ändras från ett exempel till nästa anges med hjälp av exempelattribut. Använd IMFSample--gränssnittet för att hämta eller ange dessa attribut.
Alla sammanflätningsattribut som anges i det här avsnittet har booleska värden. I själva verket kan var och en av dessa attribut ha tre värden: antingen TRUE, FALSEeller inte. Om ett attribut inte har angetts hämtas värdet från medietypen. Om ett attribut anges åsidosätter värdet medietypen. Vissa kombinationer av flaggor och medietyper är inte giltiga.
Attribut | Beskrivning |
---|---|
MFSampleExtension_Interlaced | Om TRUEär ramen sammanflätad. Om FALSEär ramen progressiv. Ange det här attributet för varje exempel om medietypen är MFVideoInterlace_MixedInterlaceOrProgressive. |
MFSampleExtension_BottomFieldFirst | Betydelsen av den här flaggan beror på om exemplen innehåller interfolierade fält eller enkla fält.
|
MFSampleExtension_RepeatFirstField | Om TRUEupprepas det första fältet. Om FALSE eller inte anges upprepas inte det första fältet. |
MFSampleExtension_SingleField | Om TRUEinnehåller exemplet ett enda fält. Om FALSEinnehåller exemplet mellanlagrade fält. |
I följande tabell visas vilka flaggor som krävs, är valfria eller förbjudna baserat på medietypen.
Medietyp | Sammanflätad flagga | BottomFieldFirst-flagga | RepeatFirstField-flagga | SingleField-flagga |
---|---|---|---|---|
Progressiv | Valfri; måste vara FALSE. | Ställ inte in. | Ställ inte in. | Ställ inte in. |
Interfolierade fält | Valfri; måste vara TRUE. | Valfri; måste matcha medietypen om den har angetts. | Ställ inte in. | Valfri; måste vara FALSE. |
Enkla fält | Valfri; måste vara TRUE. | Krävs. | Ställ inte in. | Ange till TRUE. |
Blandad | Krävs. | Krävs. | Krävs. | Valfri; måste vara FALSE. |
I de fall där attributet är valfritt definierar medietypen redan informationen. Det är giltigt att ange attributet så att det matchar, men krävs inte.
Om medietypen till exempel är MFVideoInterlace_Progressive innebär det att alla bildrutor i strömmen är progressiva. Därför kan du antingen ange attributet MFSampleExtension_Interlaced till FALSEeller lämna attributet oetat.
Rekommendationer
Det här avsnittet innehåller rekommendationer för olika typer av innehåll.
- Videon är alla progressiva ramar.
Ange medietypen till MFVideoInterlace_Progressive.
Ange inte attributet MFSampleExtension_Interlaced eller ange det till FALSE- på varje bildruta.
Ange inte attributen MFSampleExtension_BottomFieldFirst, MFSampleExtension_RepeatFirstFieldeller MFSampleExtension_SingleField.
- Videon är alla sammanflätade fält med samma fältdominans. Exempel innehåller interfolierade fält.
Ange medietypen till MFVideoInterlace_FieldInterleavedUpperFirst eller MFVideoInterlace_FieldInterleavedLowerFirst.
Ange inte attributet MFSampleExtension_Interlaced eller ange det till TRUE- på varje bildruta.
Ange inte attributet MFSampleExtension_BottomFieldFirst eller ange värdet för varje bildruta så att det matchar medietypen.
Ange inte attributet MFSampleExtension_RepeatFirstField eller ange det till FALSE- på varje bildruta.
Ange inte attributet MFSampleExtension_SingleField eller ange det till FALSE på varje bildruta.
- Videon innehåller en blandning av sammanflätade och progressiva ramar, med upprepade fält och varierande fältdominans (till exempel DVD-video).
Ange medietypen till MFVideoInterlace_MixedInterlaceOrProgressive.
I varje bildruta anger du attributen MFSampleExtension_Interlaced, MFSampleExtension_BottomFieldFirstoch MFSampleExtension_RepeatFirstField.
Ange inte attributet MFSampleExtension_SingleField eller ange det till FALSE på varje bildruta.
- Videon är sammanflätad och exemplen innehåller enkla fält.
Ange medietypen till MFVideoInterlace_FieldSingleUpper eller MFVideoInterlace_FieldSingleLower.
Ange attributet MFSampleExtension_BottomFieldFirst på varje bildruta.
Ange inte attributet MFSampleExtension_Interlaced eller ange det till TRUE- på varje bildruta.
Ange inte attributet MFSampleExtension_RepeatFirstField eller ange det till FALSE- på varje bildruta.
Ange inte attributet MFSampleExtension_SingleField eller ställ in det på TRUE- på varje bildruta.
De flesta videoinnehåll ingår i någon av dessa kategorier.
MPEG-2-mappningar
För MPEG-2-innehåll använder du följande mappningar för att konvertera MPEG-2-flaggorna till Media Foundation-exempelattribut.
picture_structure
Värde | Exempelattribut |
---|---|
ram | MFSampleExtension_SingleField = FALSE |
top_field |
MFSampleExtension_SingleField = TRUE MFSampleExtension_BottomFieldFirst = FALSE |
bottom_field |
MFSampleExtension_SingleField = TRUE MFSampleExtension_BottomFieldFirst = TRUE |
progressive_frame
Värde | Exempelattribut |
---|---|
0 | MFSampleExtension_Interlaced = SANT |
1 | MFSampleExtension_Interlaced = FALSE |
top_field_first
Värde | Exempelattribut |
---|---|
0 | MFSampleExtension_BottomFieldFirst = TRUE |
1 | MFSampleExtension_BottomFieldFirst = FALSE |
repeat_first_field
Värde | Exempelattribut |
---|---|
0 | MFSampleExtension_RepeatFirstField = FALSKT |
1 | MFSampleExtension_RepeatFirstField = TRUE |
Single-Field exempel
Om medietypen är MFVideoInterlace_FieldSingleUpper eller MFVideoInterlace_FieldSingleLower innebär det att varje exempel innehåller ett enda fält. Medietypen beskriver dock hela ramen. Därför innehåller varje buffert bara hälften av det antal fältlinjer som anges i medietypen. Om medietypen till exempel beskriver videon som 720 × 480 innehåller varje fält 240 genomsökningslinjer och därför innehåller varje buffert endast 240 rader med bildpunkter. Om du skriver en komponent som accepterar medietyper med enkla fältexempel måste du ta hänsyn till detta när du kommer åt data i bufferten.
Samma regel gäller för geometrisk bländare (MF_MT_GEOMETRIC_APERTURE attribut) och minsta visningsöppning (MF_MT_MINIMUM_DISPLAY_APERTURE attribut). Dessa regioner anges i termer av hela ramen, inte de enskilda fälten.
DirectShow-mappningar
I DirectShow finns sammanflätningsinformation per exempel i dwTypeSpecificFlags medlem i den AM_SAMPLE2_PROPERTIES strukturen. I följande tabell visas motsvarande attribut för Media Foundation.
DirectShow-exempelflagga | Media Foundation-exempelattribut |
---|---|
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. (Den här flaggan anger att drivrutinen inte ska deinterlace de två fälten.) |
AM_VIDEO_FLAG_FIELD1FIRST | MFSampleExtension_BottomFieldFirst = FALSE. Om innehållet är sammanflätat och flaggan AM_VIDEO_FLAG_FIELD1FIRST inte finns anger du det här attributet till TRUE-. |
AM_VIDEO_FLAG_REPEAT_FIELD | MFSampleExtension_RepeatFirstField = TRUE. Om flaggan AM_VIDEO_FLAG_REPEAT_FIELD inte finns anger du det här attributet till FALSE. |
Om DirectShow-exemplet inte innehåller exempelflaggor använder du värdet för dwInterlaceFlags från VIDEOINFOHEADER2-strukturen:
DirectShow-sammanflätningsflagga | Media Foundation-exempelattribut |
---|---|
AMINTERLACE_IsInterlaced | MFSampleExtension_Interlaced = TRUE. |
AMINTERLACE_1FieldPerSample | MFSampleExtension_SingleField = TRUE. |
AMINTERLACE_Field1First | MFSampleExtension_BottomFieldFirst = FALSE. |
Relaterade ämnen