Dela via


Tidsstämplar och varaktigheter

Det här avsnittet beskriver hur Media Foundation Transformerar ska hantera tidsstämplar.

En MFT måste ange en så exakt tidsstämpel och varaktighet som möjligt för alla utdataexempel. För en enkel MFT som tar en indatabuffert och helt bearbetar den till en utdatabuffert bör MFT bara kopiera tidsstämpeln och varaktigheten direkt från indataexemplet till utdataexemplet. Många transformeringar är dock mer komplexa än så och kan kräva mer komplexa beräkningar av utdatatiden. Alla MMFT:ar bör följa följande grundläggande regler:

  • En MFT bör försöka sätta en tidsstämpel och varaktighet på alla okomprimerade video- eller ljudutdataexempel om en korrekt tidsstämpel eller varaktighet ges på indataexemplen eller kan beräknas. Interpolering kan krävas för vissa tidsstämplar för utdata, särskilt för avkodare.
  • Tidsstämplar och varaktigheter för indataexemplen bör bevaras på utdataexemplen så mycket som möjligt.
  • Tidsstämplarna eller varaktigheterna för utdata kanske inte matchar indata eftersom MFT håller tillbaka data eller delar utdata i olika storlekar än indata. I så fall bör MFT beräkna tidsstämpeln för utdata från det tidigaste indataexemplet som innehåller data som används för att skapa utdataexemplet. Om du vill beräkna tidsstämpeln för utdata lägger du till indatatidsstämpeln för lämpligt indataexempel till varaktigheten för data som redan har transformerats från det exemplet. Det andra exemplet i slutet av det här avsnittet illustrerar den här idén.
  • Om indataexemplen har varaktighet bör den varaktigheten bevaras. Om ett indataexempel inte har varaktighet bör MFT beräkna en varaktighet om möjligt från storleken på utdatabufferten eller datahastigheten som anges av medietypen.
  • Beräknade varaktigheter ska trunkeras (avrundas nedåt), inte avrundas till närmaste steg. Pipelinen har tillräckligt med slack för att hantera varaktigheter som är något felaktiga, men det är lättare för pipelinen att hantera en varaktighet som är 1% för kort än en varaktighet som är 1% för lång. Med detta sagt finns det ingen anledning att avsiktligt förkorta varaktigheten, förutom genom avrundning.

Avkodare

En dekodare konverterar komprimerade paket till okomprimerade data. Eftersom utdata inte är komprimerade har avkodare en särskild skyldighet att få tidsstämplarna och varaktigheterna korrekta. Vissa komprimerade format, framför allt MPEG-2, har inte tidsstämplar på alla indatapaket och har ofta ingen varaktighet för något paket. För dessa format ansvarar avkodaren för att sätta en giltig tidsstämpel och varaktighet på varje utdataexempel genom att summera de underförstådda varaktigheterna för alla utdata sedan det senaste tidsstämplade indataexemplet.

Om varaktigheten inte är tillgänglig i komprimerat format för video ska avkodaren beräkna varaktigheten som inverterad bildfrekvens, konverterad till 100 nanosekunder och avrundad nedåt.

För ljud, om varaktigheten inte är tillgänglig i komprimerat format, bör avkodaren beräkna varaktigheten som inversen av ljudexempelfrekvensen multiplicerad med antalet exempel i utdatabufferten, konverterad till 100 nanosekundersenheter och avrundad nedåt.

Den enda gången en transformering ska mata ut ett exempel utan tidsstämpel är om MFT aldrig har fått en tidsstämpel på ett indataexempel eller om det inte finns något sätt att beräkna en korrekt tidsstämpel för utdata från den tidigare tidsstämpeln för indata.

Ljudkodare

För ljudavkodare beräknas varaktigheten för varje utdataexempel utifrån ljudsamplingshastigheten och antalet PCM-exempel per kanal i utdatabufferten.

Det rätta sättet att beräkna tidsstämplar för utdata beror på om indataexemplen innehåller tidsstämplar.

