package Ġorg . j its i . video bridge . cc . allocation Ċ Ċ import Ġcom . google . common . collect . Immutable Map Ċ import Ġorg . j its i . nl j . Media Source Desc Ċ import Ġorg . j its i . nl j . Packet Info Ċ import Ġorg . j its i . nl j . format . Payload Type Ċ import Ġorg . j its i . rtp . rt cp . R tcp Sr Packet Ċ import Ġorg . j its i . utils . logging . Diagnostic Context Ċ import Ġorg . j its i . utils . logging 2 . Logger Ċ import Ġorg . j its i . video bridge . Video Constraints Ċ import Ġorg . j its i . video bridge . util . EventEmitter Ċ import Ġorg . json . simple . JSONObject Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġjava . util . function . Supplier Ċ Ċ /** Ċ Ġ* Ġ[ Bit rate Controller ] Ġis Ġresponsible Ġfor Ġcontrolling Ġthe Ġsend Ġbit rate Ġto Ġan Ġ` Endpoint `. ĠThis Ġincludes Ġtwo Ġtasks : Ċ Ġ* Ġ 1 . ĠDec ide Ġhow Ġto Ġallocate Ġthe Ġavailable Ġbandwidth Ġbetween Ġthe Ġavailable Ġstreams . Ċ Ġ* Ġ 2 . ĠImplement Ġthe Ġallocation Ġvia Ġa Ġpacket Ġhandling Ġinterface . Ċ Ġ* Ċ Ġ* ĠH istor ically Ġboth Ġwere Ġimplemented Ġin Ġa Ġsingle Ġclass , Ġbut Ġthey Ġare Ġnow Ġsplit Ġbetween Ġ[ Bit rate Allocator ] Ġ( for Ċ Ġ* Ġthe Ġallocation ) Ġand Ġ[ Bit rate Controller Packet Handler ] Ġ( for Ġpacket Ġhandling ). ĠThis Ġclass Ġwas Ġintroduced Ġas Ġa Ċ Ġ* Ġlightweight Ġshim Ġin Ġorder Ġto Ġpreserve Ġthe Ġprevious ĠAPI . Ċ Ġ* Ċ Ġ*/ Ċ class ĠBit rate Controller < T Ġ: ĠMedia Source Container > Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġdestination Endpoint Id : ĠString , ĊĠĠĠ Ġevent Handler : ĠEventHandler , ĊĠĠĠ Ġendpoints Supplier : ĠSupplier < List < T >>, ĊĠĠĠ Ġdiagnostic Context : ĠDiagnostic Context , ĊĠĠĠ Ġparent Logger : ĠLogger , ĊĠĠĠ Ġclock : ĠClock Ġ= ĠClock . system UTC () Ċ ) Ġ{ ĊĠĠĠ Ġval Ġevent Emitter Ġ= ĠEventEmitter < EventHandler >() ĊĊĠĠĠ Ġprivate Ġval Ġpacket Handler : ĠBit rate Controller Packet Handler Ġ= ĊĠĠĠĠĠĠĠ ĠBit rate Controller Packet Handler ( clock , Ġparent Logger , Ġdiagnostic Context , Ġevent Emitter ) ĊĠĠĠ Ġprivate Ġval Ġbit rate Allocator : ĠBit rate Allocator < T > Ġ= ĊĠĠĠĠĠĠĠ ĠBit rate Allocator ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Endpoint Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġendpoints Supplier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiagnostic Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Logger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclock , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpacket Handler ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Emitter . add Handler ( event Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠProxy Ġto Ġthe Ġallocator ĊĠĠĠ Ġfun ĠgetStatus Snapshot (): ĠBit rate Controller Status Snapshot Ġ= Ġbit rate Allocator . status Snapshot ĊĠĠĠ Ġfun Ġendpoint Ordering Changed ( conference Endpoints : ĠList < String >) Ġ= ĊĠĠĠĠĠĠĠ Ġbit rate Allocator . endpoint Ordering Changed ( conference Endpoints ) ĊĠĠĠ Ġvar Ġlast N : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbit rate Allocator . last N ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit rate Allocator . last N Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġset Video Constraints ( new Video Constraints Map : ĠImmutableMap < String , ĠVideo Constraints >) Ġ= ĊĠĠĠĠĠĠĠ Ġbit rate Allocator . set Video Constraints ( new Video Constraints Map ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġnumber Ġof Ġendpoints Ġwhose Ġstreams Ġare Ġcurrently Ġbeing Ġforwarded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnum Forwarded Endpoints (): ĠInt Ġ= Ġbit rate Allocator . num Forwarded Endpoints () ĊĠĠĠ Ġfun ĠgetTotal Over sending Time (): ĠDuration Ġ= Ġbit rate Allocator . over sending Time Tracker . total Time On () ĊĠĠĠ Ġfun Ġis Over sending () Ġ= Ġbit rate Allocator . over sending Time Tracker . state ĊĠĠĠ Ġfun Ġbandwidth Changed ( new Bandwidth B ps : ĠLong ) Ġ= Ġbit rate Allocator . bandwidth Changed ( new Bandwidth B ps ) ĊĊĠĠĠ Ġ// ĠProxy Ġto Ġthe Ġpacket Ġhandler ĊĠĠĠ Ġfun Ġaccept ( packet Info : ĠPacket Info ): ĠBoolean Ġ= Ġpacket Handler . accept ( packet Info ) ĊĠĠĠ Ġfun Ġaccept ( rt cp Sr Packet : ĠR tcp Sr Packet ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠIt Ġis Ġnot Ġclear Ġwhy Ġthis Ġis Ġhere , Ġand Ġwhy Ġit Ġisn 't Ġin Ġthe Ġother Ġaccept () Ġmethod . ĊĠĠĠĠĠĠĠ Ġbit rate Allocator . maybe Update () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpacket Handler . accept ( rt cp Sr Packet ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġtransform R tcp ( rt cp Sr Packet : ĠR tcp Sr Packet ?): ĠBoolean Ġ= Ġpacket Handler . transform R tcp ( rt cp Sr Packet ) ĊĠĠĠ Ġfun Ġtransform R tp ( packet Info : ĠPacket Info ): ĠBoolean Ġ= Ġpacket Handler . transform R tp ( packet Info ) ĊĊĠĠĠ Ġval Ġdebug State : ĠJSONObject Ġ= ĠJSONObject (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput (" bit rate _ allocator ", Ġbit rate Allocator . debug State ) ĊĠĠĠĠĠĠĠ Ġput (" packet _ handler ", Ġpacket Handler . debug State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Payload Type ( payload Type : ĠPayload Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpacket Handler . add Payload Type ( payload Type ) ĊĠĠĠĠĠĠĠ Ġbit rate Allocator . add Payload Type ( payload Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠEventHandler Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġforwarded Endpoints Changed ( for warded Endpoints : ĠCollection < String >) ĊĠĠĠĠĠĠĠ Ġfun Ġeffective Video Constraints Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Video Constraints : ĠImmutableMap < String , ĠVideo Constraints >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Video Constraints : ĠImmutableMap < String , ĠVideo Constraints > ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfun Ġkey frame Needed ( endpoint Id : ĠString ?, Ġs src : ĠLong ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġmeant Ġto Ġbe Ġinternal Ġto ĠBit rate Allocator , Ġbut Ġis Ġexposed Ġhere Ġtemporarily Ġfor Ġthe Ġpurposes Ġof Ġtesting . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġallocation Changed ( allocation : ĠList < Single Source Allocation >) Ġ{ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAbstract s Ġa Ġsource Ġendpoint Ġfor Ġthe Ġpurposes Ġof Ġ[ Bit rate Allocator ]. Ċ Ġ*/ Ċ interface ĠMedia Source Container Ġ{ ĊĠĠĠ Ġval Ġid : ĠString ĊĠĠĠ Ġval Ġmedia Sources : ĠArray < Media Source Desc >? Ċ } Ċ Ċ data Ġclass ĠBit rate Controller Status Snapshot ( ĊĠĠĠ Ġval Ġcurrent Target B ps : ĠLong Ġ= Ġ- 1 L , ĊĠĠĠ Ġval Ġcurrent Ide al B ps : ĠLong Ġ= Ġ- 1 L , ĊĠĠĠ Ġval Ġactive S src s : ĠCollection < Long > Ġ= Ġempty List () Ċ ) Ċ