• 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:
61     virtual ~CaptureStartedMessage() = default;
CaptureStartedMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t count)62     CaptureStartedMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t count)
63         : ICaptureMessage(streamId, captureId, time, count)
64     {
65     }
GetMessageType()66     virtual CaptureMessageType GetMessageType() const override
67     {
68         return CAPTURE_MESSAGE_TYPE_ON_STARTED;
69     }
70 };
71 
72 class CaptureEndedMessage final : public ICaptureMessage {
73 public:
74     virtual ~CaptureEndedMessage() = default;
CaptureEndedMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t peerCount,uint32_t frameCount)75     CaptureEndedMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t peerCount, uint32_t frameCount)
76         : ICaptureMessage(streamId, captureId, time, peerCount)
77     {
78         frameCount_ = frameCount;
79     }
GetFrameCount()80     uint32_t GetFrameCount() const
81     {
82         return frameCount_;
83     }
GetMessageType()84     virtual CaptureMessageType GetMessageType() const override
85     {
86         return CAPTURE_MESSAGE_TYPE_ON_ENDED;
87     }
88 
89 private:
90     uint32_t frameCount_ = 0;
91 };
92 
93 class CaptureErrorMessage final : public ICaptureMessage {
94 public:
95     virtual ~CaptureErrorMessage() = default;
CaptureErrorMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t peerCount,StreamError errorCode)96     CaptureErrorMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t peerCount, StreamError errorCode)
97         : ICaptureMessage(streamId, captureId, time, peerCount)
98     {
99         errorCode_ = errorCode;
100     }
101 
GetStreamError()102     StreamError GetStreamError() const
103     {
104         return errorCode_;
105     }
106 
GetMessageType()107     virtual CaptureMessageType GetMessageType() const override
108     {
109         return CAPTURE_MESSAGE_TYPE_ON_ERROR;
110     }
111 
112 private:
113     StreamError errorCode_;
114 };
115 
116 class FrameShutterMessage final : public ICaptureMessage {
117 public:
118     virtual ~FrameShutterMessage() = default;
FrameShutterMessage(int32_t streamId,int32_t captureId,uint64_t time,uint32_t count)119     FrameShutterMessage(int32_t streamId, int32_t captureId, uint64_t time, uint32_t count)
120         : ICaptureMessage(streamId, captureId, time, count)
121     {
122     }
GetMessageType()123     virtual CaptureMessageType GetMessageType() const override
124     {
125         return CAPTURE_MESSAGE_TYPE_ON_SHUTTER;
126     }
127 };
128 
129 using MessageGroup = std::vector<std::shared_ptr<ICaptureMessage>>;
130 using MessageOperatorFunc = std::function<void(MessageGroup&)>;
131 
132 class CaptureMessageOperator {
133 public:
134     CaptureMessageOperator() = default;
135     CaptureMessageOperator(MessageOperatorFunc f);
136     virtual ~CaptureMessageOperator();
137     CaptureMessageOperator(const CaptureMessageOperator& other) = delete;
138     CaptureMessageOperator(CaptureMessageOperator&& other) = delete;
139     CaptureMessageOperator& operator=(const CaptureMessageOperator& other) = delete;
140     CaptureMessageOperator& operator=(CaptureMessageOperator&& other) = delete;
141 
142     void SendMessage(std::shared_ptr<ICaptureMessage>& message);
143     RetCode StartProcess();
144 
145 private:
146     void HandleMessage();
147 
148 private:
149     MessageOperatorFunc messageOperator_ = nullptr;
150     std::atomic<bool> running_ = false;
151     std::atomic<bool> wakeup_ = false;
152     std::unique_ptr<std::thread> messageHandler_ = nullptr;
153     std::mutex lock_ = {};
154     std::condition_variable cv_ = {};
155     std::unordered_map<uint32_t, std::list<MessageGroup>> messageBox_ = {};
156 };
157 } // namespace OHOS::Camera
158 #endif
159