MÉTHODE IMFTransform ::P rocessOutput (mftransform.h)
Génère une sortie à partir des données d’entrée actuelles.
Syntaxe
HRESULT ProcessOutput(
[in] DWORD dwFlags,
[in] DWORD cOutputBufferCount,
[in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
[out] DWORD *pdwStatus
);
Paramètres
[in] dwFlags
OR au niveau du bit de zéro ou plusieurs indicateurs de l’énumération _MFT_PROCESS_OUTPUT_FLAGS.
[in] cOutputBufferCount
Nombre d’éléments dans le tableau pOutputSamples . La valeur doit être au moins égale à 1.
[in, out] pOutputSamples
Pointeur vers un tableau de structures MFT_OUTPUT_DATA_BUFFER , alloués par l’appelant. Le MFT utilise ce tableau pour retourner les données de sortie à l’appelant.
[out] pdwStatus
Reçoit un OR au niveau du bit de zéro ou plusieurs indicateurs de l’énumération _MFT_PROCESS_OUTPUT_STATUS .
Valeur retournée
Cette méthode retourne un code HRESULT. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.
Code de retour | Description |
---|---|
|
S_OK |
|
La méthode ProcessOutput a été appelée sur un MFT asynchrone qui n’attendait pas cet appel de méthode. |
|
Identificateur de flux non valide dans le membre dwStreamID d’une ou plusieurs structures MFT_OUTPUT_DATA_BUFFER . |
|
La transformation ne peut pas produire de données de sortie tant qu’elle n’a pas reçu davantage de données d’entrée. |
|
Le format a changé sur un flux de sortie, il existe un nouveau format préféré, ou il existe un nouveau flux de sortie. |
|
Vous devez définir le type de média sur un ou plusieurs flux du MFT. |
Remarques
La taille du tableau pOutputSamples doit être égale ou supérieure au nombre de flux de sortie sélectionnés . Le nombre de flux de sortie sélectionnés est égal au nombre total de flux de sortie moins le nombre de flux désélectionnés . Un flux est désélectionné s’il a l’indicateur MFT_OUTPUT_STREAM_OPTIONAL et que l’appelant ne définit pas de type de média (ou définit le type de média sur NULL). Pour plus d’informations, consultez énumération _MFT_OUTPUT_STREAM_INFO_FLAGS .
Cette méthode génère des exemples de sortie et peut également générer des événements. Si la méthode réussit, au moins l’une des conditions suivantes est remplie :
- Un ou plusieurs exemples du tableau pOutputSamples contiennent des données de sortie.
- Un ou plusieurs membres du tableau pOutputSamples contient une collection non vide d’événements.
Mémoires tampons de sortie
MFT retourne les données de sortie d’un flux via le membre pSample de la structure MFT_OUTPUT_DATA_BUFFER . Ce membre de structure est un pointeur vers l’interface IMFSample d’un exemple de média. (Voir Exemples multimédias.) L’exemple de média est alloué par l’appelant ou par le MFT, en fonction du modèle d’allocation de MFT. Pour trouver le modèle d’allocation, appelez IMFTransform ::GetOutputStreamInfo et examinez le membre dwFlags de la structure MFT_OUTPUT_STREAM_INFO :- Si l’indicateur MFT_OUTPUT_STREAM_PROVIDES_SAMPLES est présent, MFT alloue l’exemple de média.
- Si l’indicateur MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES est présent, l’appelant peut éventuellement fournir un exemple de média. Si pSample a la valeur NULL, MFT alloue l’exemple de média.
- Si aucun de ces deux indicateurs n’est présent, l’appelant doit allouer l’exemple de média.
Si l’appelant alloue l’exemple de média, l’exemple de média doit contenir une mémoire tampon suffisamment grande pour contenir les données de sortie. Pour trouver la configuration requise pour la mémoire tampon, appelez GetOutputStreamInfo. Le MFT écrit les données de sortie au début de la mémoire tampon, en remplaçant toutes les données qui existent déjà dans la mémoire tampon.
Si le MFT alloue l’exemple, le MFT alloue également les mémoires tampons pour l’exemple.
Si le MFT a plusieurs flux de sortie, les flux peuvent produire une sortie à des taux différents, de sorte que certains flux peuvent avoir une sortie, contrairement à d’autres flux. Si aucun flux n’a produit de sortie, MFT définit l’indicateur MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE dans le membre dwStatus de la structure MFT_OUTPUT_DATA_BUFFER pour ce flux. Dans ce cas, si l’appelant a alloué pSample, les mémoires tampons de l’exemple ne contiennent pas de données valides. Si l’appelant n’a pas alloué pSample, l’indicateur MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE indique que pSample est toujours égal à NULL après le retour de la méthode.
Si aucun flux de sortie n’a de données et que MFT n’a aucun événement à retourner, ProcessOutput retourne MF_E_TRANSFORM_NEED_MORE_INPUT.
Le MFT ne peut pas retourner plusieurs exemples par flux dans un seul appel à ProcessOutput. S’il existe plus de données de sortie disponibles pour un flux après le retour de ProcessOutput , MFT définit l’indicateur MFT_OUTPUT_DATA_BUFFER_INCOMPLETE dans le membre dwStatus de la structure MFT_OUTPUT_DATA_BUFFER pour ce flux.
Si le MFT a suffisamment de données pour produire une sortie, il doit refuser d’accepter d’autres entrées tant que ProcessOutput n’a pas été appelé suffisamment de fois pour extraire toute la sortie disponible. (Une exception est lorsque la méthode IMFTransform ::GetOutputStreamInfo retourne l’indicateur MFT_OUTPUT_STREAM_LAZY_READ .) En règle générale, une MFT avec plusieurs flux de sortie doit produire la sortie d’un flux dès que possible, et ne pas attendre que tous les flux aient une sortie.
Événements in-band
MFT peut retourner une collection d’objets d’événement dans le membre pEvents de chaque structure MFT_OUTPUT_DATA_BUFFER . Le MFT alloue à la fois l’objet de collection et les événements.Pour envoyer un événement à l’appelant, le MFT effectue les étapes suivantes dans ProcessOutput :
- Créez un objet de collection en appelant MFCreateCollection.
- Ajoutez un ou plusieurs événements à la collection en appelant IMFCollection ::AddElement.
- Définissez le membre pEvents de la structure MFT_OUTPUT_DATA_BUFFER égal au pointeur IMFCollection . Le MFT laisse un nombre de références sur cette interface ; l’appelant doit libérer le pointeur.
Il est valide pour que la méthode ProcessOutput retourne un ou plusieurs événements et aucun exemple de sortie.
L’appelant est chargé de libérer tous les événements que le MFT alloue. Lorsque la méthode est retournée, case activée le membre pEvents de chaque structure MFT_OUTPUT_DATA_BUFFER. Si la valeur n’est pas NULL, l’appelant doit libérer le pointeur d’interface IMFCollection :
// Release the events that an MFT might allocate in IMFTransform::ProcessOutput().
void ReleaseEventCollection(DWORD cOutputBuffers, MFT_OUTPUT_DATA_BUFFER* pBuffers)
{
for (DWORD i = 0; i < cOutputBuffers; i++)
{
if (pBuffers[i].pEvents)
{
pBuffers[i].pEvents->Release();
pBuffers[i].pEvents = NULL;
}
}
}
Un MFT ne doit pas utiliser l’interface IMFMediaEventGenerator pour envoyer des événements dans la bande.
Stream Modifications
La méthode ProcessOutput peut provoquer l’une des modifications suivantes dans un flux de sortie :- Suppression d’un flux de sortie. Pour signaler une suppression de flux, MFT définit l’indicateur MFT_OUTPUT_DATA_BUFFER_STREAM_END dans le membre dwStatus de la structure MFT_OUTPUT_DATA_BUFFER pour ce flux.
- Création d’un flux de sortie. Pour signaler un nouveau flux de sortie, MFT définit l’indicateur MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS dans le paramètre pdwStatus . Un nouveau flux peut avoir le même identificateur de flux qu’un flux supprimé.
- Modification de format sur un flux de sortie. Pour signaler un changement de format, MFT définit l’indicateur MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE dans le membre dwStatus de la structure MFT_OUTPUT_DATA_BUFFER pour ce flux.
L’indicateur MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE signale un changement de format sur un flux de sortie. Cela peut signifier que le type de média actuel n’est plus valide, ou que l’ordre de préférence a changé et qu’un format plus efficace est disponible. Dans ce dernier cas, il est possible que le client définisse à nouveau le type de média d’origine. Pour éviter les boucles sans fin, MFT ne doit pas définir à nouveau l’indicateur MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE tant qu’il n’y a pas d’autre modification. En outre, évitez de définir cet indicateur si l’ordre de préférence change, mais que le type de média actuel est toujours le type préféré.
Exemples d’attributs
Un exemple d’entrée peut avoir des attributs accessibles via l’interface IMFAttributes . Sauf si un attribut spécifique ne s’applique plus, tous les attributs doivent être copiés dans l’exemple de sortie correspondant. La responsabilité de la copie des attributs est déterminée comme suit :- Si la valeur de la propriété MFPKEY_EXATTRIBUTE_SUPPORTED sur le MFT est VARIANT_TRUE, le MFT copie les attributs.
- Si la valeur de MFPKEY_EXATTRIBUTE_SUPPORTED est VARIANT_FALSE ou si la propriété n’est pas définie, le client doit copier les exemples d’attributs. Ne remplacez pas les attributs que le MFT définit sur l’exemple de sortie.
Traitement asynchrone
Les remarques précédentes décrivent le modèle de traitement synchrone . Pour prendre en charge le traitement asynchrone, consultez MfT asynchrones.Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows Vista [applications de bureau | applications UWP] |
Serveur minimal pris en charge | Windows Server 2008 [applications de bureau | applications UWP] |
Plateforme cible | Windows |
En-tête | mftransform.h |
Bibliothèque | Mfuuid.lib |