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

Commit 835ea2f2 authored by James Dong's avatar James Dong Committed by Android (Google) Code Review
Browse files

Merge "Fixed a race condition where some recording frames may not be released."

parents 47ea7c43 df7a856d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -372,6 +372,9 @@ void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<
    }
    if (listener != NULL) {
        listener->postDataTimestamp(timestamp, msgType, dataPtr);
    } else {
        LOGW("No listener was set. Drop a recording frame.");
        releaseRecordingFrame(dataPtr);
    }
}

+3 −20
Original line number Diff line number Diff line
@@ -495,26 +495,6 @@ status_t CameraSource::init(
        mIsMetaDataStoredInVideoBuffers = true;
    }

    /*
     * mCamera->startRecording() signals camera hal to make
     * available the video buffers (for instance, allocation
     * of the video buffers may be triggered when camera hal's
     * startRecording() method is called). Making available these
     * video buffers earlier (before calling start()) is critical,
     * if one wants to configure omx video encoders to use these
     * buffers for passing video frame data during video recording
     * without the need to memcpy the video frame data stored
     * in these buffers. Eliminating memcpy for video frame data
     * is crucial in performance for HD quality video recording
     * applications.
     *
     * Based on OMX IL spec, configuring the omx video encoders
     * must occur in loaded state. When start() is called, omx
     * video encoders are already in idle state, which is too
     * late. Thus, we must call mCamera->startRecording() earlier.
     */
    startCameraRecording();

    IPCThreadState::self()->restoreCallingIdentity(token);

    int64_t glitchDurationUs = (1000000LL / mVideoFrameRate);
@@ -565,8 +545,11 @@ status_t CameraSource::start(MetaData *meta) {
        mStartTimeUs = startTimeUs;
    }

    // Call setListener first before calling startCameraRecording()
    // to avoid recording frames being dropped.
    int64_t token = IPCThreadState::self()->clearCallingIdentity();
    mCamera->setListener(new CameraSourceListener(this));
    startCameraRecording();
    IPCThreadState::self()->restoreCallingIdentity(token);

    mStarted = true;