/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠTh ib ault ĠB . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . github . th ib ault bee . stre amp ack . stream ers Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . projection . Media Projection Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Permission Ċ import Ġcom . github . th ib ault bee . stre amp ack . data . Audio Config Ċ import Ġcom . github . th ib ault bee . stre amp ack . data . Video Config Ċ import Ġcom . github . th ib ault bee . stre amp ack . error . Stream Pack Error Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . data . Frame Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . data . Packet Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . en coders . Audio Media Codec Encoder Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . en coders . I Encoder Listener Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . en coders . Video Media Codec Encoder Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . endpoints . I Endpoint Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . events . EventHandler Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . mux ers . IM ux er Listener Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . mux ers . ts . T SM ux er Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . mux ers . ts . data . Service Info Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . sources . Audio Capture Ċ import Ġcom . github . th ib ault bee . stre amp ack . internal . sources . scre enc apt ure . Screen Capture Ċ import Ġcom . github . th ib ault bee . stre amp ack . listeners . OnError Listener Ċ import Ġcom . github . th ib ault bee . stre amp ack . logger . I Logger Ċ import Ġcom . github . th ib ault bee . stre amp ack . stream ers . interfaces . I Stream er Ċ import Ġcom . github . th ib ault bee . stre amp ack . utils . Camera Stream er Configuration Helper Ċ import Ġcom . github . th ib ault bee . stre amp ack . utils . File Recorder Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġof ĠCapture Stream er : Ġ[ Camera Ts FileStream er ] Ġor Ġ[ Camera S rt Live Stream er ] Ċ Ġ* ĠUse Ġthis Ġclass , Ġonly Ġif Ġyou Ġwant Ġto Ġimplement Ġa Ġcustom Ġendpoint . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontext Ġapplication Ġcontext Ċ Ġ* Ġ@ param Ġts Service Info ĠM PEG - TS Ġservice Ġdescription Ċ Ġ* Ġ@ param Ġendpoint Ġa Ġ[ I Endpoint ] Ġimplementation Ċ Ġ* Ġ@ param Ġlogger Ġa Ġ[ I Logger ] Ġimplementation Ċ Ġ*/ Ċ open Ġclass ĠBase Screen Capture Stream er ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġts Service Info : ĠService Info , ĊĠĠĠ Ġprotected Ġval Ġendpoint : ĠI Endpoint , ĊĠĠĠ Ġprivate Ġval Ġlogger : ĠILogger Ċ ) Ġ: ĠEventHandler (), ĠI Stream er Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListener Ġthat Ġreports Ġstream er Ġerror . ĊĠĠĠĠ Ġ* ĠSupports Ġonly Ġone Ġlistener . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar ĠonError Listener : ĠOn Error Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġaudio Ts Stream Id : ĠShort ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġvideo Ts Stream Id : ĠShort ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠKeep Ġvideo Ġconfiguration ĊĠĠĠ Ġprivate Ġvar Ġvideo Config : ĠVideo Config ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Config : ĠAudio Config ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġs rt Bytes Recorder Ġ= ĠFile Recorder ( context , Ġ" s rt Bytes . h 2 6 4 ") ĊĊĠĠĠ Ġ// ĠOnly Ġhandle Ġstream Ġerror Ġ( error Ġon Ġmux er , Ġendpoint , ...) ĊĠĠĠ Ġoverride Ġvar Ġon Internal Error Listener Ġ= Ġobject Ġ: ĠOn Error Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠStream Pack Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Stream Error ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Internal Codec Error Listener Ġ= Ġobject Ġ: ĠOn Error Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠStream Pack Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Stream Error ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġaudio Encoder Listener Ġ= Ġobject Ġ: ĠI Encoder Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Input Frame ( buffer : ĠByteBuffer ): ĠFrame Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaudio Source . get Frame ( buffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Output Frame ( frame : ĠFrame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Ts Stream Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġts Mux . encode ( frame , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġis Start Ts Mux Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġvideo Encoder Listener Ġ= Ġobject Ġ: ĠI Encoder Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Input Frame ( buffer : ĠByteBuffer ): ĠFrame Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġneeded Ġfor Ġvideo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( RuntimeException (" No Ġvideo Ġinput Ġon ĠVideo Encoder ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Output Frame ( frame : ĠFrame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Ts Stream Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . pts Ġ+= Ġvideo Source . timestamp Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . dts Ġ= Ġif Ġ( frame . dts Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . dts !! Ġ+ Ġvideo Source . timestamp Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġts Mux . encode ( frame , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġexception Ġto Ġencoder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmux Listener Ġ= Ġobject Ġ: ĠI Mux er Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Output Frame ( packet : ĠPacket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs rt Bytes Recorder . write ( packet . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpacket . buffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" s rt ", Ġ" receive Ġ${ packet . buffer . limit ()} Ġbytes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint . write ( packet ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġexception Ġto Ġencoder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMan ages Ġerror Ġon Ġstream . ĊĠĠĠĠ Ġ* ĠSto ps Ġonly Ġstream . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġerror Ġtriggered Ġ[ Stream Pack Error ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Stream Error ( error : ĠStream Pack Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Listener ?. onError ( error ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e ( this , Ġ" on Stream Error : ĠCan 't Ġstop Ġstream ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġaudio Source Ġ= ĠAudio Capture ( logger ) ĊĠĠĠ Ġprivate Ġval Ġvideo Source Ġ= ĊĠĠĠĠĠĠĠ ĠScreen Capture ( context , Ġlogger Ġ= Ġlogger ) ĊĊĠĠĠ Ġprivate Ġvar Ġaudio Encoder Ġ= ĊĠĠĠĠĠĠĠ ĠAudio Media Codec Encoder ( audio Encoder Listener , Ġon Internal Codec Error Listener , Ġlogger ) ĊĠĠĠ Ġprivate Ġvar Ġvideo Encoder Ġ= ĊĠĠĠĠĠĠĠ ĠVideo Media Codec Encoder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder Listener , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Internal Codec Error Listener , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprotected Ġvar Ġaudio Bit rate : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġaudio Encoder . bit rate ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Encoder . bit rate Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġvar Ġvideo Bit rate : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġvideo Encoder . bit rate ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . bit rate Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġts Mux Ġ= ĠT SM ux er ( context , Ġmux Listener ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConfig ures Ġboth Ġvideo Ġand Ġaudio Ġsettings . ĊĠĠĠĠ Ġ* ĠIt Ġis Ġthe Ġfirst Ġmethod Ġto Ġcall Ġafter Ġa Ġ[ Base Screen Capture Stream er ] Ġinstantiation . ĊĠĠĠĠ Ġ* ĠIt Ġmust Ġbe Ġcall Ġwhen Ġboth Ġstream Ġand Ġcapture Ġare Ġnot Ġrunning . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġ[ Camera Stream er Configuration Helper ] Ġto Ġget Ġvalue Ġlimits . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġvideo Ġencoder Ġdoes Ġnot Ġsupport Ġ[ Video Config . level ] Ġor Ġ[ Video Config . profile ], Ġit Ġfallback s ĊĠĠĠĠ Ġ* Ġto Ġvideo Ġencoder Ġdefault Ġlevel Ġand Ġdefault Ġprofile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn side , Ġit Ġcreates Ġmost Ġof Ġrecord Ġand Ġen coders Ġobject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġaudio Config ĠAudio Ġconfiguration Ġto Ġset ĊĠĠĠĠ Ġ* Ġ@ param Ġvideo Config ĠVideo Ġconfiguration Ġto Ġset ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws Ġ[ Stream Pack Error ] Ġif Ġconfiguration Ġcan Ġnot Ġbe Ġapplied . ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ release ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Permission ( Manifest . permission . RECORD _ AUDIO ) ĊĠĠĠ Ġfun Ġconfigure ( audio Config : ĠAudio Config , Ġvideo Config : ĠVideo Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠKeep Ġsettings Ġwhen Ġwe Ġneed Ġto Ġre configure ĊĠĠĠĠĠĠĠ Ġthis . video Config Ġ= Ġvideo Config ĊĠĠĠĠĠĠĠ Ġthis . audio Config Ġ= Ġaudio Config ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Source . configure ( audio Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Encoder . configure ( audio Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Source . configure ( video Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . configure ( video Config ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint . configure ( video Config . start Bit rate Ġ+ Ġaudio Config . start Bit rate ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġstart Screen Capture ( ĊĠĠĠĠĠĠĠ Ġmedia Projection : ĠMedia Projection , ĊĠĠĠĠĠĠĠ Ġdensity : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( audio Config Ġ!= Ġnull ) Ġ{ Ġ" Audio Ġhas Ġnot Ġbeen Ġconfigured !" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( video Config Ġ!= Ġnull ) Ġ{ Ġ" Video Ġhas Ġnot Ġbeen Ġconfigured !" Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Source . encoder Surface Ġ= Ġvideo Encoder . input Surface ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Source . start Screen Capture ( media Projection , Ġdensity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Source . start Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Screen Capture () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Screen Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Stream Impl () ĊĠĠĠĠĠĠĠ Ġvideo Source . stop Screen Capture () ĊĠĠĠĠĠĠĠ Ġaudio Source . stop Stream () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġaudio / video Ġstream . ĊĠĠĠĠ Ġ* ĠStream Ġdepends Ġof Ġthe Ġendpoint : ĠAudio / video Ġcould Ġbe Ġwrite Ġto Ġa Ġfile Ġor Ġsend Ġto Ġa Ġremote ĊĠĠĠĠ Ġ* Ġdevice . ĊĠĠĠĠ Ġ* ĠTo Ġavoid Ġcreating Ġan Ġun responsive ĠUI , Ġdo Ġnot Ġcall Ġon Ġmain Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ stop Stream ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstart Stream () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( audio Config Ġ!= Ġnull ) Ġ{ Ġ" Audio Ġhas Ġnot Ġbeen Ġconfigured !" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( video Config Ġ!= Ġnull ) Ġ{ Ġ" Video Ġhas Ġnot Ġbeen Ġconfigured !" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( video Encoder . mime Type Ġ!= Ġnull ) Ġ{ Ġ" Missing Ġvideo Ġencoder Ġmime Ġtype ! ĠEncoder Ġnot Ġconfigured ?" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( audio Encoder . mime Type Ġ!= Ġnull ) Ġ{ Ġ" Missing Ġaudio Ġencoder Ġmime Ġtype ! ĠEncoder Ġnot Ġconfigured ?" Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint . start Stream () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstreams Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . mime Type ?. let Ġ{ Ġstreams . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Encoder . mime Type ?. let Ġ{ Ġstreams . add ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġts Mux . add Service ( ts Service Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġts Mux . add Streams ( ts Service Info , Ġstreams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . mime Type ?. let Ġ{ Ġvideo Ts Stream Id Ġ= Ġts Mux . get Streams ( it )[ 0 ]. pid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Encoder . mime Type ?. let Ġ{ Ġaudio Ts Stream Id Ġ= Ġts Mux . get Streams ( it )[ 0 ]. pid Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Encoder . start Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Source . start Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . start Stream () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStream Pack Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġaudio / video Ġstream . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIntern ally , Ġit Ġresets Ġaudio Ġand Ġvideo Ġrecord ers Ġand Ġen coders Ġto Ġget Ġthem Ġready Ġfor Ġanother ĊĠĠĠĠ Ġ* Ġ[ start Stream ] Ġsession . ĠIt Ġexplains Ġwhy Ġcamera Ġis Ġrestarted Ġwhen Ġcalling Ġthis Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ start Stream ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstop Stream () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Stream Impl () ĊĊĠĠĠĠĠĠĠ Ġ// ĠEncoder Ġdoes Ġnot Ġreturn Ġto ĠCONFIG URE D Ġstate ... Ġso Ġwe Ġhave Ġto Ġreset Ġeverything Ġfor Ġvideo ... ĊĠĠĠĠĠĠĠ Ġreset Audio () ĊĠĠĠĠĠĠĠ Ġreset Video () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġaudio / video Ġstream Ġimplementation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ stop Stream ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Stream Impl () Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo Source . stop Stream () ĊĠĠĠĠĠĠĠ Ġvideo Encoder . stop Stream () ĊĠĠĠĠĠĠĠ Ġaudio Encoder . stop Stream () ĊĊĠĠĠĠĠĠĠ Ġts Mux . stop () ĊĊĠĠĠĠĠĠĠ Ġendpoint . stop Stream () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrep ares Ġaudio Ġencoder Ġfor Ġanother Ġsession ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ stop Stream ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset Audio () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( audio Config Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . w ( this , Ġ" Audio Ġhas Ġnot Ġbeen Ġconfigured !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaudio Encoder . release () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRe configure ĊĠĠĠĠĠĠĠ Ġaudio Encoder . configure ( audio Config !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrep ares Ġcamera Ġand Ġvideo Ġencoder Ġfor Ġanother Ġsession ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ stop Stream ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset Video () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( video Config Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . w ( this , Ġ" Video Ġhas Ġnot Ġbeen Ġconfigured !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrestart Preview Ġ= Ġvideo Source . is Preview ing ĊĠĠĠĠĠĠĠ Ġvideo Source . stop Screen Capture () ĊĠĠĠĠĠĠĠ Ġvideo Encoder . release () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAnd Ġrestart ... ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . configure ( video Config !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Source . encoder Surface Ġ= Ġvideo Encoder . input Surface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( restart Preview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Source . restart Screen Capture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRelease s Ġrecord ers Ġand Ġen coders Ġobject . ĊĠĠĠĠ Ġ* ĠIt Ġalso Ġstops Ġpreview Ġif Ġneeded ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ configure ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Screen Capture () ĊĠĠĠĠĠĠĠ Ġaudio Encoder . release () ĊĠĠĠĠĠĠĠ Ġvideo Encoder . release () ĊĠĠĠĠĠĠĠ Ġaudio Source . release () ĊĠĠĠĠĠĠĠ Ġvideo Source . release () ĊĠĠĠĠĠĠĠ Ġendpoint . release () ĊĠĠĠ Ġ} Ċ }