Condividi tramite


Supporto delle modifiche al formato dinamico nei codec AVStream

Quando si verifica una modifica del formato dinamico in un flusso multimediale in esecuzione, il modulo Devproxy fornito dal sistema negozia con il pin di acquisizione per determinare se il nuovo formato sarà accettabile.

La sequenza di eventi seguente si verifica quando una modifica dinamica del formato proviene dall'origine multimediale:

  1. Il driver riceve una richiesta di KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT per determinare se il pin KS di input supporta il nuovo tipo di supporto. I driver devono supportare questa proprietà.

  2. Se il pin di input supporta il nuovo tipo di supporto, il gestore KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT deve restituire STATUS_SUCCESS. Il driver determina quindi se può riprendere il flusso usando l'input proposto insieme ai tipi di supporti di output attualmente selezionati. In caso affermativo, il flusso riprende.

  3. Se il pin di input non supporta il tipo di supporto appena proposto, il gestore KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT deve restituire un errore. Il MFT HW rinegotizza quindi il tipo di supporto con il componente connesso.

  4. Se il pin di input supporta il nuovo tipo di input multimediale, ma il filtro KS richiede un tipo di supporto di output diverso, il driver deve generare un evento KSEVENT_DYNAMIC_FORMAT_CHANGE , come descritto più avanti in questo argomento, per notificare la modifica del tipo di supporto HW MFT.

  5. Quando HW MFT riceve la notifica KSEVENT, passa il pin di output da KSSTATE_RUN a KSSTATE_STOP .

  6. HW MFT esegue quindi una query sul driver per i tipi di supporto disponibili, che si traduce in una chiamata al gestore di intersezione AVStrMiniIntersectHandlerEx del driver. Il driver deve segnalare i tipi di supporti di output preferiti nell'ordine di preferenza.

  7. Il client in modalità utente seleziona un tipo di supporto e imposta il nuovo tipo di supporto sul pin di output di HW MFT. Ciò comporta una chiamata alla routine di invio AVStrMiniPinSetDataFormat del driver. Se il driver accetta il formato restituito STATUS_SUCCESS, il flusso riprende con il nuovo tipo di supporto. Se la chiamata ha esito negativo, i componenti coinvolti nella modifica del formato devono rinegoziare il tipo di supporto.

  8. Il MFT HW verifica se si verifica una modifica nel supporto connesso. Se non è presente alcuna modifica, imposta il tipo di supporto selezionato sul pin e lo inserisce in KSSTATE_RUN. Se si verifica una modifica nel supporto connesso, HW MFT elimina il pin e lo ricrea con il tipo di supporto e il supporto appena selezionato. MFT inserisce quindi il pin in KSSTATE_RUN.

  9. Riprende il flusso.

In alcune situazioni, un'origine multimediale potrebbe non rilevare una modifica del formato. Ad esempio, un decodificatore MPEG2 deve decodificare ogni pacchetto per trovare qualsiasi modifica del formato.

In tal caso, se il driver rileva una modifica del formato, il driver hardware deve generare una modifica del formato dinamico KSEVENT. HW MFT esegue quindi una query sul pin per i relativi tipi di supporti supportati. Il pin deve restituire i tipi di supporti preferiti nell'ordine di preferenza. HW MFT segue quindi la sequenza di eventi descritti nei passaggi da 4 a 9 della sezione precedente.

Se il driver non riesce a gestire tale modifica di formato, dovrebbe restituire un errore di streaming, che viene quindi propagato a MF.

Nell'esempio di codice seguente viene illustrato come definire una nuova modifica di formato dinamico usando 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
    )
};

Ogni pin deve esporre questo evento nel descrittore di pin. L'evento è di tipo KSEVENTF_EVENT_HANDLE.

Prima che il driver generi questo evento, deve impostare i tipi di supporti preferiti per il pin KS in base al tipo di supporto di input attualmente selezionato. È possibile eseguire questa operazione usando la funzione _KsEdit nel descrittore del pin.

Per generare l'evento, i driver devono chiamare KsGenerateEvents.