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