Implémentation du contrôle de débit

Cette rubrique décrit 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 de pipeline Microsoft Media Foundation (source multimédia, transformation ou récepteur multimédia), vous devrez peut-être prendre en charge les taux de lecture variables. Pour ce faire, implémentez les interfaces suivantes :

  1. Implémentez l’interface IMFGetService .
  2. Prise en charge du 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 débit, elle doit implémenter à la fois IMFRateSupport et IMFRateControl. Dans le cas contraire, la session multimédia signale que le taux de lecture minimal et maximal 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 échantillons, 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 de média doit mincer le contenu. L’amincissement s’applique principalement aux flux vidéo. En mode mince, la source supprime les images delta et ne fournit que les images clés. À des taux de lecture très élevés, la source peut ignorer certaines images clés (par exemple, fournir toutes les autres images clés).

La source n’a pas besoin de supprimer des échantillons audio en mode mince. Toutefois, à des taux de lecture très élevés, la source peut ne pas être en mesure de lire les données rapidement pour remplir les exemples de requêtes du pipeline. Dans ce cas, la source peut avoir besoin de supprimer des 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 en mode mince et non mince, il envoie un événement MEStreamThinMode .

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

Pendant la lecture inverse :

  • 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 monotonique.
  • Le début du contenu est considéré comme la fin du flux. Une fois que chaque flux multimédia remet le premier exemple dans le flux (autrement dit, l’heure 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 le MFT implémente la lecture inverse non mince.

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

  • MFT prend en charge les taux de lecture arb unitaires pour la lecture avant, à la fois mince et non mince.
  • MFT prend en charge la lecture inverse dynamique, mais ne prend pas en charge la lecture inversée non mince.

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

Lecture inversée

La session multimédia peut être lue en sens inverse 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 des médias envoie des images clés au MFT de la façon habituelle, en appelant IMFTransform::P rocessInput.

  • La session multimédia supprime les images delta et les remplace par les é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 une image clé si l’attribut MFSampleExtension_CleanPoint a la valeur TRUE et est considéré comme un frame delta si cet attribut a la valeur FALSE ou n’est pas défini.

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

Si un MFT prend en charge la lecture inverse non mince, il doit implémenter l’interface IMFRateControl . La session multimédia utilise cette interface pour avertir le MFT lors de la 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 échantillons 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 taux, 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 renvoie l’indicateur MEDIASINK_RATELESS de la méthode IMFMediaSink::GetCharacteristics .)

Sinon, un récepteur multimédia doit implémenter IMFRateSupport s’il peut gérer les 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 débit

Recherche, Avance rapide et lecture inversée