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

Commit d24affe1 authored by Hangyu Kuang's avatar Hangyu Kuang
Browse files

media: Fix memory leak when recording duration exceeds duration limit.

When recording got to the duration limit, MPEG4Writer should also stop the source
before exiting the loop. This will stop the video/audio encoder from copying
and encoding buffer. Otherwise, those encoded buffers will be leaked as they are
not released inside MPEG4Writer.

Also fix the other cases when malformed file is generated.

Bug:31530524
Change-Id: I0233f13e3d2a9110b35375a7394e6c8c36494342
parent 7b973eb8
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -2481,12 +2481,16 @@ status_t MPEG4Writer::Track::threadEntry() {
            ALOGW("Recorded file size exceeds limit %" PRId64 "bytes",
            ALOGW("Recorded file size exceeds limit %" PRId64 "bytes",
                    mOwner->mMaxFileSizeLimitBytes);
                    mOwner->mMaxFileSizeLimitBytes);
            mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0);
            mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0);
            copy->release();
            mSource->stop();
            break;
            break;
        }
        }
        if (mOwner->exceedsFileDurationLimit()) {
        if (mOwner->exceedsFileDurationLimit()) {
            ALOGW("Recorded file duration exceeds limit %" PRId64 "microseconds",
            ALOGW("Recorded file duration exceeds limit %" PRId64 "microseconds",
                    mOwner->mMaxFileDurationLimitUs);
                    mOwner->mMaxFileDurationLimitUs);
            mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0);
            mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_DURATION_REACHED, 0);
            copy->release();
            mSource->stop();
            break;
            break;
        }
        }


@@ -2507,6 +2511,7 @@ status_t MPEG4Writer::Track::threadEntry() {
            int64_t durExcludingEarlierPausesUs = timestampUs - previousPausedDurationUs;
            int64_t durExcludingEarlierPausesUs = timestampUs - previousPausedDurationUs;
            if (WARN_UNLESS(durExcludingEarlierPausesUs >= 0ll, "for %s track", trackName)) {
            if (WARN_UNLESS(durExcludingEarlierPausesUs >= 0ll, "for %s track", trackName)) {
                copy->release();
                copy->release();
                mSource->stop();
                mIsMalformed = true;
                mIsMalformed = true;
                break;
                break;
            }
            }
@@ -2514,6 +2519,7 @@ status_t MPEG4Writer::Track::threadEntry() {
            int64_t pausedDurationUs = durExcludingEarlierPausesUs - mTrackDurationUs;
            int64_t pausedDurationUs = durExcludingEarlierPausesUs - mTrackDurationUs;
            if (WARN_UNLESS(pausedDurationUs >= lastDurationUs, "for %s track", trackName)) {
            if (WARN_UNLESS(pausedDurationUs >= lastDurationUs, "for %s track", trackName)) {
                copy->release();
                copy->release();
                mSource->stop();
                mIsMalformed = true;
                mIsMalformed = true;
                break;
                break;
            }
            }
@@ -2525,6 +2531,7 @@ status_t MPEG4Writer::Track::threadEntry() {
        timestampUs -= previousPausedDurationUs;
        timestampUs -= previousPausedDurationUs;
        if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) {
        if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) {
            copy->release();
            copy->release();
            mSource->stop();
            mIsMalformed = true;
            mIsMalformed = true;
            break;
            break;
        }
        }
@@ -2553,6 +2560,7 @@ status_t MPEG4Writer::Track::threadEntry() {
                    timestampUs + kMaxCttsOffsetTimeUs - decodingTimeUs;
                    timestampUs + kMaxCttsOffsetTimeUs - decodingTimeUs;
            if (WARN_UNLESS(cttsOffsetTimeUs >= 0ll, "for %s track", trackName)) {
            if (WARN_UNLESS(cttsOffsetTimeUs >= 0ll, "for %s track", trackName)) {
                copy->release();
                copy->release();
                mSource->stop();
                mIsMalformed = true;
                mIsMalformed = true;
                break;
                break;
            }
            }
@@ -2566,6 +2574,7 @@ status_t MPEG4Writer::Track::threadEntry() {
                    (cttsOffsetTimeUs * mTimeScale + 500000LL) / 1000000LL;
                    (cttsOffsetTimeUs * mTimeScale + 500000LL) / 1000000LL;
            if (WARN_UNLESS(currCttsOffsetTimeTicks <= 0x0FFFFFFFFLL, "for %s track", trackName)) {
            if (WARN_UNLESS(currCttsOffsetTimeTicks <= 0x0FFFFFFFFLL, "for %s track", trackName)) {
                copy->release();
                copy->release();
                mSource->stop();
                mIsMalformed = true;
                mIsMalformed = true;
                break;
                break;
            }
            }
@@ -2609,6 +2618,7 @@ status_t MPEG4Writer::Track::threadEntry() {


        if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) {
        if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) {
            copy->release();
            copy->release();
            mSource->stop();
            mIsMalformed = true;
            mIsMalformed = true;
            break;
            break;
        }
        }