1567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/* 2567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * 4567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * you may not use this file except in compliance with the License. 6567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * You may obtain a copy of the License at 7567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * 8567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * 10567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * See the License for the specific language governing permissions and 14567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * limitations under the License. 15567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 16567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 17567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala// Utility classes for camera2 HAL testing 18567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 19567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#define LOG_TAG "Camera2_test_utils" 20567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#define LOG_NDEBUG 0 21567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 22567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#include "utils/Log.h" 23567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#include "camera2_utils.h" 24e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include <dlfcn.h> 25567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 26567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalanamespace android { 27e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkinnamespace camera2 { 28e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkinnamespace tests { 29567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 30567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 31567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * MetadataQueue 32567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 33567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 34567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaMetadataQueue::MetadataQueue(): 35567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice(NULL), 36567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFrameCount(0), 37567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount(0), 38567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount(0), 39567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mSignalConsumer(true) 40567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala{ 41567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops::dequeue_request = consumer_dequeue; 42567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops::request_count = consumer_buffer_count; 43567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops::free_request = consumer_free; 44567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 45567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue; 46567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_frame_queue_dst_ops::cancel_frame = producer_cancel; 47567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue; 48567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 49567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 50567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaMetadataQueue::~MetadataQueue() { 51567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mEntries.begin(), mEntries.end()); 52567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 53567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 54567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 55567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala// Interface to camera2 HAL as consumer (input requests/reprocessing) 5608a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaconst camera2_request_queue_src_ops_t* MetadataQueue::getToConsumerInterface() { 57567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_request_queue_src_ops_t*>(this); 58567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 59567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 60567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid MetadataQueue::setFromConsumerInterface(camera2_device_t *d) { 61567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice = d; 62567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 63567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 6408a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaconst camera2_frame_queue_dst_ops_t* MetadataQueue::getToProducerInterface() { 65567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_frame_queue_dst_ops_t*>(this); 66567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 67567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 68567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala// Real interfaces 69567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::enqueue(camera_metadata_t *buf) { 70567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 71567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 72567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount++; 73567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mEntries.push_back(buf); 74567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala notEmpty.signal(); 75567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 76567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mSignalConsumer && mDevice != NULL) { 77567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mSignalConsumer = false; 78567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 79567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMutex.unlock(); 80567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Signaling consumer", __FUNCTION__); 81567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice->ops->notify_request_queue_not_empty(mDevice); 82567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMutex.lock(); 83567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 84567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 85567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 86567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 87567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::getBufferCount() { 88567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 89567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount > 0) { 90567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS; 91567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 92567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mCount; 93567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 94567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 95567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::dequeue(camera_metadata_t **buf, bool incrementCount) { 96567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 97567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 98567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mCount == 0) { 99567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount == 0) { 100567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Empty", __FUNCTION__); 101567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buf = NULL; 102567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mSignalConsumer = true; 103567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 104567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 105567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Streaming %d frames to queue", __FUNCTION__, 106567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount); 107567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 108567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin(); 109567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala slotEntry != mStreamSlot.end(); 110567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala slotEntry++ ) { 111567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t entries = get_camera_metadata_entry_count(*slotEntry); 112567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t dataBytes = get_camera_metadata_data_count(*slotEntry); 113567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 114567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *copy = allocate_camera_metadata(entries, dataBytes); 115567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala append_camera_metadata(copy, *slotEntry); 116567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mEntries.push_back(copy); 117567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 118567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount = mStreamSlotCount; 119567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 120567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("MetadataQueue: deque (%d buffers)", mCount); 121567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *b = *(mEntries.begin()); 122567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mEntries.erase(mEntries.begin()); 123567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 124567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (incrementCount) { 125567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala add_camera_metadata_entry(b, 126567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANDROID_REQUEST_FRAME_COUNT, 127567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (void**)&mFrameCount, 1); 128567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFrameCount++; 129567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 130567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 131567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buf = b; 132567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount--; 133567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 134567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 135567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 136567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 137567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::waitForBuffer(nsecs_t timeout) { 138567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 139567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 140567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mCount == 0) { 141567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = notEmpty.waitRelative(mMutex,timeout); 142567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 143567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 144567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 145567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 146567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 147567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::setStreamSlot(camera_metadata_t *buf) { 148567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (buf == NULL) { 149567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 150567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = 0; 151567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 152567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 153567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount > 1) { 154567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin(); 155567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(++mStreamSlot.begin(), mStreamSlot.end()); 156567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = 1; 157567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 158567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount == 1) { 159567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata( *(mStreamSlot.begin()) ); 160567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *(mStreamSlot.begin()) = buf; 161567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } else { 162567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlot.push_front(buf); 163567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = 1; 164567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 165567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 166567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 167567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 168567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::setStreamSlot(const List<camera_metadata_t*> &bufs) { 169567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount > 0) { 170567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 171567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 172567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlot = bufs; 173567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = mStreamSlot.size(); 174567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 175567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 176567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 177567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 178567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::freeBuffers(List<camera_metadata_t*>::iterator start, 179567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala List<camera_metadata_t*>::iterator end) { 180567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (start != end) { 181567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(*start); 182567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala start = mStreamSlot.erase(start); 183567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 184567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 185567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 186567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 18708a6e5e374c57361275173e18eea120587627adfEino-Ville TalvalaMetadataQueue* MetadataQueue::getInstance( 18808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const camera2_request_queue_src_ops_t *q) { 18908a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 19008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 19108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala} 19208a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala 19308a6e5e374c57361275173e18eea120587627adfEino-Ville TalvalaMetadataQueue* MetadataQueue::getInstance( 19408a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const camera2_frame_queue_dst_ops_t *q) { 19508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 19608a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 19708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala} 19808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala 199567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::consumer_buffer_count( 20008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const camera2_request_queue_src_ops_t *q) { 20108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 202567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->getBufferCount(); 203567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 204567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 20508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::consumer_dequeue(const camera2_request_queue_src_ops_t *q, 206567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t **buffer) { 20708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 208567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->dequeue(buffer, true); 209567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 210567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 2111aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampeint MetadataQueue::consumer_free(const camera2_request_queue_src_ops_t * /* q */, 212567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *old_buffer) { 213567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(old_buffer); 214567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 215567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 216567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 2171aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampeint MetadataQueue::producer_dequeue(const camera2_frame_queue_dst_ops_t * /* q */, 218567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t entries, size_t bytes, 219567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t **buffer) { 220567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *new_buffer = 221567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala allocate_camera_metadata(entries, bytes); 222567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 223567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buffer = new_buffer; 224567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 225567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 226567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 2271aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampeint MetadataQueue::producer_cancel(const camera2_frame_queue_dst_ops_t * /* q */, 228567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *old_buffer) { 229567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(old_buffer); 230567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 231567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 232567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 23308a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::producer_enqueue(const camera2_frame_queue_dst_ops_t *q, 234567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *filled_buffer) { 23508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 236567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->enqueue(filled_buffer); 237567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 238567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 239567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 240567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * NotifierListener 241567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 242567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 243567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaNotifierListener::NotifierListener() { 244567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 245567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 246567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNotificationsFrom(camera2_device *dev) { 247567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (!dev) return BAD_VALUE; 248567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t err; 249567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala err = dev->ops->set_notify_callback(dev, 250567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala notify_callback_dispatch, 251567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (void*)this); 252567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return err; 253567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 254567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 255567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNextNotification(int32_t *msg_type, 256567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 257567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 258567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 259567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 260567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mNotifications.size() == 0) return BAD_VALUE; 261567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return getNextNotificationLocked(msg_type, ext1, ext2, ext3); 262567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 263567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 264567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::waitForNotification(int32_t *msg_type, 265567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 266567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 267567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 268567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 269567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mNotifications.size() == 0) { 270567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNewNotification.wait(mMutex); 271567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 272567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return getNextNotificationLocked(msg_type, ext1, ext2, ext3); 273567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 274567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 275567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint NotifierListener::numNotifications() { 276567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 277567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mNotifications.size(); 278567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 279567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 280567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNextNotificationLocked(int32_t *msg_type, 281567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 282567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 283567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 284567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *msg_type = mNotifications.begin()->msg_type; 285567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext1 = mNotifications.begin()->ext1; 286567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext2 = mNotifications.begin()->ext2; 287567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext3 = mNotifications.begin()->ext3; 288567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNotifications.erase(mNotifications.begin()); 289567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 290567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 291567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 292567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid NotifierListener::onNotify(int32_t msg_type, 293567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext1, 294567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext2, 295567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext3) { 296567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 297567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNotifications.push_back(Notification(msg_type, ext1, ext2, ext3)); 298567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNewNotification.signal(); 299567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 300567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 301567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid NotifierListener::notify_callback_dispatch(int32_t msg_type, 302567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext1, 303567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext2, 304567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext3, 305567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala void *user) { 306567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NotifierListener *me = reinterpret_cast<NotifierListener*>(user); 307567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala me->onNotify(msg_type, ext1, ext2, ext3); 308567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 309567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 310567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 311567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * StreamAdapter 312567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 313567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 314567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#ifndef container_of 315567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#define container_of(ptr, type, member) \ 316567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 317567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#endif 318567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 319eda79df3c7e683cb4b73a742d3716b81bb7e899aAndy McFaddenStreamAdapter::StreamAdapter(sp<IGraphicBufferProducer> consumer): 320567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState(UNINITIALIZED), mDevice(NULL), 321567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId(-1), 3222388a2dc91979364d96e49456b189f904f0267f3Eino-Ville Talvala mWidth(0), mHeight(0), mFormat(0) 323567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala{ 324cc50111825fe5c8fd2a657b4a302a45fdca627e1Mathias Agopian mConsumerInterface = new Surface(consumer); 325567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 326567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 327567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 328567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 329567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 330567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 331567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaStreamAdapter::~StreamAdapter() { 332567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala disconnect(); 333567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 334567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 335567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t StreamAdapter::connectToDevice(camera2_device_t *d, 336567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t width, uint32_t height, int format) { 337567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState != UNINITIALIZED) return INVALID_OPERATION; 338567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (d == NULL) { 339567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Null device passed to stream adapter", __FUNCTION__); 340567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return BAD_VALUE; 341567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 342567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 343567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 344567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 345567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth = width; 346567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mHeight = height; 3472388a2dc91979364d96e49456b189f904f0267f3Eino-Ville Talvala mFormat = format; 348567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 349567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Allocate device-side stream interface 350567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 351567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t id; 3522388a2dc91979364d96e49456b189f904f0267f3Eino-Ville Talvala uint32_t formatActual; // ignored 353567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t usage; 354567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t maxBuffers = 2; 355567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = d->ops->allocate_stream(d, 3562388a2dc91979364d96e49456b189f904f0267f3Eino-Ville Talvala mWidth, mHeight, mFormat, getStreamOps(), 357567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 358567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 359567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 360567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 361567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = UNINITIALIZED; 362567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 363567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 364567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice = d; 365567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 366567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId = id; 367567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mUsage = usage; 368567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 369567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 370567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Configure consumer-side ANativeWindow interface 371567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 372567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 373567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 374567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 375567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 376567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 377567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = ALLOCATED; 378567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 379567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 380567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 381567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 382567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 383567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 384567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mUsage, mId); 385567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 386567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 387567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 388567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 3891aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe res = native_window_set_buffers_dimensions(mConsumerInterface.get(), 3901aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe mWidth, mHeight); 391567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 3921aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe ALOGE("%s: Unable to configure buffer dimensions" 3931aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe " %d x %d for stream %d", 3941aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe __FUNCTION__, mWidth, mHeight, mId); 3951aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe mState = CONNECTED; 3961aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe return res; 3971aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe } 3981aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe res = native_window_set_buffers_format(mConsumerInterface.get(), 3991aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe mFormat); 4001aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe if (res != OK) { 4011aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe ALOGE("%s: Unable to configure buffer format" 4021aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe " 0x%x for stream %d", 4031aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe __FUNCTION__, mFormat, mId); 404567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 405567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 406567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 407567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 408567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int maxConsumerBuffers; 409567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 410567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 411567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 412567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 413567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 414567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 415567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 416567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 417567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 418567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 419567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Producer wants %d buffers, consumer wants %d", __FUNCTION__, 420567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxProducerBuffers, mMaxConsumerBuffers); 421567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 422567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int totalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 423567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 424567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 425567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala totalBuffers); 426567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 427567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 428567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 429567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 430567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 431567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 432567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 433567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Register allocated buffers with HAL device 434567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[totalBuffers]; 435567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[totalBuffers]; 436567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int bufferIdx = 0; 437567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (; bufferIdx < totalBuffers; bufferIdx++) { 438bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(), 439567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala &anwBuffers[bufferIdx]); 440567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 441567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for" 442567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 443567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 444567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala goto cleanUpBuffers; 445567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 446567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 447567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 448567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 449567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mDevice->ops->register_stream_buffers(mDevice, 450567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId, 451567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala totalBuffers, 452567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffers); 453567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 454567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 455567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 456567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 457567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } else { 458567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = ACTIVE; 459567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 460567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 461567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalacleanUpBuffers: 462567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (int i = 0; i < bufferIdx; i++) { 463567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 464bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis anwBuffers[i], -1); 465567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 4661aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe delete[] anwBuffers; 4671aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe delete[] buffers; 468567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 469567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 470567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 471567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 472567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t StreamAdapter::disconnect() { 473567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 474567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState >= ALLOCATED) { 475567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mDevice->ops->release_stream(mDevice, mId); 476567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 477567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 478567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 479567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 480567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 481567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 482567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState >= CONNECTED) { 483567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 484567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 485567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 486567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to disconnect stream %d from native window", 487567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 488567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 489567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 490567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 491567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId = -1; 492567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = DISCONNECTED; 493567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 494567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 495567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 496567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::getId() { 497567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mId; 498567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 499567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 50008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaconst camera2_stream_ops *StreamAdapter::getStreamOps() { 501567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 502567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 503567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 50408a6e5e374c57361275173e18eea120587627adfEino-Ville TalvalaANativeWindow* StreamAdapter::toANW(const camera2_stream_ops_t *w) { 50508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get(); 506567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 507567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 50808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w, 509567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t** buffer) { 510567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int res; 51108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 512567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 513567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 514567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 515567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 516567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 517567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 518567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindowBuffer* anb; 519bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis res = native_window_dequeue_buffer_and_wait(a, &anb); 520567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 521567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 522567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buffer = &(anb->handle); 523567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 524567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 525567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 526567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 52708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w, 528567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int64_t timestamp, 529567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t* buffer) { 53008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 531567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 532567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 533567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 534567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 535567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 536567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t err; 537567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 538567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (err != OK) return err; 539567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return a->queueBuffer(a, 540bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 541567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 542567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 54308a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w, 544567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t* buffer) { 54508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 546567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 547567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 548567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 549567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 550567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 551567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return a->cancelBuffer(a, 552bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 553567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 554567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 55508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::set_crop(const camera2_stream_ops_t* w, 556567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int left, int top, int right, int bottom) { 55708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 558567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 559567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 560567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 561567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 562567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 563567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 564567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return native_window_set_crop(a, &crop); 565567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 566567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 567567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 568567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * FrameWaiter 569567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 570567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 571567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaFrameWaiter::FrameWaiter(): 572567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames(0) { 573567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 574567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 575567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t FrameWaiter::waitForFrame(nsecs_t timeout) { 576567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 577567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock lock(mMutex); 578567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mPendingFrames == 0) { 579567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mCondition.waitRelative(mMutex, timeout); 580567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 581567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 582567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames--; 583567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 584567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 585567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 58632ef0cae6319c7d40d883c1c9839ff04b5ac9f72Dan Stozavoid FrameWaiter::onFrameAvailable(const BufferItem& /* item */) { 587567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock lock(mMutex); 588567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames++; 589567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCondition.signal(); 590567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 591567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 592c2537654815c015d82719dd46023997b647a5e9cYin-Chia Yehint HWModuleHelpers::closeModule(void *dso) { 593e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin int status; 594c2537654815c015d82719dd46023997b647a5e9cYin-Chia Yeh if (!dso) { 595e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin return -EINVAL; 596e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 597e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 598c2537654815c015d82719dd46023997b647a5e9cYin-Chia Yeh status = dlclose(dso); 599e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin if (status != 0) { 600e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin char const *err_str = dlerror(); 601e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin ALOGE("%s dlclose failed, error: %s", __func__, err_str ?: "unknown"); 602e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 603e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 604e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin return status; 605e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 606e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 607e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} // namespace tests 608e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} // namespace camera2 609567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} // namespace android 610