@ -1,6 +1,5 @@
package org.opencv.android ;
import java.io.IOException ;
import java.util.List ;
import android.annotation.TargetApi ;
@ -36,7 +35,8 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
private Mat mBaseMat ;
private byte mBuffer [ ] ;
private Mat [ ] mFrameChain ;
private int mChainIdx = 0 ;
private Thread mThread ;
private boolean mStopThread ;
@ -65,6 +65,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
@TargetApi ( 11 )
protected boolean initializeCamera ( int width , int height ) {
Log . d ( TAG , "Initialize java camera" ) ;
boolean result = true ;
synchronized ( this ) {
mCamera = null ;
@ -99,6 +100,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
Log . d ( TAG , "getSupportedPreviewSizes()" ) ;
List < android . hardware . Camera . Size > sizes = params . getSupportedPreviewSizes ( ) ;
if ( sizes ! = null ) {
/* Select the size that fits surface considering maximum size allowed */
Size frameSize = calculateCameraFrameSize ( sizes , new JavaCameraSizeAccessor ( ) , width , height ) ;
@ -127,6 +129,10 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
mBaseMat = new Mat ( mFrameHeight + ( mFrameHeight / 2 ) , mFrameWidth , CvType . CV_8UC1 ) ;
mFrameChain = new Mat [ 2 ] ;
mFrameChain [ 0 ] = new Mat ( ) ;
mFrameChain [ 1 ] = new Mat ( ) ;
AllocateCache ( ) ;
if ( Build . VERSION . SDK_INT > = Build . VERSION_CODES . HONEYCOMB ) {
@ -135,23 +141,35 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
mCamera . setPreviewTexture ( mSurfaceTexture ) ;
} else
mCamera . setPreviewDisplay ( null ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
/* Finally we are ready to start the preview */
Log . d ( TAG , "startPreview" ) ;
mCamera . startPreview ( ) ;
}
else
result = false ;
} catch ( Exception e ) {
result = false ;
e . printStackTrace ( ) ;
}
}
return true ;
return result ;
}
protected void releaseCamera ( ) {
synchronized ( this ) {
if ( mCamera ! = null ) {
mCamera . stopPreview ( ) ;
mCamera . release ( ) ;
}
mCamera = null ;
if ( mBaseMat ! = null )
mBaseMat . release ( ) ;
if ( mFrameChain ! = null ) {
mFrameChain [ 0 ] . release ( ) ;
mFrameChain [ 1 ] . release ( ) ;
}
}
}
@ -187,6 +205,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
this . notify ( ) ;
}
Log . d ( TAG , "Wating for thread" ) ;
if ( mThread ! = null )
mThread . join ( ) ;
} catch ( InterruptedException e ) {
e . printStackTrace ( ) ;
@ -224,19 +243,19 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
}
if ( ! mStopThread ) {
Mat frameMat = new Mat ( ) ;
switch ( mPreviewFormat ) {
case Highgui . CV_CAP_ANDROID_COLOR_FRAME_RGBA :
Imgproc . cvtColor ( mBaseMat , frameMat , Imgproc . COLOR_YUV2RGBA_NV21 , 4 ) ;
Imgproc . cvtColor ( mBaseMat , mFrameChain [ mChainIdx ] , Imgproc . COLOR_YUV2RGBA_NV21 , 4 ) ;
break ;
case Highgui . CV_CAP_ANDROID_GREY_FRAME :
frameMat = mBaseMat . submat ( 0 , mFrameHeight , 0 , mFrameWidth ) ;
mFrameChain [ mChainIdx ] = mBaseMat . submat ( 0 , mFrameHeight , 0 , mFrameWidth ) ;
break ;
default :
Log . e ( TAG , "Invalid frame format! Only RGBA and Gray Scale are supported!" ) ;
} ;
deliverAndDrawFrame ( frameMat ) ;
frameMat . release ( ) ;
if ( ! mFrameChain [ mChainIdx ] . empty ( ) )
deliverAndDrawFrame ( mFrameChain [ mChainIdx ] ) ;
mChainIdx = 1 - mChainIdx ;
}
} while ( ! mStopThread ) ;
Log . d ( TAG , "Finish processing thread" ) ;