xref: /aosp_15_r20/hardware/libhardware/modules/usbcamera/Stream.cpp (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker  * Copyright (C) 2015 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 
17*e01b6f76SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*e01b6f76SAndroid Build Coastguard Worker #define LOG_TAG "Stream"
19*e01b6f76SAndroid Build Coastguard Worker 
20*e01b6f76SAndroid Build Coastguard Worker #include <stdio.h>
21*e01b6f76SAndroid Build Coastguard Worker 
22*e01b6f76SAndroid Build Coastguard Worker #include <log/log.h>
23*e01b6f76SAndroid Build Coastguard Worker #include <utils/Mutex.h>
24*e01b6f76SAndroid Build Coastguard Worker 
25*e01b6f76SAndroid Build Coastguard Worker #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
26*e01b6f76SAndroid Build Coastguard Worker #include <utils/Trace.h>
27*e01b6f76SAndroid Build Coastguard Worker 
28*e01b6f76SAndroid Build Coastguard Worker #include <hardware/camera3.h>
29*e01b6f76SAndroid Build Coastguard Worker #include <hardware/gralloc.h>
30*e01b6f76SAndroid Build Coastguard Worker #include <system/graphics.h>
31*e01b6f76SAndroid Build Coastguard Worker 
32*e01b6f76SAndroid Build Coastguard Worker #include "Stream.h"
33*e01b6f76SAndroid Build Coastguard Worker 
34*e01b6f76SAndroid Build Coastguard Worker namespace usb_camera_hal {
35*e01b6f76SAndroid Build Coastguard Worker 
Stream(int id,camera3_stream_t * s)36*e01b6f76SAndroid Build Coastguard Worker Stream::Stream(int id, camera3_stream_t *s)
37*e01b6f76SAndroid Build Coastguard Worker   : mReuse(false),
38*e01b6f76SAndroid Build Coastguard Worker     mId(id),
39*e01b6f76SAndroid Build Coastguard Worker     mStream(s){
40*e01b6f76SAndroid Build Coastguard Worker }
41*e01b6f76SAndroid Build Coastguard Worker 
~Stream()42*e01b6f76SAndroid Build Coastguard Worker Stream::~Stream() {
43*e01b6f76SAndroid Build Coastguard Worker     for (size_t i = 0; i < mBuffers.size(); i++) {
44*e01b6f76SAndroid Build Coastguard Worker         delete mBuffers[i];
45*e01b6f76SAndroid Build Coastguard Worker     }
46*e01b6f76SAndroid Build Coastguard Worker 
47*e01b6f76SAndroid Build Coastguard Worker     mBuffers.clear();
48*e01b6f76SAndroid Build Coastguard Worker }
49*e01b6f76SAndroid Build Coastguard Worker 
setUsage(uint32_t usage)50*e01b6f76SAndroid Build Coastguard Worker void Stream::setUsage(uint32_t usage) {
51*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
52*e01b6f76SAndroid Build Coastguard Worker     if (usage != mStream->usage) {
53*e01b6f76SAndroid Build Coastguard Worker         mStream->usage = usage;
54*e01b6f76SAndroid Build Coastguard Worker     }
55*e01b6f76SAndroid Build Coastguard Worker }
56*e01b6f76SAndroid Build Coastguard Worker 
setMaxBuffers(uint32_t max_buffers)57*e01b6f76SAndroid Build Coastguard Worker void Stream::setMaxBuffers(uint32_t max_buffers) {
58*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
59*e01b6f76SAndroid Build Coastguard Worker     if (max_buffers != mStream->max_buffers) {
60*e01b6f76SAndroid Build Coastguard Worker         mStream->max_buffers = max_buffers;
61*e01b6f76SAndroid Build Coastguard Worker     }
62*e01b6f76SAndroid Build Coastguard Worker }
63*e01b6f76SAndroid Build Coastguard Worker 
getType()64*e01b6f76SAndroid Build Coastguard Worker int Stream::getType() {
65*e01b6f76SAndroid Build Coastguard Worker     return mStream->stream_type;
66*e01b6f76SAndroid Build Coastguard Worker }
67*e01b6f76SAndroid Build Coastguard Worker 
isInputType()68*e01b6f76SAndroid Build Coastguard Worker bool Stream::isInputType() {
69*e01b6f76SAndroid Build Coastguard Worker     return mStream->stream_type == CAMERA3_STREAM_INPUT ||
70*e01b6f76SAndroid Build Coastguard Worker             mStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL;
71*e01b6f76SAndroid Build Coastguard Worker }
72*e01b6f76SAndroid Build Coastguard Worker 
isOutputType()73*e01b6f76SAndroid Build Coastguard Worker bool Stream::isOutputType() {
74*e01b6f76SAndroid Build Coastguard Worker     return mStream->stream_type == CAMERA3_STREAM_OUTPUT ||
75*e01b6f76SAndroid Build Coastguard Worker             mStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL;
76*e01b6f76SAndroid Build Coastguard Worker }
77*e01b6f76SAndroid Build Coastguard Worker 
typeToString(int type)78*e01b6f76SAndroid Build Coastguard Worker const char* Stream::typeToString(int type) {
79*e01b6f76SAndroid Build Coastguard Worker     switch (type) {
80*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_STREAM_INPUT:
81*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_STREAM_INPUT";
82*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_STREAM_OUTPUT:
83*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_STREAM_OUTPUT";
84*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_STREAM_BIDIRECTIONAL:
85*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_STREAM_BIDIRECTIONAL";
86*e01b6f76SAndroid Build Coastguard Worker     }
87*e01b6f76SAndroid Build Coastguard Worker     return "Invalid stream type!";
88*e01b6f76SAndroid Build Coastguard Worker }
89*e01b6f76SAndroid Build Coastguard Worker 
formatToString(int format)90*e01b6f76SAndroid Build Coastguard Worker const char* Stream::formatToString(int format) {
91*e01b6f76SAndroid Build Coastguard Worker     // See <system/graphics.h> for full list
92*e01b6f76SAndroid Build Coastguard Worker     switch (format) {
93*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_BGRA_8888:
94*e01b6f76SAndroid Build Coastguard Worker         return "BGRA 8888";
95*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGBA_8888:
96*e01b6f76SAndroid Build Coastguard Worker         return "RGBA 8888";
97*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGBX_8888:
98*e01b6f76SAndroid Build Coastguard Worker         return "RGBX 8888";
99*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGB_888:
100*e01b6f76SAndroid Build Coastguard Worker         return "RGB 888";
101*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RGB_565:
102*e01b6f76SAndroid Build Coastguard Worker         return "RGB 565";
103*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_Y8:
104*e01b6f76SAndroid Build Coastguard Worker         return "Y8";
105*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_Y16:
106*e01b6f76SAndroid Build Coastguard Worker         return "Y16";
107*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YV12:
108*e01b6f76SAndroid Build Coastguard Worker         return "YV12";
109*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
110*e01b6f76SAndroid Build Coastguard Worker         return "NV16";
111*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
112*e01b6f76SAndroid Build Coastguard Worker         return "NV21";
113*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCbCr_422_I:
114*e01b6f76SAndroid Build Coastguard Worker         return "YUY2";
115*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RAW10:
116*e01b6f76SAndroid Build Coastguard Worker         return "RAW10";
117*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_RAW16:
118*e01b6f76SAndroid Build Coastguard Worker         return "RAW16";
119*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_BLOB:
120*e01b6f76SAndroid Build Coastguard Worker         return "BLOB";
121*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
122*e01b6f76SAndroid Build Coastguard Worker         return "IMPLEMENTATION DEFINED";
123*e01b6f76SAndroid Build Coastguard Worker     case HAL_PIXEL_FORMAT_YCbCr_420_888:
124*e01b6f76SAndroid Build Coastguard Worker         return "FLEXIBLE YCbCr 420 888";
125*e01b6f76SAndroid Build Coastguard Worker     }
126*e01b6f76SAndroid Build Coastguard Worker     return "Invalid stream format!";
127*e01b6f76SAndroid Build Coastguard Worker }
128*e01b6f76SAndroid Build Coastguard Worker 
isValidReuseStream(int id,camera3_stream_t * s)129*e01b6f76SAndroid Build Coastguard Worker bool Stream::isValidReuseStream(int id, camera3_stream_t *s) {
130*e01b6f76SAndroid Build Coastguard Worker     if (id != mId) {
131*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid camera id for reuse. Got %d expect %d",
132*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, id, mId);
133*e01b6f76SAndroid Build Coastguard Worker         return false;
134*e01b6f76SAndroid Build Coastguard Worker     }
135*e01b6f76SAndroid Build Coastguard Worker     if (s != mStream) {
136*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid stream handle for reuse. Got %p expect %p",
137*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, s, mStream);
138*e01b6f76SAndroid Build Coastguard Worker         return false;
139*e01b6f76SAndroid Build Coastguard Worker     }
140*e01b6f76SAndroid Build Coastguard Worker     if (s->stream_type != mStream->stream_type) {
141*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched type in reused stream. Got %s(%d) "
142*e01b6f76SAndroid Build Coastguard Worker                 "expect %s(%d)", __func__, mId, typeToString(s->stream_type),
143*e01b6f76SAndroid Build Coastguard Worker                 s->stream_type, typeToString(mStream->stream_type), mStream->stream_type);
144*e01b6f76SAndroid Build Coastguard Worker         return false;
145*e01b6f76SAndroid Build Coastguard Worker     }
146*e01b6f76SAndroid Build Coastguard Worker     if (s->format != mStream->format) {
147*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched format in reused stream. Got %s(%d) "
148*e01b6f76SAndroid Build Coastguard Worker                 "expect %s(%d)", __func__, mId, formatToString(s->format),
149*e01b6f76SAndroid Build Coastguard Worker                 s->format, formatToString(mStream->format), mStream->format);
150*e01b6f76SAndroid Build Coastguard Worker         return false;
151*e01b6f76SAndroid Build Coastguard Worker     }
152*e01b6f76SAndroid Build Coastguard Worker     if (s->width != mStream->width) {
153*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched width in reused stream. Got %d expect %d",
154*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, s->width, mStream->width);
155*e01b6f76SAndroid Build Coastguard Worker         return false;
156*e01b6f76SAndroid Build Coastguard Worker     }
157*e01b6f76SAndroid Build Coastguard Worker     if (s->height != mStream->height) {
158*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched height in reused stream. Got %d expect %d",
159*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, s->height, mStream->height);
160*e01b6f76SAndroid Build Coastguard Worker         return false;
161*e01b6f76SAndroid Build Coastguard Worker     }
162*e01b6f76SAndroid Build Coastguard Worker     return true;
163*e01b6f76SAndroid Build Coastguard Worker }
164*e01b6f76SAndroid Build Coastguard Worker 
dump(int fd)165*e01b6f76SAndroid Build Coastguard Worker void Stream::dump(int fd) {
166*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mLock);
167*e01b6f76SAndroid Build Coastguard Worker 
168*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Stream ID: %d (%p)\n", mId, mStream);
169*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Stream Type: %s (%d)\n", typeToString(mStream->stream_type), mStream->stream_type);
170*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Width: %" PRIu32 " Height: %" PRIu32 "\n", mStream->width, mStream->height);
171*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Stream Format: %s (%d)", formatToString(mStream->format), mStream->format);
172*e01b6f76SAndroid Build Coastguard Worker     // ToDo: prettyprint usage mask flags
173*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Gralloc Usage Mask: %#" PRIx32 "\n", mStream->usage);
174*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Max Buffer Count: %" PRIu32 "\n", mStream->max_buffers);
175*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Number of Buffers in use by HAL: %zu\n", mBuffers.size());
176*e01b6f76SAndroid Build Coastguard Worker     for (size_t i = 0; i < mBuffers.size(); i++) {
177*e01b6f76SAndroid Build Coastguard Worker         dprintf(fd, "Buffer %zu/%zu: %p\n", i, mBuffers.size(), mBuffers[i]);
178*e01b6f76SAndroid Build Coastguard Worker     }
179*e01b6f76SAndroid Build Coastguard Worker }
180*e01b6f76SAndroid Build Coastguard Worker 
181*e01b6f76SAndroid Build Coastguard Worker } // namespace usb_camera_hal
182