Loading include/media/stagefright/AMRWriter.h +4 −0 Original line number Diff line number Diff line Loading @@ -49,9 +49,13 @@ private: volatile bool mDone; volatile bool mReachedEOS; pthread_t mThread; int64_t mEstimatedSizeBytes; int64_t mEstimatedDurationUs; static void *ThreadWrapper(void *); void threadFunc(); bool exceedsFileSizeLimit(); bool exceedsFileDurationLimit(); AMRWriter(const AMRWriter &); AMRWriter &operator=(const AMRWriter &); Loading include/media/stagefright/MPEG4Writer.h +2 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,8 @@ private: off_t addLengthPrefixedSample_l(MediaBuffer *buffer); inline size_t write(const void *ptr, size_t size, size_t nmemb, FILE* stream); bool exceedsFileSizeLimit(); bool exceedsFileDurationLimit(); MPEG4Writer(const MPEG4Writer &); MPEG4Writer &operator=(const MPEG4Writer &); Loading include/media/stagefright/MediaWriter.h +15 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define MEDIA_WRITER_H_ #include <utils/RefBase.h> #include <media/IMediaPlayerClient.h> namespace android { Loading @@ -31,10 +32,23 @@ struct MediaWriter : public RefBase { virtual bool reachedEOS() = 0; virtual status_t start() = 0; virtual void stop() = 0; virtual void setMaxFileSize(int64_t bytes) { mMaxFileSizeLimitBytes = bytes; } virtual void setMaxFileDuration(int64_t durationUs) { mMaxFileDurationLimitUs = durationUs; } virtual void setListener(const sp<IMediaPlayerClient>& listener) { mListener = listener; } protected: virtual ~MediaWriter() {} int64_t mMaxFileSizeLimitBytes; int64_t mMaxFileDurationLimitUs; sp<IMediaPlayerClient> mListener; void notify(int msg, int ext1, int ext2) { if (mListener != NULL) { mListener->notify(msg, ext1, ext2); } } private: MediaWriter(const MediaWriter &); MediaWriter &operator=(const MediaWriter &); Loading media/libmediaplayerservice/StagefrightRecorder.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -523,6 +523,14 @@ status_t StagefrightRecorder::startAMRRecording() { CHECK(mOutputFd >= 0); mWriter = new AMRWriter(dup(mOutputFd)); mWriter->addSource(audioEncoder); if (mMaxFileDurationUs != 0) { mWriter->setMaxFileDuration(mMaxFileDurationUs); } if (mMaxFileSizeBytes != 0) { mWriter->setMaxFileSize(mMaxFileSizeBytes); } mWriter->setListener(mListener); mWriter->start(); return OK; Loading Loading @@ -641,6 +649,13 @@ status_t StagefrightRecorder::startMPEG4Recording() { writer->setInterleaveDuration(mInterleaveDurationUs); } if (mMaxFileDurationUs != 0) { mWriter->setMaxFileDuration(mMaxFileDurationUs); } if (mMaxFileSizeBytes != 0) { mWriter->setMaxFileSize(mMaxFileSizeBytes); } mWriter->setListener(mListener); mWriter->start(); return OK; } Loading media/libstagefright/AMRWriter.cpp +36 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/mediarecorder.h> namespace android { Loading Loading @@ -137,6 +138,20 @@ void AMRWriter::stop() { mStarted = false; } bool AMRWriter::exceedsFileSizeLimit() { if (mMaxFileSizeLimitBytes == 0) { return false; } return mEstimatedSizeBytes >= mMaxFileSizeLimitBytes; } bool AMRWriter::exceedsFileDurationLimit() { if (mMaxFileDurationLimitUs == 0) { return false; } return mEstimatedDurationUs >= mMaxFileDurationLimitUs; } // static void *AMRWriter::ThreadWrapper(void *me) { static_cast<AMRWriter *>(me)->threadFunc(); Loading @@ -145,6 +160,8 @@ void *AMRWriter::ThreadWrapper(void *me) { } void AMRWriter::threadFunc() { mEstimatedDurationUs = 0; mEstimatedSizeBytes = 0; while (!mDone) { MediaBuffer *buffer; status_t err = mSource->read(&buffer); Loading @@ -153,6 +170,25 @@ void AMRWriter::threadFunc() { break; } mEstimatedSizeBytes += buffer->range_length(); if (exceedsFileSizeLimit()) { buffer->release(); buffer = NULL; notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0); break; } int64_t timestampUs; CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs)); if (timestampUs > mEstimatedDurationUs) { mEstimatedDurationUs = timestampUs; } if (exceedsFileDurationLimit()) { buffer->release(); buffer = NULL; notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0); break; } ssize_t n = fwrite( (const uint8_t *)buffer->data() + buffer->range_offset(), 1, Loading Loading
include/media/stagefright/AMRWriter.h +4 −0 Original line number Diff line number Diff line Loading @@ -49,9 +49,13 @@ private: volatile bool mDone; volatile bool mReachedEOS; pthread_t mThread; int64_t mEstimatedSizeBytes; int64_t mEstimatedDurationUs; static void *ThreadWrapper(void *); void threadFunc(); bool exceedsFileSizeLimit(); bool exceedsFileDurationLimit(); AMRWriter(const AMRWriter &); AMRWriter &operator=(const AMRWriter &); Loading
include/media/stagefright/MPEG4Writer.h +2 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,8 @@ private: off_t addLengthPrefixedSample_l(MediaBuffer *buffer); inline size_t write(const void *ptr, size_t size, size_t nmemb, FILE* stream); bool exceedsFileSizeLimit(); bool exceedsFileDurationLimit(); MPEG4Writer(const MPEG4Writer &); MPEG4Writer &operator=(const MPEG4Writer &); Loading
include/media/stagefright/MediaWriter.h +15 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define MEDIA_WRITER_H_ #include <utils/RefBase.h> #include <media/IMediaPlayerClient.h> namespace android { Loading @@ -31,10 +32,23 @@ struct MediaWriter : public RefBase { virtual bool reachedEOS() = 0; virtual status_t start() = 0; virtual void stop() = 0; virtual void setMaxFileSize(int64_t bytes) { mMaxFileSizeLimitBytes = bytes; } virtual void setMaxFileDuration(int64_t durationUs) { mMaxFileDurationLimitUs = durationUs; } virtual void setListener(const sp<IMediaPlayerClient>& listener) { mListener = listener; } protected: virtual ~MediaWriter() {} int64_t mMaxFileSizeLimitBytes; int64_t mMaxFileDurationLimitUs; sp<IMediaPlayerClient> mListener; void notify(int msg, int ext1, int ext2) { if (mListener != NULL) { mListener->notify(msg, ext1, ext2); } } private: MediaWriter(const MediaWriter &); MediaWriter &operator=(const MediaWriter &); Loading
media/libmediaplayerservice/StagefrightRecorder.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -523,6 +523,14 @@ status_t StagefrightRecorder::startAMRRecording() { CHECK(mOutputFd >= 0); mWriter = new AMRWriter(dup(mOutputFd)); mWriter->addSource(audioEncoder); if (mMaxFileDurationUs != 0) { mWriter->setMaxFileDuration(mMaxFileDurationUs); } if (mMaxFileSizeBytes != 0) { mWriter->setMaxFileSize(mMaxFileSizeBytes); } mWriter->setListener(mListener); mWriter->start(); return OK; Loading Loading @@ -641,6 +649,13 @@ status_t StagefrightRecorder::startMPEG4Recording() { writer->setInterleaveDuration(mInterleaveDurationUs); } if (mMaxFileDurationUs != 0) { mWriter->setMaxFileDuration(mMaxFileDurationUs); } if (mMaxFileSizeBytes != 0) { mWriter->setMaxFileSize(mMaxFileSizeBytes); } mWriter->setListener(mListener); mWriter->start(); return OK; } Loading
media/libstagefright/AMRWriter.cpp +36 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/mediarecorder.h> namespace android { Loading Loading @@ -137,6 +138,20 @@ void AMRWriter::stop() { mStarted = false; } bool AMRWriter::exceedsFileSizeLimit() { if (mMaxFileSizeLimitBytes == 0) { return false; } return mEstimatedSizeBytes >= mMaxFileSizeLimitBytes; } bool AMRWriter::exceedsFileDurationLimit() { if (mMaxFileDurationLimitUs == 0) { return false; } return mEstimatedDurationUs >= mMaxFileDurationLimitUs; } // static void *AMRWriter::ThreadWrapper(void *me) { static_cast<AMRWriter *>(me)->threadFunc(); Loading @@ -145,6 +160,8 @@ void *AMRWriter::ThreadWrapper(void *me) { } void AMRWriter::threadFunc() { mEstimatedDurationUs = 0; mEstimatedSizeBytes = 0; while (!mDone) { MediaBuffer *buffer; status_t err = mSource->read(&buffer); Loading @@ -153,6 +170,25 @@ void AMRWriter::threadFunc() { break; } mEstimatedSizeBytes += buffer->range_length(); if (exceedsFileSizeLimit()) { buffer->release(); buffer = NULL; notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0); break; } int64_t timestampUs; CHECK(buffer->meta_data()->findInt64(kKeyTime, ×tampUs)); if (timestampUs > mEstimatedDurationUs) { mEstimatedDurationUs = timestampUs; } if (exceedsFileDurationLimit()) { buffer->release(); buffer = NULL; notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0); break; } ssize_t n = fwrite( (const uint8_t *)buffer->data() + buffer->range_offset(), 1, Loading