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