• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}