package Ġcom . l kl . med ial ib . core Ċ Ċ import Ġandroid . media . Media Codec Ċ import Ġandroid . media . Media Codec Info Ċ import Ġandroid . media . Media Format Ċ import Ġcom . l kl . common lib . util . Log Utils Ċ import Ġcom . l kl . med ial ib . bean . Frame Data Ċ import Ġcom . l kl . med ial ib . constant . Media Const Ċ import Ġcom . l kl . med ial ib . constant . Video Property Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** Ċ Ġ* Ġ è§Ĩé¢ĳ ç¼ĸçłģ å·¥ä½ľ çº¿ç¨ĭ Ċ Ġ* Ċ Ġ* Ġ@ author Ġlik un lun Ċ Ġ* Ġ@ since Ġ 2 0 2 2 / 0 1 / 0 6 Ċ Ġ*/ Ċ class ĠVideo Encoder Thread ( ĊĠĠĠ Ġprivate Ġval ĠmimeType : ĠString , ĊĠĠĠ Ġprivate Ġval Ġmedia Format : ĠMedia Format , ĊĠĠĠ Ġprivate Ġval Ġcallback : ĠCodec Callback , ĊĠĠĠ Ġthread Name : ĠString Ġ= ĠTAG Ċ ) Ġ: ĠBase Media Thread ( thread Name ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Video Encoder Core " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTIME OUT _ USE C Ġ= Ġ 1 0 0 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Encoder : ĠMedia Codec ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Buffer Info Ġ= ĠMedia Codec . Buffer Info () ĊĊĠĠĠ Ġoverride Ġfun Ġprepare () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" before Ġmedia Format : Ġ$ media Format ") ĊĠĠĠĠĠĠĠ Ġmedia Format . setString ( Media Format . KEY _ MIME , ĠmimeType ) ĊĠĠĠĠĠĠĠ Ġmedia Format . set Integer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Format . KEY _ COLOR _ FORMAT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Codec Info . Codec Capabilities . COLOR _ Format Y UV 4 2 0 Flex ible ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmedia Format . set Integer ( Media Format . KEY _ BIT _ RATE , ĠVideo Property . BIT _ RATE ) ĊĠĠĠĠĠĠĠ Ġmedia Format . set Integer ( Media Format . KEY _ FRAME _ RATE , ĠVideo Property . FPS ) ĊĠĠĠĠĠĠĠ Ġmedia Format . set Integer ( Media Format . KEY _ I _ FRAME _ INTERVAL , ĠVideo Property . IF R AME _ INTERVAL ) ĊĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" after Ġmedia Format : Ġ$ media Format ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa ĠMedia Codec Ġencoder , Ġand Ġconfigure Ġit Ġwith Ġour Ġformat . Ġ ĠGet Ġa ĠSurface ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġcan Ġuse Ġfor Ġinput Ġand Ġwrap Ġit Ġwith Ġa Ġclass Ġthat Ġhandles Ġthe ĠE GL Ġwork . ĊĠĠĠĠĠĠĠ Ġm Encoder Ġ= ĠMedia Codec . create Encoder ByType ( mime Type ) ĊĠĠĠĠĠĠĠ Ġm Encoder ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ( media Format , Ġnull , Ġnull , ĠMedia Codec . CONFIGURE _ FLAG _ ENCODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrain () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġframe Data Ġ= Ġcallback . get Frame Data () ĊĠĠĠĠĠĠĠ Ġframe Data ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput DataTo Input Buffer ( data , Ġtimestamp Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwait Time ( 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĲĳ ç¼ĸçłģ åĻ¨ Input Buffer ä¸Ń å¡« åħ¥ æķ°æį® ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠNV 2 1 æķ°æį® ĊĠĠĠĠ Ġ* Ġ@ param Ġtimestamp Ġ æĹ¶éĹ´ æĪ ³ Ġus ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġput DataTo Input Buffer ( data : ĠByteArray , Ġtimestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Encoder ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġde queue Input Buffer (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġget Input Buffer ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" Input Buffer Ġis Ġnull Ġpoint ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . put ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Input Buffer ( index , Ġ 0 , Ġdata . size , Ġtimestamp , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrain Encoder ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ ç¼ĸçłģ åĲİçļĦ H 2 6 4 æķ°æį® å¹¶ åŃĺ åħ¥ ç¼ĵåŃĺ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdrain Encoder ( encoder : ĠMedia Codec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoder Status Ġ= Ġencoder . de queue Output Buffer ( m Buffer Info , ĠTIME OUT _ USE C ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoder Status Ġ== ĠMedia Codec . INFO _ TRY _ AG AIN _ L ATER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġoutput Ġavailable Ġyet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Media Const . PRINT _ DEBUG _ LOG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" no Ġoutput Ġavailable , Ġspin ning Ġto Ġawait ĠEOS ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( encoder Status Ġ== ĠMedia Codec . INFO _ OUTPUT _ FORMAT _ CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġhappen Ġbefore Ġreceiving Ġbuffers , Ġand Ġshould Ġonly Ġhappen Ġonce ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Format Ġ= Ġencoder . output Format ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" encoder Ġoutput Ġformat Ġchanged : Ġ$ media Format ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . format Changed ( media Format ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( encoder Status Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" unexpected Ġresult Ġfrom Ġencoder . de queue Output Buffer : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoder Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Data Ġ= Ġencoder . getOutput Buffer ( encoder Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . w ( TAG , Ġ" encoder Output Buffer Ġ$ encoder Status Ġwas Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Encode Data ( encoded Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoder . release Output Buffer ( encoder Status , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Buffer Info . flags Ġand ĠMedia Codec . BUFFER _ FLAG _ END _ OF _ STREAM Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" end Ġof Ġstream Ġreached ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak Ġ// Ġout Ġof Ġwhile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Encode Data ( encoded Data : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Buffer Info . flags Ġand ĠMedia Codec . BUFFER _ FLAG _ CODEC _ CONFIG Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcodec Ġconfig Ġdata Ġwas Ġpulled Ġout Ġand Ġfed Ġto Ġthe Ġmux er Ġwhen Ġwe Ġgot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe ĠINFO _ OUTPUT _ FORMAT _ CHANGED Ġstatus . Ġ ĠIgnore Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" ign oring ĠBUFFER _ FLAG _ CODEC _ CONFIG ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Buffer Info . size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Buffer Info . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadjust Ġthe ĠByteBuffer Ġvalues Ġto Ġmatch ĠBuffer Info Ġ( not Ġneeded ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Data . position ( m Buffer Info . offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Data . limit ( m Buffer Info . offset Ġ+ Ġm Buffer Info . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åıĸ åĩº ç¼ĸçłģ å¥½çļĦ H 2 6 4 æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( m Buffer Info . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Data [ data ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Data Ġ= ĠFrame Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Buffer Info . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Buffer Info . presentation Time Us Ġ/ Ġ 1 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Buffer Info . flags Ġ== ĠMedia Codec . BUFFER _ FLAG _ KEY _ FRAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . put Frame Data ( frame Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Media Const . PRINT _ DEBUG _ LOG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . d ( TAG , Ġ" encode Ġdata : Ġ$ frame Data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRelease s Ġencoder Ġresources . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback . finished () ĊĠĠĠĠĠĠĠ Ġm Encoder ?. release () ĊĠĠĠ Ġ} Ċ }