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

Commit b2ba4859 authored by Gopalakrishnan Nallasamy's avatar Gopalakrishnan Nallasamy
Browse files

StagefrightRecorder:close next filedescriptor

Bug: 127693962

StagefrightRecorder receives next file descriptor in it's function setNextOutputFile() from
MediaRecorder.setNextOutputFile(). It duplicates the received file descriptor, but doesn't close
the duplicated one when done.

This CL fixes that issue by not duplicating it in StagefrighRecorder as it has to just pass it on
to Mpeg4Writer.  Mpeg4Writer duplicates received file descriptor.  It frees them during release.

Test: 	cts-tradefed run cts-dev -m CtsMediaTestCases --compatibility:module-arg
	CtsMediaTestCases:include-annotation:android.platform.test.annotations.RequiresDevice

Change-Id: I24fc12bd957a2abdb8785625261c95da62952736
parent d77619a5
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -400,12 +400,11 @@ status_t StagefrightRecorder::setNextOutputFile(int fd) {

    // start with a clean, empty file
    ftruncate(fd, 0);
    int nextFd = dup(fd);
    if (mWriter == NULL) {
        ALOGE("setNextOutputFile failed. Writer has been freed");
        return INVALID_OPERATION;
    }
    return mWriter->setNextFd(nextFd);
    return mWriter->setNextFd(fd);
}

// Attempt to parse an float literal optionally surrounded by whitespace,
+8 −4
Original line number Diff line number Diff line
@@ -460,7 +460,7 @@ private:
};

MPEG4Writer::MPEG4Writer(int fd) {
    initInternal(fd, true /*isFirstSession*/);
    initInternal(dup(fd), true /*isFirstSession*/);
}

MPEG4Writer::~MPEG4Writer() {
@@ -481,7 +481,7 @@ MPEG4Writer::~MPEG4Writer() {

void MPEG4Writer::initInternal(int fd, bool isFirstSession) {
    ALOGV("initInternal");
    mFd = dup(fd);
    mFd = fd;
    mNextFd = -1;
    mInitCheck = mFd < 0? NO_INIT: OK;

@@ -1044,6 +1044,10 @@ void MPEG4Writer::writeCompositionMatrix(int degrees) {
void MPEG4Writer::release() {
    close(mFd);
    mFd = -1;
    if (mNextFd != -1) {
        close(mNextFd);
        mNextFd = -1;
    }
    mInitCheck = NO_INIT;
    mStarted = false;
    free(mInMemoryCache);
@@ -1981,7 +1985,7 @@ status_t MPEG4Writer::setNextFd(int fd) {
        // No need to set a new FD yet.
        return INVALID_OPERATION;
    }
    mNextFd = fd;
    mNextFd = dup(fd);
    return OK;
}

@@ -2180,11 +2184,11 @@ void MPEG4Writer::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
        case kWhatSwitch:
        {
            finishCurrentSession();
            mLock.lock();
            int fd = mNextFd;
            mNextFd = -1;
            mLock.unlock();
            finishCurrentSession();
            initInternal(fd, false /*isFirstSession*/);
            start(mStartMeta.get());
            mSwitchPending = false;