blob: 49f9f62b6d7f6d9c31033014d06e36ef269c85fe [file] [log] [blame]
Igor Murashkinae500e52013-04-22 14:03:54 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
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_OUTPUT_STREAM_INTERFACE_H
18#define ANDROID_SERVERS_CAMERA3_OUTPUT_STREAM_INTERFACE_H
19
20#include "Camera3StreamInterface.h"
Emilian Peev40ead602017-09-26 15:46:36 +010021#include <utils/KeyedVector.h>
Igor Murashkinae500e52013-04-22 14:03:54 -070022
23namespace android {
24
25namespace camera3 {
26
27/**
28 * An interface for managing a single stream of output data from the camera
29 * device.
30 */
31class Camera3OutputStreamInterface : public virtual Camera3StreamInterface {
32 public:
33 /**
34 * Set the transform on the output stream; one of the
35 * HAL_TRANSFORM_* / NATIVE_WINDOW_TRANSFORM_* constants.
36 */
37 virtual status_t setTransform(int transform) = 0;
Chien-Yu Chen85a64552015-08-28 15:46:12 -070038
39 /**
40 * Return if this output stream is for video encoding.
41 */
42 virtual bool isVideoStream() const = 0;
Zhijun He5d677d12016-05-29 16:52:39 -070043
44 /**
45 * Return if the consumer configuration of this stream is deferred.
46 */
Shuzhen Wang0129d522016-10-30 22:43:41 -070047 virtual bool isConsumerConfigurationDeferred(size_t surface_id = 0) const = 0;
Zhijun He5d677d12016-05-29 16:52:39 -070048
49 /**
Shuzhen Wang758c2152017-01-10 18:26:18 -080050 * Set the consumer surfaces to the output stream.
Zhijun He5d677d12016-05-29 16:52:39 -070051 */
Shuzhen Wang758c2152017-01-10 18:26:18 -080052 virtual status_t setConsumers(const std::vector<sp<Surface>>& consumers) = 0;
Eino-Ville Talvalad58445d2016-06-17 22:58:43 -070053
54 /**
Eino-Ville Talvala77c1a352016-06-13 12:32:43 -070055 * Detach an unused buffer from the stream.
56 *
57 * buffer must be non-null; fenceFd may null, and if it is non-null, but
58 * there is no valid fence associated with the detached buffer, it will be
59 * set to -1.
60 *
61 */
62 virtual status_t detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd) = 0;
Emilian Peev40ead602017-09-26 15:46:36 +010063
64 /**
65 * Query the surface id.
66 */
67 virtual ssize_t getSurfaceId(const sp<Surface> &surface) = 0;
68
69 /**
Yin-Chia Yeh58b1b4e2018-10-15 12:18:36 -070070 * Query the unique surface IDs of current surfaceIds.
71 * When passing unique surface IDs in returnBuffer(), if the
72 * surfaceId has been removed from the stream, the output corresponding to
73 * the unique surface ID will be ignored and not delivered to client.
74 *
75 * Return INVALID_OPERATION if and only if the stream does not support
76 * surface sharing.
77 */
78 virtual status_t getUniqueSurfaceIds(const std::vector<size_t>& surfaceIds,
79 /*out*/std::vector<size_t>* outUniqueIds) = 0;
80
81 /**
Emilian Peev40ead602017-09-26 15:46:36 +010082 * Update the stream output surfaces.
83 */
84 virtual status_t updateStream(const std::vector<sp<Surface>> &outputSurfaces,
85 const std::vector<OutputStreamInfo> &outputInfo,
86 const std::vector<size_t> &removedSurfaceIds,
87 KeyedVector<sp<Surface>, size_t> *outputMap/*out*/) = 0;
Chien-Yu Chena936ac22017-10-23 15:59:49 -070088
89 /**
90 * Drop buffers if dropping is true. If dropping is false, do not drop buffers.
91 */
92 virtual status_t dropBuffers(bool /*dropping*/) = 0;
Shuzhen Wang5c22c152017-12-31 17:12:25 -080093
94 /**
95 * Query the physical camera id for the output stream.
96 */
97 virtual const String8& getPhysicalCameraId() const = 0;
Yin-Chia Yeh14ef48d2020-02-10 15:06:37 -080098
99 /**
100 * Set the batch size for buffer operations. The output stream will request
101 * buffers from buffer queue on a batch basis. Currently only video streams
102 * are allowed to set the batch size. Also if the stream is managed by
103 * buffer manager (Surface group in Java API) then batching is also not
104 * supported. Changing batch size on the fly while there is already batched
105 * buffers in the stream is also not supported.
106 * If the batch size is larger than the max dequeue count set
107 * by the camera HAL, the batch size will be set to the max dequeue count
108 * instead.
109 */
110 virtual status_t setBatchSize(size_t batchSize = 1) = 0;
Igor Murashkinae500e52013-04-22 14:03:54 -0700111};
112
Yin-Chia Yeh5fd603e2019-11-20 11:22:27 -0800113// Helper class to organize a synchronized mapping of stream IDs to stream instances
114class StreamSet {
115 public:
116 status_t add(int streamId, sp<camera3::Camera3OutputStreamInterface>);
117 ssize_t remove(int streamId);
118 sp<camera3::Camera3OutputStreamInterface> get(int streamId);
119 // get by (underlying) vector index
120 sp<camera3::Camera3OutputStreamInterface> operator[] (size_t index);
121 size_t size() const;
122 std::vector<int> getStreamIds();
123 void clear();
124
125 StreamSet() {};
126 StreamSet(const StreamSet& other);
127
128 private:
129 mutable std::mutex mLock;
130 KeyedVector<int, sp<camera3::Camera3OutputStreamInterface>> mData;
131};
132
Igor Murashkinae500e52013-04-22 14:03:54 -0700133} // namespace camera3
134
135} // namespace android
136
137#endif