/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 . google . android . fhir . datac apt ure . contrib . views . barcode . ml kit . md . camera Ċ Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Gu arded By Ċ import Ġcom . google . android . fhir . datac apt ure . contrib . views . barcode . ml kit . md . Camera Input Info Ċ import Ġcom . google . android . fhir . datac apt ure . contrib . views . barcode . ml kit . md . Input Info Ċ import Ġcom . google . android . fhir . datac apt ure . contrib . views . barcode . ml kit . md . Scoped Executor Ċ import Ġcom . google . android . gms . tasks . On Failure Listener Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . android . gms . tasks . Task Executors Ċ import Ġcom . google . ml kit . vision . common . Input Image Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** ĠAbstract Ġbase Ġclass Ġof Ġ[ Frame Processor ]. Ġ*/ Ċ abstract Ġclass ĠFrame Processor Base < T > Ġ: ĠFrame Processor Ġ{ ĊĊĠ Ġ// ĠTo Ġkeep Ġthe Ġlatest Ġframe Ġand Ġits Ġmetadata . ĊĠ Ġ@ Gu arded By (" this ") Ġprivate Ġvar Ġlatest Frame : ĠByteBuffer ? Ġ= Ġnull ĊĊĠ Ġ@ Gu arded By (" this ") Ġprivate Ġvar Ġlatest Frame MetaData : ĠFrame Metadata ? Ġ= Ġnull ĊĊĠ Ġ// ĠTo Ġkeep Ġthe Ġframe Ġand Ġmetadata Ġin Ġprocess . ĊĠ Ġ@ Gu arded By (" this ") Ġprivate Ġvar Ġprocessing Frame : ĠByteBuffer ? Ġ= Ġnull ĊĊĠ Ġ@ Gu arded By (" this ") Ġprivate Ġvar Ġprocessing Frame MetaData : ĠFrame Metadata ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġexecutor Ġ= ĠScoped Executor ( Task Executors . MAIN _ THREAD ) ĊĊĠ Ġ@ Synchron ized ĊĠ Ġoverride Ġfun Ġprocess ( ĊĠĠĠ Ġdata : ĠByteBuffer , ĊĠĠĠ Ġframe Metadata : ĠFrame Metadata , ĊĠĠĠ Ġgraphic Overlay : ĠGraph ic Overlay ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġlatest Frame Ġ= Ġdata ĊĠĠĠ Ġlatest Frame MetaData Ġ= Ġframe Metadata ĊĠĠĠ Ġif Ġ( processing Frame Ġ== Ġnull Ġ&& Ġprocessing Frame MetaData Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġprocess Latest Frame ( graphic Overlay ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Synchron ized ĊĠ Ġprivate Ġfun Ġprocess Latest Frame ( graphic Overlay : ĠGraph ic Overlay ) Ġ{ ĊĠĠĠ Ġprocessing Frame Ġ= Ġlatest Frame ĊĠĠĠ Ġprocessing Frame MetaData Ġ= Ġlatest Frame MetaData ĊĠĠĠ Ġlatest Frame Ġ= Ġnull ĊĠĠĠ Ġlatest Frame MetaData Ġ= Ġnull ĊĠĠĠ Ġval Ġframe Ġ= Ġprocessing Frame Ġ?: Ġreturn ĊĠĠĠ Ġval Ġframe MetaData Ġ= Ġprocessing Frame MetaData Ġ?: Ġreturn ĊĠĠĠ Ġval Ġimage Ġ= ĊĠĠĠĠĠ ĠInput Image . from ByteBuffer ( ĊĠĠĠĠĠĠĠ Ġframe , ĊĠĠĠĠĠĠĠ Ġframe MetaData . width , ĊĠĠĠĠĠĠĠ Ġframe MetaData . height , ĊĠĠĠĠĠĠĠ Ġframe MetaData . rotation , ĊĠĠĠĠĠĠĠ ĠInput Image . IMAGE _ FORMAT _ NV 2 1 ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġstart Ms Ġ= ĠSystem Clock . elapsed Realtime () ĊĠĠĠ Ġdetect In Image ( image ) ĊĠĠĠĠĠ Ġ. add On Success Listener ( executor ) Ġ{ Ġresults : ĠT Ġ-> ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Latency Ġis : Ġ${ System Clock . elapsed Realtime () Ġ- Ġstart Ms }") ĊĠĠĠĠĠĠĠ Ġthis @ Frame Processor Base . on Success ( ĊĠĠĠĠĠĠĠĠĠ ĠCamera Input Info ( frame , Ġframe MetaData ), ĊĠĠĠĠĠĠĠĠĠ Ġresults , ĊĠĠĠĠĠĠĠĠĠ Ġgraphic Overlay ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprocess Latest Frame ( graphic Overlay ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. add On Failure Listener ( executor ) Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠ ĠOn Failure Listener Ġ{ Ġthis @ Frame Processor Base . on Failure ( it ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠ Ġexecutor . shutdown () ĊĠ Ġ} ĊĊĠ Ġprotected Ġabstract Ġfun Ġdetect In Image ( image : ĠInput Image ): ĠTask < T > ĊĊĠ Ġ/** ĠBe Ġcalled Ġwhen Ġthe Ġdetection Ġsucceeds . Ġ*/ ĊĠ Ġprotected Ġabstract Ġfun ĠonSuccess ( input Info : ĠInput Info , Ġresults : ĠT , Ġgraphic Overlay : ĠGraph ic Overlay ) ĊĊĠ Ġprotected Ġabstract Ġfun Ġon Failure ( e : ĠException ) ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Frame Processor Base " ĊĠ Ġ} Ċ } Ċ