status_t CameraSource::reset() { ALOGD("reset: E"); Mutex::Autolock autoLock(mLock); mStarted = false; mFrameAvailableCondition.signal(); int64_t token; bool isTokenValid = false; if (mCamera != 0) { token = IPCThreadState::self()->clearCallingIdentity(); isTokenValid = true; } releaseQueuedFrames(); while (!mFramesBeingEncoded.empty()) { if (NO_ERROR != mFrameCompleteCondition.waitRelative(mLock, mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) { ALOGW("Timed out waiting for outstanding frames being encoded: %zu", mFramesBeingEncoded.size()); } } stopCameraRecording(); #ifdef MTK_AOSP_ENHANCEMENT mNeedUnlock = true; #endif releaseCamera(); if (isTokenValid) { IPCThreadState::self()->restoreCallingIdentity(token); } if (mCollectStats) { ALOGI("Frames received/encoded/dropped: %d/%d/%d in %" PRId64 " us", mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped, mLastFrameTimestampUs - mFirstFrameTimeUs); } if (mNumGlitches > 0) { ALOGW("%d long delays between neighboring video frames", mNumGlitches); } #ifdef MTK_AOSP_ENHANCEMENT #ifdef MTK_SLOW_MOTION_VIDEO_SUPPORT if(mColorFormat !=OMX_MTK_COLOR_FormatBitStream /*0x7F000300*/) { //not check only if directlink, because datacallback not drop frame when direct link even mStarted has been seted to false after reset. //this will cause mNumFramesReceived increasing after reset CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); } #else CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); #endif #else CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); #endif ALOGD("reset: X"); return OK; }
status_t CameraSource::reset() { ALOGD("reset: E"); { Mutex::Autolock autoLock(mLock); mStarted = false; mFrameAvailableCondition.signal(); int64_t token; bool isTokenValid = false; if (mCamera != 0) { token = IPCThreadState::self()->clearCallingIdentity(); isTokenValid = true; } releaseQueuedFrames(); while (!mFramesBeingEncoded.empty()) { if (NO_ERROR != mFrameCompleteCondition.waitRelative(mLock, mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) { ALOGW("Timed out waiting for outstanding frames being encoded: %zu", mFramesBeingEncoded.size()); } } stopCameraRecording(); if (isTokenValid) { IPCThreadState::self()->restoreCallingIdentity(token); } if (mCollectStats) { ALOGI("Frames received/encoded/dropped: %d/%d/%d in %" PRId64 " us", mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped, mLastFrameTimestampUs - mFirstFrameTimeUs); } if (mNumGlitches > 0) { ALOGW("%d long delays between neighboring video frames", mNumGlitches); } CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); } releaseCamera(); ALOGD("reset: X"); return OK; }