@ -62,6 +62,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
private float [ ] mProjectionMatrix = new float [ 16 ] ;
private float [ ] mSurfaceMatrix = new float [ 16 ] ;
private float [ ] mTransformMatrix = new float [ 16 ] ;
private ByteBuffer mGLPreviewBuffer ;
private int mCamId = - 1 ;
private int mPreviewRotation = 90 ;
@ -81,6 +82,9 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
private String [ ] cameraNames ; //摄像头名称列表
private CameraItemData curItem ; //当前选中的摄像头参数
private ArrayList < CameraItemData > itemlist = new ArrayList < > ( ) ;
private float [ ] rotationMatrix = new float [ 16 ] ;
private float [ ] vPMatrix = new float [ 16 ] ;
;
public SrsCameraView ( Context context ) {
this ( context , null ) ;
@ -91,17 +95,24 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
setEGLContextClientVersion ( 2 ) ;
setRenderer ( this ) ;
setRenderMode ( GLSurfaceView . RENDERMODE_ WHEN_DIRT Y) ;
setRenderMode ( GLSurfaceView . RENDERMODE_ CONTINUOUSL Y) ;
initCameraData ( ) ;
}
@Override
public void onSurfaceCreated ( GL10 gl , EGLConfig config ) {
int cameraid = 0 ;
GLES20 . glDisable ( GL10 . GL_DITHER ) ;
GLES20 . glClearColor ( 0 , 0 , 0 , 0 ) ;
String id = curItem . getId ( ) ;
magicFilter = new GPUImageFilter ( MagicFilterType . NONE ) ;
magicFilter . init ( getContext ( ) . getApplicationContext ( ) ) ;
try {
cameraid = Integer . parseInt ( id ) ;
} catch ( Exception e ) {
cameraid = 0 ;
}
// magicFilter.setOrtation(cameraid);
magicFilter . init ( getContext ( ) . getApplicationContext ( ) , cameraid ) ;
magicFilter . onInputSizeChanged ( mPreviewWidth , mPreviewHeight ) ;
mOESTextureId = OpenGLUtils . getExternalOESTextureID ( ) ;
@ -122,7 +133,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
mSurfaceHeight = height ;
magicFilter . onDisplaySizeChanged ( width , height ) ;
magicFilter . onInputSizeChanged ( mPreviewWidth , mPreviewHeight ) ;
mOutputAspectRatio = width > height ? ( float ) width / height : ( float ) height / width ;
float aspectRatio = mOutputAspectRatio / mInputAspectRatio ;
if ( width > height ) {
@ -134,33 +144,38 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
@Override
public void onDrawFrame ( GL10 gl ) {
if ( mSurfaceWidth ! = mPreviewWidth | | mSurfaceHeight ! = mPreviewHeight ) {
//May be a buffer overflow in enableEncoding()
//mPreviewWidth changed but onSurfaceCreated fired after enable encoding (mIsEncoding == true)
//could be calling magicFilter.onInputSizeChanged(width, height) in setPreviewResolution() after changing mGLPreviewBuffer?
//or start the encoder only after onSurfaceCreated ...
Log . e ( TAG , String . format ( "Surface dimensions differ from Preview. May be a buffer overflow. Surface: %dx%d, Preview: %dx%d " , mSurfaceWidth , mSurfaceHeight , mPreviewWidth , mPreviewHeight ) ) ;
return ;
}
//清除屏幕颜色缓冲区
GLES20 . glClearColor ( 0.0f , 0.0f , 0.0f , 0.0f ) ;
GLES20 . glClear ( GLES20 . GL_COLOR_BUFFER_BIT | GLES20 . GL_DEPTH_BUFFER_BIT ) ;
surfaceTexture . updateTexImage ( ) ;
surfaceTexture . getTransformMatrix ( mSurfaceMatrix ) ;
Matrix . multiplyMM ( mTransformMatrix , 0 , mSurfaceMatrix , 0 , mProjectionMatrix , 0 ) ;
magicFilter . setTextureTransformMatrix ( mTransformMatrix ) ;
magicFilter . onDrawFrame ( mOESTextureId ) ;
if ( mIsEncoding ) {
mGLIntBufferCache . add ( magicFilter . getGLFboBuffer ( ) ) ;
synchronized ( writeLock ) {
writeLock . notifyAll ( ) ;
}
}
}
public int computeRelativeRotation ( CameraCharacteristics characteristics , int surfaceRotationDegrees ) {
Integer sensorOrientationDegrees = characteristics . get ( CameraCharacteristics . SENSOR_ORIENTATION ) ;
// Reverse device orientation for back-facing cameras.
int sign = characteristics . get ( CameraCharacteristics . LENS_FACING ) = = CameraCharacteristics . LENS_FACING_FRONT ? 1 : - 1 ;
// Calculate desired orientation relative to camera orientation to make
// the image upright relative to the device orientation.
return ( sensorOrientationDegrees - surfaceRotationDegrees * sign + 360 ) % 360 ;
}
public void setPreviewCallback ( PreviewCallback cb ) {
@ -212,9 +227,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
public int [ ] setPreviewResolution ( int width , int height ) {
// mCamera = openCamera();
mPreviewWidth = width ;
mPreviewHeight = height ;
// Camera.Size rs = adaptPreviewResolution(mCamera.new Size(width, height));
@ -222,18 +234,14 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
// mPreviewWidth = rs.width;
// mPreviewHeight = rs.height;
// }
getHolder ( ) . setFixedSize ( mPreviewWidth , mPreviewHeight ) ;
// mCamera.getParameters().setPreviewSize(mPreviewWidth, mPreviewHeight);
mGLPreviewBuffer = ByteBuffer . allocate ( mPreviewWidth * mPreviewHeight * 4 ) ;
mInputAspectRatio = mPreviewWidth > mPreviewHeight ? ( float ) mPreviewWidth / mPreviewHeight : ( float ) mPreviewHeight / mPreviewWidth ;
return new int [ ] { mPreviewWidth , mPreviewHeight } ;
}
public boolean setFilter ( final MagicFilterType type ) {
public boolean setFilter ( final MagicFilterType type , final int cameraid ) {
queueEvent ( new Runnable ( ) {
@Override
@ -243,7 +251,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
magicFilter = MagicFilterFactory . initFilters ( type ) ;
if ( magicFilter ! = null ) {
magicFilter . init ( getContext ( ) . getApplicationContext ( ) );
magicFilter . init ( getContext ( ) . getApplicationContext ( ) , cameraid );
magicFilter . onInputSizeChanged ( mPreviewWidth , mPreviewHeight ) ;
magicFilter . onDisplaySizeChanged ( mSurfaceWidth , mSurfaceHeight ) ;
}
@ -293,7 +301,6 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
public void setPreviewOrientation ( int orientation ) {
mPreviewOrientation = orientation ;
setRotation ( 180 ) ;
}
public int getCameraId ( ) {
@ -431,7 +438,7 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
CameraCharacteristics characteristics = cameraManager . getCameraCharacteristics ( cameraId ) ;
StreamConfigurationMap map = characteristics . get ( CameraCharacteristics . SCALER_STREAM_CONFIGURATION_MAP ) ;
imageDimension = map . getOutputSizes ( SurfaceTexture . class ) [ 0 ] ;
imageReader = ImageReader . newInstance ( 640 , 480 , ImageFormat . YUV_420_888 , 10 ) ;
imageReader = ImageReader . newInstance ( 640 , 480 , ImageFormat . JPEG , 10 ) ;
// imageReader.setOnImageAvailableListener(onImageAvailableListener,null);
if ( ActivityCompat . checkSelfPermission ( getContext ( ) , android . Manifest . permission . CAMERA ) ! = PackageManager . PERMISSION_GRANTED ) {
}
@ -534,7 +541,13 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
}
return closestRange ;
}
public void setOrtation ( int cameraid ) {
// magicFilter.setOrtation(cameraid);
// magicFilter.initTex();
// setFilter(MagicFilterType.NONE,cameraid);
magicFilter . initTExt ( cameraid ) ;
}
public void stopTorch ( ) {
// if (mCamera != null) {
// try {
@ -547,6 +560,8 @@ public class SrsCameraView extends GLSurfaceView implements GLSurfaceView.Render
// }
}
public interface PreviewCallback {
void onGetRgbaFrame ( byte [ ] data , int width , int height ) ;