package Ġcom . b enden en . vision ai . video processor Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġcom . b enden en . vision ai . videos ource . Video Source Listener Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ class ĠVideo Processor Ġ: ĠVideo Source Listener , ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġvideo Processor Listener : ĠVideo Processor Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġsteps Ġ= Ġmutable ListOf < Video Processor Step < out ĠStep Config , Ġout ĠStep Result < out ĠAny >> >() ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . IO Ġ+ Ġjob ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠStep Config > Ġadd Step ( video Processor Step : ĠVideo Processor Step < T , ĠStep Result < out ĠAny >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġsteps . add ( video Processor Step ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< C Ġ: ĠStep Config , ĠR Ġ: ĠStep Result < out ĠAny >> Ġset Steps ( ĊĠĠĠĠĠĠĠ Ġvideo Processor Steps : ĠList < Video Processor Step < C , ĠR >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . steps . clear () ĊĠĠĠĠĠĠĠ Ġthis . steps . addAll ( video Processor Steps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Listener ( video Processor Listener : ĠVideo Processor Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . video Processor Listener Ġ= Ġvideo Processor Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġget Step At Position ( position : ĠInt ): ĠVideo Processor Step < Step Config , ĠStep Result < out ĠAny >> Ġ= ĊĠĠĠĠĠĠĠ Ġsteps [ position ] Ġas ĠVideo Processor Step < Step Config , ĠStep Result < out ĠAny >> ĊĊĠĠĠ Ġsuspend Ġfun Ġapply For Data ( ĊĠĠĠĠĠĠĠ Ġbitmap : ĠBitmap ĊĠĠĠ Ġ): ĠStep Result < out ĠAny > Ġ= Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠStep Result < out ĠAny > Ġ= Ġobject Ġ: ĠStep Result < Bitmap > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Source Bitmap (): ĠBitmap Ġ= Ġbitmap ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Result (): ĠBitmap Ġ= Ġbitmap ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Bitmap For Next Step (): ĠBitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( step Ġin Ġsteps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġstep . apply For Data ( result . get Bitmap For Next Step ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Frame ( rgb Bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠImplement Ġfor Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Bitmap ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġsteps [ 0 ]. apply For Data ( bitmap ) ĊĠĠĠĠĠĠĠ Ġvideo Processor Listener ?. on Step Result ( 0 , Ġbitmap , Ġresult ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 1 Ġuntil Ġsteps . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġsteps [ index ]. apply For Data ( result . get Bitmap For Next Step ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvideo Processor Listener ?. on New Frame Processed ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo Processor Listener ?. on Finish () ĊĠĠĠ Ġ} Ċ }