Camera2Device.cpp revision 750d74b0b64470dccdb7310bf33e0d0e582f2059
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 1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Device" 1861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0 192c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala//#define LOG_NNDEBUG 0 // Per-frame verbose logging 202c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala 212c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#ifdef LOG_NNDEBUG 222c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__) 232c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#else 242c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ((void)0) 252c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#endif 2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Log.h> 2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Device.h" 2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android { 3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 32f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::Camera2Device(int id): 33f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mId(id), 3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala mDevice(NULL) 3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{ 366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Device::~Camera2Device() 4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{ 416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala if (mDevice) { 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala status_t res; 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala res = mDevice->common.close(&mDevice->common); 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala if (res != OK) { 46f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Could not close camera %d: %s (%d)", 47f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, 48f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mId, strerror(-res), res); 4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala } 50f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = NULL; 5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala } 5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::initialize(camera_module_t *module) 5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{ 566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala status_t res; 59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala char name[10]; 60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala snprintf(name, sizeof(name), "%d", mId); 61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = module->common.methods->open(&module->common, name, 6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala reinterpret_cast<hw_device_t**>(&mDevice)); 6461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala if (res != OK) { 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__, 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mId, strerror(-res), res); 6861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return res; 6961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala } 7061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 7161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala if (mDevice->common.version != CAMERA_DEVICE_API_VERSION_2_0) { 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: Could not open camera %d: " 73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala "Camera device is not version %x, reports %x instead", 74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0, 75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice->common.version); 7661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return BAD_VALUE; 7761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala } 7861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_info info; 80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = module->get_camera_info(mId, &info); 81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK ) return res; 82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (info.device_version != mDevice->common.version) { 84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ALOGE("%s: HAL reporting mismatched camera_info version (%x)" 85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala " and device version (%x).", __FUNCTION__, 86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice->common.version, info.device_version); 87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return BAD_VALUE; 88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mRequestQueue.setConsumerDevice(mDevice); 936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)", 956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mFrameQueue.setProducerDevice(mDevice); 996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 1006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to connect frame queue to device: %s (%d)", 1016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 1036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = mDevice->ops->get_metadata_vendor_tag_ops(mDevice, &mVendorTagOps); 1066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK ) { 1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to retrieve tag ops from device: %s (%d)", 1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 1106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1153297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) { 1163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 1183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Camera2Device[%d] dump:\n", mId); 1203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Static camera information metadata:\n"); 1223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 123428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(mDeviceInfo, fd, 2, 6); 1243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Request queue contents:\n"; 1263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mRequestQueue.dump(fd, args); 1283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Frame queue contents:\n"; 1303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameQueue.dump(fd, args); 1323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Active streams:\n"; 1343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) { 1363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala (*s)->dump(fd, args); 1373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 1383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " HAL device dump:\n"; 1403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res; 1433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala res = mDevice->ops->dump(mDevice, fd); 1443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return res; 1463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 1473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalacamera_metadata_t *Camera2Device::info() { 1499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 1506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mDeviceInfo; 1526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 1536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::capture(camera_metadata_t* request) { 155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 156d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 157d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mRequestQueue.enqueue(request); 158d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 159d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 160d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 161d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 162d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::setStreamingRequest(camera_metadata_t* request) { 1636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 1646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mRequestQueue.setStreamSlot(request); 166f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer, 170d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, int *id) { 1716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 1726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<StreamAdapter> stream = new StreamAdapter(mDevice); 1756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 176d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = stream->connectToDevice(consumer, width, height, format, size); 1776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 1786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):" 1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", 1806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, width, height, format, strerror(-res), res); 1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 1836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *id = stream->getId(); 1856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mStreams.push_back(stream); 1876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 190d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id, 191d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format) { 192d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 193d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala bool found = false; 194d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala StreamList::iterator streamI; 195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala for (streamI = mStreams.begin(); 196d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 197d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if ((*streamI)->getId() == id) { 198d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala found = true; 199d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 201d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 202d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (!found) { 203d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Stream %d does not exist", 204d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mId, id); 205d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return BAD_VALUE; 206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 207d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 208d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (width) *width = (*streamI)->getWidth(); 209d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (height) *height = (*streamI)->getHeight(); 210d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (format) *format = (*streamI)->getFormat(); 211d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 212d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 213d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 214d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 215c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id, 216c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala int transform) { 217c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 218c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala bool found = false; 219c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala StreamList::iterator streamI; 220c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala for (streamI = mStreams.begin(); 221c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 222c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if ((*streamI)->getId() == id) { 223c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala found = true; 224c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala break; 225c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 226c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 227c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!found) { 228c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Stream %d does not exist", 229c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, mId, id); 230c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 231c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 232c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 233c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return (*streamI)->setTransform(transform); 234c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 235c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) { 2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 2386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala bool found = false; 2396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (StreamList::iterator streamI = mStreams.begin(); 2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala streamI != mStreams.end(); streamI++) { 2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if ((*streamI)->getId() == id) { 2429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res = (*streamI)->release(); 2434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 2449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to release stream %d from HAL device: " 2454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala "%s (%d)", __FUNCTION__, id, strerror(-res), res); 2464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 2474ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mStreams.erase(streamI); 2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala found = true; 2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala break; 2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (!found) { 2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to find stream %d to delete", 2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, id); 2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId, 2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera_metadata_t **request) { 2636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 264d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return mDevice->ops->construct_default_request( 265d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice, templateId, request); 266d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 267d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 268d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() { 269d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t kSleepTime = 50000; // 50 ms 270d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t kMaxSleepTime = 10000000; // 10 s 2719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 272d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mRequestQueue.getBufferCount() == 273d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION; 274d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 275d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Set up notifications from HAL, instead of sleeping here 276d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t totalTime = 0; 277d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala while (mDevice->ops->get_in_progress_count(mDevice) > 0) { 278d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala usleep(kSleepTime); 279d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala totalTime += kSleepTime; 280d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (totalTime > kMaxSleepTime) { 281d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Waited %d us, requests still in flight", __FUNCTION__, 282d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala totalTime); 283d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return TIMED_OUT; 284d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 285d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 286d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 2886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala/** 290f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue 291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */ 292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue(): 294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice(NULL), 295f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount(0), 296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount(0), 297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount(0), 298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mSignalConsumer(true) 299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::dequeue_request = consumer_dequeue; 301f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::request_count = consumer_buffer_count; 302f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::free_request = consumer_free; 303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue; 305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::cancel_frame = producer_cancel; 306f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue; 307f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 308f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() { 310f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 311f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mEntries.begin(), mEntries.end()); 312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 313f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing) 3166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) { 3176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 3186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_request_queue_src_ops(d, 3196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 3206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) return res; 321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = d; 3226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) { 3266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 3276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_frame_queue_dst_ops(d, 3286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 3296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces 333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) { 3342c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount++; 338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(buf); 339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 3406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() { 344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS; 347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 348f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return mCount; 349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 350f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf, 352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool incrementCount) 353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 3542c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 3556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mCount == 0) { 359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 0) { 3602c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Empty", __FUNCTION__); 361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = NULL; 362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mSignalConsumer = true; 363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3652c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__, 366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount); 367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin(); 369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry != mStreamSlot.end(); 370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry++ ) { 371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries = get_camera_metadata_entry_count(*slotEntry); 372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t dataBytes = get_camera_metadata_data_count(*slotEntry); 373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *copy = 375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, dataBytes); 376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala append_camera_metadata(copy, *slotEntry); 377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(copy); 378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount = mStreamSlotCount; 380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 3812c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("MetadataQueue: deque (%d buffers)", mCount); 382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *b = *(mEntries.begin()); 383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.erase(mEntries.begin()); 384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (incrementCount) { 3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera_metadata_entry_t frameCount; 3876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = find_camera_metadata_entry(b, 388f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_REQUEST_FRAME_COUNT, 3896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &frameCount); 3906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 3916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to add frame count: %s (%d)", 3926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 3936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 3946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *frameCount.data.i32 = mFrameCount; 3956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount++; 397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = b; 400f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount--; 401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 40261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return OK; 40361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 40461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout) 406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (mCount == 0) { 410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = notEmpty.waitRelative(mMutex,timeout); 411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) return res; 412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf) 417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 4186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (buf == NULL) { 421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 0; 423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 4256ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala camera_metadata_t *buf2 = clone_camera_metadata(buf); 4266ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala if (!buf2) { 4276ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__); 4286ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala return NO_MEMORY; 4296ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 4306ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 1) { 432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin(); 433f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(++mStreamSlot.begin(), mStreamSlot.end()); 434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 1) { 437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata( *(mStreamSlot.begin()) ); 4386ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala *(mStreamSlot.begin()) = buf2; 439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 4406ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlot.push_front(buf2); 441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 4436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot( 447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const List<camera_metadata_t*> &bufs) 448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 4516ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala status_t res; 4526ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 4566ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount = 0; 4576ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala for (List<camera_metadata_t*>::const_iterator r = bufs.begin(); 4586ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala r != bufs.end(); r++) { 4596ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala camera_metadata_t *r2 = clone_camera_metadata(*r); 4606ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala if (!r2) { 4616ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__); 4626ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala return NO_MEMORY; 4636ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 4646ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlot.push_back(r2); 4656ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount++; 4666ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 4676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 4703297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd, 4713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const Vector<String16>& args) { 4723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 4733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t notLocked; 4743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala notLocked = mMutex.tryLock(); 4753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked) { 4763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" (Unable to lock queue mutex)\n"); 4773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 4783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Current frame number: %d\n", mFrameCount); 4793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mStreamSlotCount == 0) { 4803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Stream slot: Empty\n"); 4813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 4823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 4833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Stream slot: %d entries\n", 4843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mStreamSlot.size()); 4853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 4863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin(); 4873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mStreamSlot.end(); r++) { 4883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Stream slot buffer %d:\n", i); 4893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 490428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 4913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 4923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 4933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 4943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mEntries.size() == 0) { 4953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Main queue is empty\n"; 4963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 4973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 4983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Main queue has %d entries:\n", 4993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mEntries.size()); 5003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 5013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mEntries.begin(); 5023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mEntries.end(); r++) { 5033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Queue entry %d:\n", i); 5043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 505428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 5063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 5073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 5083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 5093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 5103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked == 0) { 5113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMutex.unlock(); 5123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 5133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 5143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 5153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 5163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() { 5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res = OK; 5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala notEmpty.signal(); 5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mSignalConsumer && mDevice != NULL) { 5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mSignalConsumer = false; 5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.unlock(); 5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: Signaling consumer", __FUNCTION__); 5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->notify_request_queue_not_empty(mDevice); 5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.lock(); 5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers( 532f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator start, 533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator end) 534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (start != end) { 536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(*start); 537f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala start = mStreamSlot.erase(start); 538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q) 551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count( 557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->getBufferCount(); 561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue( 564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->dequeue(buffer, true); 569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free( 572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 576f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue( 581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries, size_t bytes, 583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *new_buffer = 586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, bytes); 587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buffer = new_buffer; 589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel( 593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue( 601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 602f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *filled_buffer) 603f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->enqueue(filled_buffer); 606f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/** 6096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter 6106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */ 6116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of 6136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \ 6146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 6156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif 6166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d): 6189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState(RELEASED), 6196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice(d), 6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId(-1), 6213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0), 6223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMaxProducerBuffers(0), mMaxConsumerBuffers(0), 6233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers(0), 6243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFormatRequested(0), 6253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers(0), 6263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount(0), 6273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp(0) 6286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{ 6296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 6306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 6316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 6326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 6336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 6346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() { 6369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) { 6379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala release(); 6389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 6396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 6406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice( 642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ANativeWindow> consumer, 643d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size) { 6446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 6459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 6466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) return INVALID_OPERATION; 6486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (consumer == NULL) { 6496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__); 6506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %d", 6549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, width, height, format, size); 6559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mConsumerInterface = consumer; 6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth = width; 6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mHeight = height; 659d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0; 6606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormatRequested = format; 6616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Allocate device-side stream interface 6636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t id; 6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t formatActual; 6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t usage; 6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t maxBuffers = 2; 6686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->allocate_stream(mDevice, 6696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth, mHeight, mFormatRequested, getStreamOps(), 6706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 6716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 6726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 6736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Allocated stream id %d, actual format 0x%x, " 6789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "usage 0x%x, producer wants %d buffers", __FUNCTION__, 6799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala id, formatActual, usage, maxBuffers); 6809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = id; 6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormat = formatActual; 6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mUsage = usage; 6846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 6856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ALLOCATED; 6876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Configure consumer-side ANativeWindow interface 6896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 6906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 6916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 6926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 6936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 6946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 6966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = CONNECTED; 6996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 7016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 7036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mUsage, mId); 7046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 7056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 707bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala res = native_window_set_scaling_mode(mConsumerInterface.get(), 708bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 709bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 710bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Unable to configure stream scaling: %s (%d)", 711bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 712bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 713bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 714bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 715c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = setTransform(0); 716bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 717bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 718bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 719bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 720d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mFormat == HAL_PIXEL_FORMAT_BLOB) { 721d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 722d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize, 1, mFormat); 723d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 724d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Unable to configure compressed stream buffer geometry" 725d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %d x %d, size %d for stream %d", 726d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mSize, mId); 727d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 728d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 729d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } else { 730d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 731d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mWidth, mHeight, mFormat); 732d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 733d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Unable to configure stream buffer geometry" 734d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %d x %d, format 0x%x for stream %d", 735d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat, mId); 736d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 737d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 7386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int maxConsumerBuffers; 7416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 7426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 7436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 7466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 7476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 7496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Consumer wants %d buffers", __FUNCTION__, 7519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mMaxConsumerBuffers); 7526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 7543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers = 0; 7553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount = 0; 7563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp = 0; 7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 7593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers); 7606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 7626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 7636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 7646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Register allocated buffers with HAL device 7673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers]; 7683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers]; 7693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala uint32_t bufferIdx = 0; 7703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (; bufferIdx < mTotalBuffers; bufferIdx++) { 7711e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(), 7726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &anwBuffers[bufferIdx]); 7736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for " 7756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 7766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala goto cleanUpBuffers; 7776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 780750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)(buffers[bufferIdx])); 7816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 783750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers); 7846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->register_stream_buffers(mDevice, 7856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId, 7863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, 7876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers); 7886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 7906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 7916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 7926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ACTIVE; 7936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers: 796750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx); 7973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (uint32_t i = 0; i < bufferIdx; i++) { 7986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 7991e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis anwBuffers[i], -1); 8006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to cancel buffer %d after registration", 8026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, i); 8036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] anwBuffers; 8063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] buffers; 8076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 8106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() { 8126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Releasing stream %d", __FUNCTION__, mId); 8146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= ALLOCATED) { 8156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->release_stream(mDevice, mId); 8166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 8186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 8196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= CONNECTED) { 8236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 8246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 8256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to disconnect stream %d from native window", 8276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 8286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = -1; 8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RELEASED; 8336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 8346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 8356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 836c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) { 837c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala status_t res; 838c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (mState < CONNECTED) { 839c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__); 840c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return INVALID_OPERATION; 841c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 842c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = native_window_set_buffers_transform(mConsumerInterface.get(), 843c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala transform); 844c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 845c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Unable to configure stream transform to %x: %s (%d)", 846c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, transform, strerror(-res), res); 847c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 848c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 849c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 850c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 8513297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd, 8523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const Vector<String16>& args) { 8533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result = String8::format(" Stream %d: %d x %d, format 0x%x\n", 8543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mId, mWidth, mHeight, mFormat); 8553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" size %d, usage 0x%x, requested format 0x%x\n", 8563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mSize, mUsage, mFormatRequested); 8573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" total buffers: %d, dequeued buffers: %d\n", 8583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, mActiveBuffers); 8593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" frame count: %d, last timestamp %lld\n", 8603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount, mLastTimestamp); 8613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 8623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 8633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 8643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() { 8666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 8676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 8686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW( 8706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const camera2_stream_ops_t *w) { 8716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get(); 8726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 8736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w, 8756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t** buffer) { 8766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int res; 8773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter* stream = 8783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 8793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 8803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 8816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 8826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 8856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindowBuffer* anb; 8861e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(a, &anb); 887750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala if (res != OK) { 888750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId, 889750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala strerror(-res), res); 890750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala return res; 891750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala } 8926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *buffer = &(anb->handle); 8943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers++; 8953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 896750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer)); 8976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 8996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w, 9016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int64_t timestamp, 9026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 9033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 9043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 905750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d enqueue: Buffer %p captured at %lld ns", 906750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala stream->mId, (void*)(*buffer), timestamp); 907bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala int state = stream->mState; 9086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 9096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 9106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 9116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 9136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t err; 9146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 915bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 916bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error setting timestamp on native window: %s (%d)", 917bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 918bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return err; 919bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 920bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala err = a->queueBuffer(a, 9211e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 922bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 923bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error queueing buffer to native window: %s (%d)", 924bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 925bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 9263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers--; 9273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mFrameCount++; 9283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mLastTimestamp = timestamp; 929bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return err; 9306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w, 9336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 9343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 9353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 936750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d cancel: Buffer %p", 937750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala stream->mId, (void*)(*buffer)); 9383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 9393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 9406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 9416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers--; 9436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 9446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return a->cancelBuffer(a, 9451e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 9466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w, 9496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int left, int top, int right, int bottom) { 9506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 9516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 9526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 9536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 9546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 9566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 9576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return native_window_set_crop(a, &crop); 9586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 96061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 96161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android 962