camera2_utils.cpp revision 567b4a24fa9fedf0086af5e0bb8e45bd3294bc9d
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" 24567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 25567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalanamespace android { 26567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 27567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 28567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * MetadataQueue 29567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 30567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 31567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaMetadataQueue::MetadataQueue(): 32567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice(NULL), 33567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFrameCount(0), 34567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount(0), 35567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount(0), 36567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mSignalConsumer(true) 37567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala{ 38567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops::dequeue_request = consumer_dequeue; 39567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops::request_count = consumer_buffer_count; 40567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops::free_request = consumer_free; 41567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 42567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue; 43567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_frame_queue_dst_ops::cancel_frame = producer_cancel; 44567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue; 45567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 46567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 47567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaMetadataQueue::~MetadataQueue() { 48567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mEntries.begin(), mEntries.end()); 49567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 50567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 51567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 52567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala// Interface to camera2 HAL as consumer (input requests/reprocessing) 53567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalacamera2_request_queue_src_ops_t* MetadataQueue::getToConsumerInterface() { 54567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_request_queue_src_ops_t*>(this); 55567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 56567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 57567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid MetadataQueue::setFromConsumerInterface(camera2_device_t *d) { 58567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice = d; 59567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 60567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 61567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalacamera2_frame_queue_dst_ops_t* MetadataQueue::getToProducerInterface() { 62567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_frame_queue_dst_ops_t*>(this); 63567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 64567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 65567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala// Real interfaces 66567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::enqueue(camera_metadata_t *buf) { 67567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 68567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 69567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount++; 70567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mEntries.push_back(buf); 71567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala notEmpty.signal(); 72567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 73567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mSignalConsumer && mDevice != NULL) { 74567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mSignalConsumer = false; 75567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 76567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMutex.unlock(); 77567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Signaling consumer", __FUNCTION__); 78567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice->ops->notify_request_queue_not_empty(mDevice); 79567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMutex.lock(); 80567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 81567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 82567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 83567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 84567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::getBufferCount() { 85567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 86567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount > 0) { 87567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS; 88567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 89567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mCount; 90567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 91567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 92567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::dequeue(camera_metadata_t **buf, bool incrementCount) { 93567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 94567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 95567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mCount == 0) { 96567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount == 0) { 97567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Empty", __FUNCTION__); 98567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buf = NULL; 99567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mSignalConsumer = true; 100567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 101567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 102567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Streaming %d frames to queue", __FUNCTION__, 103567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount); 104567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 105567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin(); 106567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala slotEntry != mStreamSlot.end(); 107567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala slotEntry++ ) { 108567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t entries = get_camera_metadata_entry_count(*slotEntry); 109567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t dataBytes = get_camera_metadata_data_count(*slotEntry); 110567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 111567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *copy = allocate_camera_metadata(entries, dataBytes); 112567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala append_camera_metadata(copy, *slotEntry); 113567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mEntries.push_back(copy); 114567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 115567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount = mStreamSlotCount; 116567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 117567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("MetadataQueue: deque (%d buffers)", mCount); 118567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *b = *(mEntries.begin()); 119567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mEntries.erase(mEntries.begin()); 120567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 121567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (incrementCount) { 122567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala add_camera_metadata_entry(b, 123567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANDROID_REQUEST_FRAME_COUNT, 124567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (void**)&mFrameCount, 1); 125567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFrameCount++; 126567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 127567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 128567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buf = b; 129567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCount--; 130567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 131567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 132567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 133567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 134567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::waitForBuffer(nsecs_t timeout) { 135567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 136567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 137567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mCount == 0) { 138567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = notEmpty.waitRelative(mMutex,timeout); 139567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 140567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 141567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 142567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 143567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 144567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::setStreamSlot(camera_metadata_t *buf) { 145567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (buf == NULL) { 146567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 147567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = 0; 148567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 149567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 150567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount > 1) { 151567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin(); 152567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(++mStreamSlot.begin(), mStreamSlot.end()); 153567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = 1; 154567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 155567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount == 1) { 156567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata( *(mStreamSlot.begin()) ); 157567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *(mStreamSlot.begin()) = buf; 158567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } else { 159567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlot.push_front(buf); 160567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = 1; 161567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 162567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 163567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 164567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 165567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::setStreamSlot(const List<camera_metadata_t*> &bufs) { 166567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mStreamSlotCount > 0) { 167567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 168567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 169567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlot = bufs; 170567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mStreamSlotCount = mStreamSlot.size(); 171567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 172567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 173567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 174567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 175567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t MetadataQueue::freeBuffers(List<camera_metadata_t*>::iterator start, 176567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala List<camera_metadata_t*>::iterator end) { 177567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (start != end) { 178567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(*start); 179567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala start = mStreamSlot.erase(start); 180567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 181567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 182567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 183567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 184567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::consumer_buffer_count( 185567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_request_queue_src_ops_t *q) { 186567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala MetadataQueue *queue = static_cast<MetadataQueue *>(q); 187567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->getBufferCount(); 188567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 189567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 190567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::consumer_dequeue(camera2_request_queue_src_ops_t *q, 191567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t **buffer) { 192567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala MetadataQueue *queue = static_cast<MetadataQueue *>(q); 193567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->dequeue(buffer, true); 194567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 195567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 196567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::consumer_free(camera2_request_queue_src_ops_t *q, 197567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *old_buffer) { 198567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala MetadataQueue *queue = static_cast<MetadataQueue *>(q); 199567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(old_buffer); 200567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 201567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 202567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 203567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::producer_dequeue(camera2_frame_queue_dst_ops_t *q, 204567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t entries, size_t bytes, 205567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t **buffer) { 206567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *new_buffer = 207567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala allocate_camera_metadata(entries, bytes); 208567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 209567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buffer = new_buffer; 210567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 211567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 212567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 213567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::producer_cancel(camera2_frame_queue_dst_ops_t *q, 214567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *old_buffer) { 215567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(old_buffer); 216567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 217567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 218567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 219567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::producer_enqueue(camera2_frame_queue_dst_ops_t *q, 220567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *filled_buffer) { 221567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala MetadataQueue *queue = static_cast<MetadataQueue *>(q); 222567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->enqueue(filled_buffer); 223567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 224567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 225567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 226567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * NotifierListener 227567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 228567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 229567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaNotifierListener::NotifierListener() { 230567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 231567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 232567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNotificationsFrom(camera2_device *dev) { 233567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (!dev) return BAD_VALUE; 234567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t err; 235567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala err = dev->ops->set_notify_callback(dev, 236567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala notify_callback_dispatch, 237567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (void*)this); 238567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return err; 239567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 240567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 241567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNextNotification(int32_t *msg_type, 242567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 243567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 244567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 245567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 246567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mNotifications.size() == 0) return BAD_VALUE; 247567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return getNextNotificationLocked(msg_type, ext1, ext2, ext3); 248567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 249567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 250567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::waitForNotification(int32_t *msg_type, 251567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 252567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 253567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 254567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 255567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mNotifications.size() == 0) { 256567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNewNotification.wait(mMutex); 257567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 258567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return getNextNotificationLocked(msg_type, ext1, ext2, ext3); 259567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 260567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 261567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint NotifierListener::numNotifications() { 262567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 263567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mNotifications.size(); 264567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 265567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 266567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNextNotificationLocked(int32_t *msg_type, 267567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 268567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 269567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 270567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *msg_type = mNotifications.begin()->msg_type; 271567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext1 = mNotifications.begin()->ext1; 272567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext2 = mNotifications.begin()->ext2; 273567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext3 = mNotifications.begin()->ext3; 274567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNotifications.erase(mNotifications.begin()); 275567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 276567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 277567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 278567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid NotifierListener::onNotify(int32_t msg_type, 279567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext1, 280567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext2, 281567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext3) { 282567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 283567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNotifications.push_back(Notification(msg_type, ext1, ext2, ext3)); 284567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNewNotification.signal(); 285567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 286567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 287567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid NotifierListener::notify_callback_dispatch(int32_t msg_type, 288567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext1, 289567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext2, 290567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext3, 291567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala void *user) { 292567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NotifierListener *me = reinterpret_cast<NotifierListener*>(user); 293567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala me->onNotify(msg_type, ext1, ext2, ext3); 294567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 295567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 296567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 297567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * StreamAdapter 298567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 299567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 300567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#ifndef container_of 301567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#define container_of(ptr, type, member) \ 302567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 303567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#endif 304567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 305567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaStreamAdapter::StreamAdapter(sp<ISurfaceTexture> consumer): 306567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState(UNINITIALIZED), mDevice(NULL), 307567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId(-1), 308567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth(0), mHeight(0), mFormatRequested(0) 309567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala{ 310567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mConsumerInterface = new SurfaceTextureClient(consumer); 311567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 312567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 313567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 314567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 315567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 316567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 317567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaStreamAdapter::~StreamAdapter() { 318567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala disconnect(); 319567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 320567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 321567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t StreamAdapter::connectToDevice(camera2_device_t *d, 322567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t width, uint32_t height, int format) { 323567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState != UNINITIALIZED) return INVALID_OPERATION; 324567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (d == NULL) { 325567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Null device passed to stream adapter", __FUNCTION__); 326567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return BAD_VALUE; 327567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 328567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 329567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 330567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 331567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth = width; 332567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mHeight = height; 333567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFormatRequested = format; 334567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 335567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Allocate device-side stream interface 336567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 337567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t id; 338567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t formatActual; 339567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t usage; 340567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t maxBuffers = 2; 341567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = d->ops->allocate_stream(d, 342567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth, mHeight, mFormatRequested, getStreamOps(), 343567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 344567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 345567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 346567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 347567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = UNINITIALIZED; 348567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 349567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 350567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice = d; 351567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 352567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId = id; 353567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFormat = formatActual; 354567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mUsage = usage; 355567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 356567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 357567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Configure consumer-side ANativeWindow interface 358567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 359567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 360567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 361567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 362567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 363567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 364567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = ALLOCATED; 365567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 366567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 367567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 368567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 369567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 370567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 371567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mUsage, mId); 372567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 373567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 374567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 375567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 376567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 377567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth, mHeight, mFormat); 378567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 379567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to configure buffer geometry" 380567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala " %d x %d, format 0x%x for stream %d", 381567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat, mId); 382567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 383567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 384567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 385567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 386567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int maxConsumerBuffers; 387567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 388567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 389567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 390567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 391567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 392567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 393567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 394567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 395567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 396567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 397567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Producer wants %d buffers, consumer wants %d", __FUNCTION__, 398567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxProducerBuffers, mMaxConsumerBuffers); 399567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 400567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int totalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 401567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 402567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 403567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala totalBuffers); 404567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 405567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 406567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 407567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 408567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 409567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 410567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 411567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Register allocated buffers with HAL device 412567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[totalBuffers]; 413567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[totalBuffers]; 414567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int bufferIdx = 0; 415567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (; bufferIdx < totalBuffers; bufferIdx++) { 416567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->dequeueBuffer(mConsumerInterface.get(), 417567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala &anwBuffers[bufferIdx]); 418567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 419567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for" 420567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 421567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 422567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala goto cleanUpBuffers; 423567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 424567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 425567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->lockBuffer(mConsumerInterface.get(), 426567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala anwBuffers[bufferIdx]); 427567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 428567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to lock buffer %d for initial registration for" 429567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 430567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 431567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala bufferIdx++; 432567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala goto cleanUpBuffers; 433567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 434567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 435567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 436567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 437567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 438567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mDevice->ops->register_stream_buffers(mDevice, 439567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId, 440567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala totalBuffers, 441567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffers); 442567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 443567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 444567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 445567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 446567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } else { 447567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = ACTIVE; 448567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 449567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 450567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalacleanUpBuffers: 451567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (int i = 0; i < bufferIdx; i++) { 452567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 453567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala anwBuffers[i]); 454567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 455567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala delete anwBuffers; 456567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala delete buffers; 457567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 458567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 459567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 460567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 461567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t StreamAdapter::disconnect() { 462567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 463567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState >= ALLOCATED) { 464567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mDevice->ops->release_stream(mDevice, mId); 465567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 466567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 467567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 468567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 469567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 470567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 471567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState >= CONNECTED) { 472567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 473567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 474567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 475567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to disconnect stream %d from native window", 476567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 477567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 478567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 479567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 480567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId = -1; 481567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = DISCONNECTED; 482567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 483567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 484567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 485567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::getId() { 486567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mId; 487567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 488567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 489567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalacamera2_stream_ops *StreamAdapter::getStreamOps() { 490567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 491567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 492567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 493567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaANativeWindow* StreamAdapter::toANW(camera2_stream_ops_t *w) { 494567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<StreamAdapter*>(w)->mConsumerInterface.get(); 495567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 496567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 497567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::dequeue_buffer(camera2_stream_ops_t *w, 498567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t** buffer) { 499567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int res; 500567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int state = static_cast<StreamAdapter*>(w)->mState; 501567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 502567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 503567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 504567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 505567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 506567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 507567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindowBuffer* anb; 508567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = a->dequeueBuffer(a, &anb); 509567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 510567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = a->lockBuffer(a, anb); 511567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 512567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 513567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buffer = &(anb->handle); 514567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 515567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 516567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 517567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 518567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::enqueue_buffer(camera2_stream_ops_t* w, 519567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int64_t timestamp, 520567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t* buffer) { 521567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int state = static_cast<StreamAdapter*>(w)->mState; 522567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 523567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 524567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 525567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 526567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 527567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t err; 528567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 529567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (err != OK) return err; 530567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return a->queueBuffer(a, 531567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala container_of(buffer, ANativeWindowBuffer, handle)); 532567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 533567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 534567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::cancel_buffer(camera2_stream_ops_t* w, 535567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t* buffer) { 536567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int state = static_cast<StreamAdapter*>(w)->mState; 537567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 538567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 539567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 540567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 541567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 542567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return a->cancelBuffer(a, 543567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala container_of(buffer, ANativeWindowBuffer, handle)); 544567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 545567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 546567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::set_crop(camera2_stream_ops_t* w, 547567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int left, int top, int right, int bottom) { 548567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int state = static_cast<StreamAdapter*>(w)->mState; 549567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 550567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 551567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 552567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 553567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 554567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 555567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return native_window_set_crop(a, &crop); 556567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 557567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 558567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 559567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * FrameWaiter 560567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 561567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 562567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaFrameWaiter::FrameWaiter(): 563567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames(0) { 564567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 565567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 566567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t FrameWaiter::waitForFrame(nsecs_t timeout) { 567567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 568567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock lock(mMutex); 569567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mPendingFrames == 0) { 570567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mCondition.waitRelative(mMutex, timeout); 571567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 572567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 573567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames--; 574567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 575567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 576567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 577567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid FrameWaiter::onFrameAvailable() { 578567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock lock(mMutex); 579567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames++; 580567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCondition.signal(); 581567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 582567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 583567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} // namespace android 584