blob: b34dfc75a23366747f75496c5f7ee793f93eeddf [file] [log] [blame]
Changyeon Joc7deb562019-07-23 10:40:04 -07001/*
2 * Copyright (C) 2019 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_AUTOMOTIVE_EVS_V1_1_HALCAMERA_H
18#define ANDROID_AUTOMOTIVE_EVS_V1_1_HALCAMERA_H
19
20#include <android/hardware/automotive/evs/1.1/types.h>
21#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
22#include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h>
23#include <ui/GraphicBuffer.h>
24
25#include <thread>
26#include <list>
27
Changyeon Job927b882019-11-21 10:16:33 -080028#include "sync/unique_fd.h"
29#include "sync/unique_fence.h"
30#include "sync/unique_timeline.h"
Changyeon Joc7deb562019-07-23 10:40:04 -070031
32using namespace ::android::hardware::automotive::evs::V1_1;
33using ::android::hardware::Return;
34using ::android::hardware::hidl_handle;
35using ::android::hardware::automotive::evs::V1_0::EvsResult;
36using IEvsCamera_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCamera;
37using IEvsCamera_1_1 = ::android::hardware::automotive::evs::V1_1::IEvsCamera;
38using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
39using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
40using IEvsCameraStream_1_0 = ::android::hardware::automotive::evs::V1_0::IEvsCameraStream;
41using IEvsCameraStream_1_1 = ::android::hardware::automotive::evs::V1_1::IEvsCameraStream;
42
43namespace android {
44namespace automotive {
45namespace evs {
46namespace V1_1 {
47namespace implementation {
48
49
50class VirtualCamera; // From VirtualCamera.h
51
52
53// This class wraps the actual hardware IEvsCamera objects. There is a one to many
54// relationship between instances of this class and instances of the VirtualCamera class.
55// This class implements the IEvsCameraStream interface so that it can receive the video
56// stream from the hardware camera and distribute it to the associated VirtualCamera objects.
57class HalCamera : public IEvsCameraStream_1_1 {
58public:
Changyeon Job927b882019-11-21 10:16:33 -080059 HalCamera(sp<IEvsCamera_1_1> hwCamera)
60 : mHwCamera(hwCamera),
61 mTimeline(new UniqueTimeline(0)) {}
Changyeon Joc7deb562019-07-23 10:40:04 -070062
63 // Factory methods for client VirtualCameras
64 sp<VirtualCamera> makeVirtualCamera();
65 void disownVirtualCamera(sp<VirtualCamera> virtualCamera);
66
67 // Implementation details
68 sp<IEvsCamera_1_0> getHwCamera() { return mHwCamera; };
69 unsigned getClientCount() { return mClients.size(); };
70 bool changeFramesInFlight(int delta);
Changyeon Job927b882019-11-21 10:16:33 -080071 UniqueFence requestNewFrame(sp<VirtualCamera> virtualCamera);
Changyeon Joc7deb562019-07-23 10:40:04 -070072
73 Return<EvsResult> clientStreamStarting();
74 void clientStreamEnding();
75 Return<void> doneWithFrame(const BufferDesc_1_0& buffer);
76 Return<void> doneWithFrame(const BufferDesc_1_1& buffer);
Changyeon Jo330d1c22019-07-30 11:58:41 -070077 Return<EvsResult> setMaster(sp<VirtualCamera> virtualCamera);
Changyeon Jo2c819132019-08-17 21:35:54 -070078 Return<EvsResult> forceMaster(sp<VirtualCamera> virtualCamera);
Changyeon Jo330d1c22019-07-30 11:58:41 -070079 Return<EvsResult> unsetMaster(sp<VirtualCamera> virtualCamera);
80 Return<EvsResult> setParameter(sp<VirtualCamera> virtualCamera,
81 CameraParam id, int32_t& value);
82 Return<EvsResult> getParameter(CameraParam id, int32_t& value);
Changyeon Joc7deb562019-07-23 10:40:04 -070083
Changyeon Joaab96aa2019-10-12 05:24:15 -070084 // Methods from ::android::hardware::automotive::evs::V1_0::IEvsCameraStream follow.
Changyeon Jofbf72792019-10-12 05:21:00 -070085 Return<void> deliverFrame(const BufferDesc_1_0& buffer) override;
Changyeon Joaab96aa2019-10-12 05:24:15 -070086
87 // Methods from ::android::hardware::automotive::evs::V1_1::IEvsCameraStream follow.
Changyeon Jo4ede4d62019-10-22 10:10:15 -070088 Return<void> deliverFrame_1_1(const hardware::hidl_vec<BufferDesc_1_1>& buffer) override;
89 Return<void> notify(const EvsEventDesc& event) override;
Changyeon Joc7deb562019-07-23 10:40:04 -070090
91private:
92 sp<IEvsCamera_1_1> mHwCamera;
93 std::list<wp<VirtualCamera>> mClients; // Weak pointers -> objects destruct if client dies
94
95 enum {
96 STOPPED,
97 RUNNING,
98 STOPPING,
99 } mStreamState = STOPPED;
100
101 struct FrameRecord {
102 uint32_t frameId;
103 uint32_t refCount;
104 FrameRecord(uint32_t id) : frameId(id), refCount(0) {};
105 };
106 std::vector<FrameRecord> mFrames;
Changyeon Jo330d1c22019-07-30 11:58:41 -0700107 wp<VirtualCamera> mMaster = nullptr;
Changyeon Jo2c819132019-08-17 21:35:54 -0700108 std::mutex mMasterLock;
Changyeon Job927b882019-11-21 10:16:33 -0800109
110 // synchronization
111 std::mutex mSessionMutex;
112 std::list<wp<VirtualCamera>> mClientsWaitFrame GUARDED_BY(mSessionMutex);
113 std::unique_ptr<UniqueTimeline> mTimeline GUARDED_BY(mSessionMutex);
114 UniqueFence mSessionFence GUARDED_BY(mSessionMutex);
Changyeon Joc7deb562019-07-23 10:40:04 -0700115};
116
117} // namespace implementation
118} // namespace V1_1
119} // namespace evs
120} // namespace automotive
121} // namespace android
122
123#endif // ANDROID_AUTOMOTIVE_EVS_V1_1_HALCAMERA_H