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