Partager via


Prise en charge des modifications de format dynamique dans les codecs AVStream

Lorsqu’un changement de format dynamique se produit dans un flux multimédia en cours d’exécution, le module Devproxy fourni par le système négocie avec l’épingle de capture pour déterminer si le nouveau format sera acceptable.

La séquence d’événements suivante se produit lorsqu’un changement de format dynamique provient de la source multimédia :

  1. Le pilote reçoit une demande de KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT pour déterminer si la broche KS d’entrée prend en charge le nouveau type de média. Les pilotes doivent prendre en charge cette propriété.

  2. Si la broche d’entrée prend en charge le nouveau type de média, le gestionnaire KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT doit retourner STATUS_SUCCESS. Le pilote détermine ensuite s’il peut reprendre le flux à l’aide de l’entrée proposée avec les types de média de sortie actuellement sélectionnés. Si oui, le flux reprend.

  3. Si le code pin d’entrée ne prend pas en charge le type de média nouvellement proposé, le gestionnaire de KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT doit retourner une erreur. Le HW MFT renégocie ensuite le type de média avec le composant connecté.

  4. Si la broche d’entrée prend en charge le nouveau type d’entrée multimédia, mais que le filtre KS nécessite un type de média de sortie différent, le pilote doit générer un événement KSEVENT_DYNAMIC_FORMAT_CHANGE , comme décrit plus loin dans cette rubrique, pour informer le HW MFT du changement de type de média.

  5. Lorsque le MFT HW reçoit la notification KSEVENT, il fait passer la broche de sortie de KSSTATE_RUN à KSSTATE_STOP.

  6. HW MFT interroge ensuite le pilote pour les types de médias disponibles, ce qui se traduit par un appel au gestionnaire d’intersection AVStrMiniIntersectHandlerEx du pilote. Le pilote doit signaler les types de médias de sortie préférés dans l’ordre de préférence.

  7. Le client en mode utilisateur sélectionne un type de média et définit le nouveau type de média sur la broche de sortie du HW MFT. Cela entraîne un appel à la routine de distribution AVStrMiniPinSetDataFormat du pilote. Si le pilote accepte le format en retournant STATUS_SUCCESS, la diffusion en continu reprend avec le nouveau type de média. Si l’appel échoue, les composants impliqués dans le changement de format doivent renégocier le type de média.

  8. Le HW MFT vérifie s’il y a un changement dans le support connecté. S’il n’y a aucune modification, il définit le type de média sélectionné sur la broche et le place dans KSSTATE_RUN. En cas de modification du support connecté, le MFT HW détruit la broche et la recrée avec le type de média et le support nouvellement sélectionnés. Le MFT place ensuite la broche dans KSSTATE_RUN.

  9. La diffusion en continu reprend.

Dans certaines situations, une source multimédia peut ne pas détecter un changement de format. Par exemple, un décodeur MPEG2 doit décoder chaque paquet pour trouver un changement de format.

Dans ce cas, si le pilote détecte un changement de format, le pilote matériel doit générer une modification de format dynamique KSEVENT. HW MFT interroge ensuite la broche pour ses types de médias pris en charge. L’épingle doit retourner les types de médias préférés dans l’ordre de préférence. HW MFT suit ensuite la séquence d’événements décrite aux étapes 4 à 9 de la section précédente.

Si le pilote ne peut pas gérer une telle modification de format, il doit retourner une erreur de diffusion en continu, qui est ensuite propagée à MF.

L’exemple de code suivant montre comment définir un nouveau changement de format dynamique à l’aide d’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
    )
};

Chaque broche doit exposer cet événement dans son descripteur de broche. L’événement est de type KSEVENTF_EVENT_HANDLE.

Avant que le pilote ne génère cet événement, il doit définir les types de média préférés pour la broche KS en fonction du type de média d’entrée actuellement sélectionné. Pour ce faire, utilisez la fonction _KsEdit sur le descripteur de l’épingle.

Pour générer l’événement, les pilotes doivent appeler KsGenerateEvents.