package Ġcom . s idd y de velo ps . detect my mask Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Image Format Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . media . Image Ċ import Ġandroid . os . Build Ċ import Ġandroid . rend erscript .* Ċ import Ġandroid . util . Config Ċ import Ġandroidx . core . os . Build Compat Ċ import Ġjava . nio . ByteBuffer ĊĊ Ċ class ĠY uv To RGB Converter ( context Ġ: ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġrs Ġ= ĠRender Script . create ( context ) ĊĠĠĠ Ġprivate Ġval Ġscript Y uv To RG b Ġ= ĠScript Intr insic Y uv To RGB . create ( rs , ĠElement . U 8 _ 4 ( rs )) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġy uv Buffer : ĠByteBuffer ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinput Allocation Ġ: ĠAl location ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Allocation : ĠAl location ĊĠĠĠ Ġprivate Ġvar Ġpixel Count : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġy uv To Rgb ( image : ĠImage , Ġoutput : ĠBitmap ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! :: y uv Buffer . isInitialized ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Count Ġ= Ġimage . crop Rect . width ()* image . crop Rect . height () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Size Bits Ġ= ĠImage Format . get Bits Per Pixel ( Image Format . Y UV _ 4 2 0 _ 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy uv Buffer Ġ= ĠByteBuffer . allocate Direct ( pixel Count * pixel Size Bits / 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġy uv Buffer . rewind () ĊĠĠĠĠĠĠĠ Ġimage To ByteBuffer ( image , y uv Buffer . array ()) ĊĊĠĠĠĠĠĠĠ Ġif (! :: input Allocation . isInitialized ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelem Type Ġ= ĠType . Builder ( rs , ĠElement . Y UV ( rs )). set Y uv Format ( Image Format . NV 2 1 ). create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Allocation Ġ= ĠAl location . create Sized ( rs , Ġelem Type . element , Ġy uv Buffer . array (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif (! :: output Allocation . isInitialized ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Allocation Ġ= ĠAl location . createFrom Bitmap ( rs , Ġoutput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput Allocation . copyFrom ( y uv Buffer . array ()) ĊĠĠĠĠĠĠĠ Ġscript Y uv To RG b . setInput ( input Allocation ) ĊĠĠĠĠĠĠĠ Ġscript Y uv To RG b . forEach ( output Allocation ) ĊĠĠĠĠĠĠĠ Ġoutput Allocation . copy To ( output ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġimage To ByteBuffer ( image : ĠImage , Ġoutput Buffer : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( Build Config . DEBUG Ġ&& Ġimage . format Ġ!= ĠImage Format . Y UV _ 4 2 0 _ 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Assertion ĠFailure ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġimage Crop Ġ= Ġimage . crop Rect ĊĠĠĠĠĠĠĠ Ġval Ġimage Planes Ġ= Ġimage . planes ĊĠĠĠĠĠĠĠ Ġimage Planes . forEach Indexed Ġ{ Ġplane Index , Ġplane Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Stride : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Offset : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( plane Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Stride Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Stride Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ= Ġpixel Count Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Stride Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ= Ġpixel Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Buffer Ġ= Ġplane . buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Stride Ġ= Ġplane . row Stride ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Stride Ġ= Ġplane . pixel Stride ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Crop Ġ= Ġif ( plane Index Ġ== Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Crop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( image Crop . left / 2 , Ġimage Crop . top / 2 , Ġimage Crop . right / 2 , Ġimage Crop . bottom / 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Width Ġ= Ġplane Crop . width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Height Ġ= Ġplane Crop . height () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Buffer Ġ= ĠByteArray ( plane . row Stride ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Length Ġ= Ġif ( pixel Stride Ġ== Ġ 1 Ġ&& Ġoutput Stride Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( plane Width - 1 )* pixel Stride + 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( row Ġin Ġ 0 Ġuntil Ġplane Height ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Buffer . position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( row Ġ+ Ġplane Crop . top )* row Stride Ġ+ Ġplane Crop . left * pixel Stride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pixel Stride Ġ== Ġ 1 Ġ&& Ġoutput Stride Ġ== Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Buffer . get ( output Buffer , output Offset , row Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset += row Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Buffer . get ( row Buffer , 0 , row Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 0 Ġuntil Ġplane Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Buffer [ output Offset ] Ġ= Ġrow Buffer [ col * pixel Stride ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ+= Ġoutput Stride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }