@@ -59,7 +59,6 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal
59
59
private ListenableFuture <ProcessCameraProvider > cameraProviderFuture ;
60
60
private ByteBuffer [] buffers ;
61
61
private int currentBuffer = 0 ;
62
- private boolean buffersInitialized = false ;
63
62
private static final int NUMBER_OF_BUFFERS =2 ;
64
63
private static final boolean useExternalCameraTexture = false ;
65
64
@@ -356,7 +355,7 @@ public void run() {
356
355
}
357
356
358
357
private void bindImageAnalysis (@ NonNull ProcessCameraProvider cameraProvider ) {
359
- CameraResolutionPreset cameraResolutionPreset = CameraResolutionPreset .P640x480 ;
358
+ CameraResolutionPreset cameraResolutionPreset = CameraResolutionPreset .P1920x1080 ;
360
359
int width ;
361
360
int height ;
362
361
int orientation = getScreenOrientation ();
@@ -384,90 +383,38 @@ private void bindImageAnalysis(@NonNull ProcessCameraProvider cameraProvider) {
384
383
preview .setSurfaceProvider (surfaceProvider );
385
384
surfaceProvider .setMirror (lensFacing == CameraSelector .LENS_FACING_FRONT );
386
385
} else {
386
+ buffers = new ByteBuffer [NUMBER_OF_BUFFERS ];
387
+ for (int i = 0 ; i < NUMBER_OF_BUFFERS ; i ++) {
388
+ buffers [i ] = ByteBuffer .allocateDirect (width * height * 4 );
389
+ buffers [i ].order (ByteOrder .nativeOrder ());
390
+ buffers [i ].position (0 );
391
+ }
392
+
387
393
ImageAnalysis imageAnalysis = new ImageAnalysis .Builder ()
394
+ .setOutputImageFormat (ImageAnalysis .OUTPUT_IMAGE_FORMAT_RGBA_8888 )
388
395
.setTargetResolution (cameraResolution )
389
396
.setBackpressureStrategy (ImageAnalysis .STRATEGY_KEEP_ONLY_LATEST )
390
397
.build ();
391
398
imageAnalysis .setAnalyzer (ContextCompat .getMainExecutor (this ), imageAnalyzer );
392
- buffersInitialized = false ;
393
399
cameraProvider .unbindAll ();
394
400
cameraProvider .bindToLifecycle ((LifecycleOwner )this , cameraSelector , imageAnalysis );
395
401
}
396
402
}
397
403
398
- private void initializeBuffers (int size ) {
399
- this .buffers = new ByteBuffer [NUMBER_OF_BUFFERS ];
400
- for (int i = 0 ; i < NUMBER_OF_BUFFERS ; i ++) {
401
- this .buffers [i ] = ByteBuffer .allocateDirect (size );
402
- this .buffers [i ].order (ByteOrder .nativeOrder ());
403
- this .buffers [i ].position (0 );
404
- }
405
- }
406
-
407
404
private ImageAnalysis .Analyzer imageAnalyzer = new ImageAnalysis .Analyzer () {
408
405
@ Override
409
406
public void analyze (@ NonNull ImageProxy image ) {
410
- ByteBuffer yBuffer = image .getPlanes ()[0 ].getBuffer ();
411
- ByteBuffer uBuffer = image .getPlanes ()[1 ].getBuffer ();
412
- ByteBuffer vBuffer = image .getPlanes ()[2 ].getBuffer ();
413
-
414
- int ySize = yBuffer .remaining ();
415
- int uSize = uBuffer .remaining ();
416
- int vSize = vBuffer .remaining ();
417
-
418
- if (!buffersInitialized ) {
419
- buffersInitialized = true ;
420
- initializeBuffers (ySize + uSize + vSize );
421
- }
422
-
423
- byte [] byteData = new byte [ySize + uSize + vSize ];
424
-
425
- int width = image .getWidth ();
426
- int yStride = image .getPlanes ()[0 ].getRowStride ();
427
- int uStride = image .getPlanes ()[1 ].getRowStride ();
428
- int vStride = image .getPlanes ()[2 ].getRowStride ();
429
- int outputOffset = 0 ;
430
- if (width == yStride ) {
431
- yBuffer .get (byteData , outputOffset , ySize );
432
- outputOffset += ySize ;
433
- } else {
434
- for (int inputOffset = 0 ; inputOffset < ySize ; inputOffset += yStride ) {
435
- yBuffer .position (inputOffset );
436
- yBuffer .get (byteData , outputOffset , Math .min (yBuffer .remaining (), width ));
437
- outputOffset += width ;
438
- }
439
- }
440
- //U and V are swapped
441
- if (width == vStride ) {
442
- vBuffer .get (byteData , outputOffset , vSize );
443
- outputOffset += vSize ;
444
- } else {
445
- for (int inputOffset = 0 ; inputOffset < vSize ; inputOffset += vStride ) {
446
- vBuffer .position (inputOffset );
447
- vBuffer .get (byteData , outputOffset , Math .min (vBuffer .remaining (), width ));
448
- outputOffset += width ;
449
- }
450
- }
451
- if (width == uStride ) {
452
- uBuffer .get (byteData , outputOffset , uSize );
453
- outputOffset += uSize ;
454
- } else {
455
- for (int inputOffset = 0 ; inputOffset < uSize ; inputOffset += uStride ) {
456
- uBuffer .position (inputOffset );
457
- uBuffer .get (byteData , outputOffset , Math .min (uBuffer .remaining (), width ));
458
- outputOffset += width ;
459
- }
460
- }
461
-
462
- buffers [currentBuffer ].put (byteData );
407
+ ByteBuffer buffer = image .getPlanes ()[0 ].getBuffer ();
408
+ buffer .rewind ();
409
+ buffers [currentBuffer ].put (buffer );
463
410
buffers [currentBuffer ].position (0 );
464
411
if (deepAR != null ) {
465
412
deepAR .receiveFrame (buffers [currentBuffer ],
466
413
image .getWidth (), image .getHeight (),
467
414
image .getImageInfo ().getRotationDegrees (),
468
415
lensFacing == CameraSelector .LENS_FACING_FRONT ,
469
- DeepARImageFormat .YUV_420_888 ,
470
- image .getPlanes ()[1 ].getPixelStride ()
416
+ DeepARImageFormat .RGBA_8888 ,
417
+ image .getPlanes ()[0 ].getPixelStride ()
471
418
);
472
419
}
473
420
currentBuffer = (currentBuffer + 1 ) % NUMBER_OF_BUFFERS ;
0 commit comments