xref: /aosp_15_r20/hardware/libhardware/modules/camera/3_0/Stream.cpp (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*e01b6f76SAndroid Build Coastguard Worker  *
4*e01b6f76SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e01b6f76SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e01b6f76SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e01b6f76SAndroid Build Coastguard Worker  *
8*e01b6f76SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e01b6f76SAndroid Build Coastguard Worker  *
10*e01b6f76SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e01b6f76SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e01b6f76SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e01b6f76SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e01b6f76SAndroid Build Coastguard Worker  * limitations under the License.
15*e01b6f76SAndroid Build Coastguard Worker  */
16*e01b6f76SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
17*e01b6f76SAndroid Build Coastguard Worker #define LOG_TAG "Stream"
18*e01b6f76SAndroid Build Coastguard Worker 
19*e01b6f76SAndroid Build Coastguard Worker #include <stdio.h>
20*e01b6f76SAndroid Build Coastguard Worker 
21*e01b6f76SAndroid Build Coastguard Worker #include <log/log.h>
22*e01b6f76SAndroid Build Coastguard Worker #include <utils/Mutex.h>
23*e01b6f76SAndroid Build Coastguard Worker 
24*e01b6f76SAndroid Build Coastguard Worker #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
25*e01b6f76SAndroid Build Coastguard Worker #include <utils/Trace.h>
26*e01b6f76SAndroid Build Coastguard Worker 
27*e01b6f76SAndroid Build Coastguard Worker #include <hardware/camera3.h>
28*e01b6f76SAndroid Build Coastguard Worker #include <hardware/gralloc.h>
29*e01b6f76SAndroid Build Coastguard Worker #include <system/graphics.h>
30*e01b6f76SAndroid Build Coastguard Worker 
31*e01b6f76SAndroid Build Coastguard Worker #include "Stream.h"
32*e01b6f76SAndroid Build Coastguard Worker 
33*e01b6f76SAndroid Build Coastguard Worker namespace default_camera_hal {
34*e01b6f76SAndroid Build Coastguard Worker 
Stream(int id,camera3_stream_t * s)35*e01b6f76SAndroid Build Coastguard Worker Stream::Stream(int id, camera3_stream_t *s)
36*e01b6f76SAndroid Build Coastguard Worker   : mReuse(false),
37*e01b6f76SAndroid Build Coastguard Worker     mId(id),
38*e01b6f76SAndroid Build Coastguard Worker     mStream(s),
39*e01b6f76SAndroid Build Coastguard Worker     mType(s->stream_type),
40*e01b6f76SAndroid Build Coastguard Worker     mWidth(s->width),
41*e01b6f76SAndroid Build Coastguard Worker     mHeight(s->height),
42*e01b6f76SAndroid Build Coastguard Worker     mFormat(s->format),
43*e01b6f76SAndroid Build Coastguard Worker     mUsage(0),
44*e01b6f76SAndroid Build Coastguard Worker     mMaxBuffers(0),
45*e01b6f76SAndroid Build Coastguard Worker     mRegistered(false),
46*e01b6f76SAndroid Build Coastguard Worker     mBuffers(0),
47*e01b6f76SAndroid Build Coastguard Worker     mNumBuffers(0)
48*e01b6f76SAndroid Build Coastguard Worker {
49*e01b6f76SAndroid Build Coastguard Worker }
50*e01b6f76SAndroid Build Coastguard Worker 
~Stream()51*e01b6f76SAndroid Build Coastguard Worker Stream::~Stream()
52*e01b6f76SAndroid Build Coastguard Worker {
53*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
54*e01b6f76SAndroid Build Coastguard Worker     unregisterBuffers_L();
55*e01b6f76SAndroid Build Coastguard Worker }
56*e01b6f76SAndroid Build Coastguard Worker 
setUsage(uint32_t usage)57*e01b6f76SAndroid Build Coastguard Worker void Stream::setUsage(uint32_t usage)
58*e01b6f76SAndroid Build Coastguard Worker {
59*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
60*e01b6f76SAndroid Build Coastguard Worker     if (usage != mUsage) {
61*e01b6f76SAndroid Build Coastguard Worker         mUsage = usage;
62*e01b6f76SAndroid Build Coastguard Worker         mStream->usage = usage;
63*e01b6f76SAndroid Build Coastguard Worker         unregisterBuffers_L();
64*e01b6f76SAndroid Build Coastguard Worker     }
65*e01b6f76SAndroid Build Coastguard Worker }
66*e01b6f76SAndroid Build Coastguard Worker 
setMaxBuffers(uint32_t max_buffers)67*e01b6f76SAndroid Build Coastguard Worker void Stream::setMaxBuffers(uint32_t max_buffers)
68*e01b6f76SAndroid Build Coastguard Worker {
69*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
70*e01b6f76SAndroid Build Coastguard Worker     if (max_buffers != mMaxBuffers) {
71*e01b6f76SAndroid Build Coastguard Worker         mMaxBuffers = max_buffers;
72*e01b6f76SAndroid Build Coastguard Worker         mStream->max_buffers = max_buffers;
73*e01b6f76SAndroid Build Coastguard Worker         unregisterBuffers_L();
74*e01b6f76SAndroid Build Coastguard Worker     }
75*e01b6f76SAndroid Build Coastguard Worker }
76*e01b6f76SAndroid Build Coastguard Worker 
getType()77*e01b6f76SAndroid Build Coastguard Worker int Stream::getType()
78*e01b6f76SAndroid Build Coastguard Worker {
79*e01b6f76SAndroid Build Coastguard Worker     return mType;
80*e01b6f76SAndroid Build Coastguard Worker }
81*e01b6f76SAndroid Build Coastguard Worker 
isInputType()82*e01b6f76SAndroid Build Coastguard Worker bool Stream::isInputType()
83*e01b6f76SAndroid Build Coastguard Worker {
84*e01b6f76SAndroid Build Coastguard Worker     return mType == CAMERA3_STREAM_INPUT ||
85*e01b6f76SAndroid Build Coastguard Worker         mType == CAMERA3_STREAM_BIDIRECTIONAL;
86*e01b6f76SAndroid Build Coastguard Worker }
87*e01b6f76SAndroid Build Coastguard Worker 
isOutputType()88*e01b6f76SAndroid Build Coastguard Worker bool Stream::isOutputType()
89*e01b6f76SAndroid Build Coastguard Worker {
90*e01b6f76SAndroid Build Coastguard Worker     return mType == CAMERA3_STREAM_OUTPUT ||
91*e01b6f76SAndroid Build Coastguard Worker         mType == CAMERA3_STREAM_BIDIRECTIONAL;
92*e01b6f76SAndroid Build Coastguard Worker }
93*e01b6f76SAndroid Build Coastguard Worker 
typeToString(int type)94*e01b6f76SAndroid Build Coastguard Worker const char* Stream::typeToString(int type)
95*e01b6f76SAndroid Build Coastguard Worker {
96*e01b6f76SAndroid Build Coastguard Worker     switch (type) {
97*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_STREAM_INPUT:
98*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_STREAM_INPUT";
99*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_STREAM_OUTPUT:
100*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_STREAM_OUTPUT";
101*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_STREAM_BIDIRECTIONAL:
102*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_STREAM_BIDIRECTIONAL";
103*e01b6f76SAndroid Build Coastguard Worker     }
104*e01b6f76SAndroid Build Coastguard Worker     return "Invalid stream type!";
105*e01b6f76SAndroid Build Coastguard Worker }
106*e01b6f76SAndroid Build Coastguard Worker 
formatToString(int format)107*e01b6f76SAndroid Build Coastguard Worker const char* Stream::formatToString(int format)
108*e01b6f76SAndroid Build Coastguard Worker {
109*e01b6f76SAndroid Build Coastguard Worker     // See <system/graphics.h> for full list
110*e01b6f76SAndroid Build Coastguard Worker     switch (format) {
111*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_BGRA_8888:
112*e01b6f76SAndroid Build Coastguard Worker         return "BGRA 8888";
113*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGBA_8888:
114*e01b6f76SAndroid Build Coastguard Worker         return "RGBA 8888";
115*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGBX_8888:
116*e01b6f76SAndroid Build Coastguard Worker         return "RGBX 8888";
117*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGB_888:
118*e01b6f76SAndroid Build Coastguard Worker         return "RGB 888";
119*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGB_565:
120*e01b6f76SAndroid Build Coastguard Worker         return "RGB 565";
121*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_Y8:
122*e01b6f76SAndroid Build Coastguard Worker         return "Y8";
123*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_Y16:
124*e01b6f76SAndroid Build Coastguard Worker         return "Y16";
125*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YV12:
126*e01b6f76SAndroid Build Coastguard Worker         return "YV12";
127*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
128*e01b6f76SAndroid Build Coastguard Worker         return "NV16";
129*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
130*e01b6f76SAndroid Build Coastguard Worker         return "NV21";
131*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCbCr_422_I:
132*e01b6f76SAndroid Build Coastguard Worker         return "YUY2";
133*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RAW10:
134*e01b6f76SAndroid Build Coastguard Worker         return "RAW10";
135*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RAW16:
136*e01b6f76SAndroid Build Coastguard Worker         return "RAW16";
137*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_BLOB:
138*e01b6f76SAndroid Build Coastguard Worker         return "BLOB";
139*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
140*e01b6f76SAndroid Build Coastguard Worker         return "IMPLEMENTATION DEFINED";
141*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCbCr_420_888:
142*e01b6f76SAndroid Build Coastguard Worker         return "FLEXIBLE YCbCr 420 888";
143*e01b6f76SAndroid Build Coastguard Worker     }
144*e01b6f76SAndroid Build Coastguard Worker     return "Invalid stream format!";
145*e01b6f76SAndroid Build Coastguard Worker }
146*e01b6f76SAndroid Build Coastguard Worker 
isRegistered()147*e01b6f76SAndroid Build Coastguard Worker bool Stream::isRegistered()
148*e01b6f76SAndroid Build Coastguard Worker {
149*e01b6f76SAndroid Build Coastguard Worker     return mRegistered;
150*e01b6f76SAndroid Build Coastguard Worker }
151*e01b6f76SAndroid Build Coastguard Worker 
isValidReuseStream(int id,camera3_stream_t * s)152*e01b6f76SAndroid Build Coastguard Worker bool Stream::isValidReuseStream(int id, camera3_stream_t *s)
153*e01b6f76SAndroid Build Coastguard Worker {
154*e01b6f76SAndroid Build Coastguard Worker     if (id != mId) {
155*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid camera id for reuse. Got %d expect %d",
156*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, id, mId);
157*e01b6f76SAndroid Build Coastguard Worker         return false;
158*e01b6f76SAndroid Build Coastguard Worker     }
159*e01b6f76SAndroid Build Coastguard Worker     if (s != mStream) {
160*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid stream handle for reuse. Got %p expect %p",
161*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, s, mStream);
162*e01b6f76SAndroid Build Coastguard Worker         return false;
163*e01b6f76SAndroid Build Coastguard Worker     }
164*e01b6f76SAndroid Build Coastguard Worker     if (s->stream_type != mType) {
165*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched type in reused stream. Got %s(%d) "
166*e01b6f76SAndroid Build Coastguard Worker                 "expect %s(%d)", __func__, mId, typeToString(s->stream_type),
167*e01b6f76SAndroid Build Coastguard Worker                 s->stream_type, typeToString(mType), mType);
168*e01b6f76SAndroid Build Coastguard Worker         return false;
169*e01b6f76SAndroid Build Coastguard Worker     }
170*e01b6f76SAndroid Build Coastguard Worker     if (s->format != mFormat) {
171*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched format in reused stream. Got %s(%d) "
172*e01b6f76SAndroid Build Coastguard Worker                 "expect %s(%d)", __func__, mId, formatToString(s->format),
173*e01b6f76SAndroid Build Coastguard Worker                 s->format, formatToString(mFormat), mFormat);
174*e01b6f76SAndroid Build Coastguard Worker         return false;
175*e01b6f76SAndroid Build Coastguard Worker     }
176*e01b6f76SAndroid Build Coastguard Worker     if (s->width != mWidth) {
177*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched width in reused stream. Got %d expect %d",
178*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, s->width, mWidth);
179*e01b6f76SAndroid Build Coastguard Worker         return false;
180*e01b6f76SAndroid Build Coastguard Worker     }
181*e01b6f76SAndroid Build Coastguard Worker     if (s->height != mHeight) {
182*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched height in reused stream. Got %d expect %d",
183*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, s->height, mHeight);
184*e01b6f76SAndroid Build Coastguard Worker         return false;
185*e01b6f76SAndroid Build Coastguard Worker     }
186*e01b6f76SAndroid Build Coastguard Worker     return true;
187*e01b6f76SAndroid Build Coastguard Worker }
188*e01b6f76SAndroid Build Coastguard Worker 
registerBuffers(const camera3_stream_buffer_set_t * buf_set)189*e01b6f76SAndroid Build Coastguard Worker int Stream::registerBuffers(const camera3_stream_buffer_set_t *buf_set)
190*e01b6f76SAndroid Build Coastguard Worker {
191*e01b6f76SAndroid Build Coastguard Worker     ATRACE_CALL();
192*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
193*e01b6f76SAndroid Build Coastguard Worker 
194*e01b6f76SAndroid Build Coastguard Worker     if (buf_set->stream != mStream) {
195*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Buffer set for invalid stream. Got %p expect %p",
196*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, buf_set->stream, mStream);
197*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
198*e01b6f76SAndroid Build Coastguard Worker     }
199*e01b6f76SAndroid Build Coastguard Worker 
200*e01b6f76SAndroid Build Coastguard Worker     mNumBuffers = buf_set->num_buffers;
201*e01b6f76SAndroid Build Coastguard Worker     mBuffers = new buffer_handle_t*[mNumBuffers];
202*e01b6f76SAndroid Build Coastguard Worker 
203*e01b6f76SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < mNumBuffers; i++) {
204*e01b6f76SAndroid Build Coastguard Worker         ALOGV("%s:%d: Registering buffer %p", __func__, mId,
205*e01b6f76SAndroid Build Coastguard Worker                 buf_set->buffers[i]);
206*e01b6f76SAndroid Build Coastguard Worker         mBuffers[i] = buf_set->buffers[i];
207*e01b6f76SAndroid Build Coastguard Worker         // TODO: register buffers with hw, handle error cases
208*e01b6f76SAndroid Build Coastguard Worker     }
209*e01b6f76SAndroid Build Coastguard Worker     mRegistered = true;
210*e01b6f76SAndroid Build Coastguard Worker 
211*e01b6f76SAndroid Build Coastguard Worker     return 0;
212*e01b6f76SAndroid Build Coastguard Worker }
213*e01b6f76SAndroid Build Coastguard Worker 
214*e01b6f76SAndroid Build Coastguard Worker // This must only be called with mLock held
unregisterBuffers_L()215*e01b6f76SAndroid Build Coastguard Worker void Stream::unregisterBuffers_L()
216*e01b6f76SAndroid Build Coastguard Worker {
217*e01b6f76SAndroid Build Coastguard Worker     mRegistered = false;
218*e01b6f76SAndroid Build Coastguard Worker     mNumBuffers = 0;
219*e01b6f76SAndroid Build Coastguard Worker     delete [] mBuffers;
220*e01b6f76SAndroid Build Coastguard Worker     // TODO: unregister buffers from hw
221*e01b6f76SAndroid Build Coastguard Worker }
222*e01b6f76SAndroid Build Coastguard Worker 
dump(int fd)223*e01b6f76SAndroid Build Coastguard Worker void Stream::dump(int fd)
224*e01b6f76SAndroid Build Coastguard Worker {
225*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
226*e01b6f76SAndroid Build Coastguard Worker 
227*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Stream ID: %d (%p)\n", mId, mStream);
228*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Stream Type: %s (%d)\n", typeToString(mType), mType);
229*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Width: %" PRIu32 " Height: %" PRIu32 "\n", mWidth, mHeight);
230*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Stream Format: %s (%d)", formatToString(mFormat), mFormat);
231*e01b6f76SAndroid Build Coastguard Worker     // ToDo: prettyprint usage mask flags
232*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Gralloc Usage Mask: %#" PRIx32 "\n", mUsage);
233*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Max Buffer Count: %" PRIu32 "\n", mMaxBuffers);
234*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Buffers Registered: %s\n", mRegistered ? "true" : "false");
235*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Number of Buffers: %" PRIu32 "\n", mNumBuffers);
236*e01b6f76SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < mNumBuffers; i++) {
237*e01b6f76SAndroid Build Coastguard Worker         dprintf(fd, "Buffer %" PRIu32 "/%" PRIu32 ": %p\n", i, mNumBuffers,
238*e01b6f76SAndroid Build Coastguard Worker                 mBuffers[i]);
239*e01b6f76SAndroid Build Coastguard Worker     }
240*e01b6f76SAndroid Build Coastguard Worker }
241*e01b6f76SAndroid Build Coastguard Worker 
242*e01b6f76SAndroid Build Coastguard Worker } // namespace default_camera_hal
243