• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "../native/media_errors.h"
19 #include "nweb_log.h"
20 #include "surface_adapter_impl.h"
21 #include "surface/window.h"
22 #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         case Media::INFO_TYPE_RESOLUTION_CHANGE:
91             ret = NWeb::PlayerOnInfoType::INFO_TYPE_RESOLUTION_CHANGE;
92             break;
93         default:
94             break;
95     }
96     return ret;
97 }
98 
ConvertSeekMode(NWeb::PlayerSeekMode mode)99 Media::PlayerSeekMode ConvertSeekMode(NWeb::PlayerSeekMode mode)
100 {
101     Media::PlayerSeekMode ret = Media::SEEK_CLOSEST;
102     switch (mode) {
103         case NWeb::PlayerSeekMode::SEEK_NEXT_SYNC:
104             ret = Media::SEEK_NEXT_SYNC;
105             break;
106         case NWeb::PlayerSeekMode::SEEK_PREVIOUS_SYNC:
107             ret = Media::SEEK_PREVIOUS_SYNC;
108             break;
109         case NWeb::PlayerSeekMode::SEEK_CLOSEST_SYNC:
110             ret = Media::SEEK_CLOSEST_SYNC;
111             break;
112         case NWeb::PlayerSeekMode::SEEK_CLOSEST:
113             ret = Media::SEEK_CLOSEST;
114             break;
115         default:
116             break;
117     }
118     return ret;
119 }
120 
ConvertRateMode(NWeb::PlaybackRateMode mode)121 Media::PlaybackRateMode ConvertRateMode(NWeb::PlaybackRateMode mode)
122 {
123     Media::PlaybackRateMode ret = Media::SPEED_FORWARD_1_00_X;
124     switch (mode) {
125         case NWeb::PlaybackRateMode::SPEED_FORWARD_0_75_X:
126             ret = Media::SPEED_FORWARD_0_75_X;
127             break;
128         case NWeb::PlaybackRateMode::SPEED_FORWARD_1_00_X:
129             ret = Media::SPEED_FORWARD_1_00_X;
130             break;
131         case NWeb::PlaybackRateMode::SPEED_FORWARD_1_25_X:
132             ret = Media::SPEED_FORWARD_1_25_X;
133             break;
134         case NWeb::PlaybackRateMode::SPEED_FORWARD_1_75_X:
135             ret = Media::SPEED_FORWARD_1_75_X;
136             break;
137         case NWeb::PlaybackRateMode::SPEED_FORWARD_2_00_X:
138             ret = Media::SPEED_FORWARD_2_00_X;
139             break;
140         default:
141             break;
142     }
143     return ret;
144 }
145 } // namespace
146 
PlayerCallbackImpl(std::shared_ptr<PlayerCallbackAdapter> callback)147 PlayerCallbackImpl::PlayerCallbackImpl(std::shared_ptr<PlayerCallbackAdapter> callback)
148     : callbackAdapter_(std::move(callback))
149 {}
150 
OnInfo(Media::PlayerOnInfoType type,int32_t extra,const Media::Format & infoBody)151 void PlayerCallbackImpl::OnInfo(Media::PlayerOnInfoType type, int32_t extra, const Media::Format& infoBody)
152 {
153     int32_t hintValue = -1;
154     if (type == Media::INFO_TYPE_INTERRUPT_EVENT) {
155         infoBody.GetIntValue(OHOS::Media::PlayerKeys::AUDIO_INTERRUPT_HINT, hintValue);
156     }
157     if (type == Media::INFO_TYPE_RESOLUTION_CHANGE) {
158         infoBody.GetIntValue(OHOS::Media::PlayerKeys::PLAYER_WIDTH, extra);
159         infoBody.GetIntValue(OHOS::Media::PlayerKeys::PLAYER_HEIGHT, hintValue);
160     }
161     if (callbackAdapter_) {
162         callbackAdapter_->OnInfo(ConvertInfoType(type), extra, hintValue);
163     }
164 }
165 
OnError(int32_t errorCode,const std::string & errorMsg)166 void PlayerCallbackImpl::OnError(int32_t errorCode, const std::string& errorMsg)
167 {
168     (void)errorMsg;
169     WVLOG_E("media player error, errorCode=%{public}d", errorCode);
170     if (callbackAdapter_) {
171         auto errorType = PlayerAdapterErrorType::INVALID_CODE;
172         if (IsUnsupportType(errorCode)) {
173             errorType = PlayerAdapterErrorType::UNSUPPORT_TYPE;
174         } else if (IsFatalError(errorCode)) {
175             errorType = PlayerAdapterErrorType::FATAL_ERROR;
176         }
177         callbackAdapter_->OnError(errorType);
178     }
179 }
180 
PlayerAdapterImpl()181 PlayerAdapterImpl::PlayerAdapterImpl()
182 {
183     player_ = Media::PlayerFactory::CreatePlayer();
184 }
185 
~PlayerAdapterImpl()186 PlayerAdapterImpl::~PlayerAdapterImpl()
187 {
188     if (player_) {
189         player_->Release();
190         WVLOG_I("player release");
191     }
192 }
193 
SetPlayerCallback(std::shared_ptr<PlayerCallbackAdapter> callbackAdapter)194 int32_t PlayerAdapterImpl::SetPlayerCallback(std::shared_ptr<PlayerCallbackAdapter> callbackAdapter)
195 {
196     if (!player_ || !callbackAdapter) {
197         WVLOG_E("player_ or callbackAdapter is nullptr");
198         return -1;
199     }
200     auto callback = std::make_shared<PlayerCallbackImpl>(std::move(callbackAdapter));
201     return player_->SetPlayerCallback(callback);
202 }
203 
SetSource(const std::string & url)204 int32_t PlayerAdapterImpl::SetSource(const std::string& url)
205 {
206     if (!player_) {
207         WVLOG_E("player_ is nullptr");
208         return -1;
209     }
210     return player_->SetSource(url);
211 }
212 
SetSource(int32_t fd,int64_t offset,int64_t size)213 int32_t PlayerAdapterImpl::SetSource(int32_t fd, int64_t offset, int64_t size)
214 {
215     if (!player_) {
216         WVLOG_E("player_ is nullptr");
217         return -1;
218     }
219     return player_->SetSource(fd, offset, size);
220 }
221 
SetVideoSurface(std::shared_ptr<IConsumerSurfaceAdapter> cSurfaceAdapter)222 int32_t PlayerAdapterImpl::SetVideoSurface(std::shared_ptr<IConsumerSurfaceAdapter> cSurfaceAdapter)
223 {
224     if (!player_ || !cSurfaceAdapter) {
225         WVLOG_E("player_  or cSurfaceAdapter is nullptr");
226         return -1;
227     }
228     auto cSurface = std::static_pointer_cast<ConsumerSurfaceAdapterImpl>(cSurfaceAdapter)->GetConsumerSurface();
229     cSurface->SetDefaultUsage(BUFFER_USAGE_CPU_READ);
230     sptr<IBufferProducer> producer = cSurface->GetProducer();
231     sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
232     return player_->SetVideoSurface(pSurface);
233 }
234 
SetVolume(float leftVolume,float rightVolume)235 int32_t PlayerAdapterImpl::SetVolume(float leftVolume, float rightVolume)
236 {
237     if (!player_) {
238         WVLOG_E("player_ is nullptr");
239         return -1;
240     }
241     return player_->SetVolume(leftVolume, rightVolume);
242 }
243 
Seek(int32_t mSeconds,PlayerSeekMode mode)244 int32_t PlayerAdapterImpl::Seek(int32_t mSeconds, PlayerSeekMode mode)
245 {
246     if (!player_) {
247         WVLOG_E("player_ is nullptr");
248         return -1;
249     }
250     return player_->Seek(mSeconds, ConvertSeekMode(mode));
251 }
252 
Play()253 int32_t PlayerAdapterImpl::Play()
254 {
255     if (!player_) {
256         WVLOG_E("player_ is nullptr");
257         return -1;
258     }
259     return player_->Play();
260 }
261 
Pause()262 int32_t PlayerAdapterImpl::Pause()
263 {
264     if (!player_) {
265         WVLOG_E("player_ is nullptr");
266         return -1;
267     }
268     return player_->Pause();
269 }
270 
PrepareAsync()271 int32_t PlayerAdapterImpl::PrepareAsync()
272 {
273     if (!player_) {
274         WVLOG_E("player_ is nullptr");
275         return -1;
276     }
277     return player_->PrepareAsync();
278 }
279 
GetCurrentTime(int32_t & currentTime)280 int32_t PlayerAdapterImpl::GetCurrentTime(int32_t& currentTime)
281 {
282     if (!player_) {
283         WVLOG_E("player_ is nullptr");
284         return -1;
285     }
286     return player_->GetCurrentTime(currentTime);
287 }
288 
GetDuration(int32_t & duration)289 int32_t PlayerAdapterImpl::GetDuration(int32_t& duration)
290 {
291     if (!player_) {
292         WVLOG_E("player_ is nullptr");
293         return -1;
294     }
295     return player_->GetDuration(duration);
296 }
297 
SetPlaybackSpeed(PlaybackRateMode mode)298 int32_t PlayerAdapterImpl::SetPlaybackSpeed(PlaybackRateMode mode)
299 {
300     if (!player_) {
301         WVLOG_E("player_ is nullptr");
302         return -1;
303     }
304     return player_->SetPlaybackSpeed(ConvertRateMode(mode));
305 }
306 
SetVideoSurfaceNew(void * native_window)307 int32_t PlayerAdapterImpl::SetVideoSurfaceNew(void* native_window)
308 {
309     WVLOG_I("PlayerAdapterImpl::SetVideoSurfaceNew");
310     if (!player_) {
311         WVLOG_E("player_ is nullptr");
312         return -1;
313     }
314     OHNativeWindow* ohNativeWindow = reinterpret_cast<OHNativeWindow*>(native_window);
315     return player_->SetVideoSurface(ohNativeWindow->surface);
316 }
317 
SetMediaSourceHeader(const std::string & url,const std::map<std::string,std::string> & header)318 int32_t PlayerAdapterImpl::SetMediaSourceHeader(const std::string& url,
319     const std::map<std::string, std::string>& header)
320 {
321     if (!player_) {
322         WVLOG_E("player_ is nullptr");
323         return -1;
324     }
325     std::shared_ptr<Media::AVMediaSource> mediaSource = std::make_shared<Media::AVMediaSource>(url, header);
326     Media::AVPlayStrategy strategy;
327     return player_->SetMediaSource(mediaSource, strategy);
328 }
329 
330 } // namespace OHOS::NWeb
331