Loading include/media/mediarecorder.h +3 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ enum output_format { OUTPUT_FORMAT_AAC_ADIF = 5, OUTPUT_FORMAT_AAC_ADTS = 6, OUTPUT_FORMAT_AUDIO_ONLY_END = 7, // Used in validating the output format. Should be the // at the end of the audio only output formats. /* Stream over a socket, limited to a single stream */ OUTPUT_FORMAT_RTP_AVP = 7, Loading media/libmedia/mediarecorder.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -186,8 +186,11 @@ status_t MediaRecorder::setOutputFormat(int of) ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState); return INVALID_OPERATION; } if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format ALOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of); if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START //first non-video output format && of < OUTPUT_FORMAT_AUDIO_ONLY_END) { ALOGE("output format (%d) is meant for audio recording only" " and incompatible with video recording", of); return INVALID_OPERATION; } Loading media/libmediaplayerservice/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/av/media/libstagefright/include \ $(TOP)/frameworks/av/media/libstagefright/rtsp \ $(TOP)/frameworks/av/media/libstagefright/wifi-display \ $(TOP)/frameworks/av/media/libstagefright/webm \ $(TOP)/frameworks/native/include/media/openmax \ $(TOP)/external/tremolo/Tremolo \ Loading media/libmediaplayerservice/StagefrightRecorder.cpp +44 −29 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <inttypes.h> #include <utils/Log.h> #include "WebmWriter.h" #include "StagefrightRecorder.h" #include <binder/IPCThreadState.h> Loading Loading @@ -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: Loading Loading @@ -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; } Loading Loading @@ -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) { Loading @@ -1563,9 +1575,11 @@ status_t StagefrightRecorder::setupMPEG4Recording() { mTotalBitRate += mVideoBitRate; } 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; Loading @@ -1580,13 +1594,13 @@ status_t StagefrightRecorder::setupMPEG4Recording() { reinterpret_cast<MPEG4Writer *>(writer.get())-> setGeoData(mLatitudex10000, mLongitudex10000); } } if (mMaxFileDurationUs != 0) { writer->setMaxFileDuration(mMaxFileDurationUs); } if (mMaxFileSizeBytes != 0) { writer->setMaxFileSize(mMaxFileSizeBytes); } if (mVideoSource == VIDEO_SOURCE_DEFAULT || mVideoSource == VIDEO_SOURCE_CAMERA) { mStartTimeOffsetMs = mEncoderProfiles->getStartTimeOffsetMs(mCameraId); Loading @@ -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); Loading @@ -1604,15 +1617,16 @@ 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 (mOutputFormat == OUTPUT_FORMAT_MPEG_4) { (*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset); if (mTrackEveryTimeDurationUs > 0) { (*meta)->setInt64(kKeyTrackTimeStatus, mTrackEveryTimeDurationUs); } Loading @@ -1620,6 +1634,7 @@ void StagefrightRecorder::setupMPEG4MetaData(sp<MetaData> *meta) { (*meta)->setInt32(kKeyRotation, mRotationDegrees); } } } status_t StagefrightRecorder::pause() { ALOGV("pause"); Loading media/libmediaplayerservice/StagefrightRecorder.h +2 −2 Original line number Diff line number Diff line Loading @@ -128,8 +128,8 @@ private: sp<ALooper> mLooper; status_t prepareInternal(); status_t setupMPEG4Recording(); void setupMPEG4MetaData(sp<MetaData> *meta); status_t setupMPEG4orWEBMRecording(); void setupMPEG4orWEBMMetaData(sp<MetaData> *meta); status_t setupAMRRecording(); status_t setupAACRecording(); status_t setupRawAudioRecording(); Loading Loading
include/media/mediarecorder.h +3 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ enum output_format { OUTPUT_FORMAT_AAC_ADIF = 5, OUTPUT_FORMAT_AAC_ADTS = 6, OUTPUT_FORMAT_AUDIO_ONLY_END = 7, // Used in validating the output format. Should be the // at the end of the audio only output formats. /* Stream over a socket, limited to a single stream */ OUTPUT_FORMAT_RTP_AVP = 7, Loading
media/libmedia/mediarecorder.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -186,8 +186,11 @@ status_t MediaRecorder::setOutputFormat(int of) ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState); return INVALID_OPERATION; } if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format ALOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of); if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START //first non-video output format && of < OUTPUT_FORMAT_AUDIO_ONLY_END) { ALOGE("output format (%d) is meant for audio recording only" " and incompatible with video recording", of); return INVALID_OPERATION; } Loading
media/libmediaplayerservice/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/av/media/libstagefright/include \ $(TOP)/frameworks/av/media/libstagefright/rtsp \ $(TOP)/frameworks/av/media/libstagefright/wifi-display \ $(TOP)/frameworks/av/media/libstagefright/webm \ $(TOP)/frameworks/native/include/media/openmax \ $(TOP)/external/tremolo/Tremolo \ Loading
media/libmediaplayerservice/StagefrightRecorder.cpp +44 −29 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <inttypes.h> #include <utils/Log.h> #include "WebmWriter.h" #include "StagefrightRecorder.h" #include <binder/IPCThreadState.h> Loading Loading @@ -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: Loading Loading @@ -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; } Loading Loading @@ -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) { Loading @@ -1563,9 +1575,11 @@ status_t StagefrightRecorder::setupMPEG4Recording() { mTotalBitRate += mVideoBitRate; } 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; Loading @@ -1580,13 +1594,13 @@ status_t StagefrightRecorder::setupMPEG4Recording() { reinterpret_cast<MPEG4Writer *>(writer.get())-> setGeoData(mLatitudex10000, mLongitudex10000); } } if (mMaxFileDurationUs != 0) { writer->setMaxFileDuration(mMaxFileDurationUs); } if (mMaxFileSizeBytes != 0) { writer->setMaxFileSize(mMaxFileSizeBytes); } if (mVideoSource == VIDEO_SOURCE_DEFAULT || mVideoSource == VIDEO_SOURCE_CAMERA) { mStartTimeOffsetMs = mEncoderProfiles->getStartTimeOffsetMs(mCameraId); Loading @@ -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); Loading @@ -1604,15 +1617,16 @@ 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 (mOutputFormat == OUTPUT_FORMAT_MPEG_4) { (*meta)->setInt32(kKey64BitFileOffset, mUse64BitFileOffset); if (mTrackEveryTimeDurationUs > 0) { (*meta)->setInt64(kKeyTrackTimeStatus, mTrackEveryTimeDurationUs); } Loading @@ -1620,6 +1634,7 @@ void StagefrightRecorder::setupMPEG4MetaData(sp<MetaData> *meta) { (*meta)->setInt32(kKeyRotation, mRotationDegrees); } } } status_t StagefrightRecorder::pause() { ALOGV("pause"); Loading
media/libmediaplayerservice/StagefrightRecorder.h +2 −2 Original line number Diff line number Diff line Loading @@ -128,8 +128,8 @@ private: sp<ALooper> mLooper; status_t prepareInternal(); status_t setupMPEG4Recording(); void setupMPEG4MetaData(sp<MetaData> *meta); status_t setupMPEG4orWEBMRecording(); void setupMPEG4orWEBMMetaData(sp<MetaData> *meta); status_t setupAMRRecording(); status_t setupAACRecording(); status_t setupRawAudioRecording(); Loading