• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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