Reconexión dinámica
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEnginey captura de audio y 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 captura de audio y vídeo 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 la mayoría de los filtros DirectShow, los patillas no se pueden volver a conectar mientras el gráfico transmite datos activamente. La aplicación debe detener el gráfico antes de volver a conectar las patillas. Sin embargo, algunos filtros admiten reconexión de patillas mientras se ejecuta el grafo, un proceso conocido como reconexión dinámica. La aplicación puede hacerlo o mediante un filtro en el gráfico.
Por ejemplo, considere el gráfico en la ilustración siguiente.
Un escenario para la reconexión dinámica podría ser quitar el filtro 2 del grafo, mientras se ejecuta el grafo y reemplazarlo por otro filtro. Para que este escenario funcione, debe cumplirse lo siguiente:
- El pin de entrada en el filtro 3 (pin D) debe admitir la interfazIPinConnection. Esta interfaz permite que el pin se vuelva a conectar sin detener el filtro.
- El pin de salida del filtro 1 (patilla A) debe ser capaz de bloquear el flujo de datos multimedia mientras se produce la reconexión. No se puede desplazar ningún dato entre el pin A y el pin D durante la reconexión. Por lo general, esto significa que el pin de salida debe admitir la interfazIPinFlowControl. Sin embargo, si Filter 1 es el filtro que inicia la reconexión, es posible que tenga algún mecanismo interno para bloquear su propio flujo de datos.
La reconexión dinámica implicará los pasos siguientes:
- Bloquee el flujo de datos de la patilla A.
- Vuelva a conectar el pin A para anclar D, posiblemente a través de un nuevo filtro intermedio.
- Desbloquee el pin A para que los datos empiecen a fluir de nuevo.
Paso 1. Bloquear el flujo de datos
Para bloquear el flujo de datos, llame a IPinFlowControl::Block en la patilla A. Este método se puede llamar de forma asincrónica o sincrónica. Para llamar al método de forma asincrónica, cree un objeto de evento Win32 y pase el identificador de evento al método Block. El método devolverá inmediatamente. Espere a que se señale el evento mediante una función como WaitForSingleObject. El anclaje indica el evento cuando ha bloqueado el flujo de datos. Por ejemplo:
// Create an event
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent != NULL)
{
// Block the data flow.
hr = pFlowControl->Block(AM_PIN_FLOW_CONTROL_BLOCK, hEvent);
if (SUCCEEDED(hr))
{
// Wait for the pin to finish.
DWORD dwRes = WaitForSingleObject(hEvent, dwMilliseconds);
}
}
Para llamar al método sincrónicamente, simplemente pase el valor NULL en lugar del identificador de eventos. Ahora el método se bloqueará hasta que se complete la operación. Esto puede no ocurrir hasta que el pin esté listo para entregar un nuevo ejemplo. Si el filtro está en pausa, esto puede tardar un tiempo arbitrario. Por lo tanto, no realice la llamada sincrónica desde el subproceso de aplicación principal. Use un subproceso de trabajo o llame al método de forma asincrónica.
Paso 2. Volver a conectar las patillas
Para volver a conectar los pines, consulte el Administrador de gráficos de filtros para la interfaz de IGraphConfig y llame a IGraphConfig::Reconnect o IGraphConfig::Reconfigure. El método Reconexión es más sencillo de usar; hace lo siguiente:
- Detiene los filtros intermedios (filtro 2 en el ejemplo) y los quita del gráfico.
- Agrega nuevos filtros intermedios, si es necesario.
- Conecta todas las patillas.
- Pausa o ejecuta los nuevos filtros para que coincidan con el estado del gráfico.
El método Reconexión tiene varios parámetros opcionales que se pueden usar para especificar el tipo de medio para la conexión de patillas y el filtro intermedio que se va a usar. Por ejemplo:
pGraph->AddFilter(pNewFilter, L"New Filter for the Graph");
pConfig->Reconnect(
pPinA, // Reconnect this output pin...
pPinD, // ... to this input pin.
pMediaType, // Use this media type.
pNewFilter, // Connect them through this filter.
NULL,
0);
Para obtener más información, consulte la página de referencia. Si el método Reconexión no es lo suficientemente flexible, puede usar el método Reconfigure, que llama a un método de devolución de llamada definido por la aplicación para volver a conectar los pines. Para usar este método, implemente la interfazIGraphConfigCallback en la aplicación.
Antes de llamar a Volver a configurar, bloquee el flujo de datos del pin de salida, tal como se ha descrito anteriormente. A continuación, inserte los datos que todavía están pendientes en la sección del grafo que está reconectando, como se indica a continuación:
- Llame a IPinConnection::NotifyEndOfStream en la patilla de entrada más bajada de la cadena de reconexión (pin D en el ejemplo). Pase un identificador a un evento Win32.
- Llame a IPin::EndOfStream en el pin de entrada que está inmediatamente de bajada desde el pin de salida donde bloqueó el flujo de datos. (En este ejemplo, el flujo de datos se bloqueó en el pin A, por lo que llamaría a EndOfStream en el pin B).
- Espere a que se indique el evento. El pin de entrada (patilla D) indica el evento cuando recibe la notificación de fin de flujo. Esto indica que no hay datos que viajen entre las patillas y que el autor de la llamada pueda volver a conectar los pines de forma segura.
Tenga en cuenta que el método IGraphConfig::Reconnect controla automáticamente los pasos anteriores. Solo tiene que realizar estos pasos si usa el método Volver a configurar.
Después de insertar los datos a través del gráfico, llame a Vuelva a configurar y pase un puntero a la interfaz de devolución de llamada de IGraphConfigCallback de . El Administrador de gráficos de filtros llamará al método IGraphConfigCallback::Reconfigure que haya proporcionado.
Paso 3. Desbloquear el flujo de datos
Después de volver a conectar las patillas, desbloquee el flujo de datos llamando a IPinFlowControl::Block con un valor de cero para el primer parámetro.
Nota
Si un filtro realiza una reconexión dinámica, hay algunos problemas de subproceso que debe tener en cuenta. Si el Administrador de gráficos de filtros intenta detener el filtro, puede interbloquear, ya que el gráfico espera a que se detenga el filtro, mientras que al mismo tiempo el filtro puede estar esperando que los datos se inserten a través del gráfico. Para evitar el posible interbloqueo, algunos de los métodos descritos en esta sección toman un identificador de un evento Win32. El filtro debe indicar el evento si el Administrador de gráficos de filtros intenta detener el filtro. Para obtener más información, vea IGraphConfig y IPinConnection.
Temas relacionados