Procesamiento de datos en un DMO
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
En esta sección se explica cómo procesar un flujo de datos mediante un DMO. Los pasos enumerados en esta sección son el comportamiento predeterminado; todas las DPO deben admitir los métodos descritos aquí. Estos métodos usan búferes independientes para la entrada y salida. Algunas DPO también admiten el procesamiento en contexto, mediante un único búfer. Para obtener más información sobre el procesamiento en contexto, vea Procesamiento en contexto.
Asignar búferes
El cliente es responsable de todas las asignaciones de búferes. Después de establecer los tipos de medios en DMO, consulte el DMO para conocer los requisitos de búfer de cada secuencia. Estos pueden cambiar en función del tipo de medio. Para cada secuencia, llame al método IMediaObject::GetInputSizeInfo o IMediaObject::GetOutputSizeInfo . Estos métodos devuelven la siguiente información:
- Tamaño mínimo del búfer, en bytes.
- Requisitos de alineación, si los hay. Un búfer se alinea si la dirección inicial es un múltiplo de un entero especificado.
- La cantidad máxima de datos que DMO contendrá para lookahead. Este número solo se aplica a los flujos de entrada. Para algunos tipos de datos (por ejemplo, codificación MPEG), es posible que un DMO tenga que mirar hacia delante en la secuencia. El valor lookahead indica la cantidad de datos de entrada que necesitará DMO para poder generar la salida.
El cliente debe asignar búferes que coincidan con estos requisitos. Además, el DMO puede tener requisitos sobre cómo el cliente empaqueta los datos de entrada. Por ejemplo, DMO podría requerir que cada búfer contenga exactamente una muestra (o fotograma de vídeo). Para determinar estos requisitos, llame al método IMediaObject::GetInputStreamInfo . El método IMediaObject::GetOutputStreamInfo devuelve información similar sobre un flujo de salida.
En el modelo de streaming predeterminado, el cliente no pasa punteros de búfer sin procesar al DMO. En su lugar, usa un objeto COM ligero que expone la interfaz IMediaBuffer . La interfaz IMediaBuffer actúa como contenedor COM para un bloque de memoria. Dado que es un objeto COM, admite el recuento de referencias, lo que ayuda a garantizar que los búferes no se libere mientras siguen en uso.
Nota:
La interfaz IMediaBuffer sirve una función similar a la interfaz IMediaSample en DirectShow.
El cliente debe implementar el objeto IMediaBuffer . Para obtener más información, consulte Implementación de IMediaBuffer.
Procesamiento de los datos
Para procesar los datos, haga lo siguiente:
- Para cada flujo de entrada, rellene un búfer con datos de entrada.
- Llame a IMediaObject::P rocessInput para entregar cada búfer.
- Llame a IMediaObject::P rocessOutput para procesar los datos. Este método toma una matriz de búferes, una para cada flujo de salida.
- Repita hasta que no haya más datos de entrada.
El método ProcessInput acepta la entrada de una secuencia a la vez. Normalmente, el método devuelve inmediatamente y DMO contiene un recuento de referencias en el objeto IMediaBuffer . Libera el objeto después de procesar todos los datos del búfer o cuando la aplicación vacía el DMO. No vuelva a usar un búfer hasta que DMO lo haya liberado. Para determinar si un flujo de entrada puede aceptar más datos, llame al método IMediaObject::GetInputStatus . Este método devuelve la marca DMO_INPUT_STATUSF_ACCEPT_DATA si la secuencia puede aceptar más entradas.
El método ProcessOutput genera una salida para todos los flujos de salida a la vez. La aplicación pasa una matriz de estructuras de DMO_OUTPUT_DATA_BUFFER , una para cada flujo de salida. Cada estructura de la matriz tiene un puntero a un objeto IMediaBuffer . DMO escribe tantos datos de salida como pueda en los búferes. También establece varias marcas para notificar el estado de la operación. La marca DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE indica que DMO puede generar más salida a partir de la entrada existente. En ese caso, el cliente puede volver a llamar a ProcessOutput . De lo contrario, debe llamar a ProcessInput con más datos de entrada. El DMO nunca modifica los datos en los búferes de entrada; escribe solo en los búferes de salida.
Después de entregar todos los datos a un flujo de entrada, llame al método IMediaObject::D iscontinuity . DMO no acepta ninguna entrada adicional en esa secuencia hasta que procese la salida restante (o vacíe el DMO).
En cualquier momento después de que se inicie el streaming, DMO puede recibir la entrada o generar la salida, o ambas. Por lo tanto, GetInputStatus devuelve DMO_INPUT_STATUSF_ACCEPT_DATA o ProcessOutput devuelve DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE. La aplicación mantiene el flujo de datos probando estas marcas y llamando a ProcessInput o ProcessOutput en consecuencia. Para interrumpir el flujo de datos, llame al método IMediaObject::Flush . Este método hace que DMO descarte los búferes que contiene internamente.
Temas relacionados