Om indataexemplen innehåller tidsstämplar beräknar avkodaren tidsstämplarna för utdata från indatatidsstämplarna enligt följande:

  • Om varje indatabuffert innehåller en eller flera fullständiga komprimerade ramar, utan partiella bildrutor, är tidsstämpeln för utdata lika med indatatidsstämpeln, minus avkodarens kända svarstid. En Dolby Digital-avkodare (AC-3) har till exempel en svarstid på 256 PCM-exempel. Med till exempel 48 kHz samplingshastighet är svarstiden 5,33 millisekunder (msec). Om tidsstämpeln för indata därför är 1 000 msek är tidsstämpeln för utdata 1 000–5,33 = 994,66 msec. Om indatabufferten innehåller mer än en hel komprimerad ram skapar avkodaren ett utdataexempel för varje bildruta i indataexemplet. Alla utdataexempel kommer att tidsstämplas korrekt så att det inte finns några luckor.
  • Beroende på transportformatet kan en indatabuffert innehålla partiella bildrutor. En buffert kan till exempel innehålla en del av en ram från den tidigare indatabufferten, följt av en eller flera fullständiga bildrutor, följt av början av nästa bildruta. I det här fallet är det vanligtvis korrekt att anta att tidsstämpeln för indata motsvarar den första bildrutan som börjar i bufferten. (En delram som startades i den tidigare bufferten ingår alltså inte i tidsstämpeln för den aktuella bufferten.) Beräkna tidsstämpeln för utdata i enlighet med detta.

Om indataexemplen inte innehåller några tidsstämplar:

  • Avkodaren bör generera sina egna tidsstämplar och ange den första tidsstämpeln för utdata till noll.
  • Exempelvaraktigheten beräknas utifrån antalet utdataexempel i bufferten och urvalshastigheten.
  • Efterföljande tidsstämplar beräknas från föregående tidsstämpel och varaktighet: Aktuell tidsstämpel + aktuell varaktighet = nästa tidsstämpel. Det får inte finnas några luckor i tidsstämplarna för utdata.

Om indataströmmen ursprungligen innehåller tidsstämplar, men av någon anledning växlar till inga tidsstämplar, bör avkodaren fortsätta att generera sina egna tidsstämplar för utdata, så att de är kontinuerliga och att det inte finns något mellanrum.

Om indataströmmen innehåller tidsstämplar, men det finns luckor i tiderna, sprider avkodaren helt enkelt dessa luckor. Med andra ord bör avkodaren inte försöka åtgärda inkonsekventa tidsstämplar i indataströmmen.

Blandare

Not

I Windows Vista stöder Media Foundation-pipelinen inte MFI med fler än en indata. MFI med flera indata stöds i Windows 7.

 

En mixer tar flera indata och blandar dem i en utdata. Om indataströmmarna inte är helt frekvenslåst eller är något förskjutna i tid från varandra kan det finnas tvetydighet om vilken tid som ska ställas in på utdata. Här följer några riktlinjer, beroende på medietyp:

  • Ljud. Vid start eller omedelbart efter en tömning eller tömning bör en ljudblandare vänta med att producera utdataexempel tills den har fått ett indataexempel på alla nödvändiga indataströmmar. Då bör den välja den tidigaste tidsstämpeln för de första exemplen som ska användas som baslinje för utdatatidsstämplarna. De andra strömmarna ska vara vadderade med tystnad för att kompensera eventuella tidsavvikelser. Om ett exempel tas emot på en valfri indataström bör det också beaktas i beräkningen. Från och med då bör MFT sträva efter att skapa en kontinuerlig och obruten kedja av utdatatidsstämplar. I allmänhet bör MFT inte försöka ta hänsyn till en strömavdrift i förhållande till en annan. I stället bör den beräkna utdatatidsstämplarna från baslinjetidsstämpeln, utdatahastigheten och buffertstorlekarna. När en annan tömning eller tömning inträffar bör MFT återställa sina tidsstämplar för baslinjen.

  • Video. Vid start eller omedelbart efter en tömning eller tömning bör en videoblandare vänta med att producera utdataexempel tills den har fått ett indataexempel på alla nödvändiga indataströmmar. Då bör den välja den tidigaste tidsstämpeln för de första exemplen som ska användas som baslinje för utdatatidsstämplarna. I allmänhet bör den sträva efter att behålla kontinuerliga och regelbundna tidsstämplar för utdata och fasta varaktigheter, även om indata inte är lika vanliga, om det behövs genom att upprepa indataramar.

Kodare

En kodare konverterar okomprimerat ljud eller video till komprimerade paket. En kodare bör följa dessa riktlinjer:

  • Kodaren bör följa konventionerna i utdataformatet. Om formatet vanligtvis inte tidsstämplar varje exempel, som i MPEG-2, behöver inte alla utdataexempel ha en tidsstämpel och en varaktighet.

  • Tidsstämplarna för indata ska bevaras i utdataformatet, om formatet har fält för tidsstämplar, såvida inte bättre tidsinformation är tillgänglig från en annan källa, till exempel själva programmet.

Multiplexer

Not

