From ae5be4a124733403d5025b536bf8271da4c16c41 Mon Sep 17 00:00:00 2001 From: Jeong-Seok Yang Date: Mon, 8 Nov 2010 20:47:08 -0800 Subject: libcamera: Skip some frames on overlay for image quality. 1. Skip some frames to adjust AWB automatically on initial time. 2. Skip a frame when applying image effect End-user doesn't see ugly frames when using camera applications by above 2 approaches. Change-Id: I8b4cc868a0a40164bfb3bc1e150c6d2dd351a1ba Signed-off-by: Jeong-Seok Yang --- libcamera/SecCameraHWInterface.cpp | 29 +++++++++++++++++++++++++++++ libcamera/SecCameraHWInterface.h | 5 ++++- 2 files changed, 33 insertions(+), 1 deletion(-) (limited to 'libcamera') diff --git a/libcamera/SecCameraHWInterface.cpp b/libcamera/SecCameraHWInterface.cpp index 9be2cb9..4938587 100644 --- a/libcamera/SecCameraHWInterface.cpp +++ b/libcamera/SecCameraHWInterface.cpp @@ -68,6 +68,9 @@ struct addrs_cap { unsigned int height; }; +static const int INITIAL_SKIP_FRAME = 3; +static const int EFFECT_SKIP_FRAME = 1; + CameraHardwareSec::CameraHardwareSec(int cameraId) : mPreviewRunning(false), @@ -82,6 +85,7 @@ CameraHardwareSec::CameraHardwareSec(int cameraId) mRawFrameSize(0), mPreviewFrameRateMicrosec(33000), mCameraSensorName(NULL), + mSkipFrame(0), #if defined(BOARD_USES_OVERLAY) mUseOverlay(false), mOverlayBufferIdx(0), @@ -447,6 +451,14 @@ bool CameraHardwareSec::msgTypeEnabled(int32_t msgType) } // --------------------------------------------------------------------------- +void CameraHardwareSec::setSkipFrame(int frame) +{ + Mutex::Autolock lock(mSkipFrameLock); + if (frame < mSkipFrame) + return; + + mSkipFrame = frame; +} int CameraHardwareSec::previewThread() { @@ -457,6 +469,13 @@ int CameraHardwareSec::previewThread() LOGE("ERR(%s):Fail on SecCamera->getPreview()", __func__); return UNKNOWN_ERROR; } + mSkipFrameLock.lock(); + if (mSkipFrame > 0) { + mSkipFrame--; + mSkipFrameLock.unlock(); + return NO_ERROR; + } + mSkipFrameLock.unlock(); nsecs_t timestamp = systemTime(SYSTEM_TIME_MONOTONIC); @@ -619,6 +638,8 @@ status_t CameraHardwareSec::startPreview() mSecCamera->stopPreview(); + setSkipFrame(INITIAL_SKIP_FRAME); + ret = mSecCamera->startPreview(); LOGV("%s : mSecCamera->startPreview() returned %d", __func__, ret); @@ -1944,6 +1965,14 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) LOGE("ERR(%s):Fail on mSecCamera->setImageEffect(effect(%d))", __func__, new_image_effect); ret = UNKNOWN_ERROR; } else { + const char *old_image_effect_str = mParameters.get(CameraParameters::KEY_EFFECT); + + if (old_image_effect_str) { + if (strcmp(old_image_effect_str, new_image_effect_str)) { + setSkipFrame(EFFECT_SKIP_FRAME); + } + } + mParameters.set(CameraParameters::KEY_EFFECT, new_image_effect_str); } } diff --git a/libcamera/SecCameraHWInterface.h b/libcamera/SecCameraHWInterface.h index b3f90ac..6f52ece 100644 --- a/libcamera/SecCameraHWInterface.h +++ b/libcamera/SecCameraHWInterface.h @@ -161,7 +161,7 @@ private: int dwVideoHeight, void *pJPEG, int *pdwJPEGSize, void *pVideo, int *pdwVideoSize); - + void setSkipFrame(int frame); /* used by auto focus thread to block until it's told to run */ mutable Mutex mFocusLock; mutable Condition mCondition; @@ -186,6 +186,9 @@ private: int mPreviewFrameRateMicrosec; const __u8 *mCameraSensorName; + mutable Mutex mSkipFrameLock; + int mSkipFrame; + #if defined(BOARD_USES_OVERLAY) sp mOverlay; bool mUseOverlay; -- cgit v1.1