Compartir a través de


Reconexión dinámica

[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 la mayoría de los filtros DirectShow, no se pueden volver a conectar patillas mientras el grafo 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. Esto se puede hacer mediante la aplicación o mediante un filtro en el gráfico.

Por ejemplo, considere el gráfico en la ilustración siguiente.

diagrama dinámico de creación de grafos

Un escenario para la reconexión dinámica podría ser quitar el filtro 2 del gráfico, mientras se ejecuta el grafo y reemplazarlo por otro filtro. Para que este escenario funcione, debe cumplirse lo siguiente:

  • El pin de entrada del filtro 3 (pin D) debe admitir la interfaz IPinConnection . Esta interfaz permite volver a conectar la patilla 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. Ningún dato puede viajar 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 interfaz IPinFlowControl . 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:

  1. Bloquee el flujo de datos de la patilla A.
  2. Vuelva a conectar el pin A para anclar D, posiblemente a través de un nuevo filtro intermedio.
  3. 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 el pin 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. La patilla 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 de forma sincrónica, 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 los pines

Para volver a conectar los patillas, consulte filter Graph Manager para la interfaz IGraphConfig y llame a IGraphConfig::Reconnect o IGraphConfig::Reconfigure. El método Reconnect 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.
  • Detiene o ejecuta los nuevos filtros para que coincidan con el estado del gráfico.

El método Reconnect 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 Reconnect 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 patillas. Para usar este método, implemente la interfaz IGraphConfigCallback en la aplicación.

Antes de llamar a Reconfigure, bloquee el flujo de datos del pin de salida, como se ha descrito anteriormente. Después, inserte los datos que aún están pendientes en la sección del grafo que se está reconectando, como se indica a continuación:

  1. Llame a IPinConnection::NotifyEndOfStream en el pin de entrada más abajo de la cadena de reconexión (patilla D en el ejemplo). Pase un identificador a un evento Win32.
  2. 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).
  3. Espere a que se señale el evento. El pin de entrada (pin D) indica el evento cuando recibe la notificación de fin de secuencia. Esto indica que no hay datos que viajen entre las patillas y que el autor de la llamada pueda volver a conectar los patillas 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 Reconfigure .

Después de insertar los datos a través del grafo, llame a Reconfigure y pase un puntero a la interfaz de devolución de llamada IGraphConfigCallback . El Administrador de gráficos de filtros llamará al método IGraphConfigCallback::Reconfigure que ha proporcionado.

Paso 3. Desbloquear el Data Flow

Después de volver a conectar las patillas, desbloquee el flujo de datos mediante una llamada 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 a 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 e IPinConnection.

 

Creación de gráficos dinámicos