public static class JavaCameraSizeAccessor implements ListItemAccessor {
+ @Override
public int getWidth(Object obj) {
Camera.Size size = (Camera.Size) obj;
return size.width;
}
+ @Override
public int getHeight(Object obj) {
Camera.Size size = (Camera.Size) obj;
return size.height;
}
}
+ private boolean mCameraFrameReady = false;
+
@Override
protected boolean connectCamera(int width, int height) {
if (!initializeCamera(width, height))
return false;
+ mCameraFrameReady = false;
+
/* now we can start update thread */
Log.d(TAG, "Starting processing thread");
mStopThread = false;
return true;
}
+ @Override
protected void disconnectCamera() {
/* 1. We need to stop thread which updating the frames
* 2. Stop camera and release it
/* Now release camera */
releaseCamera();
+
+ mCameraFrameReady = false;
}
+ @Override
public void onPreviewFrame(byte[] frame, Camera arg1) {
Log.d(TAG, "Preview Frame received. Frame size: " + frame.length);
synchronized (this) {
- mFrameChain[1 - mChainIdx].put(0, 0, frame);
+ mFrameChain[mChainIdx].put(0, 0, frame);
+ mCameraFrameReady = true;
this.notify();
}
if (mCamera != null)
}
private class JavaCameraFrame implements CvCameraViewFrame {
+ @Override
public Mat gray() {
return mYuvFrameData.submat(0, mHeight, 0, mWidth);
}
+ @Override
public Mat rgba() {
Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);
return mRgba;
private class CameraWorker implements Runnable {
+ @Override
public void run() {
do {
synchronized (JavaCameraView.this) {
try {
- JavaCameraView.this.wait();
+ while (!mCameraFrameReady && !mStopThread) {
+ JavaCameraView.this.wait();
+ }
} catch (InterruptedException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
+ if (mCameraFrameReady)
+ mChainIdx = 1 - mChainIdx;
}
- if (!mStopThread) {
- if (!mFrameChain[mChainIdx].empty())
- deliverAndDrawFrame(mCameraFrame[mChainIdx]);
- mChainIdx = 1 - mChainIdx;
+ if (!mStopThread && mCameraFrameReady) {
+ mCameraFrameReady = false;
+ if (!mFrameChain[1 - mChainIdx].empty())
+ deliverAndDrawFrame(mCameraFrame[1 - mChainIdx]);
}
} while (!mStopThread);
Log.d(TAG, "Finish processing thread");