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