1b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/* 2b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Copyright (C) 2011 The Android Open Source Project 3b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * 4b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Licensed under the Apache License, Version 2.0 (the "License"); 5b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * you may not use this file except in compliance with the License. 6b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * You may obtain a copy of the License at 7b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * 8b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * http://www.apache.org/licenses/LICENSE-2.0 9b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * 10b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Unless required by applicable law or agreed to in writing, software 11b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * distributed under the License is distributed on an "AS IS" BASIS, 12b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * See the License for the specific language governing permissions and 14b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * limitations under the License. 15b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */ 16b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 17b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/* 18b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Contains implementation of a class EmulatedFakeCameraDevice that encapsulates 19b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * fake camera device. 20b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */ 21b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 22b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#define LOG_NDEBUG 0 23b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#define LOG_TAG "EmulatedCamera_FakeDevice" 24b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#include <cutils/log.h> 255467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine#include "EmulatedFakeCamera.h" 265467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine#include "EmulatedFakeCameraDevice.h" 27b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 28b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinenamespace android { 29b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 30b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir ChtchetkineEmulatedFakeCameraDevice::EmulatedFakeCameraDevice(EmulatedFakeCamera* camera_hal) 31b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine : EmulatedCameraDevice(camera_hal), 325467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mBlackYUV(kBlack32), 335467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mWhiteYUV(kWhite32), 345467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mRedYUV(kRed8), 355467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mGreenYUV(kGreen8), 365467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mBlueYUV(kBlue8), 372a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mLastRedrawn(0), 385467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mCheckX(0), 395467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mCheckY(0), 402a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCcounter(0) 412a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#if EFCD_ROTATE_FRAME 422a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine , mLastRotatedAt(0), 432a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentFrameType(0), 442a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentColor(&mWhiteYUV) 452a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#endif // EFCD_ROTATE_FRAME 46b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 47366396d9b001c7a1abf2b73161a9b7b05e9022ecChristine Chen // Makes the image with the original exposure compensation darker. 48366396d9b001c7a1abf2b73161a9b7b05e9022ecChristine Chen // So the effects of changing the exposure compensation can be seen. 4912c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen mBlackYUV.Y = mBlackYUV.Y / 2; 5012c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen mWhiteYUV.Y = mWhiteYUV.Y / 2; 5112c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen mRedYUV.Y = mRedYUV.Y / 2; 5212c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen mGreenYUV.Y = mGreenYUV.Y / 2; 5312c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen mBlueYUV.Y = mBlueYUV.Y / 2; 54b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 55b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 56b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir ChtchetkineEmulatedFakeCameraDevice::~EmulatedFakeCameraDevice() 57b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 58b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 59b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 60b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/**************************************************************************** 61b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Emulated camera device abstract interface implementation. 62b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine ***************************************************************************/ 63b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 645467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkinestatus_t EmulatedFakeCameraDevice::connectDevice() 65b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 66629719e390ce66be822c3563bbd248ce15eaae7bSteve Block ALOGV("%s", __FUNCTION__); 67b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 685467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine Mutex::Autolock locker(&mObjectLock); 695467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine if (!isInitialized()) { 705a622cba8c5287d5e6577f940a22343a7cae977fSteve Block ALOGE("%s: Fake camera device is not initialized.", __FUNCTION__); 71b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return EINVAL; 72b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 735467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine if (isConnected()) { 746aff44c27ee487bd65d5a1c74faf4b7165530bd4Steve Block ALOGW("%s: Fake camera device is already connected.", __FUNCTION__); 75b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return NO_ERROR; 76b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 77b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 7849842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine /* There is no device to connect to. */ 795467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mState = ECDS_CONNECTED; 80b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 81b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return NO_ERROR; 82b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 83b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 845467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkinestatus_t EmulatedFakeCameraDevice::disconnectDevice() 85b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 86629719e390ce66be822c3563bbd248ce15eaae7bSteve Block ALOGV("%s", __FUNCTION__); 87b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 885467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine Mutex::Autolock locker(&mObjectLock); 895467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine if (!isConnected()) { 906aff44c27ee487bd65d5a1c74faf4b7165530bd4Steve Block ALOGW("%s: Fake camera device is already disconnected.", __FUNCTION__); 91b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return NO_ERROR; 92b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 9349842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine if (isStarted()) { 945a622cba8c5287d5e6577f940a22343a7cae977fSteve Block ALOGE("%s: Cannot disconnect from the started device.", __FUNCTION__); 95b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return EINVAL; 96b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 97b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 9849842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine /* There is no device to disconnect from. */ 995467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mState = ECDS_INITIALIZED; 100b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 101b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return NO_ERROR; 102b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 103b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 10449842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkinestatus_t EmulatedFakeCameraDevice::startDevice(int width, 10549842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine int height, 10649842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine uint32_t pix_fmt) 107b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 108629719e390ce66be822c3563bbd248ce15eaae7bSteve Block ALOGV("%s", __FUNCTION__); 109b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 11049842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine Mutex::Autolock locker(&mObjectLock); 1115467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine if (!isConnected()) { 1125a622cba8c5287d5e6577f940a22343a7cae977fSteve Block ALOGE("%s: Fake camera device is not connected.", __FUNCTION__); 113b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return EINVAL; 114b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 11549842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine if (isStarted()) { 1165a622cba8c5287d5e6577f940a22343a7cae977fSteve Block ALOGE("%s: Fake camera device is already started.", __FUNCTION__); 11749842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine return EINVAL; 118b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 119b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 12049842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine /* Initialize the base class. */ 12149842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine const status_t res = 12249842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine EmulatedCameraDevice::commonStartDevice(width, height, pix_fmt); 12349842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine if (res == NO_ERROR) { 1242a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Calculate U/V panes inside the framebuffer. */ 1252a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine switch (mPixelFormat) { 1262a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine case V4L2_PIX_FMT_YVU420: 12768ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine mFrameV = mCurrentFrame + mTotalPixels; 12868ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine mFrameU = mFrameU + mTotalPixels / 4; 12968ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine mUVStep = 1; 13068ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine mUVTotalNum = mTotalPixels / 4; 13168ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine break; 13268ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine 13368ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine case V4L2_PIX_FMT_YUV420: 1342a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameU = mCurrentFrame + mTotalPixels; 1352a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameV = mFrameU + mTotalPixels / 4; 1362a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVStep = 1; 1372a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVTotalNum = mTotalPixels / 4; 1382a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine break; 1392a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 1402a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine case V4L2_PIX_FMT_NV21: 1412a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Interleaved UV pane, V first. */ 1422a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameV = mCurrentFrame + mTotalPixels; 1432a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameU = mFrameV + 1; 1442a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVStep = 2; 1452a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVTotalNum = mTotalPixels / 4; 1462a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine break; 1472a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 1482a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine case V4L2_PIX_FMT_NV12: 1492a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Interleaved UV pane, U first. */ 1502a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameU = mCurrentFrame + mTotalPixels; 1512a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameV = mFrameU + 1; 1522a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVStep = 2; 1532a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVTotalNum = mTotalPixels / 4; 1542a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine break; 1552a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 1562a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine default: 1575a622cba8c5287d5e6577f940a22343a7cae977fSteve Block ALOGE("%s: Unknown pixel format %.4s", __FUNCTION__, 1582a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine reinterpret_cast<const char*>(&mPixelFormat)); 1592a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine return EINVAL; 1602a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 1612a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Number of items in a single row inside U/V panes. */ 1622a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mUVInRow = (width / 2) * mUVStep; 16349842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine mState = ECDS_STARTED; 16449842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine } else { 1655a622cba8c5287d5e6577f940a22343a7cae977fSteve Block ALOGE("%s: commonStartDevice failed", __FUNCTION__); 166b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 167b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 16849842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine return res; 169b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 170b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 1715467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkinestatus_t EmulatedFakeCameraDevice::stopDevice() 172b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 173629719e390ce66be822c3563bbd248ce15eaae7bSteve Block ALOGV("%s", __FUNCTION__); 174b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 17549842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine Mutex::Autolock locker(&mObjectLock); 17649842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine if (!isStarted()) { 1776aff44c27ee487bd65d5a1c74faf4b7165530bd4Steve Block ALOGW("%s: Fake camera device is not started.", __FUNCTION__); 178b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return NO_ERROR; 179b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 180b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 1812a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mFrameU = mFrameV = NULL; 18249842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine EmulatedCameraDevice::commonStopDevice(); 18349842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine mState = ECDS_CONNECTED; 184b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 18549842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine return NO_ERROR; 186b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 187b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 188b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/**************************************************************************** 189b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Worker thread management overrides. 190b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine ***************************************************************************/ 191b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 1925467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkinebool EmulatedFakeCameraDevice::inWorkerThread() 193b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 194b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine /* Wait till FPS timeout expires, or thread exit message is received. */ 195b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine WorkerThread::SelectRes res = 1965467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine getWorkerThread()->Select(-1, 1000000 / mEmulatedFPS); 197b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine if (res == WorkerThread::EXIT_THREAD) { 198629719e390ce66be822c3563bbd248ce15eaae7bSteve Block ALOGV("%s: Worker thread has been terminated.", __FUNCTION__); 199b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return false; 200b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 201b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 202b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine /* Lets see if we need to generate a new frame. */ 20349842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine if ((systemTime(SYSTEM_TIME_MONOTONIC) - mLastRedrawn) >= mRedrawAfter) { 204b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine /* 205b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Time to generate a new frame. 206b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */ 207b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 2082a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#if EFCD_ROTATE_FRAME 2092a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int frame_type = rotateFrame(); 2102a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine switch (frame_type) { 2112a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine case 0: 2122a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine drawCheckerboard(); 2132a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine break; 2142a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine case 1: 2152a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine drawStripes(); 2162a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine break; 2172a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine case 2: 2182a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine drawSolid(mCurrentColor); 2192a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine break; 2202a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 2212a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#else 222b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine /* Draw the checker board. */ 2235467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine drawCheckerboard(); 224b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 2252a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#endif // EFCD_ROTATE_FRAME 2262a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 22749842cee0549befb6d7a4353247190820037e1c4Vladimir Chtchetkine mLastRedrawn = systemTime(SYSTEM_TIME_MONOTONIC); 228b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 229b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 23033bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine /* Timestamp the current frame, and notify the camera HAL about new frame. */ 2315467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mCurFrameTimestamp = systemTime(SYSTEM_TIME_MONOTONIC); 2325467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mCameraHAL->onNextFrameAvailable(mCurrentFrame, mCurFrameTimestamp, this); 233b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 234b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine return true; 235b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 236b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 237b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/**************************************************************************** 238b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Fake camera device private API 239b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine ***************************************************************************/ 240b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 2415467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkinevoid EmulatedFakeCameraDevice::drawCheckerboard() 242b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 2435467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine const int size = mFrameWidth / 10; 244b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine bool black = true; 245b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 2465467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine if((mCheckX / size) & 1) 247b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine black = false; 2485467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine if((mCheckY / size) & 1) 249b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine black = !black; 250b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 2515467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine int county = mCheckY % size; 2525467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine int checkxremainder = mCheckX % size; 2535467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* Y = mCurrentFrame; 2545467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* U_pos = mFrameU; 2555467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* V_pos = mFrameV; 2565467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* U = U_pos; 2575467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* V = V_pos; 258b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 25912c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen YUVPixel adjustedWhite = YUVPixel(mWhiteYUV); 26012c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen changeWhiteBalance(adjustedWhite.Y, adjustedWhite.U, adjustedWhite.V); 26112c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen 2625467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine for(int y = 0; y < mFrameHeight; y++) { 263b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine int countx = checkxremainder; 264b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine bool current = black; 2655467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine for(int x = 0; x < mFrameWidth; x += 2) { 266b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine if (current) { 2675467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mBlackYUV.get(Y, U, V); 268b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } else { 26912c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen adjustedWhite.get(Y, U, V); 270b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 271366396d9b001c7a1abf2b73161a9b7b05e9022ecChristine Chen *Y = changeExposure(*Y); 272b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine Y[1] = *Y; 2732a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine Y += 2; U += mUVStep; V += mUVStep; 274b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine countx += 2; 275b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine if(countx >= size) { 276b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine countx = 0; 277b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine current = !current; 278b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 279b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 280b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine if (y & 0x1) { 2815467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine U_pos = U; 2825467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine V_pos = V; 283b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } else { 2845467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine U = U_pos; 2855467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine V = V_pos; 286b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 287b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine if(county++ >= size) { 288b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine county = 0; 289b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine black = !black; 290b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 291b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 2925467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mCheckX += 3; 2935467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine mCheckY++; 2942a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 2952a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Run the square. */ 2962a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine int sqx = ((mCcounter * 3) & 255); 2972a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if(sqx > 128) sqx = 255 - sqx; 2982a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine int sqy = ((mCcounter * 5) & 255); 2992a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if(sqy > 128) sqy = 255 - sqy; 3002a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int sqsize = mFrameWidth / 10; 3012a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine drawSquare(sqx * sqsize / 32, sqy * sqsize / 32, (sqsize * 5) >> 1, 3022a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine (mCcounter & 0x100) ? &mRedYUV : &mGreenYUV); 3032a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCcounter++; 304b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 305b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 3065467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkinevoid EmulatedFakeCameraDevice::drawSquare(int x, 307b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine int y, 308b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine int size, 30933bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine const YUVPixel* color) 310b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{ 3112a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int square_xstop = min(mFrameWidth, x + size); 3122a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int square_ystop = min(mFrameHeight, y + size); 3135467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* Y_pos = mCurrentFrame + y * mFrameWidth + x; 314b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 315031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine YUVPixel adjustedColor = *color; 316031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine changeWhiteBalance(adjustedColor.Y, adjustedColor.U, adjustedColor.V); 317031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine 318b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine // Draw the square. 319b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine for (; y < square_ystop; y++) { 3202a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int iUV = (y / 2) * mUVInRow + (x / 2) * mUVStep; 3215467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* sqU = mFrameU + iUV; 3225467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine uint8_t* sqV = mFrameV + iUV; 323b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine uint8_t* sqY = Y_pos; 324b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine for (int i = x; i < square_xstop; i += 2) { 325031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine adjustedColor.get(sqY, sqU, sqV); 326366396d9b001c7a1abf2b73161a9b7b05e9022ecChristine Chen *sqY = changeExposure(*sqY); 327b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine sqY[1] = *sqY; 3282a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine sqY += 2; sqU += mUVStep; sqV += mUVStep; 329b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 3305467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine Y_pos += mFrameWidth; 331b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine } 332b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine} 333b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine 3342a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#if EFCD_ROTATE_FRAME 3352a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 3362a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid EmulatedFakeCameraDevice::drawSolid(YUVPixel* color) 3372a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{ 338031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine YUVPixel adjustedColor = *color; 339031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine changeWhiteBalance(adjustedColor.Y, adjustedColor.U, adjustedColor.V); 340031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine 3412a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* All Ys are the same. */ 342031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine memset(mCurrentFrame, changeExposure(adjustedColor.Y), mTotalPixels); 3432a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 3442a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Fill U, and V panes. */ 3452a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine uint8_t* U = mFrameU; 3462a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine uint8_t* V = mFrameV; 3472a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine for (int k = 0; k < mUVTotalNum; k++, U += mUVStep, V += mUVStep) { 3482a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine *U = color->U; 3492a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine *V = color->V; 3502a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 3512a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine} 3522a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 3532a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid EmulatedFakeCameraDevice::drawStripes() 3542a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{ 3552a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Divide frame into 4 stripes. */ 3562a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int change_color_at = mFrameHeight / 4; 3572a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int each_in_row = mUVInRow / mUVStep; 3582a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine uint8_t* pY = mCurrentFrame; 3592a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine for (int y = 0; y < mFrameHeight; y++, pY += mFrameWidth) { 3602a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Select the color. */ 3612a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine YUVPixel* color; 3622a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int color_index = y / change_color_at; 3632a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if (color_index == 0) { 3642a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* White stripe on top. */ 3652a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine color = &mWhiteYUV; 3662a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else if (color_index == 1) { 3672a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Then the red stripe. */ 3682a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine color = &mRedYUV; 3692a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else if (color_index == 2) { 3702a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Then the green stripe. */ 3712a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine color = &mGreenYUV; 3722a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else { 3732a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* And the blue stripe at the bottom. */ 3742a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine color = &mBlueYUV; 3752a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 376031b92f4c7edf17aa6e75e6c4ec3582e0413b744Vladimir Chtchetkine changeWhiteBalance(color->Y, color->U, color->V); 3772a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 3782a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* All Ys at the row are the same. */ 379366396d9b001c7a1abf2b73161a9b7b05e9022ecChristine Chen memset(pY, changeExposure(color->Y), mFrameWidth); 3802a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 3812a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Offset of the current row inside U/V panes. */ 3822a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine const int uv_off = (y / 2) * mUVInRow; 3832a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Fill U, and V panes. */ 3842a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine uint8_t* U = mFrameU + uv_off; 3852a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine uint8_t* V = mFrameV + uv_off; 3862a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine for (int k = 0; k < each_in_row; k++, U += mUVStep, V += mUVStep) { 3872a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine *U = color->U; 3882a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine *V = color->V; 3892a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 3902a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 3912a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine} 3922a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 3932a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkineint EmulatedFakeCameraDevice::rotateFrame() 3942a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{ 3952a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if ((systemTime(SYSTEM_TIME_MONOTONIC) - mLastRotatedAt) >= mRotateFreq) { 3962a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mLastRotatedAt = systemTime(SYSTEM_TIME_MONOTONIC); 3972a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentFrameType++; 3982a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if (mCurrentFrameType > 2) { 3992a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentFrameType = 0; 4002a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 4012a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if (mCurrentFrameType == 2) { 402112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("********** Rotated to the SOLID COLOR frame **********"); 4032a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Solid color: lets rotate color too. */ 4042a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine if (mCurrentColor == &mWhiteYUV) { 405112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("----- Painting a solid RED frame -----"); 4062a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentColor = &mRedYUV; 4072a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else if (mCurrentColor == &mRedYUV) { 408112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("----- Painting a solid GREEN frame -----"); 4092a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentColor = &mGreenYUV; 4102a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else if (mCurrentColor == &mGreenYUV) { 411112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("----- Painting a solid BLUE frame -----"); 4122a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentColor = &mBlueYUV; 4132a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else { 4142a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine /* Back to white. */ 415112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("----- Painting a solid WHITE frame -----"); 4162a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine mCurrentColor = &mWhiteYUV; 4172a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 4182a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } else if (mCurrentFrameType == 0) { 419112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("********** Rotated to the CHECKERBOARD frame **********"); 42012c0b21abeea8f07cdcab3bf9a79b0791590f537Christine Chen } else if (mCurrentFrameType == 1) { 421112bc5e57e206ec3e0bc5a335b62eae2eb8892e8Steve Block ALOGD("********** Rotated to the STRIPED frame **********"); 4222a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 4232a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine } 4242a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 4252a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine return mCurrentFrameType; 4262a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine} 4272a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 4282a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine#endif // EFCD_ROTATE_FRAME 4292a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine 430b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine}; /* namespace android */ 431