Negociación de asignadores

[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.

Cuando se conectan dos patillas, necesitan un mecanismo para intercambiar datos multimedia. Este mecanismo se denomina transporte. En general, la arquitectura directShow es neutra sobre los transportes. Dos filtros pueden aceptar conectarse mediante cualquier transporte compatible con ambos.

El transporte más común es el transporte de memoria local , en el que los datos multimedia residen en la memoria principal. Existen dos tipos de transporte de memoria local, el modelo de inserción y el modelo de extracción. En el modelo de inserción, el filtro de origen inserta datos en el filtro de bajada mediante la interfaz IMemInputPin en el pin de entrada del filtro de bajada. En el modelo de extracción, el filtro de bajada solicita datos del filtro de origen mediante la interfaz IAsyncReader en el pin de salida del filtro de origen. Para obtener más información sobre estos dos modelos de flujo de datos, consulte Data Flow en el gráfico de filtros.

En el transporte de memoria local, el objeto responsable de asignar búferes de memoria se denomina asignador. Un asignador admite la interfaz IMemAllocator . Ambos pines comparten un único asignador. Cualquiera de las patillas puede proporcionar un asignador, pero el pin de salida selecciona qué asignador se va a usar.

El pin de salida también establece las propiedades del asignador, que determinan el número de búferes creados por el asignador, el tamaño de cada búfer y la alineación de memoria. El pin de salida podría aplazarse al pin de entrada para los requisitos del búfer.

En una conexión IMemInputPin , la negociación del asignador funciona de la siguiente manera:

  1. Opcionalmente, el pin de salida llama a IMemInputPin::GetAllocatorRequirements. Este método recupera los requisitos de búfer del pin de entrada, como la alineación de memoria. En general, el pin de salida debe respetar la solicitud del pin de entrada, a menos que no haya una buena razón para no hacerlo.
  2. Opcionalmente, el pin de salida llama a IMemInputPin::GetAllocator. Este método solicita un asignador desde el pin de entrada. El pin de entrada proporciona uno o devuelve un código de error.
  3. El pin de salida selecciona un asignador. Puede usar uno proporcionado por el pin de entrada o crear su propio.
  4. El pin de salida llama a IMemAllocator::SetProperties para establecer las propiedades del asignador. Sin embargo, es posible que el asignador no respete las propiedades solicitadas. (Por ejemplo, esto puede ocurrir si el pin de entrada proporciona el asignador). El asignador devuelve las propiedades reales como parámetro de salida en el método SetProperties .
  5. El outpin llama a IMemInputPin::NotifyAllocator para informar al pin de entrada de la selección.
  6. El pin de entrada debe llamar a IMemAllocator::GetProperties para comprobar si las propiedades del asignador son aceptables.
  7. El pin de salida es responsable de confirmar y desasignar el asignador. Esto ocurre cuando se inicia y se detiene el streaming.

En una conexión IAsyncReader , la negociación del asignador funciona de la siguiente manera:

  1. El pin de entrada llama a IAsyncReader::RequestAllocator en el pin de salida. El pin de entrada especifica sus requisitos de búfer y, opcionalmente, proporciona un asignador.
  2. El pin de salida selecciona un asignador. Puede usar el proporcionado por el pin de entrada, si existe, o crear su propio.
  3. El pin de salida devuelve el asignador como parámetro saliente en el método RequestAllocator . El pin de entrada debe comprobar las propiedades del asignador.
  4. El pin de entrada es responsable de confirmar y desasignar el asignador.
  5. En cualquier momento durante el proceso de negociación del asignador, cualquiera de las patillas puede producir un error en la conexión.
  6. Si el pin de salida usa el asignador del pin de entrada, puede usar ese asignador solo para entregar muestras a ese pin de entrada. El filtro propietario no debe usar el asignador para entregar muestras a otras patillas.

Proporcionar un asignador personalizado