Partager via


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
S_OK
E_UNEXPECTED
La méthode ProcessOutput a été appelée sur un MFT asynchrone qui n’attendait pas cet appel de méthode.
MF_E_INVALIDSTREAMNUMBER
Identificateur de flux non valide dans le membre dwStreamID d’une ou plusieurs structures MFT_OUTPUT_DATA_BUFFER .
MF_E_TRANSFORM_NEED_MORE_INPUT
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.
MF_E_TRANSFORM_STREAM_CHANGE
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.
MF_E_TRANSFORM_TYPE_NOT_SET
Vous devez définir le type de média sur un ou plusieurs flux du MFT.
 
Note Si vous convertissez un objet multimédia DirectX (DMO) en MFT, n’oubliez pas que S_FALSE n’est pas un code de retour valide pour IMFTransform ::P rocessOutput, contrairement à la méthode IMediaObject ::P rocessOutput .
 

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.
Si MFT_UNIQUE_METHOD_NAMES est défini avant d’inclure Mftransform.h, cette méthode est renommée MFTProcessOutput. Consultez Création d’objets DMO/MFT hybrides.

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.
Ces indicateurs restent constants, sauf si le type de média du flux de sortie change.

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 :

  1. Créez un objet de collection en appelant MFCreateCollection.
  2. Ajoutez un ou plusieurs événements à la collection en appelant IMFCollection ::AddElement.
  3. 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.
Les événements n’ont pas d’horodatage. L’appelant doit traiter les événements avant de traiter les exemples de sortie. En d’autres termes, les événements se produisent au point du flux immédiatement après l’appel précédent à ProcessOutput, et avant tous les exemples de sortie retournés par l’appel ProcessOutput actuel.

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.
Il est possible que ces trois actions résultent d’un seul appel à ProcessOutput. L’appelant doit y répondre dans l’ordre indiqué ici : d’abord les suppressions, les ajouts, puis les modifications de format.

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.
Pour obtenir la liste des exemples d’attributs, consultez Exemples d’attributs.

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

Voir aussi

IMFTransform

Transformations de Media Foundation