1fa7767c5Sopenharmony_ci/*
2fa7767c5Sopenharmony_ci * Copyright (c) 2021-2021 Huawei Device Co., Ltd.
3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License.
5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at
6fa7767c5Sopenharmony_ci *
7fa7767c5Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fa7767c5Sopenharmony_ci *
9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and
13fa7767c5Sopenharmony_ci * limitations under the License.
14fa7767c5Sopenharmony_ci */
15fa7767c5Sopenharmony_ci
16fa7767c5Sopenharmony_ci#ifndef HISTREAMER_SCENE_STD_HIPLAYER_IMPL_H
17fa7767c5Sopenharmony_ci#define HISTREAMER_SCENE_STD_HIPLAYER_IMPL_H
18fa7767c5Sopenharmony_ci
19fa7767c5Sopenharmony_ci#include <memory>
20fa7767c5Sopenharmony_ci#include <unordered_map>
21fa7767c5Sopenharmony_ci
22fa7767c5Sopenharmony_ci#include "hiplayer_callback_looper.h"
23fa7767c5Sopenharmony_ci#include <i_player_engine.h>
24fa7767c5Sopenharmony_ci#include "foundation/osal/thread/condition_variable.h"
25fa7767c5Sopenharmony_ci#include "foundation/osal/thread/mutex.h"
26fa7767c5Sopenharmony_ci#include "hiplayer_callback_looper.h"
27fa7767c5Sopenharmony_ci#include "internal/state_machine.h"
28fa7767c5Sopenharmony_ci#include "pipeline/core/error_code.h"
29fa7767c5Sopenharmony_ci#include "pipeline/core/media_sync_manager.h"
30fa7767c5Sopenharmony_ci#include "pipeline/core/pipeline.h"
31fa7767c5Sopenharmony_ci#include "pipeline/core/pipeline_core.h"
32fa7767c5Sopenharmony_ci#include "pipeline/filters/codec/audio_decoder/audio_decoder_filter.h"
33fa7767c5Sopenharmony_ci#include "pipeline/filters/demux/demuxer_filter.h"
34fa7767c5Sopenharmony_ci#include "pipeline/filters/sink/audio_sink/audio_sink_filter.h"
35fa7767c5Sopenharmony_ci#include "pipeline/filters/source/media_source/media_source_filter.h"
36fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT
37fa7767c5Sopenharmony_ci#include "pipeline/filters/codec/video_decoder/video_decoder_filter.h"
38fa7767c5Sopenharmony_ci#include "pipeline/filters/sink/video_sink/video_sink_filter.h"
39fa7767c5Sopenharmony_ci#endif
40fa7767c5Sopenharmony_ci#include "scene/common/media_stat_stub.h"
41fa7767c5Sopenharmony_ci#include "play_executor.h"
42fa7767c5Sopenharmony_ci
43fa7767c5Sopenharmony_cinamespace OHOS {
44fa7767c5Sopenharmony_cinamespace Media {
45fa7767c5Sopenharmony_ciclass HiPlayerImpl : public Pipeline::EventReceiver,
46fa7767c5Sopenharmony_ci                     public StateChangeCallback,
47fa7767c5Sopenharmony_ci                     public Pipeline::FilterCallback,
48fa7767c5Sopenharmony_ci                     public IPlayerEngine {
49fa7767c5Sopenharmony_ci    friend class StateMachine;
50fa7767c5Sopenharmony_ci
51fa7767c5Sopenharmony_cipublic:
52fa7767c5Sopenharmony_ci    HiPlayerImpl(int32_t appUid, int32_t appPid);
53fa7767c5Sopenharmony_ci    ~HiPlayerImpl() override;
54fa7767c5Sopenharmony_ci    HiPlayerImpl(const HiPlayerImpl& other) = delete;
55fa7767c5Sopenharmony_ci    HiPlayerImpl& operator=(const HiPlayerImpl& other) = delete;
56fa7767c5Sopenharmony_ci    ErrorCode Init();
57fa7767c5Sopenharmony_ci    // interface from PlayerInterface
58fa7767c5Sopenharmony_ci    int32_t SetSource(const std::string& uri) override;
59fa7767c5Sopenharmony_ci    int32_t SetSource(const std::shared_ptr<IMediaDataSource>& dataSrc) override;
60fa7767c5Sopenharmony_ci    int32_t Prepare() override;
61fa7767c5Sopenharmony_ci    int32_t PrepareAsync() override;
62fa7767c5Sopenharmony_ci    int32_t Play() override;
63fa7767c5Sopenharmony_ci    int32_t Pause() override;
64fa7767c5Sopenharmony_ci    int32_t Stop() override;
65fa7767c5Sopenharmony_ci    int32_t Reset() override;
66fa7767c5Sopenharmony_ci    int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override;
67fa7767c5Sopenharmony_ci    int32_t SetVolume(float leftVolume, float rightVolume) override;
68fa7767c5Sopenharmony_ci    int32_t SetVideoSurface(sptr<Surface> surface) override;
69fa7767c5Sopenharmony_ci    int32_t SetLooping(bool loop) override;
70fa7767c5Sopenharmony_ci    int32_t SetParameter(const Format& params) override;
71fa7767c5Sopenharmony_ci    int32_t SetObs(const std::weak_ptr<IPlayerEngineObs>& obs) override;
72fa7767c5Sopenharmony_ci    int32_t GetCurrentTime(int32_t& currentPositionMs) override;
73fa7767c5Sopenharmony_ci    int32_t GetDuration(int32_t& durationMs) override;
74fa7767c5Sopenharmony_ci    int32_t SetPlaybackSpeed(PlaybackRateMode mode) override;
75fa7767c5Sopenharmony_ci    int32_t GetPlaybackSpeed(PlaybackRateMode& mode) override;
76fa7767c5Sopenharmony_ci
77fa7767c5Sopenharmony_ci    int32_t GetVideoTrackInfo(std::vector<Format>& videoTrack) override;
78fa7767c5Sopenharmony_ci    int32_t GetAudioTrackInfo(std::vector<Format>& audioTrack) override;
79fa7767c5Sopenharmony_ci    int32_t GetVideoWidth() override;
80fa7767c5Sopenharmony_ci    int32_t GetVideoHeight() override;
81fa7767c5Sopenharmony_ci    int32_t SetVideoScaleType(VideoScaleType videoScaleType) override;
82fa7767c5Sopenharmony_ci    int32_t SetAudioRendererInfo(const int32_t contentType, const int32_t streamUsage,
83fa7767c5Sopenharmony_ci                                 const int32_t rendererFlag) override;
84fa7767c5Sopenharmony_ci    int32_t SetAudioInterruptMode(const int32_t interruptMode) override;
85fa7767c5Sopenharmony_ci    int32_t SelectBitRate(uint32_t bitRate) override;
86fa7767c5Sopenharmony_ci
87fa7767c5Sopenharmony_ci    // internal interfaces
88fa7767c5Sopenharmony_ci    void OnEvent(const Event& event) override;
89fa7767c5Sopenharmony_ci    void OnStateChanged(StateId state) override;
90fa7767c5Sopenharmony_ci    ErrorCode OnCallback(const Pipeline::FilterCallbackType& type, Pipeline::Filter* filter,
91fa7767c5Sopenharmony_ci                         const Plugin::Any& parameter) override;
92fa7767c5Sopenharmony_ci
93fa7767c5Sopenharmony_ci    ErrorCode DoSetSource(const std::shared_ptr<MediaSource>& source);
94fa7767c5Sopenharmony_ci    ErrorCode PrepareFilters();
95fa7767c5Sopenharmony_ci    ErrorCode DoPlay();
96fa7767c5Sopenharmony_ci    ErrorCode DoPause();
97fa7767c5Sopenharmony_ci    ErrorCode DoResume();
98fa7767c5Sopenharmony_ci    ErrorCode DoStop();
99fa7767c5Sopenharmony_ci    ErrorCode DoReset();
100fa7767c5Sopenharmony_ci    ErrorCode DoSeek(int64_t hstTime, Plugin::SeekMode mode);
101fa7767c5Sopenharmony_ci    ErrorCode DoOnReady();
102fa7767c5Sopenharmony_ci    ErrorCode DoOnComplete();
103fa7767c5Sopenharmony_ci    ErrorCode DoOnError(ErrorCode);
104fa7767c5Sopenharmony_ci
105fa7767c5Sopenharmony_ciprivate:
106fa7767c5Sopenharmony_ci    ErrorCode StopAsync();
107fa7767c5Sopenharmony_ci    ErrorCode SetVolumeToSink(float volume, bool reportUpward = true);
108fa7767c5Sopenharmony_ci    Pipeline::PFilter CreateAudioDecoder(const std::string& desc);
109fa7767c5Sopenharmony_ci    ErrorCode NewAudioPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter);
110fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT
111fa7767c5Sopenharmony_ci    ErrorCode NewVideoPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter);
112fa7767c5Sopenharmony_ci#endif
113fa7767c5Sopenharmony_ci    ErrorCode RemoveFilterChains(Pipeline::Filter* filter, const Plugin::Any& parameter);
114fa7767c5Sopenharmony_ci    void ActiveFilters(const std::vector<Pipeline::Filter*>& filters);
115fa7767c5Sopenharmony_ci    void HandleErrorEvent(const Event& event);
116fa7767c5Sopenharmony_ci    void HandleReadyEvent();
117fa7767c5Sopenharmony_ci    void HandleCompleteEvent(const Event& event);
118fa7767c5Sopenharmony_ci    void HandlePluginErrorEvent(const Event& event);
119fa7767c5Sopenharmony_ci    void UpdateStateNoLock(PlayerStates newState, bool notifyUpward = true);
120fa7767c5Sopenharmony_ci    double ChangeModeToSpeed(const PlaybackRateMode& mode) const;
121fa7767c5Sopenharmony_ci    PlaybackRateMode ChangeSpeedToMode(double rate) const;
122fa7767c5Sopenharmony_ci    void NotifyBufferingUpdate(const std::string_view& type, int32_t param);
123fa7767c5Sopenharmony_ci    void HandleResolutionChangeEvent(const Event& event);
124fa7767c5Sopenharmony_ci    void HandlePluginEvent(const Event& event);
125fa7767c5Sopenharmony_ci
126fa7767c5Sopenharmony_ci    OSAL::Mutex stateMutex_ {};
127fa7767c5Sopenharmony_ci    OSAL::ConditionVariable cond_ {};
128fa7767c5Sopenharmony_ci    int32_t appUid_ {0};
129fa7767c5Sopenharmony_ci    int32_t appPid_ {0};
130fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::PipelineCore> pipeline_;
131fa7767c5Sopenharmony_ci    std::atomic<PlayerStates> pipelineStates_ {PlayerStates::PLAYER_IDLE}; // only update in UpdateStateNoLock()
132fa7767c5Sopenharmony_ci    std::queue<PlayerStates> pendingStates_ {};
133fa7767c5Sopenharmony_ci    std::atomic<bool> initialized_ {false};
134fa7767c5Sopenharmony_ci
135fa7767c5Sopenharmony_ci    std::weak_ptr<Plugin::Meta> sourceMeta_ {};
136fa7767c5Sopenharmony_ci    std::vector<std::weak_ptr<Plugin::Meta>> streamMeta_ {};
137fa7767c5Sopenharmony_ci    int64_t duration_ {-1};
138fa7767c5Sopenharmony_ci    std::atomic<bool> singleLoop_ {false};
139fa7767c5Sopenharmony_ci    float volume_;
140fa7767c5Sopenharmony_ci    MediaStatStub mediaStats_;
141fa7767c5Sopenharmony_ci
142fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::MediaSourceFilter> audioSource_;
143fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::DemuxerFilter> demuxer_;
144fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::AudioDecoderFilter> audioDecoder_;
145fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::AudioSinkFilter> audioSink_;
146fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT
147fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::VideoDecoderFilter> videoDecoder_;
148fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::VideoSinkFilter> videoSink_;
149fa7767c5Sopenharmony_ci#endif
150fa7767c5Sopenharmony_ci    std::unordered_map<std::string, std::shared_ptr<Pipeline::AudioDecoderFilter>> audioDecoderMap_;
151fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::MediaSyncManager> syncManager_;
152fa7767c5Sopenharmony_ci    HiPlayerCallbackLooper callbackLooper_ {};
153fa7767c5Sopenharmony_ci    sptr<Surface> surface_ {nullptr};
154fa7767c5Sopenharmony_ci
155fa7767c5Sopenharmony_ci    int32_t videoWidth_ {0};
156fa7767c5Sopenharmony_ci    int32_t videoHeight_ {0};
157fa7767c5Sopenharmony_ci    std::string url_;
158fa7767c5Sopenharmony_ci};
159fa7767c5Sopenharmony_ci}  // namespace Media
160fa7767c5Sopenharmony_ci}  // namespace OHOS
161fa7767c5Sopenharmony_ci#endif // HISTREAMER_SCENE_STD_HIPLAYER_IMPL_H
162