diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/com/android/camera/CaptureModule.java | 106 | ||||
-rwxr-xr-x | src/com/android/camera/SettingsManager.java | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/camera/imageprocessor/FrameProcessor.java | 14 |
3 files changed, 97 insertions, 27 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index a91e02ef3..ef62333e4 100755 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -140,10 +140,11 @@ public class CaptureModule implements CameraModule, PhotoController, public static final int DUAL_MODE = 0; public static final int BAYER_MODE = 1; public static final int MONO_MODE = 2; + public static final int SWITCH_MODE = 3; public static final int BAYER_ID = 0; public static int MONO_ID = -1; public static int FRONT_ID = -1; - public static int LOGICAL_ID = -1; + public static int SWITCH_ID = -1; public static final int INTENT_MODE_NORMAL = 0; public static final int INTENT_MODE_CAPTURE = 1; public static final int INTENT_MODE_VIDEO = 2; @@ -663,8 +664,10 @@ public class CaptureModule implements CameraModule, PhotoController, public void onError(CameraDevice cameraDevice, int error) { int id = Integer.parseInt(cameraDevice.getId()); Log.e(TAG, "onError " + id + " " + error); - cameraDevice.close(); - mCameraDevice[id] = null; + if (mCamerasOpened) { + mCameraDevice[id].close(); + mCameraDevice[id] = null; + } mCameraOpenCloseLock.release(); mCamerasOpened = false; @@ -834,7 +837,13 @@ public class CaptureModule implements CameraModule, PhotoController, public boolean isBackCamera() { String switchValue = mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA); - if (switchValue != null && !switchValue.equals("-1") ) return false; + if (switchValue != null && !switchValue.equals("-1") ) { + CharSequence[] value = mSettingsManager.getEntryValues(SettingsManager.KEY_SWITCH_CAMERA); + if (value.toString().contains("front")) + return false; + else + return true; + } String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID); if (value == null) return true; if (Integer.parseInt(value) == BAYER_ID) return true; @@ -842,6 +851,10 @@ public class CaptureModule implements CameraModule, PhotoController, } public int getCameraMode() { + String switchValue = mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA); + if (switchValue != null && !switchValue.equals("-1") ) { + return SWITCH_MODE; + } String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE); if (value != null && value.equals(SettingsManager.SCENE_MODE_DUAL_STRING)) return DUAL_MODE; value = mSettingsManager.getValue(SettingsManager.KEY_MONO_ONLY); @@ -991,9 +1004,12 @@ public class CaptureModule implements CameraModule, PhotoController, case MONO_MODE: createSession(MONO_ID); break; + case SWITCH_MODE: + createSession(SWITCH_ID); + break; } } else { - int cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + int cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; createSession(cameraId); } } @@ -1008,10 +1024,13 @@ public class CaptureModule implements CameraModule, PhotoController, return builder; } - private void waitForPreviewSurfaceReady() { + private boolean waitForPreviewSurfaceReady() { try { if (!mSurfaceReady) { if (!mSurfaceReadyLock.tryAcquire(2000, TimeUnit.MILLISECONDS)) { + if (mPaused) { + return true;// camera has closed, don'r create session + } Log.d(TAG, "Time out waiting for surface."); throw new RuntimeException("Time out waiting for surface."); } @@ -1020,6 +1039,7 @@ public class CaptureModule implements CameraModule, PhotoController, } catch (InterruptedException e) { e.printStackTrace(); } + return false; } private void updatePreviewSurfaceReadyState(boolean rdy) { @@ -1119,7 +1139,9 @@ public class CaptureModule implements CameraModule, PhotoController, Log.d(TAG, "cameracapturesession - onClosed"); } }; - waitForPreviewSurfaceReady(); + if (waitForPreviewSurfaceReady()) { + return;//if camera closed, don't create session + } Surface surface = getPreviewSurfaceForSession(id); if(id == getMainCameraId()) { @@ -1347,9 +1369,12 @@ public class CaptureModule implements CameraModule, PhotoController, case MONO_MODE: lockFocus(MONO_ID); break; + case SWITCH_MODE: + lockFocus(SWITCH_ID); + break; } } else { - int cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + int cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; if(takeZSLPicture(cameraId)) { return; } @@ -1382,9 +1407,12 @@ public class CaptureModule implements CameraModule, PhotoController, case MONO_MODE: cameraId = MONO_ID; break; + case SWITCH_MODE: + cameraId = SWITCH_ID; + break; } } else { - cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; } captureStillPicture(cameraId); } @@ -1522,6 +1550,8 @@ public class CaptureModule implements CameraModule, PhotoController, } applySettingsForJpegInformation(captureBuilder, id); + applyAFRegions(captureBuilder, id); + applyAERegions(captureBuilder, id); if (!mIsSupportedQcfa) { addPreviewSurface(captureBuilder, null, id); } @@ -2529,9 +2559,13 @@ public class CaptureModule implements CameraModule, PhotoController, msg.arg1 = MONO_ID; mCameraHandler.sendMessage(msg); break; + case SWITCH_MODE: + msg.arg1 = SWITCH_ID; + mCameraHandler.sendMessage(msg); + break; } } else { - int cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + int cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; msg.arg1 = cameraId; mCameraHandler.sendMessage(msg); } @@ -2673,9 +2707,12 @@ public class CaptureModule implements CameraModule, PhotoController, case MONO_MODE: applyZoomAndUpdate(MONO_ID); break; + case SWITCH_MODE: + applyZoomAndUpdate(SWITCH_ID); + break; } } else { - int cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + int cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; applyZoomAndUpdate(cameraId); } mUI.updateFaceViewCameraBound(mCropRegion[getMainCameraId()]); @@ -2690,9 +2727,11 @@ public class CaptureModule implements CameraModule, PhotoController, return cameraId == BAYER_ID; case MONO_MODE: return cameraId == MONO_ID; + case SWITCH_MODE: + return cameraId == SWITCH_ID; } - } else if (LOGICAL_ID != -1) { - return cameraId == LOGICAL_ID; + } else if (SWITCH_ID != -1) { + return cameraId == SWITCH_ID; } else { return cameraId == FRONT_ID; } @@ -2859,9 +2898,12 @@ public class CaptureModule implements CameraModule, PhotoController, case MONO_MODE: triggerFocusAtPoint(x, y, MONO_ID); break; + case SWITCH_MODE: + triggerFocusAtPoint(x, y, SWITCH_ID); + break; } } else { - int cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + int cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; triggerFocusAtPoint(x, y, cameraId); } } @@ -2874,10 +2916,12 @@ public class CaptureModule implements CameraModule, PhotoController, return BAYER_ID; case MONO_MODE: return MONO_ID; + case SWITCH_MODE: + return SWITCH_ID; } return 0; } else { - int cameraId = LOGICAL_ID == -1? FRONT_ID : LOGICAL_ID; + int cameraId = SWITCH_ID == -1? FRONT_ID : SWITCH_ID; return cameraId; } } @@ -3216,7 +3260,6 @@ public class CaptureModule implements CameraModule, PhotoController, } Log.d(TAG, "StartRecordingVideo " + cameraId); mStartRecPending = true; - mIsRecordingVideo = true; mMediaRecorderPausing = false; checkAndPlayRecordSound(cameraId, true); @@ -3369,14 +3412,26 @@ public class CaptureModule implements CameraModule, PhotoController, e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } catch (IllegalArgumentException e) { + //surface of mediaRecorder is not valid + Toast.makeText(mActivity,"Could not start media recorder.\n " + + "Can't start video recording.", Toast.LENGTH_LONG).show(); + releaseMediaRecorder(); + releaseAudioFocus(); + mStartRecPending = false; + mIsRecordingVideo = false; + mUI.showUIafterRecording(); + mFrameProcessor.setVideoOutputSurface(null); + restartSession(true); } - mStartRecPending = false; return true; } private boolean startMediaRecorder() { try { mMediaRecorder.start(); // Recording is now started + mIsRecordingVideo = true; + mStartRecPending = false; Log.d(TAG, "StartRecordingVideo done."); } catch (RuntimeException e) { Toast.makeText(mActivity,"Could not start media recorder.\n " + @@ -3594,10 +3649,14 @@ public class CaptureModule implements CameraModule, PhotoController, } public void onButtonPause() { + if (!isRecorderReady()) + return; pauseVideoRecording(); } public void onButtonContinue() { + if (!isRecorderReady()) + return; resumeVideoRecording(); } @@ -4793,9 +4852,12 @@ public class CaptureModule implements CameraModule, PhotoController, updatePreviewBayer |= applyPreferenceToPreview(BAYER_ID, key, value); updatePreviewMono |= applyPreferenceToPreview(MONO_ID, key, value); break; + case SWITCH_MODE: + updatePreviewMono |= applyPreferenceToPreview(SWITCH_ID, key, value); + break; } - } else if (LOGICAL_ID != -1) { - updatePreviewLogical = applyPreferenceToPreview(LOGICAL_ID,key,value); + } else if (SWITCH_ID != -1) { + updatePreviewLogical = applyPreferenceToPreview(SWITCH_ID,key,value); }else { updatePreviewFront |= applyPreferenceToPreview(FRONT_ID, key, value); } @@ -4842,9 +4904,9 @@ public class CaptureModule implements CameraModule, PhotoController, if (updatePreviewLogical) { try { - if (checkSessionAndBuilder(mCaptureSession[LOGICAL_ID], - mPreviewRequestBuilder[LOGICAL_ID])) { - mCaptureSession[LOGICAL_ID].setRepeatingRequest(mPreviewRequestBuilder[LOGICAL_ID] + if (checkSessionAndBuilder(mCaptureSession[SWITCH_ID], + mPreviewRequestBuilder[SWITCH_ID])) { + mCaptureSession[SWITCH_ID].setRepeatingRequest(mPreviewRequestBuilder[SWITCH_ID] .build(), mCaptureCallback, mCameraHandler); } } catch (CameraAccessException | IllegalStateException e) { diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java index 0e42dfbfc..5c3a2c7bd 100755 --- a/src/com/android/camera/SettingsManager.java +++ b/src/com/android/camera/SettingsManager.java @@ -620,8 +620,8 @@ public class SettingsManager implements ListMenu.SettingsListener { public int getInitialCameraId(SharedPreferences pref) { int switchId = Integer.parseInt( pref.getString(SettingsManager.KEY_SWITCH_CAMERA,"-1")); - CaptureModule.LOGICAL_ID = switchId; - Log.d(TAG,"LOGICAL_ID = " + switchId); + CaptureModule.SWITCH_ID = switchId; + Log.d(TAG,"SWITCH_ID = " + switchId); if (switchId != -1) return switchId; String value = pref.getString(SettingsManager.KEY_CAMERA_ID, "0"); int frontBackId = Integer.parseInt(value); diff --git a/src/com/android/camera/imageprocessor/FrameProcessor.java b/src/com/android/camera/imageprocessor/FrameProcessor.java index 6b0c97732..2e7ded169 100644..100755 --- a/src/com/android/camera/imageprocessor/FrameProcessor.java +++ b/src/com/android/camera/imageprocessor/FrameProcessor.java @@ -59,7 +59,7 @@ import java.util.concurrent.Semaphore; import org.codeaurora.snapcam.R; public class FrameProcessor { - + private static final String TAG = "FrameProcessor"; private ImageReader mInputImageReader; private Allocation mInputAllocation; private Allocation mProcessAllocation; @@ -326,7 +326,11 @@ public class FrameProcessor { public void setOutputSurface(Surface surface) { mSurfaceAsItIs = surface; if (mFinalFilters.size() != 0) { - mOutputAllocation.setSurface(surface); + if (surface != null && surface.isValid()) { + mOutputAllocation.setSurface(surface); + } else { + Log.d(TAG,"OutputSurface is not valid"); + } } } @@ -352,7 +356,11 @@ public class FrameProcessor { mVideoOutputAllocation = Allocation.createTyped(mRs, rgbTypeBuilder.create(), Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT); } - mVideoOutputAllocation.setSurface(surface); + if (surface != null && surface.isValid()) { + mVideoOutputAllocation.setSurface(surface); + } else { + Log.d(TAG,"Video outputSurface is not valid"); + } } } } |