package Ġcom . example . g _ core streams demo . screens . broadcast Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . example . g _ core streams demo . R Ċ import Ġcom . ped ro . encoder . input . video . Camera Helper Ċ import Ġcom . ped ro . encoder . input . video . Camera Open Exception Ċ import Ġcom . ped ro . rt mp . fl v . video . Profile I op Ċ import Ġcom . ped ro . rt mp . utils . Connect Checker R tmp Ċ import Ġcom . ped ro . rtp library . rt mp . R tmp Camera 2 Ċ import Ġcom . ped ro . rtp library . util . Bit rate Adapter Ċ import Ġcom . ped ro . rtp library . util . F ps Listener Ċ import Ġcom . ped ro . rtp library . view . Open Gl View Ċ Ċ class ĠStart Broadcast ViewModel ( application : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ toast MessageId Ġ= ĠMutable LiveData < Int >() ĊĠĠĠ Ġval Ġtoast MessageId : ĠLive Data < Int > Ġ= Ġ_ toast MessageId ĊĊĠĠĠ Ġprivate Ġval Ġ_ stream State Ġ= ĠMutable LiveData < Stream State >() ĊĠĠĠ Ġval Ġstream State : ĠLive Data < Stream State > Ġ= Ġ_ stream State ĊĊĠĠĠ Ġprivate Ġval Ġ_ stream Resolution Ġ= ĠMutable LiveData < Stream Resolution >() ĊĠĠĠ Ġval Ġstream Resolution : ĠLive Data < Stream Resolution > Ġ= Ġ_ stream Resolution ĊĊĠĠĠ Ġprivate Ġval Ġ_ current F ps Ġ= ĠMutable LiveData < Int >() ĊĠĠĠ Ġval Ġcurrent F ps : ĠLive Data < Int > Ġ= Ġ_ current F ps ĊĊĠĠĠ Ġprivate Ġval Ġ_ current Bit rate Ġ= ĠMutable LiveData < Int >() ĊĠĠĠ Ġval Ġcurrent Bit rate Ġ= Ġ_ current Bit rate ĊĊĠĠĠ Ġprivate Ġvar Ġr tmp Camera 2 : ĠR tmp Camera 2 ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Mute Mode Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġapp Is Background Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar ĠstartTime In Background Ġ= ĠLong . MAX _ VALUE ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ stream State . value Ġ= ĠStream State . STOP ĊĠĠĠĠĠĠĠ Ġ_ stream Resolution . value Ġ= ĠStream Resolution . FULL _ HD ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate R tmp Camera 2 ( open Gl View : ĠOpen Gl View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rt mp Camera 2 Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tmp Camera 2 Ġ= ĠR tmp Camera 2 ( open Gl View , Ġconnect Checker R tmp ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Profile I op ( Profile I op . CON STR AIN ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset F ps Listener ( fps Listener Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Auto Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Broadcast ( rt mp Url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Streaming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . prepare Audio () Ġ&& Ġit . prepare Video ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . fps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . start Bit rate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . i Frame Interval InSeconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Helper . get Camera Orientation ( getApplication ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . value Ġ= ĠStream State . PLAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Stream ( rt mp Url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . value Ġ= ĠStream State . STOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . value Ġ= ĠR . string . error _ pre paring _ stream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Broadcast () Ġ{ ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Streaming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . value Ġ= ĠStream State . STOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Stream () Ġ{ ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mute Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . disable Audio () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . enable Audio () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . gl Interface . un Mute Video () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . value Ġ= ĠStream State . PLAY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause Stream () Ġ{ ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . disable Audio () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . gl Interface . mute Video () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . value Ġ= ĠStream State . PAUSE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Front Camera () Ġ= Ġr tmp Camera 2 ?. camera Facing Ġ== ĠCamera Helper . Facing . FRONT ĊĊĠĠĠ Ġfun Ġswitch Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. switch Camera () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera Open Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( tag , Ġe . message . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable Audio () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Mute Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. disable Audio () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenable Audio () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Mute Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. enable Audio () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Resolution ( resolution : ĠStream Resolution ) Ġ{ ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Streaming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution Ġ= Ġresolution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream Resolution . value Ġ= Ġresolution ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Preview () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Preview ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . value Ġ= ĠR . string . switch _ quality _ failed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapp In Foreground ( open Gl View : ĠOpen Gl View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Is Background Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . replace View ( open Gl View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Preview ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Parameters . resolution . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream State . value Ġ== ĠStream State . PAUSE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapp In Background () Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Is Background Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠstartTime In Background Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Preview () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . replace View ( getApplication () Ġas ĠContext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Streaming ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable Streaming After TimeOut () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( app Is Background ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelapsed Time Ġ= ĠSystem . currentTimeMillis () Ġ- ĠstartTime In Background ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elapsed Time Ġ>= ĠStream Parameters . background Streaming TimeOut In Millis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Broadcast () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. stop Preview () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfps Listener Callback Ġ= ĠF ps Listener . Callback Ġ{ Ġfps Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ current F ps . post Value ( fps ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġconnect Checker R tmp Ġ= Ġobject Ġ: ĠConnect Checker R tmp Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Auth Error R tmp () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . post Value ( R . string . auth _ error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Auth Success R tmp () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . post Value ( R . string . auth _ success ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Failed R tmp ( reason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . post Value ( R . string . connection _ failed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Broadcast () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Started R tmp ( rt mp Url : ĠString ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġbit rate Adapter : ĠBit rate Adapter ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Success R tmp () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit rate Adapter Ġ= ĠBit rate Adapter Ġ{ Ġbit rate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. set Video Bit rate On Fly ( bit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Max Bit rate ( Stream Parameters . max Bit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . post Value ( R . string . connection _ success ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ current Bit rate . post Value ( rt mp Camera 2 ?. bit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . post Value ( Stream State . PLAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Disconnect R tmp () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ toast MessageId . post Value ( R . string . disconnected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ stream State . post Value ( Stream State . STOP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon New Bit rate R tmp ( bit rate : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit rate Adapter . adapt Bit rate ( bit rate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ current Bit rate . post Value ( bit rate . toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Streaming After TimeOut () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠStream Parameters Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresolution Ġ= ĠStream Resolution . FULL _ HD ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġfps Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġstart Bit rate Ġ= Ġ 2 0 0 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġi Frame Interval InSeconds Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmax Bit rate Ġ= Ġ 3 0 0 0 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġbackground Streaming TimeOut In Millis : ĠLong Ġ= Ġ 6 0 0 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġstop Broadcast () ĊĠĠĠĠĠĠĠ Ġr tmp Camera 2 ?. stop Preview () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġtag Ġ= Ġ" Start Broadcast ViewModel " ĊĠĠĠ Ġ} Ċ }