Streamwijzigingen verwerken
In dit onderwerp wordt beschreven hoe een Media Foundation-transformatie (MFT) opmaakwijzigingen tijdens het streamen moet verwerken.
Belangrijk
Dit onderwerp is niet van toepassing op encoders. Coderingsprogramma's mogen geen opmaakwijzigingen doorgeven, zoals beschreven in dit onderwerp. Encoders mogen alleen een invoertype accepteren dat overeenkomt met het momenteel geconfigureerde uitvoertype.
Overzicht van opmaakwijzigingen
Over het algemeen zijn er twee redenen waarom een indeling kan worden gewijzigd tijdens het streamen.
- De client kan overschakelen naar een stream met een nieuwe indeling. In digitale televisie kan dit bijvoorbeeld gebeuren als gevolg van een kanaalwijziging.
- In sommige video-indelingen, zoals H.264, kan de bitstream een indelingswijziging signaleren. Dergelijke wijzigingen kunnen wijzigingen in velddominantie, videoresolutie of pixel-hoogte-breedteverhouding omvatten.
Als het coderingstype wordt gewijzigd, moet de client mogelijk de MFT uit de pijplijn verwijderen en vervangen door een andere MFT. (De client moet bijvoorbeeld een nieuwe decoder installeren.) In dit onderwerp wordt die situatie niet behandeld. In dit onderwerp wordt alleen aandacht besteed aan het geval waarin de huidige MFT de nieuwe indeling kan verwerken.
Als de indeling wordt gewijzigd, vereist de MFT mogelijk een nieuw invoertype, een nieuw uitvoertype of beide.
- Wijzigingen in invoertype worden door de client geïnitieerd. Een MFT wijzigt nooit een eigen invoertype.
- Wijzigingen in het uitvoertype worden gestart door de MFT. De MFT geeft aan dat er een nieuw uitvoertype vereist is, en de client onderhandelt het nieuwe uitvoertype met de MFT.
Er zijn dus drie verschillende gevallen mogelijk:
- De client stelt een nieuw invoertype in. De MFT gebruikt de nieuwe indeling, zonder dat het uitvoertype wordt gewijzigd.
- De client stelt een nieuw invoertype in en dit activeert een wijziging in het uitvoertype.
- Het invoertype wordt niet gewijzigd, maar de MFT detecteert een indelingswijziging in de bitstream. Hiervoor is een nieuw uitvoertype vereist.
Opmaakwijzigingen implementeren
In de rest van dit onderwerp wordt beschreven hoe de client een opmaakwijziging moet verwerken en hoe u opmaakwijzigingen in een MFT implementeert.
Uitvoertype
Elke MFT kan als volgt een wijziging in het uitvoertype initiëren:
- De client roept IMFTransform::ProcessOutputaan. De MFT reageert als volgt:
- De MFT levert geen uitvoermonster in ProcessOutput.
- De MFT stelt de vlag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE in de dwStatus lid van de MFT_OUTPUT_DATA_BUFFER structuur in.
- De methode ProcessOutput geeft de foutcode MF_E_TRANSFORM_STREAM_CHANGEterug.
- De client roept IMFTransform::GetOutputAvailableTypeaan. Deze methode retourneert een bijgewerkte set uitvoertypen.
- De client roept SetOutputType aan om een nieuw uitvoertype in te stellen.
- De client hervat het aanroepen van ProcessInput/ProcessOutput.
Invoertype
Wijzigingen in het invoertype worden door de client geïnitieerd, nooit door de MFT. Als het invoertype wordt gewijzigd, kan dit een wijziging in het uitvoertype activeren.
De exacte volgorde van gebeurtenissen is afhankelijk van de waarde van het kenmerk MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE.
Waarde | Beschrijving |
---|---|
ONWAAR | Voordat de client een nieuw invoertype instelt, moet het de MFT leegmaken. |
WAAR- | De client kan een nieuw invoertype instellen zonder de MFT leeg te maken. |
Een MFT maakt dit kenmerk beschikbaar via de methode IMFTransform::GetAttributes. De standaardwaarde van dit kenmerk is ONWAAR; als het kenmerk niet door de MFT wordt ingesteld, behandelt u de waarde als ONWAAR.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is ONWAAR
- De client verzendt het MFT_MESSAGE_COMMAND_DRAIN bericht.
- De client leegt de MFT door IMFTransform::ProcessOutput aan te roepen totdat ProcessOutputMF_E_TRANSFORM_NEED_MORE_INPUTretourneert.
- De client roept IMFTransform::SetInputType aan om het nieuwe invoertype in te stellen.
- De MFT valideert het invoertype. Als het type ongeldig is, retourneert SetInputTypeMF_E_INVALIDMEDIATYPE of een andere foutcode. Anders retourneert SetInputType S_OK.
- Ervan uitgaande dat het invoertype geldig is, evalueert de MFT of het uitvoertype ook wordt gewijzigd. Als dat niet het probleem is, wordt streaming voortgezet en is er geen verdere actie vereist.
- Als het uitvoertype wordt gewijzigd:
- De MFT verklaart het huidige type uitvoermedia ongeldig en werkt de lijst met beschikbare uitvoermediatypen bij.
- De volgende aanroep van ProcessOutput retourneert MF_E_TRANSFORM_STREAM_CHANGE, zoals beschreven in de vorige sectie.
- De client roept IMFTransform::GetOutputAvailableType aan om de bijgewerkte lijst met uitvoertypen op te halen.
- De client roept SetOutputTypeaan.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is WAAR
- De client roept IMFTransform::SetInputType aan om het nieuwe invoertype in te stellen.
- De MFT valideert het invoertype. Als het type ongeldig is, retourneert SetInputTypeMF_E_INVALIDMEDIATYPE of een andere foutcode. Anders retourneert SetInputType S_OK.
- Ervan uitgaande dat het invoertype geldig is, evalueert de MFT of het uitvoertype ook wordt gewijzigd. Als dat niet het probleem is, wordt streaming voortgezet en is er geen verdere actie vereist.
- Voordat het uitvoertype wordt gewijzigd, moet de MFT alle invoervoorbeelden in de cache als volgt verwerken:
- Het huidige uitvoertype van de MFT wordt niet ongeldig.
- De MFT produceert zoveel mogelijk uitvoer uit de invoervoorbeelden in de cache.
- Het is optioneel of de MFT nieuwe invoervoorbeelden accepteert terwijl de voorbeelden in de cache worden verwerkt. Zo ja, dan gebruiken de nieuwe invoervoorbeelden de nieuwe invoerindeling, zodat de MFT het punt moet bijhouden wanneer de indeling is gewijzigd.
- Nadat de MFT alle monsters heeft verwerkt die het ontving voordat het invoertype is gewijzigd, geeft de IMFTransform::ProcessOutputMF_E_TRANSFORM_STREAM_CHANGEterug.
- De MFT maakt het huidige uitvoertype ongeldig en werkt de lijst met beschikbare uitvoermediatypes bij.
- De client onderhandelt over het nieuwe uitvoertype, zoals eerder is beschreven.
Asynchrone MFT's moet de waarde retourneren TRUE- voor het kenmerk MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE. Wanneer u een asynchrone MFT gebruikt, kan de client ervan uitgaan dat het kenmerk MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is ingesteld op TRUE-.
Wanneer MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is TRUE, is het belangrijkste verschil dat de client de MFT niet hoeft te leeglopen voordat een nieuw invoertype wordt ingesteld. Als gevolg hiervan kan het invoertype veranderen terwijl de MFT invoervoorbeelden vasthoudt. Het is belangrijk dat de MFT deze steekproeven niet zomaar laat vallen. Het uitvoertype kan ook pas worden gewijzigd als de MFT alle gegevens in de cache verwerkt.
De vorige alinea is met name van toepassing op video decoders, die inter-gecodeerde frames uit tijdelijke volgorde kunnen ontvangen, en dus moeten ze in de cache opslaan. Als een MFT geen invoerdata in de cache plaatst, is leegmaken in feite een no-op. In dat geval kan de MFT MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE instellen op ONWAAR (of laat het kenmerk niet ingesteld).
Houd er ook rekening mee dat van elke MFT wordt verwacht dat deze formatwijzigingen correct moet verwerken nadat ze zijn leeggemaakt. Het kenmerk MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE geeft aan of de MFT indelingswijzigingen ondersteunt zonder leeg te maken.
Wijzigen naar de interlacemodus
Wijzigingen in de interlacingmodus voor video's zijn een speciaal geval, omdat ze het huidige mediatype niet ongeldig maken. In plaats daarvan wordt de interlacemodus voor elk videoframe opgegeven door kenmerken in te stellen op het mediavoorbeeld. Een video-MFT moet elk invoervoorbeeld controleren op de aanwezigheid van deze vlaggen.
De interlacemodus kan veranderen wanneer de velddominantie overschakelt van het bovenste veld naar het onderste veld of wanneer de video schakelt tussen progressieve en interlaced afbeeldingen.
Voor meer informatie, zie Interlace-vlaggen bij voorbeelden.
Verwante onderwerpen
-
een aangepaste MFT- schrijven