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 #include "foundation/osal/thread/condition_variable.h" 22 #include "foundation/osal/thread/mutex.h" 23 #include <i_recorder_engine.h> 24 #include "hst_recorder_param.h" 25 #include "pipeline/core/error_code.h" 26 #include "pipeline/core/pipeline.h" 27 #include "pipeline/core/pipeline_core.h" 28 #include "pipeline/filters/source/audio_capture/audio_capture_filter.h" 29 #include "pipeline/filters/codec/audio_encoder/audio_encoder_filter.h" 30 #include "pipeline/filters/source/video_capture/video_capture_filter.h" 31 #include "pipeline/filters/codec/video_encoder/video_encoder_filter.h" 32 #include "pipeline/filters/muxer/muxer_filter.h" 33 #include "pipeline/filters/sink/output_sink/output_sink_filter.h" 34 #include "plugin/common/any.h" 35 #include "scene/common/media_stat_stub.h" 36 #include "scene/recorder/internal/state_machine.h" 37 #include "scene/recorder/recorder_executor.h" 38 39 namespace OHOS { 40 namespace Media { 41 namespace Record { 42 class HiRecorderImpl : public Pipeline::EventReceiver, 43 public RecorderExecutor, 44 public StateChangeCallback, 45 public IRecorderEngine { 46 friend class StateMachine; 47 public: 48 HiRecorderImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId, uint64_t appFullTokenId); 49 ~HiRecorderImpl() override; 50 HiRecorderImpl(const HiRecorderImpl& other) = delete; 51 HiRecorderImpl& operator=(const HiRecorderImpl& other) = delete; 52 ErrorCode Init(); 53 54 // interface from IRecorderEngine 55 int32_t SetAudioSource(AudioSourceType source, int32_t& sourceId) override; 56 int32_t SetVideoSource(VideoSourceType source, int32_t& sourceId) override; 57 sptr<Surface> GetSurface(int32_t sourceId) override; 58 int32_t SetOutputFormat(OutputFormatType format) override; 59 int32_t SetObs(const std::weak_ptr<IRecorderEngineObs>& obs) override; 60 int32_t Configure(int32_t sourceId, const RecorderParam& recParam) override; 61 int32_t Prepare() override; 62 int32_t Start() override; 63 int32_t Pause() override; 64 int32_t Resume() override; 65 int32_t Stop(bool isDrainAll) override; 66 int32_t Reset() override; 67 int32_t SetParameter(int32_t sourceId, const RecorderParam& recParam) override; 68 // internal interfaces from Pipeline::EventReceiver 69 void OnEvent(const Event& event) override; 70 // internal interfaces from StateChangeCallback 71 void OnStateChanged(StateId state) override; 72 73 // interface from RecorderExecutor 74 ErrorCode DoSetVideoSource(const Plugin::Any& param) const override; 75 ErrorCode DoSetAudioSource(const Plugin::Any& param) const override; 76 ErrorCode DoConfigure(const Plugin::Any& param) const override; 77 ErrorCode DoSetOutputFormat(const Plugin::Any& param) const override; 78 ErrorCode DoPrepare() override; 79 ErrorCode DoStart() override; 80 ErrorCode DoPause() override; 81 ErrorCode DoResume() override; 82 ErrorCode DoStop(const Plugin::Any& param) override; 83 ErrorCode DoReset() override; 84 ErrorCode DoOnComplete() override; 85 private: 86 ErrorCode SetAudioSourceInternal(AudioSourceType source, int32_t sourceId); 87 ErrorCode SetVideoSourceInternal(VideoSourceType source, int32_t sourceId); 88 ErrorCode DoConfigureAudio(const HstRecParam& param) const; 89 ErrorCode DoConfigureVideo(const HstRecParam& param) const; 90 ErrorCode DoConfigureOther(const HstRecParam& param) const; 91 bool CheckParamType(int32_t sourceId, const RecorderParam& recParam) const; 92 93 std::atomic<uint32_t> audioCount_ {0}; 94 std::atomic<uint32_t> videoCount_ {0}; 95 std::atomic<uint32_t> audioSourceId_ {0}; 96 std::atomic<uint32_t> videoSourceId_ {0}; 97 int32_t appUid_ {0}; 98 int32_t appPid_ {0}; 99 uint32_t appTokenId_ {0}; 100 uint64_t appFullTokenId_ {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