• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef STREAM_OPERATOR_CAPTURE_MESSAGE_H
17 #define STREAM_OPERATOR_CAPTURE_MESSAGE_H
18 
19 #include "camera.h"
20 #include "types.h"
21 #include <condition_variable>
22 #include <list>
23 #include <thread>
24 #include <unordered_map>
25 #include <vector>
26 
27 namespace OHOS::Camera {
28 enum CaptureMessageType {
29     CAPTURE_MESSAGE_TYPE_INVALID = 0,
30     CAPTURE_MESSAGE_TYPE_ON_STARTED,
31     CAPTURE_MESSAGE_TYPE_ON_ERROR,
32     CAPTURE_MESSAGE_TYPE_ON_ENDED,
33     CAPTURE_MESSAGE_TYPE_ON_SHUTTER,
34     CAPTURE_MESSAGE_TYPE_MAX,
35 };
36 
37 class ICaptureMessage {
38 public:
39     ICaptureMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t count);
40     virtual ~ICaptureMessage() = default;
41     virtual uint32_t GetPeerMessageCount() const;
42     virtual uint64_t GetTimestamp() const;
43     virtual int32_t GetStreamId() const;
44     virtual CaptureMessageType GetMessageType() const;
45     virtual int32_t GetCaptureId() const;
46 
47     ICaptureMessage(const ICaptureMessage& other) = delete;
48     ICaptureMessage(ICaptureMessage&& other) = delete;
49     ICaptureMessage& operator=(const ICaptureMessage& other) = delete;
50     ICaptureMessage& operator=(ICaptureMessage&& other) = delete;
51 
52 protected:
53     uint32_t peerMessageCount_ = 1;
54     uint64_t timestamp_ = 0;
55     int32_t streamId_ = -1;
56     int32_t captureId_ = -1;
57 };
58 
59 class CaptureStartedMessage final : public ICaptureMessage {
60 public:
CaptureStartedMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t count)61     CaptureStartedMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t count)
62         : ICaptureMessage(streamId, captureId, time, count)
63     {
64     }
GetMessageType()65     virtual CaptureMessageType GetMessageType() const override
66     {
67         return CAPTURE_MESSAGE_TYPE_ON_STARTED;
68     }
69 };
70 
71 class CaptureEndedMessage final : public ICaptureMessage {
72 public:
CaptureEndedMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t peerCount,uint32_t frameCount)73     CaptureEndedMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t peerCount, uint32_t frameCount)
74         : ICaptureMessage(streamId, captureId, time, peerCount)
75     {
76         frameCount_ = frameCount;
77     }
GetFrameCount()78     uint32_t GetFrameCount() const
79     {
80         return frameCount_;
81     }
GetMessageType()82     virtual CaptureMessageType GetMessageType() const override
83     {
84         return CAPTURE_MESSAGE_TYPE_ON_ENDED;
85     }
86 
87 private:
88     uint32_t frameCount_ = 0;
89 };
90 
91 class CaptureErrorMessage final : public ICaptureMessage {
92 public:
CaptureErrorMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t peerCount,StreamError errorCode)93     CaptureErrorMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t peerCount, StreamError errorCode)
94         : ICaptureMessage(streamId, captureId, time, peerCount)
95     {
96         errorCode_ = errorCode;
97     }
98 
GetStreamError()99     StreamError GetStreamError() const
100     {
101         return errorCode_;
102     }
103 
GetMessageType()104     virtual CaptureMessageType GetMessageType() const override
105     {
106         return CAPTURE_MESSAGE_TYPE_ON_ERROR;
107     }
108 
109 private:
110     StreamError errorCode_;
111 };
112 
113 class FrameShutterMessage final : public ICaptureMessage {
114 public:
FrameShutterMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t count)115     FrameShutterMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t count)
116         : ICaptureMessage(streamId, captureId, time, count)
117     {
118     }
GetMessageType()119     virtual CaptureMessageType GetMessageType() const override
120     {
121         return CAPTURE_MESSAGE_TYPE_ON_SHUTTER;
122     }
123 };
124 
125 using MessageGroup = std::vector<std::shared_ptr<ICaptureMessage>>;
126 using MessageOperatorFunc = std::function<void(MessageGroup&)>;
127 
128 class CaptureMessageOperator {
129 public:
130     CaptureMessageOperator() = default;
131     CaptureMessageOperator(MessageOperatorFunc f);
132     virtual ~CaptureMessageOperator();
133     CaptureMessageOperator(const CaptureMessageOperator& other) = delete;
134     CaptureMessageOperator(CaptureMessageOperator&& other) = delete;
135     CaptureMessageOperator& operator=(const CaptureMessageOperator& other) = delete;
136     CaptureMessageOperator& operator=(CaptureMessageOperator&& other) = delete;
137 
138     void SendMessage(std::shared_ptr<ICaptureMessage>& message);
139     RetCode StartProcess();
140 
141 private:
142     void HandleMessage();
143 
144 private:
145     MessageOperatorFunc messageOperator_ = nullptr;
146     std::atomic<bool> running_ = false;
147     std::atomic<bool> wakeup_ = false;
148     std::unique_ptr<std::thread> messageHandler_ = nullptr;
149     std::mutex lock_ = {};
150     std::condition_variable cv_ = {};
151     std::unordered_map<uint32_t, std::list<MessageGroup>> messageBox_ = {};
152 };
153 } // namespace OHOS::Camera
154 #endif
155