Compatibilidad con cambios de formato dinámico en códecs AVStream
Cuando se produce un cambio de formato dinámico en una secuencia multimedia en ejecución, el módulo Devproxy proporcionado por el sistema negocia con el pin de captura para determinar si el nuevo formato será aceptable.
La siguiente secuencia de eventos se produce cuando un cambio de formato dinámico se origina en el origen multimedia:
El controlador recibe una solicitud de KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT para determinar si el pin KS de entrada admite el nuevo tipo de medio. Los controladores deben admitir esta propiedad.
Si el pin de entrada admite el nuevo tipo de medio, el controlador de KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT debe devolver STATUS_SUCCESS. A continuación, el controlador determina si puede reanudar la secuencia mediante la entrada propuesta junto con los tipos de medios de salida seleccionados actualmente. En caso afirmativo, se reanuda la secuencia.
Si el pin de entrada no admite el tipo de medio recién propuesto, el controlador de KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT debe devolver un error. A continuación, el HW MFT renegocia el tipo de medio con el componente conectado.
Si el pin de entrada admite el nuevo tipo de entrada multimedia, pero el filtro KS requiere un tipo de medio de salida diferente, el controlador debe generar un evento de KSEVENT_DYNAMIC_FORMAT_CHANGE , como se detalla más adelante en este tema, para notificar al HW MFT sobre el cambio del tipo de medio.
Cuando el HW MFT recibe la notificación KSEVENT, realiza la transición del pin de salida de KSSTATE_RUN a KSSTATE_STOP.
A continuación, el HW MFT consulta el controlador para ver los tipos de medios disponibles, lo que se traduce en una llamada al controlador de intersección AVStrMiniIntersectHandlerEx del controlador. El controlador debe notificar los tipos de medios de salida preferidos en el orden de preferencia.
El cliente en modo de usuario selecciona un tipo de medio y establece el nuevo tipo de medio en el pin de salida del MFT de HW. Esto da como resultado una llamada a la rutina de distribución AVStrMiniPinSetDataFormat del controlador. Si el controlador acepta el formato devolviendo STATUS_SUCCESS, el streaming se reanuda con el nuevo tipo de medio. Si se produce un error en la llamada, los componentes implicados en el cambio de formato deben renegociar el tipo de medio.
El HW MFT comprueba si hay algún cambio en el medio conectado. Si no hay ningún cambio, establece el tipo de medio seleccionado en la patilla y lo coloca en KSSTATE_RUN. Si hay un cambio en el medio conectado, el HW MFT destruye el pin y lo vuelve a crear con el tipo de medio recién seleccionado y medio. A continuación, el MFT coloca el pin en KSSTATE_RUN.
El streaming se reanuda.
En determinadas situaciones, es posible que un origen multimedia no detecte un cambio de formato. Por ejemplo, un descodificador MPEG2 tendría que descodificar cada paquete para buscar cualquier cambio de formato.
En tal caso, si el controlador detecta un cambio de formato, el controlador de hardware debe generar un cambio de formato dinámico KSEVENT. A continuación, HW MFT consulta el pin para sus tipos de medios admitidos. El pin debe devolver los tipos de medios preferidos en el orden de preferencia. A continuación, HW MFT sigue la secuencia de eventos descritos en los pasos 4 a 9 de la sección anterior.
Si el controlador no puede controlar este cambio de formato, debe devolver un error de streaming, que luego se propaga a MF.
En el ejemplo de código siguiente se muestra cómo definir un nuevo cambio de formato dinámico mediante un KSEVENT:
// {162AC456-83D7-4239-96DF-C75FFA138BC6}
#define STATIC_KSEVENTSETID_DynamicFormatChange\
0x162ac456, 0x83d7, 0x4239, 0x96, 0xdf, 0xc7, 0x5f, 0xfa, 0x13, 0x8b, 0xc6 DEFINE_GUIDSTRUCT("162AC456-83D7-4239-96DF-C75FFA138BC6", KSEVENTSETID_ DynamicFormatChange);
#define KSEVENTSETID_DynamicFormatChange DEFINE_GUIDNAMED(KSEVENTSETID_ DynamicFormatChange)
typedef enum {
KSEVENT_DYNAMIC_FORMAT_CHANGE = 0
};
DEFINE_KSEVENT_TABLE(DynamicFormatChangeEventTable) {
DEFINE_KSEVENT_ITEM
(
KSEVENT_DYNAMIC_FORMAT_CHANGE,
sizeof(KSEVENTDATA),
0,
NULL,
NULL,
NULL
)
};
KSEVENT_SET PinEventTable[] =
{
DEFINE_KSEVENT_SET
(
&KSEVENTSETID_DynamicFormatChange,
SIZEOF_ARRAY(DynamicFormatChangeEventTable),
DynamicFormatChangeEventTable
)
};
Cada patilla debe exponer este evento en su descriptor de anclaje. El evento es de tipo KSEVENTF_EVENT_HANDLE.
Antes de que el controlador genere este evento, debe establecer los tipos de medios preferidos para el pin KS en función del tipo de medio de entrada seleccionado actualmente. Para ello, use la función _KsEdit en el descriptor del pin.
Para generar el evento, los controladores deben llamar a KsGenerateEvents.