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_LITE_HIPLAYER_IMPL_H
17fa7767c5Sopenharmony_ci#define HISTREAMER_SCENE_LITE_HIPLAYER_IMPL_H
18fa7767c5Sopenharmony_ci
19fa7767c5Sopenharmony_ci#include <memory>
20fa7767c5Sopenharmony_ci#include <unordered_map>
21fa7767c5Sopenharmony_ci#include "foundation/osal/thread/condition_variable.h"
22fa7767c5Sopenharmony_ci#include "foundation/osal/thread/mutex.h"
23fa7767c5Sopenharmony_ci#include "internal/state_machine.h"
24fa7767c5Sopenharmony_ci#include "pipeline/core/error_code.h"
25fa7767c5Sopenharmony_ci#include "pipeline/core/media_sync_manager.h"
26fa7767c5Sopenharmony_ci#include "pipeline/core/pipeline.h"
27fa7767c5Sopenharmony_ci#include "pipeline/core/pipeline_core.h"
28fa7767c5Sopenharmony_ci#include "pipeline/filters/codec/audio_decoder/audio_decoder_filter.h"
29fa7767c5Sopenharmony_ci#include "pipeline/filters/demux/demuxer_filter.h"
30fa7767c5Sopenharmony_ci#include "pipeline/filters/sink/audio_sink/audio_sink_filter.h"
31fa7767c5Sopenharmony_ci#include "pipeline/filters/source/media_source/media_source_filter.h"
32fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT
33fa7767c5Sopenharmony_ci#include "pipeline/filters/codec/video_decoder/video_decoder_filter.h"
34fa7767c5Sopenharmony_ci#include "pipeline/filters/sink/video_sink/video_sink_filter.h"
35fa7767c5Sopenharmony_ci#endif
36fa7767c5Sopenharmony_ci#include "play_executor.h"
37fa7767c5Sopenharmony_ci#include "plugin/common/any.h"
38fa7767c5Sopenharmony_ci#include "scene/common/media_stat_stub.h"
39fa7767c5Sopenharmony_ci#include "scene/lite/hiplayer.h"
40fa7767c5Sopenharmony_ci
41fa7767c5Sopenharmony_cinamespace OHOS {
42fa7767c5Sopenharmony_cinamespace Media {
43fa7767c5Sopenharmony_ciclass HiPlayerImpl : public Pipeline::EventReceiver,
44fa7767c5Sopenharmony_ci                     public PlayExecutor,
45fa7767c5Sopenharmony_ci                     public StateChangeCallback,
46fa7767c5Sopenharmony_ci                     public Pipeline::FilterCallback,
47fa7767c5Sopenharmony_ci                     public PlayerInterface {
48fa7767c5Sopenharmony_ci    friend class StateMachine;
49fa7767c5Sopenharmony_ci
50fa7767c5Sopenharmony_cipublic:
51fa7767c5Sopenharmony_ci    ~HiPlayerImpl() override;
52fa7767c5Sopenharmony_ci
53fa7767c5Sopenharmony_ci    static std::shared_ptr<HiPlayerImpl> CreateHiPlayerImpl();
54fa7767c5Sopenharmony_ci
55fa7767c5Sopenharmony_ci    // interface from PlayerInterface
56fa7767c5Sopenharmony_ci    int32_t Init() override;
57fa7767c5Sopenharmony_ci    int32_t DeInit() override;
58fa7767c5Sopenharmony_ci    int32_t SetSource(const Source& source) override;
59fa7767c5Sopenharmony_ci    int32_t Prepare() override;
60fa7767c5Sopenharmony_ci    int32_t Play() override;
61fa7767c5Sopenharmony_ci    bool IsPlaying() override;
62fa7767c5Sopenharmony_ci    int32_t Pause() override;
63fa7767c5Sopenharmony_ci    int32_t Stop() override;
64fa7767c5Sopenharmony_ci    int32_t Reset() override;
65fa7767c5Sopenharmony_ci    int32_t Release() override;
66fa7767c5Sopenharmony_ci    int32_t Rewind(int64_t mSeconds, int32_t mode) override;
67fa7767c5Sopenharmony_ci    int32_t SetVolume(float leftVolume, float rightVolume) override;
68fa7767c5Sopenharmony_ci#ifndef SURFACE_DISABLED
69fa7767c5Sopenharmony_ci    int32_t SetSurface(Surface* surface) override;
70fa7767c5Sopenharmony_ci#endif
71fa7767c5Sopenharmony_ci    bool IsSingleLooping() override;
72fa7767c5Sopenharmony_ci    int32_t SetLoop(bool loop) override;
73fa7767c5Sopenharmony_ci    void SetPlayerCallback(const std::shared_ptr<PlayerCallback>& cb) override;
74fa7767c5Sopenharmony_ci    int32_t GetPlayerState(int32_t& state) override;
75fa7767c5Sopenharmony_ci    int32_t GetCurrentPosition(int64_t& currentPositionMs) override;
76fa7767c5Sopenharmony_ci    int32_t GetDuration(int64_t& outDurationMs) override;
77fa7767c5Sopenharmony_ci    int32_t GetVideoWidth(int32_t& videoWidth) override;
78fa7767c5Sopenharmony_ci    int32_t GetVideoHeight(int32_t& videoHeight) override;
79fa7767c5Sopenharmony_ci    int32_t SetPlaybackSpeed(float speed) override;
80fa7767c5Sopenharmony_ci    int32_t GetPlaybackSpeed(float& speed) override;
81fa7767c5Sopenharmony_ci    int32_t SetAudioStreamType(int32_t type) override;
82fa7767c5Sopenharmony_ci    void GetAudioStreamType(int32_t& type) override;
83fa7767c5Sopenharmony_ci    int32_t SetParameter(const Format& params) override;
84fa7767c5Sopenharmony_ci
85fa7767c5Sopenharmony_ci    void OnEvent(const Event& event) override;
86fa7767c5Sopenharmony_ci
87fa7767c5Sopenharmony_ci    ErrorCode SetBufferSize(size_t size);
88fa7767c5Sopenharmony_ci
89fa7767c5Sopenharmony_ci    ErrorCode GetSourceMeta(std::shared_ptr<const Plugin::Meta>& meta) const;
90fa7767c5Sopenharmony_ci    ErrorCode GetTrackCnt(size_t& cnt) const;
91fa7767c5Sopenharmony_ci    ErrorCode GetTrackMeta(size_t id, std::shared_ptr<const Plugin::Meta>& meta) const;
92fa7767c5Sopenharmony_ci
93fa7767c5Sopenharmony_ci    void OnStateChanged(StateId state) override;
94fa7767c5Sopenharmony_ci
95fa7767c5Sopenharmony_ci    ErrorCode OnCallback(const Pipeline::FilterCallbackType& type, Pipeline::Filter* filter,
96fa7767c5Sopenharmony_ci                         const Plugin::Any& parameter) override;
97fa7767c5Sopenharmony_ci
98fa7767c5Sopenharmony_ci    // interface from PlayExecutor
99fa7767c5Sopenharmony_ci    bool IsSingleLoop() override;
100fa7767c5Sopenharmony_ci    ErrorCode DoSetSource(const std::shared_ptr<MediaSource>& source) override;
101fa7767c5Sopenharmony_ci    ErrorCode PrepareFilters() override;
102fa7767c5Sopenharmony_ci    ErrorCode DoPlay() override;
103fa7767c5Sopenharmony_ci    ErrorCode DoPause() override;
104fa7767c5Sopenharmony_ci    ErrorCode DoResume() override;
105fa7767c5Sopenharmony_ci    ErrorCode DoStop() override;
106fa7767c5Sopenharmony_ci    ErrorCode DoReset() override;
107fa7767c5Sopenharmony_ci    ErrorCode DoSeek(int64_t hstTime, Plugin::SeekMode mode, bool appTriggered) override;
108fa7767c5Sopenharmony_ci    ErrorCode DoOnReady() override;
109fa7767c5Sopenharmony_ci    ErrorCode DoOnComplete() override;
110fa7767c5Sopenharmony_ci    ErrorCode DoOnError(ErrorCode) override;
111fa7767c5Sopenharmony_ci
112fa7767c5Sopenharmony_ciprivate:
113fa7767c5Sopenharmony_ci    PlayerStates TransStateId2PlayerState(StateId state);
114fa7767c5Sopenharmony_ci    const std::string& StringnessPlayerState(PlayerStates state);
115fa7767c5Sopenharmony_ci    static Plugin::SeekMode Transform2SeekMode(PlayerSeekMode mode);
116fa7767c5Sopenharmony_ci    HiPlayerImpl();
117fa7767c5Sopenharmony_ci    HiPlayerImpl(const HiPlayerImpl& other);
118fa7767c5Sopenharmony_ci    HiPlayerImpl& operator=(const HiPlayerImpl& other);
119fa7767c5Sopenharmony_ci    ErrorCode StopAsync();
120fa7767c5Sopenharmony_ci    ErrorCode SetVolumeToSink(float volume, bool reportUpward = true);
121fa7767c5Sopenharmony_ci    Pipeline::PFilter CreateAudioDecoder(const std::string& desc);
122fa7767c5Sopenharmony_ci
123fa7767c5Sopenharmony_ci    ErrorCode NewAudioPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter);
124fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT
125fa7767c5Sopenharmony_ci    ErrorCode NewVideoPortFound(Pipeline::Filter* filter, const Plugin::Any& parameter);
126fa7767c5Sopenharmony_ci#endif
127fa7767c5Sopenharmony_ci
128fa7767c5Sopenharmony_ci    ErrorCode RemoveFilterChains(Pipeline::Filter* filter, const Plugin::Any& parameter);
129fa7767c5Sopenharmony_ci
130fa7767c5Sopenharmony_ci    void ActiveFilters(const std::vector<Pipeline::Filter*>& filters);
131fa7767c5Sopenharmony_ci    void HandlePluginErrorEvent(const Event& event);
132fa7767c5Sopenharmony_ci    void UpdateStateNoLock(PlayerStates newState, bool notifyUpward = true);
133fa7767c5Sopenharmony_ci
134fa7767c5Sopenharmony_ci    OSAL::Mutex stateMutex_;
135fa7767c5Sopenharmony_ci    OSAL::ConditionVariable cond_;
136fa7767c5Sopenharmony_ci    StateMachine fsm_;
137fa7767c5Sopenharmony_ci    std::atomic<StateId> curFsmState_;
138fa7767c5Sopenharmony_ci
139fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::PipelineCore> pipeline_;
140fa7767c5Sopenharmony_ci    std::atomic<PlayerStates> pipelineStates_ {PlayerStates::PLAYER_IDLE}; // only update in UpdateStateNoLock()
141fa7767c5Sopenharmony_ci    std::queue<PlayerStates> pendingStates_ {};
142fa7767c5Sopenharmony_ci    std::atomic<bool> initialized_ {false};
143fa7767c5Sopenharmony_ci
144fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::MediaSourceFilter> audioSource_;
145fa7767c5Sopenharmony_ci
146fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::DemuxerFilter> demuxer_;
147fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::AudioDecoderFilter> audioDecoder_;
148fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::AudioSinkFilter> audioSink_;
149fa7767c5Sopenharmony_ci#ifdef VIDEO_SUPPORT
150fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::VideoDecoderFilter> videoDecoder;
151fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::VideoSinkFilter> videoSink;
152fa7767c5Sopenharmony_ci#endif
153fa7767c5Sopenharmony_ci
154fa7767c5Sopenharmony_ci    std::unordered_map<std::string, std::shared_ptr<Pipeline::AudioDecoderFilter>> audioDecoderMap_;
155fa7767c5Sopenharmony_ci
156fa7767c5Sopenharmony_ci    std::weak_ptr<Plugin::Meta> sourceMeta_;
157fa7767c5Sopenharmony_ci    std::vector<std::weak_ptr<Plugin::Meta>> streamMeta_;
158fa7767c5Sopenharmony_ci    int64_t duration_ {-1};
159fa7767c5Sopenharmony_ci    std::atomic<bool> singleLoop_ {false};
160fa7767c5Sopenharmony_ci
161fa7767c5Sopenharmony_ci    std::weak_ptr<PlayerCallback> callback_;
162fa7767c5Sopenharmony_ci    float volume_;
163fa7767c5Sopenharmony_ci    MediaStatStub mediaStats_;
164fa7767c5Sopenharmony_ci
165fa7767c5Sopenharmony_ci    std::shared_ptr<Pipeline::MediaSyncManager> syncManager_;
166fa7767c5Sopenharmony_ci};
167fa7767c5Sopenharmony_ci} // namespace Media
168fa7767c5Sopenharmony_ci} // namespace OHOS
169fa7767c5Sopenharmony_ci#endif // HISTREAMER_SCENE_LITE_HIPLAYER_IMPL_H
170