Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit f90580b

Browse files
committed
Added preview callback
1 parent ab3b778 commit f90580b

File tree

4 files changed

+97
-11
lines changed

4 files changed

+97
-11
lines changed

library/src/main/api14/com/google/android/cameraview/Camera1.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,17 @@ void setUpPreview() {
121121
} else {
122122
mCamera.setPreviewTexture((SurfaceTexture) mPreview.getSurfaceTexture());
123123
}
124+
125+
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
126+
@Override
127+
public void onPreviewFrame(byte[] data, Camera camera) {
128+
final Camera.Parameters parameters = camera.getParameters();
129+
final int width = parameters.getPreviewSize().width;
130+
final int height = parameters.getPreviewSize().height;
131+
mCallback.onPreviewFrame(data, parameters.getPreviewFormat(), width, height);
132+
}
133+
});
134+
124135
} catch (IOException e) {
125136
throw new RuntimeException(e);
126137
}

library/src/main/api21/com/google/android/cameraview/Camera2.java

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import android.media.Image;
3232
import android.media.ImageReader;
3333
import android.support.annotation.NonNull;
34+
import android.support.annotation.Nullable;
3435
import android.util.Log;
3536
import android.util.SparseIntArray;
3637
import android.view.Surface;
@@ -156,19 +157,26 @@ public void onReady() {
156157

157158
@Override
158159
public void onImageAvailable(ImageReader reader) {
159-
try (Image image = reader.acquireNextImage()) {
160-
Image.Plane[] planes = image.getPlanes();
161-
if (planes.length > 0) {
162-
ByteBuffer buffer = planes[0].getBuffer();
163-
byte[] data = new byte[buffer.remaining()];
164-
buffer.get(data);
165-
mCallback.onPictureTaken(data);
166-
}
160+
byte[] data = getByteDataFromImageReader(reader);
161+
if (data != null) {
162+
mCallback.onPictureTaken(data);
167163
}
168164
}
169-
170165
};
171166

167+
private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener
168+
= new ImageReader.OnImageAvailableListener() {
169+
170+
@Override
171+
public void onImageAvailable(ImageReader reader) {
172+
byte[] data = getByteDataFromImageReader(reader);
173+
if (data != null) {
174+
mCallback.onPreviewFrame(data, reader.getImageFormat(),
175+
reader.getWidth(),
176+
reader.getHeight());
177+
}
178+
}
179+
};
172180

173181
private String mCameraId;
174182

@@ -182,6 +190,8 @@ public void onImageAvailable(ImageReader reader) {
182190

183191
private ImageReader mImageReader;
184192

193+
private ImageReader mCallbackImageDataReader;
194+
185195
private final SizeMap mPreviewSizes = new SizeMap();
186196

187197
private final SizeMap mPictureSizes = new SizeMap();
@@ -232,6 +242,11 @@ void stop() {
232242
mImageReader.close();
233243
mImageReader = null;
234244
}
245+
246+
if (mCallbackImageDataReader != null) {
247+
mCallbackImageDataReader.close();
248+
mCallbackImageDataReader = null;
249+
}
235250
}
236251

237252
@Override
@@ -435,11 +450,49 @@ protected void collectPictureSizes(SizeMap sizes, StreamConfigurationMap map) {
435450

436451
private void prepareImageReader() {
437452
Size largest = mPictureSizes.sizes(mAspectRatio).last();
438-
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
453+
initImageReader(largest.getWidth(), largest.getHeight());
454+
455+
Size size = chooseOptimalSize();
456+
initCallbackImageDataReader(size.getWidth(), size.getHeight());
457+
}
458+
459+
private void initImageReader(int width, int height){
460+
mImageReader = ImageReader.newInstance(width, height,
439461
ImageFormat.JPEG, /* maxImages */ 2);
440462
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, null);
441463
}
442464

465+
private void initCallbackImageDataReader(int width, int height) {
466+
467+
if (mCallbackImageDataReader != null) {
468+
mCallbackImageDataReader.close();
469+
}
470+
471+
mCallbackImageDataReader = ImageReader.newInstance(width, height,
472+
ImageFormat.NV21, /* maxImages */ 1);
473+
mCallbackImageDataReader.setOnImageAvailableListener(mOnPreviewImageAvailableListener, null);
474+
}
475+
476+
/**
477+
* Extract the byte data from the ImageReader
478+
* @param reader
479+
* @return byte array or null if failed
480+
*/
481+
@Nullable
482+
private byte[] getByteDataFromImageReader(@NonNull ImageReader reader) {
483+
byte[] data = null;
484+
try (Image image = reader.acquireNextImage()) {
485+
Image.Plane[] planes = image.getPlanes();
486+
if (planes.length > 0) {
487+
ByteBuffer buffer = planes[0].getBuffer();
488+
data = new byte[buffer.remaining()];
489+
buffer.get(data);
490+
}
491+
}
492+
return data;
493+
}
494+
495+
443496
/**
444497
* <p>Starts opening a camera device.</p>
445498
* <p>The result will be processed in {@link #mCameraDeviceCallback}.</p>
@@ -463,11 +516,14 @@ void startCaptureSession() {
463516
}
464517
Size previewSize = chooseOptimalSize();
465518
mPreview.setBufferSize(previewSize.getWidth(), previewSize.getHeight());
519+
466520
Surface surface = mPreview.getSurface();
467521
try {
468522
mPreviewRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
469523
mPreviewRequestBuilder.addTarget(surface);
470-
mCamera.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
524+
mPreviewRequestBuilder.addTarget(mCallbackImageDataReader.getSurface());
525+
mCamera.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface(),
526+
mCallbackImageDataReader.getSurface()),
471527
mSessionCallback, null);
472528
} catch (CameraAccessException e) {
473529
throw new RuntimeException("Failed to start camera session");

library/src/main/base/com/google/android/cameraview/CameraViewImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ interface Callback {
7777

7878
void onPictureTaken(byte[] data);
7979

80+
void onPreviewFrame(byte[] data, int format, int width, int height);
8081
}
8182

8283
}

library/src/main/java/com/google/android/cameraview/CameraView.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,13 @@ public void onPictureTaken(byte[] data) {
448448
}
449449
}
450450

451+
@Override
452+
public void onPreviewFrame(byte[] data, int format, int width, int height) {
453+
for (Callback callback : mCallbacks) {
454+
callback.onPreviewFrame(data, format, width, height);
455+
}
456+
}
457+
451458
public void reserveRequestLayoutOnOpen() {
452459
mRequestLayoutOnOpen = true;
453460
}
@@ -534,6 +541,17 @@ public void onCameraClosed(CameraView cameraView) {
534541
*/
535542
public void onPictureTaken(CameraView cameraView, byte[] data) {
536543
}
544+
545+
/**
546+
* Called when a preview frame is rendered
547+
* @param data raw byte data
548+
* @param format data format
549+
* @param width image width
550+
* @param height image height
551+
*/
552+
public void onPreviewFrame(byte[] data, int format, int width, int height){
553+
}
554+
537555
}
538556

539557
}

0 commit comments

Comments
 (0)