blob: 1fd676cc9d6e5c2505269482868939d56965282c [file] [log] [blame]
Shuzhen Wang0129d522016-10-30 22:43:41 -07001/*
Shuzhen Wangc28189a2017-11-27 23:05:10 -08002 * Copyright (C) 2016-2018 The Android Open Source Project
Shuzhen Wang0129d522016-10-30 22:43:41 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_SERVERS_CAMERA3_SHARED_OUTPUT_STREAM_H
18#define ANDROID_SERVERS_CAMERA3_SHARED_OUTPUT_STREAM_H
19
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -070020#include <array>
Jim Shargoc50928e2024-07-03 05:00:43 +000021
22#include "Flags.h"
23
Shuzhen Wang0129d522016-10-30 22:43:41 -070024#include "Camera3OutputStream.h"
25
Jim Shargoc50928e2024-07-03 05:00:43 +000026#if USE_NEW_STREAM_SPLITTER
27#include "Camera3StreamSplitter.h"
28#else
29#include "deprecated/DeprecatedCamera3StreamSplitter.h"
30#endif // USE_NEW_STREAM_SPLITTER
31
Shuzhen Wang0129d522016-10-30 22:43:41 -070032namespace android {
33
34namespace camera3 {
35
36class Camera3SharedOutputStream :
37 public Camera3OutputStream {
38public:
39 /**
40 * Set up a stream for formats that have 2 dimensions, with multiple
41 * surfaces. A valid stream set id needs to be set to support buffer
42 * sharing between multiple streams.
43 */
Shuzhen Wang38df0ca2024-10-09 11:33:44 -070044 Camera3SharedOutputStream(int id, const std::vector<SurfaceHolder>& surfaces,
Shuzhen Wang758c2152017-01-10 18:26:18 -080045 uint32_t width, uint32_t height, int format,
Emilian Peev050f5dc2017-05-18 14:43:56 +010046 uint64_t consumerUsage, android_dataspace dataSpace,
Emilian Peevf4816702020-04-03 15:44:51 -070047 camera_stream_rotation_t rotation, nsecs_t timestampOffset,
Austin Borger1c1bee02023-06-01 16:51:35 -070048 const std::string& physicalCameraId,
Jayant Chowdharyc67af1b2022-04-07 18:05:04 +000049 const std::unordered_set<int32_t> &sensorPixelModesUsed, IPCTransport transport,
Shuzhen Wang38df0ca2024-10-09 11:33:44 -070050 int setId, bool useHalBufManager, int64_t dynamicProfile, int64_t streamUseCase,
51 bool deviceTimeBaseIsRealtime, int timestampBase,
52 int32_t colorSpace, bool useReadoutTimestamp);
Shuzhen Wang0129d522016-10-30 22:43:41 -070053
54 virtual ~Camera3SharedOutputStream();
55
Jayant Chowdhary9d3a6492023-11-22 07:23:59 +000056 void setHalBufferManager(bool enabled) override;
57
Shuzhen Wangbee0f0a2017-01-24 14:51:37 -080058 virtual status_t notifyBufferReleased(ANativeWindowBuffer *buffer);
Shuzhen Wang0129d522016-10-30 22:43:41 -070059
60 virtual bool isConsumerConfigurationDeferred(size_t surface_id) const;
61
Shuzhen Wang38df0ca2024-10-09 11:33:44 -070062 virtual status_t setConsumers(const std::vector<SurfaceHolder>& consumers);
Shuzhen Wang0129d522016-10-30 22:43:41 -070063
Emilian Peev40ead602017-09-26 15:46:36 +010064 virtual ssize_t getSurfaceId(const sp<Surface> &surface);
65
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -070066 /**
67 * Query the unique surface IDs of current surfaceIds.
68 * When passing unique surface IDs in returnBuffer(), if the
69 * surfaceId has been removed from the stream, the output corresponding to
70 * the unique surface ID will be ignored and not delivered to client.
71 */
72 virtual status_t getUniqueSurfaceIds(const std::vector<size_t>& surfaceIds,
73 /*out*/std::vector<size_t>* outUniqueIds) override;
74
Shuzhen Wang38df0ca2024-10-09 11:33:44 -070075 virtual status_t updateStream(const std::vector<SurfaceHolder> &outputSurfaces,
Emilian Peev40ead602017-09-26 15:46:36 +010076 const std::vector<OutputStreamInfo> &outputInfo,
77 const std::vector<size_t> &removedSurfaceIds,
78 KeyedVector<sp<Surface>, size_t> *outputMap/*out*/);
79
Emilian Peevcc0b7952020-01-07 13:54:47 -080080 virtual bool getOfflineProcessingSupport() const {
81 // As per Camera spec. shared streams currently do not support
82 // offline mode.
83 return false;
84 }
85
Shuzhen Wang38df0ca2024-10-09 11:33:44 -070086 virtual status_t setTransform(int transform, bool mayChangeMirror, int surfaceId);
87
Shuzhen Wang0129d522016-10-30 22:43:41 -070088private:
Emilian Peev40ead602017-09-26 15:46:36 +010089
90 static const size_t kMaxOutputs = 4;
91
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -070092 // Whether HAL is in control for buffer management. Surface sharing behavior
93 // depends on this flag.
Jayant Chowdhary9d3a6492023-11-22 07:23:59 +000094 bool mUseHalBufManager;
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -070095
Shuzhen Wang38df0ca2024-10-09 11:33:44 -070096 // Struct of an output SurfaceHolder, transform, and its unique ID
97 struct SurfaceHolderUniqueId {
98 SurfaceHolder mSurfaceHolder;
99 int mTransform = -1;
100 size_t mId = -1;
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -0700101
Shuzhen Wang38df0ca2024-10-09 11:33:44 -0700102 SurfaceHolderUniqueId() = default;
103 SurfaceHolderUniqueId(size_t id) : mId(id) {}
104 SurfaceHolderUniqueId(const SurfaceHolder& holder, size_t id) :
105 mSurfaceHolder(holder), mId(id) {}
106 };
107
108 // Map surfaceId -> SurfaceHolderUniqueId
109 std::array<SurfaceHolderUniqueId, kMaxOutputs> mSurfaceUniqueIds;
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -0700110
111 size_t mNextUniqueSurfaceId = 0;
Emilian Peev40ead602017-09-26 15:46:36 +0100112
113 ssize_t getNextSurfaceIdLocked();
114
Shuzhen Wang38df0ca2024-10-09 11:33:44 -0700115 status_t revertPartialUpdateLocked(const KeyedVector<size_t, SurfaceHolder> &removedSurfaces,
Emilian Peev40ead602017-09-26 15:46:36 +0100116 const KeyedVector<sp<Surface>, size_t> &attachedSurfaces);
Shuzhen Wang0129d522016-10-30 22:43:41 -0700117
118 /**
119 * The Camera3StreamSplitter object this stream uses for stream
120 * sharing.
121 */
Jim Shargoc50928e2024-07-03 05:00:43 +0000122#if USE_NEW_STREAM_SPLITTER
Shuzhen Wang0129d522016-10-30 22:43:41 -0700123 sp<Camera3StreamSplitter> mStreamSplitter;
Jim Shargoc50928e2024-07-03 05:00:43 +0000124#else
125 sp<DeprecatedCamera3StreamSplitter> mStreamSplitter;
126#endif // USE_NEW_STREAM_SPLITTER
Shuzhen Wang0129d522016-10-30 22:43:41 -0700127 /**
128 * Initialize stream splitter.
129 */
130 status_t connectStreamSplitterLocked();
131
Shuzhen Wangbee0f0a2017-01-24 14:51:37 -0800132 /**
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -0700133 * Attach the output buffer to stream splitter.
134 * When camera service is doing buffer management, this method will be called
135 * before the buffer is handed out to HAL in request thread.
136 * When HAL is doing buffer management, this method will be called when
137 * the buffer is returned from HAL in hwbinder callback thread.
138 */
139 status_t attachBufferToSplitterLocked(ANativeWindowBuffer* anb,
140 const std::vector<size_t>& surface_ids);
141
142 /**
Shuzhen Wangbee0f0a2017-01-24 14:51:37 -0800143 * Internal Camera3Stream interface
144 */
Emilian Peevf4816702020-04-03 15:44:51 -0700145 virtual status_t getBufferLocked(camera_stream_buffer *buffer,
Shuzhen Wangbee0f0a2017-01-24 14:51:37 -0800146 const std::vector<size_t>& surface_ids);
147
148 virtual status_t queueBufferToConsumer(sp<ANativeWindow>& consumer,
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -0700149 ANativeWindowBuffer* buffer, int anwReleaseFence,
150 const std::vector<size_t>& uniqueSurfaceIds);
Shuzhen Wangbee0f0a2017-01-24 14:51:37 -0800151
Shuzhen Wang0129d522016-10-30 22:43:41 -0700152 virtual status_t configureQueueLocked();
153
154 virtual status_t disconnectLocked();
155
Emilian Peev3b93acb2024-03-11 21:09:48 +0000156 virtual status_t getEndpointUsage(uint64_t *usage);
Shuzhen Wang0129d522016-10-30 22:43:41 -0700157
Shuzhen Wang0129d522016-10-30 22:43:41 -0700158}; // class Camera3SharedOutputStream
159
160} // namespace camera3
161
162} // namespace android
163
164#endif // ANDROID_SERVERS_CAMERA3_SHARED_OUTPUT_STREAM_H