diff options
-rw-r--r-- | include/media/stagefright/CameraSourceTimeLapse.h | 9 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.cpp | 27 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.h | 2 | ||||
-rw-r--r-- | media/libstagefright/CameraSourceTimeLapse.cpp | 50 |
4 files changed, 51 insertions, 37 deletions
diff --git a/include/media/stagefright/CameraSourceTimeLapse.h b/include/media/stagefright/CameraSourceTimeLapse.h index 7135a33..e1cd0c8 100644 --- a/include/media/stagefright/CameraSourceTimeLapse.h +++ b/include/media/stagefright/CameraSourceTimeLapse.h @@ -31,13 +31,12 @@ class Camera; class CameraSourceTimeLapse : public CameraSource { public: - static CameraSourceTimeLapse *Create(bool useStillCameraForTimeLapse, + static CameraSourceTimeLapse *Create( int64_t timeBetweenTimeLapseFrameCaptureUs, int32_t width, int32_t height, int32_t videoFrameRate); static CameraSourceTimeLapse *CreateFromCamera(const sp<Camera> &camera, - bool useStillCameraForTimeLapse, int64_t timeBetweenTimeLapseFrameCaptureUs, int32_t width, int32_t height, int32_t videoFrameRate); @@ -87,7 +86,6 @@ private: bool mCameraIdle; CameraSourceTimeLapse(const sp<Camera> &camera, - bool useStillCameraForTimeLapse, int64_t timeBetweenTimeLapseFrameCaptureUs, int32_t width, int32_t height, int32_t videoFrameRate); @@ -124,6 +122,11 @@ private: virtual void dataCallbackTimestamp(int64_t timestampUs, int32_t msgType, const sp<IMemory> &data); + // If the passed in size (width x height) is a supported preview size, + // the function sets the camera's preview size to it and returns true. + // Otherwise returns false. + bool trySettingPreviewSize(int32_t width, int32_t height); + // The still camera may not support the demanded video width and height. // We look for the supported picture sizes from the still camera and // choose the smallest one with either dimensions higher than the corresponding diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index f1b8334..77a9cca 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -507,19 +507,6 @@ status_t StagefrightRecorder::setParamTimeLapseEnable(int32_t timeLapseEnable) { return OK; } -status_t StagefrightRecorder::setParamUseStillCameraForTimeLapse(int32_t useStillCamera) { - LOGV("setParamUseStillCameraForTimeLapse: %d", useStillCamera); - - if(useStillCamera == 0) { - mUseStillCameraForTimeLapse= false; - } else if (useStillCamera == 1) { - mUseStillCameraForTimeLapse= true; - } else { - return BAD_VALUE; - } - return OK; -} - status_t StagefrightRecorder::setParamTimeBetweenTimeLapseFrameCapture(int64_t timeUs) { LOGV("setParamTimeBetweenTimeLapseFrameCapture: %lld us", timeUs); @@ -657,11 +644,6 @@ status_t StagefrightRecorder::setParameter( if (safe_strtoi32(value.string(), &timeLapseEnable)) { return setParamTimeLapseEnable(timeLapseEnable); } - } else if (key == "use-still-camera-for-time-lapse") { - int32_t useStillCamera; - if (safe_strtoi32(value.string(), &useStillCamera)) { - return setParamUseStillCameraForTimeLapse(useStillCamera); - } } else if (key == "time-between-time-lapse-frame-capture") { int64_t timeBetweenTimeLapseFrameCaptureMs; if (safe_strtoi64(value.string(), &timeBetweenTimeLapseFrameCaptureMs)) { @@ -1008,10 +990,10 @@ status_t StagefrightRecorder::setupCamera() { // Set the actual video recording frame size CameraParameters params(mCamera->getParameters()); - // dont change the preview size when using still camera for time lapse + // dont change the preview size because time lapse may be using still camera // as mVideoWidth, mVideoHeight may correspond to HD resolution not // supported by the video camera. - if (!(mCaptureTimeLapse && mUseStillCameraForTimeLapse)) { + if (!mCaptureTimeLapse) { params.setPreviewSize(mVideoWidth, mVideoHeight); } @@ -1027,7 +1009,7 @@ status_t StagefrightRecorder::setupCamera() { // Check on video frame size int frameWidth = 0, frameHeight = 0; newCameraParams.getPreviewSize(&frameWidth, &frameHeight); - if (!(mCaptureTimeLapse && mUseStillCameraForTimeLapse) && + if (!mCaptureTimeLapse && (frameWidth < 0 || frameWidth != mVideoWidth || frameHeight < 0 || frameHeight != mVideoHeight)) { LOGE("Failed to set the video frame size to %dx%d", @@ -1072,7 +1054,7 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) if (err != OK) return err; *cameraSource = (mCaptureTimeLapse) ? - CameraSourceTimeLapse::CreateFromCamera(mCamera, mUseStillCameraForTimeLapse, + CameraSourceTimeLapse::CreateFromCamera(mCamera, mTimeBetweenTimeLapseFrameCaptureUs, mVideoWidth, mVideoHeight, mFrameRate): CameraSource::CreateFromCamera(mCamera); CHECK(*cameraSource != NULL); @@ -1418,7 +1400,6 @@ status_t StagefrightRecorder::reset() { mMaxFileSizeBytes = 0; mTrackEveryTimeDurationUs = 0; mCaptureTimeLapse = false; - mUseStillCameraForTimeLapse = true; mTimeBetweenTimeLapseFrameCaptureUs = -1; mCaptureAuxVideo = false; mCameraSourceSplitter = NULL; diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h index d50a393..f1dc9e6 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.h +++ b/media/libmediaplayerservice/StagefrightRecorder.h @@ -98,7 +98,6 @@ private: int64_t mTrackEveryTimeDurationUs; bool mCaptureTimeLapse; - bool mUseStillCameraForTimeLapse; int64_t mTimeBetweenTimeLapseFrameCaptureUs; bool mCaptureAuxVideo; sp<MediaSourceSplitter> mCameraSourceSplitter; @@ -138,7 +137,6 @@ private: status_t setParamAudioSamplingRate(int32_t sampleRate); status_t setParamAudioTimeScale(int32_t timeScale); status_t setParamTimeLapseEnable(int32_t timeLapseEnable); - status_t setParamUseStillCameraForTimeLapse(int32_t useStillCamera); status_t setParamTimeBetweenTimeLapseFrameCapture(int64_t timeUs); status_t setParamAuxVideoHeight(int32_t height); status_t setParamAuxVideoWidth(int32_t width); diff --git a/media/libstagefright/CameraSourceTimeLapse.cpp b/media/libstagefright/CameraSourceTimeLapse.cpp index ba99501..7595a28 100644 --- a/media/libstagefright/CameraSourceTimeLapse.cpp +++ b/media/libstagefright/CameraSourceTimeLapse.cpp @@ -37,7 +37,7 @@ namespace android { // static -CameraSourceTimeLapse *CameraSourceTimeLapse::Create(bool useStillCameraForTimeLapse, +CameraSourceTimeLapse *CameraSourceTimeLapse::Create( int64_t timeBetweenTimeLapseFrameCaptureUs, int32_t width, int32_t height, int32_t videoFrameRate) { @@ -47,13 +47,12 @@ CameraSourceTimeLapse *CameraSourceTimeLapse::Create(bool useStillCameraForTimeL return NULL; } - return new CameraSourceTimeLapse(camera, useStillCameraForTimeLapse, - timeBetweenTimeLapseFrameCaptureUs, width, height, videoFrameRate); + return new CameraSourceTimeLapse(camera, timeBetweenTimeLapseFrameCaptureUs, + width, height, videoFrameRate); } // static CameraSourceTimeLapse *CameraSourceTimeLapse::CreateFromCamera(const sp<Camera> &camera, - bool useStillCameraForTimeLapse, int64_t timeBetweenTimeLapseFrameCaptureUs, int32_t width, int32_t height, int32_t videoFrameRate) { @@ -61,17 +60,15 @@ CameraSourceTimeLapse *CameraSourceTimeLapse::CreateFromCamera(const sp<Camera> return NULL; } - return new CameraSourceTimeLapse(camera, useStillCameraForTimeLapse, - timeBetweenTimeLapseFrameCaptureUs, width, height, videoFrameRate); + return new CameraSourceTimeLapse(camera, timeBetweenTimeLapseFrameCaptureUs, + width, height, videoFrameRate); } CameraSourceTimeLapse::CameraSourceTimeLapse(const sp<Camera> &camera, - bool useStillCameraForTimeLapse, int64_t timeBetweenTimeLapseFrameCaptureUs, int32_t width, int32_t height, int32_t videoFrameRate) : CameraSource(camera), - mUseStillCameraForTimeLapse(useStillCameraForTimeLapse), mTimeBetweenTimeLapseFrameCaptureUs(timeBetweenTimeLapseFrameCaptureUs), mTimeBetweenTimeLapseVideoFramesUs(1E6/videoFrameRate), mLastTimeLapseFrameRealTimestampUs(0), @@ -80,7 +77,13 @@ CameraSourceTimeLapse::CameraSourceTimeLapse(const sp<Camera> &camera, LOGV("starting time lapse mode"); mVideoWidth = width; mVideoHeight = height; - if (mUseStillCameraForTimeLapse) { + + if (trySettingPreviewSize(width, height)) { + mUseStillCameraForTimeLapse = false; + } else { + // TODO: Add a check to see that mTimeBetweenTimeLapseFrameCaptureUs is greater + // than the fastest rate at which the still camera can take pictures. + mUseStillCameraForTimeLapse = true; CHECK(setPictureSizeToClosestSupported(width, height)); mNeedCropping = computeCropRectangleOffset(); mMeta->setInt32(kKeyWidth, width); @@ -91,6 +94,35 @@ CameraSourceTimeLapse::CameraSourceTimeLapse(const sp<Camera> &camera, CameraSourceTimeLapse::~CameraSourceTimeLapse() { } +bool CameraSourceTimeLapse::trySettingPreviewSize(int32_t width, int32_t height) { + int64_t token = IPCThreadState::self()->clearCallingIdentity(); + String8 s = mCamera->getParameters(); + IPCThreadState::self()->restoreCallingIdentity(token); + + CameraParameters params(s); + Vector<Size> supportedSizes; + params.getSupportedPreviewSizes(supportedSizes); + + bool previewSizeSupported = false; + for (uint32_t i = 0; i < supportedSizes.size(); ++i) { + int32_t pictureWidth = supportedSizes[i].width; + int32_t pictureHeight = supportedSizes[i].height; + + if ((pictureWidth == width) && (pictureHeight == height)) { + previewSizeSupported = true; + } + } + + if (previewSizeSupported) { + LOGV("Video size (%d, %d) is a supported preview size", width, height); + params.setPreviewSize(width, height); + CHECK(mCamera->setParameters(params.flatten())); + return true; + } + + return false; +} + bool CameraSourceTimeLapse::setPictureSizeToClosestSupported(int32_t width, int32_t height) { int64_t token = IPCThreadState::self()->clearCallingIdentity(); String8 s = mCamera->getParameters(); |