blob: 7f5c87a72f93de5a05f62881f7b31a0463f22bbc [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;
Igor Murashkinae500e52013-04-22 14:03:54 -070098};
99
Yin-Chia Yeh5fd603e2019-11-20 11:22:27 -0800100// Helper class to organize a synchronized mapping of stream IDs to stream instances
101class StreamSet {
102 public:
103 status_t add(int streamId, sp<camera3::Camera3OutputStreamInterface>);
104 ssize_t remove(int streamId);
105 sp<camera3::Camera3OutputStreamInterface> get(int streamId);
106 // get by (underlying) vector index
107 sp<camera3::Camera3OutputStreamInterface> operator[] (size_t index);
108 size_t size() const;
109 std::vector<int> getStreamIds();
110 void clear();
111
112 StreamSet() {};
113 StreamSet(const StreamSet& other);
114
115 private:
116 mutable std::mutex mLock;
117 KeyedVector<int, sp<camera3::Camera3OutputStreamInterface>> mData;
118};
119
Igor Murashkinae500e52013-04-22 14:03:54 -0700120} // namespace camera3
121
122} // namespace android
123
124#endif