1 /* 2 * Copyright (c) 2024-2024 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_DOWNLOAD_MONITOR_H 17 #define HISTREAMER_DOWNLOAD_MONITOR_H 18 19 #include <ctime> 20 #include <list> 21 #include <memory> 22 #include <string> 23 #include <set> 24 #include "osal/task/task.h" 25 #include "osal/task/mutex.h" 26 #include "osal/task/blocking_queue.h" 27 #include "osal/utils/ring_buffer.h" 28 #include "plugin/plugin_base.h" 29 #include "download/downloader.h" 30 #include "media_downloader.h" 31 #include "common/media_source.h" 32 #include "common/media_core.h" 33 34 namespace OHOS { 35 namespace Media { 36 namespace Plugins { 37 namespace HttpPlugin { 38 struct RetryRequest { 39 std::shared_ptr<DownloadRequest> request; 40 std::function<void()> function; 41 }; 42 43 class DownloadMonitor : public MediaDownloader { 44 public: 45 explicit DownloadMonitor(std::shared_ptr<MediaDownloader> downloader) noexcept; 46 ~DownloadMonitor() override = default; 47 bool Open(const std::string& url, const std::map<std::string, std::string>& httpHeader) override; 48 void Close(bool isAsync) override; 49 Status Read(unsigned char* buff, ReadDataInfo& readDataInfo) override; 50 bool SeekToPos(int64_t offset, bool& isSeekHIt) override; 51 void Pause() override; 52 void Resume() override; 53 size_t GetContentLength() const override; 54 int64_t GetDuration() const override; 55 Seekable GetSeekable() const override; 56 void SetCallback(Callback *cb) override; 57 void SetStatusCallback(StatusCallbackFunc cb) override; 58 bool GetStartedStatus() override; 59 bool SeekToTime(int64_t seekTime, SeekMode mode) override; 60 std::vector<uint32_t> GetBitRates() override; 61 bool SelectBitRate(uint32_t bitRate) override; 62 bool AutoSelectBitRate(uint32_t bitRate) override; 63 void SetIsTriggerAutoMode(bool isAuto) override; 64 void SetReadBlockingFlag(bool isReadBlockingAllowed) override; 65 void SetDemuxerState(int32_t streamId) override; 66 void SetPlayStrategy(const std::shared_ptr<PlayStrategy>& playStrategy) override; 67 void SetInterruptState(bool isInterruptNeeded) override; 68 Status GetStreamInfo(std::vector<StreamInfo>& streams) override; 69 Status SelectStream(int32_t streamId) override; 70 void GetDownloadInfo(DownloadInfo& downloadInfo) override; 71 std::pair<int32_t, int32_t> GetDownloadInfo() override; 72 Status SetCurrentBitRate(int32_t bitRate, int32_t streamID) override; 73 void GetPlaybackInfo(PlaybackInfo& playbackInfo) override; 74 size_t GetBufferSize() const override; 75 bool GetPlayable() override; 76 bool GetBufferingTimeOut() override; 77 bool GetReadTimeOut(bool isDelay) override; 78 void SetAppUid(int32_t appUid) override; 79 size_t GetSegmentOffset() override; 80 bool GetHLSDiscontinuity() override; 81 Status StopBufferring(bool isAppBackground) override; 82 void WaitForBufferingEnd() override; 83 bool SetInitialBufferSize(int32_t offset, int32_t size) override; 84 void NotifyInitSuccess() override; 85 void SetStartPts(int64_t startPts) override; 86 void SetExtraCache(uint64_t cacheDuration) override; 87 void SetMediaStreams(const MediaStreamList& mediaStreams) override; 88 uint64_t GetCachedDuration() override; 89 void RestartAndClearBuffer() override; 90 bool IsFlvLive() override; 91 bool IsHlsFmp4() override; 92 uint64_t GetMemorySize() override; 93 std::string GetContentType() override; 94 std::string GetCurUrl() override; 95 96 private: 97 int64_t HttpMonitorLoop(); 98 void OnDownloadStatus(std::shared_ptr<Downloader>& downloader, std::shared_ptr<DownloadRequest>& request); 99 bool NeedRetry(const std::shared_ptr<DownloadRequest>& request); 100 void NotifyError(int32_t clientErrorCode, int32_t serverErrorCode); 101 void GetServerMediaServiceErrorCode(int32_t errorCode, int32_t& serverCode); 102 void GetClientMediaServiceErrorCode(int32_t errorCode, int32_t& clientCode); 103 104 std::atomic<bool> isClosed_{false}; 105 std::shared_ptr<MediaDownloader> downloader_; 106 std::list<RetryRequest> retryTasks_; 107 std::atomic<bool> isPlaying_ {false}; 108 std::shared_ptr<Task> task_; 109 time_t lastReadTime_ {0}; 110 Callback* callback_ {nullptr}; 111 Mutex taskMutex_ {}; 112 uint64_t haveReadData_ {0}; 113 bool isNeedClearBuffer_ {false}; 114 115 std::set<int32_t> clientNotRetryErrorSet = { 116 6, // CURLE_COULDNT_RESOLVE_HOST 117 22, // CURLE_HTTP_RETURNED_ERROR 118 26, // CURLE_READ_ERROR 119 34, // CURLE_HTTP_POST_ERROR 120 35, // CURLE_SSL_CONNECT_ERROR 121 52, // CURLE_GOT_NOTHING 122 58, // CURLE_SSL_CERTPROBLM 123 60, // CURLE_SSL_CACERT 124 77, // CURLE_SSL_CACERT_BADFILE 125 }; 126 127 std::set<int32_t> serverNotRetryErrorSet = { 128 400, // Bad Request 129 401, // Unauthorized 130 403, // Forbidden 131 }; 132 133 std::map<int32_t, MediaServiceErrCode> clientErrorCodeMap_ = { 134 {-6, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 135 {-5, MediaServiceErrCode::MSERR_IO_CONNECTION_TIMEOUT}, 136 {-4, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 137 {-3, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 138 {-2, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 139 {-1, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 140 {1, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 141 {2, MediaServiceErrCode::MSERR_DATA_SOURCE_IO_ERROR}, 142 {4, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 143 {5, MediaServiceErrCode::MSERR_IO_CANNOT_FIND_HOST}, 144 {6, MediaServiceErrCode::MSERR_IO_CANNOT_FIND_HOST}, 145 {7, MediaServiceErrCode::MSERR_IO_CANNOT_FIND_HOST}, 146 {8, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 147 {9, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 148 {10, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 149 {11, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 150 {12, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 151 {13, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 152 {14, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 153 {15, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 154 {16, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 155 {17, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 156 {18, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 157 {30, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 158 {31, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 159 {35, MediaServiceErrCode::MSERR_IO_SSL_CONNECT_FAIL}, 160 {37, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 161 {38, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 162 {39, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 163 {41, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 164 {45, MediaServiceErrCode::MSERR_IO_CONNECTION_TIMEOUT}, 165 {47, MediaServiceErrCode::MSERR_IO_CANNOT_FIND_HOST}, 166 {53, MediaServiceErrCode::MSERR_IO_SSL_CONNECT_FAIL}, 167 {54, MediaServiceErrCode::MSERR_IO_SSL_CONNECT_FAIL}, 168 {55, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 169 {56, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 170 {58, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 171 {59, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 172 {60, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 173 {61, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 174 {64, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 175 {65, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 176 {66, MediaServiceErrCode::MSERR_IO_SSL_CONNECT_FAIL}, 177 {68, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 178 {69, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 179 {71, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 180 {72, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 181 {74, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 182 {77, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 183 {78, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 184 {79, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 185 {80, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 186 {82, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 187 {83, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 188 {84, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 189 {85, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 190 {86, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 191 {87, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 192 {90, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 193 {91, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 194 {95, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 195 {96, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 196 {97, MediaServiceErrCode::MSERR_IO_NETWORK_ABNORMAL}, 197 {98, MediaServiceErrCode::MSERR_IO_SSL_SERVER_CERT_UNTRUSTED}, 198 {101, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 199 }; 200 201 std::map<int32_t, MediaServiceErrCode> serverErrorCodeMap_ = { 202 {400, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 203 {401, MediaServiceErrCode::MSERR_IO_NO_PERMISSION}, 204 {403, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 205 {404, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 206 {406, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 207 {407, MediaServiceErrCode::MSERR_IO_NO_PERMISSION}, 208 {408, MediaServiceErrCode::MSERR_IO_CONNECTION_TIMEOUT}, 209 {409, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 210 {410, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 211 {411, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 212 {412, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 213 {413, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 214 {415, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 215 {416, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 216 {417, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 217 {421, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 218 {422, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 219 {424, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 220 {425, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 221 {428, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 222 {429, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 223 {431, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 224 {451, MediaServiceErrCode::MSERR_IO_NETWORK_ACCESS_DENIED}, 225 {500, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 226 {501, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 227 {502, MediaServiceErrCode::MSERR_IO_NETWORK_UNAVAILABLE}, 228 {503, MediaServiceErrCode::MSERR_IO_NETWORK_UNAVAILABLE}, 229 {504, MediaServiceErrCode::MSERR_IO_CONNECTION_TIMEOUT}, 230 {505, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 231 {506, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 232 {507, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 233 {508, MediaServiceErrCode::MSERR_IO_RESOURE_NOT_FOUND}, 234 {510, MediaServiceErrCode::MSERR_IO_UNSUPPORTTED_REQUEST}, 235 {511, MediaServiceErrCode::MSERR_IO_SSL_CLIENT_CERT_NEEDED}, 236 }; 237 }; 238 } 239 } 240 } 241 } 242 #endif 243