161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/* 261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * 461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License. 661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at 761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * 861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * 1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and 1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License. 1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */ 1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2-Device" 18852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0 202c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala//#define LOG_NNDEBUG 0 // Per-frame verbose logging 212c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala 222c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#ifdef LOG_NNDEBUG 232c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__) 242c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#else 252c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ((void)0) 262c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#endif 2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 28377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h> 2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Log.h> 30852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#include <utils/Trace.h> 314c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala#include <utils/Timers.h> 3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Device.h" 33f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala#include "CameraService.h" 3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android { 3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 37f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::Camera2Device(int id): 38f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mId(id), 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(NULL) 4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{ 41852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 42c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Created device for camera %d", __FUNCTION__, id); 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Device::~Camera2Device() 4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{ 47852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 488dcdb9553defafa1166c64b496e1ee390e4eadfaIgor Murashkin ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId); 497adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala disconnect(); 5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5271381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera2Device::getId() const { 5371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin return mId; 5471381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin} 5571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 56f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::initialize(camera_module_t *module) 5761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{ 58852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 59c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId); 607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (mHal2Device != NULL) { 617adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGE("%s: Already initialized!", __FUNCTION__); 627adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala return INVALID_OPERATION; 637adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala } 646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala status_t res; 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala char name[10]; 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala snprintf(name, sizeof(name), "%d", mId); 68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 697adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala camera2_device_t *device; 707adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 71f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala res = CameraService::filterOpenErrorCode(module->common.methods->open( 72f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala &module->common, name, reinterpret_cast<hw_device_t**>(&device))); 7361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 7461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala if (res != OK) { 75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__, 76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mId, strerror(-res), res); 7761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return res; 7861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala } 7961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 807adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala if (device->common.version != CAMERA_DEVICE_API_VERSION_2_0) { 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Could not open camera %d: " 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Camera device is not version %x, reports %x instead", 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0, 847adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.version); 857adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.close(&device->common); 8661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return BAD_VALUE; 8761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala } 8861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_info info; 90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = module->get_camera_info(mId, &info); 91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK ) return res; 92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 937adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala if (info.device_version != device->common.version) { 94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: HAL reporting mismatched camera_info version (%x)" 95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala " and device version (%x).", __FUNCTION__, 967adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.version, info.device_version); 977adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.close(&device->common); 98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return BAD_VALUE; 99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1017adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala res = mRequestQueue.setConsumerDevice(device); 1026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 1036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)", 1046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1057adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.close(&device->common); 1066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 1087adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala res = mFrameQueue.setProducerDevice(device); 1096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 1106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to connect frame queue to device: %s (%d)", 1116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1127adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.close(&device->common); 1136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 1146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1167adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala res = device->ops->set_notify_callback(device, notificationCallback, 1177adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala NULL); 1187adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala if (res != OK) { 1197adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to initialize notification callback!", 1207adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala __FUNCTION__, mId); 1217adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala device->common.close(&device->common); 122314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang return res; 123314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang } 1247adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 1257adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device = device; 127204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceVersion = device->common.version; 128160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1327adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvalastatus_t Camera2Device::disconnect() { 133852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 1347adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala status_t res = OK; 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (mHal2Device) { 1367adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("%s: Closing device for camera %d", __FUNCTION__, mId); 1377adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int inProgressCount = mHal2Device->ops->get_in_progress_count(mHal2Device); 1397adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala if (inProgressCount > 0) { 1407adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGW("%s: Closing camera device %d with %d requests in flight!", 1417adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala __FUNCTION__, mId, inProgressCount); 1427adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala } 143c62bb787e53fc4b400219567585b365a5792412cEino-Ville Talvala mReprocessStreams.clear(); 1447adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mStreams.clear(); 1457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->common.close(&mHal2Device->common); 1467adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala if (res != OK) { 1477adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGE("%s: Could not close camera %d: %s (%d)", 1487adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala __FUNCTION__, 1497adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala mId, strerror(-res), res); 1507adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala } 1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device = NULL; 1527adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("%s: Shutdown complete", __FUNCTION__); 1537adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala } 1547adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala return res; 1557adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala} 1567adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala 1573297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) { 158852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 1593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 16097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala int detailLevel = 0; 16197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala int n = args.size(); 16297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala String16 detailOption("-d"); 16397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala for (int i = 0; i + 1 < n; i++) { 16497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala if (args[i] == detailOption) { 16597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala String8 levelStr(args[i+1]); 16697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala detailLevel = atoi(levelStr.string()); 16797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala } 16897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala } 1693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 170603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala result.appendFormat(" Camera2Device[%d] dump (detail level %d):\n", 171603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala mId, detailLevel); 1723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 17397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala if (detailLevel > 0) { 17497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala result = " Request queue contents:\n"; 17597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala write(fd, result.string(), result.size()); 17697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala mRequestQueue.dump(fd, args); 1773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 17897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala result = " Frame queue contents:\n"; 17997197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala write(fd, result.string(), result.size()); 18097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala mFrameQueue.dump(fd, args); 18197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala } 1823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Active streams:\n"; 1843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) { 1863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala (*s)->dump(fd, args); 1873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 1883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " HAL device dump:\n"; 1903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res; 1937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->dump(mHal2Device, fd); 1943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return res; 1963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 1973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 198bd02dd1bf1f34eb4e100d0d058f1fe5a2790d67eIgor Murashkinconst CameraMetadata& Camera2Device::info() const { 1999e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 2006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mDeviceInfo; 2026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 2036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 204cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) { 205852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 207d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 208cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mRequestQueue.enqueue(request.release()); 209d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 210d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 211d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 212cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::captureList(const List<const CameraMetadata> &requests, 213cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 21490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 21590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ALOGE("%s: Camera2Device burst capture not implemented", __FUNCTION__); 21690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 21790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 21890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 219cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::setStreamingRequest(const CameraMetadata &request, 220cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 221852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 2226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala CameraMetadata streamRequest(request); 224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return mRequestQueue.setStreamSlot(streamRequest.release()); 225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 227cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::setStreamingRequestList(const List<const CameraMetadata> &requests, 228cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 22990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 23090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ALOGE("%s, Camera2Device streaming burst not implemented", __FUNCTION__); 23190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 23290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 23390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 234cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::clearStreamingRequest(int64_t* /*lastFrameNumber*/) { 235852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return mRequestQueue.setStreamSlot(NULL); 237f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 238f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 2394c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) { 2404c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ATRACE_CALL(); 2414c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mRequestQueue.waitForDequeue(requestId, timeout); 2424c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 2434c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer, 24528c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He uint32_t width, uint32_t height, int format, int *id) { 246852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala sp<StreamAdapter> stream = new StreamAdapter(mHal2Device); 25128c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He size_t size = 0; 25228c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He if (format == HAL_PIXEL_FORMAT_BLOB) { 25328c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He size = getJpegBufferSize(width, height); 25428c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He } 255d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = stream->connectToDevice(consumer, width, height, format, size); 2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):" 2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", 2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, width, height, format, strerror(-res), res); 2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *id = stream->getId(); 2646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mStreams.push_back(stream); 2666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 2676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 2686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 26928c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun Hessize_t Camera2Device::getJpegBufferSize(uint32_t width, uint32_t height) const { 27028c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He // Always give the max jpeg buffer size regardless of the actual jpeg resolution. 27128c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); 27228c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He if (jpegBufMaxSize.count == 0) { 27328c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId); 27428c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He return BAD_VALUE; 27528c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He } 27628c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He 27728c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He return jpegBufMaxSize.data.i32[0]; 27828c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He} 27928c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He 28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::createReprocessStreamFromStream(int outputId, int *id) { 281852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala bool found = false; 28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala StreamList::iterator streamI; 28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (streamI = mStreams.begin(); 28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if ((*streamI)->getId() == outputId) { 29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala found = true; 29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!found) { 29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Output stream %d doesn't exist; can't create " 29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "reprocess stream from it!", __FUNCTION__, mId, outputId); 29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return BAD_VALUE; 29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala sp<ReprocessStreamAdapter> stream = new ReprocessStreamAdapter(mHal2Device); 30169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 30269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = stream->connectToDevice((*streamI)); 30369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 30469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create reprocessing stream from "\ 30569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "stream %d: %s (%d)", __FUNCTION__, mId, outputId, 30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 30769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *id = stream->getId(); 31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mReprocessStreams.push_back(stream); 31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id, 318d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format) { 319852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 320d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 321d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala bool found = false; 322d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala StreamList::iterator streamI; 323d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala for (streamI = mStreams.begin(); 324d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 325d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if ((*streamI)->getId() == id) { 326d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala found = true; 327d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 328d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 329d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 330d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (!found) { 331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Stream %d does not exist", 332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mId, id); 333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return BAD_VALUE; 334d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 335d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (width) *width = (*streamI)->getWidth(); 337d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (height) *height = (*streamI)->getHeight(); 338d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (format) *format = (*streamI)->getFormat(); 339d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 341d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 342d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 343c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id, 344c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala int transform) { 345852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 346c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 347c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala bool found = false; 348c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala StreamList::iterator streamI; 349c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala for (streamI = mStreams.begin(); 350c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 351c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if ((*streamI)->getId() == id) { 352c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala found = true; 353c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala break; 354c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 355c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 356c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!found) { 357c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Stream %d does not exist", 358c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, mId, id); 359c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 360c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 361c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 362c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return (*streamI)->setTransform(transform); 363c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 364c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) { 366852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala bool found = false; 3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (StreamList::iterator streamI = mStreams.begin(); 3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala streamI != mStreams.end(); streamI++) { 3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if ((*streamI)->getId() == id) { 3729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res = (*streamI)->release(); 3734ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 3749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to release stream %d from HAL device: " 3754ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala "%s (%d)", __FUNCTION__, id, strerror(-res), res); 3764ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 3774ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 3786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mStreams.erase(streamI); 3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala found = true; 3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala break; 3816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 3826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 3836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (!found) { 3846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to find stream %d to delete", 3856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, id); 3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 3876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 3886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 3896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 3906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::deleteReprocessStream(int id) { 392852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala bool found = false; 39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin(); 39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala streamI != mReprocessStreams.end(); streamI++) { 39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if ((*streamI)->getId() == id) { 39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res = (*streamI)->release(); 39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Unable to release reprocess stream %d from " 40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "HAL device: %s (%d)", __FUNCTION__, id, 40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mReprocessStreams.erase(streamI); 40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala found = true; 40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!found) { 41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to find stream %d to delete", 41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mId, id); 41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return BAD_VALUE; 41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 418e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkinstatus_t Camera2Device::configureStreams() { 419e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ATRACE_CALL(); 420e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ALOGV("%s: E", __FUNCTION__); 421e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 422e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin /** 423e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin * HAL2 devices do not need to configure streams; 424e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin * streams are created on the fly. 425e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin */ 426e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ALOGW("%s: No-op for HAL2 devices", __FUNCTION__); 427e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 428e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin return OK; 429e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin} 430e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId, 433cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala CameraMetadata *request) { 434852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 435cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t err; 4366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 437cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *rawRequest; 4387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala err = mHal2Device->ops->construct_default_request( 4397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device, templateId, &rawRequest); 440cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala request->acquire(rawRequest); 441cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return err; 442d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() { 445852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t kSleepTime = 50000; // 50 ms 447d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t kMaxSleepTime = 10000000; // 10 s 4487adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("%s: Camera %d: Starting wait", __FUNCTION__, mId); 449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mRequestQueue.getBufferCount() == 450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION; 451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Set up notifications from HAL, instead of sleeping here 453d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t totalTime = 0; 4547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala while (mHal2Device->ops->get_in_progress_count(mHal2Device) > 0) { 455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala usleep(kSleepTime); 456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala totalTime += kSleepTime; 457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (totalTime > kMaxSleepTime) { 4587adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGE("%s: Waited %d us, %d requests still in flight", __FUNCTION__, 459f0eeb53e4763fe5063d3ce880f72d52f136fc3c5Alex Ray totalTime, mHal2Device->ops->get_in_progress_count(mHal2Device)); 460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return TIMED_OUT; 461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 4637adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala ALOGV("%s: Camera %d: HAL is idle", __FUNCTION__, mId); 464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 4656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 467160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalastatus_t Camera2Device::setNotifyCallback(NotificationListener *listener) { 468852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 469160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala status_t res; 4707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->set_notify_callback(mHal2Device, notificationCallback, 471160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala reinterpret_cast<void*>(listener) ); 472160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala if (res != OK) { 473160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("%s: Unable to set notification callback!", __FUNCTION__); 474160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 475160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala return res; 476160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 477160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 47846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera2Device::willNotify3A() { 47946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala return true; 48046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala} 48146910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Device::notificationCallback(int32_t msg_type, 483160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext1, 484160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext2, 485160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext3, 486160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala void *user) { 487852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 488160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala NotificationListener *listener = reinterpret_cast<NotificationListener*>(user); 489160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type, 490160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ext1, ext2, ext3); 491160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala if (listener != NULL) { 492160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala switch (msg_type) { 493160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_ERROR: 494cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: This needs to be fixed. ext2 and ext3 need to be considered. 495cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei listener->notifyError( 496cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ((ext1 == CAMERA2_MSG_ERROR_DEVICE) 497cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei || (ext1 == CAMERA2_MSG_ERROR_HARDWARE)) ? 498cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE : 499cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE, 500cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras()); 501160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 502160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_SHUTTER: { 503f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // TODO: Only needed for camera2 API, which is unsupported 504f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // by HAL2 directly. 505f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 ); 506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // listener->notifyShutter(requestId, timestamp); 507160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 508160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 509160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOFOCUS: 510160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoFocus(ext1, ext2); 511160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 512160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOEXPOSURE: 513160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoExposure(ext1, ext2); 514160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 515160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOWB: 516160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoWhitebalance(ext1, ext2); 517160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 518160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala default: 519160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!", 520160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, msg_type, ext1, ext2, ext3); 521160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 522160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 523160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 524160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 525c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Device::waitForNextFrame(nsecs_t timeout) { 526c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala return mFrameQueue.waitForBuffer(timeout); 5278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 5288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 529cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::getNextResult(CaptureResult *result) { 530852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 531cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGV("%s: get CaptureResult", __FUNCTION__); 532cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (result == NULL) { 533cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("%s: result pointer is NULL", __FUNCTION__); 534cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 535cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 536cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 537cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *rawFrame; 538cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mFrameQueue.dequeue(&rawFrame); 539cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (rawFrame == NULL) { 540cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NOT_ENOUGH_DATA; 541cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 542cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei result->mMetadata.acquire(rawFrame); 543cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 544cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 545cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 5468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 5478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 548174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerAutofocus(uint32_t id) { 549852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 550174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 551174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->trigger_action(mHal2Device, 553174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_AUTOFOCUS, id, 0); 554174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 555174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error triggering autofocus (id %d)", 556174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 557174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 558174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 559174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 560174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 561174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerCancelAutofocus(uint32_t id) { 562852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 563174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 564174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id); 5657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->trigger_action(mHal2Device, 566174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0); 567174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 568174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error canceling autofocus (id %d)", 569174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 570174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 571174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 572174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 573174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 574174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerPrecaptureMetering(uint32_t id) { 575852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 576174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 577174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 5787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->trigger_action(mHal2Device, 579174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0); 580174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 581174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error triggering precapture metering (id %d)", 582174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 583174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 584174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 585174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 586174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::pushReprocessBuffer(int reprocessStreamId, 58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 589852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 59069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 59169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala bool found = false; 59269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res = OK; 59369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin(); 59469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala streamI != mReprocessStreams.end(); streamI++) { 59569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if ((*streamI)->getId() == reprocessStreamId) { 59669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = (*streamI)->pushIntoStream(buffer, listener); 59769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 59869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Unable to push buffer to reprocess stream %d: %s (%d)", 59969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, reprocessStreamId, strerror(-res), res); 60069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 60169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 60269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala found = true; 60369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 60469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 60569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 60669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!found) { 60769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to find reprocess stream %d", 60869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mId, reprocessStreamId); 60969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = BAD_VALUE; 61069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 61269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 614cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera2Device::flush(int64_t* /*lastFrameNumber*/) { 615abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ATRACE_CALL(); 616abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 617abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRequestQueue.clear(); 618abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return waitUntilDrained(); 619abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 620abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 621204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun Heuint32_t Camera2Device::getDeviceVersion() { 622204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ATRACE_CALL(); 623204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return mDeviceVersion; 624204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He} 625204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 626160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala/** 627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue 628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */ 629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue(): 6317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(NULL), 632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount(0), 6334c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mLatestRequestId(0), 634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount(0), 635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount(0), 636c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mSignalConsumer(true) 637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 638852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::dequeue_request = consumer_dequeue; 640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::request_count = consumer_buffer_count; 641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::free_request = consumer_free; 642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue; 644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::cancel_frame = producer_cancel; 645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue; 646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() { 649852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 650abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala clear(); 651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing) 6546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) { 655852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_request_queue_src_ops(d, 6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 6596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) return res; 6607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device = d; 6616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) { 665852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_frame_queue_dst_ops(d, 6686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 6696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces 673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) { 674852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6752c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount++; 679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(buf); 680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() { 685852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS; 689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return mCount; 691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf, 694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool incrementCount) 695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 696852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6972c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 6986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mCount == 0) { 702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 0) { 7032c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Empty", __FUNCTION__); 704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = NULL; 705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mSignalConsumer = true; 706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 7082c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__, 709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount); 710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin(); 712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry != mStreamSlot.end(); 713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry++ ) { 714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries = get_camera_metadata_entry_count(*slotEntry); 715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t dataBytes = get_camera_metadata_data_count(*slotEntry); 716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *copy = 718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, dataBytes); 719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala append_camera_metadata(copy, *slotEntry); 720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(copy); 721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount = mStreamSlotCount; 723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 7242c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("MetadataQueue: deque (%d buffers)", mCount); 725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *b = *(mEntries.begin()); 726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.erase(mEntries.begin()); 727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (incrementCount) { 729852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_INT("cam2_request", mFrameCount); 7306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera_metadata_entry_t frameCount; 7316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = find_camera_metadata_entry(b, 732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_REQUEST_FRAME_COUNT, 7336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &frameCount); 7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to add frame count: %s (%d)", 7366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 7376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 7386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *frameCount.data.i32 = mFrameCount; 7396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount++; 741f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 7434c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala // Check for request ID, and if present, signal waiters. 7444c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala camera_metadata_entry_t requestId; 7454c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = find_camera_metadata_entry(b, 7464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ANDROID_REQUEST_ID, 7474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala &requestId); 7484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res == OK) { 7494c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mLatestRequestId = requestId.data.i32[0]; 7504c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mNewRequestId.signal(); 7514c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 7524c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = b; 754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount--; 755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 75661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return OK; 75761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 75861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout) 760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (mCount == 0) { 764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = notEmpty.waitRelative(mMutex,timeout); 765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) return res; 766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 7704c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForDequeue(int32_t id, 7714c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala nsecs_t timeout) { 7724c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala Mutex::Autolock l(mMutex); 7734c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t res; 7744c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala while (mLatestRequestId != id) { 7754c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala nsecs_t startTime = systemTime(); 7764c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 7774c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mNewRequestId.waitRelative(mMutex, timeout); 7784c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) return res; 7794c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 7804c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala timeout -= (systemTime() - startTime); 7814c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 7824c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 7834c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return OK; 7844c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 7854c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf) 787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 788852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 7896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (buf == NULL) { 792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 0; 794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 795f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 7966ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 1) { 798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin(); 799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(++mStreamSlot.begin(), mStreamSlot.end()); 800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 1) { 803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata( *(mStreamSlot.begin()) ); 80480de5dca0b8e04f81da0d15dff957f82551eaafcChien-Yu Chen *(mStreamSlot.begin()) = buf; 805f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 80680de5dca0b8e04f81da0d15dff957f82551eaafcChien-Yu Chen mStreamSlot.push_front(buf); 807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 808f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 8096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 812f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot( 813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const List<camera_metadata_t*> &bufs) 814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 815852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 8166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 8186ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 8226ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount = 0; 8236ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala for (List<camera_metadata_t*>::const_iterator r = bufs.begin(); 8246ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala r != bufs.end(); r++) { 82580de5dca0b8e04f81da0d15dff957f82551eaafcChien-Yu Chen mStreamSlot.push_back(*r); 8266ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount++; 8276ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 8286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 8296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 831abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::clear() 832abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala{ 833abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ATRACE_CALL(); 834abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 835abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 836abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Mutex::Autolock l(mMutex); 837abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 838abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala // Clear streaming slot 839abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 840abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mStreamSlotCount = 0; 841abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 842abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala // Clear request queue 843abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala freeBuffers(mEntries.begin(), mEntries.end()); 844abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mCount = 0; 845abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return OK; 846abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 847abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 8483297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd, 849ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const Vector<String16>& /*args*/) { 850852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 8513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 8523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t notLocked; 8533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala notLocked = mMutex.tryLock(); 8543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked) { 8553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" (Unable to lock queue mutex)\n"); 8563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Current frame number: %d\n", mFrameCount); 8583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mStreamSlotCount == 0) { 8593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Stream slot: Empty\n"); 8603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 8613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 862377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT result.appendFormat(" Stream slot: %zu entries\n", 8633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mStreamSlot.size()); 8643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 8653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin(); 8663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mStreamSlot.end(); r++) { 8673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Stream slot buffer %d:\n", i); 8683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 869428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 8703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 8713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mEntries.size() == 0) { 8743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Main queue is empty\n"; 8753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 8763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 877377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT result = String8::format(" Main queue has %zu entries:\n", 8783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mEntries.size()); 8793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 8803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mEntries.begin(); 8813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mEntries.end(); r++) { 8823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Queue entry %d:\n", i); 8833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 884428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 8853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 8863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked == 0) { 8903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMutex.unlock(); 8913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 8943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 8953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() { 897852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 8986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res = OK; 8996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala notEmpty.signal(); 9007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (mSignalConsumer && mHal2Device != NULL) { 9016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mSignalConsumer = false; 9026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.unlock(); 9046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: Signaling consumer", __FUNCTION__); 9057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->notify_request_queue_not_empty(mHal2Device); 9066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.lock(); 9076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers( 912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator start, 913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator end) 914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 915852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (start != end) { 917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(*start); 918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala start = mStreamSlot.erase(start); 919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 931f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q) 932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count( 938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->getBufferCount(); 942f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue( 945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->dequeue(buffer, true); 950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free( 953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 956852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 958ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin (void)queue; 959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 962f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 963f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue( 964ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const camera2_frame_queue_dst_ops_t * /*q*/, 965f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries, size_t bytes, 966f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 968852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 969f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *new_buffer = 970f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, bytes); 971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buffer = new_buffer; 973f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 974f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel( 977ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const camera2_frame_queue_dst_ops_t * /*q*/, 978f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 979f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 980852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 981f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 982f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 985f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue( 986f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 987f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *filled_buffer) 988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 989f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 990f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->enqueue(filled_buffer); 991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 9936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/** 9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter 9956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */ 9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of 9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \ 9996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif 10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d): 10039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState(RELEASED), 10047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(d), 10056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId(-1), 10063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0), 10073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMaxProducerBuffers(0), mMaxConsumerBuffers(0), 10083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers(0), 10093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFormatRequested(0), 10103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers(0), 10113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount(0), 10123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp(0) 10136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{ 10146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 10156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 10166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 10186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() { 1021852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 10229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) { 10239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala release(); 10249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 10266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1027d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice( 1028d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ANativeWindow> consumer, 1029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size) { 1030852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 10316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 10329e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 10336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) return INVALID_OPERATION; 10356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (consumer == NULL) { 10366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__); 10376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 10386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1040e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %zu", 10419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, width, height, format, size); 10429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mConsumerInterface = consumer; 10446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth = width; 10456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mHeight = height; 1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0; 10476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormatRequested = format; 10486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Allocate device-side stream interface 10506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t id; 10526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t formatActual; 10536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t usage; 10546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t maxBuffers = 2; 10557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->allocate_stream(mHal2Device, 10566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth, mHeight, mFormatRequested, getStreamOps(), 10576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 10586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 10606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 10616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Allocated stream id %d, actual format 0x%x, " 10659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "usage 0x%x, producer wants %d buffers", __FUNCTION__, 10669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala id, formatActual, usage, maxBuffers); 10679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = id; 10696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormat = formatActual; 10706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mUsage = usage; 10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 10726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ALLOCATED; 10746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Configure consumer-side ANativeWindow interface 10766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 10776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 10786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 10806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 10816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = CONNECTED; 10866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 10886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 10906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mUsage, mId); 10916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1094bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala res = native_window_set_scaling_mode(mConsumerInterface.get(), 1095bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 1096bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 1097bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Unable to configure stream scaling: %s (%d)", 1098bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 1099bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 1100bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1101bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 1102c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = setTransform(0); 1103bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 1104bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 1105bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1106bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 1107d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mFormat == HAL_PIXEL_FORMAT_BLOB) { 11087d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala res = native_window_set_buffers_dimensions(mConsumerInterface.get(), 11097d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala mSize, 1); 1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 11117d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala ALOGE("%s: Unable to configure compressed stream buffer dimensions" 1112e5729fac81c8a984e984fefc90afc64135817d4fColin Cross " %d x %d, size %zu for stream %d", 1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mSize, mId); 1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } else { 11177d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala res = native_window_set_buffers_dimensions(mConsumerInterface.get(), 11187d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala mWidth, mHeight); 1119d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 11207d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala ALOGE("%s: Unable to configure stream buffer dimensions" 11217d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala " %d x %d for stream %d", 11227d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala __FUNCTION__, mWidth, mHeight, mId); 1123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1124d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 11256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11277d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala res = native_window_set_buffers_format(mConsumerInterface.get(), mFormat); 11287d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala if (res != OK) { 11297d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala ALOGE("%s: Unable to configure stream buffer format" 11307d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala " %#x for stream %d", 11317d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala __FUNCTION__, mFormat, mId); 11327d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala return res; 11337d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala } 11347d70c5e5fe787ae5d7af8830864d208749d6337fEino-Ville Talvala 11356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int maxConsumerBuffers; 11366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 11376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 11386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 11406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 11416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 11426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 11446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Consumer wants %d buffers", __FUNCTION__, 11469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mMaxConsumerBuffers); 11476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 11493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers = 0; 11503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount = 0; 11513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp = 0; 11526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 11543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers); 11556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 11576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 11586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 11596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Register allocated buffers with HAL device 11623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers]; 11633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers]; 11643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala uint32_t bufferIdx = 0; 11653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (; bufferIdx < mTotalBuffers; bufferIdx++) { 11661e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(), 11676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &anwBuffers[bufferIdx]); 11686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for " 11706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 11716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala goto cleanUpBuffers; 11726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 117569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)buffers[bufferIdx]); 11766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1178750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers); 11797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->register_stream_buffers(mHal2Device, 11806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId, 11813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, 11826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers); 11836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 11856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 11866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 11876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ACTIVE; 11886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers: 1191750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx); 11923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (uint32_t i = 0; i < bufferIdx; i++) { 11936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 11941e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis anwBuffers[i], -1); 11956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to cancel buffer %d after registration", 11976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, i); 11986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] anwBuffers; 12013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] buffers; 12026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 12046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() { 1207852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 120902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGV("%s: Releasing stream %d (%d x %d, format %d)", __FUNCTION__, mId, 121002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala mWidth, mHeight, mFormat); 12116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= ALLOCATED) { 12127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->release_stream(mHal2Device, mId); 12136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 12146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 12156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 12166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 12176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= CONNECTED) { 12206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 12216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 1222a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin 1223a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin /* this is not an error. if client calling process dies, 1224a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin the window will also die and all calls to it will return 1225a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin DEAD_OBJECT, thus it's already "disconnected" */ 1226a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin if (res == DEAD_OBJECT) { 1227a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin ALOGW("%s: While disconnecting stream %d from native window, the" 1228a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin " native window died from under us", __FUNCTION__, mId); 1229a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin } 1230a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin else if (res != OK) { 1231a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin ALOGE("%s: Unable to disconnect stream %d from native window (error %d %s)", 1232a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin __FUNCTION__, mId, res, strerror(-res)); 12336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 12346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = -1; 12379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RELEASED; 12386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 12396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1241c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) { 1242852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 1243c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala status_t res; 1244c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (mState < CONNECTED) { 1245c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__); 1246c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return INVALID_OPERATION; 1247c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1248c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = native_window_set_buffers_transform(mConsumerInterface.get(), 1249c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala transform); 1250c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 1251c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Unable to configure stream transform to %x: %s (%d)", 1252c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, transform, strerror(-res), res); 1253c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1254c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 1255c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 1256c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 12573297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd, 1258ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const Vector<String16>& /*args*/) { 1259852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result = String8::format(" Stream %d: %d x %d, format 0x%x\n", 12613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mId, mWidth, mHeight, mFormat); 1262377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT result.appendFormat(" size %zu, usage 0x%x, requested format 0x%x\n", 12633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mSize, mUsage, mFormatRequested); 12643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" total buffers: %d, dequeued buffers: %d\n", 12653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, mActiveBuffers); 1266377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT result.appendFormat(" frame count: %d, last timestamp %" PRId64 "\n", 12673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount, mLastTimestamp); 12683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 12693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 12703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 12713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 12726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() { 12736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 12746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW( 12776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const camera2_stream_ops_t *w) { 12786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get(); 12796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w, 12826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t** buffer) { 1283852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int res; 12853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter* stream = 12863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 12873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 12883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 12896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 12906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 12936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindowBuffer* anb; 12941e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(a, &anb); 1295750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala if (res != OK) { 1296750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId, 1297750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala strerror(-res), res); 1298750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala return res; 1299750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala } 13006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 13016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *buffer = &(anb->handle); 13023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers++; 13033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1304750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer)); 13056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 13066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 13076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 13086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w, 13096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int64_t timestamp, 13106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 1311852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 13123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 13133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 1314228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala stream->mFrameCount++; 1315228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGVV("Stream %d enqueue: Frame %d (%p) captured at %lld ns", 1316a289bf696e4b49e0a726fd07914f9dc178653efcJames Dong stream->mId, stream->mFrameCount, (void*)(*buffer), timestamp); 1317bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala int state = stream->mState; 13186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 13196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 13206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 13216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 13226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 13236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t err; 1324228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 13256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 1326bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 1327bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error setting timestamp on native window: %s (%d)", 1328bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 1329bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return err; 1330bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1331bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala err = a->queueBuffer(a, 13321e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 1333bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 1334bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error queueing buffer to native window: %s (%d)", 1335bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 133631d377b7622279034326fbd8b9803a738a39fb30James Dong return err; 1337bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 133831d377b7622279034326fbd8b9803a738a39fb30James Dong 13393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers--; 13403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mLastTimestamp = timestamp; 134131d377b7622279034326fbd8b9803a738a39fb30James Dong return OK; 13426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 13436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 13446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w, 13456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 1346852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 13473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 13483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 1349750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d cancel: Buffer %p", 1350750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala stream->mId, (void*)(*buffer)); 13513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 13523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 13536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 13546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 135531d377b7622279034326fbd8b9803a738a39fb30James Dong 13566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 135731d377b7622279034326fbd8b9803a738a39fb30James Dong int err = a->cancelBuffer(a, 13581e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 135931d377b7622279034326fbd8b9803a738a39fb30James Dong if (err != OK) { 136031d377b7622279034326fbd8b9803a738a39fb30James Dong ALOGE("%s: Error canceling buffer to native window: %s (%d)", 136131d377b7622279034326fbd8b9803a738a39fb30James Dong __FUNCTION__, strerror(-err), err); 136231d377b7622279034326fbd8b9803a738a39fb30James Dong return err; 136331d377b7622279034326fbd8b9803a738a39fb30James Dong } 136431d377b7622279034326fbd8b9803a738a39fb30James Dong 136531d377b7622279034326fbd8b9803a738a39fb30James Dong stream->mActiveBuffers--; 136631d377b7622279034326fbd8b9803a738a39fb30James Dong return OK; 13676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 13686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 13696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w, 13706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int left, int top, int right, int bottom) { 1371852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 13726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 13736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 13746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 13756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 13766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 13776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 13786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 13796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return native_window_set_crop(a, &crop); 13806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 13816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 138269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** 138369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Camera2Device::ReprocessStreamAdapter 138469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 138569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 138669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#ifndef container_of 138769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define container_of(ptr, type, member) \ 138869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 138969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#endif 139069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 139169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::ReprocessStreamAdapter(camera2_device_t *d): 139269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mState(RELEASED), 13937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(d), 139469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mId(-1), 139569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mWidth(0), mHeight(0), mFormat(0), 139669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mActiveBuffers(0), 139769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFrameCount(0) 139869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 1399852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 140069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera2_stream_in_ops::acquire_buffer = acquire_buffer; 140169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera2_stream_in_ops::release_buffer = release_buffer; 140269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 140369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 140469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::~ReprocessStreamAdapter() { 1405852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 140669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mState != RELEASED) { 140769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala release(); 140869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 140969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 141069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 141169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::connectToDevice( 141269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const sp<StreamAdapter> &outputStream) { 1413852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 141469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 141569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 141669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 141769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mState != RELEASED) return INVALID_OPERATION; 141869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (outputStream == NULL) { 141969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Null base stream passed to reprocess stream adapter", 142069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__); 142169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return BAD_VALUE; 142269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 142369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 142469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBaseStream = outputStream; 142569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mWidth = outputStream->getWidth(); 142669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mHeight = outputStream->getHeight(); 142769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFormat = outputStream->getFormat(); 142869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 142969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: New reprocess stream parameters %d x %d, format 0x%x", 143069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat); 143169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 143269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Allocate device-side stream interface 143369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 143469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala uint32_t id; 14357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->allocate_reprocess_stream_from_stream(mHal2Device, 143669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStream->getId(), getStreamOps(), 143769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &id); 143869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 143969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Device reprocess stream allocation failed: %s (%d)", 144069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 144169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 144269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 144369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 144469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Allocated reprocess stream id %d based on stream %d", 144569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, id, outputStream->getId()); 144669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 144769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mId = id; 144869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 144969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mState = ACTIVE; 145069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 145169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 145269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 145369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 145469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::release() { 1455852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 145669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 145769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Releasing stream %d", __FUNCTION__, mId); 145869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mState >= ACTIVE) { 14597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->release_reprocess_stream(mHal2Device, mId); 146069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 146169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Unable to release stream %d", 146269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mId); 146369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 146469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 146569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 146669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 146769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala List<QueueEntry>::iterator s; 146869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (s = mQueue.begin(); s != mQueue.end(); s++) { 146969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferReleasedListener> listener = s->releaseListener.promote(); 147069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (listener != 0) listener->onBufferReleased(s->handle); 147169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 147269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (s = mInFlightQueue.begin(); s != mInFlightQueue.end(); s++) { 147369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferReleasedListener> listener = s->releaseListener.promote(); 147469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (listener != 0) listener->onBufferReleased(s->handle); 147569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 147669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mQueue.clear(); 147769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mInFlightQueue.clear(); 147869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 147969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mState = RELEASED; 148069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 148169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 148269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 148369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::pushIntoStream( 148469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t *handle, const wp<BufferReleasedListener> &releaseListener) { 1485852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 148669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Some error checking here would be nice 148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Pushing buffer %p to stream", __FUNCTION__, (void*)(*handle)); 148869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 148969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala QueueEntry entry; 149069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry.handle = handle; 149169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry.releaseListener = releaseListener; 149269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mQueue.push_back(entry); 149369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 149569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::dump(int fd, 1497ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const Vector<String16>& /*args*/) { 1498852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result = 150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8::format(" Reprocess stream %d: %d x %d, fmt 0x%x\n", 150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mId, mWidth, mHeight, mFormat); 150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" acquired buffers: %d\n", 150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mActiveBuffers); 150469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" frame count: %d\n", 150569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFrameCount); 150669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 150769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 150869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 151069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst camera2_stream_in_ops *Camera2Device::ReprocessStreamAdapter::getStreamOps() { 151169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return static_cast<camera2_stream_in_ops *>(this); 151269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 151369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 151469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::acquire_buffer( 151569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const camera2_stream_in_ops_t *w, 151669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t** buffer) { 1517852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 1518ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin 151969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ReprocessStreamAdapter* stream = 152069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const_cast<ReprocessStreamAdapter*>( 152169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala static_cast<const ReprocessStreamAdapter*>(w)); 152269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (stream->mState != ACTIVE) { 152369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 152469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 152569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 152669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 152769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (stream->mQueue.empty()) { 152869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *buffer = NULL; 152969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 153069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 153169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 153269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala QueueEntry &entry = *(stream->mQueue.begin()); 153369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 153469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *buffer = entry.handle; 153569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 153669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mInFlightQueue.push_back(entry); 153769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mQueue.erase(stream->mQueue.begin()); 153869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 153969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mActiveBuffers++; 154069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 154169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("Stream %d acquire: Buffer %p acquired", stream->mId, 154269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala (void*)(**buffer)); 154369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 154469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 154569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 154669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::release_buffer( 154769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const camera2_stream_in_ops_t* w, 154869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t* buffer) { 1549852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 155069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ReprocessStreamAdapter *stream = 155169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const_cast<ReprocessStreamAdapter*>( 155269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala static_cast<const ReprocessStreamAdapter*>(w) ); 155369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mFrameCount++; 155469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("Reprocess stream %d release: Frame %d (%p)", 155569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mId, stream->mFrameCount, (void*)*buffer); 155669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int state = stream->mState; 155769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (state != ACTIVE) { 155869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 155969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 156069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 156169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mActiveBuffers--; 156269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 156369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala List<QueueEntry>::iterator s; 156469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (s = stream->mInFlightQueue.begin(); s != stream->mInFlightQueue.end(); s++) { 156569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if ( s->handle == buffer ) break; 156669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 156769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (s == stream->mInFlightQueue.end()) { 156869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Can't find buffer %p in in-flight list!", __FUNCTION__, 156969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer); 157069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 157169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 157269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 157369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferReleasedListener> listener = s->releaseListener.promote(); 157469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (listener != 0) { 157569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala listener->onBufferReleased(s->handle); 157669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 157769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Can't free buffer - missing listener", __FUNCTION__); 157869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 157969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mInFlightQueue.erase(s); 158069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 158169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 158269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 158361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 158461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android 1585