Implémentation du contrôle de débit

Cette rubrique explique comment les objets de pipeline personnalisés peuvent prendre en charge les taux de lecture variables, y compris la lecture inversée. Pour plus d’informations sur l’utilisation du contrôle de débit à partir d’une application, consultez Contrôle de débit.

Cette rubrique contient les sections suivantes :

Si vous écrivez un objet pipeline Microsoft Media Foundation (une source multimédia, une transformation ou un récepteur multimédia), vous devrez peut-être prendre en charge des taux de lecture variables. Pour ce faire, implémentez les interfaces suivantes :

  1. Implémentez l’interface IMFGetService .
  2. Prendre en charge le service MF_RATE_CONTROL_SERVICE . (Voir Interfaces de service.)
  3. Implémentez l’interface IMFRateSupport , qui obtient les taux de lecture pris en charge par l’objet .
  4. Implémentez l’interface IMFRateControl , qui obtient ou définit le taux de lecture.

Sources multimédias

Si une source multimédia prend en charge le contrôle de taux, elle doit implémenter IMFRateSupport et IMFRateControl. Sinon, la session multimédia signale que la vitesse de lecture minimale et maximale est de 1,0, quels que soient les autres composants du pipeline.

Le taux de lecture n’affecte pas les heures de présentation des exemples, de sorte que la source multimédia ne doit pas ajuster ses horodatages. Au lieu de cela, l’horloge de présentation s’exécute à une vitesse plus rapide ou plus lente. Pour la lecture inversée, la source fournit des exemples dans l’ordre inverse, avec des horodatages décroissants.

Le paramètre fThin de la méthode IMFRateControl::SetRate indique si la source du média doit éclaircir le contenu. L’amincissement s’applique principalement aux flux vidéo. En mode éclairci, la source supprime les images delta et fournit uniquement des images clés. À des taux de lecture très élevés, la source peut ignorer certaines images clés (par exemple, remettre toutes les autres images clés).

La source n’a pas besoin de supprimer des échantillons audio en mode éclairci. Toutefois, à des taux de lecture très élevés, la source peut ne pas être en mesure de lire des données rapidement pour remplir les exemples de demandes du pipeline. Dans ce cas, la source peut avoir besoin de supprimer certaines données audio. Si c’est le cas, il doit tenter de fournir des échantillons audio qui sont proches dans le temps des exemples vidéo (en supposant que la source a les deux types de flux).

Lorsqu’un flux passe du mode mince au mode non-éclairci, il envoie un événement MEStreamThinMode .

Lorsque la source multimédia termine un appel à SetRate, elle envoie l’événement MESourceRateChanged .

Pendant la lecture inversée :

  • La source multimédia fournit des échantillons dans l’ordre inverse, sans ajuster les horodatages.
  • Les horodatages au sein d’un flux doivent diminuer de façon monotone.
  • Le début du contenu est considéré comme la fin du flux. Une fois que chaque flux multimédia a livré le premier exemple du flux (autrement dit, temps de présentation = 0), il envoie l’événement MEEndOfStream .

Transformations Media Foundation

En général, une transformation Media Foundation (MFT) n’a pas besoin d’une prise en charge explicite du contrôle de débit, sauf si la MFT implémente la lecture inversée non éclaircie.

Si un MFT n’implémente pas l’interface IMFRateSupport , la session multimédia suppose les éléments suivants :

  • Le MFT prend en charge les taux de lecture arbitaires pour la lecture vers l’avant, à la fois éclaircie et non éclaircie.
  • MFT prend en charge la lecture inversée avec amincissement, mais ne prend pas en charge la lecture inversée non éclaircie.

Si l’une de ces conditions n’est pas vraie, MFT doit implémenter IMFRateSupport et IMFRateControl.

Lecture inversée

La session multimédia peut être lue à l’envers même si une ou plusieurs transformations du pipeline ne prennent pas explicitement en charge la lecture inversée.

Si un MFT n’expose pas l’interface IMFRateSupport , la session multimédia utilise l’amincissement pour la lecture inversée, comme suit :

  • La session multimédia envoie des images clés au MFT de la manière habituelle, en appelant IMFTransform::P rocessInput.

  • La session multimédia supprime les trames delta et les remplace par des événements MEStreamTick .

  • Entre chaque exemple, la session multimédia vide le MFT pour éviter toute erreur due au fait que les horodatages diminuent.

Un exemple est considéré comme un frame clé s’il a l’attribut MFSampleExtension_CleanPoint défini sur TRUE, et est considéré comme un frame delta si cet attribut a la valeur FALSE ou n’est pas défini.

Si la MFT implémente IMFRateSupport, la session multimédia utilise cette interface pour déterminer si la MFT prend en charge la lecture inversée non éclaircie. Si la MFT prend en charge la lecture inversée non éclaircie, la session multimédia fournit tous les exemples, dans l’ordre inverse, sans supprimer d’échantillons ni vider le MFT.

Si un MFT prend en charge la lecture inversée non éclaircie, il doit implémenter l’interface IMFRateControl . La session multimédia utilise cette interface pour notifier le MFT en cas de lecture inversée. À ce stade, le MFT doit être préparé pour que les horodatages diminuent et que les trames delta arrivent dans l’ordre inverse. Un décodeur doit généralement mettre en mémoire tampon des exemples jusqu’à ce qu’il ait reçu un groupe entier d’images (GOP), puis décoder l’intégralité du goP et générer les images décodées dans l’ordre correct (inverse).

Récepteurs multimédias

Si un récepteur multimédia est sans débit, la session multimédia suppose que le récepteur multimédia peut gérer n’importe quel taux de lecture. Le récepteur multimédia n’a pas besoin d’implémenter IMFRateSupport. (Un récepteur multimédia sans taux retourne l’indicateur MEDIASINK_RATELESS à partir de la méthode IMFMediaSink::GetCharacteristics .)

Sinon, un récepteur multimédia doit implémenter IMFRateSupport s’il peut gérer des taux de lecture autres que 1.0.

Les récepteurs multimédias ne doivent pas implémenter IMFRateControl. Lorsque le taux de lecture change, l’horloge de présentation appelle la méthode IMFClockStateSink::OnClockSetRate du récepteur multimédia.

Contrôle du taux

Recherche, avance rapide et lecture inversée