1/* 2 * Copyright (C) 2024 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 * as mediaTestBase from '../../../../../../MediaTestBase'; 17import * as AVPlayerTestBase from '../../../../../../AVPlayerTestBase.js'; 18import media from '@ohos.multimedia.media'; 19import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium' 20import fs from '@ohos.file.fs'; 21 22 23export default function AVTransCoderTest() { 24 describe('AVTransCoderTest', function () { 25 let avTranscoder = null; 26 let fileDescriptor = null; 27 let outputFdObject = null; 28 let inputName = ''; 29 let outputName = ''; 30 let pauseProgress = 101; 31 let times = 0; 32 const PAUSE_TIME = 1000; 33 34 let events = require('events'); 35 let eventEmitter = new events.EventEmitter(); 36 37 const CREATEAVTRANSCODER_PROMISE_EVENT = 'createPromise'; 38 const PREPAREAVTRANSCODER_PROMISE_EVENT = 'preparePromise'; 39 const STARTAVTRANSCODER_PROMISE_EVENT = 'startPromise'; 40 const PAUSEAVTRANSCODER_PROMISE_EVENT = 'pausePromise'; 41 const RESUMEAVTRANSCODER_PROMISE_EVENT = 'resumePromise'; 42 const CANCELAVTRANSCODER_PROMISE_EVENT = 'cancelPromise'; 43 const RELEASEAVTRANSCODER_PROMISE_EVENT = 'releasePromise'; 44 const ERROR_EVENT = 'error'; 45 const END_EVENT = 'end'; 46 47 const SETONCALLBACK_EVENT = 'setAVTransCoderCallback'; 48 const SET_SRC_AND_DST = 'setSrcAndDst'; 49 50 let avTranscoderConfig = { 51 audioBitrate : 200000, 52 audioCodec : media.CodecMimeType.AUDIO_AAC, 53 fileFormat : media.ContainerFormatType.CFT_MPEG_4, 54 videoBitrate : 3000000, 55 videoCodec : media.CodecMimeType.VIDEO_AVC, 56 videoFrameWidth : 720, 57 videoFrameHeight : 480, 58 } 59 60 async function closeRawFd(fileName) { 61 globalThis.context.resourceManager.closeRawFd(fileName).then(()=> { 62 console.log('case closeRawFd ' + fileName); 63 }).catch(error => { 64 console.log('case closeRawFd err: ' + error); 65 }) 66 } 67 68 beforeAll(async function () { 69 console.info('beforeAll case'); 70 }) 71 72 beforeEach(async function () { 73 console.info('beforeEach case'); 74 await AVPlayerTestBase.sleep(1000); 75 avTranscoder = null; 76 outputFdObject = null; 77 outputName = ''; 78 inputName = ''; 79 pauseProgress = 101; 80 times = 0; 81 }) 82 83 afterEach(async function () { 84 console.info('afterEach case'); 85 if (avTranscoder != null) { 86 await avTranscoder.release().then(() => { 87 console.info('this testCase execution completed') 88 }, mediaTestBase.failureCallback).catch(mediaTestBase.catchCallback); 89 } 90 await mediaTestBase.closeFd(outputFdObject?.fdNumber); 91 try { 92 await closeRawFd(inputName); 93 } catch (error) { 94 console.info('closeRawFd' + error) 95 } 96 await AVPlayerTestBase.sleep(1000); 97 }) 98 99 afterAll(async function () { 100 console.info('afterAll case'); 101 }) 102 103 eventEmitter.on(CREATEAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 104 steps.shift(); 105 media.createAVTranscoder().then((transcoder) => { 106 if (transcoder != null) { 107 avTranscoder = transcoder; 108 console.info('Succeeded in creating AVTranscoder'); 109 toNextStep(avTranscoder, config, pauseTime, steps, done); 110 } else { 111 console.error('Failed to create AVTranscoder'); 112 } 113 }).catch((error) => { 114 console.error(`Failed to create AVTranscoder, error message:${error}`); 115 expect(steps[0]).assertEqual(ERROR_EVENT); 116 toNextStep(avTranscoder, config, pauseTime, steps, done); 117 }); 118 }); 119 120 eventEmitter.on(PREPAREAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 121 steps.shift(); 122 avTranscoder.prepare(config).then(() => { 123 console.info('prepare success'); 124 toNextStep(avTranscoder, config, pauseTime, steps, done); 125 }).catch((err) => { 126 console.info('prepare failed and catch error is ' + err.message); 127 expect(steps[0]).assertEqual(ERROR_EVENT); 128 toNextStep(avTranscoder, config, pauseTime, steps, done); 129 }); 130 }); 131 132 eventEmitter.on(STARTAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 133 steps.shift(); 134 avTranscoder.start().then(() => { 135 console.info('start success'); 136 }).catch((err) => { 137 console.info('start failed and catch error is ' + err.message); 138 expect(steps[0]).assertEqual(ERROR_EVENT); 139 toNextStep(avTranscoder, config, pauseTime, steps, done); 140 }); 141 }); 142 143 eventEmitter.on(PAUSEAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 144 steps.shift(); 145 avTranscoder.pause().then(() => { 146 console.info('pause AVTranscoder success'); 147 setTimeout(() => { 148 console.info('PAUSEAVTRANSCODER_PROMISE_EVENT setTimeout success'); 149 toNextStep(avTranscoder, config, pauseTime, steps, done); 150 }, pauseTime); 151 }).catch((err) => { 152 console.info('pause AVTranscoder failed and catch error is ' + err.message); 153 expect(steps[0]).assertEqual(ERROR_EVENT); 154 toNextStep(avTranscoder, config, pauseTime, steps, done); 155 }); 156 }); 157 158 eventEmitter.on(RESUMEAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 159 steps.shift(); 160 avTranscoder.resume().then(() => { 161 console.info('resume AVTranscoder success'); 162 toNextStep(avTranscoder, config, pauseTime, steps, done); 163 }).catch((err) => { 164 console.info('resume AVTranscoder failed and catch error is ' + err.message); 165 expect(steps[0]).assertEqual(ERROR_EVENT); 166 toNextStep(avTranscoder, config, pauseTime, steps, done); 167 }); 168 }); 169 170 eventEmitter.on(CANCELAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 171 steps.shift(); 172 avTranscoder.cancel().then(() => { 173 console.info('cancel AVTranscoder success'); 174 toNextStep(avTranscoder, config, pauseTime, steps, done); 175 }).catch((err) => { 176 console.info('cancel AVTranscoder failed and catch error is ' + err.message); 177 expect(steps[0]).assertEqual(ERROR_EVENT); 178 toNextStep(avTranscoder, config, pauseTime, steps, done); 179 }); 180 }); 181 182 eventEmitter.on(RELEASEAVTRANSCODER_PROMISE_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 183 steps.shift(); 184 avTranscoder.release().then(() => { 185 console.info('release AVTranscoder success'); 186 toNextStep(avTranscoder, config, pauseTime, steps, done); 187 }).catch((err) => { 188 console.info('release AVTranscoder failed and catch error is ' + err.message); 189 toNextStep(avTranscoder, config, pauseTime, steps, done); 190 }); 191 }); 192 193 eventEmitter.on(ERROR_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 194 steps.shift(); 195 console.info('Error event occurred'); 196 toNextStep(avTranscoder, config, pauseTime, steps, done); 197 }); 198 199 eventEmitter.on(SETONCALLBACK_EVENT, (avTranscoder, config, pauseTime, steps, done) => { 200 steps.shift(); 201 try{ 202 setCallback(avTranscoder, config, pauseTime, steps, done); 203 toNextStep(avTranscoder, config, pauseTime, steps, done); 204 }catch(error){ 205 console.info('setAVTranscoderCallback failed and catch error is ' + error.message); 206 } 207 }); 208 209 eventEmitter.on(SET_SRC_AND_DST, (avTranscoder, config, pauseTime, steps, done) => { 210 steps.shift(); 211 try{ 212 console.info('case SET_SRC_AND_DST in'); 213 avTranscoder.fdSrc = fileDescriptor; 214 avTranscoder.fdDst = outputFdObject.fdNumber; 215 expect(steps[0]).assertEqual(PREPAREAVTRANSCODER_PROMISE_EVENT); 216 toNextStep(avTranscoder, config, pauseTime, steps, done); 217 }catch(error){ 218 console.info('SET_SRC_AND_DST failed and catch error is ' + error.message); 219 } 220 }); 221 222 function toNextStep(avTranscoder, config, pauseTime, steps, done) { 223 if (steps[0] == END_EVENT) { 224 console.info('case success!!'); 225 done(); 226 } else { 227 eventEmitter.emit(steps[0], avTranscoder, config, pauseTime, steps, done); 228 } 229 } 230 231 function setCallback(avTranscoder, config, pauseTime, steps, done) { 232 // 转码进度 233 avTranscoder.on('progressUpdate', (progress) => { 234 console.info('avTranscoder progressUpdate = ' + progress); 235 // to pause 236 if (progress > 100) { 237 console.info('avTranscoder progressUpdate'); 238 expect(steps[0]).assertEqual(ERROR_EVENT); 239 toNextStep(avTranscoder, config, pauseTime, steps, done); 240 } 241 if (progress >= pauseProgress && times == 0) { 242 console.info('avTranscoder progressUpdate'); 243 times++; 244 expect(steps[0]).assertEqual(PAUSEAVTRANSCODER_PROMISE_EVENT); 245 toNextStep(avTranscoder, config, pauseTime, steps, done); 246 } 247 }) 248 // 错误上报回调函数 249 avTranscoder.on('error', async (err) => { 250 try { 251 console.error('error ocConstantSourceNode, error message is ' + err); 252 toNextStep(avTranscoder, config, pauseTime, steps, done); 253 } catch (error) { 254 // 处理错误 255 console.error('when error on execute releaseRecorderPromise error message is ' + error); 256 } 257 }); 258 // 转码完成事件 259 avTranscoder.on('complete', async () => { 260 onsole.info('avTranscoder complete'); 261 toNextStep(avTranscoder, config, pauseTime, steps, done); 262 }); 263 } 264 265 function resourceName() { 266 let timestamp = Date.now(); 267 let filename = `TransCoder_${timestamp}.mp4`; 268 return filename; 269 } 270 271 function getDSt(outputName) { 272 let contextStage = globalThis.context; 273 outputName = contextStage.filesDir + "/" + outputName; 274 console.info("case outputName is" + outputName); 275 let fdObject = { 276 fileAsset : null, 277 fdNumber : null 278 } 279 let file; 280 try { 281 file = fs.openSync(outputName, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); 282 } catch (err) { 283 console.info('case getDSt err: ' + err); 284 } 285 fdObject.fileAsset = file; 286 fdObject.fdNumber = file.fd; 287 console.info('case getDSt number is: ' + fdObject.fdNumber); 288 return fdObject; 289 } 290 291 async function getfdScrAndfdDst() { 292 console.info('case getfdScrAndfdDst start'); 293 await mediaTestBase.getStageFileDescriptor(inputName).then((res) => { 294 fileDescriptor = res; 295 }); 296 outputFdObject = getDSt(outputName); 297 console.info('case getfdScrAndfdDst end'); 298 } 299 300 /* * 301 * @tc.number : SUB_MULTIMEDIA_AVTANSCODER_0100 302 * @tc.name : 001.test start-pause-resume-stop-release 303 * @tc.desc : Transcoder start-pause-resume-stop-release 304 * @tc.size : MediumTest 305 * @tc.type : Function test 306 * @tc.level : Level2 307 */ 308 it('SUB_MULTIMEDIA_AVTANSCODER_0100', 0, async function (done) { 309 console.info('SUB_MULTIMEDIA_AVTANSCODER_0100 start') 310 outputName = resourceName(); 311 pauseProgress = 30; 312 inputName = "H264_AAC.mp4"; 313 await getfdScrAndfdDst(); 314 315 let mySteps = new Array( 316 // create 317 CREATEAVTRANSCODER_PROMISE_EVENT, SETONCALLBACK_EVENT, SET_SRC_AND_DST, 318 // prepare 319 PREPAREAVTRANSCODER_PROMISE_EVENT, 320 // start Transcoder 321 STARTAVTRANSCODER_PROMISE_EVENT, 322 // pause Transcoder 323 PAUSEAVTRANSCODER_PROMISE_EVENT, 324 // resume Transcoder 325 RESUMEAVTRANSCODER_PROMISE_EVENT, 326 // release Transcoder 327 RELEASEAVTRANSCODER_PROMISE_EVENT, 328 // end 329 END_EVENT 330 ); 331 eventEmitter.emit(mySteps[0], avTranscoder, avTranscoderConfig, PAUSE_TIME, mySteps, done); 332 console.info('SUB_MULTIMEDIA_AVTANSCODER_0100 end') 333 }) 334 /* * 335 * @tc.number : SUB_MULTIMEDIA_AVTANSCODER_0200 336 * @tc.name : 001.test start-pause-resume-cancel-release 337 * @tc.desc : Transcoder start-pause-resume-cancel-release 338 * @tc.size : MediumTest 339 * @tc.type : Function test 340 * @tc.level : Level2 341 */ 342 it('SUB_MULTIMEDIA_AVTANSCODER_0200', 0, async function (done) { 343 console.info('SUB_MULTIMEDIA_AVTANSCODER_0200 start') 344 outputName = resourceName(); 345 pauseProgress = 30; 346 inputName = "H264_AAC.mp4"; 347 await getfdScrAndfdDst(); 348 349 let mySteps = new Array( 350 // create 351 CREATEAVTRANSCODER_PROMISE_EVENT, SETONCALLBACK_EVENT, SET_SRC_AND_DST, 352 // prepare 353 PREPAREAVTRANSCODER_PROMISE_EVENT, 354 // start Transcoder 355 STARTAVTRANSCODER_PROMISE_EVENT, 356 // pause Transcoder 357 PAUSEAVTRANSCODER_PROMISE_EVENT, 358 // resume Transcoder 359 RESUMEAVTRANSCODER_PROMISE_EVENT, 360 // cancel Transcoder 361 CANCELAVTRANSCODER_PROMISE_EVENT, 362 // release Transcoder 363 RELEASEAVTRANSCODER_PROMISE_EVENT, 364 // end 365 END_EVENT 366 ); 367 eventEmitter.emit(mySteps[0], avTranscoder, avTranscoderConfig, PAUSE_TIME, mySteps, done); 368 console.info('SUB_MULTIMEDIA_AVTANSCODER_0200 end') 369 }) 370 }) 371}