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