• 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 "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