package Ġorg . u ikit Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroid . content . Context Ċ import Ġcom . google . android . ex op layer 2 .* Ċ import Ġcom . google . android . ex op layer 2 . source . Extractor Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Track Group Array Ċ import Ġcom . google . android . ex op layer 2 . track selection . Adaptive Track Selection Ċ import Ġcom . google . android . ex op layer 2 . track selection . Default Track Selector Ċ import Ġcom . google . android . ex op layer 2 . track selection . Track Selection Array Ċ import Ġcom . google . android . ex op layer 2 . ui . AspectRatio Frame Layout Ċ import Ġcom . google . android . ex op layer 2 . ui . Player View Ċ import Ġcom . google . android . ex op layer 2 . upstream .* Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ import Ġorg . lib sdl . app . SDL Activity Ċ import Ġkotlin . math . absolute Value Ċ import Ġcom . google . android . ex op layer 2 . upstream . cache . Cache DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . cache . Cache Data Sink Ċ import Ġcom . google . android . ex op layer 2 . upstream . cache . Simple Cache Ċ import Ġcom . google . android . ex op layer 2 . upstream . cache . Least Recent ly Used Cache Ev ictor Ċ import Ġjava . io . File ĊĊ Ċ @ Suppress (" unused ") Ċ class ĠAV URL Asset ( parent : ĠSDL Activity , Ġurl : ĠString ) Ġ{ ĊĠĠĠ Ġinternal Ġval Ġvideo Source : ĠExtract or Media Source ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvideo Source Uri Ġ= ĠUri . parse ( url ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠExtract or Media Source Ġworks Ġfor Ġregular Ġmedia Ġfiles Ġsuch Ġas Ġmp 4 , Ġweb m , Ġmk v ĊĠĠĠĠĠĠĠ Ġval Ġcache DataSource Factory Ġ= ĠCache DataSource Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 1 2 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 4 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvideo Source Ġ= ĠExtract or Media Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Factory ( cache DataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( video Source Uri ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" unused ") Ċ class ĠAV Player ( parent : ĠSDL Activity , Ġasset : ĠAV URL Asset ) Ġ{ ĊĠĠĠ Ġinternal Ġval Ġex o Player : ĠSimple Exo Player ĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠPlayer . EventListener ĊĊĠĠĠ Ġexternal Ġfun Ġnative On Video Ready () ĊĠĠĠ Ġexternal Ġfun Ġnative On Video Ended () ĊĠĠĠ Ġexternal Ġfun Ġnative On Video Source Error () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbandwidth Meter Ġ= ĠDefault Bandwidth Meter () ĊĠĠĠĠĠĠĠ Ġval Ġvideo Track Selection Factory Ġ= ĠAdapt ive Track Selection . Factory ( bandwidth Meter ) ĊĠĠĠĠĠĠĠ Ġval Ġtrack Selector Ġ= ĠDefault Track Selector ( video Track Selection Factory ) ĊĊĠĠĠĠĠĠĠ Ġex o Player Ġ= ĠEx o Player Factory . new Simple Instance ( parent . context , Ġtrack Selector ) ĊĠĠĠĠĠĠĠ Ġex o Player . prepare ( asset . video Source ) ĊĊĠĠĠĠĠĠĠ Ġlistener Ġ= Ġobject : ĠPlayer . EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ READY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative On Video Ready () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ ENDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative On Video Ended () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Seek Processed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Seek ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( desired Seek Position Ġ!= ĠgetCurrent TimeIn Milliseconds ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek To TimeIn Milliseconds ( desired Seek Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error . type Ġ== ĠEx o Playback Exception . TYPE _ SOURCE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative On Video Source Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" SDL ", Ġ" Exo Playback Exception Ġoccurred ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġex o Player . addListener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEx o Player ĠAPI Ġto Ġplay Ġthe Ġvideo ĊĠĠĠĠĠĠĠ Ġex o Player . play When Ready Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEx o Player ĠAPI Ġto Ġpause Ġthe Ġvideo ĊĠĠĠĠĠĠĠ Ġex o Player . play When Ready Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Volume ( new Volume : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . volume Ġ= Ġnew Volume . toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetCurrent TimeIn Milliseconds (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġex o Player . current Position ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġvar Ġis Seek ing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdesired Seek Position : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Seek ed To Time : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġseek To TimeIn Milliseconds ( time In Milliseconds : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdesired Seek Position Ġ= Ġtime In Milliseconds ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġ* should * Ġmean Ġwe Ġdon 't Ġalways Ġscroll Ġto Ġthe Ġlast Ġposition Ġprovided . ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġpractice Ġwe Ġalways Ġseem Ġto Ġbe Ġat Ġthe Ġposition Ġwe Ġwant Ġanyway : ĊĠĠĠĠĠĠĠ Ġif Ġ( is Seek ing ) Ġ{ Ġreturn Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSee king Ġto Ġthe Ġexact Ġmilli second Ġis Ġvery Ġprocessor Ġint ensive Ġ( and ĠS LOW !) ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġdo Ġput Ġthat Ġeffort Ġin Ġif Ġwe 're Ġscr ub bing Ġvery Ġslow ly Ġover Ġa Ġshort Ġtime Ġperiod : ĊĠĠĠĠĠĠĠ Ġval Ġsync Parameters Ġ= Ġif Ġ(( desired Seek Position Ġ- Ġlast Seek ed To Time ). absolute Value Ġ< Ġ 2 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeek Parameters . EX ACT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeek Parameters . CLOSE ST _ SYNC ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Seek ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġex o Player . set Seek Parameters ( sync Parameters ) ĊĠĠĠĠĠĠĠ Ġex o Player . seek To ( time In Milliseconds ) ĊĠĠĠĠĠĠĠ Ġlast Seek ed To Time Ġ= Ġtime In Milliseconds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Playback Rate (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġex o Player . playback Parameters . speed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Playback Rate ( rate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . set Playback Parameters ( Playback Parameters ( rate , Ġ 1 . 0 F )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . remove Listener ( listener ) ĊĠĠĠĠĠĠĠ Ġex o Player . release () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" unused ") Ċ class ĠAV Player Layer ( private Ġval Ġparent : ĠSDL Activity , Ġplayer : ĠAV Player ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġex o Player Layout : ĠPlayer View ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġparent . context ĊĊĠĠĠĠĠĠĠ Ġex o Player Layout Ġ= ĠPlayer View ( context ) ĊĠĠĠĠĠĠĠ Ġex o Player Layout . player Ġ= Ġplayer . exo Player ĊĠĠĠĠĠĠĠ Ġex o Player Layout . use Controller Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġex o Player Layout . set Resize Mode ( AspectRatio Frame Layout . RE SIZE _ MODE _ FIXED _ WIDTH ) ĊĠĠĠĠĠĠĠ Ġex o Player Layout . tag Ġ= Ġ" Exo Player " ĊĠĠĠĠĠĠĠ Ġparent . addView ( exo Player Layout , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Frame ( x : ĠInt , Ġy : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= ĠRelative Layout . LayoutParams ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġlayout Params . set Margins ( x , Ġy , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġex o Player Layout . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove From Parent () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . v (" SDL ", Ġ" Removing Ġvideo Ġfrom Ġparent Ġlayout ") ĊĠĠĠĠĠĠĠ Ġparent . remove View In Layout ( exo Player Layout ) ĊĠĠĠ Ġ} Ċ } ĊĊĊĊ Ċ ///// ĠC aching Ġdata Ġsource Ċ // ĠThank Ġyou Ġhttps :// stackoverflow . com / a / 4 5 4 8 8 5 1 0 / 3 0 8 6 4 4 0 Ċ Ċ private Ġclass ĠCache DataSource Factory ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġmax Cache Size : ĠLong , Ġprivate Ġval Ġmax FileSize : ĠLong ) Ġ: ĠDataSource . Factory Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdefault Datasource Factory : ĠDefault DataSource Factory ĊĊĠĠĠ Ġ// ĠThe Ġcache Ġsurv ives Ġthe Ġapplication Ġlifetime , Ġotherwise Ġthe Ġcache Ġkeys Ġcan Ġget Ġconfused ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsimple Cache : ĠSimple Cache ? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Agent Ġ= ĠUtil . getUser Agent ( context , Ġ" com . flow key . Video JNI ") ĊĠĠĠĠĠĠĠ Ġval Ġbandwidth Meter Ġ= ĠDefault Bandwidth Meter () ĊĠĠĠĠĠĠĠ Ġdefault Datasource Factory Ġ= ĠDefault DataSource Factory ( this . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbandwidth Meter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Http DataSource Factory ( userAgent , Ġbandwidth Meter )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate DataSource (): ĠDataSource Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( simple Cache Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġev ictor Ġ= ĠLe ast Recent ly Used Cache Ev ictor ( max Cache Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Cache Ġ= ĠSimple Cache ( File ( context . cacheDir , Ġ" media "), Ġev ictor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCache DataSource ( simple Cache , Ġdefault Datasource Factory . create DataSource (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile DataSource (), ĠCache Data Sink ( simple Cache , Ġmax FileSize ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCache DataSource . FLAG _ BLOCK _ ON _ CACHE Ġor ĠCache DataSource . FLAG _ IGNORE _ CACHE _ ON _ ERROR , Ġnull ) ĊĠĠĠ Ġ} Ċ }