Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d39c6a16 authored by James Dong's avatar James Dong Committed by Android Git Automerger
Browse files

am 8b3611ee: am 1824486e: Handle recording file size and/or duration limit

parents 41b5fc5c 8b3611ee
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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 &);
+2 −0
Original line number Diff line number Diff line
@@ -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 &);
+15 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#define MEDIA_WRITER_H_

#include <utils/RefBase.h>
#include <media/IMediaPlayerClient.h>

namespace android {

@@ -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 &);
+15 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
}
+36 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -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();
@@ -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);
@@ -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, &timestampUs));
        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