package Ġcom . sn ail . live . stream Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . graphics . Image Format Ċ import Ġandroid . hardware . Camera Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Surface Holder Ċ import Ġcom . sn ail . sn ail ffmpeg . utils . P Log Ċ Ċ /** Ċ Ġ* Ġhelper ç±» ï¼Į çĶ¨äºİ æĵįä½ľ Camera Ċ Ġ*/ Ċ class ĠCamera Helper Ġ: ĠSurface Holder . Callback , ĠCamera . Preview Callback Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Activity : ĠActivity ĊĠĠĠ Ġprivate Ġvar Ġm Height : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Width : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Camera Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Camera : ĠCamera ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbuffer : ĠByteArray ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Surface Holder : ĠSurface Holder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Preview Callback : ĠCamera . Preview Callback ĊĠĠĠ Ġprivate Ġvar Ġm Rotation : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbytes : ĠByteArray ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm On Changed Size Listener : Ġ( width : ĠInt , Ġheight : ĠInt ) Ġ-> ĠUnit ĊĊĊĠĠĠ Ġconstructor ( activity : ĠActivity , Ġcamera Id : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Activity Ġ= Ġactivity ĊĠĠĠĠĠĠĠ Ġm Camera Id Ġ= Ġcamera Id ĊĠĠĠĠĠĠĠ Ġm Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġm Height Ġ= Ġheight ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪĩæį¢ æĳ Ħ åĥı å¤´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġswitch Camera () Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" switch Camera ") ĊĠĠĠĠĠĠĠ Ġif Ġ( m Camera Id Ġ== ĠCamera . Camera Info . CAMERA _ F ACING _ BACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Id Ġ= ĠCamera . Camera Info . CAMERA _ F ACING _ FRONT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Id Ġ= ĠCamera . Camera Info . CAMERA _ F ACING _ BACK ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstop Preview () ĊĠĠĠĠĠĠĠ Ġstart Preview () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åģľæŃ¢ é¢Ħ è§Ī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Preview () Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" stop Preview ") ĊĠĠĠĠĠĠĠ Ġm Camera ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Preview Callback ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Face Detection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¼Ģå§ĭ é¢Ħ è§Ī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Preview () Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" start Preview ") ĊĠĠĠĠĠĠĠ Ġm Camera Ġ= ĠCamera . open ( m Camera Id ) ĊĠĠĠĠĠĠĠ Ġvar Ġparameters Ġ= Ġm Camera ?. parameters ĊĠĠĠĠĠĠĠ Ġparameters ?. preview Format Ġ= ĠImage Format . NV 2 1 Ċ // ĠĠĠĠĠĠĠ Ġparameters ?. focus Mode Ġ= ĠCamera . Parameters . FOCUS _ MODE _ CONT IN UO US _ PI CTURE ĊĠĠĠĠĠĠĠ Ġset Preview Size ( parameters !! ) ĊĠĠĠĠĠĠĠ Ġset Preview Orientation ( parameters ) ĊĠĠĠĠĠĠĠ Ġbuffer Ġ= ĠByteArray ( m Width Ġ* Ġm Height Ġ* Ġ 3 Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġbytes Ġ= ĠByteArray ( buffer . size ) ĊĠĠĠĠĠĠĠ Ġm Camera ?. parameters Ġ= Ġparameters ĊĠĠĠĠĠĠĠ Ġm Camera ?. add Callback Buffer ( buffer ) ĊĠĠĠĠĠĠĠ Ġm Camera ?. set Preview Callback With Buffer ( this ) ĊĠĠĠĠĠĠĠ Ġm Camera ?. set Preview Display ( m Surface Holder ) ĊĠĠĠĠĠĠĠ Ġm Camera ?. start Preview () Ċ // ĠĠĠĠĠĠĠ Ġm Camera ?. cancel Auto Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® é¢Ħ è§Ī çĶ» éĿ¢çļĦ è§Ĵ åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Preview Orientation ( param ters : ĠCamera . Parameters ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" set Preview Orientation ") ĊĠĠĠĠĠĠĠ Ġvar Ġinfo Ġ= ĠCamera . Camera Info () ĊĠĠĠĠĠĠĠ ĠCamera . get Camera Info ( m Camera Id , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġm Rotation Ġ= Ġm Activity . window Manager ?. default Display ?. rotation !! ĊĠĠĠĠĠĠĠ Ġvar Ġde gress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde gress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Changed Size Listener . invoke ( m Height , Ġm Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 9 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde gress Ġ= Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Changed Size Listener . invoke ( m Height , Ġm Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 1 8 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde gress Ġ= Ġ 1 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Changed Size Listener . invoke ( m Height , Ġm Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 2 7 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde gress Ġ= Ġ 2 7 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Changed Size Listener . invoke ( m Height , Ġm Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( info . facing Ġ== ĠCamera . Camera Info . CAMERA _ F ACING _ FRONT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ( info . orientation Ġ+ Ġde gress ) Ġ% Ġ 3 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ( 3 6 0 Ġ- Ġresult ) Ġ% Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ( info . orientation Ġ- Ġde gress Ġ+ Ġ 3 6 0 ) Ġ% Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Camera ?. set Display Orientation ( result ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġset Preview Size ( parameters : ĠCamera . Parameters ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" set Preview Size ") ĊĠĠĠĠĠĠĠ Ġvar Ġsupported Preview Sizes : ĠMutable List < Camera . Size > Ġ= Ġparameters . supported Preview Sizes ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġsupported Preview Sizes . get ( 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġm Ġ= ĠMath . abs ( size . height Ġ* Ġsize . width Ġ- Ġm Width Ġ* Ġm Height ) ĊĠĠĠĠĠĠĠ Ġsupported Preview Sizes . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġsupported Preview Sizes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= ĠMath . abs ( it . height Ġ* Ġit . width Ġ- Ġm Width Ġ* Ġm Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ< Ġm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Width Ġ= Ġsize . width ĊĠĠĠĠĠĠĠ Ġm Height Ġ= Ġsize . height ĊĠĠĠĠĠĠĠ Ġparameters . set Preview Size ( m Width , Ġm Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® é¢Ħ è§Ī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Preview Display ( surface Holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" set Preview Display ") ĊĠĠĠĠĠĠĠ Ġm Surface Holder Ġ= Ġsurface Holder ĊĠĠĠĠĠĠĠ Ġm Surface Holder . add Callback ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® é¢Ħ è§Ī åĽŀè°ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Preview Callback ( preview Callback : ĠCamera . Preview Callback ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" set Preview Callback ") ĊĠĠĠĠĠĠĠ Ġm Preview Callback Ġ= Ġpreview Callback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Changed ( holder : ĠSurface Holder ?, Ġformat : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠP Log . d (" surface Changed ") ĊĠĠĠĠĠĠĠ Ġstop Preview () ĊĠĠĠĠĠĠĠ Ġstart Preview () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Destroyed ( holder : ĠSurface Holder ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Preview () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Created ( holder : ĠSurface Holder ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Preview Frame ( data : ĠByteArray ?, Ġcamera : ĠCamera ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation 9 0 ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 9 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 1 8 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 2 7 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Preview Callback . on Preview Frame ( bytes , Ġcamera ) ĊĠĠĠĠĠĠĠ Ġcamera ?. add Callback Buffer ( buffer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĹ ĭ è½¬ 9 0 åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrotation 9 0 ( data : ĠByteArray ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġy Size Ġ= Ġm Width Ġ* Ġm Height ĊĠĠĠĠĠĠĠ Ġvar Ġuv Height Ġ= Ġm Height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġif Ġ( m Camera Id Ġ== ĠCamera . Camera Info . CAMERA _ F ACING _ BACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġm Height Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ index ++] Ġ= Ġdata ?. get ( m Width Ġ* Ġj Ġ+ Ġi ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Width Ġstep Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġuv Height Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// v ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ index ++] Ġ= Ġdata ?. get ( y Size Ġ+ Ġm Width Ġ* Ġj Ġ+ Ġi ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// u ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ index ++] Ġ= Ġdata ?. get ( y Size Ġ+ Ġm Width Ġ* Ġj Ġ+ Ġi Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Pos : ĠInt Ġ= Ġm Width Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġm Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ index ++] Ġ= Ġdata ?. get ( n Pos Ġ- Ġi ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Pos Ġ+= Ġm Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// u Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Width Ġstep Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Pos : ĠInt Ġ= Ġy Size Ġ+ Ġm Width Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġuv Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ index ++] Ġ= Ġdata ?. get ( n Pos Ġ- Ġi Ġ- Ġ 1 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ index ++] Ġ= Ġdata ?. get ( n Pos Ġ- Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Pos Ġ+= Ġm Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® çĽĳåĲ¬ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset On Changed Size Listener ( listener : Ġ( width : ĠInt , Ġheight : ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm On Changed Size Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩĬæĶ¾ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Surface Holder . remove Callback ( this ) ĊĠĠĠĠĠĠĠ Ġstop Preview () ĊĠĠĠ Ġ} Ċ }