Camera2Device.cpp revision 8ce89d9e2b132bf58a030acec88acf0a998926a1
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 112160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala setNotifyCallback(NULL); 113160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1173297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) { 1183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 12097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala int detailLevel = 0; 12197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala int n = args.size(); 12297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala String16 detailOption("-d"); 12397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala for (int i = 0; i + 1 < n; i++) { 12497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala if (args[i] == detailOption) { 12597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala String8 levelStr(args[i+1]); 12697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala detailLevel = atoi(levelStr.string()); 12797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala } 12897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala } 1293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 130603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala result.appendFormat(" Camera2Device[%d] dump (detail level %d):\n", 131603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala mId, detailLevel); 1323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 13397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala if (detailLevel > 0) { 13497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala result = " Request queue contents:\n"; 13597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala write(fd, result.string(), result.size()); 13697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala mRequestQueue.dump(fd, args); 1373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 13897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala result = " Frame queue contents:\n"; 13997197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala write(fd, result.string(), result.size()); 14097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala mFrameQueue.dump(fd, args); 14197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala } 1423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Active streams:\n"; 1443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) { 1463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala (*s)->dump(fd, args); 1473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 1483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " HAL device dump:\n"; 1503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 1513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t res; 1533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala res = mDevice->ops->dump(mDevice, fd); 1543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return res; 1563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 1573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalacamera_metadata_t *Camera2Device::info() { 1599e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 1606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return mDeviceInfo; 1626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 1636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 164d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::capture(camera_metadata_t* request) { 165d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 166d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 167d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mRequestQueue.enqueue(request); 168d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 169d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 170d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 171d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 172d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::setStreamingRequest(camera_metadata_t* request) { 1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mRequestQueue.setStreamSlot(request); 176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 178f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer, 180d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, int *id) { 1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 1836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<StreamAdapter> stream = new StreamAdapter(mDevice); 1856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 186d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = stream->connectToDevice(consumer, width, height, format, size); 1876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):" 1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "%s (%d)", 1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, width, height, format, strerror(-res), res); 1916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 1936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *id = stream->getId(); 1956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mStreams.push_back(stream); 1976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 1986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 1996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id, 201d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format) { 202d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 203d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala bool found = false; 204d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala StreamList::iterator streamI; 205d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala for (streamI = mStreams.begin(); 206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 207d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if ((*streamI)->getId() == id) { 208d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala found = true; 209d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala break; 210d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 211d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 212d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (!found) { 213d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Camera %d: Stream %d does not exist", 214d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mId, id); 215d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return BAD_VALUE; 216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (width) *width = (*streamI)->getWidth(); 219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (height) *height = (*streamI)->getHeight(); 220d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (format) *format = (*streamI)->getFormat(); 221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 222d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 223d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 224d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 225c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id, 226c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala int transform) { 227c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 228c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala bool found = false; 229c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala StreamList::iterator streamI; 230c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala for (streamI = mStreams.begin(); 231c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala streamI != mStreams.end(); streamI++) { 232c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if ((*streamI)->getId() == id) { 233c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala found = true; 234c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala break; 235c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 236c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 237c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (!found) { 238c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Camera %d: Stream %d does not exist", 239c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, mId, id); 240c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return BAD_VALUE; 241c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 242c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 243c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return (*streamI)->setTransform(transform); 244c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 245c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) { 2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala bool found = false; 2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala for (StreamList::iterator streamI = mStreams.begin(); 2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala streamI != mStreams.end(); streamI++) { 2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if ((*streamI)->getId() == id) { 2529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t res = (*streamI)->release(); 2534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala if (res != OK) { 2549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to release stream %d from HAL device: " 2554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala "%s (%d)", __FUNCTION__, id, strerror(-res), res); 2564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala return res; 2574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala } 2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mStreams.erase(streamI); 2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala found = true; 2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala break; 2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (!found) { 2646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Camera %d: Unable to find stream %d to delete", 2656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId, id); 2666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 2676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 2686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 2696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 2706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 2716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId, 2726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera_metadata_t **request) { 2736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 274d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return mDevice->ops->construct_default_request( 275d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mDevice, templateId, request); 276d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala} 277d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 278d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() { 279d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t kSleepTime = 50000; // 50 ms 280d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t kMaxSleepTime = 10000000; // 10 s 2819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 282d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mRequestQueue.getBufferCount() == 283d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION; 284d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 285d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // TODO: Set up notifications from HAL, instead of sleeping here 286d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t totalTime = 0; 287d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala while (mDevice->ops->get_in_progress_count(mDevice) > 0) { 288d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala usleep(kSleepTime); 289d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala totalTime += kSleepTime; 290d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (totalTime > kMaxSleepTime) { 291d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Waited %d us, requests still in flight", __FUNCTION__, 292d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala totalTime); 293d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return TIMED_OUT; 294d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 295d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 296d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return OK; 2976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 2986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 299160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalastatus_t Camera2Device::setNotifyCallback(NotificationListener *listener) { 300160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala status_t res; 301160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala res = mDevice->ops->set_notify_callback(mDevice, notificationCallback, 302160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala reinterpret_cast<void*>(listener) ); 303160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala if (res != OK) { 304160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("%s: Unable to set notification callback!", __FUNCTION__); 305160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 306160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala return res; 307160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 308160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 309160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Device::notificationCallback(int32_t msg_type, 310160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext1, 311160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext2, 312160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext3, 313160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala void *user) { 314160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala NotificationListener *listener = reinterpret_cast<NotificationListener*>(user); 315160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type, 316160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ext1, ext2, ext3); 317160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala if (listener != NULL) { 318160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala switch (msg_type) { 319160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_ERROR: 320160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyError(ext1, ext2, ext3); 321160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 322160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_SHUTTER: { 323160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 ); 324160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyShutter(ext1, timestamp); 325160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 326160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 327160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOFOCUS: 328160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoFocus(ext1, ext2); 329160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 330160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOEXPOSURE: 331160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoExposure(ext1, ext2); 332160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 333160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOWB: 334160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoWhitebalance(ext1, ext2); 335160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 336160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala default: 337160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!", 338160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, msg_type, ext1, ext2, ext3); 339160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 340160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 341160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 342160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 3438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Device::setFrameListener(FrameListener *listener) { 3448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return mFrameQueue.setListener(listener); 3458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 3468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 3478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Device::getNextFrame(camera_metadata_t **frame) { 3488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return mFrameQueue.dequeue(frame); 3498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 3508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerAutofocus(uint32_t id) { 352174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 354174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala res = mDevice->ops->trigger_action(mDevice, 355174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_AUTOFOCUS, id, 0); 356174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 357174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error triggering autofocus (id %d)", 358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 359174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 360174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 361174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 362174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 363174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerCancelAutofocus(uint32_t id) { 364174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 365174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id); 366174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala res = mDevice->ops->trigger_action(mDevice, 367174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0); 368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error canceling autofocus (id %d)", 370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerPrecaptureMetering(uint32_t id) { 376174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala res = mDevice->ops->trigger_action(mDevice, 379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0); 380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error triggering precapture metering (id %d)", 382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 387160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala/** 388160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala * Camera2Device::NotificationListener 389160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala */ 390160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 391160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville TalvalaCamera2Device::NotificationListener::~NotificationListener() { 392160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 393160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala/** 3958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala * Camera2Device::FrameListener 3968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala */ 3978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 3988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville TalvalaCamera2Device::FrameListener::~FrameListener() { 3998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 4008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 4018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala/** 402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue 403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */ 404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue(): 406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice(NULL), 407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount(0), 408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount(0), 409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount(0), 4108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mSignalConsumer(true), 4118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mListener(NULL) 412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::dequeue_request = consumer_dequeue; 414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::request_count = consumer_buffer_count; 415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::free_request = consumer_free; 416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue; 418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::cancel_frame = producer_cancel; 419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue; 420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() { 423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mEntries.begin(), mEntries.end()); 425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 4286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing) 4296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) { 4306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 4316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_request_queue_src_ops(d, 4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 4336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) return res; 434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mDevice = d; 4356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 4386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) { 4396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_frame_queue_dst_ops(d, 4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 4426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces 446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) { 4472c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 449f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount++; 451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(buf); 452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() { 457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS; 460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return mCount; 462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf, 465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool incrementCount) 466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 4672c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 471f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mCount == 0) { 472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 0) { 4732c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Empty", __FUNCTION__); 474f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = NULL; 475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mSignalConsumer = true; 476f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 477f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 4782c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__, 479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount); 480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin(); 482f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry != mStreamSlot.end(); 483f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry++ ) { 484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries = get_camera_metadata_entry_count(*slotEntry); 485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t dataBytes = get_camera_metadata_data_count(*slotEntry); 486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *copy = 488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, dataBytes); 489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala append_camera_metadata(copy, *slotEntry); 490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(copy); 491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount = mStreamSlotCount; 493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 4942c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("MetadataQueue: deque (%d buffers)", mCount); 495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *b = *(mEntries.begin()); 496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.erase(mEntries.begin()); 497f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 498f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (incrementCount) { 4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera_metadata_entry_t frameCount; 5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = find_camera_metadata_entry(b, 501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_REQUEST_FRAME_COUNT, 5026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &frameCount); 5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to add frame count: %s (%d)", 5056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 5066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 5076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *frameCount.data.i32 = mFrameCount; 5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount++; 510f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 511f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = b; 513f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount--; 514f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 51561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return OK; 51661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 51761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout) 519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (mCount == 0) { 523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = notEmpty.waitRelative(mMutex,timeout); 524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) return res; 525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 5298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setListener(FrameListener *listener) { 5308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala Mutex::Autolock l(mMutex); 5318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mListener = listener; 5328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return OK; 5338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 5348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf) 536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (buf == NULL) { 540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 0; 542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 5446ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala camera_metadata_t *buf2 = clone_camera_metadata(buf); 5456ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala if (!buf2) { 5466ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__); 5476ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala return NO_MEMORY; 5486ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 5496ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 1) { 551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin(); 552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(++mStreamSlot.begin(), mStreamSlot.end()); 553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 1) { 556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata( *(mStreamSlot.begin()) ); 5576ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala *(mStreamSlot.begin()) = buf2; 558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 5596ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlot.push_front(buf2); 560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 5626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot( 566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const List<camera_metadata_t*> &bufs) 567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 5686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 5706ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala status_t res; 5716ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 5756ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount = 0; 5766ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala for (List<camera_metadata_t*>::const_iterator r = bufs.begin(); 5776ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala r != bufs.end(); r++) { 5786ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala camera_metadata_t *r2 = clone_camera_metadata(*r); 5796ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala if (!r2) { 5806ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__); 5816ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala return NO_MEMORY; 5826ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 5836ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlot.push_back(r2); 5846ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount++; 5856ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 5866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 5876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 5893297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd, 5903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const Vector<String16>& args) { 5913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 5923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t notLocked; 5933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala notLocked = mMutex.tryLock(); 5943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked) { 5953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" (Unable to lock queue mutex)\n"); 5963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 5973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Current frame number: %d\n", mFrameCount); 5983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mStreamSlotCount == 0) { 5993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Stream slot: Empty\n"); 6003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 6013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 6023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Stream slot: %d entries\n", 6033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mStreamSlot.size()); 6043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 6053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin(); 6063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mStreamSlot.end(); r++) { 6073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Stream slot buffer %d:\n", i); 6083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 609428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 6103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 6113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 6123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 6133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mEntries.size() == 0) { 6143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Main queue is empty\n"; 6153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 6163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 6173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Main queue has %d entries:\n", 6183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mEntries.size()); 6193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 6203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mEntries.begin(); 6213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mEntries.end(); r++) { 6223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Queue entry %d:\n", i); 6233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 624428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 6253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 6263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 6273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 6283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 6293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked == 0) { 6303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMutex.unlock(); 6313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 6323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 6333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 6343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 6353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 6366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() { 6376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res = OK; 6386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala notEmpty.signal(); 6396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mSignalConsumer && mDevice != NULL) { 6406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mSignalConsumer = false; 6416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 6426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.unlock(); 6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: Signaling consumer", __FUNCTION__); 6446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->notify_request_queue_not_empty(mDevice); 6456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.lock(); 6466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 6478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala if (mListener != NULL) { 6488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala FrameListener *listener = mListener; 6498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mMutex.unlock(); 6508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala ALOGVV("%s: Signaling listener", __FUNCTION__); 6518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala listener->onNewFrameAvailable(); 6528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala mMutex.lock(); 6538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 6546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers( 658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator start, 659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator end) 660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (start != end) { 662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(*start); 663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala start = mStreamSlot.erase(start); 664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q) 677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count( 683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->getBufferCount(); 687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue( 690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->dequeue(buffer, true); 695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free( 698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue( 707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries, size_t bytes, 709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *new_buffer = 712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, bytes); 713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buffer = new_buffer; 715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel( 719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue( 727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *filled_buffer) 729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->enqueue(filled_buffer); 732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/** 7356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter 7366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */ 7376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of 7396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \ 7406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 7416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif 7426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d): 7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState(RELEASED), 7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mDevice(d), 7466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId(-1), 7473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0), 7483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMaxProducerBuffers(0), mMaxConsumerBuffers(0), 7493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers(0), 7503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFormatRequested(0), 7513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers(0), 7523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount(0), 7533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp(0) 7546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{ 7556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 7566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 7586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 7596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 7606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() { 7629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) { 7639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala release(); 7649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 7656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 7666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 767d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice( 768d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ANativeWindow> consumer, 769d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size) { 7706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 7719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 7726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) return INVALID_OPERATION; 7746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (consumer == NULL) { 7756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__); 7766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 7776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 7786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %d", 7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, width, height, format, size); 7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 7826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mConsumerInterface = consumer; 7836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth = width; 7846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mHeight = height; 785d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0; 7866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormatRequested = format; 7876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Allocate device-side stream interface 7896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 7906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t id; 7916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t formatActual; 7926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t usage; 7936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t maxBuffers = 2; 7946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->allocate_stream(mDevice, 7956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth, mHeight, mFormatRequested, getStreamOps(), 7966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 7976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 7986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 7996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 8006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Allocated stream id %d, actual format 0x%x, " 8049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "usage 0x%x, producer wants %d buffers", __FUNCTION__, 8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala id, formatActual, usage, maxBuffers); 8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 8076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = id; 8086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormat = formatActual; 8096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mUsage = usage; 8106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 8116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ALLOCATED; 8136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Configure consumer-side ANativeWindow interface 8156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 8166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 8176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 8196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 8206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = CONNECTED; 8256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 8276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 8296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mUsage, mId); 8306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 833bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala res = native_window_set_scaling_mode(mConsumerInterface.get(), 834bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 835bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 836bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Unable to configure stream scaling: %s (%d)", 837bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 838bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 839bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 840bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 841c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = setTransform(0); 842bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 843bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 844bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 845bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 846d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mFormat == HAL_PIXEL_FORMAT_BLOB) { 847d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize, 1, mFormat); 849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Unable to configure compressed stream buffer geometry" 851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %d x %d, size %d for stream %d", 852d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mSize, mId); 853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } else { 856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mWidth, mHeight, mFormat); 858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Unable to configure stream buffer geometry" 860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %d x %d, format 0x%x for stream %d", 861d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat, mId); 862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 8646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int maxConsumerBuffers; 8676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 8686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 8696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 8716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 8726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 8756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Consumer wants %d buffers", __FUNCTION__, 8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mMaxConsumerBuffers); 8786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 8803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers = 0; 8813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount = 0; 8823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp = 0; 8836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 8853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers); 8866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 8876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 8886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 8896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 8906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Register allocated buffers with HAL device 8933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers]; 8943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers]; 8953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala uint32_t bufferIdx = 0; 8963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (; bufferIdx < mTotalBuffers; bufferIdx++) { 8971e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(), 8986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &anwBuffers[bufferIdx]); 8996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for " 9016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 9026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala goto cleanUpBuffers; 9036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 906750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)(buffers[bufferIdx])); 9076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 909750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers); 9106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->register_stream_buffers(mDevice, 9116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId, 9123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, 9136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers); 9146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 9156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 9166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 9176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 9186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ACTIVE; 9196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers: 922750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx); 9233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (uint32_t i = 0; i < bufferIdx; i++) { 9246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 9251e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis anwBuffers[i], -1); 9266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 9276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to cancel buffer %d after registration", 9286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, i); 9296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] anwBuffers; 9323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] buffers; 9336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 9356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() { 9386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 9399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Releasing stream %d", __FUNCTION__, mId); 9406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= ALLOCATED) { 9416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mDevice->ops->release_stream(mDevice, mId); 9426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 9436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 9446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 9456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 9466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= CONNECTED) { 9496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 9506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 9516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 9526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to disconnect stream %d from native window", 9536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 9546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 9556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = -1; 9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RELEASED; 9596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 9606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 962c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) { 963c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala status_t res; 964c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (mState < CONNECTED) { 965c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__); 966c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return INVALID_OPERATION; 967c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 968c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = native_window_set_buffers_transform(mConsumerInterface.get(), 969c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala transform); 970c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 971c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Unable to configure stream transform to %x: %s (%d)", 972c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, transform, strerror(-res), res); 973c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 974c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 975c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 976c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 9773297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd, 9783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const Vector<String16>& args) { 9793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result = String8::format(" Stream %d: %d x %d, format 0x%x\n", 9803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mId, mWidth, mHeight, mFormat); 9813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" size %d, usage 0x%x, requested format 0x%x\n", 9823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mSize, mUsage, mFormatRequested); 9833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" total buffers: %d, dequeued buffers: %d\n", 9843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, mActiveBuffers); 9853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" frame count: %d, last timestamp %lld\n", 9863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount, mLastTimestamp); 9873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 9883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 9893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 9903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 9916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() { 9926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 9936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW( 9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const camera2_stream_ops_t *w) { 9976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get(); 9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w, 10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t** buffer) { 10026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int res; 10033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter* stream = 10043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 10053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 10063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 10076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 10086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 10116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindowBuffer* anb; 10121e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(a, &anb); 1013750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala if (res != OK) { 1014750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId, 1015750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala strerror(-res), res); 1016750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala return res; 1017750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala } 10186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *buffer = &(anb->handle); 10203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers++; 10213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1022750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer)); 10236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w, 10276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int64_t timestamp, 10286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 10293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 10303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 1031750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d enqueue: Buffer %p captured at %lld ns", 1032750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala stream->mId, (void*)(*buffer), timestamp); 1033bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala int state = stream->mState; 10346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 10356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 10366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 10376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 10396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t err; 10406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 1041bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 1042bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error setting timestamp on native window: %s (%d)", 1043bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 1044bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return err; 1045bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1046bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala err = a->queueBuffer(a, 10471e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 1048bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 1049bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error queueing buffer to native window: %s (%d)", 1050bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 105131d377b7622279034326fbd8b9803a738a39fb30James Dong return err; 1052bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 105331d377b7622279034326fbd8b9803a738a39fb30James Dong 10543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers--; 10553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mFrameCount++; 10563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mLastTimestamp = timestamp; 105731d377b7622279034326fbd8b9803a738a39fb30James Dong return OK; 10586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 10596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w, 10616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 10623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 10633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 1064750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d cancel: Buffer %p", 1065750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala stream->mId, (void*)(*buffer)); 10663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 10673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 10686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 10696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 107031d377b7622279034326fbd8b9803a738a39fb30James Dong 10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 107231d377b7622279034326fbd8b9803a738a39fb30James Dong int err = a->cancelBuffer(a, 10731e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 107431d377b7622279034326fbd8b9803a738a39fb30James Dong if (err != OK) { 107531d377b7622279034326fbd8b9803a738a39fb30James Dong ALOGE("%s: Error canceling buffer to native window: %s (%d)", 107631d377b7622279034326fbd8b9803a738a39fb30James Dong __FUNCTION__, strerror(-err), err); 107731d377b7622279034326fbd8b9803a738a39fb30James Dong return err; 107831d377b7622279034326fbd8b9803a738a39fb30James Dong } 107931d377b7622279034326fbd8b9803a738a39fb30James Dong 108031d377b7622279034326fbd8b9803a738a39fb30James Dong stream->mActiveBuffers--; 108131d377b7622279034326fbd8b9803a738a39fb30James Dong return OK; 10826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 10836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w, 10856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int left, int top, int right, int bottom) { 10866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 10876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 10886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 10896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 10906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 10926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 10936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return native_window_set_crop(a, &crop); 10946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 10956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 109661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 109761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android 1098