1/* 2 * Copyright (C) 2022 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 16import media from '@ohos.multimedia.media' 17import * as mediaTestBase from './MediaTestBase.js'; 18 19export async function playVideoSource(url, width, height, duration, playTime, done) { 20 console.info(`case media source url: ${url}`) 21 let videoPlayer = null; 22 let surfaceID = globalThis.value; 23 await media.createVideoPlayer().then((video) => { 24 if (typeof (video) != 'undefined') { 25 console.info('case createVideoPlayer success'); 26 videoPlayer = video; 27 } else { 28 console.error('case createVideoPlayer failed'); 29 expect().assertFail(); 30 done(); 31 } 32 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 33 34 videoPlayer.on('videoSizeChanged', (w, h) => { 35 console.info('case videoSizeChanged width: ' + w + ' height: ' + h); 36 }); 37 38 videoPlayer.on('error', (err) => { 39 console.error(`case error called, errMessage is ${err.message}`); 40 expect().assertFail(); 41 videoPlayer.release(); 42 done(); 43 }); 44 videoPlayer.url = url; 45 await videoPlayer.setDisplaySurface(surfaceID).then(() => { 46 console.info('case setDisplaySurface success, surfaceID: ' + surfaceID); 47 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 48 49 50 await videoPlayer.prepare().then(() => { 51 console.info('case prepare called'); 52 expect(Math.abs(videoPlayer.duration - duration)).assertLess(500); 53 if (width != null & height != null) { 54 expect(videoPlayer.width).assertEqual(width); 55 expect(videoPlayer.height).assertEqual(height); 56 } 57 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 58 59 await videoPlayer.getTrackDescription().then((arrayList) => { 60 console.info('case getTrackDescription called'); 61 if (typeof (arrayList) != 'undefined') { 62 for (let i = 0; i < arrayList.length; i++) { 63 mediaTestBase.printDescription(arrayList[i]); 64 } 65 } else { 66 console.error('case getTrackDescription failed'); 67 expect().assertFail(); 68 } 69 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 70 71 let startTime = videoPlayer.currentTime; 72 await videoPlayer.play().then(() => { 73 console.info('case play called'); 74 expect(videoPlayer.state).assertEqual('playing'); 75 mediaTestBase.msleep(playTime); 76 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 77 let endTime = videoPlayer.currentTime; 78 expect(Math.abs(endTime - startTime - playTime)).assertLess(1000); 79 80 await videoPlayer.seek(videoPlayer.duration / 3).then((seekDoneTime) => { 81 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 82 expect(videoPlayer.state).assertEqual('playing'); 83 mediaTestBase.msleep(playTime); 84 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 85 86 await videoPlayer.pause().then(() => { 87 console.info('case pause called'); 88 expect(videoPlayer.state).assertEqual('paused'); 89 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 90 91 videoPlayer.loop = true; 92 await videoPlayer.seek(0, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 93 expect(videoPlayer.state).assertEqual('paused'); 94 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 95 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 96 97 await videoPlayer.play().then(() => { 98 console.info('case play called'); 99 expect(videoPlayer.state).assertEqual('playing'); 100 mediaTestBase.msleep(playTime); 101 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 102 103 await videoPlayer.setSpeed(media.PlaybackSpeed.SPEED_FORWARD_2_00_X).then((speedMode) => { 104 console.info('case setSpeed called and speedMode is ' + speedMode); 105 mediaTestBase.msleep(playTime); 106 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 107 108 await videoPlayer.setVolume(0.5).then(() => { 109 console.info('case setVolume called'); 110 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 111 112 await videoPlayer.seek(videoPlayer.duration, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 113 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 114 mediaTestBase.msleep(videoPlayer.duration - seekDoneTime); 115 videoPlayer.setSpeed(media.PlaybackSpeed.SPEED_FORWARD_1_00_X); 116 expect(videoPlayer.state).assertEqual('playing'); 117 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 118 119 videoPlayer.loop = false; 120 await videoPlayer.seek(videoPlayer.duration, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 121 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 122 if (seekDoneTime != 0){ 123 mediaTestBase.msleep((videoPlayer.duration - seekDoneTime) + playTime); 124 expect(videoPlayer.state).assertEqual('stopped'); 125 } 126 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 127 128 await videoPlayer.play().then(() => { 129 console.info('case play called'); 130 expect(videoPlayer.state).assertEqual('playing'); 131 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 132 133 await videoPlayer.stop().then(() => { 134 console.info('case stop called'); 135 expect(videoPlayer.state).assertEqual('stopped'); 136 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 137 138 await videoPlayer.reset().then(() => { 139 console.info('case reset called'); 140 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 141 142 videoPlayer.url = url; 143 144 await videoPlayer.prepare().then(() => { 145 console.info('case prepare called'); 146 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 147 148 await videoPlayer.play().then(() => { 149 console.info('case play called'); 150 expect(videoPlayer.state).assertEqual('playing'); 151 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 152 153 await videoPlayer.pause().then(() => { 154 console.info('case pause called'); 155 expect(videoPlayer.state).assertEqual('paused'); 156 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 157 158 await videoPlayer.stop().then(() => { 159 console.info('case stop called'); 160 expect(videoPlayer.state).assertEqual('stopped'); 161 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 162 163 await videoPlayer.release().then(() => { 164 console.info('case release called'); 165 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 166} 167 168export async function testVideoSeek(url, duration, playTime, done) { 169 console.info(`case media source url: ${url}`) 170 let videoPlayer = null; 171 let surfaceID = globalThis.value; 172 await media.createVideoPlayer().then((video) => { 173 if (typeof (video) != 'undefined') { 174 console.info('case createVideoPlayer success'); 175 videoPlayer = video; 176 } else { 177 console.error('case createVideoPlayer failed'); 178 expect().assertFail(); 179 done(); 180 } 181 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 182 183 videoPlayer.on('videoSizeChanged', (w, h) => { 184 console.info('case videoSizeChanged width: ' + w + ' height: ' + h); 185 }); 186 187 videoPlayer.on('error', (err) => { 188 console.error(`case error called, errMessage is ${err.message}`); 189 expect().assertFail(); 190 videoPlayer.release(); 191 done(); 192 }); 193 videoPlayer.url = url; 194 await videoPlayer.setDisplaySurface(surfaceID).then(() => { 195 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 196 await videoPlayer.prepare().then(() => {}, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 197 await videoPlayer.play().then(() => { 198 console.info('case play called'); 199 expect(videoPlayer.state).assertEqual('playing'); 200 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 201 202 // pause when seeking 203 videoPlayer.seek(videoPlayer.duration / 3).then((seekDoneTime) => { 204 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 205 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 206 expect(Math.abs(videoPlayer.duration - duration)).assertLess(500); 207 await videoPlayer.pause().then(() => { 208 console.info('case pause called'); 209 expect(videoPlayer.state).assertEqual('paused'); 210 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 211 212 // play when seeking 213 videoPlayer.seek(0).then((seekDoneTime) => { 214 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 215 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 216 await videoPlayer.play().then(() => { 217 console.info('case play called'); 218 expect(videoPlayer.state).assertEqual('playing'); 219 mediaTestBase.msleep(playTime); 220 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 221 222 // setVolume when setSpeeding 223 videoPlayer.setSpeed(media.PlaybackSpeed.SPEED_FORWARD_2_00_X).then((speedMode) => { 224 console.info('case setSpeed called and speedMode is ' + speedMode); 225 expect(speedMode).assertEqual(media.PlaybackSpeed.SPEED_FORWARD_2_00_X); 226 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 227 expect(Math.abs(videoPlayer.duration - duration)).assertLess(500); 228 await videoPlayer.setVolume(0.5).then(() => { 229 console.info('case setVolume called'); 230 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 231 232 // setSpeed when seeking 233 videoPlayer.seek(0, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 234 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 235 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 236 await videoPlayer.setSpeed(media.PlaybackSpeed.SPEED_FORWARD_1_00_X).then((speedMode) => { 237 console.info('case setSpeed called and speedMode is ' + speedMode); 238 expect(speedMode).assertEqual(media.PlaybackSpeed.SPEED_FORWARD_1_00_X); 239 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 240 241 // seek when pausing 242 videoPlayer.pause().then(() => { 243 console.info('case pause called'); 244 expect(videoPlayer.state).assertEqual('paused'); 245 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 246 await videoPlayer.seek(0, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 247 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 248 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 249 250 // seek when playing 251 videoPlayer.play().then(() => { 252 console.info('case pause called'); 253 expect(videoPlayer.state).assertEqual('playing'); 254 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 255 await videoPlayer.seek(videoPlayer.duration / 3, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 256 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 257 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 258 259 // seek when seeking 260 videoPlayer.seek(videoPlayer.duration / 3, media.SeekMode.SEEK_PREV_SYNC).then((seekDoneTime) => { 261 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 262 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 263 await videoPlayer.seek(0, media.SeekMode.SEEK_NEXT_SYNC).then((seekDoneTime) => { 264 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 265 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 266 267 // stop when seeking 268 videoPlayer.seek(videoPlayer.duration, media.SeekMode.SEEK_PREV_SYNC).then((seekDoneTime) => { 269 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 270 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 271 await videoPlayer.stop().then(() => { 272 console.info('case stop called'); 273 expect(videoPlayer.state).assertEqual('stopped'); 274 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 275 await videoPlayer.reset().then(() => { 276 console.info('case reset called'); 277 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 278 279 videoPlayer.url = url; 280 await videoPlayer.prepare().then(() => { 281 console.info('case prepare called'); 282 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 283 await videoPlayer.play().then(() => { 284 console.info('case play called'); 285 expect(videoPlayer.state).assertEqual('playing'); 286 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 287 288 // reset when seeking 289 videoPlayer.seek(videoPlayer.duration, media.SeekMode.SEEK_PREV_SYNC).then((seekDoneTime) => { 290 console.info('case seek called and seekDoneTime is ' + seekDoneTime); 291 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 292 await videoPlayer.reset().then(() => { 293 console.info('case reset called'); 294 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 295 296 videoPlayer.url = url; 297 await videoPlayer.prepare().then(() => { 298 console.info('case prepare called'); 299 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 300 await videoPlayer.play().then(() => { 301 console.info('case play called'); 302 expect(videoPlayer.state).assertEqual('playing'); 303 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 304 305 // release when seeking 306 videoPlayer.seek(videoPlayer.duration, media.SeekMode.SEEK_PREV_SYNC); 307 await videoPlayer.release().then(() => { 308 console.info('case release called'); 309 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 310}