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