I Windows Vista stöder Media Foundation-pipelinen inte MFI med fler än en indata. MFI med flera indata stöds i Windows 7.

 

En multiplexer kombinerar två olika ljud- eller videoströmmar till ett interfolierat format, till exempel AVI eller MPEG-2 Transport Stream. En multiplexer bör följa dessa riktlinjer:

  • Multiplexern bör följa konventionerna i utdataformatet. Om formatet vanligtvis inte tidsstämplar varje exempel, som i MPEG-2, behöver inte alla utdataexempel ha en tidsstämpel och en varaktighet.

  • Tidsstämpeln bör återspegla den tidigaste tid som skulle placeras på en bildruta som börjar i paketet, eller tiden för det första ljudexemplet som skulle avkodas från paketet. Ignorera den här riktlinjen om den står i konflikt med konventionerna i utdataformatet.

Demultiplexers

En demultiplexer delar upp ett interfolierat format, till exempel AVI eller MPEG-2 Transport Stream, i underliggande ljud- och videoströmmar.

Om formatet innehåller specifik tidsstämpelinformation som kan användas för att beräkna korrekta tidsstämplar för utdata baserat på tidsstämplar för indata, bör den informationen användas. Men om formatet innehåller tider i en helt annan bas som inte har någon relation till indatatidsstämplarna och en korrekt förskjutning av indatatidsstämpeln inte kan beräknas, bör formatets egna tider ignoreras.

Om formatet inte har användbar tidsstämpelinformation bör demultiplexer följa dessa regler:

  • Okomprimerade utdataströmmar bör ha giltiga tidsstämplar och varaktigheter om möjligt, beräknade från närmaste tidigare indatatidsstämpel.

  • Komprimerade utdataströmmar ska bara ha tidsstämplar på det första utdataexemplet som härleds från ett indataexempel med en tidsstämpel. Om indataexemplet inte har någon tidsstämpel ska inga utdataexempel som härleds från det indataexemplet ha en tidsstämpel. Om indataexemplet är uppdelat i flera utdataexempel ska endast det första utdataexemplet ha en tidsstämpel och resten ska inte ha några tidsstämplar.

Exempel

Exempel 1. Anta att en videoeffekt alltid tar en okomprimerad indataram, tillämpar effekten och kopierar den till utdata. Den rymmer aldrig några ramar eller buffertar några indata. Denna MFT kopierar helt enkelt tidsstämpeln och varaktigheten från indataexemplet till utdataexemplet, om de är tillgängliga, och gör inga tidsberäkningar alls.

Exempel 2. Anta att en ljudeffekt transformerar alla utom 10 millisekunder (ms) för varje indatabuffert, vilket sparar de extra 10 ms som ska kombineras med nästa buffert. Den hämtar en ström med exempel som alla har en varaktighet på 50 ms. Indatatiderna visas i följande tabell.

Prov Indatatid Indatavaraktighet Utdatatid Utdatavaraktighet
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Observera avvikelsen på 1 ms mellan den faktiska varaktigheten för urval 2 och den underförstådda varaktigheten baserat på nästa tidsstämpel (121 ? 70 = 51).

Eftersom MFT rymmer 10 ms, matar den ut de första 40 ms av indataexempel 1 som utdataexempel 1, med en tidsstämpel på 20 ms och en varaktighet på 40 ms.

Utdataexempel 2 kombinerar de 10 ms som tidigare hölls tillbaka med 40 ms av indataexemplet 2. Det här exemplet får en tidsstämpel på 60 ms (tidsstämpeln för det tidigare indataexemplet, 20 ms, plus varaktigheten för de data som redan bearbetats från det exemplet, 40 ms). Den ges en varaktighet på 50 ms.

På samma sätt har nästa exempel en tidsstämpel på 110 ms (70 ms + 40 ms) med en varaktighet på 50 ms.

Nästa beräkning är mer intressant. Den underförstådda tidsstämpeln från den tidigare utdatatiden och varaktigheten skulle vara 160 ms (tidsstämpel 110 ms + varaktighet 50 ms). Tidsstämpeln för utdata ska dock beräknas utifrån indatatidsstämpeln för det tidigaste indataexemplet som överlappar utdataexemplet i tid, plus längden på alla data som redan bearbetats från det exemplet. Det närmast överlappande indataexemplet är exempel 4 (tidsstämpel = 171), men det här är inte det tidigaste. Det tidigaste överlappande exemplet är exempel 3 (tidsstämpel = 121). Om du lägger till de 40 ms som redan har bearbetats från det exemplet är resultatet 161.

Skriva en anpassad MFT-