1 /* 2 * Copyright (c) 2021-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 HISTREAMER_HIRECORDER_IMPL_H 17 #define HISTREAMER_HIRECORDER_IMPL_H 18 #ifdef RECORDER_SUPPORT 19 #include <memory> 20 #include <unordered_map> 21 22 #include "foundation/osal/thread/condition_variable.h" 23 #include "foundation/osal/thread/mutex.h" 24 #include "hst_recorder_param.h" 25 #include "i_recorder_engine.h" 26 #include "pipeline/core/error_code.h" 27 #include "pipeline/core/pipeline.h" 28 #include "pipeline/core/pipeline_core.h" 29 #include "pipeline/filters/source/audio_capture/audio_capture_filter.h" 30 #include "pipeline/filters/codec/audio_encoder/audio_encoder_filter.h" 31 #include "pipeline/filters/source/video_capture/video_capture_filter.h" 32 #include "pipeline/filters/codec/video_encoder/video_encoder_filter.h" 33 #include "pipeline/filters/muxer/muxer_filter.h" 34 #include "pipeline/filters/sink/output_sink/output_sink_filter.h" 35 #include "plugin/common/any.h" 36 #include "scene/common/media_stat_stub.h" 37 #include "scene/recorder/internal/state_machine.h" 38 #include "scene/recorder/recorder_executor.h" 39 40 namespace OHOS { 41 namespace Media { 42 namespace Record { 43 class HiRecorderImpl : public Pipeline::EventReceiver, 44 public RecorderExecutor, 45 public StateChangeCallback, 46 public IRecorderEngine { 47 friend class StateMachine; 48 public: 49 HiRecorderImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId); 50 ~HiRecorderImpl() override; 51 HiRecorderImpl(const HiRecorderImpl& other) = delete; 52 HiRecorderImpl& operator=(const HiRecorderImpl& other) = delete; 53 ErrorCode Init(); 54 55 // interface from IRecorderEngine 56 int32_t SetAudioSource(AudioSourceType source, int32_t& sourceId) override; 57 int32_t SetVideoSource(VideoSourceType source, int32_t& sourceId) override; 58 sptr<Surface> GetSurface(int32_t sourceId) override; 59 int32_t SetOutputFormat(OutputFormatType format) override; 60 int32_t SetObs(const std::weak_ptr<IRecorderEngineObs>& obs) override; 61 int32_t Configure(int32_t sourceId, const RecorderParam& recParam) override; 62 int32_t Prepare() override; 63 int32_t Start() override; 64 int32_t Pause() override; 65 int32_t Resume() override; 66 int32_t Stop(bool isDrainAll) override; 67 int32_t Reset() override; 68 int32_t SetParameter(int32_t sourceId, const RecorderParam& recParam) override; 69 // internal interfaces from Pipeline::EventReceiver 70 void OnEvent(const Event& event) override; 71 // internal interfaces from StateChangeCallback 72 void OnStateChanged(StateId state) override; 73 74 // interface from RecorderExecutor 75 ErrorCode DoSetVideoSource(const Plugin::Any& param) const override; 76 ErrorCode DoSetAudioSource(const Plugin::Any& param) const override; 77 ErrorCode DoConfigure(const Plugin::Any& param) const override; 78 ErrorCode DoSetOutputFormat(const Plugin::Any& param) const override; 79 ErrorCode DoPrepare() override; 80 ErrorCode DoStart() override; 81 ErrorCode DoPause() override; 82 ErrorCode DoResume() override; 83 ErrorCode DoStop(const Plugin::Any& param) override; 84 ErrorCode DoReset() override; 85 ErrorCode DoOnComplete() override; 86 private: 87 ErrorCode SetAudioSourceInternal(AudioSourceType source, int32_t sourceId); 88 ErrorCode SetVideoSourceInternal(VideoSourceType source, int32_t sourceId); 89 ErrorCode DoConfigureAudio(const HstRecParam& param) const; 90 ErrorCode DoConfigureVideo(const HstRecParam& param) const; 91 ErrorCode DoConfigureOther(const HstRecParam& param) const; 92 bool CheckParamType(int32_t sourceId, const RecorderParam& recParam) const; 93 94 std::atomic<uint32_t> audioCount_ {0}; 95 std::atomic<uint32_t> videoCount_ {0}; 96 std::atomic<uint32_t> audioSourceId_ {0}; 97 std::atomic<uint32_t> videoSourceId_ {0}; 98 int32_t appUid_ {0}; 99 int32_t appPid_ {0}; 100 uint32_t appTokenId_ {0}; 101 102 OutputFormatType outputFormatType_ {OutputFormatType::FORMAT_BUTT}; 103 OSAL::Mutex stateMutex_ {}; 104 OSAL::ConditionVariable cond_ {}; 105 StateMachine fsm_; 106 std::atomic<StateId> curFsmState_; 107 std::shared_ptr<Pipeline::PipelineCore> pipeline_; 108 std::atomic<bool> initialized_ {false}; 109 110 MediaStatStub mediaStatStub_ {}; 111 112 std::weak_ptr<IRecorderEngineObs> obs_ {}; 113 std::shared_ptr<Pipeline::MuxerFilter> muxer_; 114 std::shared_ptr<Pipeline::OutputSinkFilter> outputSink_; 115 std::shared_ptr<Pipeline::AudioCaptureFilter> audioCapture_; 116 std::shared_ptr<Pipeline::AudioEncoderFilter> audioEncoder_; 117 #ifdef VIDEO_SUPPORT 118 std::shared_ptr<Pipeline::VideoCaptureFilter> videoCapture_; 119 std::shared_ptr<Pipeline::VideoEncoderFilter> videoEncoder_; 120 #endif 121 }; 122 } // namespace Record 123 } // namespace Media 124 } // namespace OHOS 125 #endif 126 #endif // HISTREAMER_HIRECORDER_IMPL_H 127