diff options
author | Robert Shih <robertshih@google.com> | 2014-07-09 20:09:43 -0700 |
---|---|---|
committer | Robert Shih <robertshih@google.com> | 2014-07-22 14:20:38 -0700 |
commit | 114819633470ebd5b346c13c2a82a0025d2d39c0 (patch) | |
tree | 1b18e4333bb8d3bde991fcea29e956be83e94b8b /media/libmediaplayerservice/StagefrightRecorder.cpp | |
parent | d8cf55d878edddfc36bb821a95b88dfb2453c2c3 (diff) | |
download | frameworks_av-114819633470ebd5b346c13c2a82a0025d2d39c0.zip frameworks_av-114819633470ebd5b346c13c2a82a0025d2d39c0.tar.gz frameworks_av-114819633470ebd5b346c13c2a82a0025d2d39c0.tar.bz2 |
StagefrightRecorder: webm (video only) support
Bug: 16329805
Change-Id: I8a0ecd100fca397add97a1416125bcc6aeb86364
Diffstat (limited to 'media/libmediaplayerservice/StagefrightRecorder.cpp')
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.cpp | 73 |
1 files changed, 44 insertions, 29 deletions
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index bfc075c..217b248 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -19,6 +19,7 @@ #include <inttypes.h> #include <utils/Log.h> +#include "WebmWriter.h" #include "StagefrightRecorder.h" #include <binder/IPCThreadState.h> @@ -764,7 +765,8 @@ status_t StagefrightRecorder::prepareInternal() { case OUTPUT_FORMAT_DEFAULT: case OUTPUT_FORMAT_THREE_GPP: case OUTPUT_FORMAT_MPEG_4: - status = setupMPEG4Recording(); + case OUTPUT_FORMAT_WEBM: + status = setupMPEG4orWEBMRecording(); break; case OUTPUT_FORMAT_AMR_NB: @@ -826,9 +828,14 @@ status_t StagefrightRecorder::start() { case OUTPUT_FORMAT_DEFAULT: case OUTPUT_FORMAT_THREE_GPP: case OUTPUT_FORMAT_MPEG_4: + case OUTPUT_FORMAT_WEBM: { + bool isMPEG4 = true; + if (mOutputFormat == OUTPUT_FORMAT_WEBM) { + isMPEG4 = false; + } sp<MetaData> meta = new MetaData; - setupMPEG4MetaData(&meta); + setupMPEG4orWEBMMetaData(&meta); status = mWriter->start(meta.get()); break; } @@ -1538,12 +1545,17 @@ status_t StagefrightRecorder::setupAudioEncoder(const sp<MediaWriter>& writer) { return OK; } -status_t StagefrightRecorder::setupMPEG4Recording() { +status_t StagefrightRecorder::setupMPEG4orWEBMRecording() { mWriter.clear(); mTotalBitRate = 0; status_t err = OK; - sp<MediaWriter> writer = new MPEG4Writer(mOutputFd); + sp<MediaWriter> writer; + if (mOutputFormat == OUTPUT_FORMAT_MPEG_4) { + writer = new MPEG4Writer(mOutputFd); + } else { + writer = new WebmWriter(mOutputFd); + } if (mVideoSource < VIDEO_SOURCE_LIST_END) { @@ -1563,22 +1575,25 @@ status_t StagefrightRecorder::setupMPEG4Recording() { mTotalBitRate += mVideoBitRate; } - // Audio source is added at the end if it exists. - // This help make sure that the "recoding" sound is suppressed for - // camcorder applications in the recorded files. - if (!mCaptureTimeLapse && (mAudioSource != AUDIO_SOURCE_CNT)) { - err = setupAudioEncoder(writer); - if (err != OK) return err; - mTotalBitRate += mAudioBitRate; - } + if (mOutputFormat == OUTPUT_FORMAT_MPEG_4) { + // Audio source is added at the end if it exists. + // This help make sure that the "recoding" sound is suppressed for + // camcorder applications in the recorded files. + // TODO Audio source is currently unsupported for webm output; vorbis encoder needed. + if (!mCaptureTimeLapse && (mAudioSource != AUDIO_SOURCE_CNT)) { + err = setupAudioEncoder(writer); + if (err != OK) return err; + mTotalBitRate += mAudioBitRate; + } - if (mInterleaveDurationUs > 0) { - reinterpret_cast<MPEG4Writer *>(writer.get())-> - setInterleaveDuration(mInterleaveDurationUs); - } - if (mLongitudex10000 > -3600000 && mLatitudex10000 > -3600000) { - reinterpret_cast<MPEG4Writer *>(writer.get())-> - setGeoData(mLatitudex10000, mLongitudex10000); + if (mInterleaveDurationUs > 0) { + reinterpret_cast<MPEG4Writer *>(writer.get())-> + setInterleaveDuration(mInterleaveDurationUs); + } + if (mLongitudex10000 > -3600000 && mLatitudex10000 > -3600000) { + reinterpret_cast<MPEG4Writer *>(writer.get())-> + setGeoData(mLatitudex10000, mLongitudex10000); + } } if (mMaxFileDurationUs != 0) { writer->setMaxFileDuration(mMaxFileDurationUs); @@ -1586,7 +1601,6 @@ status_t StagefrightRecorder::setupMPEG4Recording() { if (mMaxFileSizeBytes != 0) { writer->setMaxFileSize(mMaxFileSizeBytes); } - if (mVideoSource == VIDEO_SOURCE_DEFAULT || mVideoSource == VIDEO_SOURCE_CAMERA) { mStartTimeOffsetMs = mEncoderProfiles->getStartTimeOffsetMs(mCameraId); @@ -1595,8 +1609,7 @@ status_t StagefrightRecorder::setupMPEG4Recording() { mStartTimeOffsetMs = 200; } if (mStartTimeOffsetMs > 0) { - reinterpret_cast<MPEG4Writer *>(writer.get())-> - setStartTimeOffsetMs(mStartTimeOffsetMs); + writer->setStartTimeOffsetMs(mStartTimeOffsetMs); } writer->setListener(mListener); @@ -1604,20 +1617,22 @@ status_t StagefrightRecorder::setupMPEG4Recording() { return OK; } -void StagefrightRecorder::setupMPEG4MetaData(sp<MetaData> *meta) { +void StagefrightRecorder::setupMPEG4orWEBMMetaData(sp<MetaData> *meta) { int64_t startTimeUs = systemTime() / 1000; (*meta)->setInt64(kKeyTime, startTimeUs); (*meta)->setInt32(kKeyFileType, mOutputFormat); (*meta)->setInt32(kKeyBitRate, mTotalBitRate); - (*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset); if (mMovieTimeScale > 0) { (*meta)->setInt32(kKeyTimeScale, mMovieTimeScale); } - if (mTrackEveryTimeDurationUs > 0) { - (*meta)->setInt64(kKeyTrackTimeStatus, mTrackEveryTimeDurationUs); - } - if (mRotationDegrees != 0) { - (*meta)->setInt32(kKeyRotation, mRotationDegrees); + if (mOutputFormat == OUTPUT_FORMAT_MPEG_4) { + (*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset); + if (mTrackEveryTimeDurationUs > 0) { + (*meta)->setInt64(kKeyTrackTimeStatus, mTrackEveryTimeDurationUs); + } + if (mRotationDegrees != 0) { + (*meta)->setInt32(kKeyRotation, mRotationDegrees); + } } } |