camera2_utils.cpp revision bd85f47ae7b6b2af30cf9d51d7039fbba5a271ed
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) 5308a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaconst camera2_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 6108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaconst camera2_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 18408a6e5e374c57361275173e18eea120587627adfEino-Ville TalvalaMetadataQueue* MetadataQueue::getInstance( 18508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const camera2_request_queue_src_ops_t *q) { 18608a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 18708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 18808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala} 18908a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala 19008a6e5e374c57361275173e18eea120587627adfEino-Ville TalvalaMetadataQueue* MetadataQueue::getInstance( 19108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const camera2_frame_queue_dst_ops_t *q) { 19208a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 19308a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 19408a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala} 19508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala 196567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint MetadataQueue::consumer_buffer_count( 19708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala const camera2_request_queue_src_ops_t *q) { 19808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 199567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->getBufferCount(); 200567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 201567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 20208a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::consumer_dequeue(const camera2_request_queue_src_ops_t *q, 203567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t **buffer) { 20408a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 205567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->dequeue(buffer, true); 206567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 207567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 20808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::consumer_free(const camera2_request_queue_src_ops_t *q, 209567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *old_buffer) { 21008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 211567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(old_buffer); 212567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 213567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 214567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 21508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::producer_dequeue(const camera2_frame_queue_dst_ops_t *q, 216567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala size_t entries, size_t bytes, 217567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t **buffer) { 218567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *new_buffer = 219567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala allocate_camera_metadata(entries, bytes); 220567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 221567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buffer = new_buffer; 222567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 223567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 224567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 22508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::producer_cancel(const camera2_frame_queue_dst_ops_t *q, 226567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *old_buffer) { 227567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala free_camera_metadata(old_buffer); 228567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 229567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 230567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 23108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint MetadataQueue::producer_enqueue(const camera2_frame_queue_dst_ops_t *q, 232567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera_metadata_t *filled_buffer) { 23308a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala MetadataQueue *queue = getInstance(q); 234567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return queue->enqueue(filled_buffer); 235567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 236567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 237567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 238567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * NotifierListener 239567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 240567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 241567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaNotifierListener::NotifierListener() { 242567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 243567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 244567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNotificationsFrom(camera2_device *dev) { 245567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (!dev) return BAD_VALUE; 246567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t err; 247567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala err = dev->ops->set_notify_callback(dev, 248567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala notify_callback_dispatch, 249567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (void*)this); 250567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return err; 251567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 252567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 253567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNextNotification(int32_t *msg_type, 254567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 255567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 256567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 257567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 258567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mNotifications.size() == 0) return BAD_VALUE; 259567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return getNextNotificationLocked(msg_type, ext1, ext2, ext3); 260567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 261567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 262567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::waitForNotification(int32_t *msg_type, 263567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext1, 264567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext2, 265567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t *ext3) { 266567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 267567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mNotifications.size() == 0) { 268567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNewNotification.wait(mMutex); 269567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 270567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return getNextNotificationLocked(msg_type, ext1, ext2, ext3); 271567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 272567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 273567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint NotifierListener::numNotifications() { 274567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 275567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mNotifications.size(); 276567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 277567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 278567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t NotifierListener::getNextNotificationLocked(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 *msg_type = mNotifications.begin()->msg_type; 283567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext1 = mNotifications.begin()->ext1; 284567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext2 = mNotifications.begin()->ext2; 285567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *ext3 = mNotifications.begin()->ext3; 286567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNotifications.erase(mNotifications.begin()); 287567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 288567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 289567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 290567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid NotifierListener::onNotify(int32_t msg_type, 291567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext1, 292567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext2, 293567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext3) { 294567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock l(mMutex); 295567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNotifications.push_back(Notification(msg_type, ext1, ext2, ext3)); 296567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mNewNotification.signal(); 297567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 298567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 299567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid NotifierListener::notify_callback_dispatch(int32_t msg_type, 300567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext1, 301567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext2, 302567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int32_t ext3, 303567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala void *user) { 304567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NotifierListener *me = reinterpret_cast<NotifierListener*>(user); 305567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala me->onNotify(msg_type, ext1, ext2, ext3); 306567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 307567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 308567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 309567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * StreamAdapter 310567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 311567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 312567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#ifndef container_of 313567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#define container_of(ptr, type, member) \ 314567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 315567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala#endif 316567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 317567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaStreamAdapter::StreamAdapter(sp<ISurfaceTexture> consumer): 318567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState(UNINITIALIZED), mDevice(NULL), 319567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId(-1), 320567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth(0), mHeight(0), mFormatRequested(0) 321567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala{ 322567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mConsumerInterface = new SurfaceTextureClient(consumer); 323567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 324567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 325567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 326567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 327567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 328567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 329567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaStreamAdapter::~StreamAdapter() { 330567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala disconnect(); 331567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 332567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 333567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t StreamAdapter::connectToDevice(camera2_device_t *d, 334567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t width, uint32_t height, int format) { 335567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState != UNINITIALIZED) return INVALID_OPERATION; 336567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (d == NULL) { 337567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Null device passed to stream adapter", __FUNCTION__); 338567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return BAD_VALUE; 339567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 340567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 341567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 342567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 343567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth = width; 344567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mHeight = height; 345567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFormatRequested = format; 346567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 347567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Allocate device-side stream interface 348567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 349567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t id; 350567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t formatActual; 351567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t usage; 352567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala uint32_t maxBuffers = 2; 353567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = d->ops->allocate_stream(d, 354567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth, mHeight, mFormatRequested, getStreamOps(), 355567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 356567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 357567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 358567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, strerror(-res), res); 359567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = UNINITIALIZED; 360567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 361567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 362567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mDevice = d; 363567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 364567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId = id; 365567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mFormat = formatActual; 366567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mUsage = usage; 367567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 368567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 369567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Configure consumer-side ANativeWindow interface 370567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 371567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 372567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 373567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 374567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 375567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 376567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = ALLOCATED; 377567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 378567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 379567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 380567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 381567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 382567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 383567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mUsage, mId); 384567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 385567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 386567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 387567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 388567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 389567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mWidth, mHeight, mFormat); 390567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 391567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to configure buffer geometry" 392567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala " %d x %d, format 0x%x for stream %d", 393567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat, mId); 394567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 395567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 396567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 397567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 398567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int maxConsumerBuffers; 399567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 400567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 401567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 402567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 403567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 404567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 405567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 406567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 407567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 408567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 409567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGV("%s: Producer wants %d buffers, consumer wants %d", __FUNCTION__, 410567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mMaxProducerBuffers, mMaxConsumerBuffers); 411567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 412567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int totalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 413567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 414567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 415567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala totalBuffers); 416567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 417567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 418567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 419567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 420567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 421567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 422567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 423567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala // Register allocated buffers with HAL device 424567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[totalBuffers]; 425567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[totalBuffers]; 426567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int bufferIdx = 0; 427567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (; bufferIdx < totalBuffers; bufferIdx++) { 428bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(), 429567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala &anwBuffers[bufferIdx]); 430567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 431567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for" 432567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 433567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 434567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala goto cleanUpBuffers; 435567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 436567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 437567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 438567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 439567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mDevice->ops->register_stream_buffers(mDevice, 440567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId, 441567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala totalBuffers, 442567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffers); 443567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 444567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 445567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 446567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = CONNECTED; 447567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } else { 448567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = ACTIVE; 449567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 450567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 451567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalacleanUpBuffers: 452567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala for (int i = 0; i < bufferIdx; i++) { 453567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 454bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis anwBuffers[i], -1); 455567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 456567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala delete anwBuffers; 457567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala delete buffers; 458567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 459567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 460567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 461567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 462567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t StreamAdapter::disconnect() { 463567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 464567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState >= ALLOCATED) { 465567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mDevice->ops->release_stream(mDevice, mId); 466567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 467567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 468567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 469567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 470567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 471567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 472567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (mState >= CONNECTED) { 473567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 474567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 475567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) { 476567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Unable to disconnect stream %d from native window", 477567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala __FUNCTION__, mId); 478567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 479567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 480567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 481567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mId = -1; 482567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mState = DISCONNECTED; 483567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 484567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 485567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 486567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalaint StreamAdapter::getId() { 487567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return mId; 488567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 489567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 49008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaconst camera2_stream_ops *StreamAdapter::getStreamOps() { 491567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 492567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 493567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 49408a6e5e374c57361275173e18eea120587627adfEino-Ville TalvalaANativeWindow* StreamAdapter::toANW(const camera2_stream_ops_t *w) { 49508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get(); 496567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 497567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 49808a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w, 499567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t** buffer) { 500567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int res; 50108a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 502567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 503567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 504567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 505567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 506567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 507567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 508567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindowBuffer* anb; 509bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis res = native_window_dequeue_buffer_and_wait(a, &anb); 510567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 511567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 512567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala *buffer = &(anb->handle); 513567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 514567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return res; 515567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 516567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 51708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w, 518567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int64_t timestamp, 519567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t* buffer) { 52008a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 521567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 522567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 523567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 524567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 525567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 526567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t err; 527567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 528567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (err != OK) return err; 529567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return a->queueBuffer(a, 530bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 531567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 532567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 53308a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w, 534567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala buffer_handle_t* buffer) { 53508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 536567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 537567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 538567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 539567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 540567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 541567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return a->cancelBuffer(a, 542bd85f47ae7b6b2af30cf9d51d7039fbba5a271edJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 543567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 544567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 54508a6e5e374c57361275173e18eea120587627adfEino-Ville Talvalaint StreamAdapter::set_crop(const camera2_stream_ops_t* w, 546567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala int left, int top, int right, int bottom) { 54708a6e5e374c57361275173e18eea120587627adfEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 548567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (state != ACTIVE) { 549567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 550567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return INVALID_OPERATION; 551567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 552567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala ANativeWindow *a = toANW(w); 553567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 554567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return native_window_set_crop(a, &crop); 555567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 556567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 557567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala/** 558567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala * FrameWaiter 559567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala */ 560567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 561567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville TalvalaFrameWaiter::FrameWaiter(): 562567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames(0) { 563567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 564567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 565567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalastatus_t FrameWaiter::waitForFrame(nsecs_t timeout) { 566567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala status_t res; 567567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock lock(mMutex); 568567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala while (mPendingFrames == 0) { 569567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala res = mCondition.waitRelative(mMutex, timeout); 570567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala if (res != OK) return res; 571567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala } 572567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames--; 573567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala return OK; 574567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 575567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 576567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvalavoid FrameWaiter::onFrameAvailable() { 577567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala Mutex::Autolock lock(mMutex); 578567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mPendingFrames++; 579567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala mCondition.signal(); 580567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} 581567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala 582567b4a24fa9fedf0086af5e0bb8e45bd3294bc9dEino-Ville Talvala} // namespace android 583