3.5. Algorithme de planification RTCP AVPF (AVPF RTCP Scheduling Algorithm)
Soit S0 un émetteur actif (parmi S émetteurs) et N le nombre de récepteurs, R étant l'un d'eux.
On suppose que R a vérifié que l'usage de mécanismes de feedback est raisonnable dans la constellation actuelle (ce qui est très dépendant de l'application et n'est donc pas spécifié ici).
On suppose en outre que T_rr_interval vaut 0 si aucun intervalle minimal entre paquets RTCP réguliers n'est imposé, ou que T_rr_interval est fixé à une valeur pertinente par l'application. Cette valeur désigne alors l'intervalle minimal entre paquets RTCP réguliers.
Avec cela, un récepteur R MUST appliquer les règles suivantes pour transmettre un ou plusieurs messages FB comme paquet RTCP composé minimal ou complet.
3.5.1. Initialisation
Initialement, R MUST fixer allow_early = TRUE et t_rr_last = NaN (Not-a-Number, c'est-à-dire une valeur invalide distinguable d'un temps valide).
De plus, l'initialisation des variables RTCP selon [1] s'applique, sauf pour la valeur initiale de Tmin. Pour une session point à point, Tmin initial vaut 0. Pour une session multipoint, Tmin est initialisé à 1,0 seconde.
3.5.2. Transmission de feedback anticipé
Supposons que R ait planifié le dernier paquet RTCP RR régulier pour tp (et l'ait envoyé ou supprimé à tp) et planifié la prochaine transmission (y compris reconsideration éventuelle selon [1]) pour tn = tp + T_rr. Supposons aussi que la dernière transmission RTCP régulière ait eu lieu à t_rr_last.
L'algorithme de feedback anticipé comprend alors les étapes suivantes :
-
À l'instant
t0, R constate la nécessité de transmettre un ou plusieurs messages FB, par ex. parce que des « unités » média doivent être acquittées ou NACKées, et estime que fournir l'information de feedback peut être utile pour l'émetteur. -
R vérifie d'abord s'il existe déjà un paquet RTCP composé contenant un ou plusieurs messages FB planifié pour transmission (anticipé ou régulier).
2a) Si oui, le nouveau message FB MUST être inclus dans le paquet planifié ; la planification du paquet RTCP composé en attente MUST rester inchangée. Les informations de feedback disponibles SHOULD être fusionnées pour produire le moins de messages FB possible. Les actions immédiates sont terminées.
2b) Si aucun paquet RTCP composé n'est déjà planifié, un nouveau paquet RTCP composé (minimal ou complet) MUST être créé et l'intervalle minimal pour
T_dither_maxMUST être choisi comme suit :i) Si la session est point à point,
T_dither_max= 0.ii) Si la session est multipoint,
T_dither_max= l *T_rravec l=0,5.
La valeur de
T_dither_maxMAY être calculée différemment (par ex. selon l'aller-retour), ce qui MUST alors être spécifié dans un document ultérieur. Une telle spécification MUST garantir que tous les récepteurs RTP utilisent le même mécanisme pour calculerT_dither_max.Les valeurs ci-dessus pour
T_dither_maxsont des valeurs minimales. Des considérations de feedback propres à l'application peuvent justifier d'augmenterT_dither_maxau-delà ; cela relève de l'implémenteur. -
R MUST alors vérifier si son prochain paquet RTCP régulier tomberait dans les limites temporelles du paquet RTCP anticipé déclenché à
t0, c'est-à-dire sit0+T_dither_max>tn.3a) Si oui, aucun paquet RTCP anticipé MUST être planifié ; les message(s) FB MUST être stockés pour inclusion dans le paquet RTCP régulier planifié pour
tn. Fin des actions immédiates.3b) Sinon, les étapes suivantes s'appliquent.
-
R MUST vérifier s'il est autorisé à transmettre un paquet RTCP anticipé, c'est-à-dire si
allow_early== TRUE ou non.4a) Si
allow_early== FALSE, R MUST vérifier l'heure du prochain paquet RTCP régulier planifié :-
Si
tn-t0<T_max_fb_delay, le feedback peut encore être utile malgré un rapport tardif. R MAY créer un message RTCP FB à inclure dans le paquet RTCP régulier prévu àtn. -
Sinon, R MUST supprimer le message RTCP FB.
Fin du déroulement immédiat.
4b) Si
allow_early== TRUE, R MUST planifier un paquet RTCP anticipé pourte=t0+ RND *T_dither_max, RND étant une fonction pseudo-aléatoire uniforme entre 0 et 1. -
-
R MUST détecter les chevauchements entre les messages FB reçus des autres membres de la session RTP et ceux que R souhaite envoyer. Par conséquent, tant qu'il est membre de la session RTP, R MUST surveiller en continu l'arrivée de paquets RTCP composés (minimaux) et stocker chaque message FB contenu pendant au moins
T_retention. En planifiant l'envoi de son propre message FB selon les étapes 1 à 4, R MUST examiner chaque message FB stocké et nouvellement reçu des paquets RTCP reçus pendant l'intervalle [t0-T_retention;te] et agir comme suit :5a) Si R comprend la sémantique du message FB reçu et que le contenu est un sur-ensemble du feedback que R voulait envoyer, R MUST supprimer son propre message FB et MUST replanifier la prochaine transmission RTCP régulière pour
tn(tel que calculé auparavant).5b) Si R comprend la sémantique et que le contenu n'est pas un sur-ensemble, R SHOULD transmettre son propre message FB comme planifié. En cas de chevauchement entre le feedback à envoyer et celui reçu, la quantité transmise est à la discrétion de R : R MAY laisser son feedback inchangé, R MAY aussi supprimer la redondance entre son feedback et celui reçu des autres membres.
5c) Si R ne comprend pas la sémantique, R MAY conserver son message FB planifié comme paquet RTCP anticipé, ou R MAY replanifier la prochaine transmission RTCP régulière pour
tnet MAY ajouter le message FB au message RTCP désormais planifié régulièrement.Note : Avec 5c), la réception de messages FB inconnus peut ne pas entraîner de suppression du feedback chez un récepteur donné. Un même événement peut donc provoquer M types de messages FB (tous pertinents mais non mutuellement compris), partitionnant effectivement un « grand » groupe de récepteurs en au plus M groupes. La suppression du feedback a lieu au sein de chaque groupe (5a, 5b) mais pas entre groupes. L'émetteur peut recevoir O(M) messages RTCP FB ; risque d'implosion de feedback limitée. Comme émetteurs et récepteurs partagent la même application et les mêmes codecs dans la même session RTP, on peut supposer peu de divergence sémantique et M petit en général.
Sachant de plus que les O(M) messages FB sont répartis aléatoirement sur
T_dither_max, le nombre limité de paquets RTCP composés supplémentaires (a) ne devrait pas submerger l'émetteur et (b) devrait être transmis car ils apportent des informations complémentaires. -
Si le(s) message(s) FB de R n'ont pas été supprimés par d'autres messages FB de récepteurs selon 5, à l'heure
te, R MUST transmettre le paquet RTCP composé (minimal) contenant son(ses) message(s) FB. R MUST alors mettreallow_early= FALSE, recalculertn=tp+ 2*T_rr, et fixertpà l'ancientn. Dès que le nouveautnest atteint, que R envoie ou supprime son prochain paquet RTCP régulier (par ex. à cause deT_rr_interval), il MUST remettreallow_earlyà TRUE.
3.5.3. Transmission RTCP régulière
Les paquets RTCP composés complets MUST être envoyés à intervalles réguliers. Ils MAY aussi contenir un ou plusieurs messages FB. La transmission des paquets RTCP réguliers est planifiée comme suit :
Si T_rr_interval == 0, la transmission MUST suivre les sections 3.2 et 3.4 et MUST respecter les ajustements de tn de la section 3.5.2 (sauter une transmission régulière si une transmission anticipée a eu lieu). La reconsideration du temporisateur a lieu à tn selon [1]. Le paquet RTCP régulier est envoyé après reconsideration. Chaque envoi ou suppression d'un paquet RTCP régulier, allow_early MUST être TRUE et tp, tn mis à jour selon [1]. Après la première transmission RTCP régulière, Tmin MUST être 0.
Si T_rr_interval != 0, le calcul des instants MUST suivre les sections 3.2 et 3.4 et les ajustements de tn de la section 3.5.2. Reconsideration à tn selon [1]. Après reconsideration :
-
Si aucun paquet RTCP régulier n'a encore été envoyé (
t_rr_last== NaN), un paquet RTCP régulier MUST être planifié. Les messages FB stockés MAY y être inclus. Après envoi,t_rr_lastMUST êtretn.TminMUST être 0. -
Sinon, une valeur temporaire
T_rr_current_interval:T_rr_current_interval= RND*T_rr_intervalavec RND uniforme entre 0,5 et 1,5. Cette valeur ditherée détermine :
2a) Si
t_rr_last+T_rr_current_interval<=tn, un paquet RTCP régulier MUST être planifié. Les messages RTCP FB stockés MAY y être inclus. Après envoi,t_rr_lastMUST êtretn.2b) Si
t_rr_last+T_rr_current_interval>tnet des messages RTCP FB sont en attente, un paquet RTCP MUST être planifié àtn. Il MAY être minimal ou régulier (au choix de l'implémenteur) et MUST inclure les messages FB stockés.t_rr_lastMUST rester inchangé.2c) Sinon (
t_rr_last+T_rr_current_interval>tnsans FB en attente), le paquet composé MUST être supprimé (non planifié).t_rr_lastMUST rester inchangé.
Dans tous les cas (1, 2a, 2b, 2c), allow_early MUST être TRUE (éventuellement après envoi) et tp, tn mis à jour selon [1], sauf minimum de cinq secondes.
3.5.4. Autres considérations
Si T_rr_interval != 0, le calcul de temporisation pour les entités RTP/AVPF (section 6.3.5 de [1]) MUST utiliser T_rr_interval à la place de Tmin pour Td et donc M*Td.
Chaque envoi ou réception d'un paquet RTCP composé — minimal ou complet, anticipé ou régulier —, la variable avg_rtcp_size MUST être mise à jour (voir [1]) et les calculs ultérieurs de tn MUST utiliser la nouvelle avg_rtcp_size.