Skip to content

Commit 4362396

Browse files
Support for RGBA_8888
1 parent 699e1ae commit 4362396

File tree

3 files changed

+17
-71
lines changed

3 files changed

+17
-71
lines changed

app/build.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ dependencies {
3131
implementation 'androidx.navigation:navigation-fragment:2.3.4'
3232
implementation 'androidx.navigation:navigation-ui:2.3.4'
3333
testImplementation 'junit:junit:4.12'
34-
implementation "ai.deepar.ar:DeepAR:5.4.1"
34+
implementation "ai.deepar.ar:DeepAR:5.4.4"
3535
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
3636
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
37-
def camerax_version = "1.0.1"
37+
def camerax_version = "1.2.3"
3838
implementation "androidx.camera:camera-core:${camerax_version}"
3939
implementation "androidx.camera:camera-camera2:$camerax_version"
4040
implementation "androidx.camera:camera-lifecycle:$camerax_version"
41-
implementation "androidx.camera:camera-view:1.0.0-alpha27"
41+
implementation "androidx.camera:camera-view:$camerax_version"
4242
}

app/src/main/java/ai/deepar/deepar_example/ARSurfaceProvider.java

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
* Surface provider used for CameraX preview use-case that provides DeepAR's external GL texture
2424
* wrapped in SurfaceTexture.
2525
*/
26-
@OptIn(markerClass = androidx.camera.core.ExperimentalUseCaseGroup.class)
2726
public class ARSurfaceProvider implements Preview.SurfaceProvider {
2827
private static final String tag = ARSurfaceProvider.class.getSimpleName();
2928

app/src/main/java/ai/deepar/deepar_example/MainActivity.java

+14-67
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal
5959
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
6060
private ByteBuffer[] buffers;
6161
private int currentBuffer = 0;
62-
private boolean buffersInitialized = false;
6362
private static final int NUMBER_OF_BUFFERS=2;
6463
private static final boolean useExternalCameraTexture = false;
6564

@@ -356,7 +355,7 @@ public void run() {
356355
}
357356

358357
private void bindImageAnalysis(@NonNull ProcessCameraProvider cameraProvider) {
359-
CameraResolutionPreset cameraResolutionPreset = CameraResolutionPreset.P640x480;
358+
CameraResolutionPreset cameraResolutionPreset = CameraResolutionPreset.P1920x1080;
360359
int width;
361360
int height;
362361
int orientation = getScreenOrientation();
@@ -384,90 +383,38 @@ private void bindImageAnalysis(@NonNull ProcessCameraProvider cameraProvider) {
384383
preview.setSurfaceProvider(surfaceProvider);
385384
surfaceProvider.setMirror(lensFacing == CameraSelector.LENS_FACING_FRONT);
386385
} 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+
387393
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
394+
.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
388395
.setTargetResolution(cameraResolution)
389396
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
390397
.build();
391398
imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), imageAnalyzer);
392-
buffersInitialized = false;
393399
cameraProvider.unbindAll();
394400
cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, imageAnalysis);
395401
}
396402
}
397403

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-
407404
private ImageAnalysis.Analyzer imageAnalyzer = new ImageAnalysis.Analyzer() {
408405
@Override
409406
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);
463410
buffers[currentBuffer].position(0);
464411
if (deepAR != null) {
465412
deepAR.receiveFrame(buffers[currentBuffer],
466413
image.getWidth(), image.getHeight(),
467414
image.getImageInfo().getRotationDegrees(),
468415
lensFacing == CameraSelector.LENS_FACING_FRONT,
469-
DeepARImageFormat.YUV_420_888,
470-
image.getPlanes()[1].getPixelStride()
416+
DeepARImageFormat.RGBA_8888,
417+
image.getPlanes()[0].getPixelStride()
471418
);
472419
}
473420
currentBuffer = (currentBuffer + 1) % NUMBER_OF_BUFFERS;

0 commit comments

Comments
 (0)