1 /*
2 * Copyright (c) 2023 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 #include "player_framework_adapter_impl.h"
17
18 #include "foundation/multimedia/player_framework/interfaces/inner_api/native/media_errors.h"
19 #include "nweb_log.h"
20 #include "surface_adapter_impl.h"
21 #include "foundation/graphic/graphic_surface/interfaces/inner_api/surface/window.h"
22 #include "foundation/graphic/graphic_surface/surface/include/native_window.h"
23
24 namespace OHOS::NWeb {
25 namespace {
IsUnsupportType(int32_t errorCode)26 bool IsUnsupportType(int32_t errorCode)
27 {
28 switch (errorCode) {
29 case Media::MSERR_UNSUPPORT:
30 case Media::MSERR_UNSUPPORT_AUD_SRC_TYPE:
31 case Media::MSERR_UNSUPPORT_AUD_SAMPLE_RATE:
32 case Media::MSERR_UNSUPPORT_AUD_CHANNEL_NUM:
33 case Media::MSERR_UNSUPPORT_AUD_ENC_TYPE:
34 case Media::MSERR_UNSUPPORT_AUD_PARAMS:
35 case Media::MSERR_UNSUPPORT_VID_SRC_TYPE:
36 case Media::MSERR_UNSUPPORT_VID_ENC_TYPE:
37 case Media::MSERR_UNSUPPORT_VID_PARAMS:
38 case Media::MSERR_UNSUPPORT_CONTAINER_TYPE:
39 case Media::MSERR_UNSUPPORT_PROTOCOL_TYPE:
40 case Media::MSERR_UNSUPPORT_VID_DEC_TYPE:
41 case Media::MSERR_UNSUPPORT_AUD_DEC_TYPE:
42 case Media::MSERR_UNSUPPORT_STREAM:
43 case Media::MSERR_UNSUPPORT_FILE:
44 case Media::MSERR_UNSUPPORT_SOURCE:
45 return true;
46 default:
47 return false;
48 }
49 }
50
IsFatalError(int32_t errorCode)51 bool IsFatalError(int32_t errorCode)
52 {
53 switch (errorCode) {
54 case Media::MSERR_EXT_NO_MEMORY:
55 case Media::MSERR_EXT_SERVICE_DIED:
56 case Media::MSERR_CREATE_PLAYER_ENGINE_FAILED:
57 case Media::MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED:
58 case Media::MSERR_AUD_DEC_FAILED:
59 case Media::MSERR_VID_DEC_FAILED:
60 case Media::MSERR_FILE_ACCESS_FAILED:
61 case Media::MSERR_DATA_SOURCE_IO_ERROR:
62 return true;
63 default:
64 return false;
65 }
66 }
67
ConvertInfoType(Media::PlayerOnInfoType infoType)68 NWeb::PlayerOnInfoType ConvertInfoType(Media::PlayerOnInfoType infoType)
69 {
70 NWeb::PlayerOnInfoType ret = NWeb::PlayerOnInfoType::INFO_TYPE_UNSET;
71 switch (infoType) {
72 case Media::INFO_TYPE_SEEKDONE:
73 ret = NWeb::PlayerOnInfoType::INFO_TYPE_SEEKDONE;
74 break;
75 case Media::INFO_TYPE_EOS:
76 ret = NWeb::PlayerOnInfoType::INFO_TYPE_EOS;
77 break;
78 case Media::INFO_TYPE_STATE_CHANGE:
79 ret = NWeb::PlayerOnInfoType::INFO_TYPE_STATE_CHANGE;
80 break;
81 case Media::INFO_TYPE_POSITION_UPDATE:
82 ret = NWeb::PlayerOnInfoType::INFO_TYPE_POSITION_UPDATE;
83 break;
84 case Media::INFO_TYPE_MESSAGE:
85 ret = NWeb::PlayerOnInfoType::INFO_TYPE_MESSAGE;
86 break;
87 case Media::INFO_TYPE_INTERRUPT_EVENT:
88 ret = NWeb::PlayerOnInfoType::INFO_TYPE_INTERRUPT_EVENT;
89 break;
90 default:
91 break;
92 }
93 return ret;
94 }
95
ConvertSeekMode(NWeb::PlayerSeekMode mode)96 Media::PlayerSeekMode ConvertSeekMode(NWeb::PlayerSeekMode mode)
97 {
98 Media::PlayerSeekMode ret = Media::SEEK_CLOSEST;
99 switch (mode) {
100 case NWeb::PlayerSeekMode::SEEK_NEXT_SYNC:
101 ret = Media::SEEK_NEXT_SYNC;
102 break;
103 case NWeb::PlayerSeekMode::SEEK_PREVIOUS_SYNC:
104 ret = Media::SEEK_PREVIOUS_SYNC;
105 break;
106 case NWeb::PlayerSeekMode::SEEK_CLOSEST_SYNC:
107 ret = Media::SEEK_CLOSEST_SYNC;
108 break;
109 case NWeb::PlayerSeekMode::SEEK_CLOSEST:
110 ret = Media::SEEK_CLOSEST;
111 break;
112 default:
113 break;
114 }
115 return ret;
116 }
117
ConvertRateMode(NWeb::PlaybackRateMode mode)118 Media::PlaybackRateMode ConvertRateMode(NWeb::PlaybackRateMode mode)
119 {
120 Media::PlaybackRateMode ret = Media::SPEED_FORWARD_1_00_X;
121 switch (mode) {
122 case NWeb::PlaybackRateMode::SPEED_FORWARD_0_75_X:
123 ret = Media::SPEED_FORWARD_0_75_X;
124 break;
125 case NWeb::PlaybackRateMode::SPEED_FORWARD_1_00_X:
126 ret = Media::SPEED_FORWARD_1_00_X;
127 break;
128 case NWeb::PlaybackRateMode::SPEED_FORWARD_1_25_X:
129 ret = Media::SPEED_FORWARD_1_25_X;
130 break;
131 case NWeb::PlaybackRateMode::SPEED_FORWARD_1_75_X:
132 ret = Media::SPEED_FORWARD_1_75_X;
133 break;
134 case NWeb::PlaybackRateMode::SPEED_FORWARD_2_00_X:
135 ret = Media::SPEED_FORWARD_2_00_X;
136 break;
137 default:
138 break;
139 }
140 return ret;
141 }
142 } // namespace
143
PlayerCallbackImpl(std::shared_ptr<PlayerCallbackAdapter> callback)144 PlayerCallbackImpl::PlayerCallbackImpl(std::shared_ptr<PlayerCallbackAdapter> callback)
145 : callbackAdapter_(std::move(callback))
146 {}
147
OnInfo(Media::PlayerOnInfoType type,int32_t extra,const Media::Format & infoBody)148 void PlayerCallbackImpl::OnInfo(Media::PlayerOnInfoType type, int32_t extra, const Media::Format& infoBody)
149 {
150 int32_t hintValue = -1;
151 if (type == Media::INFO_TYPE_INTERRUPT_EVENT) {
152 infoBody.GetIntValue(OHOS::Media::PlayerKeys::AUDIO_INTERRUPT_HINT, hintValue);
153 }
154 if (callbackAdapter_) {
155 callbackAdapter_->OnInfo(ConvertInfoType(type), extra, hintValue);
156 }
157 }
158
OnError(int32_t errorCode,const std::string & errorMsg)159 void PlayerCallbackImpl::OnError(int32_t errorCode, const std::string& errorMsg)
160 {
161 (void)errorMsg;
162 WVLOG_E("media player error, errorCode=%{public}d", errorCode);
163 if (callbackAdapter_) {
164 auto errorType = PlayerAdapterErrorType::INVALID_CODE;
165 if (IsUnsupportType(errorCode)) {
166 errorType = PlayerAdapterErrorType::UNSUPPORT_TYPE;
167 } else if (IsFatalError(errorCode)) {
168 errorType = PlayerAdapterErrorType::FATAL_ERROR;
169 }
170 callbackAdapter_->OnError(errorType);
171 }
172 }
173
PlayerAdapterImpl()174 PlayerAdapterImpl::PlayerAdapterImpl()
175 {
176 player_ = Media::PlayerFactory::CreatePlayer();
177 }
178
~PlayerAdapterImpl()179 PlayerAdapterImpl::~PlayerAdapterImpl()
180 {
181 if (player_) {
182 player_->Release();
183 WVLOG_I("player release");
184 }
185 }
186
SetPlayerCallback(std::shared_ptr<PlayerCallbackAdapter> callbackAdapter)187 int32_t PlayerAdapterImpl::SetPlayerCallback(std::shared_ptr<PlayerCallbackAdapter> callbackAdapter)
188 {
189 if (!player_ || !callbackAdapter) {
190 WVLOG_E("player_ or callbackAdapter is nullptr");
191 return -1;
192 }
193 auto callback = std::make_shared<PlayerCallbackImpl>(std::move(callbackAdapter));
194 return player_->SetPlayerCallback(callback);
195 }
196
SetSource(const std::string & url)197 int32_t PlayerAdapterImpl::SetSource(const std::string& url)
198 {
199 if (!player_) {
200 WVLOG_E("player_ is nullptr");
201 return -1;
202 }
203 return player_->SetSource(url);
204 }
205
SetSource(int32_t fd,int64_t offset,int64_t size)206 int32_t PlayerAdapterImpl::SetSource(int32_t fd, int64_t offset, int64_t size)
207 {
208 if (!player_) {
209 WVLOG_E("player_ is nullptr");
210 return -1;
211 }
212 return player_->SetSource(fd, offset, size);
213 }
214
SetVideoSurface(std::shared_ptr<IConsumerSurfaceAdapter> cSurfaceAdapter)215 int32_t PlayerAdapterImpl::SetVideoSurface(std::shared_ptr<IConsumerSurfaceAdapter> cSurfaceAdapter)
216 {
217 if (!player_ || !cSurfaceAdapter) {
218 WVLOG_E("player_ or cSurfaceAdapter is nullptr");
219 return -1;
220 }
221 auto cSurface = std::static_pointer_cast<ConsumerSurfaceAdapterImpl>(cSurfaceAdapter)->GetConsumerSurface();
222 cSurface->SetDefaultUsage(BUFFER_USAGE_CPU_READ);
223 sptr<IBufferProducer> producer = cSurface->GetProducer();
224 sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
225 return player_->SetVideoSurface(pSurface);
226 }
227
SetVolume(float leftVolume,float rightVolume)228 int32_t PlayerAdapterImpl::SetVolume(float leftVolume, float rightVolume)
229 {
230 if (!player_) {
231 WVLOG_E("player_ is nullptr");
232 return -1;
233 }
234 return player_->SetVolume(leftVolume, rightVolume);
235 }
236
Seek(int32_t mSeconds,PlayerSeekMode mode)237 int32_t PlayerAdapterImpl::Seek(int32_t mSeconds, PlayerSeekMode mode)
238 {
239 if (!player_) {
240 WVLOG_E("player_ is nullptr");
241 return -1;
242 }
243 return player_->Seek(mSeconds, ConvertSeekMode(mode));
244 }
245
Play()246 int32_t PlayerAdapterImpl::Play()
247 {
248 if (!player_) {
249 WVLOG_E("player_ is nullptr");
250 return -1;
251 }
252 return player_->Play();
253 }
254
Pause()255 int32_t PlayerAdapterImpl::Pause()
256 {
257 if (!player_) {
258 WVLOG_E("player_ is nullptr");
259 return -1;
260 }
261 return player_->Pause();
262 }
263
PrepareAsync()264 int32_t PlayerAdapterImpl::PrepareAsync()
265 {
266 if (!player_) {
267 WVLOG_E("player_ is nullptr");
268 return -1;
269 }
270 return player_->PrepareAsync();
271 }
272
GetCurrentTime(int32_t & currentTime)273 int32_t PlayerAdapterImpl::GetCurrentTime(int32_t& currentTime)
274 {
275 if (!player_) {
276 WVLOG_E("player_ is nullptr");
277 return -1;
278 }
279 return player_->GetCurrentTime(currentTime);
280 }
281
GetDuration(int32_t & duration)282 int32_t PlayerAdapterImpl::GetDuration(int32_t& duration)
283 {
284 if (!player_) {
285 WVLOG_E("player_ is nullptr");
286 return -1;
287 }
288 return player_->GetDuration(duration);
289 }
290
SetPlaybackSpeed(PlaybackRateMode mode)291 int32_t PlayerAdapterImpl::SetPlaybackSpeed(PlaybackRateMode mode)
292 {
293 if (!player_) {
294 WVLOG_E("player_ is nullptr");
295 return -1;
296 }
297 return player_->SetPlaybackSpeed(ConvertRateMode(mode));
298 }
299
SetVideoSurfaceNew(void * native_window)300 int32_t PlayerAdapterImpl::SetVideoSurfaceNew(void* native_window)
301 {
302 WVLOG_I("PlayerAdapterImpl::SetVideoSurfaceNew");
303 if (!player_) {
304 WVLOG_E("player_ is nullptr");
305 return -1;
306 }
307 OHNativeWindow* ohNativeWindow = reinterpret_cast<OHNativeWindow*>(native_window);
308 return player_->SetVideoSurface(ohNativeWindow->surface);
309 }
310
SetMediaSourceHeader(const std::string & url,const std::map<std::string,std::string> & header)311 int32_t PlayerAdapterImpl::SetMediaSourceHeader(const std::string& url,
312 const std::map<std::string, std::string>& header)
313 {
314 if (!player_) {
315 WVLOG_E("player_ is nullptr");
316 return -1;
317 }
318 std::shared_ptr<Media::AVMediaSource> mediaSource = std::make_shared<Media::AVMediaSource>(url, header);
319 Media::AVPlayStrategy strategy;
320 return player_->SetMediaSource(mediaSource, strategy);
321 }
322
323 } // namespace OHOS::NWeb
324