Método IMFTransform::P rocessOutput (mftransform.h)

Genera la salida de los datos de entrada actuales.

Sintaxis

HRESULT ProcessOutput(
  [in]      DWORD                  dwFlags,
  [in]      DWORD                  cOutputBufferCount,
  [in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
  [out]     DWORD                  *pdwStatus
);

Parámetros

[in] dwFlags

OR bit a bit de cero o más marcas de la enumeración _MFT_PROCESS_OUTPUT_FLAGS.

[in] cOutputBufferCount

Número de elementos de la matriz pOutputSamples . El valor debe ser al menos 1.

[in, out] pOutputSamples

Puntero a una matriz de estructuras de MFT_OUTPUT_DATA_BUFFER asignadas por el autor de la llamada. MFT usa esta matriz para devolver datos de salida al autor de la llamada.

[out] pdwStatus

Recibe un OR bit a bit de cero o más marcas de la enumeración _MFT_PROCESS_OUTPUT_STATUS .

Valor devuelto

El método devuelve un valor HRESULT. Entre los valores posibles se incluyen los que se indican en la tabla siguiente, entre otros.

Código devuelto Descripción
S_OK
El método se ha llevado a cabo de forma correcta.
E_UNEXPECTED
Se llamó al método ProcessOutput en un MFT asincrónico que no esperaba esta llamada al método.
MF_E_INVALIDSTREAMNUMBER
Identificador de flujo no válido en el miembro dwStreamID de una o varias estructuras de MFT_OUTPUT_DATA_BUFFER .
MF_E_TRANSFORM_NEED_MORE_INPUT
La transformación no puede generar datos de salida hasta que reciba más datos de entrada.
MF_E_TRANSFORM_STREAM_CHANGE
El formato ha cambiado en un flujo de salida o hay un nuevo formato preferido o hay un nuevo flujo de salida.
MF_E_TRANSFORM_TYPE_NOT_SET
Debe establecer el tipo de medio en una o varias secuencias de MFT.
 
Nota Si va a convertir un objeto multimedia de DirectX (DMO) en un MFT, tenga en cuenta que S_FALSE no es un código de retorno válido para IMFTransform::P rocessOutput, a diferencia del método IMediaObject::P rocessOutput .
 

Comentarios

El tamaño de la matriz pOutputSamples debe ser igual o mayor que el número de flujos de salida seleccionados . El número de flujos de salida seleccionados es igual al número total de flujos de salida menos el número de secuencias deseleccionada . Se anula la selección de una secuencia si tiene la marca MFT_OUTPUT_STREAM_OPTIONAL y el autor de la llamada no establece un tipo de medio (o establece el tipo de medio en NULL). Para obtener más información, vea enumeración _MFT_OUTPUT_STREAM_INFO_FLAGS .

Este método genera ejemplos de salida y también puede generar eventos. Si el método se realiza correctamente, se cumple al menos una de las condiciones siguientes:

  • Uno o varios ejemplos de la matriz pOutputSamples contienen datos de salida.
  • Uno o varios miembros de la matriz pOutputSamples contienen una colección de eventos no vacía.
Si MFT_UNIQUE_METHOD_NAMES se define antes de incluir Mftransform.h, se cambia el nombre de este método a MFTProcessOutput. Consulte Creación de objetos DMO/MFT híbridos.

Búferes de salida

El MFT devuelve los datos de salida de una secuencia a través del miembro pSample de la estructura MFT_OUTPUT_DATA_BUFFER . Este miembro de estructura es un puntero a la interfaz IMFSample de una muestra de medios. (Consulte Ejemplos multimedia). El autor de la llamada asigna el ejemplo multimedia o MFT, según el modelo de asignación de MFT. Para encontrar el modelo de asignación, llame a IMFTransform::GetOutputStreamInfo y examine el miembro dwFlags de la estructura de MFT_OUTPUT_STREAM_INFO :
  • Si la marca MFT_OUTPUT_STREAM_PROVIDES_SAMPLES está presente, MFT asigna el ejemplo multimedia.
  • Si la marca MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES está presente, el autor de la llamada puede proporcionar opcionalmente un ejemplo multimedia. Si pSample es NULL, MFT asignará el ejemplo multimedia.
  • Si ninguna de estas dos marcas está presente, el autor de la llamada debe asignar el ejemplo multimedia.
Estas marcas permanecen constantes a menos que cambie el tipo de medio para el flujo de salida.

Si el autor de la llamada asigna el ejemplo multimedia, el ejemplo de medios debe contener un búfer lo suficientemente grande como para contener los datos de salida. Para buscar los requisitos del búfer, llame a GetOutputStreamInfo. MFT escribe los datos de salida en el inicio del búfer, sobrescribiendo los datos que ya existen en el búfer.

Si el MFT asigna el ejemplo, MFT también asigna los búferes para el ejemplo.

Si el MFT tiene varios flujos de salida, los flujos pueden generar salidas a diferentes velocidades, por lo que es posible que algunas secuencias tengan salida mientras que otras secuencias no. Si una secuencia no produjo ninguna salida, MFT establece la marca MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE en el miembro dwStatus de la estructura MFT_OUTPUT_DATA_BUFFER para esa secuencia. En ese caso, si el autor de la llamada asignó pSample, los búferes del ejemplo no contienen datos válidos. Si el autor de la llamada no asignó pSample, la marca MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE indica que pSample sigue siendo igual a NULL después de que el método devuelva.

Si ningún flujo de salida tiene datos y MFT no tiene eventos que devolver, ProcessOutput devuelve MF_E_TRANSFORM_NEED_MORE_INPUT.

MFT no puede devolver más de una muestra por secuencia en una sola llamada a ProcessOutput. Si hay más datos de salida disponibles para una secuencia después de que Se devuelva ProcessOutput , MFT establece la marca MFT_OUTPUT_DATA_BUFFER_INCOMPLETE en el miembro dwStatus de la estructura MFT_OUTPUT_DATA_BUFFER para esa secuencia.

Si el MFT tiene suficientes datos para generar la salida, debe rechazar la aceptación de más entradas hasta que se haya llamado a ProcessOutput suficientes veces para extraer toda la salida disponible. (Una excepción es cuando el método IMFTransform::GetOutputStreamInfo devuelve la marca MFT_OUTPUT_STREAM_LAZY_READ ). Por lo general, un MFT con varias secuencias de salida debe generar la salida de una secuencia lo antes posible y no esperar a que todas las secuencias tengan salida.

Eventos en banda

El MFT puede devolver una colección de objetos de evento en el miembro pEvents de cada estructura MFT_OUTPUT_DATA_BUFFER . MFT asigna el objeto de colección y los eventos.

Para enviar un evento al autor de la llamada, MFT realiza los pasos siguientes dentro de ProcessOutput:

  1. Cree un nuevo objeto de colección llamando a MFCreateCollection.
  2. Agregue uno o varios eventos a la colección llamando a IMFCollection::AddElement.
  3. Establezca el miembro pEvents de la estructura MFT_OUTPUT_DATA_BUFFER igual al puntero IMFCollection . El MFT deja un recuento de referencias en esta interfaz; el autor de la llamada debe liberar el puntero.
Los eventos no tienen marcas de tiempo. El autor de la llamada debe procesar los eventos antes de procesar los ejemplos de salida. En otras palabras, los eventos se producen en el punto de la secuencia inmediatamente después de la llamada anterior a ProcessOutput y antes de cualquier muestra de salida devuelta desde la llamada actual a ProcessOutput .

Es válido para que el método ProcessOutput devuelva uno o varios eventos y cero muestras de salida.

El autor de la llamada es responsable de liberar los eventos que asigna MFT. Cuando el método vuelva, compruebe el miembro pEvents de cada estructura de MFT_OUTPUT_DATA_BUFFER . Si el valor no es NULL, el autor de la llamada debe liberar el puntero de interfaz 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 no debe usar la interfaz IMFMediaEventGenerator para enviar eventos en banda.

cambios de Stream

El método ProcessOutput puede provocar cualquiera de los siguientes cambios en un flujo de salida:
  • Eliminación de un flujo de salida. Para indicar una eliminación de flujo, MFT establece la marca MFT_OUTPUT_DATA_BUFFER_STREAM_END en el miembro dwStatus de la estructura MFT_OUTPUT_DATA_BUFFER de esa secuencia.
  • Creación de un nuevo flujo de salida. Para indicar un nuevo flujo de salida, MFT establece la marca MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS en el parámetro pdwStatus . Una nueva secuencia puede tener el mismo identificador de flujo que una secuencia eliminada.
  • Cambio de formato en un flujo de salida. Para indicar un cambio de formato, el MFT establece la marca MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE en el miembro dwStatus de la estructura MFT_OUTPUT_DATA_BUFFER de esa secuencia.
Es posible que las tres acciones se deriven de una sola llamada a ProcessOutput. El autor de la llamada debe responder a ellos en el orden indicado aquí: primero eliminaciones, luego adiciones y, a continuación, dar formato a los cambios.

La marca MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE indica un cambio de formato en un flujo de salida. Esto puede significar que el tipo de medio actual no es válido o el orden de preferencia ha cambiado y hay disponible un formato más eficaz. En este último caso, es posible que el cliente vuelva a establecer el tipo de medio original. Para protegerse contra bucles infinitos, MFT no debe volver a establecer la marca MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE hasta que haya otro cambio. Además, evite establecer esta marca si cambia el orden de preferencia, pero el tipo de medio actual sigue siendo el tipo más preferido.

Atributos de ejemplo

Un ejemplo de entrada puede tener atributos, a los que se accede a través de la interfaz IMFAttributes . A menos que ya no se aplique un atributo específico, todos los atributos se deben copiar en el ejemplo de salida correspondiente. La responsabilidad de copiar atributos se determina de la siguiente manera:
  • Si el valor de la propiedad MFPKEY_EXATTRIBUTE_SUPPORTED en MFT es VARIANT_TRUE, MFT copia los atributos.
  • Si el valor de MFPKEY_EXATTRIBUTE_SUPPORTED es VARIANT_FALSE o no se establece la propiedad , el cliente debe copiar los atributos de ejemplo. No sobrescriba ningún atributo que el MFT establece en el ejemplo de salida.
Para obtener una lista de atributos de ejemplo, vea Atributos de ejemplo.

Procesamiento asincrónico

Los comentarios anteriores describen el modelo de procesamiento sincrónico . Para admitir el procesamiento asincrónico, consulte MFT asincrónicas.

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2008 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado mftransform.h
Library Mfuuid.lib

Consulte también

IMFTransform

Transformaciones de Media Foundation