diff options
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.cpp | 96 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.h | 7 |
2 files changed, 93 insertions, 10 deletions
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index dfddae0..7d6754b 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -24,6 +24,7 @@ #include <media/stagefright/AudioSource.h> #include <media/stagefright/AMRWriter.h> #include <media/stagefright/CameraSource.h> +#include <media/stagefright/CameraSourceTimeLapse.h> #include <media/stagefright/MPEG4Writer.h> #include <media/stagefright/MediaDebug.h> #include <media/stagefright/MediaDefs.h> @@ -472,6 +473,45 @@ status_t StagefrightRecorder::setParamAudioTimeScale(int32_t timeScale) { return OK; } +status_t StagefrightRecorder::setParamTimeLapseEnable(int32_t timeLapseEnable) { + LOGV("setParamTimeLapseEnable: %d", timeLapseEnable); + + if(timeLapseEnable == 0) { + mCaptureTimeLapse = false; + } else if (timeLapseEnable == 1) { + mCaptureTimeLapse = true; + } else { + return BAD_VALUE; + } + 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); + + // Not allowing time more than a day + if (timeUs <= 0 || timeUs > 86400*1E6) { + LOGE("Time between time lapse frame capture (%lld) is out of range [0, 1 Day]", timeUs); + return BAD_VALUE; + } + + mTimeBetweenTimeLapseFrameCaptureUs = timeUs; + return OK; +} + status_t StagefrightRecorder::setParameter( const String8 &key, const String8 &value) { LOGV("setParameter: key (%s) => value (%s)", key.string(), value.string()); @@ -555,6 +595,22 @@ status_t StagefrightRecorder::setParameter( if (safe_strtoi32(value.string(), &timeScale)) { return setParamVideoTimeScale(timeScale); } + } else if (key == "time-lapse-enable") { + int32_t timeLapseEnable; + 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)) { + return setParamTimeBetweenTimeLapseFrameCapture( + 1000LL * timeBetweenTimeLapseFrameCaptureMs); + } } else { LOGE("setParameter: failed to find key %s", key.string()); } @@ -812,10 +868,14 @@ void StagefrightRecorder::clipVideoFrameWidth() { } status_t StagefrightRecorder::setupCameraSource() { - clipVideoBitRate(); - clipVideoFrameRate(); - clipVideoFrameWidth(); - clipVideoFrameHeight(); + if(!mCaptureTimeLapse) { + // Dont clip for time lapse capture as encoder will have enough + // time to encode because of slow capture rate of time lapse. + clipVideoBitRate(); + clipVideoFrameRate(); + clipVideoFrameWidth(); + clipVideoFrameHeight(); + } int64_t token = IPCThreadState::self()->clearCallingIdentity(); if (mCamera == 0) { @@ -830,7 +890,13 @@ status_t StagefrightRecorder::setupCameraSource() { // Set the actual video recording frame size CameraParameters params(mCamera->getParameters()); - params.setPreviewSize(mVideoWidth, mVideoHeight); + + // dont change the preview size for time lapse as mVideoWidth, mVideoHeight + // may correspond to HD resolution not supported by video camera. + if (!mCaptureTimeLapse) { + params.setPreviewSize(mVideoWidth, mVideoHeight); + } + params.setPreviewFrameRate(mFrameRate); String8 s = params.flatten(); if (OK != mCamera->setParameters(s)) { @@ -843,8 +909,9 @@ status_t StagefrightRecorder::setupCameraSource() { // Check on video frame size int frameWidth = 0, frameHeight = 0; newCameraParams.getPreviewSize(&frameWidth, &frameHeight); - if (frameWidth < 0 || frameWidth != mVideoWidth || - frameHeight < 0 || frameHeight != mVideoHeight) { + if (!mCaptureTimeLapse && + (frameWidth < 0 || frameWidth != mVideoWidth || + frameHeight < 0 || frameHeight != mVideoHeight)) { LOGE("Failed to set the video frame size to %dx%d", mVideoWidth, mVideoHeight); IPCThreadState::self()->restoreCallingIdentity(token); @@ -886,7 +953,10 @@ status_t StagefrightRecorder::setupVideoEncoder(const sp<MediaWriter>& writer) { status_t err = setupCameraSource(); if (err != OK) return err; - sp<CameraSource> cameraSource = CameraSource::CreateFromCamera(mCamera); + sp<CameraSource> cameraSource = (mCaptureTimeLapse) ? + CameraSourceTimeLapse::CreateFromCamera(mCamera, mUseStillCameraForTimeLapse, + mTimeBetweenTimeLapseFrameCaptureUs, mVideoWidth, mVideoHeight, mFrameRate): + CameraSource::CreateFromCamera(mCamera); CHECK(cameraSource != NULL); sp<MetaData> enc_meta = new MetaData; @@ -937,9 +1007,12 @@ status_t StagefrightRecorder::setupVideoEncoder(const sp<MediaWriter>& writer) { OMXClient client; CHECK_EQ(client.connect(), OK); + // Use software codec for time lapse + uint32_t encoder_flags = (mCaptureTimeLapse) ? OMXCodec::kPreferSoftwareCodecs : 0; sp<MediaSource> encoder = OMXCodec::Create( client.interface(), enc_meta, - true /* createEncoder */, cameraSource); + true /* createEncoder */, cameraSource, + NULL, encoder_flags); if (encoder == NULL) { return UNKNOWN_ERROR; } @@ -975,7 +1048,7 @@ status_t StagefrightRecorder::startMPEG4Recording() { sp<MediaWriter> writer = new MPEG4Writer(dup(mOutputFd)); // Add audio source first if it exists - if (mAudioSource != AUDIO_SOURCE_LIST_END) { + if (!mCaptureTimeLapse && (mAudioSource != AUDIO_SOURCE_LIST_END)) { err = setupAudioEncoder(writer); if (err != OK) return err; totalBitRate += mAudioBitRate; @@ -1083,6 +1156,9 @@ status_t StagefrightRecorder::reset() { mMaxFileDurationUs = 0; mMaxFileSizeBytes = 0; mTrackEveryTimeDurationUs = 0; + mCaptureTimeLapse = false; + mUseStillCameraForTimeLapse = true; + mTimeBetweenTimeLapseFrameCaptureUs = -1; mEncoderProfiles = MediaProfiles::getInstance(); mOutputFd = -1; diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h index b4c5900..03f0b61 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.h +++ b/media/libmediaplayerservice/StagefrightRecorder.h @@ -92,6 +92,10 @@ private: int64_t mMaxFileDurationUs; int64_t mTrackEveryTimeDurationUs; + bool mCaptureTimeLapse; + bool mUseStillCameraForTimeLapse; + int64_t mTimeBetweenTimeLapseFrameCaptureUs; + String8 mParams; int mOutputFd; int32_t mFlags; @@ -112,6 +116,9 @@ private: status_t setParamAudioNumberOfChannels(int32_t channles); 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 setParamVideoEncodingBitRate(int32_t bitRate); status_t setParamVideoIFramesInterval(int32_t seconds); status_t setParamVideoEncoderProfile(int32_t profile); |