From dca2af0a95ccb682d57bcea43f03fb01b929edf3 Mon Sep 17 00:00:00 2001 From: Pannag Sanketi Date: Thu, 13 Oct 2011 17:11:37 -0700 Subject: Fixing crash in video capture intent with effects on The video capture intent sends an uri and not a filename. Adding support in the EffectsRecorder and VideoCamera for uri. The effectsrecorder passes that on to the MediaEncoderFilter. Related to bug: 5441217 Change-Id: I784a6c3b53a586950adcc07a6e26659838ae3cbc --- src/com/android/camera/EffectsRecorder.java | 35 +++++++++++++++++++++++++---- src/com/android/camera/VideoCamera.java | 20 +++++++++++------ 2 files changed, 44 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/com/android/camera/EffectsRecorder.java b/src/com/android/camera/EffectsRecorder.java index 9b3e3b13..84d80356 100644 --- a/src/com/android/camera/EffectsRecorder.java +++ b/src/com/android/camera/EffectsRecorder.java @@ -46,6 +46,7 @@ import java.io.IOException; import java.io.FileNotFoundException; import java.io.File; import java.lang.Runnable; +import java.io.FileDescriptor; /** @@ -84,6 +85,7 @@ public class EffectsRecorder { private MediaRecorder.OnErrorListener mErrorListener; private String mOutputFile; + private FileDescriptor mFd; private int mOrientationHint = 0; private int mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; @@ -193,6 +195,21 @@ public class EffectsRecorder { } mOutputFile = outputFile; + mFd = null; + } + + public void setOutputFile(FileDescriptor fd) { + switch (mState) { + case STATE_RECORD: + throw new RuntimeException("setOutputFile cannot be called while recording!"); + case STATE_RELEASED: + throw new RuntimeException("setOutputFile called on an already released recorder!"); + default: + break; + } + + mOutputFile = null; + mFd = fd; } public void setPreviewDisplay(SurfaceHolder previewSurfaceHolder, @@ -537,15 +554,21 @@ public class EffectsRecorder { break; } - if (mOutputFile == null) { - throw new RuntimeException("No output file name provided!"); + if ((mOutputFile == null) && (mFd == null)) { + throw new RuntimeException("No output file name or descriptor provided!"); } if (mState == STATE_CONFIGURE) { startPreview(); } + Filter recorder = mRunner.getGraph().getFilter("recorder"); - recorder.setInputValue("outputFile", mOutputFile); + if (mFd != null) { + recorder.setInputValue("outputFileDescriptor", mFd); + } else { + recorder.setInputValue("outputFile", mOutputFile); + } + recorder.setInputValue("orientationHint", mOrientationHint); if (mInfoListener != null) { recorder.setInputValue("infoListener", mInfoListener); @@ -722,7 +745,11 @@ public class EffectsRecorder { if (mEffectsListener != null) { mHandler.post(new Runnable() { public void run() { - mEffectsListener.onEffectsError(exception, mOutputFile); + if (mFd != null) { + mEffectsListener.onEffectsError(exception, null); + } else { + mEffectsListener.onEffectsError(exception, mOutputFile); + } } }); } diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java index 3bf852d8..2566271c 100755 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -71,6 +71,7 @@ import android.widget.Toast; import java.io.File; import java.io.IOException; +import java.io.FileDescriptor; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; @@ -1286,21 +1287,26 @@ public class VideoCamera extends ActivityBase if (mIsVideoCaptureIntent && myExtras != null) { Uri saveUri = (Uri) myExtras.getParcelable(MediaStore.EXTRA_OUTPUT); if (saveUri != null) { - mVideoFilename = saveUri.toString(); - } else { - mVideoFilename = null; + try { + mVideoFileDescriptor = + mContentResolver.openFileDescriptor(saveUri, "rw"); + mCurrentVideoUri = saveUri; + } catch (java.io.FileNotFoundException ex) { + // invalid uri + Log.e(TAG, ex.toString()); + } } - } else { - mVideoFilename = null; } // TODO: Timelapse // Set output file - if (mVideoFilename == null) { + if (mVideoFileDescriptor != null) { + mEffectsRecorder.setOutputFile(mVideoFileDescriptor.getFileDescriptor()); + } else { generateVideoFilename(mProfile.fileFormat); + mEffectsRecorder.setOutputFile(mVideoFilename); } - mEffectsRecorder.setOutputFile(mVideoFilename); } -- cgit v1.2.3