1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. 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 PLAYER_SERVER_MEM_H 17 #define PLAYER_SERVER_MEM_H 18 19 #include <vector> 20 #include <chrono> 21 #include "player_server.h" 22 #include "player_server_state.h" 23 24 namespace OHOS { 25 namespace Media { 26 enum class PlayerSourceType : int32_t { 27 SOURCE_TYPE_NULL, 28 SOURCE_TYPE_URL, 29 SOURCE_TYPE_DATASRC, 30 SOURCE_TYPE_FD, 31 }; 32 33 class PlayerServerMem : public PlayerServer { 34 public: 35 static std::shared_ptr<IPlayerService> Create(); 36 PlayerServerMem(); 37 virtual ~PlayerServerMem(); 38 39 int32_t Reset() override; 40 int32_t Stop() override; 41 int32_t AddSubSource(const std::string &url) override; 42 int32_t PrepareAsync() override; 43 int32_t SetSource(int32_t fd, int64_t offset, int64_t size) override; 44 int32_t Pause() override; 45 int32_t SetSource(const std::shared_ptr<IMediaDataSource> &dataSrc) override; 46 int32_t Prepare() override; 47 int32_t SetSource(const std::string &url) override; 48 int32_t Play() override; 49 int32_t AddSubSource(int32_t fd, int64_t offset, int64_t size) override; 50 int32_t Release() override; 51 int32_t GetCurrentTime(int32_t ¤tTime) override; 52 int32_t GetPlaybackPosition(int32_t &playbackPosition) override; 53 int32_t GetVideoWidth() override; 54 int32_t GetVideoHeight() override; 55 int32_t GetVideoTrackInfo(std::vector<Format> &videoTrack) override; 56 int32_t GetAudioTrackInfo(std::vector<Format> &audioTrack) override; 57 int32_t GetDuration(int32_t &duration) override; 58 int32_t SetPlaybackSpeed(PlaybackRateMode mode) override; 59 int32_t GetPlaybackSpeed(PlaybackRateMode &mode) override; 60 int32_t SetVolume(float leftVolume, float rightVolume) override; 61 int32_t Seek(int32_t mSeconds, PlayerSeekMode mode) override; 62 #ifdef SUPPORT_VIDEO 63 int32_t SetVideoSurface(sptr<Surface> surface) override; 64 #endif 65 bool IsPlaying() override; 66 bool IsLooping() override; 67 int32_t SetPlayerCallback(const std::shared_ptr<PlayerCallback> &callback) override; 68 int32_t SelectBitRate(uint32_t bitRate) override; 69 int32_t SelectTrack(int32_t index, PlayerSwitchMode mode) override; 70 int32_t SetLooping(bool loop) override; 71 int32_t SetParameter(const Format ¶m) override; 72 int32_t DeselectTrack(int32_t index) override; 73 int32_t GetCurrentTrack(int32_t trackType, int32_t &index) override; 74 int32_t DumpInfo(int32_t fd) override; 75 void OnInfo(PlayerOnInfoType type, int32_t extra, const Format &infoBody = {}) override; 76 void ResetFrontGroundForMemManage(); 77 void ResetBackGroundForMemManage(); 78 void ResetMemmgrForMemManage(); 79 void RecoverByMemManage(); 80 81 private: 82 class MemBaseState; 83 class MemIdleState; 84 class MemInitializedState; 85 class MemPreparingState; 86 class MemPreparedState; 87 class MemPlayingState; 88 class MemPausedState; 89 class MemStoppedState; 90 class MemPlaybackCompletedState; 91 92 std::shared_ptr<MemIdleState> memIdleState_ = nullptr; 93 std::shared_ptr<MemInitializedState> memInitializedState_ = nullptr; 94 std::shared_ptr<MemPreparingState> memPreparingState_ = nullptr; 95 std::shared_ptr<MemPreparedState> memPreparedState_ = nullptr; 96 std::shared_ptr<MemPlayingState> memPlayingState_ = nullptr; 97 std::shared_ptr<MemPausedState> memPausedState_ = nullptr; 98 std::shared_ptr<MemStoppedState> memStoppedState_ = nullptr; 99 std::shared_ptr<MemPlaybackCompletedState> memPlaybackCompletedState_ = nullptr; 100 struct FdSrcInfo { 101 int32_t fd = 0; 102 int64_t offset = 0; 103 int64_t size = 0; 104 }; 105 struct RecoverConfigInfo { 106 std::shared_ptr<MemBaseState> currState = nullptr; 107 int32_t sourceType = static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_NULL); 108 std::string url = ""; 109 std::shared_ptr<IMediaDataSource> dataSrc = nullptr; 110 int32_t fd = 0; 111 int64_t offset = 0; 112 int64_t size = 0; 113 std::vector<std::string> subUrl; 114 std::vector<FdSrcInfo> subFdSrc; 115 float leftVolume = 1.0f; 116 float rightVolume = 1.0f; 117 PlaybackRateMode speedMode = SPEED_FORWARD_1_00_X; 118 sptr<Surface> surface = nullptr; 119 bool loop = false; 120 bool isPlaying = false; 121 int32_t videoScaleType = -1; 122 int32_t contentType = -1; 123 int32_t streamUsage = -1; 124 int32_t rendererFlag = -1; 125 int32_t interruptMode = -1; 126 int32_t effectMode = OHOS::AudioStandard::AudioEffectMode::EFFECT_DEFAULT; 127 std::shared_ptr<PlayerCallback> callback = nullptr; 128 uint32_t bitRate = 0; 129 int32_t currentTime = 0; 130 int32_t playbackPosition = 0; 131 std::vector<Format> videoTrack; 132 std::vector<Format> audioTrack; 133 int32_t videoWidth = 0; 134 int32_t videoHeight = 0; 135 int32_t duration = 0; 136 int32_t audioIndex = 0; 137 int32_t videoIndex = 0; 138 int32_t textIndex = 0; 139 int32_t volumeMode = 0; 140 } recoverConfig_; 141 struct PlayerServerConfig { 142 bool errorCbOnce = false; 143 bool disableStoppedCb = false; 144 std::string lastErrMsg = ""; 145 std::unique_ptr<UriHelper> uriHelper = nullptr; 146 } playerServerConfig_; 147 std::mutex mutex_; 148 std::mutex mutexCb_; 149 bool isReleaseMemByManage_ = false; 150 bool isRecoverMemByUser_ = false; 151 bool isAudioPlayer_ = true; 152 int32_t continueReset = 0; 153 std::map<void *, std::shared_ptr<MemBaseState>> stateMap_; 154 std::chrono::steady_clock::time_point lastestUserSetTime_; 155 std::condition_variable recoverCond_; 156 int32_t defaultAudioIndex_ = -1; 157 bool isSeekToCurrentTime_ = false; 158 bool isLocalResource_ = false; 159 160 int32_t Init() override; 161 void SetStateMap(); 162 void SaveParameter(const Format ¶m); 163 int32_t SetSaveParameter(); 164 int32_t SetSourceInternal(); 165 int32_t AddSubSourceInternal(); 166 int32_t PrepareAsyncInner(); 167 void SetPlayerServerConfig(); 168 void GetPlayerServerConfig(); 169 int32_t SetConfigInternal(); 170 int32_t SetBehaviorInternal(); 171 int32_t SetPlaybackSpeedInternal(); 172 int32_t GetInformationBeforeMemReset(); 173 void RecoverToInitialized(PlayerOnInfoType type, int32_t extra); 174 void RecoverToPrepared(PlayerOnInfoType type, int32_t extra); 175 void RecoverToCompleted(PlayerOnInfoType type, int32_t extra); 176 int32_t RecoverPlayerCb(); 177 void CheckHasRecover(PlayerOnInfoType type, int32_t extra); 178 int32_t ReleaseMemByManage(); 179 int32_t RecoverMemByUser(); 180 bool NeedSelectAudioTrack(); 181 void GetDefaultTrack(PlayerOnInfoType type, int32_t extra, const Format &infoBody); 182 int32_t SeekToCurrentTime(int32_t mSeconds, PlayerSeekMode mode); 183 int32_t HandleCodecBuffers(bool enable); 184 int32_t LocalResourceRelease(); 185 int32_t NetworkResourceRelease(); 186 int32_t LocalResourceRecover(); 187 int32_t NetworkRecover(); 188 void SetResourceTypeBySysParam(); 189 }; 190 } 191 } 192 #endif // PLAYER_SERVER_MEM_H 193