18a94683196406b83b14218d1beef66067f126a16keunyoung/*
28a94683196406b83b14218d1beef66067f126a16keunyoung * Copyright (C) 2012 The Android Open Source Project
38a94683196406b83b14218d1beef66067f126a16keunyoung *
48a94683196406b83b14218d1beef66067f126a16keunyoung * Licensed under the Apache License, Version 2.0 (the "License");
58a94683196406b83b14218d1beef66067f126a16keunyoung * you may not use this file except in compliance with the License.
68a94683196406b83b14218d1beef66067f126a16keunyoung * You may obtain a copy of the License at
78a94683196406b83b14218d1beef66067f126a16keunyoung *
88a94683196406b83b14218d1beef66067f126a16keunyoung *      http://www.apache.org/licenses/LICENSE-2.0
98a94683196406b83b14218d1beef66067f126a16keunyoung *
108a94683196406b83b14218d1beef66067f126a16keunyoung * Unless required by applicable law or agreed to in writing, software
118a94683196406b83b14218d1beef66067f126a16keunyoung * distributed under the License is distributed on an "AS IS" BASIS,
128a94683196406b83b14218d1beef66067f126a16keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a94683196406b83b14218d1beef66067f126a16keunyoung * See the License for the specific language governing permissions and
148a94683196406b83b14218d1beef66067f126a16keunyoung * limitations under the License.
158a94683196406b83b14218d1beef66067f126a16keunyoung */
168a94683196406b83b14218d1beef66067f126a16keunyoung
178a94683196406b83b14218d1beef66067f126a16keunyoung/*
188a94683196406b83b14218d1beef66067f126a16keunyoung * Contains implementation of a class EmulatedFakeCamera2 that encapsulates
198a94683196406b83b14218d1beef66067f126a16keunyoung * functionality of an advanced fake camera.
208a94683196406b83b14218d1beef66067f126a16keunyoung */
218a94683196406b83b14218d1beef66067f126a16keunyoung
223725c7c982eac52ec64a625e82f306822452941cColin Cross#include <inttypes.h>
233725c7c982eac52ec64a625e82f306822452941cColin Cross
248a94683196406b83b14218d1beef66067f126a16keunyoung//#define LOG_NDEBUG 0
258a94683196406b83b14218d1beef66067f126a16keunyoung#define LOG_TAG "EmulatedCamera_FakeCamera2"
268a94683196406b83b14218d1beef66067f126a16keunyoung#include <utils/Log.h>
278a94683196406b83b14218d1beef66067f126a16keunyoung
288a94683196406b83b14218d1beef66067f126a16keunyoung#include "EmulatedFakeCamera2.h"
298a94683196406b83b14218d1beef66067f126a16keunyoung#include "EmulatedCameraFactory.h"
308a94683196406b83b14218d1beef66067f126a16keunyoung#include <ui/Rect.h>
318a94683196406b83b14218d1beef66067f126a16keunyoung#include <ui/GraphicBufferMapper.h>
328a94683196406b83b14218d1beef66067f126a16keunyoung#include "gralloc_cb.h"
338a94683196406b83b14218d1beef66067f126a16keunyoung
347e145808ae3a1b17c0ce4baf06199153ff4e9e9bChih-Hung Hsieh#define ERROR_CAMERA_NOT_PRESENT (-EPIPE)
354dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
364dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin#define CAMERA2_EXT_TRIGGER_TESTING_DISCONNECT 0xFFFFFFFF
374dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
388a94683196406b83b14218d1beef66067f126a16keunyoungnamespace android {
398a94683196406b83b14218d1beef66067f126a16keunyoung
408a94683196406b83b14218d1beef66067f126a16keunyoungconst int64_t USEC = 1000LL;
418a94683196406b83b14218d1beef66067f126a16keunyoungconst int64_t MSEC = USEC * 1000LL;
428a94683196406b83b14218d1beef66067f126a16keunyoungconst int64_t SEC = MSEC * 1000LL;
438a94683196406b83b14218d1beef66067f126a16keunyoung
448a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableFormats[4] = {
45b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala        HAL_PIXEL_FORMAT_RAW16,
468a94683196406b83b14218d1beef66067f126a16keunyoung        HAL_PIXEL_FORMAT_BLOB,
478a94683196406b83b14218d1beef66067f126a16keunyoung        HAL_PIXEL_FORMAT_RGBA_8888,
488a94683196406b83b14218d1beef66067f126a16keunyoung        //        HAL_PIXEL_FORMAT_YV12,
498a94683196406b83b14218d1beef66067f126a16keunyoung        HAL_PIXEL_FORMAT_YCrCb_420_SP
508a94683196406b83b14218d1beef66067f126a16keunyoung};
518a94683196406b83b14218d1beef66067f126a16keunyoung
528a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableRawSizes[2] = {
538a94683196406b83b14218d1beef66067f126a16keunyoung    640, 480
548a94683196406b83b14218d1beef66067f126a16keunyoung    //    Sensor::kResolution[0], Sensor::kResolution[1]
558a94683196406b83b14218d1beef66067f126a16keunyoung};
568a94683196406b83b14218d1beef66067f126a16keunyoung
578a94683196406b83b14218d1beef66067f126a16keunyoungconst uint64_t EmulatedFakeCamera2::kAvailableRawMinDurations[1] = {
5879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala    static_cast<uint64_t>(Sensor::kFrameDurationRange[0])
598a94683196406b83b14218d1beef66067f126a16keunyoung};
608a94683196406b83b14218d1beef66067f126a16keunyoung
618a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableProcessedSizesBack[4] = {
628a94683196406b83b14218d1beef66067f126a16keunyoung    640, 480, 320, 240
638a94683196406b83b14218d1beef66067f126a16keunyoung    //    Sensor::kResolution[0], Sensor::kResolution[1]
648a94683196406b83b14218d1beef66067f126a16keunyoung};
658a94683196406b83b14218d1beef66067f126a16keunyoung
668a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableProcessedSizesFront[4] = {
678a94683196406b83b14218d1beef66067f126a16keunyoung    320, 240, 160, 120
688a94683196406b83b14218d1beef66067f126a16keunyoung    //    Sensor::kResolution[0], Sensor::kResolution[1]
698a94683196406b83b14218d1beef66067f126a16keunyoung};
708a94683196406b83b14218d1beef66067f126a16keunyoung
718a94683196406b83b14218d1beef66067f126a16keunyoungconst uint64_t EmulatedFakeCamera2::kAvailableProcessedMinDurations[1] = {
7279f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala    static_cast<uint64_t>(Sensor::kFrameDurationRange[0])
738a94683196406b83b14218d1beef66067f126a16keunyoung};
748a94683196406b83b14218d1beef66067f126a16keunyoung
758a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableJpegSizesBack[2] = {
768a94683196406b83b14218d1beef66067f126a16keunyoung    640, 480
778a94683196406b83b14218d1beef66067f126a16keunyoung    //    Sensor::kResolution[0], Sensor::kResolution[1]
788a94683196406b83b14218d1beef66067f126a16keunyoung};
798a94683196406b83b14218d1beef66067f126a16keunyoung
808a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableJpegSizesFront[2] = {
818a94683196406b83b14218d1beef66067f126a16keunyoung    320, 240
828a94683196406b83b14218d1beef66067f126a16keunyoung    //    Sensor::kResolution[0], Sensor::kResolution[1]
838a94683196406b83b14218d1beef66067f126a16keunyoung};
848a94683196406b83b14218d1beef66067f126a16keunyoung
858a94683196406b83b14218d1beef66067f126a16keunyoung
868a94683196406b83b14218d1beef66067f126a16keunyoungconst uint64_t EmulatedFakeCamera2::kAvailableJpegMinDurations[1] = {
8779f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala    static_cast<uint64_t>(Sensor::kFrameDurationRange[0])
888a94683196406b83b14218d1beef66067f126a16keunyoung};
898a94683196406b83b14218d1beef66067f126a16keunyoung
908a94683196406b83b14218d1beef66067f126a16keunyoung
918a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::EmulatedFakeCamera2(int cameraId,
928a94683196406b83b14218d1beef66067f126a16keunyoung        bool facingBack,
938a94683196406b83b14218d1beef66067f126a16keunyoung        struct hw_module_t* module)
948a94683196406b83b14218d1beef66067f126a16keunyoung        : EmulatedCamera2(cameraId,module),
954dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin          mFacingBack(facingBack),
964dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin          mIsConnected(false)
978a94683196406b83b14218d1beef66067f126a16keunyoung{
988a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGD("Constructing emulated fake camera 2 facing %s",
998a94683196406b83b14218d1beef66067f126a16keunyoung            facingBack ? "back" : "front");
1008a94683196406b83b14218d1beef66067f126a16keunyoung}
1018a94683196406b83b14218d1beef66067f126a16keunyoung
1028a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::~EmulatedFakeCamera2() {
1038a94683196406b83b14218d1beef66067f126a16keunyoung    if (mCameraInfo != NULL) {
1048a94683196406b83b14218d1beef66067f126a16keunyoung        free_camera_metadata(mCameraInfo);
1058a94683196406b83b14218d1beef66067f126a16keunyoung    }
1068a94683196406b83b14218d1beef66067f126a16keunyoung}
1078a94683196406b83b14218d1beef66067f126a16keunyoung
1088a94683196406b83b14218d1beef66067f126a16keunyoung/****************************************************************************
1098a94683196406b83b14218d1beef66067f126a16keunyoung * Public API overrides
1108a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/
1118a94683196406b83b14218d1beef66067f126a16keunyoung
1128a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::Initialize() {
1138a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
1148a94683196406b83b14218d1beef66067f126a16keunyoung
1158a94683196406b83b14218d1beef66067f126a16keunyoung    res = constructStaticInfo(&mCameraInfo, true);
1168a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
1178a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to allocate static info: %s (%d)",
1188a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
1198a94683196406b83b14218d1beef66067f126a16keunyoung        return res;
1208a94683196406b83b14218d1beef66067f126a16keunyoung    }
1218a94683196406b83b14218d1beef66067f126a16keunyoung    res = constructStaticInfo(&mCameraInfo, false);
1228a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
1238a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to fill in static info: %s (%d)",
1248a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
1258a94683196406b83b14218d1beef66067f126a16keunyoung        return res;
1268a94683196406b83b14218d1beef66067f126a16keunyoung    }
1278a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) return res;
1288a94683196406b83b14218d1beef66067f126a16keunyoung
1298a94683196406b83b14218d1beef66067f126a16keunyoung    mNextStreamId = 1;
1308a94683196406b83b14218d1beef66067f126a16keunyoung    mNextReprocessStreamId = 1;
1318a94683196406b83b14218d1beef66067f126a16keunyoung    mRawStreamCount = 0;
1328a94683196406b83b14218d1beef66067f126a16keunyoung    mProcessedStreamCount = 0;
1338a94683196406b83b14218d1beef66067f126a16keunyoung    mJpegStreamCount = 0;
1348a94683196406b83b14218d1beef66067f126a16keunyoung    mReprocessStreamCount = 0;
1358a94683196406b83b14218d1beef66067f126a16keunyoung
1368a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
1378a94683196406b83b14218d1beef66067f126a16keunyoung}
1388a94683196406b83b14218d1beef66067f126a16keunyoung
1398a94683196406b83b14218d1beef66067f126a16keunyoung/****************************************************************************
1408a94683196406b83b14218d1beef66067f126a16keunyoung * Camera module API overrides
1418a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/
1428a94683196406b83b14218d1beef66067f126a16keunyoung
1438a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::connectCamera(hw_device_t** device) {
1448a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
1458a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("%s", __FUNCTION__);
1468a94683196406b83b14218d1beef66067f126a16keunyoung
1474dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    {
1484dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        Mutex::Autolock l(mMutex);
1494dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        if (!mStatusPresent) {
1504dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            ALOGE("%s: Camera ID %d is unplugged", __FUNCTION__,
1514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin                  mCameraID);
1524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            return -ENODEV;
1534dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        }
1544dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
1554dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1568a94683196406b83b14218d1beef66067f126a16keunyoung    mConfigureThread = new ConfigureThread(this);
1578a94683196406b83b14218d1beef66067f126a16keunyoung    mReadoutThread = new ReadoutThread(this);
1588a94683196406b83b14218d1beef66067f126a16keunyoung    mControlThread = new ControlThread(this);
1592de81ad1fbadb0b2dd26830f6bb97c19c783969fEino-Ville Talvala    mSensor = new Sensor();
16057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    mJpegCompressor = new JpegCompressor();
1618a94683196406b83b14218d1beef66067f126a16keunyoung
1628a94683196406b83b14218d1beef66067f126a16keunyoung    mNextStreamId = 1;
1638a94683196406b83b14218d1beef66067f126a16keunyoung    mNextReprocessStreamId = 1;
1648a94683196406b83b14218d1beef66067f126a16keunyoung
1658a94683196406b83b14218d1beef66067f126a16keunyoung    res = mSensor->startUp();
1668a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) return res;
1678a94683196406b83b14218d1beef66067f126a16keunyoung
1688a94683196406b83b14218d1beef66067f126a16keunyoung    res = mConfigureThread->run("EmulatedFakeCamera2::configureThread");
1698a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) return res;
1708a94683196406b83b14218d1beef66067f126a16keunyoung
1718a94683196406b83b14218d1beef66067f126a16keunyoung    res = mReadoutThread->run("EmulatedFakeCamera2::readoutThread");
1728a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) return res;
1738a94683196406b83b14218d1beef66067f126a16keunyoung
1748a94683196406b83b14218d1beef66067f126a16keunyoung    res = mControlThread->run("EmulatedFakeCamera2::controlThread");
1758a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) return res;
1768a94683196406b83b14218d1beef66067f126a16keunyoung
1774dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    status_t ret = EmulatedCamera2::connectCamera(device);
1784dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1794dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (ret >= 0) {
1804dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        mIsConnected = true;
1814dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
1824dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1834dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    return ret;
1844dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin}
1854dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1864dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkinstatus_t EmulatedFakeCamera2::plugCamera() {
1874dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    {
1884dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        Mutex::Autolock l(mMutex);
1894dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1904dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        if (!mStatusPresent) {
1914dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            ALOGI("%s: Plugged back in", __FUNCTION__);
1924dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            mStatusPresent = true;
1934dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        }
1944dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
1954dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1964dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    return NO_ERROR;
1974dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin}
1984dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
1994dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkinstatus_t EmulatedFakeCamera2::unplugCamera() {
2004dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    {
2014dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        Mutex::Autolock l(mMutex);
2024dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2034dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        if (mStatusPresent) {
2044dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            ALOGI("%s: Unplugged camera", __FUNCTION__);
2054dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            mStatusPresent = false;
2064dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        }
2074dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
2084dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2094dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    return closeCamera();
2104dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin}
2114dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2124dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkincamera_device_status_t EmulatedFakeCamera2::getHotplugStatus() {
2134dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    Mutex::Autolock l(mMutex);
2144dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    return mStatusPresent ?
2154dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        CAMERA_DEVICE_STATUS_PRESENT :
2164dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        CAMERA_DEVICE_STATUS_NOT_PRESENT;
2178a94683196406b83b14218d1beef66067f126a16keunyoung}
2188a94683196406b83b14218d1beef66067f126a16keunyoung
2194dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2204dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2218a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::closeCamera() {
2228a94683196406b83b14218d1beef66067f126a16keunyoung    {
2238a94683196406b83b14218d1beef66067f126a16keunyoung        Mutex::Autolock l(mMutex);
2248a94683196406b83b14218d1beef66067f126a16keunyoung
2258a94683196406b83b14218d1beef66067f126a16keunyoung        status_t res;
2268a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("%s", __FUNCTION__);
2278a94683196406b83b14218d1beef66067f126a16keunyoung
2284dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        if (!mIsConnected) {
2294dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            return NO_ERROR;
2304dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        }
2314dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2328a94683196406b83b14218d1beef66067f126a16keunyoung        res = mSensor->shutDown();
2338a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != NO_ERROR) {
2348a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Unable to shut down sensor: %d", __FUNCTION__, res);
2358a94683196406b83b14218d1beef66067f126a16keunyoung            return res;
2368a94683196406b83b14218d1beef66067f126a16keunyoung        }
2378a94683196406b83b14218d1beef66067f126a16keunyoung
2388a94683196406b83b14218d1beef66067f126a16keunyoung        mConfigureThread->requestExit();
2398a94683196406b83b14218d1beef66067f126a16keunyoung        mReadoutThread->requestExit();
2408a94683196406b83b14218d1beef66067f126a16keunyoung        mControlThread->requestExit();
2418a94683196406b83b14218d1beef66067f126a16keunyoung        mJpegCompressor->cancel();
2428a94683196406b83b14218d1beef66067f126a16keunyoung    }
2438a94683196406b83b14218d1beef66067f126a16keunyoung
2448a94683196406b83b14218d1beef66067f126a16keunyoung    // give up the lock since we will now block and the threads
2458a94683196406b83b14218d1beef66067f126a16keunyoung    // can call back into this object
2468a94683196406b83b14218d1beef66067f126a16keunyoung    mConfigureThread->join();
2478a94683196406b83b14218d1beef66067f126a16keunyoung    mReadoutThread->join();
2488a94683196406b83b14218d1beef66067f126a16keunyoung    mControlThread->join();
2498a94683196406b83b14218d1beef66067f126a16keunyoung
2508a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("%s exit", __FUNCTION__);
2514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    {
2534dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        Mutex::Autolock l(mMutex);
2544dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        mIsConnected = false;
2554dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
2564dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2578a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
2588a94683196406b83b14218d1beef66067f126a16keunyoung}
2598a94683196406b83b14218d1beef66067f126a16keunyoung
2608a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::getCameraInfo(struct camera_info *info) {
2618a94683196406b83b14218d1beef66067f126a16keunyoung    info->facing = mFacingBack ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT;
2628a94683196406b83b14218d1beef66067f126a16keunyoung    info->orientation = gEmulatedCameraFactory.getFakeCameraOrientation();
2638a94683196406b83b14218d1beef66067f126a16keunyoung    return EmulatedCamera2::getCameraInfo(info);
2648a94683196406b83b14218d1beef66067f126a16keunyoung}
2658a94683196406b83b14218d1beef66067f126a16keunyoung
2668a94683196406b83b14218d1beef66067f126a16keunyoung/****************************************************************************
2678a94683196406b83b14218d1beef66067f126a16keunyoung * Camera device API overrides
2688a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/
2698a94683196406b83b14218d1beef66067f126a16keunyoung
2708a94683196406b83b14218d1beef66067f126a16keunyoung/** Request input queue */
2718a94683196406b83b14218d1beef66067f126a16keunyoung
2728a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::requestQueueNotify() {
2738a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Request queue notification received");
2748a94683196406b83b14218d1beef66067f126a16keunyoung
2758a94683196406b83b14218d1beef66067f126a16keunyoung    ALOG_ASSERT(mRequestQueueSrc != NULL,
2768a94683196406b83b14218d1beef66067f126a16keunyoung            "%s: Request queue src not set, but received queue notification!",
2778a94683196406b83b14218d1beef66067f126a16keunyoung            __FUNCTION__);
2788a94683196406b83b14218d1beef66067f126a16keunyoung    ALOG_ASSERT(mFrameQueueDst != NULL,
2798a94683196406b83b14218d1beef66067f126a16keunyoung            "%s: Request queue src not set, but received queue notification!",
2808a94683196406b83b14218d1beef66067f126a16keunyoung            __FUNCTION__);
2818a94683196406b83b14218d1beef66067f126a16keunyoung    ALOG_ASSERT(mStreams.size() != 0,
2828a94683196406b83b14218d1beef66067f126a16keunyoung            "%s: No streams allocated, but received queue notification!",
2838a94683196406b83b14218d1beef66067f126a16keunyoung            __FUNCTION__);
2848a94683196406b83b14218d1beef66067f126a16keunyoung    return mConfigureThread->newRequestAvailable();
2858a94683196406b83b14218d1beef66067f126a16keunyoung}
2868a94683196406b83b14218d1beef66067f126a16keunyoung
2878a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::getInProgressCount() {
2888a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
2898a94683196406b83b14218d1beef66067f126a16keunyoung
2904dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (!mStatusPresent) {
2914dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGW("%s: Camera was physically disconnected", __FUNCTION__);
2924dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        return ERROR_CAMERA_NOT_PRESENT;
2934dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
2944dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
2958a94683196406b83b14218d1beef66067f126a16keunyoung    int requestCount = 0;
2968a94683196406b83b14218d1beef66067f126a16keunyoung    requestCount += mConfigureThread->getInProgressCount();
2978a94683196406b83b14218d1beef66067f126a16keunyoung    requestCount += mReadoutThread->getInProgressCount();
2988a94683196406b83b14218d1beef66067f126a16keunyoung    requestCount += mJpegCompressor->isBusy() ? 1 : 0;
2998a94683196406b83b14218d1beef66067f126a16keunyoung
3008a94683196406b83b14218d1beef66067f126a16keunyoung    return requestCount;
3018a94683196406b83b14218d1beef66067f126a16keunyoung}
3028a94683196406b83b14218d1beef66067f126a16keunyoung
3038a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::constructDefaultRequest(
3048a94683196406b83b14218d1beef66067f126a16keunyoung        int request_template,
3058a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_t **request) {
3068a94683196406b83b14218d1beef66067f126a16keunyoung
3078a94683196406b83b14218d1beef66067f126a16keunyoung    if (request == NULL) return BAD_VALUE;
3088a94683196406b83b14218d1beef66067f126a16keunyoung    if (request_template < 0 || request_template >= CAMERA2_TEMPLATE_COUNT) {
3098a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
3108a94683196406b83b14218d1beef66067f126a16keunyoung    }
3114dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
3124dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    {
3134dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        Mutex::Autolock l(mMutex);
3144dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        if (!mStatusPresent) {
3154dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            ALOGW("%s: Camera was physically disconnected", __FUNCTION__);
3164dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            return ERROR_CAMERA_NOT_PRESENT;
3174dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        }
3184dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
3194dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
3208a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
3218a94683196406b83b14218d1beef66067f126a16keunyoung    // Pass 1, calculate size and allocate
3228a94683196406b83b14218d1beef66067f126a16keunyoung    res = constructDefaultRequest(request_template,
3238a94683196406b83b14218d1beef66067f126a16keunyoung            request,
3248a94683196406b83b14218d1beef66067f126a16keunyoung            true);
3258a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
3268a94683196406b83b14218d1beef66067f126a16keunyoung        return res;
3278a94683196406b83b14218d1beef66067f126a16keunyoung    }
3288a94683196406b83b14218d1beef66067f126a16keunyoung    // Pass 2, build request
3298a94683196406b83b14218d1beef66067f126a16keunyoung    res = constructDefaultRequest(request_template,
3308a94683196406b83b14218d1beef66067f126a16keunyoung            request,
3318a94683196406b83b14218d1beef66067f126a16keunyoung            false);
3328a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
3338a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("Unable to populate new request for template %d",
3348a94683196406b83b14218d1beef66067f126a16keunyoung                request_template);
3358a94683196406b83b14218d1beef66067f126a16keunyoung    }
3368a94683196406b83b14218d1beef66067f126a16keunyoung
3378a94683196406b83b14218d1beef66067f126a16keunyoung    return res;
3388a94683196406b83b14218d1beef66067f126a16keunyoung}
3398a94683196406b83b14218d1beef66067f126a16keunyoung
3408a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::allocateStream(
3418a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t width,
3428a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t height,
3438a94683196406b83b14218d1beef66067f126a16keunyoung        int format,
3448a94683196406b83b14218d1beef66067f126a16keunyoung        const camera2_stream_ops_t *stream_ops,
3458a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t *stream_id,
3468a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t *format_actual,
3478a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t *usage,
3488a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t *max_buffers) {
3498a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
3508a94683196406b83b14218d1beef66067f126a16keunyoung
3514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (!mStatusPresent) {
3524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGW("%s: Camera was physically disconnected", __FUNCTION__);
3534dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        return ERROR_CAMERA_NOT_PRESENT;
3544dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
3554dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
3568a94683196406b83b14218d1beef66067f126a16keunyoung    // Temporary shim until FORMAT_ZSL is removed
3578a94683196406b83b14218d1beef66067f126a16keunyoung    if (format == CAMERA2_HAL_PIXEL_FORMAT_ZSL) {
3588a94683196406b83b14218d1beef66067f126a16keunyoung        format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
3598a94683196406b83b14218d1beef66067f126a16keunyoung    }
3608a94683196406b83b14218d1beef66067f126a16keunyoung
3618a94683196406b83b14218d1beef66067f126a16keunyoung    if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
3628a94683196406b83b14218d1beef66067f126a16keunyoung        unsigned int numFormats = sizeof(kAvailableFormats) / sizeof(uint32_t);
3638a94683196406b83b14218d1beef66067f126a16keunyoung        unsigned int formatIdx = 0;
3648a94683196406b83b14218d1beef66067f126a16keunyoung        unsigned int sizeOffsetIdx = 0;
3658a94683196406b83b14218d1beef66067f126a16keunyoung        for (; formatIdx < numFormats; formatIdx++) {
3668a94683196406b83b14218d1beef66067f126a16keunyoung            if (format == (int)kAvailableFormats[formatIdx]) break;
3678a94683196406b83b14218d1beef66067f126a16keunyoung        }
3688a94683196406b83b14218d1beef66067f126a16keunyoung        if (formatIdx == numFormats) {
3698a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Format 0x%x is not supported", __FUNCTION__, format);
3708a94683196406b83b14218d1beef66067f126a16keunyoung            return BAD_VALUE;
3718a94683196406b83b14218d1beef66067f126a16keunyoung        }
3728a94683196406b83b14218d1beef66067f126a16keunyoung    }
3738a94683196406b83b14218d1beef66067f126a16keunyoung
3748a94683196406b83b14218d1beef66067f126a16keunyoung    const uint32_t *availableSizes;
3758a94683196406b83b14218d1beef66067f126a16keunyoung    size_t availableSizeCount;
3768a94683196406b83b14218d1beef66067f126a16keunyoung    switch (format) {
377b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
3788a94683196406b83b14218d1beef66067f126a16keunyoung            availableSizes = kAvailableRawSizes;
3798a94683196406b83b14218d1beef66067f126a16keunyoung            availableSizeCount = sizeof(kAvailableRawSizes)/sizeof(uint32_t);
3808a94683196406b83b14218d1beef66067f126a16keunyoung            break;
3818a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_BLOB:
3828a94683196406b83b14218d1beef66067f126a16keunyoung            availableSizes = mFacingBack ?
3838a94683196406b83b14218d1beef66067f126a16keunyoung                    kAvailableJpegSizesBack : kAvailableJpegSizesFront;
3848a94683196406b83b14218d1beef66067f126a16keunyoung            availableSizeCount = mFacingBack ?
3858a94683196406b83b14218d1beef66067f126a16keunyoung                    sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t) :
3868a94683196406b83b14218d1beef66067f126a16keunyoung                    sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t);
3878a94683196406b83b14218d1beef66067f126a16keunyoung            break;
3888a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
3898a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_RGBA_8888:
3908a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_YV12:
3918a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
3928a94683196406b83b14218d1beef66067f126a16keunyoung            availableSizes = mFacingBack ?
3938a94683196406b83b14218d1beef66067f126a16keunyoung                    kAvailableProcessedSizesBack : kAvailableProcessedSizesFront;
3948a94683196406b83b14218d1beef66067f126a16keunyoung            availableSizeCount = mFacingBack ?
3958a94683196406b83b14218d1beef66067f126a16keunyoung                    sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t) :
3968a94683196406b83b14218d1beef66067f126a16keunyoung                    sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t);
3978a94683196406b83b14218d1beef66067f126a16keunyoung            break;
3988a94683196406b83b14218d1beef66067f126a16keunyoung        default:
3998a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Unknown format 0x%x", __FUNCTION__, format);
4008a94683196406b83b14218d1beef66067f126a16keunyoung            return BAD_VALUE;
4018a94683196406b83b14218d1beef66067f126a16keunyoung    }
4028a94683196406b83b14218d1beef66067f126a16keunyoung
4038a94683196406b83b14218d1beef66067f126a16keunyoung    unsigned int resIdx = 0;
4048a94683196406b83b14218d1beef66067f126a16keunyoung    for (; resIdx < availableSizeCount; resIdx++) {
4058a94683196406b83b14218d1beef66067f126a16keunyoung        if (availableSizes[resIdx * 2] == width &&
4068a94683196406b83b14218d1beef66067f126a16keunyoung                availableSizes[resIdx * 2 + 1] == height) break;
4078a94683196406b83b14218d1beef66067f126a16keunyoung    }
4088a94683196406b83b14218d1beef66067f126a16keunyoung    if (resIdx == availableSizeCount) {
4098a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Format 0x%x does not support resolution %d, %d", __FUNCTION__,
4108a94683196406b83b14218d1beef66067f126a16keunyoung                format, width, height);
4118a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
4128a94683196406b83b14218d1beef66067f126a16keunyoung    }
4138a94683196406b83b14218d1beef66067f126a16keunyoung
4148a94683196406b83b14218d1beef66067f126a16keunyoung    switch (format) {
415b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
4168a94683196406b83b14218d1beef66067f126a16keunyoung            if (mRawStreamCount >= kMaxRawStreamCount) {
4178a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Cannot allocate another raw stream (%d already allocated)",
4188a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, mRawStreamCount);
4198a94683196406b83b14218d1beef66067f126a16keunyoung                return INVALID_OPERATION;
4208a94683196406b83b14218d1beef66067f126a16keunyoung            }
4218a94683196406b83b14218d1beef66067f126a16keunyoung            mRawStreamCount++;
4228a94683196406b83b14218d1beef66067f126a16keunyoung            break;
4238a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_BLOB:
4248a94683196406b83b14218d1beef66067f126a16keunyoung            if (mJpegStreamCount >= kMaxJpegStreamCount) {
4258a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Cannot allocate another JPEG stream (%d already allocated)",
4268a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, mJpegStreamCount);
4278a94683196406b83b14218d1beef66067f126a16keunyoung                return INVALID_OPERATION;
4288a94683196406b83b14218d1beef66067f126a16keunyoung            }
4298a94683196406b83b14218d1beef66067f126a16keunyoung            mJpegStreamCount++;
4308a94683196406b83b14218d1beef66067f126a16keunyoung            break;
4318a94683196406b83b14218d1beef66067f126a16keunyoung        default:
4328a94683196406b83b14218d1beef66067f126a16keunyoung            if (mProcessedStreamCount >= kMaxProcessedStreamCount) {
4338a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Cannot allocate another processed stream (%d already allocated)",
4348a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, mProcessedStreamCount);
4358a94683196406b83b14218d1beef66067f126a16keunyoung                return INVALID_OPERATION;
4368a94683196406b83b14218d1beef66067f126a16keunyoung            }
4378a94683196406b83b14218d1beef66067f126a16keunyoung            mProcessedStreamCount++;
4388a94683196406b83b14218d1beef66067f126a16keunyoung    }
4398a94683196406b83b14218d1beef66067f126a16keunyoung
4408a94683196406b83b14218d1beef66067f126a16keunyoung    Stream newStream;
4418a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.ops = stream_ops;
4428a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.width = width;
4438a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.height = height;
4448a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.format = format;
4458a94683196406b83b14218d1beef66067f126a16keunyoung    // TODO: Query stride from gralloc
4468a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.stride = width;
4478a94683196406b83b14218d1beef66067f126a16keunyoung
4488a94683196406b83b14218d1beef66067f126a16keunyoung    mStreams.add(mNextStreamId, newStream);
4498a94683196406b83b14218d1beef66067f126a16keunyoung
4508a94683196406b83b14218d1beef66067f126a16keunyoung    *stream_id = mNextStreamId;
4518a94683196406b83b14218d1beef66067f126a16keunyoung    if (format_actual) *format_actual = format;
4528a94683196406b83b14218d1beef66067f126a16keunyoung    *usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
4538a94683196406b83b14218d1beef66067f126a16keunyoung    *max_buffers = kMaxBufferCount;
4548a94683196406b83b14218d1beef66067f126a16keunyoung
4558a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Stream allocated: %d, %d x %d, 0x%x. U: %x, B: %d",
4568a94683196406b83b14218d1beef66067f126a16keunyoung            *stream_id, width, height, format, *usage, *max_buffers);
4578a94683196406b83b14218d1beef66067f126a16keunyoung
4588a94683196406b83b14218d1beef66067f126a16keunyoung    mNextStreamId++;
4598a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
4608a94683196406b83b14218d1beef66067f126a16keunyoung}
4618a94683196406b83b14218d1beef66067f126a16keunyoung
4628a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::registerStreamBuffers(
4638a94683196406b83b14218d1beef66067f126a16keunyoung            uint32_t stream_id,
4648a94683196406b83b14218d1beef66067f126a16keunyoung            int num_buffers,
4658a94683196406b83b14218d1beef66067f126a16keunyoung            buffer_handle_t *buffers) {
4668a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
4678a94683196406b83b14218d1beef66067f126a16keunyoung
4684dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (!mStatusPresent) {
4694dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGW("%s: Camera was physically disconnected", __FUNCTION__);
4704dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        return ERROR_CAMERA_NOT_PRESENT;
4714dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
4724dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
4738a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("%s: Stream %d registering %d buffers", __FUNCTION__,
4748a94683196406b83b14218d1beef66067f126a16keunyoung            stream_id, num_buffers);
4758a94683196406b83b14218d1beef66067f126a16keunyoung    // Need to find out what the final concrete pixel format for our stream is
4768a94683196406b83b14218d1beef66067f126a16keunyoung    // Assumes that all buffers have the same format.
4778a94683196406b83b14218d1beef66067f126a16keunyoung    if (num_buffers < 1) {
4788a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Stream %d only has %d buffers!",
4798a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, stream_id, num_buffers);
4808a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
4818a94683196406b83b14218d1beef66067f126a16keunyoung    }
4828a94683196406b83b14218d1beef66067f126a16keunyoung    const cb_handle_t *streamBuffer =
4838a94683196406b83b14218d1beef66067f126a16keunyoung            reinterpret_cast<const cb_handle_t*>(buffers[0]);
4848a94683196406b83b14218d1beef66067f126a16keunyoung
4858a94683196406b83b14218d1beef66067f126a16keunyoung    int finalFormat = streamBuffer->format;
4868a94683196406b83b14218d1beef66067f126a16keunyoung
4878a94683196406b83b14218d1beef66067f126a16keunyoung    if (finalFormat == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
4888a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Stream %d: Bad final pixel format "
4898a94683196406b83b14218d1beef66067f126a16keunyoung                "HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; "
4908a94683196406b83b14218d1beef66067f126a16keunyoung                "concrete pixel format required!", __FUNCTION__, stream_id);
4918a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
4928a94683196406b83b14218d1beef66067f126a16keunyoung    }
4938a94683196406b83b14218d1beef66067f126a16keunyoung
4948a94683196406b83b14218d1beef66067f126a16keunyoung    ssize_t streamIndex = mStreams.indexOfKey(stream_id);
4958a94683196406b83b14218d1beef66067f126a16keunyoung    if (streamIndex < 0) {
4968a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unknown stream id %d!", __FUNCTION__, stream_id);
4978a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
4988a94683196406b83b14218d1beef66067f126a16keunyoung    }
4998a94683196406b83b14218d1beef66067f126a16keunyoung
5008a94683196406b83b14218d1beef66067f126a16keunyoung    Stream &stream = mStreams.editValueAt(streamIndex);
5018a94683196406b83b14218d1beef66067f126a16keunyoung
5028a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("%s: Stream %d format set to %x, previously %x",
5038a94683196406b83b14218d1beef66067f126a16keunyoung            __FUNCTION__, stream_id, finalFormat, stream.format);
5048a94683196406b83b14218d1beef66067f126a16keunyoung
5058a94683196406b83b14218d1beef66067f126a16keunyoung    stream.format = finalFormat;
5068a94683196406b83b14218d1beef66067f126a16keunyoung
5078a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
5088a94683196406b83b14218d1beef66067f126a16keunyoung}
5098a94683196406b83b14218d1beef66067f126a16keunyoung
5108a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::releaseStream(uint32_t stream_id) {
5118a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
5128a94683196406b83b14218d1beef66067f126a16keunyoung
5138a94683196406b83b14218d1beef66067f126a16keunyoung    ssize_t streamIndex = mStreams.indexOfKey(stream_id);
5148a94683196406b83b14218d1beef66067f126a16keunyoung    if (streamIndex < 0) {
5158a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unknown stream id %d!", __FUNCTION__, stream_id);
5168a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
5178a94683196406b83b14218d1beef66067f126a16keunyoung    }
5188a94683196406b83b14218d1beef66067f126a16keunyoung
5198a94683196406b83b14218d1beef66067f126a16keunyoung    if (isStreamInUse(stream_id)) {
5208a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Cannot release stream %d; in use!", __FUNCTION__,
5218a94683196406b83b14218d1beef66067f126a16keunyoung                stream_id);
5228a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
5238a94683196406b83b14218d1beef66067f126a16keunyoung    }
5248a94683196406b83b14218d1beef66067f126a16keunyoung
5258a94683196406b83b14218d1beef66067f126a16keunyoung    switch(mStreams.valueAt(streamIndex).format) {
526b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
5278a94683196406b83b14218d1beef66067f126a16keunyoung            mRawStreamCount--;
5288a94683196406b83b14218d1beef66067f126a16keunyoung            break;
5298a94683196406b83b14218d1beef66067f126a16keunyoung        case HAL_PIXEL_FORMAT_BLOB:
5308a94683196406b83b14218d1beef66067f126a16keunyoung            mJpegStreamCount--;
5318a94683196406b83b14218d1beef66067f126a16keunyoung            break;
5328a94683196406b83b14218d1beef66067f126a16keunyoung        default:
5338a94683196406b83b14218d1beef66067f126a16keunyoung            mProcessedStreamCount--;
5348a94683196406b83b14218d1beef66067f126a16keunyoung            break;
5358a94683196406b83b14218d1beef66067f126a16keunyoung    }
5368a94683196406b83b14218d1beef66067f126a16keunyoung
5378a94683196406b83b14218d1beef66067f126a16keunyoung    mStreams.removeItemsAt(streamIndex);
5388a94683196406b83b14218d1beef66067f126a16keunyoung
5398a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
5408a94683196406b83b14218d1beef66067f126a16keunyoung}
5418a94683196406b83b14218d1beef66067f126a16keunyoung
5428a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::allocateReprocessStreamFromStream(
5438a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t output_stream_id,
5448a94683196406b83b14218d1beef66067f126a16keunyoung        const camera2_stream_in_ops_t *stream_ops,
5458a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t *stream_id) {
5468a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
5478a94683196406b83b14218d1beef66067f126a16keunyoung
5484dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (!mStatusPresent) {
5494dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGW("%s: Camera was physically disconnected", __FUNCTION__);
5504dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        return ERROR_CAMERA_NOT_PRESENT;
5514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
5524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
5538a94683196406b83b14218d1beef66067f126a16keunyoung    ssize_t baseStreamIndex = mStreams.indexOfKey(output_stream_id);
5548a94683196406b83b14218d1beef66067f126a16keunyoung    if (baseStreamIndex < 0) {
5558a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unknown output stream id %d!", __FUNCTION__, output_stream_id);
5568a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
5578a94683196406b83b14218d1beef66067f126a16keunyoung    }
5588a94683196406b83b14218d1beef66067f126a16keunyoung
5598a94683196406b83b14218d1beef66067f126a16keunyoung    const Stream &baseStream = mStreams[baseStreamIndex];
5608a94683196406b83b14218d1beef66067f126a16keunyoung
5618a94683196406b83b14218d1beef66067f126a16keunyoung    // We'll reprocess anything we produced
5628a94683196406b83b14218d1beef66067f126a16keunyoung
5638a94683196406b83b14218d1beef66067f126a16keunyoung    if (mReprocessStreamCount >= kMaxReprocessStreamCount) {
5648a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Cannot allocate another reprocess stream (%d already allocated)",
5658a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, mReprocessStreamCount);
5668a94683196406b83b14218d1beef66067f126a16keunyoung        return INVALID_OPERATION;
5678a94683196406b83b14218d1beef66067f126a16keunyoung    }
5688a94683196406b83b14218d1beef66067f126a16keunyoung    mReprocessStreamCount++;
5698a94683196406b83b14218d1beef66067f126a16keunyoung
5708a94683196406b83b14218d1beef66067f126a16keunyoung    ReprocessStream newStream;
5718a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.ops = stream_ops;
5728a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.width = baseStream.width;
5738a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.height = baseStream.height;
5748a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.format = baseStream.format;
5758a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.stride = baseStream.stride;
5768a94683196406b83b14218d1beef66067f126a16keunyoung    newStream.sourceStreamId = output_stream_id;
5778a94683196406b83b14218d1beef66067f126a16keunyoung
5788a94683196406b83b14218d1beef66067f126a16keunyoung    *stream_id = mNextReprocessStreamId;
5798a94683196406b83b14218d1beef66067f126a16keunyoung    mReprocessStreams.add(mNextReprocessStreamId, newStream);
5808a94683196406b83b14218d1beef66067f126a16keunyoung
5818a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Reprocess stream allocated: %d: %d, %d, 0x%x. Parent stream: %d",
5828a94683196406b83b14218d1beef66067f126a16keunyoung            *stream_id, newStream.width, newStream.height, newStream.format,
5838a94683196406b83b14218d1beef66067f126a16keunyoung            output_stream_id);
5848a94683196406b83b14218d1beef66067f126a16keunyoung
5858a94683196406b83b14218d1beef66067f126a16keunyoung    mNextReprocessStreamId++;
5868a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
5878a94683196406b83b14218d1beef66067f126a16keunyoung}
5888a94683196406b83b14218d1beef66067f126a16keunyoung
5898a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::releaseReprocessStream(uint32_t stream_id) {
5908a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
5918a94683196406b83b14218d1beef66067f126a16keunyoung
5928a94683196406b83b14218d1beef66067f126a16keunyoung    ssize_t streamIndex = mReprocessStreams.indexOfKey(stream_id);
5938a94683196406b83b14218d1beef66067f126a16keunyoung    if (streamIndex < 0) {
5948a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unknown reprocess stream id %d!", __FUNCTION__, stream_id);
5958a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
5968a94683196406b83b14218d1beef66067f126a16keunyoung    }
5978a94683196406b83b14218d1beef66067f126a16keunyoung
5988a94683196406b83b14218d1beef66067f126a16keunyoung    if (isReprocessStreamInUse(stream_id)) {
5998a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Cannot release reprocessing stream %d; in use!", __FUNCTION__,
6008a94683196406b83b14218d1beef66067f126a16keunyoung                stream_id);
6018a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
6028a94683196406b83b14218d1beef66067f126a16keunyoung    }
6038a94683196406b83b14218d1beef66067f126a16keunyoung
6048a94683196406b83b14218d1beef66067f126a16keunyoung    mReprocessStreamCount--;
6058a94683196406b83b14218d1beef66067f126a16keunyoung    mReprocessStreams.removeItemsAt(streamIndex);
6068a94683196406b83b14218d1beef66067f126a16keunyoung
6078a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
6088a94683196406b83b14218d1beef66067f126a16keunyoung}
6098a94683196406b83b14218d1beef66067f126a16keunyoung
6108a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::triggerAction(uint32_t trigger_id,
6118a94683196406b83b14218d1beef66067f126a16keunyoung        int32_t ext1,
6128a94683196406b83b14218d1beef66067f126a16keunyoung        int32_t ext2) {
6138a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mMutex);
6144dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
6154dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (trigger_id == CAMERA2_EXT_TRIGGER_TESTING_DISCONNECT) {
6164dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGI("%s: Disconnect trigger - camera must be closed", __FUNCTION__);
6174dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        mStatusPresent = false;
6184dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
6194dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        gEmulatedCameraFactory.onStatusChanged(
6204dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin                mCameraID,
6214dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin                CAMERA_DEVICE_STATUS_NOT_PRESENT);
6224dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
6234dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
6244dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    if (!mStatusPresent) {
6254dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGW("%s: Camera was physically disconnected", __FUNCTION__);
6264dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        return ERROR_CAMERA_NOT_PRESENT;
6274dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin    }
6284dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
6298a94683196406b83b14218d1beef66067f126a16keunyoung    return mControlThread->triggerAction(trigger_id,
6308a94683196406b83b14218d1beef66067f126a16keunyoung            ext1, ext2);
6318a94683196406b83b14218d1beef66067f126a16keunyoung}
6328a94683196406b83b14218d1beef66067f126a16keunyoung
6338a94683196406b83b14218d1beef66067f126a16keunyoung/** Shutdown and debug methods */
6348a94683196406b83b14218d1beef66067f126a16keunyoung
6358a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::dump(int fd) {
6368a94683196406b83b14218d1beef66067f126a16keunyoung    String8 result;
6378a94683196406b83b14218d1beef66067f126a16keunyoung
6388a94683196406b83b14218d1beef66067f126a16keunyoung    result.appendFormat("    Camera HAL device: EmulatedFakeCamera2\n");
6398a94683196406b83b14218d1beef66067f126a16keunyoung    result.appendFormat("      Streams:\n");
6408a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < mStreams.size(); i++) {
6418a94683196406b83b14218d1beef66067f126a16keunyoung        int id = mStreams.keyAt(i);
6428a94683196406b83b14218d1beef66067f126a16keunyoung        const Stream& s = mStreams.valueAt(i);
6438a94683196406b83b14218d1beef66067f126a16keunyoung        result.appendFormat(
6448a94683196406b83b14218d1beef66067f126a16keunyoung            "         Stream %d: %d x %d, format 0x%x, stride %d\n",
6458a94683196406b83b14218d1beef66067f126a16keunyoung            id, s.width, s.height, s.format, s.stride);
6468a94683196406b83b14218d1beef66067f126a16keunyoung    }
6478a94683196406b83b14218d1beef66067f126a16keunyoung
6488a94683196406b83b14218d1beef66067f126a16keunyoung    write(fd, result.string(), result.size());
6498a94683196406b83b14218d1beef66067f126a16keunyoung
6508a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
6518a94683196406b83b14218d1beef66067f126a16keunyoung}
6528a94683196406b83b14218d1beef66067f126a16keunyoung
6538a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::signalError() {
6548a94683196406b83b14218d1beef66067f126a16keunyoung    // TODO: Let parent know so we can shut down cleanly
6558a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGE("Worker thread is signaling a serious error");
6568a94683196406b83b14218d1beef66067f126a16keunyoung}
6578a94683196406b83b14218d1beef66067f126a16keunyoung
6588a94683196406b83b14218d1beef66067f126a16keunyoung/** Pipeline control worker thread methods */
6598a94683196406b83b14218d1beef66067f126a16keunyoung
6608a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ConfigureThread::ConfigureThread(EmulatedFakeCamera2 *parent):
6618a94683196406b83b14218d1beef66067f126a16keunyoung        Thread(false),
6628a94683196406b83b14218d1beef66067f126a16keunyoung        mParent(parent),
6638a94683196406b83b14218d1beef66067f126a16keunyoung        mRequestCount(0),
6648a94683196406b83b14218d1beef66067f126a16keunyoung        mNextBuffers(NULL) {
6658a94683196406b83b14218d1beef66067f126a16keunyoung    mRunning = false;
6668a94683196406b83b14218d1beef66067f126a16keunyoung}
6678a94683196406b83b14218d1beef66067f126a16keunyoung
6688a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ConfigureThread::~ConfigureThread() {
6698a94683196406b83b14218d1beef66067f126a16keunyoung}
6708a94683196406b83b14218d1beef66067f126a16keunyoung
6718a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ConfigureThread::readyToRun() {
6728a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
6738a94683196406b83b14218d1beef66067f126a16keunyoung
6748a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Starting up ConfigureThread");
6758a94683196406b83b14218d1beef66067f126a16keunyoung    mRequest = NULL;
6768a94683196406b83b14218d1beef66067f126a16keunyoung    mActive  = false;
6778a94683196406b83b14218d1beef66067f126a16keunyoung    mRunning = true;
6788a94683196406b83b14218d1beef66067f126a16keunyoung
6798a94683196406b83b14218d1beef66067f126a16keunyoung    mInputSignal.signal();
6808a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
6818a94683196406b83b14218d1beef66067f126a16keunyoung}
6828a94683196406b83b14218d1beef66067f126a16keunyoung
6838a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ConfigureThread::waitUntilRunning() {
6848a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
6858a94683196406b83b14218d1beef66067f126a16keunyoung    if (!mRunning) {
6868a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Waiting for configure thread to start");
6878a94683196406b83b14218d1beef66067f126a16keunyoung        mInputSignal.wait(mInputMutex);
6888a94683196406b83b14218d1beef66067f126a16keunyoung    }
6898a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
6908a94683196406b83b14218d1beef66067f126a16keunyoung}
6918a94683196406b83b14218d1beef66067f126a16keunyoung
6928a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ConfigureThread::newRequestAvailable() {
6938a94683196406b83b14218d1beef66067f126a16keunyoung    waitUntilRunning();
6948a94683196406b83b14218d1beef66067f126a16keunyoung
6958a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
6968a94683196406b83b14218d1beef66067f126a16keunyoung
6978a94683196406b83b14218d1beef66067f126a16keunyoung    mActive = true;
6988a94683196406b83b14218d1beef66067f126a16keunyoung    mInputSignal.signal();
6998a94683196406b83b14218d1beef66067f126a16keunyoung
7008a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
7018a94683196406b83b14218d1beef66067f126a16keunyoung}
7028a94683196406b83b14218d1beef66067f126a16keunyoung
7038a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::isStreamInUse(uint32_t id) {
7048a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInternalsMutex);
7058a94683196406b83b14218d1beef66067f126a16keunyoung
7068a94683196406b83b14218d1beef66067f126a16keunyoung    if (mNextBuffers == NULL) return false;
7078a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i=0; i < mNextBuffers->size(); i++) {
7088a94683196406b83b14218d1beef66067f126a16keunyoung        if ((*mNextBuffers)[i].streamId == (int)id) return true;
7098a94683196406b83b14218d1beef66067f126a16keunyoung    }
7108a94683196406b83b14218d1beef66067f126a16keunyoung    return false;
7118a94683196406b83b14218d1beef66067f126a16keunyoung}
7128a94683196406b83b14218d1beef66067f126a16keunyoung
7138a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ConfigureThread::getInProgressCount() {
7148a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
7158a94683196406b83b14218d1beef66067f126a16keunyoung    return mRequestCount;
7168a94683196406b83b14218d1beef66067f126a16keunyoung}
7178a94683196406b83b14218d1beef66067f126a16keunyoung
7188a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::threadLoop() {
7198a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
7208a94683196406b83b14218d1beef66067f126a16keunyoung
7218a94683196406b83b14218d1beef66067f126a16keunyoung    // Check if we're currently processing or just waiting
7228a94683196406b83b14218d1beef66067f126a16keunyoung    {
7238a94683196406b83b14218d1beef66067f126a16keunyoung        Mutex::Autolock lock(mInputMutex);
7248a94683196406b83b14218d1beef66067f126a16keunyoung        if (!mActive) {
7258a94683196406b83b14218d1beef66067f126a16keunyoung            // Inactive, keep waiting until we've been signaled
7268a94683196406b83b14218d1beef66067f126a16keunyoung            status_t res;
7278a94683196406b83b14218d1beef66067f126a16keunyoung            res = mInputSignal.waitRelative(mInputMutex, kWaitPerLoop);
7288a94683196406b83b14218d1beef66067f126a16keunyoung            if (res != NO_ERROR && res != TIMED_OUT) {
7298a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Error waiting for input requests: %d",
7308a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, res);
7318a94683196406b83b14218d1beef66067f126a16keunyoung                return false;
7328a94683196406b83b14218d1beef66067f126a16keunyoung            }
7338a94683196406b83b14218d1beef66067f126a16keunyoung            if (!mActive) return true;
7348a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGV("New request available");
7358a94683196406b83b14218d1beef66067f126a16keunyoung        }
7368a94683196406b83b14218d1beef66067f126a16keunyoung        // Active
7378a94683196406b83b14218d1beef66067f126a16keunyoung    }
7384dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin
7398a94683196406b83b14218d1beef66067f126a16keunyoung    if (mRequest == NULL) {
7408a94683196406b83b14218d1beef66067f126a16keunyoung        Mutex::Autolock il(mInternalsMutex);
7418a94683196406b83b14218d1beef66067f126a16keunyoung
7428a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Configure: Getting next request");
7438a94683196406b83b14218d1beef66067f126a16keunyoung        res = mParent->mRequestQueueSrc->dequeue_request(
7448a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->mRequestQueueSrc,
7458a94683196406b83b14218d1beef66067f126a16keunyoung            &mRequest);
7468a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != NO_ERROR) {
7478a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Error dequeuing next request: %d", __FUNCTION__, res);
7488a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
7498a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
7508a94683196406b83b14218d1beef66067f126a16keunyoung        }
7518a94683196406b83b14218d1beef66067f126a16keunyoung        if (mRequest == NULL) {
7528a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGV("Configure: Request queue empty, going inactive");
7538a94683196406b83b14218d1beef66067f126a16keunyoung            // No requests available, go into inactive mode
7548a94683196406b83b14218d1beef66067f126a16keunyoung            Mutex::Autolock lock(mInputMutex);
7558a94683196406b83b14218d1beef66067f126a16keunyoung            mActive = false;
7568a94683196406b83b14218d1beef66067f126a16keunyoung            return true;
7578a94683196406b83b14218d1beef66067f126a16keunyoung        } else {
7588a94683196406b83b14218d1beef66067f126a16keunyoung            Mutex::Autolock lock(mInputMutex);
7598a94683196406b83b14218d1beef66067f126a16keunyoung            mRequestCount++;
7608a94683196406b83b14218d1beef66067f126a16keunyoung        }
7618a94683196406b83b14218d1beef66067f126a16keunyoung
7628a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_entry_t type;
7638a94683196406b83b14218d1beef66067f126a16keunyoung        res = find_camera_metadata_entry(mRequest,
7648a94683196406b83b14218d1beef66067f126a16keunyoung                ANDROID_REQUEST_TYPE,
7658a94683196406b83b14218d1beef66067f126a16keunyoung                &type);
7668a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != NO_ERROR) {
7678a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: error reading request type", __FUNCTION__);
7688a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
7698a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
7708a94683196406b83b14218d1beef66067f126a16keunyoung        }
7718a94683196406b83b14218d1beef66067f126a16keunyoung        bool success = false;;
7728a94683196406b83b14218d1beef66067f126a16keunyoung        switch (type.data.u8[0]) {
7738a94683196406b83b14218d1beef66067f126a16keunyoung            case ANDROID_REQUEST_TYPE_CAPTURE:
7748a94683196406b83b14218d1beef66067f126a16keunyoung                success = setupCapture();
7758a94683196406b83b14218d1beef66067f126a16keunyoung                break;
7768a94683196406b83b14218d1beef66067f126a16keunyoung            case ANDROID_REQUEST_TYPE_REPROCESS:
7778a94683196406b83b14218d1beef66067f126a16keunyoung                success = setupReprocess();
7788a94683196406b83b14218d1beef66067f126a16keunyoung                break;
7798a94683196406b83b14218d1beef66067f126a16keunyoung            default:
7808a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Unexpected request type %d",
7818a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, type.data.u8[0]);
7828a94683196406b83b14218d1beef66067f126a16keunyoung                mParent->signalError();
7838a94683196406b83b14218d1beef66067f126a16keunyoung                break;
7848a94683196406b83b14218d1beef66067f126a16keunyoung        }
7858a94683196406b83b14218d1beef66067f126a16keunyoung        if (!success) return false;
7868a94683196406b83b14218d1beef66067f126a16keunyoung
7878a94683196406b83b14218d1beef66067f126a16keunyoung    }
7888a94683196406b83b14218d1beef66067f126a16keunyoung
7898a94683196406b83b14218d1beef66067f126a16keunyoung    if (mWaitingForReadout) {
7908a94683196406b83b14218d1beef66067f126a16keunyoung        bool readoutDone;
7918a94683196406b83b14218d1beef66067f126a16keunyoung        readoutDone = mParent->mReadoutThread->waitForReady(kWaitPerLoop);
7928a94683196406b83b14218d1beef66067f126a16keunyoung        if (!readoutDone) return true;
7938a94683196406b83b14218d1beef66067f126a16keunyoung
7948a94683196406b83b14218d1beef66067f126a16keunyoung        if (mNextNeedsJpeg) {
7958a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGV("Configure: Waiting for JPEG compressor");
7968a94683196406b83b14218d1beef66067f126a16keunyoung        } else {
7978a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGV("Configure: Waiting for sensor");
7988a94683196406b83b14218d1beef66067f126a16keunyoung        }
7998a94683196406b83b14218d1beef66067f126a16keunyoung        mWaitingForReadout = false;
8008a94683196406b83b14218d1beef66067f126a16keunyoung    }
8018a94683196406b83b14218d1beef66067f126a16keunyoung
8028a94683196406b83b14218d1beef66067f126a16keunyoung    if (mNextNeedsJpeg) {
8038a94683196406b83b14218d1beef66067f126a16keunyoung        bool jpegDone;
8048a94683196406b83b14218d1beef66067f126a16keunyoung        jpegDone = mParent->mJpegCompressor->waitForDone(kWaitPerLoop);
8058a94683196406b83b14218d1beef66067f126a16keunyoung        if (!jpegDone) return true;
8068a94683196406b83b14218d1beef66067f126a16keunyoung
8078a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Configure: Waiting for sensor");
8088a94683196406b83b14218d1beef66067f126a16keunyoung        mNextNeedsJpeg = false;
8098a94683196406b83b14218d1beef66067f126a16keunyoung    }
8108a94683196406b83b14218d1beef66067f126a16keunyoung
8118a94683196406b83b14218d1beef66067f126a16keunyoung    if (mNextIsCapture) {
8128a94683196406b83b14218d1beef66067f126a16keunyoung        return configureNextCapture();
8138a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
8148a94683196406b83b14218d1beef66067f126a16keunyoung        return configureNextReprocess();
8158a94683196406b83b14218d1beef66067f126a16keunyoung    }
8168a94683196406b83b14218d1beef66067f126a16keunyoung}
8178a94683196406b83b14218d1beef66067f126a16keunyoung
8188a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::setupCapture() {
8198a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
8208a94683196406b83b14218d1beef66067f126a16keunyoung
8218a94683196406b83b14218d1beef66067f126a16keunyoung    mNextIsCapture = true;
8228a94683196406b83b14218d1beef66067f126a16keunyoung    // Get necessary parameters for sensor config
8238a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mControlThread->processRequest(mRequest);
8248a94683196406b83b14218d1beef66067f126a16keunyoung
8258a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t streams;
8268a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
8278a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_OUTPUT_STREAMS,
8288a94683196406b83b14218d1beef66067f126a16keunyoung            &streams);
8298a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
8308a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading output stream tag", __FUNCTION__);
8318a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
8328a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
8338a94683196406b83b14218d1beef66067f126a16keunyoung    }
8348a94683196406b83b14218d1beef66067f126a16keunyoung
8358a94683196406b83b14218d1beef66067f126a16keunyoung    mNextBuffers = new Buffers;
8368a94683196406b83b14218d1beef66067f126a16keunyoung    mNextNeedsJpeg = false;
8378a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Setting up buffers for capture");
8388a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < streams.count; i++) {
839e8122dff1ef2de4d41835265a59d8960e7800faeZhijun He        int streamId = streams.data.i32[i];
8408a94683196406b83b14218d1beef66067f126a16keunyoung        const Stream &s = mParent->getStreamInfo(streamId);
8418a94683196406b83b14218d1beef66067f126a16keunyoung        if (s.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
8428a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Stream %d does not have a concrete pixel format, but "
8438a94683196406b83b14218d1beef66067f126a16keunyoung                    "is included in a request!", __FUNCTION__, streamId);
8448a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
8458a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
8468a94683196406b83b14218d1beef66067f126a16keunyoung        }
8478a94683196406b83b14218d1beef66067f126a16keunyoung        StreamBuffer b;
8488a94683196406b83b14218d1beef66067f126a16keunyoung        b.streamId = streams.data.u8[i];
8498a94683196406b83b14218d1beef66067f126a16keunyoung        b.width  = s.width;
8508a94683196406b83b14218d1beef66067f126a16keunyoung        b.height = s.height;
8518a94683196406b83b14218d1beef66067f126a16keunyoung        b.format = s.format;
8528a94683196406b83b14218d1beef66067f126a16keunyoung        b.stride = s.stride;
8538a94683196406b83b14218d1beef66067f126a16keunyoung        mNextBuffers->push_back(b);
8543725c7c982eac52ec64a625e82f306822452941cColin Cross        ALOGV("Configure:    Buffer %zu: Stream %d, %d x %d, format 0x%x, "
8558a94683196406b83b14218d1beef66067f126a16keunyoung                "stride %d",
8568a94683196406b83b14218d1beef66067f126a16keunyoung                i, b.streamId, b.width, b.height, b.format, b.stride);
8578a94683196406b83b14218d1beef66067f126a16keunyoung        if (b.format == HAL_PIXEL_FORMAT_BLOB) {
8588a94683196406b83b14218d1beef66067f126a16keunyoung            mNextNeedsJpeg = true;
8598a94683196406b83b14218d1beef66067f126a16keunyoung        }
8608a94683196406b83b14218d1beef66067f126a16keunyoung    }
8618a94683196406b83b14218d1beef66067f126a16keunyoung
8628a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t e;
8638a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
8648a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_FRAME_COUNT,
8658a94683196406b83b14218d1beef66067f126a16keunyoung            &e);
8668a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
8678a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading frame count tag: %s (%d)",
8688a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
8698a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
8708a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
8718a94683196406b83b14218d1beef66067f126a16keunyoung    }
8728a94683196406b83b14218d1beef66067f126a16keunyoung    mNextFrameNumber = *e.data.i32;
8738a94683196406b83b14218d1beef66067f126a16keunyoung
8748a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
8758a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_SENSOR_EXPOSURE_TIME,
8768a94683196406b83b14218d1beef66067f126a16keunyoung            &e);
8778a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
8788a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading exposure time tag: %s (%d)",
8798a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
8808a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
8818a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
8828a94683196406b83b14218d1beef66067f126a16keunyoung    }
8838a94683196406b83b14218d1beef66067f126a16keunyoung    mNextExposureTime = *e.data.i64;
8848a94683196406b83b14218d1beef66067f126a16keunyoung
8858a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
8868a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_SENSOR_FRAME_DURATION,
8878a94683196406b83b14218d1beef66067f126a16keunyoung            &e);
8888a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
8898a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading frame duration tag", __FUNCTION__);
8908a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
8918a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
8928a94683196406b83b14218d1beef66067f126a16keunyoung    }
8938a94683196406b83b14218d1beef66067f126a16keunyoung    mNextFrameDuration = *e.data.i64;
8948a94683196406b83b14218d1beef66067f126a16keunyoung
8958a94683196406b83b14218d1beef66067f126a16keunyoung    if (mNextFrameDuration <
8968a94683196406b83b14218d1beef66067f126a16keunyoung            mNextExposureTime + Sensor::kMinVerticalBlank) {
8978a94683196406b83b14218d1beef66067f126a16keunyoung        mNextFrameDuration = mNextExposureTime + Sensor::kMinVerticalBlank;
8988a94683196406b83b14218d1beef66067f126a16keunyoung    }
8998a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
9008a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_SENSOR_SENSITIVITY,
9018a94683196406b83b14218d1beef66067f126a16keunyoung            &e);
9028a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
9038a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading sensitivity tag", __FUNCTION__);
9048a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
9058a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
9068a94683196406b83b14218d1beef66067f126a16keunyoung    }
9078a94683196406b83b14218d1beef66067f126a16keunyoung    mNextSensitivity = *e.data.i32;
9088a94683196406b83b14218d1beef66067f126a16keunyoung
9098a94683196406b83b14218d1beef66067f126a16keunyoung    // Start waiting on readout thread
9108a94683196406b83b14218d1beef66067f126a16keunyoung    mWaitingForReadout = true;
9118a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Waiting for readout thread");
9128a94683196406b83b14218d1beef66067f126a16keunyoung
9138a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
9148a94683196406b83b14218d1beef66067f126a16keunyoung}
9158a94683196406b83b14218d1beef66067f126a16keunyoung
9168a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::configureNextCapture() {
9178a94683196406b83b14218d1beef66067f126a16keunyoung    bool vsync = mParent->mSensor->waitForVSync(kWaitPerLoop);
9188a94683196406b83b14218d1beef66067f126a16keunyoung    if (!vsync) return true;
9198a94683196406b83b14218d1beef66067f126a16keunyoung
9208a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock il(mInternalsMutex);
9218a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Configuring sensor for capture %d", mNextFrameNumber);
9228a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mSensor->setExposureTime(mNextExposureTime);
9238a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mSensor->setFrameDuration(mNextFrameDuration);
9248a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mSensor->setSensitivity(mNextSensitivity);
9258a94683196406b83b14218d1beef66067f126a16keunyoung
9268a94683196406b83b14218d1beef66067f126a16keunyoung    getBuffers();
9278a94683196406b83b14218d1beef66067f126a16keunyoung
9288a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Done configure for capture %d", mNextFrameNumber);
9298a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mReadoutThread->setNextOperation(true, mRequest, mNextBuffers);
9308a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mSensor->setDestinationBuffers(mNextBuffers);
9318a94683196406b83b14218d1beef66067f126a16keunyoung
9328a94683196406b83b14218d1beef66067f126a16keunyoung    mRequest = NULL;
9338a94683196406b83b14218d1beef66067f126a16keunyoung    mNextBuffers = NULL;
9348a94683196406b83b14218d1beef66067f126a16keunyoung
9358a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
9368a94683196406b83b14218d1beef66067f126a16keunyoung    mRequestCount--;
9378a94683196406b83b14218d1beef66067f126a16keunyoung
9388a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
9398a94683196406b83b14218d1beef66067f126a16keunyoung}
9408a94683196406b83b14218d1beef66067f126a16keunyoung
9418a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::setupReprocess() {
9428a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
9438a94683196406b83b14218d1beef66067f126a16keunyoung
9448a94683196406b83b14218d1beef66067f126a16keunyoung    mNextNeedsJpeg = true;
9458a94683196406b83b14218d1beef66067f126a16keunyoung    mNextIsCapture = false;
9468a94683196406b83b14218d1beef66067f126a16keunyoung
9478a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t reprocessStreams;
9488a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
9498a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_INPUT_STREAMS,
9508a94683196406b83b14218d1beef66067f126a16keunyoung            &reprocessStreams);
9518a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
9528a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading output stream tag", __FUNCTION__);
9538a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
9548a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
9558a94683196406b83b14218d1beef66067f126a16keunyoung    }
9568a94683196406b83b14218d1beef66067f126a16keunyoung
9578a94683196406b83b14218d1beef66067f126a16keunyoung    mNextBuffers = new Buffers;
9588a94683196406b83b14218d1beef66067f126a16keunyoung
9598a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Setting up input buffers for reprocess");
9608a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < reprocessStreams.count; i++) {
961e8122dff1ef2de4d41835265a59d8960e7800faeZhijun He        int streamId = reprocessStreams.data.i32[i];
9628a94683196406b83b14218d1beef66067f126a16keunyoung        const ReprocessStream &s = mParent->getReprocessStreamInfo(streamId);
9638a94683196406b83b14218d1beef66067f126a16keunyoung        if (s.format != HAL_PIXEL_FORMAT_RGB_888) {
9648a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Only ZSL reprocessing supported!",
9658a94683196406b83b14218d1beef66067f126a16keunyoung                    __FUNCTION__);
9668a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
9678a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
9688a94683196406b83b14218d1beef66067f126a16keunyoung        }
9698a94683196406b83b14218d1beef66067f126a16keunyoung        StreamBuffer b;
9708a94683196406b83b14218d1beef66067f126a16keunyoung        b.streamId = -streamId;
9718a94683196406b83b14218d1beef66067f126a16keunyoung        b.width = s.width;
9728a94683196406b83b14218d1beef66067f126a16keunyoung        b.height = s.height;
9738a94683196406b83b14218d1beef66067f126a16keunyoung        b.format = s.format;
9748a94683196406b83b14218d1beef66067f126a16keunyoung        b.stride = s.stride;
9758a94683196406b83b14218d1beef66067f126a16keunyoung        mNextBuffers->push_back(b);
9768a94683196406b83b14218d1beef66067f126a16keunyoung    }
9778a94683196406b83b14218d1beef66067f126a16keunyoung
9788a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t streams;
9798a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
9808a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_OUTPUT_STREAMS,
9818a94683196406b83b14218d1beef66067f126a16keunyoung            &streams);
9828a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
9838a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading output stream tag", __FUNCTION__);
9848a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
9858a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
9868a94683196406b83b14218d1beef66067f126a16keunyoung    }
9878a94683196406b83b14218d1beef66067f126a16keunyoung
9888a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Setting up output buffers for reprocess");
9898a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < streams.count; i++) {
990e8122dff1ef2de4d41835265a59d8960e7800faeZhijun He        int streamId = streams.data.i32[i];
9918a94683196406b83b14218d1beef66067f126a16keunyoung        const Stream &s = mParent->getStreamInfo(streamId);
9928a94683196406b83b14218d1beef66067f126a16keunyoung        if (s.format != HAL_PIXEL_FORMAT_BLOB) {
9938a94683196406b83b14218d1beef66067f126a16keunyoung            // TODO: Support reprocess to YUV
9948a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Non-JPEG output stream %d for reprocess not supported",
9958a94683196406b83b14218d1beef66067f126a16keunyoung                    __FUNCTION__, streamId);
9968a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
9978a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
9988a94683196406b83b14218d1beef66067f126a16keunyoung        }
9998a94683196406b83b14218d1beef66067f126a16keunyoung        StreamBuffer b;
10008a94683196406b83b14218d1beef66067f126a16keunyoung        b.streamId = streams.data.u8[i];
10018a94683196406b83b14218d1beef66067f126a16keunyoung        b.width  = s.width;
10028a94683196406b83b14218d1beef66067f126a16keunyoung        b.height = s.height;
10038a94683196406b83b14218d1beef66067f126a16keunyoung        b.format = s.format;
10048a94683196406b83b14218d1beef66067f126a16keunyoung        b.stride = s.stride;
10058a94683196406b83b14218d1beef66067f126a16keunyoung        mNextBuffers->push_back(b);
10063725c7c982eac52ec64a625e82f306822452941cColin Cross        ALOGV("Configure:    Buffer %zu: Stream %d, %d x %d, format 0x%x, "
10078a94683196406b83b14218d1beef66067f126a16keunyoung                "stride %d",
10088a94683196406b83b14218d1beef66067f126a16keunyoung                i, b.streamId, b.width, b.height, b.format, b.stride);
10098a94683196406b83b14218d1beef66067f126a16keunyoung    }
10108a94683196406b83b14218d1beef66067f126a16keunyoung
10118a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t e;
10128a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
10138a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_FRAME_COUNT,
10148a94683196406b83b14218d1beef66067f126a16keunyoung            &e);
10158a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
10168a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading frame count tag: %s (%d)",
10178a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
10188a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
10198a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
10208a94683196406b83b14218d1beef66067f126a16keunyoung    }
10218a94683196406b83b14218d1beef66067f126a16keunyoung    mNextFrameNumber = *e.data.i32;
10228a94683196406b83b14218d1beef66067f126a16keunyoung
10238a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
10248a94683196406b83b14218d1beef66067f126a16keunyoung}
10258a94683196406b83b14218d1beef66067f126a16keunyoung
10268a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::configureNextReprocess() {
10278a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock il(mInternalsMutex);
10288a94683196406b83b14218d1beef66067f126a16keunyoung
10298a94683196406b83b14218d1beef66067f126a16keunyoung    getBuffers();
10308a94683196406b83b14218d1beef66067f126a16keunyoung
10318a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Configure: Done configure for reprocess %d", mNextFrameNumber);
10328a94683196406b83b14218d1beef66067f126a16keunyoung    mParent->mReadoutThread->setNextOperation(false, mRequest, mNextBuffers);
10338a94683196406b83b14218d1beef66067f126a16keunyoung
10348a94683196406b83b14218d1beef66067f126a16keunyoung    mRequest = NULL;
10358a94683196406b83b14218d1beef66067f126a16keunyoung    mNextBuffers = NULL;
10368a94683196406b83b14218d1beef66067f126a16keunyoung
10378a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
10388a94683196406b83b14218d1beef66067f126a16keunyoung    mRequestCount--;
10398a94683196406b83b14218d1beef66067f126a16keunyoung
10408a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
10418a94683196406b83b14218d1beef66067f126a16keunyoung}
10428a94683196406b83b14218d1beef66067f126a16keunyoung
10438a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::getBuffers() {
10448a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
10458a94683196406b83b14218d1beef66067f126a16keunyoung    /** Get buffers to fill for this frame */
10468a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < mNextBuffers->size(); i++) {
10478a94683196406b83b14218d1beef66067f126a16keunyoung        StreamBuffer &b = mNextBuffers->editItemAt(i);
10488a94683196406b83b14218d1beef66067f126a16keunyoung
10498a94683196406b83b14218d1beef66067f126a16keunyoung        if (b.streamId > 0) {
10508a94683196406b83b14218d1beef66067f126a16keunyoung            Stream s = mParent->getStreamInfo(b.streamId);
10518a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGV("Configure: Dequeing buffer from stream %d", b.streamId);
10528a94683196406b83b14218d1beef66067f126a16keunyoung            res = s.ops->dequeue_buffer(s.ops, &(b.buffer) );
10538a94683196406b83b14218d1beef66067f126a16keunyoung            if (res != NO_ERROR || b.buffer == NULL) {
10548a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Unable to dequeue buffer from stream %d: %s (%d)",
10558a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, b.streamId, strerror(-res), res);
10568a94683196406b83b14218d1beef66067f126a16keunyoung                mParent->signalError();
10578a94683196406b83b14218d1beef66067f126a16keunyoung                return false;
10588a94683196406b83b14218d1beef66067f126a16keunyoung            }
10598a94683196406b83b14218d1beef66067f126a16keunyoung
10608a94683196406b83b14218d1beef66067f126a16keunyoung            /* Lock the buffer from the perspective of the graphics mapper */
10618a94683196406b83b14218d1beef66067f126a16keunyoung            const Rect rect(s.width, s.height);
10628a94683196406b83b14218d1beef66067f126a16keunyoung
10638a94683196406b83b14218d1beef66067f126a16keunyoung            res = GraphicBufferMapper::get().lock(*(b.buffer),
10648a94683196406b83b14218d1beef66067f126a16keunyoung                    GRALLOC_USAGE_HW_CAMERA_WRITE,
10658a94683196406b83b14218d1beef66067f126a16keunyoung                    rect, (void**)&(b.img) );
10668a94683196406b83b14218d1beef66067f126a16keunyoung
10678a94683196406b83b14218d1beef66067f126a16keunyoung            if (res != NO_ERROR) {
10688a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: grbuffer_mapper.lock failure: %s (%d)",
10698a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, strerror(-res), res);
10708a94683196406b83b14218d1beef66067f126a16keunyoung                s.ops->cancel_buffer(s.ops,
10718a94683196406b83b14218d1beef66067f126a16keunyoung                        b.buffer);
10728a94683196406b83b14218d1beef66067f126a16keunyoung                mParent->signalError();
10738a94683196406b83b14218d1beef66067f126a16keunyoung                return false;
10748a94683196406b83b14218d1beef66067f126a16keunyoung            }
10758a94683196406b83b14218d1beef66067f126a16keunyoung        } else {
10768a94683196406b83b14218d1beef66067f126a16keunyoung            ReprocessStream s = mParent->getReprocessStreamInfo(-b.streamId);
10778a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGV("Configure: Acquiring buffer from reprocess stream %d",
10788a94683196406b83b14218d1beef66067f126a16keunyoung                    -b.streamId);
10798a94683196406b83b14218d1beef66067f126a16keunyoung            res = s.ops->acquire_buffer(s.ops, &(b.buffer) );
10808a94683196406b83b14218d1beef66067f126a16keunyoung            if (res != NO_ERROR || b.buffer == NULL) {
10818a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Unable to acquire buffer from reprocess stream %d: "
10828a94683196406b83b14218d1beef66067f126a16keunyoung                        "%s (%d)", __FUNCTION__, -b.streamId,
10838a94683196406b83b14218d1beef66067f126a16keunyoung                        strerror(-res), res);
10848a94683196406b83b14218d1beef66067f126a16keunyoung                mParent->signalError();
10858a94683196406b83b14218d1beef66067f126a16keunyoung                return false;
10868a94683196406b83b14218d1beef66067f126a16keunyoung            }
10878a94683196406b83b14218d1beef66067f126a16keunyoung
10888a94683196406b83b14218d1beef66067f126a16keunyoung            /* Lock the buffer from the perspective of the graphics mapper */
10898a94683196406b83b14218d1beef66067f126a16keunyoung            const Rect rect(s.width, s.height);
10908a94683196406b83b14218d1beef66067f126a16keunyoung
10918a94683196406b83b14218d1beef66067f126a16keunyoung            res = GraphicBufferMapper::get().lock(*(b.buffer),
10928a94683196406b83b14218d1beef66067f126a16keunyoung                    GRALLOC_USAGE_HW_CAMERA_READ,
10938a94683196406b83b14218d1beef66067f126a16keunyoung                    rect, (void**)&(b.img) );
10948a94683196406b83b14218d1beef66067f126a16keunyoung            if (res != NO_ERROR) {
10958a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: grbuffer_mapper.lock failure: %s (%d)",
10968a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, strerror(-res), res);
10978a94683196406b83b14218d1beef66067f126a16keunyoung                s.ops->release_buffer(s.ops,
10988a94683196406b83b14218d1beef66067f126a16keunyoung                        b.buffer);
10998a94683196406b83b14218d1beef66067f126a16keunyoung                mParent->signalError();
11008a94683196406b83b14218d1beef66067f126a16keunyoung                return false;
11018a94683196406b83b14218d1beef66067f126a16keunyoung            }
11028a94683196406b83b14218d1beef66067f126a16keunyoung        }
11038a94683196406b83b14218d1beef66067f126a16keunyoung    }
11048a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
11058a94683196406b83b14218d1beef66067f126a16keunyoung}
11068a94683196406b83b14218d1beef66067f126a16keunyoung
11078a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ReadoutThread::ReadoutThread(EmulatedFakeCamera2 *parent):
11088a94683196406b83b14218d1beef66067f126a16keunyoung        Thread(false),
11098a94683196406b83b14218d1beef66067f126a16keunyoung        mParent(parent),
11108a94683196406b83b14218d1beef66067f126a16keunyoung        mRunning(false),
11118a94683196406b83b14218d1beef66067f126a16keunyoung        mActive(false),
11128a94683196406b83b14218d1beef66067f126a16keunyoung        mRequestCount(0),
11138a94683196406b83b14218d1beef66067f126a16keunyoung        mRequest(NULL),
11148a94683196406b83b14218d1beef66067f126a16keunyoung        mBuffers(NULL) {
11158a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightQueue = new InFlightQueue[kInFlightQueueSize];
11168a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightHead = 0;
11178a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightTail = 0;
11188a94683196406b83b14218d1beef66067f126a16keunyoung}
11198a94683196406b83b14218d1beef66067f126a16keunyoung
11208a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ReadoutThread::~ReadoutThread() {
11212cbbe5ffb511337b815f83aa8d3e6a29907cd4deAdam Buchbinder    delete[] mInFlightQueue;
11228a94683196406b83b14218d1beef66067f126a16keunyoung}
11238a94683196406b83b14218d1beef66067f126a16keunyoung
11248a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ReadoutThread::readyToRun() {
11258a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
11268a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Starting up ReadoutThread");
11278a94683196406b83b14218d1beef66067f126a16keunyoung    mRunning = true;
11288a94683196406b83b14218d1beef66067f126a16keunyoung    mInputSignal.signal();
11298a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
11308a94683196406b83b14218d1beef66067f126a16keunyoung}
11318a94683196406b83b14218d1beef66067f126a16keunyoung
11328a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ReadoutThread::waitUntilRunning() {
11338a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
11348a94683196406b83b14218d1beef66067f126a16keunyoung    if (!mRunning) {
11358a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Waiting for readout thread to start");
11368a94683196406b83b14218d1beef66067f126a16keunyoung        mInputSignal.wait(mInputMutex);
11378a94683196406b83b14218d1beef66067f126a16keunyoung    }
11388a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
11398a94683196406b83b14218d1beef66067f126a16keunyoung}
11408a94683196406b83b14218d1beef66067f126a16keunyoung
11418a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::waitForReady(nsecs_t timeout) {
11428a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
11438a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
11448a94683196406b83b14218d1beef66067f126a16keunyoung    while (!readyForNextCapture()) {
11458a94683196406b83b14218d1beef66067f126a16keunyoung        res = mReadySignal.waitRelative(mInputMutex, timeout);
11468a94683196406b83b14218d1beef66067f126a16keunyoung        if (res == TIMED_OUT) return false;
11478a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != OK) {
11488a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Error waiting for ready: %s (%d)", __FUNCTION__,
11498a94683196406b83b14218d1beef66067f126a16keunyoung                    strerror(-res), res);
11508a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
11518a94683196406b83b14218d1beef66067f126a16keunyoung        }
11528a94683196406b83b14218d1beef66067f126a16keunyoung    }
11538a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
11548a94683196406b83b14218d1beef66067f126a16keunyoung}
11558a94683196406b83b14218d1beef66067f126a16keunyoung
11568a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::readyForNextCapture() {
11578a94683196406b83b14218d1beef66067f126a16keunyoung    return (mInFlightTail + 1) % kInFlightQueueSize != mInFlightHead;
11588a94683196406b83b14218d1beef66067f126a16keunyoung}
11598a94683196406b83b14218d1beef66067f126a16keunyoung
11608a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::ReadoutThread::setNextOperation(
11618a94683196406b83b14218d1beef66067f126a16keunyoung        bool isCapture,
11628a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_t *request,
11638a94683196406b83b14218d1beef66067f126a16keunyoung        Buffers *buffers) {
11648a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
11658a94683196406b83b14218d1beef66067f126a16keunyoung    if ( !readyForNextCapture() ) {
11668a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("In flight queue full, dropping captures");
11678a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
11688a94683196406b83b14218d1beef66067f126a16keunyoung        return;
11698a94683196406b83b14218d1beef66067f126a16keunyoung    }
11708a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightQueue[mInFlightTail].isCapture = isCapture;
11718a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightQueue[mInFlightTail].request = request;
11728a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightQueue[mInFlightTail].buffers = buffers;
11738a94683196406b83b14218d1beef66067f126a16keunyoung    mInFlightTail = (mInFlightTail + 1) % kInFlightQueueSize;
11748a94683196406b83b14218d1beef66067f126a16keunyoung    mRequestCount++;
11758a94683196406b83b14218d1beef66067f126a16keunyoung
11768a94683196406b83b14218d1beef66067f126a16keunyoung    if (!mActive) {
11778a94683196406b83b14218d1beef66067f126a16keunyoung        mActive = true;
11788a94683196406b83b14218d1beef66067f126a16keunyoung        mInputSignal.signal();
11798a94683196406b83b14218d1beef66067f126a16keunyoung    }
11808a94683196406b83b14218d1beef66067f126a16keunyoung}
11818a94683196406b83b14218d1beef66067f126a16keunyoung
11828a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
11838a94683196406b83b14218d1beef66067f126a16keunyoung    // acquire in same order as threadLoop
11848a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock iLock(mInternalsMutex);
11858a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
11868a94683196406b83b14218d1beef66067f126a16keunyoung
11878a94683196406b83b14218d1beef66067f126a16keunyoung    size_t i = mInFlightHead;
11888a94683196406b83b14218d1beef66067f126a16keunyoung    while (i != mInFlightTail) {
11898a94683196406b83b14218d1beef66067f126a16keunyoung        for (size_t j = 0; j < mInFlightQueue[i].buffers->size(); j++) {
11908a94683196406b83b14218d1beef66067f126a16keunyoung            if ( (*(mInFlightQueue[i].buffers))[j].streamId == (int)id )
11918a94683196406b83b14218d1beef66067f126a16keunyoung                return true;
11928a94683196406b83b14218d1beef66067f126a16keunyoung        }
11938a94683196406b83b14218d1beef66067f126a16keunyoung        i = (i + 1) % kInFlightQueueSize;
11948a94683196406b83b14218d1beef66067f126a16keunyoung    }
11958a94683196406b83b14218d1beef66067f126a16keunyoung
11968a94683196406b83b14218d1beef66067f126a16keunyoung
11978a94683196406b83b14218d1beef66067f126a16keunyoung    if (mBuffers != NULL) {
11988a94683196406b83b14218d1beef66067f126a16keunyoung        for (i = 0; i < mBuffers->size(); i++) {
11998a94683196406b83b14218d1beef66067f126a16keunyoung            if ( (*mBuffers)[i].streamId == (int)id) return true;
12008a94683196406b83b14218d1beef66067f126a16keunyoung        }
12018a94683196406b83b14218d1beef66067f126a16keunyoung    }
12028a94683196406b83b14218d1beef66067f126a16keunyoung
12038a94683196406b83b14218d1beef66067f126a16keunyoung    return false;
12048a94683196406b83b14218d1beef66067f126a16keunyoung}
12058a94683196406b83b14218d1beef66067f126a16keunyoung
12068a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ReadoutThread::getInProgressCount() {
12078a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
12088a94683196406b83b14218d1beef66067f126a16keunyoung
12098a94683196406b83b14218d1beef66067f126a16keunyoung    return mRequestCount;
12108a94683196406b83b14218d1beef66067f126a16keunyoung}
12118a94683196406b83b14218d1beef66067f126a16keunyoung
12128a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::threadLoop() {
12138a94683196406b83b14218d1beef66067f126a16keunyoung    static const nsecs_t kWaitPerLoop = 10000000L; // 10 ms
12148a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
12158a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t frameNumber;
12168a94683196406b83b14218d1beef66067f126a16keunyoung
12178a94683196406b83b14218d1beef66067f126a16keunyoung    // Check if we're currently processing or just waiting
12188a94683196406b83b14218d1beef66067f126a16keunyoung    {
12198a94683196406b83b14218d1beef66067f126a16keunyoung        Mutex::Autolock lock(mInputMutex);
12208a94683196406b83b14218d1beef66067f126a16keunyoung        if (!mActive) {
12218a94683196406b83b14218d1beef66067f126a16keunyoung            // Inactive, keep waiting until we've been signaled
12228a94683196406b83b14218d1beef66067f126a16keunyoung            res = mInputSignal.waitRelative(mInputMutex, kWaitPerLoop);
12238a94683196406b83b14218d1beef66067f126a16keunyoung            if (res != NO_ERROR && res != TIMED_OUT) {
12248a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("%s: Error waiting for capture requests: %d",
12258a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, res);
12268a94683196406b83b14218d1beef66067f126a16keunyoung                mParent->signalError();
12278a94683196406b83b14218d1beef66067f126a16keunyoung                return false;
12288a94683196406b83b14218d1beef66067f126a16keunyoung            }
12298a94683196406b83b14218d1beef66067f126a16keunyoung            if (!mActive) return true;
12308a94683196406b83b14218d1beef66067f126a16keunyoung        }
12318a94683196406b83b14218d1beef66067f126a16keunyoung        // Active, see if we need a new request
12328a94683196406b83b14218d1beef66067f126a16keunyoung        if (mRequest == NULL) {
12338a94683196406b83b14218d1beef66067f126a16keunyoung            if (mInFlightHead == mInFlightTail) {
12348a94683196406b83b14218d1beef66067f126a16keunyoung                // Go inactive
12358a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGV("Waiting for sensor data");
12368a94683196406b83b14218d1beef66067f126a16keunyoung                mActive = false;
12378a94683196406b83b14218d1beef66067f126a16keunyoung                return true;
12388a94683196406b83b14218d1beef66067f126a16keunyoung            } else {
12398a94683196406b83b14218d1beef66067f126a16keunyoung                Mutex::Autolock iLock(mInternalsMutex);
12408a94683196406b83b14218d1beef66067f126a16keunyoung                mReadySignal.signal();
12418a94683196406b83b14218d1beef66067f126a16keunyoung                mIsCapture = mInFlightQueue[mInFlightHead].isCapture;
12428a94683196406b83b14218d1beef66067f126a16keunyoung                mRequest = mInFlightQueue[mInFlightHead].request;
12438a94683196406b83b14218d1beef66067f126a16keunyoung                mBuffers  = mInFlightQueue[mInFlightHead].buffers;
12448a94683196406b83b14218d1beef66067f126a16keunyoung                mInFlightQueue[mInFlightHead].request = NULL;
12458a94683196406b83b14218d1beef66067f126a16keunyoung                mInFlightQueue[mInFlightHead].buffers = NULL;
12468a94683196406b83b14218d1beef66067f126a16keunyoung                mInFlightHead = (mInFlightHead + 1) % kInFlightQueueSize;
12473725c7c982eac52ec64a625e82f306822452941cColin Cross                ALOGV("Ready to read out request %p, %zu buffers",
12488a94683196406b83b14218d1beef66067f126a16keunyoung                        mRequest, mBuffers->size());
12498a94683196406b83b14218d1beef66067f126a16keunyoung            }
12508a94683196406b83b14218d1beef66067f126a16keunyoung        }
12518a94683196406b83b14218d1beef66067f126a16keunyoung    }
12528a94683196406b83b14218d1beef66067f126a16keunyoung
12538a94683196406b83b14218d1beef66067f126a16keunyoung    // Active with request, wait on sensor to complete
12548a94683196406b83b14218d1beef66067f126a16keunyoung
12558a94683196406b83b14218d1beef66067f126a16keunyoung    nsecs_t captureTime;
12568a94683196406b83b14218d1beef66067f126a16keunyoung
12578a94683196406b83b14218d1beef66067f126a16keunyoung    if (mIsCapture) {
12588a94683196406b83b14218d1beef66067f126a16keunyoung        bool gotFrame;
12598a94683196406b83b14218d1beef66067f126a16keunyoung        gotFrame = mParent->mSensor->waitForNewFrame(kWaitPerLoop,
12608a94683196406b83b14218d1beef66067f126a16keunyoung                &captureTime);
12618a94683196406b83b14218d1beef66067f126a16keunyoung
12628a94683196406b83b14218d1beef66067f126a16keunyoung        if (!gotFrame) return true;
12638a94683196406b83b14218d1beef66067f126a16keunyoung    }
12648a94683196406b83b14218d1beef66067f126a16keunyoung
12658a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock iLock(mInternalsMutex);
12668a94683196406b83b14218d1beef66067f126a16keunyoung
12678a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t entry;
12688a94683196406b83b14218d1beef66067f126a16keunyoung    if (!mIsCapture) {
12698a94683196406b83b14218d1beef66067f126a16keunyoung        res = find_camera_metadata_entry(mRequest,
12708a94683196406b83b14218d1beef66067f126a16keunyoung                ANDROID_SENSOR_TIMESTAMP,
12718a94683196406b83b14218d1beef66067f126a16keunyoung            &entry);
12728a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != NO_ERROR) {
12738a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: error reading reprocessing timestamp: %s (%d)",
12748a94683196406b83b14218d1beef66067f126a16keunyoung                    __FUNCTION__, strerror(-res), res);
12758a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
12768a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
12778a94683196406b83b14218d1beef66067f126a16keunyoung        }
12788a94683196406b83b14218d1beef66067f126a16keunyoung        captureTime = entry.data.i64[0];
12798a94683196406b83b14218d1beef66067f126a16keunyoung    }
12808a94683196406b83b14218d1beef66067f126a16keunyoung
12818a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
12828a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_FRAME_COUNT,
12838a94683196406b83b14218d1beef66067f126a16keunyoung            &entry);
12848a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
12858a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading frame count tag: %s (%d)",
12868a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
12878a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
12888a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
12898a94683196406b83b14218d1beef66067f126a16keunyoung    }
12908a94683196406b83b14218d1beef66067f126a16keunyoung    frameNumber = *entry.data.i32;
12918a94683196406b83b14218d1beef66067f126a16keunyoung
12928a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(mRequest,
12938a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_REQUEST_METADATA_MODE,
12948a94683196406b83b14218d1beef66067f126a16keunyoung            &entry);
12958a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
12968a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: error reading metadata mode tag: %s (%d)",
12978a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, strerror(-res), res);
12988a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
12998a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
13008a94683196406b83b14218d1beef66067f126a16keunyoung    }
13018a94683196406b83b14218d1beef66067f126a16keunyoung
13028a94683196406b83b14218d1beef66067f126a16keunyoung    // Got sensor data and request, construct frame and send it out
13038a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Readout: Constructing metadata and frames for request %d",
13048a94683196406b83b14218d1beef66067f126a16keunyoung            frameNumber);
13058a94683196406b83b14218d1beef66067f126a16keunyoung
13068a94683196406b83b14218d1beef66067f126a16keunyoung    if (*entry.data.u8 == ANDROID_REQUEST_METADATA_MODE_FULL) {
13078a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Readout: Metadata requested, constructing");
13088a94683196406b83b14218d1beef66067f126a16keunyoung
13098a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_t *frame = NULL;
13108a94683196406b83b14218d1beef66067f126a16keunyoung
13118a94683196406b83b14218d1beef66067f126a16keunyoung        size_t frame_entries = get_camera_metadata_entry_count(mRequest);
13128a94683196406b83b14218d1beef66067f126a16keunyoung        size_t frame_data    = get_camera_metadata_data_count(mRequest);
13138a94683196406b83b14218d1beef66067f126a16keunyoung
13148a94683196406b83b14218d1beef66067f126a16keunyoung        // TODO: Dynamically calculate based on enabled statistics, etc
13158a94683196406b83b14218d1beef66067f126a16keunyoung        frame_entries += 10;
13168a94683196406b83b14218d1beef66067f126a16keunyoung        frame_data += 100;
13178a94683196406b83b14218d1beef66067f126a16keunyoung
13188a94683196406b83b14218d1beef66067f126a16keunyoung        res = mParent->mFrameQueueDst->dequeue_frame(mParent->mFrameQueueDst,
13198a94683196406b83b14218d1beef66067f126a16keunyoung                frame_entries, frame_data, &frame);
13208a94683196406b83b14218d1beef66067f126a16keunyoung
13218a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != NO_ERROR || frame == NULL) {
13228a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Unable to dequeue frame metadata buffer", __FUNCTION__);
13238a94683196406b83b14218d1beef66067f126a16keunyoung            mParent->signalError();
13248a94683196406b83b14218d1beef66067f126a16keunyoung            return false;
13258a94683196406b83b14218d1beef66067f126a16keunyoung        }
13268a94683196406b83b14218d1beef66067f126a16keunyoung
13278a94683196406b83b14218d1beef66067f126a16keunyoung        res = append_camera_metadata(frame, mRequest);
13288a94683196406b83b14218d1beef66067f126a16keunyoung        if (res != NO_ERROR) {
13298a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("Unable to append request metadata");
13308a94683196406b83b14218d1beef66067f126a16keunyoung        }
13318a94683196406b83b14218d1beef66067f126a16keunyoung
13328a94683196406b83b14218d1beef66067f126a16keunyoung        if (mIsCapture) {
13338a94683196406b83b14218d1beef66067f126a16keunyoung            add_camera_metadata_entry(frame,
13348a94683196406b83b14218d1beef66067f126a16keunyoung                    ANDROID_SENSOR_TIMESTAMP,
13358a94683196406b83b14218d1beef66067f126a16keunyoung                    &captureTime,
13368a94683196406b83b14218d1beef66067f126a16keunyoung                    1);
13378a94683196406b83b14218d1beef66067f126a16keunyoung
13388a94683196406b83b14218d1beef66067f126a16keunyoung            collectStatisticsMetadata(frame);
13398a94683196406b83b14218d1beef66067f126a16keunyoung            // TODO: Collect all final values used from sensor in addition to timestamp
13408a94683196406b83b14218d1beef66067f126a16keunyoung        }
13418a94683196406b83b14218d1beef66067f126a16keunyoung
13428a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Readout: Enqueue frame %d", frameNumber);
13438a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->mFrameQueueDst->enqueue_frame(mParent->mFrameQueueDst,
13448a94683196406b83b14218d1beef66067f126a16keunyoung                frame);
13458a94683196406b83b14218d1beef66067f126a16keunyoung    }
13468a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Readout: Free request");
13478a94683196406b83b14218d1beef66067f126a16keunyoung    res = mParent->mRequestQueueSrc->free_request(mParent->mRequestQueueSrc, mRequest);
13488a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != NO_ERROR) {
13498a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to return request buffer to queue: %d",
13508a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, res);
13518a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->signalError();
13528a94683196406b83b14218d1beef66067f126a16keunyoung        return false;
13538a94683196406b83b14218d1beef66067f126a16keunyoung    }
13548a94683196406b83b14218d1beef66067f126a16keunyoung    mRequest = NULL;
13558a94683196406b83b14218d1beef66067f126a16keunyoung
13568a94683196406b83b14218d1beef66067f126a16keunyoung    int compressedBufferIndex = -1;
13573725c7c982eac52ec64a625e82f306822452941cColin Cross    ALOGV("Readout: Processing %zu buffers", mBuffers->size());
13588a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < mBuffers->size(); i++) {
13598a94683196406b83b14218d1beef66067f126a16keunyoung        const StreamBuffer &b = (*mBuffers)[i];
13603725c7c982eac52ec64a625e82f306822452941cColin Cross        ALOGV("Readout:    Buffer %zu: Stream %d, %d x %d, format 0x%x, stride %d",
13618a94683196406b83b14218d1beef66067f126a16keunyoung                i, b.streamId, b.width, b.height, b.format, b.stride);
13628a94683196406b83b14218d1beef66067f126a16keunyoung        if (b.streamId > 0) {
13638a94683196406b83b14218d1beef66067f126a16keunyoung            if (b.format == HAL_PIXEL_FORMAT_BLOB) {
13648a94683196406b83b14218d1beef66067f126a16keunyoung                // Assumes only one BLOB buffer type per capture
13658a94683196406b83b14218d1beef66067f126a16keunyoung                compressedBufferIndex = i;
13668a94683196406b83b14218d1beef66067f126a16keunyoung            } else {
13673725c7c982eac52ec64a625e82f306822452941cColin Cross                ALOGV("Readout:    Sending image buffer %zu (%p) to output stream %d",
13688a94683196406b83b14218d1beef66067f126a16keunyoung                        i, (void*)*(b.buffer), b.streamId);
13698a94683196406b83b14218d1beef66067f126a16keunyoung                GraphicBufferMapper::get().unlock(*(b.buffer));
13708a94683196406b83b14218d1beef66067f126a16keunyoung                const Stream &s = mParent->getStreamInfo(b.streamId);
13718a94683196406b83b14218d1beef66067f126a16keunyoung                res = s.ops->enqueue_buffer(s.ops, captureTime, b.buffer);
13728a94683196406b83b14218d1beef66067f126a16keunyoung                if (res != OK) {
13738a94683196406b83b14218d1beef66067f126a16keunyoung                    ALOGE("Error enqueuing image buffer %p: %s (%d)", b.buffer,
13748a94683196406b83b14218d1beef66067f126a16keunyoung                            strerror(-res), res);
13758a94683196406b83b14218d1beef66067f126a16keunyoung                    mParent->signalError();
13768a94683196406b83b14218d1beef66067f126a16keunyoung                }
13778a94683196406b83b14218d1beef66067f126a16keunyoung            }
13788a94683196406b83b14218d1beef66067f126a16keunyoung        }
13798a94683196406b83b14218d1beef66067f126a16keunyoung    }
13808a94683196406b83b14218d1beef66067f126a16keunyoung
13818a94683196406b83b14218d1beef66067f126a16keunyoung    if (compressedBufferIndex == -1) {
13828a94683196406b83b14218d1beef66067f126a16keunyoung        delete mBuffers;
13838a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
13848a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Readout:  Starting JPEG compression for buffer %d, stream %d",
13858a94683196406b83b14218d1beef66067f126a16keunyoung                compressedBufferIndex,
13868a94683196406b83b14218d1beef66067f126a16keunyoung                (*mBuffers)[compressedBufferIndex].streamId);
138757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        mJpegTimestamp = captureTime;
138857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        // Takes ownership of mBuffers
138957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        mParent->mJpegCompressor->start(mBuffers, this);
13908a94683196406b83b14218d1beef66067f126a16keunyoung    }
139157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    mBuffers = NULL;
13928a94683196406b83b14218d1beef66067f126a16keunyoung
13938a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock l(mInputMutex);
13948a94683196406b83b14218d1beef66067f126a16keunyoung    mRequestCount--;
13958a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Readout: Done with request %d", frameNumber);
13968a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
13978a94683196406b83b14218d1beef66067f126a16keunyoung}
13988a94683196406b83b14218d1beef66067f126a16keunyoung
139957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvalavoid EmulatedFakeCamera2::ReadoutThread::onJpegDone(
140057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        const StreamBuffer &jpegBuffer, bool success) {
140157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    status_t res;
140257ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    if (!success) {
140357ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        ALOGE("%s: Error queueing compressed image buffer %p",
140457ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala                __FUNCTION__, jpegBuffer.buffer);
140557ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        mParent->signalError();
140657ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        return;
140757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    }
140857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala
140957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    // Write to JPEG output stream
141057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    ALOGV("%s: Compression complete, pushing to stream %d", __FUNCTION__,
141157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala            jpegBuffer.streamId);
141257ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala
141357ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    GraphicBufferMapper::get().unlock(*(jpegBuffer.buffer));
141457ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    const Stream &s = mParent->getStreamInfo(jpegBuffer.streamId);
141557ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    res = s.ops->enqueue_buffer(s.ops, mJpegTimestamp, jpegBuffer.buffer);
141657ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala}
141757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala
141857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvalavoid EmulatedFakeCamera2::ReadoutThread::onJpegInputDone(
141957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        const StreamBuffer &inputBuffer) {
142057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    status_t res;
142157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    GraphicBufferMapper::get().unlock(*(inputBuffer.buffer));
142257ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    const ReprocessStream &s =
142357ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala            mParent->getReprocessStreamInfo(-inputBuffer.streamId);
142457ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    res = s.ops->release_buffer(s.ops, inputBuffer.buffer);
142557ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    if (res != OK) {
142657ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        ALOGE("Error releasing reprocess buffer %p: %s (%d)",
142757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala                inputBuffer.buffer, strerror(-res), res);
142857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala        mParent->signalError();
142957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala    }
143057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala}
143157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala
14328a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ReadoutThread::collectStatisticsMetadata(
14338a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_t *frame) {
14348a94683196406b83b14218d1beef66067f126a16keunyoung    // Completely fake face rectangles, don't correspond to real faces in scene
14358a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Readout:    Collecting statistics metadata");
14368a94683196406b83b14218d1beef66067f126a16keunyoung
14378a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
14388a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t entry;
14398a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(frame,
14408a94683196406b83b14218d1beef66067f126a16keunyoung                ANDROID_STATISTICS_FACE_DETECT_MODE,
14418a94683196406b83b14218d1beef66067f126a16keunyoung                &entry);
14428a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
14438a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to find face detect mode!", __FUNCTION__);
14448a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
14458a94683196406b83b14218d1beef66067f126a16keunyoung    }
14468a94683196406b83b14218d1beef66067f126a16keunyoung
14478a94683196406b83b14218d1beef66067f126a16keunyoung    if (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) return OK;
14488a94683196406b83b14218d1beef66067f126a16keunyoung
14498a94683196406b83b14218d1beef66067f126a16keunyoung    // The coordinate system for the face regions is the raw sensor pixel
14508a94683196406b83b14218d1beef66067f126a16keunyoung    // coordinates. Here, we map from the scene coordinates (0-19 in both axis)
14518a94683196406b83b14218d1beef66067f126a16keunyoung    // to raw pixels, for the scene defined in fake-pipeline2/Scene.cpp. We
14528a94683196406b83b14218d1beef66067f126a16keunyoung    // approximately place two faces on top of the windows of the house. No
14538a94683196406b83b14218d1beef66067f126a16keunyoung    // actual faces exist there, but might one day. Note that this doesn't
14548a94683196406b83b14218d1beef66067f126a16keunyoung    // account for the offsets used to account for aspect ratio differences, so
14558a94683196406b83b14218d1beef66067f126a16keunyoung    // the rectangles don't line up quite right.
14568a94683196406b83b14218d1beef66067f126a16keunyoung    const size_t numFaces = 2;
14578a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t rects[numFaces * 4] = {
145879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 10 / 20),
145979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 15 / 20),
146079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 12 / 20),
146179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 17 / 20),
146279f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala
146379f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 16 / 20),
146479f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 15 / 20),
146579f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 18 / 20),
146679f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 17 / 20)
14678a94683196406b83b14218d1beef66067f126a16keunyoung    };
14688a94683196406b83b14218d1beef66067f126a16keunyoung    // To simulate some kind of real detection going on, we jitter the rectangles on
14698a94683196406b83b14218d1beef66067f126a16keunyoung    // each frame by a few pixels in each dimension.
14708a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < numFaces * 4; i++) {
14718a94683196406b83b14218d1beef66067f126a16keunyoung        rects[i] += (int32_t)(((float)rand() / RAND_MAX) * 6 - 3);
14728a94683196406b83b14218d1beef66067f126a16keunyoung    }
14738a94683196406b83b14218d1beef66067f126a16keunyoung    // The confidence scores (0-100) are similarly jittered.
14748a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t scores[numFaces] = { 85, 95 };
14758a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < numFaces; i++) {
14768a94683196406b83b14218d1beef66067f126a16keunyoung        scores[i] += (int32_t)(((float)rand() / RAND_MAX) * 10 - 5);
14778a94683196406b83b14218d1beef66067f126a16keunyoung    }
14788a94683196406b83b14218d1beef66067f126a16keunyoung
14798a94683196406b83b14218d1beef66067f126a16keunyoung    res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_RECTANGLES,
14808a94683196406b83b14218d1beef66067f126a16keunyoung            rects, numFaces * 4);
14818a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
14828a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to add face rectangles!", __FUNCTION__);
14838a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
14848a94683196406b83b14218d1beef66067f126a16keunyoung    }
14858a94683196406b83b14218d1beef66067f126a16keunyoung
14868a94683196406b83b14218d1beef66067f126a16keunyoung    res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_SCORES,
14878a94683196406b83b14218d1beef66067f126a16keunyoung            scores, numFaces);
14888a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
14898a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to add face scores!", __FUNCTION__);
14908a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
14918a94683196406b83b14218d1beef66067f126a16keunyoung    }
14928a94683196406b83b14218d1beef66067f126a16keunyoung
14938a94683196406b83b14218d1beef66067f126a16keunyoung    if (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE) return OK;
14948a94683196406b83b14218d1beef66067f126a16keunyoung
14958a94683196406b83b14218d1beef66067f126a16keunyoung    // Advanced face detection options - add eye/mouth coordinates.  The
14968a94683196406b83b14218d1beef66067f126a16keunyoung    // coordinates in order are (leftEyeX, leftEyeY, rightEyeX, rightEyeY,
14978a94683196406b83b14218d1beef66067f126a16keunyoung    // mouthX, mouthY). The mapping is the same as the face rectangles.
14988a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t features[numFaces * 6] = {
149979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 10.5 / 20),
150079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20),
150179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 11.5 / 20),
150279f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20),
150379f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 11 / 20),
150479f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 16.5 / 20),
150579f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala
150679f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 16.5 / 20),
150779f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20),
150879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 17.5 / 20),
150979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20),
151079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0] * 17 / 20),
151179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1] * 16.5 / 20),
15128a94683196406b83b14218d1beef66067f126a16keunyoung    };
15138a94683196406b83b14218d1beef66067f126a16keunyoung    // Jitter these a bit less than the rects
15148a94683196406b83b14218d1beef66067f126a16keunyoung    for (size_t i = 0; i < numFaces * 6; i++) {
15158a94683196406b83b14218d1beef66067f126a16keunyoung        features[i] += (int32_t)(((float)rand() / RAND_MAX) * 4 - 2);
15168a94683196406b83b14218d1beef66067f126a16keunyoung    }
15178a94683196406b83b14218d1beef66067f126a16keunyoung    // These are unique IDs that are used to identify each face while it's
15188a94683196406b83b14218d1beef66067f126a16keunyoung    // visible to the detector (if a face went away and came back, it'd get a
15198a94683196406b83b14218d1beef66067f126a16keunyoung    // new ID).
15208a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t ids[numFaces] = {
15218a94683196406b83b14218d1beef66067f126a16keunyoung        100, 200
15228a94683196406b83b14218d1beef66067f126a16keunyoung    };
15238a94683196406b83b14218d1beef66067f126a16keunyoung
15248a94683196406b83b14218d1beef66067f126a16keunyoung    res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_LANDMARKS,
15258a94683196406b83b14218d1beef66067f126a16keunyoung            features, numFaces * 6);
15268a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
15278a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to add face landmarks!", __FUNCTION__);
15288a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
15298a94683196406b83b14218d1beef66067f126a16keunyoung    }
15308a94683196406b83b14218d1beef66067f126a16keunyoung
15318a94683196406b83b14218d1beef66067f126a16keunyoung    res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_IDS,
15328a94683196406b83b14218d1beef66067f126a16keunyoung            ids, numFaces);
15338a94683196406b83b14218d1beef66067f126a16keunyoung    if (res != OK) {
15348a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Unable to add face scores!", __FUNCTION__);
15358a94683196406b83b14218d1beef66067f126a16keunyoung        return BAD_VALUE;
15368a94683196406b83b14218d1beef66067f126a16keunyoung    }
15378a94683196406b83b14218d1beef66067f126a16keunyoung
15388a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
15398a94683196406b83b14218d1beef66067f126a16keunyoung}
15408a94683196406b83b14218d1beef66067f126a16keunyoung
15418a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ControlThread::ControlThread(EmulatedFakeCamera2 *parent):
15428a94683196406b83b14218d1beef66067f126a16keunyoung        Thread(false),
15438a94683196406b83b14218d1beef66067f126a16keunyoung        mParent(parent) {
15448a94683196406b83b14218d1beef66067f126a16keunyoung    mRunning = false;
15458a94683196406b83b14218d1beef66067f126a16keunyoung}
15468a94683196406b83b14218d1beef66067f126a16keunyoung
15478a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ControlThread::~ControlThread() {
15488a94683196406b83b14218d1beef66067f126a16keunyoung}
15498a94683196406b83b14218d1beef66067f126a16keunyoung
15508a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::readyToRun() {
15518a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
15528a94683196406b83b14218d1beef66067f126a16keunyoung
15538a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("Starting up ControlThread");
15548a94683196406b83b14218d1beef66067f126a16keunyoung    mRunning = true;
15558a94683196406b83b14218d1beef66067f126a16keunyoung    mStartAf = false;
15568a94683196406b83b14218d1beef66067f126a16keunyoung    mCancelAf = false;
15578a94683196406b83b14218d1beef66067f126a16keunyoung    mStartPrecapture = false;
15588a94683196406b83b14218d1beef66067f126a16keunyoung
15598a94683196406b83b14218d1beef66067f126a16keunyoung    mControlMode = ANDROID_CONTROL_MODE_AUTO;
15608a94683196406b83b14218d1beef66067f126a16keunyoung
15618a94683196406b83b14218d1beef66067f126a16keunyoung    mEffectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
15628a94683196406b83b14218d1beef66067f126a16keunyoung    mSceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY;
15638a94683196406b83b14218d1beef66067f126a16keunyoung
15648a94683196406b83b14218d1beef66067f126a16keunyoung    mAfMode = ANDROID_CONTROL_AF_MODE_AUTO;
15658a94683196406b83b14218d1beef66067f126a16keunyoung    mAfModeChange = false;
15668a94683196406b83b14218d1beef66067f126a16keunyoung
15678a94683196406b83b14218d1beef66067f126a16keunyoung    mAeMode = ANDROID_CONTROL_AE_MODE_ON;
15688a94683196406b83b14218d1beef66067f126a16keunyoung    mAwbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
15698a94683196406b83b14218d1beef66067f126a16keunyoung
15708a94683196406b83b14218d1beef66067f126a16keunyoung    mAfTriggerId = 0;
15718a94683196406b83b14218d1beef66067f126a16keunyoung    mPrecaptureTriggerId = 0;
15728a94683196406b83b14218d1beef66067f126a16keunyoung
15738a94683196406b83b14218d1beef66067f126a16keunyoung    mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
15748a94683196406b83b14218d1beef66067f126a16keunyoung    mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
15758a94683196406b83b14218d1beef66067f126a16keunyoung    mAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;
15768a94683196406b83b14218d1beef66067f126a16keunyoung
15778a94683196406b83b14218d1beef66067f126a16keunyoung    mExposureTime = kNormalExposureTime;
15788a94683196406b83b14218d1beef66067f126a16keunyoung
15798a94683196406b83b14218d1beef66067f126a16keunyoung    mInputSignal.signal();
15808a94683196406b83b14218d1beef66067f126a16keunyoung    return NO_ERROR;
15818a94683196406b83b14218d1beef66067f126a16keunyoung}
15828a94683196406b83b14218d1beef66067f126a16keunyoung
15838a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::waitUntilRunning() {
15848a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
15858a94683196406b83b14218d1beef66067f126a16keunyoung    if (!mRunning) {
15868a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Waiting for control thread to start");
15878a94683196406b83b14218d1beef66067f126a16keunyoung        mInputSignal.wait(mInputMutex);
15888a94683196406b83b14218d1beef66067f126a16keunyoung    }
15898a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
15908a94683196406b83b14218d1beef66067f126a16keunyoung}
15918a94683196406b83b14218d1beef66067f126a16keunyoung
15928a94683196406b83b14218d1beef66067f126a16keunyoung// Override android.control.* fields with 3A values before sending request to sensor
15938a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *request) {
15948a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
15958a94683196406b83b14218d1beef66067f126a16keunyoung    // TODO: Add handling for all android.control.* fields here
15968a94683196406b83b14218d1beef66067f126a16keunyoung    camera_metadata_entry_t mode;
15978a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
15988a94683196406b83b14218d1beef66067f126a16keunyoung
15998a94683196406b83b14218d1beef66067f126a16keunyoung#define READ_IF_OK(res, what, def)                                             \
16008a94683196406b83b14218d1beef66067f126a16keunyoung    (((res) == OK) ? (what) : (uint8_t)(def))
16018a94683196406b83b14218d1beef66067f126a16keunyoung
16028a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16038a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_MODE,
16048a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16058a94683196406b83b14218d1beef66067f126a16keunyoung    mControlMode = READ_IF_OK(res, mode.data.u8[0], ANDROID_CONTROL_MODE_OFF);
16068a94683196406b83b14218d1beef66067f126a16keunyoung
16078a94683196406b83b14218d1beef66067f126a16keunyoung    // disable all 3A
16088a94683196406b83b14218d1beef66067f126a16keunyoung    if (mControlMode == ANDROID_CONTROL_MODE_OFF) {
16098a94683196406b83b14218d1beef66067f126a16keunyoung        mEffectMode =   ANDROID_CONTROL_EFFECT_MODE_OFF;
1610c653d1c8455317956955c9a633018be4e15a113dRuben Brunk        mSceneMode =    ANDROID_CONTROL_SCENE_MODE_DISABLED;
16118a94683196406b83b14218d1beef66067f126a16keunyoung        mAfMode =       ANDROID_CONTROL_AF_MODE_OFF;
16128a94683196406b83b14218d1beef66067f126a16keunyoung        mAeLock =       ANDROID_CONTROL_AE_LOCK_ON;
16138a94683196406b83b14218d1beef66067f126a16keunyoung        mAeMode =       ANDROID_CONTROL_AE_MODE_OFF;
16148a94683196406b83b14218d1beef66067f126a16keunyoung        mAfModeChange = true;
16158a94683196406b83b14218d1beef66067f126a16keunyoung        mStartAf =      false;
16168a94683196406b83b14218d1beef66067f126a16keunyoung        mCancelAf =     true;
16178a94683196406b83b14218d1beef66067f126a16keunyoung        mAeState =      ANDROID_CONTROL_AE_STATE_INACTIVE;
16188a94683196406b83b14218d1beef66067f126a16keunyoung        mAwbMode =      ANDROID_CONTROL_AWB_MODE_OFF;
16198a94683196406b83b14218d1beef66067f126a16keunyoung        return res;
16208a94683196406b83b14218d1beef66067f126a16keunyoung    }
16218a94683196406b83b14218d1beef66067f126a16keunyoung
16228a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16238a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_EFFECT_MODE,
16248a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16258a94683196406b83b14218d1beef66067f126a16keunyoung    mEffectMode = READ_IF_OK(res, mode.data.u8[0],
16268a94683196406b83b14218d1beef66067f126a16keunyoung                             ANDROID_CONTROL_EFFECT_MODE_OFF);
16278a94683196406b83b14218d1beef66067f126a16keunyoung
16288a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16298a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_SCENE_MODE,
16308a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16318a94683196406b83b14218d1beef66067f126a16keunyoung    mSceneMode = READ_IF_OK(res, mode.data.u8[0],
1632c653d1c8455317956955c9a633018be4e15a113dRuben Brunk                             ANDROID_CONTROL_SCENE_MODE_DISABLED);
16338a94683196406b83b14218d1beef66067f126a16keunyoung
16348a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16358a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE,
16368a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16378a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAfMode != mode.data.u8[0]) {
16388a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("AF new mode: %d, old mode %d", mode.data.u8[0], mAfMode);
16398a94683196406b83b14218d1beef66067f126a16keunyoung        mAfMode = mode.data.u8[0];
16408a94683196406b83b14218d1beef66067f126a16keunyoung        mAfModeChange = true;
16418a94683196406b83b14218d1beef66067f126a16keunyoung        mStartAf = false;
16428a94683196406b83b14218d1beef66067f126a16keunyoung        mCancelAf = false;
16438a94683196406b83b14218d1beef66067f126a16keunyoung    }
16448a94683196406b83b14218d1beef66067f126a16keunyoung
16458a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16468a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_MODE,
16478a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16488a94683196406b83b14218d1beef66067f126a16keunyoung    mAeMode = READ_IF_OK(res, mode.data.u8[0],
16498a94683196406b83b14218d1beef66067f126a16keunyoung                             ANDROID_CONTROL_AE_MODE_OFF);
16508a94683196406b83b14218d1beef66067f126a16keunyoung
16518a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16528a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_LOCK,
16538a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16548a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t aeLockVal = READ_IF_OK(res, mode.data.u8[0],
16558a94683196406b83b14218d1beef66067f126a16keunyoung                                   ANDROID_CONTROL_AE_LOCK_ON);
16568a94683196406b83b14218d1beef66067f126a16keunyoung    bool aeLock = (aeLockVal == ANDROID_CONTROL_AE_LOCK_ON);
16578a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAeLock && !aeLock) {
16588a94683196406b83b14218d1beef66067f126a16keunyoung        mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
16598a94683196406b83b14218d1beef66067f126a16keunyoung    }
16608a94683196406b83b14218d1beef66067f126a16keunyoung    mAeLock = aeLock;
16618a94683196406b83b14218d1beef66067f126a16keunyoung
16628a94683196406b83b14218d1beef66067f126a16keunyoung    res = find_camera_metadata_entry(request,
16638a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE,
16648a94683196406b83b14218d1beef66067f126a16keunyoung            &mode);
16658a94683196406b83b14218d1beef66067f126a16keunyoung    mAwbMode = READ_IF_OK(res, mode.data.u8[0],
16668a94683196406b83b14218d1beef66067f126a16keunyoung                          ANDROID_CONTROL_AWB_MODE_OFF);
16678a94683196406b83b14218d1beef66067f126a16keunyoung
16688a94683196406b83b14218d1beef66067f126a16keunyoung    // TODO: Override more control fields
16698a94683196406b83b14218d1beef66067f126a16keunyoung
16708a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAeMode != ANDROID_CONTROL_AE_MODE_OFF) {
16718a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_entry_t exposureTime;
16728a94683196406b83b14218d1beef66067f126a16keunyoung        res = find_camera_metadata_entry(request,
16738a94683196406b83b14218d1beef66067f126a16keunyoung                ANDROID_SENSOR_EXPOSURE_TIME,
16748a94683196406b83b14218d1beef66067f126a16keunyoung                &exposureTime);
16758a94683196406b83b14218d1beef66067f126a16keunyoung        if (res == OK) {
16768a94683196406b83b14218d1beef66067f126a16keunyoung            exposureTime.data.i64[0] = mExposureTime;
16778a94683196406b83b14218d1beef66067f126a16keunyoung        }
16788a94683196406b83b14218d1beef66067f126a16keunyoung    }
16798a94683196406b83b14218d1beef66067f126a16keunyoung
16808a94683196406b83b14218d1beef66067f126a16keunyoung#undef READ_IF_OK
16818a94683196406b83b14218d1beef66067f126a16keunyoung
16828a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
16838a94683196406b83b14218d1beef66067f126a16keunyoung}
16848a94683196406b83b14218d1beef66067f126a16keunyoung
16858a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::triggerAction(uint32_t msgType,
16868a94683196406b83b14218d1beef66067f126a16keunyoung        int32_t ext1, int32_t ext2) {
16878a94683196406b83b14218d1beef66067f126a16keunyoung    ALOGV("%s: Triggering %d (%d, %d)", __FUNCTION__, msgType, ext1, ext2);
16888a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
16898a94683196406b83b14218d1beef66067f126a16keunyoung    switch (msgType) {
16908a94683196406b83b14218d1beef66067f126a16keunyoung        case CAMERA2_TRIGGER_AUTOFOCUS:
16918a94683196406b83b14218d1beef66067f126a16keunyoung            mAfTriggerId = ext1;
16928a94683196406b83b14218d1beef66067f126a16keunyoung            mStartAf = true;
16938a94683196406b83b14218d1beef66067f126a16keunyoung            mCancelAf = false;
16948a94683196406b83b14218d1beef66067f126a16keunyoung            break;
16958a94683196406b83b14218d1beef66067f126a16keunyoung        case CAMERA2_TRIGGER_CANCEL_AUTOFOCUS:
16968a94683196406b83b14218d1beef66067f126a16keunyoung            mAfTriggerId = ext1;
16978a94683196406b83b14218d1beef66067f126a16keunyoung            mStartAf = false;
16988a94683196406b83b14218d1beef66067f126a16keunyoung            mCancelAf = true;
16998a94683196406b83b14218d1beef66067f126a16keunyoung            break;
17008a94683196406b83b14218d1beef66067f126a16keunyoung        case CAMERA2_TRIGGER_PRECAPTURE_METERING:
17018a94683196406b83b14218d1beef66067f126a16keunyoung            mPrecaptureTriggerId = ext1;
17028a94683196406b83b14218d1beef66067f126a16keunyoung            mStartPrecapture = true;
17038a94683196406b83b14218d1beef66067f126a16keunyoung            break;
17048a94683196406b83b14218d1beef66067f126a16keunyoung        default:
17058a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("%s: Unknown action triggered: %d (arguments %d %d)",
17068a94683196406b83b14218d1beef66067f126a16keunyoung                    __FUNCTION__, msgType, ext1, ext2);
17078a94683196406b83b14218d1beef66067f126a16keunyoung            return BAD_VALUE;
17088a94683196406b83b14218d1beef66067f126a16keunyoung    }
17098a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
17108a94683196406b83b14218d1beef66067f126a16keunyoung}
17118a94683196406b83b14218d1beef66067f126a16keunyoung
17128a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kControlCycleDelay = 100 * MSEC;
17138a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinAfDuration = 500 * MSEC;
17148a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMaxAfDuration = 900 * MSEC;
17158a94683196406b83b14218d1beef66067f126a16keunyoungconst float EmulatedFakeCamera2::ControlThread::kAfSuccessRate = 0.9;
17168a94683196406b83b14218d1beef66067f126a16keunyoung // Once every 5 seconds
17178a94683196406b83b14218d1beef66067f126a16keunyoungconst float EmulatedFakeCamera2::ControlThread::kContinuousAfStartRate =
17188a94683196406b83b14218d1beef66067f126a16keunyoung        kControlCycleDelay / 5.0 * SEC;
17198a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinAeDuration = 500 * MSEC;
17208a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMaxAeDuration = 2 * SEC;
17218a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinPrecaptureAeDuration = 100 * MSEC;
17228a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMaxPrecaptureAeDuration = 400 * MSEC;
17238a94683196406b83b14218d1beef66067f126a16keunyoung // Once every 3 seconds
17248a94683196406b83b14218d1beef66067f126a16keunyoungconst float EmulatedFakeCamera2::ControlThread::kAeScanStartRate =
17258a94683196406b83b14218d1beef66067f126a16keunyoung    kControlCycleDelay / 3000000000.0;
17268a94683196406b83b14218d1beef66067f126a16keunyoung
17278a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kNormalExposureTime = 10 * MSEC;
17288a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kExposureJump = 2 * MSEC;
17298a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinExposureTime = 1 * MSEC;
17308a94683196406b83b14218d1beef66067f126a16keunyoung
17318a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ControlThread::threadLoop() {
17328a94683196406b83b14218d1beef66067f126a16keunyoung    bool afModeChange = false;
17338a94683196406b83b14218d1beef66067f126a16keunyoung    bool afTriggered = false;
17348a94683196406b83b14218d1beef66067f126a16keunyoung    bool afCancelled = false;
17358a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t afState;
17368a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t afMode;
17378a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t afTriggerId;
17388a94683196406b83b14218d1beef66067f126a16keunyoung    bool precaptureTriggered = false;
17398a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t aeState;
17408a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t aeMode;
17418a94683196406b83b14218d1beef66067f126a16keunyoung    bool    aeLock;
17428a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t precaptureTriggerId;
17438a94683196406b83b14218d1beef66067f126a16keunyoung    nsecs_t nextSleep = kControlCycleDelay;
17448a94683196406b83b14218d1beef66067f126a16keunyoung
17458a94683196406b83b14218d1beef66067f126a16keunyoung    {
17468a94683196406b83b14218d1beef66067f126a16keunyoung        Mutex::Autolock lock(mInputMutex);
17478a94683196406b83b14218d1beef66067f126a16keunyoung        if (mStartAf) {
17488a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGD("Starting AF trigger processing");
17498a94683196406b83b14218d1beef66067f126a16keunyoung            afTriggered = true;
17508a94683196406b83b14218d1beef66067f126a16keunyoung            mStartAf = false;
17518a94683196406b83b14218d1beef66067f126a16keunyoung        } else if (mCancelAf) {
17528a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGD("Starting cancel AF trigger processing");
17538a94683196406b83b14218d1beef66067f126a16keunyoung            afCancelled = true;
17548a94683196406b83b14218d1beef66067f126a16keunyoung            mCancelAf = false;
17558a94683196406b83b14218d1beef66067f126a16keunyoung        }
17568a94683196406b83b14218d1beef66067f126a16keunyoung        afState = mAfState;
17578a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = mAfMode;
17588a94683196406b83b14218d1beef66067f126a16keunyoung        afModeChange = mAfModeChange;
17598a94683196406b83b14218d1beef66067f126a16keunyoung        mAfModeChange = false;
17608a94683196406b83b14218d1beef66067f126a16keunyoung
17618a94683196406b83b14218d1beef66067f126a16keunyoung        afTriggerId = mAfTriggerId;
17628a94683196406b83b14218d1beef66067f126a16keunyoung
17638a94683196406b83b14218d1beef66067f126a16keunyoung        if(mStartPrecapture) {
17648a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGD("Starting precapture trigger processing");
17658a94683196406b83b14218d1beef66067f126a16keunyoung            precaptureTriggered = true;
17668a94683196406b83b14218d1beef66067f126a16keunyoung            mStartPrecapture = false;
17678a94683196406b83b14218d1beef66067f126a16keunyoung        }
17688a94683196406b83b14218d1beef66067f126a16keunyoung        aeState = mAeState;
17698a94683196406b83b14218d1beef66067f126a16keunyoung        aeMode = mAeMode;
17708a94683196406b83b14218d1beef66067f126a16keunyoung        aeLock = mAeLock;
17718a94683196406b83b14218d1beef66067f126a16keunyoung        precaptureTriggerId = mPrecaptureTriggerId;
17728a94683196406b83b14218d1beef66067f126a16keunyoung    }
17738a94683196406b83b14218d1beef66067f126a16keunyoung
17748a94683196406b83b14218d1beef66067f126a16keunyoung    if (afCancelled || afModeChange) {
17758a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("Resetting AF state due to cancel/mode change");
17768a94683196406b83b14218d1beef66067f126a16keunyoung        afState = ANDROID_CONTROL_AF_STATE_INACTIVE;
17778a94683196406b83b14218d1beef66067f126a16keunyoung        updateAfState(afState, afTriggerId);
17788a94683196406b83b14218d1beef66067f126a16keunyoung        mAfScanDuration = 0;
17798a94683196406b83b14218d1beef66067f126a16keunyoung        mLockAfterPassiveScan = false;
17808a94683196406b83b14218d1beef66067f126a16keunyoung    }
17818a94683196406b83b14218d1beef66067f126a16keunyoung
17828a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t oldAfState = afState;
17838a94683196406b83b14218d1beef66067f126a16keunyoung
17848a94683196406b83b14218d1beef66067f126a16keunyoung    if (afTriggered) {
17858a94683196406b83b14218d1beef66067f126a16keunyoung        afState = processAfTrigger(afMode, afState);
17868a94683196406b83b14218d1beef66067f126a16keunyoung    }
17878a94683196406b83b14218d1beef66067f126a16keunyoung
17888a94683196406b83b14218d1beef66067f126a16keunyoung    afState = maybeStartAfScan(afMode, afState);
17898a94683196406b83b14218d1beef66067f126a16keunyoung    afState = updateAfScan(afMode, afState, &nextSleep);
17908a94683196406b83b14218d1beef66067f126a16keunyoung    updateAfState(afState, afTriggerId);
17918a94683196406b83b14218d1beef66067f126a16keunyoung
17928a94683196406b83b14218d1beef66067f126a16keunyoung    if (precaptureTriggered) {
17938a94683196406b83b14218d1beef66067f126a16keunyoung        aeState = processPrecaptureTrigger(aeMode, aeState);
17948a94683196406b83b14218d1beef66067f126a16keunyoung    }
17958a94683196406b83b14218d1beef66067f126a16keunyoung
17968a94683196406b83b14218d1beef66067f126a16keunyoung    aeState = maybeStartAeScan(aeMode, aeLock, aeState);
17978a94683196406b83b14218d1beef66067f126a16keunyoung    aeState = updateAeScan(aeMode, aeLock, aeState, &nextSleep);
17988a94683196406b83b14218d1beef66067f126a16keunyoung    updateAeState(aeState, precaptureTriggerId);
17998a94683196406b83b14218d1beef66067f126a16keunyoung
18008a94683196406b83b14218d1beef66067f126a16keunyoung    int ret;
18018a94683196406b83b14218d1beef66067f126a16keunyoung    timespec t;
18028a94683196406b83b14218d1beef66067f126a16keunyoung    t.tv_sec = 0;
18038a94683196406b83b14218d1beef66067f126a16keunyoung    t.tv_nsec = nextSleep;
18048a94683196406b83b14218d1beef66067f126a16keunyoung    do {
18058a94683196406b83b14218d1beef66067f126a16keunyoung        ret = nanosleep(&t, &t);
18068a94683196406b83b14218d1beef66067f126a16keunyoung    } while (ret != 0);
18078a94683196406b83b14218d1beef66067f126a16keunyoung
18088a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAfScanDuration > 0) {
18098a94683196406b83b14218d1beef66067f126a16keunyoung        mAfScanDuration -= nextSleep;
18108a94683196406b83b14218d1beef66067f126a16keunyoung    }
18118a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAeScanDuration > 0) {
18128a94683196406b83b14218d1beef66067f126a16keunyoung        mAeScanDuration -= nextSleep;
18138a94683196406b83b14218d1beef66067f126a16keunyoung    }
18148a94683196406b83b14218d1beef66067f126a16keunyoung
18158a94683196406b83b14218d1beef66067f126a16keunyoung    return true;
18168a94683196406b83b14218d1beef66067f126a16keunyoung}
18178a94683196406b83b14218d1beef66067f126a16keunyoung
18188a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::processAfTrigger(uint8_t afMode,
18198a94683196406b83b14218d1beef66067f126a16keunyoung        uint8_t afState) {
18208a94683196406b83b14218d1beef66067f126a16keunyoung    switch (afMode) {
18218a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AF_MODE_OFF:
18228a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AF_MODE_EDOF:
18238a94683196406b83b14218d1beef66067f126a16keunyoung            // Do nothing
18248a94683196406b83b14218d1beef66067f126a16keunyoung            break;
18258a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AF_MODE_MACRO:
18268a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AF_MODE_AUTO:
18278a94683196406b83b14218d1beef66067f126a16keunyoung            switch (afState) {
18288a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_INACTIVE:
18298a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
18308a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
18318a94683196406b83b14218d1beef66067f126a16keunyoung                    // Start new focusing cycle
18328a94683196406b83b14218d1beef66067f126a16keunyoung                    mAfScanDuration =  ((double)rand() / RAND_MAX) *
18338a94683196406b83b14218d1beef66067f126a16keunyoung                        (kMaxAfDuration - kMinAfDuration) + kMinAfDuration;
18348a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN;
18353725c7c982eac52ec64a625e82f306822452941cColin Cross                    ALOGV("%s: AF scan start, duration %" PRId64 " ms",
18368a94683196406b83b14218d1beef66067f126a16keunyoung                          __FUNCTION__, mAfScanDuration / 1000000);
18378a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18388a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
18398a94683196406b83b14218d1beef66067f126a16keunyoung                    // Ignore new request, already scanning
18408a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18418a94683196406b83b14218d1beef66067f126a16keunyoung                default:
18428a94683196406b83b14218d1beef66067f126a16keunyoung                    ALOGE("Unexpected AF state in AUTO/MACRO AF mode: %d",
18438a94683196406b83b14218d1beef66067f126a16keunyoung                          afState);
18448a94683196406b83b14218d1beef66067f126a16keunyoung            }
18458a94683196406b83b14218d1beef66067f126a16keunyoung            break;
18468a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
18478a94683196406b83b14218d1beef66067f126a16keunyoung            switch (afState) {
18488a94683196406b83b14218d1beef66067f126a16keunyoung                // Picture mode waits for passive scan to complete
18498a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
18508a94683196406b83b14218d1beef66067f126a16keunyoung                    mLockAfterPassiveScan = true;
18518a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18528a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_INACTIVE:
18538a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
18548a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18558a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
18568a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
18578a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18588a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
18598a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
18608a94683196406b83b14218d1beef66067f126a16keunyoung                    // Must cancel to get out of these states
18618a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18628a94683196406b83b14218d1beef66067f126a16keunyoung                default:
18638a94683196406b83b14218d1beef66067f126a16keunyoung                    ALOGE("Unexpected AF state in CONTINUOUS_PICTURE AF mode: %d",
18648a94683196406b83b14218d1beef66067f126a16keunyoung                          afState);
18658a94683196406b83b14218d1beef66067f126a16keunyoung            }
18668a94683196406b83b14218d1beef66067f126a16keunyoung            break;
18678a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
18688a94683196406b83b14218d1beef66067f126a16keunyoung            switch (afState) {
18698a94683196406b83b14218d1beef66067f126a16keunyoung                // Video mode does not wait for passive scan to complete
18708a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
18718a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_INACTIVE:
18728a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
18738a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18748a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
18758a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
18768a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18778a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
18788a94683196406b83b14218d1beef66067f126a16keunyoung                case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
18798a94683196406b83b14218d1beef66067f126a16keunyoung                    // Must cancel to get out of these states
18808a94683196406b83b14218d1beef66067f126a16keunyoung                    break;
18818a94683196406b83b14218d1beef66067f126a16keunyoung                default:
18828a94683196406b83b14218d1beef66067f126a16keunyoung                    ALOGE("Unexpected AF state in CONTINUOUS_VIDEO AF mode: %d",
18838a94683196406b83b14218d1beef66067f126a16keunyoung                          afState);
18848a94683196406b83b14218d1beef66067f126a16keunyoung            }
18858a94683196406b83b14218d1beef66067f126a16keunyoung            break;
18868a94683196406b83b14218d1beef66067f126a16keunyoung        default:
18878a94683196406b83b14218d1beef66067f126a16keunyoung            break;
18888a94683196406b83b14218d1beef66067f126a16keunyoung    }
18898a94683196406b83b14218d1beef66067f126a16keunyoung    return afState;
18908a94683196406b83b14218d1beef66067f126a16keunyoung}
18918a94683196406b83b14218d1beef66067f126a16keunyoung
18928a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::maybeStartAfScan(uint8_t afMode,
18938a94683196406b83b14218d1beef66067f126a16keunyoung        uint8_t afState) {
18948a94683196406b83b14218d1beef66067f126a16keunyoung    if ((afMode == ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO ||
18958a94683196406b83b14218d1beef66067f126a16keunyoung            afMode == ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE) &&
18968a94683196406b83b14218d1beef66067f126a16keunyoung        (afState == ANDROID_CONTROL_AF_STATE_INACTIVE ||
18978a94683196406b83b14218d1beef66067f126a16keunyoung            afState == ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)) {
18988a94683196406b83b14218d1beef66067f126a16keunyoung
18998a94683196406b83b14218d1beef66067f126a16keunyoung        bool startScan = ((double)rand() / RAND_MAX) < kContinuousAfStartRate;
19008a94683196406b83b14218d1beef66067f126a16keunyoung        if (startScan) {
19018a94683196406b83b14218d1beef66067f126a16keunyoung            // Start new passive focusing cycle
19028a94683196406b83b14218d1beef66067f126a16keunyoung            mAfScanDuration =  ((double)rand() / RAND_MAX) *
19038a94683196406b83b14218d1beef66067f126a16keunyoung                (kMaxAfDuration - kMinAfDuration) + kMinAfDuration;
19048a94683196406b83b14218d1beef66067f126a16keunyoung            afState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN;
19053725c7c982eac52ec64a625e82f306822452941cColin Cross            ALOGV("%s: AF passive scan start, duration %" PRId64 " ms",
19068a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, mAfScanDuration / 1000000);
19078a94683196406b83b14218d1beef66067f126a16keunyoung        }
19088a94683196406b83b14218d1beef66067f126a16keunyoung    }
19098a94683196406b83b14218d1beef66067f126a16keunyoung    return afState;
19108a94683196406b83b14218d1beef66067f126a16keunyoung}
19118a94683196406b83b14218d1beef66067f126a16keunyoung
19128a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::updateAfScan(uint8_t afMode,
19138a94683196406b83b14218d1beef66067f126a16keunyoung        uint8_t afState, nsecs_t *maxSleep) {
19148a94683196406b83b14218d1beef66067f126a16keunyoung    if (! (afState == ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN ||
19158a94683196406b83b14218d1beef66067f126a16keunyoung            afState == ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN ) ) {
19168a94683196406b83b14218d1beef66067f126a16keunyoung        return afState;
19178a94683196406b83b14218d1beef66067f126a16keunyoung    }
19188a94683196406b83b14218d1beef66067f126a16keunyoung
19198a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAfScanDuration <= 0) {
19208a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("%s: AF scan done", __FUNCTION__);
19218a94683196406b83b14218d1beef66067f126a16keunyoung        switch (afMode) {
19228a94683196406b83b14218d1beef66067f126a16keunyoung            case ANDROID_CONTROL_AF_MODE_MACRO:
19238a94683196406b83b14218d1beef66067f126a16keunyoung            case ANDROID_CONTROL_AF_MODE_AUTO: {
19248a94683196406b83b14218d1beef66067f126a16keunyoung                bool success = ((double)rand() / RAND_MAX) < kAfSuccessRate;
19258a94683196406b83b14218d1beef66067f126a16keunyoung                if (success) {
19268a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
19278a94683196406b83b14218d1beef66067f126a16keunyoung                } else {
19288a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
19298a94683196406b83b14218d1beef66067f126a16keunyoung                }
19308a94683196406b83b14218d1beef66067f126a16keunyoung                break;
19318a94683196406b83b14218d1beef66067f126a16keunyoung            }
19328a94683196406b83b14218d1beef66067f126a16keunyoung            case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
19338a94683196406b83b14218d1beef66067f126a16keunyoung                if (mLockAfterPassiveScan) {
19348a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED;
19358a94683196406b83b14218d1beef66067f126a16keunyoung                    mLockAfterPassiveScan = false;
19368a94683196406b83b14218d1beef66067f126a16keunyoung                } else {
19378a94683196406b83b14218d1beef66067f126a16keunyoung                    afState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
19388a94683196406b83b14218d1beef66067f126a16keunyoung                }
19398a94683196406b83b14218d1beef66067f126a16keunyoung                break;
19408a94683196406b83b14218d1beef66067f126a16keunyoung            case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
19418a94683196406b83b14218d1beef66067f126a16keunyoung                afState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED;
19428a94683196406b83b14218d1beef66067f126a16keunyoung                break;
19438a94683196406b83b14218d1beef66067f126a16keunyoung            default:
19448a94683196406b83b14218d1beef66067f126a16keunyoung                ALOGE("Unexpected AF mode in scan state");
19458a94683196406b83b14218d1beef66067f126a16keunyoung        }
19468a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
19478a94683196406b83b14218d1beef66067f126a16keunyoung        if (mAfScanDuration <= *maxSleep) {
19488a94683196406b83b14218d1beef66067f126a16keunyoung            *maxSleep = mAfScanDuration;
19498a94683196406b83b14218d1beef66067f126a16keunyoung        }
19508a94683196406b83b14218d1beef66067f126a16keunyoung    }
19518a94683196406b83b14218d1beef66067f126a16keunyoung    return afState;
19528a94683196406b83b14218d1beef66067f126a16keunyoung}
19538a94683196406b83b14218d1beef66067f126a16keunyoung
19548a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::ControlThread::updateAfState(uint8_t newState,
19558a94683196406b83b14218d1beef66067f126a16keunyoung        int32_t triggerId) {
19568a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
19578a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAfState != newState) {
19588a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGV("%s: Autofocus state now %d, id %d", __FUNCTION__,
19598a94683196406b83b14218d1beef66067f126a16keunyoung                newState, triggerId);
19608a94683196406b83b14218d1beef66067f126a16keunyoung        mAfState = newState;
19618a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->sendNotification(CAMERA2_MSG_AUTOFOCUS,
19628a94683196406b83b14218d1beef66067f126a16keunyoung                newState, triggerId, 0);
19638a94683196406b83b14218d1beef66067f126a16keunyoung    }
19648a94683196406b83b14218d1beef66067f126a16keunyoung}
19658a94683196406b83b14218d1beef66067f126a16keunyoung
19668a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::processPrecaptureTrigger(uint8_t aeMode,
19678a94683196406b83b14218d1beef66067f126a16keunyoung        uint8_t aeState) {
19688a94683196406b83b14218d1beef66067f126a16keunyoung    switch (aeMode) {
19698a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_OFF:
19708a94683196406b83b14218d1beef66067f126a16keunyoung            // Don't do anything for these
19718a94683196406b83b14218d1beef66067f126a16keunyoung            return aeState;
19728a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON:
19738a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
19748a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
19758a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
19768a94683196406b83b14218d1beef66067f126a16keunyoung            // Trigger a precapture cycle
19778a94683196406b83b14218d1beef66067f126a16keunyoung            aeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE;
19788a94683196406b83b14218d1beef66067f126a16keunyoung            mAeScanDuration = ((double)rand() / RAND_MAX) *
19798a94683196406b83b14218d1beef66067f126a16keunyoung                    (kMaxPrecaptureAeDuration - kMinPrecaptureAeDuration) +
19808a94683196406b83b14218d1beef66067f126a16keunyoung                    kMinPrecaptureAeDuration;
19813725c7c982eac52ec64a625e82f306822452941cColin Cross            ALOGD("%s: AE precapture scan start, duration %" PRId64 " ms",
19828a94683196406b83b14218d1beef66067f126a16keunyoung                    __FUNCTION__, mAeScanDuration / 1000000);
19838a94683196406b83b14218d1beef66067f126a16keunyoung
19848a94683196406b83b14218d1beef66067f126a16keunyoung    }
19858a94683196406b83b14218d1beef66067f126a16keunyoung    return aeState;
19868a94683196406b83b14218d1beef66067f126a16keunyoung}
19878a94683196406b83b14218d1beef66067f126a16keunyoung
19888a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::maybeStartAeScan(uint8_t aeMode,
19898a94683196406b83b14218d1beef66067f126a16keunyoung        bool aeLocked,
19908a94683196406b83b14218d1beef66067f126a16keunyoung        uint8_t aeState) {
19918a94683196406b83b14218d1beef66067f126a16keunyoung    if (aeLocked) return aeState;
19928a94683196406b83b14218d1beef66067f126a16keunyoung    switch (aeMode) {
19938a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_OFF:
19948a94683196406b83b14218d1beef66067f126a16keunyoung            break;
19958a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON:
19968a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
19978a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
19988a94683196406b83b14218d1beef66067f126a16keunyoung        case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: {
19998a94683196406b83b14218d1beef66067f126a16keunyoung            if (aeState != ANDROID_CONTROL_AE_STATE_INACTIVE &&
20008a94683196406b83b14218d1beef66067f126a16keunyoung                    aeState != ANDROID_CONTROL_AE_STATE_CONVERGED) break;
20018a94683196406b83b14218d1beef66067f126a16keunyoung
20028a94683196406b83b14218d1beef66067f126a16keunyoung            bool startScan = ((double)rand() / RAND_MAX) < kAeScanStartRate;
20038a94683196406b83b14218d1beef66067f126a16keunyoung            if (startScan) {
20048a94683196406b83b14218d1beef66067f126a16keunyoung                mAeScanDuration = ((double)rand() / RAND_MAX) *
20058a94683196406b83b14218d1beef66067f126a16keunyoung                (kMaxAeDuration - kMinAeDuration) + kMinAeDuration;
20068a94683196406b83b14218d1beef66067f126a16keunyoung                aeState = ANDROID_CONTROL_AE_STATE_SEARCHING;
20073725c7c982eac52ec64a625e82f306822452941cColin Cross                ALOGV("%s: AE scan start, duration %" PRId64 " ms",
20088a94683196406b83b14218d1beef66067f126a16keunyoung                        __FUNCTION__, mAeScanDuration / 1000000);
20098a94683196406b83b14218d1beef66067f126a16keunyoung            }
20108a94683196406b83b14218d1beef66067f126a16keunyoung        }
20118a94683196406b83b14218d1beef66067f126a16keunyoung    }
20128a94683196406b83b14218d1beef66067f126a16keunyoung
20138a94683196406b83b14218d1beef66067f126a16keunyoung    return aeState;
20148a94683196406b83b14218d1beef66067f126a16keunyoung}
20158a94683196406b83b14218d1beef66067f126a16keunyoung
20168a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::updateAeScan(uint8_t aeMode,
20178a94683196406b83b14218d1beef66067f126a16keunyoung        bool aeLock, uint8_t aeState, nsecs_t *maxSleep) {
20188a94683196406b83b14218d1beef66067f126a16keunyoung    if (aeLock && aeState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
20198a94683196406b83b14218d1beef66067f126a16keunyoung        mAeScanDuration = 0;
20208a94683196406b83b14218d1beef66067f126a16keunyoung        aeState = ANDROID_CONTROL_AE_STATE_LOCKED;
20218a94683196406b83b14218d1beef66067f126a16keunyoung    } else if ((aeState == ANDROID_CONTROL_AE_STATE_SEARCHING) ||
20228a94683196406b83b14218d1beef66067f126a16keunyoung            (aeState == ANDROID_CONTROL_AE_STATE_PRECAPTURE ) ) {
20238a94683196406b83b14218d1beef66067f126a16keunyoung        if (mAeScanDuration <= 0) {
20244dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin            ALOGV("%s: AE scan done", __FUNCTION__);
20258a94683196406b83b14218d1beef66067f126a16keunyoung            aeState = aeLock ?
20268a94683196406b83b14218d1beef66067f126a16keunyoung                    ANDROID_CONTROL_AE_STATE_LOCKED :ANDROID_CONTROL_AE_STATE_CONVERGED;
20278a94683196406b83b14218d1beef66067f126a16keunyoung
20288a94683196406b83b14218d1beef66067f126a16keunyoung            Mutex::Autolock lock(mInputMutex);
20298a94683196406b83b14218d1beef66067f126a16keunyoung            mExposureTime = kNormalExposureTime;
20308a94683196406b83b14218d1beef66067f126a16keunyoung        } else {
20318a94683196406b83b14218d1beef66067f126a16keunyoung            if (mAeScanDuration <= *maxSleep) {
20328a94683196406b83b14218d1beef66067f126a16keunyoung                *maxSleep = mAeScanDuration;
20338a94683196406b83b14218d1beef66067f126a16keunyoung            }
20348a94683196406b83b14218d1beef66067f126a16keunyoung
20358a94683196406b83b14218d1beef66067f126a16keunyoung            int64_t exposureDelta =
20368a94683196406b83b14218d1beef66067f126a16keunyoung                    ((double)rand() / RAND_MAX) * 2 * kExposureJump -
20378a94683196406b83b14218d1beef66067f126a16keunyoung                    kExposureJump;
20388a94683196406b83b14218d1beef66067f126a16keunyoung            Mutex::Autolock lock(mInputMutex);
20398a94683196406b83b14218d1beef66067f126a16keunyoung            mExposureTime = mExposureTime + exposureDelta;
20408a94683196406b83b14218d1beef66067f126a16keunyoung            if (mExposureTime < kMinExposureTime) mExposureTime = kMinExposureTime;
20418a94683196406b83b14218d1beef66067f126a16keunyoung        }
20428a94683196406b83b14218d1beef66067f126a16keunyoung    }
20438a94683196406b83b14218d1beef66067f126a16keunyoung
20448a94683196406b83b14218d1beef66067f126a16keunyoung    return aeState;
20458a94683196406b83b14218d1beef66067f126a16keunyoung}
20468a94683196406b83b14218d1beef66067f126a16keunyoung
20478a94683196406b83b14218d1beef66067f126a16keunyoung
20488a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::ControlThread::updateAeState(uint8_t newState,
20498a94683196406b83b14218d1beef66067f126a16keunyoung        int32_t triggerId) {
20508a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mInputMutex);
20518a94683196406b83b14218d1beef66067f126a16keunyoung    if (mAeState != newState) {
20524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin        ALOGV("%s: Autoexposure state now %d, id %d", __FUNCTION__,
20538a94683196406b83b14218d1beef66067f126a16keunyoung                newState, triggerId);
20548a94683196406b83b14218d1beef66067f126a16keunyoung        mAeState = newState;
20558a94683196406b83b14218d1beef66067f126a16keunyoung        mParent->sendNotification(CAMERA2_MSG_AUTOEXPOSURE,
20568a94683196406b83b14218d1beef66067f126a16keunyoung                newState, triggerId, 0);
20578a94683196406b83b14218d1beef66067f126a16keunyoung    }
20588a94683196406b83b14218d1beef66067f126a16keunyoung}
20598a94683196406b83b14218d1beef66067f126a16keunyoung
20608a94683196406b83b14218d1beef66067f126a16keunyoung/** Private methods */
20618a94683196406b83b14218d1beef66067f126a16keunyoung
20628a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::constructStaticInfo(
20638a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_t **info,
20648a94683196406b83b14218d1beef66067f126a16keunyoung        bool sizeRequest) const {
20658a94683196406b83b14218d1beef66067f126a16keunyoung
20668a94683196406b83b14218d1beef66067f126a16keunyoung    size_t entryCount = 0;
20678a94683196406b83b14218d1beef66067f126a16keunyoung    size_t dataCount = 0;
20688a94683196406b83b14218d1beef66067f126a16keunyoung    status_t ret;
20698a94683196406b83b14218d1beef66067f126a16keunyoung
20708a94683196406b83b14218d1beef66067f126a16keunyoung#define ADD_OR_SIZE( tag, data, count ) \
20718a94683196406b83b14218d1beef66067f126a16keunyoung    if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
20728a94683196406b83b14218d1beef66067f126a16keunyoung            tag, data, count) ) != OK ) return ret
20738a94683196406b83b14218d1beef66067f126a16keunyoung
20748a94683196406b83b14218d1beef66067f126a16keunyoung    // android.lens
20758a94683196406b83b14218d1beef66067f126a16keunyoung
20768a94683196406b83b14218d1beef66067f126a16keunyoung    // 5 cm min focus distance for back camera, infinity (fixed focus) for front
20778a94683196406b83b14218d1beef66067f126a16keunyoung    const float minFocusDistance = mFacingBack ? 1.0/0.05 : 0.0;
20788a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20798a94683196406b83b14218d1beef66067f126a16keunyoung            &minFocusDistance, 1);
20808a94683196406b83b14218d1beef66067f126a16keunyoung    // 5 m hyperfocal distance for back camera, infinity (fixed focus) for front
20818a94683196406b83b14218d1beef66067f126a16keunyoung    const float hyperFocalDistance = mFacingBack ? 1.0/5.0 : 0.0;
20828a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
20838a94683196406b83b14218d1beef66067f126a16keunyoung            &minFocusDistance, 1);
20848a94683196406b83b14218d1beef66067f126a16keunyoung
20858a94683196406b83b14218d1beef66067f126a16keunyoung    static const float focalLength = 3.30f; // mm
20868a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
20878a94683196406b83b14218d1beef66067f126a16keunyoung            &focalLength, 1);
20888a94683196406b83b14218d1beef66067f126a16keunyoung    static const float aperture = 2.8f;
20898a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
20908a94683196406b83b14218d1beef66067f126a16keunyoung            &aperture, 1);
20918a94683196406b83b14218d1beef66067f126a16keunyoung    static const float filterDensity = 0;
20928a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
20938a94683196406b83b14218d1beef66067f126a16keunyoung            &filterDensity, 1);
20948a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableOpticalStabilization =
20958a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
20968a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
20978a94683196406b83b14218d1beef66067f126a16keunyoung            &availableOpticalStabilization, 1);
20988a94683196406b83b14218d1beef66067f126a16keunyoung
20998a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t lensShadingMapSize[] = {1, 1};
21008a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_INFO_SHADING_MAP_SIZE, lensShadingMapSize,
21018a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(lensShadingMapSize)/sizeof(int32_t));
21028a94683196406b83b14218d1beef66067f126a16keunyoung
21038a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t lensFacing = mFacingBack ?
21048a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
21058a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
21068a94683196406b83b14218d1beef66067f126a16keunyoung
21078a94683196406b83b14218d1beef66067f126a16keunyoung    // android.sensor
21088a94683196406b83b14218d1beef66067f126a16keunyoung
21098a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
21108a94683196406b83b14218d1beef66067f126a16keunyoung            Sensor::kExposureTimeRange, 2);
21118a94683196406b83b14218d1beef66067f126a16keunyoung
21128a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
21138a94683196406b83b14218d1beef66067f126a16keunyoung            &Sensor::kFrameDurationRange[1], 1);
21148a94683196406b83b14218d1beef66067f126a16keunyoung
21150049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He    ADD_OR_SIZE(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
21160049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He            Sensor::kSensitivityRange,
21170049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He            sizeof(Sensor::kSensitivityRange)
21180049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He            /sizeof(int32_t));
21198a94683196406b83b14218d1beef66067f126a16keunyoung
21208a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
21218a94683196406b83b14218d1beef66067f126a16keunyoung            &Sensor::kColorFilterArrangement, 1);
21228a94683196406b83b14218d1beef66067f126a16keunyoung
21238a94683196406b83b14218d1beef66067f126a16keunyoung    static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
21248a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
21258a94683196406b83b14218d1beef66067f126a16keunyoung            sensorPhysicalSize, 2);
21268a94683196406b83b14218d1beef66067f126a16keunyoung
21278a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
21288a94683196406b83b14218d1beef66067f126a16keunyoung            Sensor::kResolution, 2);
21298a94683196406b83b14218d1beef66067f126a16keunyoung
21308a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
21318a94683196406b83b14218d1beef66067f126a16keunyoung            Sensor::kResolution, 2);
21328a94683196406b83b14218d1beef66067f126a16keunyoung
21338a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_INFO_WHITE_LEVEL,
21348a94683196406b83b14218d1beef66067f126a16keunyoung            &Sensor::kMaxRawValue, 1);
21358a94683196406b83b14218d1beef66067f126a16keunyoung
21368a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t blackLevelPattern[4] = {
213779f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kBlackLevel),
213879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kBlackLevel),
213979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kBlackLevel),
214079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kBlackLevel)
21418a94683196406b83b14218d1beef66067f126a16keunyoung    };
21428a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
21438a94683196406b83b14218d1beef66067f126a16keunyoung            blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
21448a94683196406b83b14218d1beef66067f126a16keunyoung
21458a94683196406b83b14218d1beef66067f126a16keunyoung    //TODO: sensor color calibration fields
21468a94683196406b83b14218d1beef66067f126a16keunyoung
21478a94683196406b83b14218d1beef66067f126a16keunyoung    // android.flash
21488a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t flashAvailable = 0;
21498a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_FLASH_INFO_AVAILABLE, &flashAvailable, 1);
21508a94683196406b83b14218d1beef66067f126a16keunyoung
21518a94683196406b83b14218d1beef66067f126a16keunyoung    static const int64_t flashChargeDuration = 0;
21528a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_FLASH_INFO_CHARGE_DURATION, &flashChargeDuration, 1);
21538a94683196406b83b14218d1beef66067f126a16keunyoung
21548a94683196406b83b14218d1beef66067f126a16keunyoung    // android.tonemap
21558a94683196406b83b14218d1beef66067f126a16keunyoung
21568a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t tonemapCurvePoints = 128;
21578a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
21588a94683196406b83b14218d1beef66067f126a16keunyoung
21598a94683196406b83b14218d1beef66067f126a16keunyoung    // android.scaler
21608a94683196406b83b14218d1beef66067f126a16keunyoung
21618a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
21628a94683196406b83b14218d1beef66067f126a16keunyoung            kAvailableFormats,
21638a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(kAvailableFormats)/sizeof(uint32_t));
21648a94683196406b83b14218d1beef66067f126a16keunyoung
21658a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
21668a94683196406b83b14218d1beef66067f126a16keunyoung            kAvailableRawSizes,
21678a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(kAvailableRawSizes)/sizeof(uint32_t));
21688a94683196406b83b14218d1beef66067f126a16keunyoung
21698a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
21708a94683196406b83b14218d1beef66067f126a16keunyoung            kAvailableRawMinDurations,
21718a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(kAvailableRawMinDurations)/sizeof(uint64_t));
21728a94683196406b83b14218d1beef66067f126a16keunyoung
21738a94683196406b83b14218d1beef66067f126a16keunyoung    if (mFacingBack) {
21748a94683196406b83b14218d1beef66067f126a16keunyoung        ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
21758a94683196406b83b14218d1beef66067f126a16keunyoung                kAvailableProcessedSizesBack,
21768a94683196406b83b14218d1beef66067f126a16keunyoung                sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t));
21778a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
21788a94683196406b83b14218d1beef66067f126a16keunyoung        ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
21798a94683196406b83b14218d1beef66067f126a16keunyoung                kAvailableProcessedSizesFront,
21808a94683196406b83b14218d1beef66067f126a16keunyoung                sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t));
21818a94683196406b83b14218d1beef66067f126a16keunyoung    }
21828a94683196406b83b14218d1beef66067f126a16keunyoung
21838a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
21848a94683196406b83b14218d1beef66067f126a16keunyoung            kAvailableProcessedMinDurations,
21858a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t));
21868a94683196406b83b14218d1beef66067f126a16keunyoung
21878a94683196406b83b14218d1beef66067f126a16keunyoung    if (mFacingBack) {
21888a94683196406b83b14218d1beef66067f126a16keunyoung        ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
21898a94683196406b83b14218d1beef66067f126a16keunyoung                kAvailableJpegSizesBack,
21908a94683196406b83b14218d1beef66067f126a16keunyoung                sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t));
21918a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
21928a94683196406b83b14218d1beef66067f126a16keunyoung        ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
21938a94683196406b83b14218d1beef66067f126a16keunyoung                kAvailableJpegSizesFront,
21948a94683196406b83b14218d1beef66067f126a16keunyoung                sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t));
21958a94683196406b83b14218d1beef66067f126a16keunyoung    }
21968a94683196406b83b14218d1beef66067f126a16keunyoung
21978a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
21988a94683196406b83b14218d1beef66067f126a16keunyoung            kAvailableJpegMinDurations,
21998a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t));
22008a94683196406b83b14218d1beef66067f126a16keunyoung
22018a94683196406b83b14218d1beef66067f126a16keunyoung    static const float maxZoom = 10;
22028a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
22038a94683196406b83b14218d1beef66067f126a16keunyoung            &maxZoom, 1);
22048a94683196406b83b14218d1beef66067f126a16keunyoung
22058a94683196406b83b14218d1beef66067f126a16keunyoung    // android.jpeg
22068a94683196406b83b14218d1beef66067f126a16keunyoung
22078a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t jpegThumbnailSizes[] = {
22088a94683196406b83b14218d1beef66067f126a16keunyoung            0, 0,
22098a94683196406b83b14218d1beef66067f126a16keunyoung            160, 120,
22108a94683196406b83b14218d1beef66067f126a16keunyoung            320, 240
22118a94683196406b83b14218d1beef66067f126a16keunyoung     };
22128a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
22138a94683196406b83b14218d1beef66067f126a16keunyoung            jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
22148a94683196406b83b14218d1beef66067f126a16keunyoung
22158a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t jpegMaxSize = JpegCompressor::kMaxJpegSize;
22168a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
22178a94683196406b83b14218d1beef66067f126a16keunyoung
22188a94683196406b83b14218d1beef66067f126a16keunyoung    // android.stats
22198a94683196406b83b14218d1beef66067f126a16keunyoung
22208a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableFaceDetectModes[] = {
22218a94683196406b83b14218d1beef66067f126a16keunyoung        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
22228a94683196406b83b14218d1beef66067f126a16keunyoung        ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE,
22238a94683196406b83b14218d1beef66067f126a16keunyoung        ANDROID_STATISTICS_FACE_DETECT_MODE_FULL
22248a94683196406b83b14218d1beef66067f126a16keunyoung    };
22258a94683196406b83b14218d1beef66067f126a16keunyoung
22268a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
22278a94683196406b83b14218d1beef66067f126a16keunyoung            availableFaceDetectModes,
22288a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(availableFaceDetectModes));
22298a94683196406b83b14218d1beef66067f126a16keunyoung
22308a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t maxFaceCount = 8;
22318a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
22328a94683196406b83b14218d1beef66067f126a16keunyoung            &maxFaceCount, 1);
22338a94683196406b83b14218d1beef66067f126a16keunyoung
22348a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t histogramSize = 64;
22358a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
22368a94683196406b83b14218d1beef66067f126a16keunyoung            &histogramSize, 1);
22378a94683196406b83b14218d1beef66067f126a16keunyoung
22388a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t maxHistogramCount = 1000;
22398a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
22408a94683196406b83b14218d1beef66067f126a16keunyoung            &maxHistogramCount, 1);
22418a94683196406b83b14218d1beef66067f126a16keunyoung
22428a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t sharpnessMapSize[2] = {64, 64};
22438a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
22448a94683196406b83b14218d1beef66067f126a16keunyoung            sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
22458a94683196406b83b14218d1beef66067f126a16keunyoung
22468a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t maxSharpnessMapValue = 1000;
22478a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
22488a94683196406b83b14218d1beef66067f126a16keunyoung            &maxSharpnessMapValue, 1);
22498a94683196406b83b14218d1beef66067f126a16keunyoung
22508a94683196406b83b14218d1beef66067f126a16keunyoung    // android.control
22518a94683196406b83b14218d1beef66067f126a16keunyoung
22528a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableSceneModes[] = {
2253c653d1c8455317956955c9a633018be4e15a113dRuben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED
22548a94683196406b83b14218d1beef66067f126a16keunyoung    };
22558a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
22568a94683196406b83b14218d1beef66067f126a16keunyoung            availableSceneModes, sizeof(availableSceneModes));
22578a94683196406b83b14218d1beef66067f126a16keunyoung
22588a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableEffects[] = {
22598a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_EFFECT_MODE_OFF
22608a94683196406b83b14218d1beef66067f126a16keunyoung    };
22618a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
22628a94683196406b83b14218d1beef66067f126a16keunyoung            availableEffects, sizeof(availableEffects));
22638a94683196406b83b14218d1beef66067f126a16keunyoung
2264982e58da1a0c67a9cba552cd0d069f87b83cf9dfRuben Brunk    static const int32_t max3aRegions[] = {/*AE*/ 0,/*AWB*/ 0,/*AF*/ 0};
22658a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
2266982e58da1a0c67a9cba552cd0d069f87b83cf9dfRuben Brunk            max3aRegions, sizeof(max3aRegions)/sizeof(max3aRegions[0]));
22678a94683196406b83b14218d1beef66067f126a16keunyoung
22688a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableAeModes[] = {
22698a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_MODE_OFF,
22708a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_MODE_ON
22718a94683196406b83b14218d1beef66067f126a16keunyoung    };
22728a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
22738a94683196406b83b14218d1beef66067f126a16keunyoung            availableAeModes, sizeof(availableAeModes));
22748a94683196406b83b14218d1beef66067f126a16keunyoung
22758a94683196406b83b14218d1beef66067f126a16keunyoung    static const camera_metadata_rational exposureCompensationStep = {
22768a94683196406b83b14218d1beef66067f126a16keunyoung            1, 3
22778a94683196406b83b14218d1beef66067f126a16keunyoung    };
22788a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_COMPENSATION_STEP,
22798a94683196406b83b14218d1beef66067f126a16keunyoung            &exposureCompensationStep, 1);
22808a94683196406b83b14218d1beef66067f126a16keunyoung
22818a94683196406b83b14218d1beef66067f126a16keunyoung    int32_t exposureCompensationRange[] = {-9, 9};
22828a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
22838a94683196406b83b14218d1beef66067f126a16keunyoung            exposureCompensationRange,
22848a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(exposureCompensationRange)/sizeof(int32_t));
22858a94683196406b83b14218d1beef66067f126a16keunyoung
22868a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t availableTargetFpsRanges[] = {
22878a94683196406b83b14218d1beef66067f126a16keunyoung            5, 30, 15, 30
22888a94683196406b83b14218d1beef66067f126a16keunyoung    };
22898a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
22908a94683196406b83b14218d1beef66067f126a16keunyoung            availableTargetFpsRanges,
22918a94683196406b83b14218d1beef66067f126a16keunyoung            sizeof(availableTargetFpsRanges)/sizeof(int32_t));
22928a94683196406b83b14218d1beef66067f126a16keunyoung
22938a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableAntibandingModes[] = {
22948a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,
22958a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO
22968a94683196406b83b14218d1beef66067f126a16keunyoung    };
22978a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
22988a94683196406b83b14218d1beef66067f126a16keunyoung            availableAntibandingModes, sizeof(availableAntibandingModes));
22998a94683196406b83b14218d1beef66067f126a16keunyoung
23008a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableAwbModes[] = {
23018a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_OFF,
23028a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_AUTO,
23038a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_INCANDESCENT,
23048a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_FLUORESCENT,
23058a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_DAYLIGHT,
23068a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_SHADE
23078a94683196406b83b14218d1beef66067f126a16keunyoung    };
23088a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
23098a94683196406b83b14218d1beef66067f126a16keunyoung            availableAwbModes, sizeof(availableAwbModes));
23108a94683196406b83b14218d1beef66067f126a16keunyoung
23118a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableAfModesBack[] = {
23128a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE_OFF,
23138a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE_AUTO,
23148a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE_MACRO,
23158a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,
23168a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE
23178a94683196406b83b14218d1beef66067f126a16keunyoung    };
23188a94683196406b83b14218d1beef66067f126a16keunyoung
23198a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableAfModesFront[] = {
23208a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AF_MODE_OFF
23218a94683196406b83b14218d1beef66067f126a16keunyoung    };
23228a94683196406b83b14218d1beef66067f126a16keunyoung
23238a94683196406b83b14218d1beef66067f126a16keunyoung    if (mFacingBack) {
23248a94683196406b83b14218d1beef66067f126a16keunyoung        ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
23258a94683196406b83b14218d1beef66067f126a16keunyoung                    availableAfModesBack, sizeof(availableAfModesBack));
23268a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
23278a94683196406b83b14218d1beef66067f126a16keunyoung        ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
23288a94683196406b83b14218d1beef66067f126a16keunyoung                    availableAfModesFront, sizeof(availableAfModesFront));
23298a94683196406b83b14218d1beef66067f126a16keunyoung    }
23308a94683196406b83b14218d1beef66067f126a16keunyoung
23318a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t availableVstabModes[] = {
23328a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF
23338a94683196406b83b14218d1beef66067f126a16keunyoung    };
23348a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
23358a94683196406b83b14218d1beef66067f126a16keunyoung            availableVstabModes, sizeof(availableVstabModes));
23368a94683196406b83b14218d1beef66067f126a16keunyoung
23378a94683196406b83b14218d1beef66067f126a16keunyoung#undef ADD_OR_SIZE
23388a94683196406b83b14218d1beef66067f126a16keunyoung    /** Allocate metadata if sizing */
23398a94683196406b83b14218d1beef66067f126a16keunyoung    if (sizeRequest) {
23403725c7c982eac52ec64a625e82f306822452941cColin Cross        ALOGV("Allocating %zu entries, %zu extra bytes for "
23418a94683196406b83b14218d1beef66067f126a16keunyoung                "static camera info",
23428a94683196406b83b14218d1beef66067f126a16keunyoung                entryCount, dataCount);
23438a94683196406b83b14218d1beef66067f126a16keunyoung        *info = allocate_camera_metadata(entryCount, dataCount);
23448a94683196406b83b14218d1beef66067f126a16keunyoung        if (*info == NULL) {
23458a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("Unable to allocate camera static info"
23463725c7c982eac52ec64a625e82f306822452941cColin Cross                    "(%zu entries, %zu bytes extra data)",
23478a94683196406b83b14218d1beef66067f126a16keunyoung                    entryCount, dataCount);
23488a94683196406b83b14218d1beef66067f126a16keunyoung            return NO_MEMORY;
23498a94683196406b83b14218d1beef66067f126a16keunyoung        }
23508a94683196406b83b14218d1beef66067f126a16keunyoung    }
23518a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
23528a94683196406b83b14218d1beef66067f126a16keunyoung}
23538a94683196406b83b14218d1beef66067f126a16keunyoung
23548a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::constructDefaultRequest(
23558a94683196406b83b14218d1beef66067f126a16keunyoung        int request_template,
23568a94683196406b83b14218d1beef66067f126a16keunyoung        camera_metadata_t **request,
23578a94683196406b83b14218d1beef66067f126a16keunyoung        bool sizeRequest) const {
23588a94683196406b83b14218d1beef66067f126a16keunyoung
23598a94683196406b83b14218d1beef66067f126a16keunyoung    size_t entryCount = 0;
23608a94683196406b83b14218d1beef66067f126a16keunyoung    size_t dataCount = 0;
23618a94683196406b83b14218d1beef66067f126a16keunyoung    status_t ret;
23628a94683196406b83b14218d1beef66067f126a16keunyoung
23638a94683196406b83b14218d1beef66067f126a16keunyoung#define ADD_OR_SIZE( tag, data, count ) \
23648a94683196406b83b14218d1beef66067f126a16keunyoung    if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
23658a94683196406b83b14218d1beef66067f126a16keunyoung            tag, data, count) ) != OK ) return ret
23668a94683196406b83b14218d1beef66067f126a16keunyoung
23678a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.request */
23688a94683196406b83b14218d1beef66067f126a16keunyoung
23698a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
23708a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_REQUEST_TYPE, &requestType, 1);
23718a94683196406b83b14218d1beef66067f126a16keunyoung
23728a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
23738a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
23748a94683196406b83b14218d1beef66067f126a16keunyoung
23758a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t id = 0;
23768a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
23778a94683196406b83b14218d1beef66067f126a16keunyoung
23788a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t frameCount = 0;
23798a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
23808a94683196406b83b14218d1beef66067f126a16keunyoung
23818a94683196406b83b14218d1beef66067f126a16keunyoung    // OUTPUT_STREAMS set by user
23828a94683196406b83b14218d1beef66067f126a16keunyoung    entryCount += 1;
23838a94683196406b83b14218d1beef66067f126a16keunyoung    dataCount += 5; // TODO: Should be maximum stream number
23848a94683196406b83b14218d1beef66067f126a16keunyoung
23858a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.lens */
23868a94683196406b83b14218d1beef66067f126a16keunyoung
23878a94683196406b83b14218d1beef66067f126a16keunyoung    static const float focusDistance = 0;
23888a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
23898a94683196406b83b14218d1beef66067f126a16keunyoung
23908a94683196406b83b14218d1beef66067f126a16keunyoung    static const float aperture = 2.8f;
23918a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1);
23928a94683196406b83b14218d1beef66067f126a16keunyoung
23938a94683196406b83b14218d1beef66067f126a16keunyoung    static const float focalLength = 5.0f;
23948a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1);
23958a94683196406b83b14218d1beef66067f126a16keunyoung
23968a94683196406b83b14218d1beef66067f126a16keunyoung    static const float filterDensity = 0;
23978a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
23988a94683196406b83b14218d1beef66067f126a16keunyoung
23998a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t opticalStabilizationMode =
24008a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
24018a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
24028a94683196406b83b14218d1beef66067f126a16keunyoung            &opticalStabilizationMode, 1);
24038a94683196406b83b14218d1beef66067f126a16keunyoung
24048a94683196406b83b14218d1beef66067f126a16keunyoung    // FOCUS_RANGE set only in frame
24058a94683196406b83b14218d1beef66067f126a16keunyoung
24068a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.sensor */
24078a94683196406b83b14218d1beef66067f126a16keunyoung
24088a94683196406b83b14218d1beef66067f126a16keunyoung    static const int64_t exposureTime = 10 * MSEC;
24098a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1);
24108a94683196406b83b14218d1beef66067f126a16keunyoung
24118a94683196406b83b14218d1beef66067f126a16keunyoung    static const int64_t frameDuration = 33333333L; // 1/30 s
24128a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
24138a94683196406b83b14218d1beef66067f126a16keunyoung
24148a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t sensitivity = 100;
24158a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1);
24168a94683196406b83b14218d1beef66067f126a16keunyoung
24178a94683196406b83b14218d1beef66067f126a16keunyoung    // TIMESTAMP set only in frame
24188a94683196406b83b14218d1beef66067f126a16keunyoung
24198a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.flash */
24208a94683196406b83b14218d1beef66067f126a16keunyoung
24218a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
24228a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
24238a94683196406b83b14218d1beef66067f126a16keunyoung
24248a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t flashPower = 10;
24258a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
24268a94683196406b83b14218d1beef66067f126a16keunyoung
24278a94683196406b83b14218d1beef66067f126a16keunyoung    static const int64_t firingTime = 0;
24288a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
24298a94683196406b83b14218d1beef66067f126a16keunyoung
24308a94683196406b83b14218d1beef66067f126a16keunyoung    /** Processing block modes */
24318a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t hotPixelMode = 0;
24328a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t demosaicMode = 0;
24338a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t noiseMode = 0;
24348a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t shadingMode = 0;
24358a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t colorMode = 0;
24368a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t tonemapMode = 0;
24378a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t edgeMode = 0;
24388a94683196406b83b14218d1beef66067f126a16keunyoung    switch (request_template) {
24398a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_STILL_CAPTURE:
24408a94683196406b83b14218d1beef66067f126a16keunyoung        // fall-through
24418a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
24428a94683196406b83b14218d1beef66067f126a16keunyoung        // fall-through
24438a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
24448a94683196406b83b14218d1beef66067f126a16keunyoung        hotPixelMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY;
24458a94683196406b83b14218d1beef66067f126a16keunyoung        demosaicMode = ANDROID_DEMOSAIC_MODE_HIGH_QUALITY;
24468a94683196406b83b14218d1beef66067f126a16keunyoung        noiseMode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;
24478a94683196406b83b14218d1beef66067f126a16keunyoung        shadingMode = ANDROID_SHADING_MODE_HIGH_QUALITY;
24488a94683196406b83b14218d1beef66067f126a16keunyoung        colorMode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY;
24498a94683196406b83b14218d1beef66067f126a16keunyoung        tonemapMode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;
24508a94683196406b83b14218d1beef66067f126a16keunyoung        edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY;
24518a94683196406b83b14218d1beef66067f126a16keunyoung        break;
24528a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_PREVIEW:
24538a94683196406b83b14218d1beef66067f126a16keunyoung        // fall-through
24548a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_VIDEO_RECORD:
24558a94683196406b83b14218d1beef66067f126a16keunyoung        // fall-through
24568a94683196406b83b14218d1beef66067f126a16keunyoung      default:
24578a94683196406b83b14218d1beef66067f126a16keunyoung        hotPixelMode = ANDROID_HOT_PIXEL_MODE_FAST;
24588a94683196406b83b14218d1beef66067f126a16keunyoung        demosaicMode = ANDROID_DEMOSAIC_MODE_FAST;
24598a94683196406b83b14218d1beef66067f126a16keunyoung        noiseMode = ANDROID_NOISE_REDUCTION_MODE_FAST;
24608a94683196406b83b14218d1beef66067f126a16keunyoung        shadingMode = ANDROID_SHADING_MODE_FAST;
24618a94683196406b83b14218d1beef66067f126a16keunyoung        colorMode = ANDROID_COLOR_CORRECTION_MODE_FAST;
24628a94683196406b83b14218d1beef66067f126a16keunyoung        tonemapMode = ANDROID_TONEMAP_MODE_FAST;
24638a94683196406b83b14218d1beef66067f126a16keunyoung        edgeMode = ANDROID_EDGE_MODE_FAST;
24648a94683196406b83b14218d1beef66067f126a16keunyoung        break;
24658a94683196406b83b14218d1beef66067f126a16keunyoung    }
24668a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
24678a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
24688a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_NOISE_REDUCTION_MODE, &noiseMode, 1);
24698a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
24708a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_COLOR_CORRECTION_MODE, &colorMode, 1);
24718a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
24728a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
24738a94683196406b83b14218d1beef66067f126a16keunyoung
24748a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.noise */
24758a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t noiseStrength = 5;
24768a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_NOISE_REDUCTION_STRENGTH, &noiseStrength, 1);
24778a94683196406b83b14218d1beef66067f126a16keunyoung
24788a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.color */
24798a94683196406b83b14218d1beef66067f126a16keunyoung    static const float colorTransform[9] = {
24808a94683196406b83b14218d1beef66067f126a16keunyoung        1.0f, 0.f, 0.f,
24818a94683196406b83b14218d1beef66067f126a16keunyoung        0.f, 1.f, 0.f,
24828a94683196406b83b14218d1beef66067f126a16keunyoung        0.f, 0.f, 1.f
24838a94683196406b83b14218d1beef66067f126a16keunyoung    };
24848a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_COLOR_CORRECTION_TRANSFORM, colorTransform, 9);
24858a94683196406b83b14218d1beef66067f126a16keunyoung
24868a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.tonemap */
24878a94683196406b83b14218d1beef66067f126a16keunyoung    static const float tonemapCurve[4] = {
24888a94683196406b83b14218d1beef66067f126a16keunyoung        0.f, 0.f,
24898a94683196406b83b14218d1beef66067f126a16keunyoung        1.f, 1.f
24908a94683196406b83b14218d1beef66067f126a16keunyoung    };
24918a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4);
24928a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4);
24938a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4);
24948a94683196406b83b14218d1beef66067f126a16keunyoung
24958a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.edge */
24968a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t edgeStrength = 5;
24978a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
24988a94683196406b83b14218d1beef66067f126a16keunyoung
24998a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.scaler */
25008a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t cropRegion[3] = {
250179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        0, 0, static_cast<int32_t>(Sensor::kResolution[0])
25028a94683196406b83b14218d1beef66067f126a16keunyoung    };
25038a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
25048a94683196406b83b14218d1beef66067f126a16keunyoung
25058a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.jpeg */
25068a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t jpegQuality = 80;
25078a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
25088a94683196406b83b14218d1beef66067f126a16keunyoung
25098a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t thumbnailSize[2] = {
25108a94683196406b83b14218d1beef66067f126a16keunyoung        640, 480
25118a94683196406b83b14218d1beef66067f126a16keunyoung    };
25128a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
25138a94683196406b83b14218d1beef66067f126a16keunyoung
25148a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t thumbnailQuality = 80;
25158a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
25168a94683196406b83b14218d1beef66067f126a16keunyoung
25178a94683196406b83b14218d1beef66067f126a16keunyoung    static const double gpsCoordinates[2] = {
25188a94683196406b83b14218d1beef66067f126a16keunyoung        0, 0
25198a94683196406b83b14218d1beef66067f126a16keunyoung    };
25208a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2);
25218a94683196406b83b14218d1beef66067f126a16keunyoung
25228a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t gpsProcessingMethod[32] = "None";
25238a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
25248a94683196406b83b14218d1beef66067f126a16keunyoung
25258a94683196406b83b14218d1beef66067f126a16keunyoung    static const int64_t gpsTimestamp = 0;
25268a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
25278a94683196406b83b14218d1beef66067f126a16keunyoung
25288a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t jpegOrientation = 0;
25298a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
25308a94683196406b83b14218d1beef66067f126a16keunyoung
25318a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.stats */
25328a94683196406b83b14218d1beef66067f126a16keunyoung
25338a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t faceDetectMode =
25348a94683196406b83b14218d1beef66067f126a16keunyoung        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
25358a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1);
25368a94683196406b83b14218d1beef66067f126a16keunyoung
25378a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t histogramMode = ANDROID_STATISTICS_HISTOGRAM_MODE_OFF;
25388a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_HISTOGRAM_MODE, &histogramMode, 1);
25398a94683196406b83b14218d1beef66067f126a16keunyoung
25408a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t sharpnessMapMode =
25418a94683196406b83b14218d1beef66067f126a16keunyoung        ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF;
25428a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
25438a94683196406b83b14218d1beef66067f126a16keunyoung
25448a94683196406b83b14218d1beef66067f126a16keunyoung    // faceRectangles, faceScores, faceLandmarks, faceIds, histogram,
25458a94683196406b83b14218d1beef66067f126a16keunyoung    // sharpnessMap only in frames
25468a94683196406b83b14218d1beef66067f126a16keunyoung
25478a94683196406b83b14218d1beef66067f126a16keunyoung    /** android.control */
25488a94683196406b83b14218d1beef66067f126a16keunyoung
25498a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t controlIntent = 0;
25508a94683196406b83b14218d1beef66067f126a16keunyoung    switch (request_template) {
25518a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_PREVIEW:
25528a94683196406b83b14218d1beef66067f126a16keunyoung        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
25538a94683196406b83b14218d1beef66067f126a16keunyoung        break;
25548a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_STILL_CAPTURE:
25558a94683196406b83b14218d1beef66067f126a16keunyoung        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
25568a94683196406b83b14218d1beef66067f126a16keunyoung        break;
25578a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_VIDEO_RECORD:
25588a94683196406b83b14218d1beef66067f126a16keunyoung        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
25598a94683196406b83b14218d1beef66067f126a16keunyoung        break;
25608a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
25618a94683196406b83b14218d1beef66067f126a16keunyoung        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
25628a94683196406b83b14218d1beef66067f126a16keunyoung        break;
25638a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
25648a94683196406b83b14218d1beef66067f126a16keunyoung        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
25658a94683196406b83b14218d1beef66067f126a16keunyoung        break;
25668a94683196406b83b14218d1beef66067f126a16keunyoung      default:
25678a94683196406b83b14218d1beef66067f126a16keunyoung        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
25688a94683196406b83b14218d1beef66067f126a16keunyoung        break;
25698a94683196406b83b14218d1beef66067f126a16keunyoung    }
25708a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
25718a94683196406b83b14218d1beef66067f126a16keunyoung
25728a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
25738a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
25748a94683196406b83b14218d1beef66067f126a16keunyoung
25758a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
25768a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
25778a94683196406b83b14218d1beef66067f126a16keunyoung
25788a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY;
25798a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
25808a94683196406b83b14218d1beef66067f126a16keunyoung
25818a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
25828a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
25838a94683196406b83b14218d1beef66067f126a16keunyoung
25848a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
25858a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
25868a94683196406b83b14218d1beef66067f126a16keunyoung
25878a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t controlRegions[5] = {
258879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        0, 0,
258979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[0]),
259079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        static_cast<int32_t>(Sensor::kResolution[1]),
259179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala        1000
25928a94683196406b83b14218d1beef66067f126a16keunyoung    };
25938a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
25948a94683196406b83b14218d1beef66067f126a16keunyoung
25958a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t aeExpCompensation = 0;
25968a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &aeExpCompensation, 1);
25978a94683196406b83b14218d1beef66067f126a16keunyoung
25988a94683196406b83b14218d1beef66067f126a16keunyoung    static const int32_t aeTargetFpsRange[2] = {
25998a94683196406b83b14218d1beef66067f126a16keunyoung        10, 30
26008a94683196406b83b14218d1beef66067f126a16keunyoung    };
26018a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
26028a94683196406b83b14218d1beef66067f126a16keunyoung
26038a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t aeAntibandingMode =
26048a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
26058a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
26068a94683196406b83b14218d1beef66067f126a16keunyoung
26078a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t awbMode =
26088a94683196406b83b14218d1beef66067f126a16keunyoung            ANDROID_CONTROL_AWB_MODE_AUTO;
26098a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
26108a94683196406b83b14218d1beef66067f126a16keunyoung
26118a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
26128a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
26138a94683196406b83b14218d1beef66067f126a16keunyoung
26148a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
26158a94683196406b83b14218d1beef66067f126a16keunyoung
26168a94683196406b83b14218d1beef66067f126a16keunyoung    uint8_t afMode = 0;
26178a94683196406b83b14218d1beef66067f126a16keunyoung    switch (request_template) {
26188a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_PREVIEW:
26198a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = ANDROID_CONTROL_AF_MODE_AUTO;
26208a94683196406b83b14218d1beef66067f126a16keunyoung        break;
26218a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_STILL_CAPTURE:
26228a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = ANDROID_CONTROL_AF_MODE_AUTO;
26238a94683196406b83b14218d1beef66067f126a16keunyoung        break;
26248a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_VIDEO_RECORD:
26258a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO;
26268a94683196406b83b14218d1beef66067f126a16keunyoung        break;
26278a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
26288a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO;
26298a94683196406b83b14218d1beef66067f126a16keunyoung        break;
26308a94683196406b83b14218d1beef66067f126a16keunyoung      case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
26318a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
26328a94683196406b83b14218d1beef66067f126a16keunyoung        break;
26338a94683196406b83b14218d1beef66067f126a16keunyoung      default:
26348a94683196406b83b14218d1beef66067f126a16keunyoung        afMode = ANDROID_CONTROL_AF_MODE_AUTO;
26358a94683196406b83b14218d1beef66067f126a16keunyoung        break;
26368a94683196406b83b14218d1beef66067f126a16keunyoung    }
26378a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
26388a94683196406b83b14218d1beef66067f126a16keunyoung
26398a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
26408a94683196406b83b14218d1beef66067f126a16keunyoung
26418a94683196406b83b14218d1beef66067f126a16keunyoung    static const uint8_t vstabMode =
26428a94683196406b83b14218d1beef66067f126a16keunyoung        ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
26438a94683196406b83b14218d1beef66067f126a16keunyoung    ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
26448a94683196406b83b14218d1beef66067f126a16keunyoung
26458a94683196406b83b14218d1beef66067f126a16keunyoung    // aeState, awbState, afState only in frame
26468a94683196406b83b14218d1beef66067f126a16keunyoung
26478a94683196406b83b14218d1beef66067f126a16keunyoung    /** Allocate metadata if sizing */
26488a94683196406b83b14218d1beef66067f126a16keunyoung    if (sizeRequest) {
26493725c7c982eac52ec64a625e82f306822452941cColin Cross        ALOGV("Allocating %zu entries, %zu extra bytes for "
26508a94683196406b83b14218d1beef66067f126a16keunyoung                "request template type %d",
26518a94683196406b83b14218d1beef66067f126a16keunyoung                entryCount, dataCount, request_template);
26528a94683196406b83b14218d1beef66067f126a16keunyoung        *request = allocate_camera_metadata(entryCount, dataCount);
26538a94683196406b83b14218d1beef66067f126a16keunyoung        if (*request == NULL) {
26548a94683196406b83b14218d1beef66067f126a16keunyoung            ALOGE("Unable to allocate new request template type %d "
26553725c7c982eac52ec64a625e82f306822452941cColin Cross                    "(%zu entries, %zu bytes extra data)", request_template,
26568a94683196406b83b14218d1beef66067f126a16keunyoung                    entryCount, dataCount);
26578a94683196406b83b14218d1beef66067f126a16keunyoung            return NO_MEMORY;
26588a94683196406b83b14218d1beef66067f126a16keunyoung        }
26598a94683196406b83b14218d1beef66067f126a16keunyoung    }
26608a94683196406b83b14218d1beef66067f126a16keunyoung    return OK;
26618a94683196406b83b14218d1beef66067f126a16keunyoung#undef ADD_OR_SIZE
26628a94683196406b83b14218d1beef66067f126a16keunyoung}
26638a94683196406b83b14218d1beef66067f126a16keunyoung
26648a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::addOrSize(camera_metadata_t *request,
26658a94683196406b83b14218d1beef66067f126a16keunyoung        bool sizeRequest,
26668a94683196406b83b14218d1beef66067f126a16keunyoung        size_t *entryCount,
26678a94683196406b83b14218d1beef66067f126a16keunyoung        size_t *dataCount,
26688a94683196406b83b14218d1beef66067f126a16keunyoung        uint32_t tag,
26698a94683196406b83b14218d1beef66067f126a16keunyoung        const void *entryData,
26708a94683196406b83b14218d1beef66067f126a16keunyoung        size_t entryDataCount) {
26718a94683196406b83b14218d1beef66067f126a16keunyoung    status_t res;
26728a94683196406b83b14218d1beef66067f126a16keunyoung    if (!sizeRequest) {
26738a94683196406b83b14218d1beef66067f126a16keunyoung        return add_camera_metadata_entry(request, tag, entryData,
26748a94683196406b83b14218d1beef66067f126a16keunyoung                entryDataCount);
26758a94683196406b83b14218d1beef66067f126a16keunyoung    } else {
26768a94683196406b83b14218d1beef66067f126a16keunyoung        int type = get_camera_metadata_tag_type(tag);
26778a94683196406b83b14218d1beef66067f126a16keunyoung        if (type < 0 ) return BAD_VALUE;
26788a94683196406b83b14218d1beef66067f126a16keunyoung        (*entryCount)++;
26798a94683196406b83b14218d1beef66067f126a16keunyoung        (*dataCount) += calculate_camera_metadata_entry_data_size(type,
26808a94683196406b83b14218d1beef66067f126a16keunyoung                entryDataCount);
26818a94683196406b83b14218d1beef66067f126a16keunyoung        return OK;
26828a94683196406b83b14218d1beef66067f126a16keunyoung    }
26838a94683196406b83b14218d1beef66067f126a16keunyoung}
26848a94683196406b83b14218d1beef66067f126a16keunyoung
26858a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::isStreamInUse(uint32_t id) {
26868a94683196406b83b14218d1beef66067f126a16keunyoung    // Assumes mMutex is locked; otherwise new requests could enter
26878a94683196406b83b14218d1beef66067f126a16keunyoung    // configureThread while readoutThread is being checked
26888a94683196406b83b14218d1beef66067f126a16keunyoung
26898a94683196406b83b14218d1beef66067f126a16keunyoung    // Order of isStreamInUse calls matters
26908a94683196406b83b14218d1beef66067f126a16keunyoung    if (mConfigureThread->isStreamInUse(id) ||
26918a94683196406b83b14218d1beef66067f126a16keunyoung            mReadoutThread->isStreamInUse(id) ||
26928a94683196406b83b14218d1beef66067f126a16keunyoung            mJpegCompressor->isStreamInUse(id) ) {
26938a94683196406b83b14218d1beef66067f126a16keunyoung        ALOGE("%s: Stream %d is in use in active requests!",
26948a94683196406b83b14218d1beef66067f126a16keunyoung                __FUNCTION__, id);
26958a94683196406b83b14218d1beef66067f126a16keunyoung        return true;
26968a94683196406b83b14218d1beef66067f126a16keunyoung    }
26978a94683196406b83b14218d1beef66067f126a16keunyoung    return false;
26988a94683196406b83b14218d1beef66067f126a16keunyoung}
26998a94683196406b83b14218d1beef66067f126a16keunyoung
27008a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::isReprocessStreamInUse(uint32_t id) {
27018a94683196406b83b14218d1beef66067f126a16keunyoung    // TODO: implement
27028a94683196406b83b14218d1beef66067f126a16keunyoung    return false;
27038a94683196406b83b14218d1beef66067f126a16keunyoung}
27048a94683196406b83b14218d1beef66067f126a16keunyoung
27058a94683196406b83b14218d1beef66067f126a16keunyoungconst Stream& EmulatedFakeCamera2::getStreamInfo(uint32_t streamId) {
27068a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mMutex);
27078a94683196406b83b14218d1beef66067f126a16keunyoung
27088a94683196406b83b14218d1beef66067f126a16keunyoung    return mStreams.valueFor(streamId);
27098a94683196406b83b14218d1beef66067f126a16keunyoung}
27108a94683196406b83b14218d1beef66067f126a16keunyoung
27118a94683196406b83b14218d1beef66067f126a16keunyoungconst ReprocessStream& EmulatedFakeCamera2::getReprocessStreamInfo(uint32_t streamId) {
27128a94683196406b83b14218d1beef66067f126a16keunyoung    Mutex::Autolock lock(mMutex);
27138a94683196406b83b14218d1beef66067f126a16keunyoung
27148a94683196406b83b14218d1beef66067f126a16keunyoung    return mReprocessStreams.valueFor(streamId);
27158a94683196406b83b14218d1beef66067f126a16keunyoung}
27168a94683196406b83b14218d1beef66067f126a16keunyoung
27178a94683196406b83b14218d1beef66067f126a16keunyoung};  /* namespace android */
2718