/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 Ġ- ĠPresent , Ġ 8 x 8 ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . j its i . nl j . transform . node . incoming Ċ Ċ import Ġedu . umd . cs . find bugs . annotations . Suppress FB Warnings Ċ import Ġorg . j its i . nl j . Event Ċ import Ġorg . j its i . nl j . Packet Info Ċ import Ġorg . j its i . nl j . Set Local S src Event Ċ import Ġorg . j its i . nl j . rtp . R tp Extension Type . ABS _ SEND _ TIME Ċ import Ġorg . j its i . nl j . rtp . band wid the st imation . Bandwidth Estimator Ċ import Ġorg . j its i . nl j . rtp . band wid the st imation . Google Cc Estimator Ċ import Ġorg . j its i . nl j . stats . Node Stats Block Ċ import Ġorg . j its i . nl j . transform . node . Observer Node Ċ import Ġorg . j its i . nl j . util . ReadOnly Stream Information Store Ċ import Ġorg . j its i . nl j . util . bps Ċ import Ġorg . j its i . nl j . util . bytes Ċ import Ġorg . j its i . utils . logging 2 . create Child Logger Ċ import Ġorg . j its i . utils . observable When Changed Ċ import Ġorg . j its i . rtp . rt cp . R tcp Header Builder Ċ import Ġorg . j its i . rtp . rt cp . rt cp fb . payload _ specific _ fb . R tcp Fb Rem b Packet Ċ import Ġorg . j its i . rtp . rt cp . rt cp fb . payload _ specific _ fb . R tcp Fb Rem b Packet Builder Ċ import Ġorg . j its i . rtp . rtp . R tp Packet Ċ import Ġorg . j its i . rtp . rtp . header _ extensions . Abs Send Time Header Extension Ċ import Ġorg . j its i . utils . LR U Cache Ċ import Ġorg . j its i . utils . MediaType Ċ import Ġorg . j its i . utils . logging . Diagnostic Context Ċ import Ġorg . j its i . utils . logging 2 . Logger Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ Ċ /** Ċ Ġ* ĠEst im ates Ġthe Ġavailable Ġbandwidth Ġfor Ġthe Ġincoming Ġstream Ġusing Ġthe Ġabs - send - time Ġextension . Ċ Ġ*/ Ċ class ĠRemote Bandwidth Estimator ( ĊĠĠĠ Ġprivate Ġval Ġstream Information Store : ĠReadOnly Stream Information Store , ĊĠĠĠ Ġparent Logger : ĠLogger , ĊĠĠĠ Ġdiagnostic Context : ĠDiagnostic Context Ġ= ĠDiagnostic Context (), ĊĠĠĠ Ġprivate Ġval Ġclock : ĠClock Ġ= ĠClock . system UTC () Ċ ) Ġ: ĠObserver Node (" Remote ĠBand width ĠEst imator ") Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġcreate Child Logger ( parent Logger ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġremote Ġbandwidth Ġestimation Ġis Ġenabled Ġwhen ĠRE MB Ġsupport Ġis Ġsign aled , Ġbut ĠT CC Ġis Ġnot Ġsign aled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġenabled : ĠBoolean Ġby Ġobservable When Changed ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_, Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Setting Ġenabled =$ newValue ." Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġast Ext Id : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġuse Ġthe Ġfull Ġ[ Google Cc Estimator ] Ġhere , Ġbut Ġwe Ġdon 't Ġnotify Ġit Ġof Ġpacket Ġloss , Ġeffectively Ġusing Ġonly Ġthe ĊĠĠĠĠ Ġ* Ġdelay - based Ġpart . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġb we : ĠBand width Estimator Ġby Ġlazy Ġ{ ĠGoogle Cc Estimator ( diagnostic Context , Ġlogger ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġs src s : ĠMutable Set < Long > Ġ= ĠL RU Cache . lru Set ( MAX _ SSR CS , Ġtrue Ġ/* Ġaccess Order Ġ*/) ĊĠĠĠ Ġprivate Ġvar Ġnum Rem bs Created Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġnum Packet sWith out Abs Send Time Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlocal S src Ġ= Ġ 0 L ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstream Information Store . on R tp Extension Mapping ( ABS _ SEND _ TIME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast Ext Id Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Setting Ġabs - send - time Ġextension ĠID Ġto Ġ$ ast Ext Id " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstream Information Store . on R tp Payload Types Changed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġstream Information Store . supports Rem b Ġ&& Ġ! stream Information Store . supports T cc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ SSR CS : ĠInt Ġ= Ġ 8 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Event ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġis ĠSet Local S src Event Ġ&& Ġevent . media Type Ġ== ĠMediaType . VIDEO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal S src Ġ= Ġevent . ss rc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtrace ( f : Ġ() Ġ-> ĠUnit ) Ġ= Ġf . invoke () ĊĊĠĠĠ Ġ@ Suppress FB Warnings (" RV _ RETURN _ VALUE _ IG NO RED _ NO _ SIDE _ EFFECT ", Ġ" False Ġpositive ") ĊĠĠĠ Ġoverride Ġfun Ġobserve ( packet Info : ĠPacket Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! enabled ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġast Ext Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr tp Packet Ġ= Ġpacket Info . packet As < R tp Packet >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tp Packet . getHeader Extension ( it )?. let Ġ{ Ġext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġclock . instant () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb we . process Packet Arrival ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAbs Send Time Header Extension . getTime ( ext ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . of Epoch Milli ( packet Info . received Time ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tp Packet . sequence Number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tp Packet . length . bytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWith Ġreceiver - side Ġb we Ġwe Ġneed Ġto Ġtreat Ġeach Ġreceived Ġpacket Ġas Ġseparate Ġfeedback Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb we . feedback Complete ( now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs src s . add ( rtp Packet . ss rc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġnum Packet sWith out Abs Send Time ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetNode Stats (): ĠNode Stats Block Ġ= Ġsuper . getNode Stats (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd String (" ast _ ext _ id ", Ġast Ext Id . toString ()) ĊĠĠĠĠĠĠĠ Ġadd Boolean (" enabled ", Ġenabled ) ĊĠĠĠĠĠĠĠ Ġadd Number (" num _ re mb s _ created ", Ġnum Rem bs Created ) ĊĠĠĠĠĠĠĠ Ġadd Number (" num _ packets _ without _ ast ", Ġnum Packet sWith out Abs Send Time ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Rem b (): ĠR tcp Fb Rem b Packet ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRE MB Ġbased ĠB WE Ġis Ġnot Ġconfigured . ĊĠĠĠĠĠĠĠ Ġif Ġ(! enabled Ġ|| Ġast Ext Id Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Bw Ġ= Ġb we . getCurrent Bw ( clock . instant ()) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġestimator Ġdoes Ġnot Ġyet Ġhave Ġa Ġvalid Ġvalue . ĊĠĠĠĠĠĠĠ Ġif Ġ( current Bw Ġ< Ġ 0 . bps ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġnum Rem bs Created ++ ĊĠĠĠĠĠĠĠ Ġreturn ĠR tcp Fb Rem b Packet Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tcp Header Ġ= ĠR tcp Header Builder ( sender S src Ġ= Ġlocal S src ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbr B ps Ġ= Ġcurrent Bw . bps . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs src s Ġ= Ġs src s . toList () ĊĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon R tt Update ( new R tt Ms : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġb we . on R tt Update ( clock . instant (), ĠDuration . of Nan os (( new R tt Ms Ġ* Ġ 1 0 0 0 _ 0 0 0 ). to Long ())) ĊĠĠĠ Ġ} Ċ } Ċ