From fa20bbbb800a69a9e13e7792ddf2384fc31c4e19 Mon Sep 17 00:00:00 2001 From: ling990 Date: Tue, 25 Oct 2022 19:44:58 +0800 Subject: [PATCH] add testcases Signed-off-by: ling990 Signed-off-by: ling990 --- .../audioCodecFormat/BUILD.gn | 34 - .../audioCodecFormat/Test.json | 117 - .../signature/openharmony_sx.p7b | Bin 3456 -> 0 bytes .../audioCodecFormat/src/main/config.json | 97 - .../src/main/js/default/app.js | 23 - .../src/main/js/default/i18n/en-US.json | 6 - .../src/main/js/default/i18n/zh-CN.json | 6 - .../src/main/js/default/pages/index/index.css | 46 - .../src/main/js/default/pages/index/index.hml | 5 - .../src/main/js/default/pages/index/index.js | 41 - ...oderFormatCompatibilityPromiseTest.test.js | 2511 ----------------- ...oderFormatCompatibilityPromiseTest.test.js | 404 --- .../src/main/js/test/List.test.js | 19 - .../main/resources/base/element/string.json | 12 - .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../media_js_standard/audioDecoder/BUILD.gn | 34 - .../media_js_standard/audioDecoder/Test.json | 51 - .../audioDecoder/signature/openharmony_sx.p7b | Bin 3457 -> 0 bytes .../audioDecoder/src/main/config.json | 97 - .../audioDecoder/src/main/js/default/app.js | 23 - .../src/main/js/default/i18n/en-US.json | 6 - .../src/main/js/default/i18n/zh-CN.json | 6 - .../src/main/js/default/pages/index/index.css | 61 - .../src/main/js/default/pages/index/index.hml | 20 - .../src/main/js/default/pages/index/index.js | 41 - .../main/js/test/AudioDecoderEnumTest.test.js | 148 - .../AudioDecoderFormatCallbackTest.test.js | 943 ------- .../AudioDecoderFormatPromiseTest.test.js | 798 ------ .../test/AudioDecoderFuncCallbackTest.test.js | 1143 -------- .../test/AudioDecoderFuncPromiseTest.test.js | 942 ------- .../AudioDecoderMultiInstancesTest.test.js | 271 -- ...udioDecoderReliabilityCallbackTest.test.js | 1355 --------- ...AudioDecoderReliabilityPromiseTest.test.js | 1361 --------- .../src/main/js/test/List.test.js | 25 - .../main/resources/base/element/string.json | 12 - .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../media_js_standard/audioEncoder/BUILD.gn | 34 - .../media_js_standard/audioEncoder/Test.json | 47 - .../audioEncoder/signature/openharmony_sx.p7b | Bin 3458 -> 0 bytes .../audioEncoder/src/main/config.json | 97 - .../audioEncoder/src/main/js/default/app.js | 23 - .../src/main/js/default/i18n/en-US.json | 6 - .../src/main/js/default/i18n/zh-CN.json | 6 - .../src/main/js/default/pages/index/index.css | 61 - .../src/main/js/default/pages/index/index.hml | 20 - .../src/main/js/default/pages/index/index.js | 41 - .../test/AudioEncoderFuncCallbackTest.test.js | 826 ------ .../test/AudioEncoderFuncPromiseTest.test.js | 663 ----- .../AudioEncoderMultiInstancesTest.test.js | 321 --- ...udioEncoderReliabilityCallbackTest.test.js | 1171 -------- ...AudioEncoderReliabilityPromiseTest.test.js | 1173 -------- .../src/main/js/test/List.test.js | 20 - .../main/resources/base/element/string.json | 12 - .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../videoCodecFormat/BUILD.gn | 33 - .../videoCodecFormat/Test.json | 55 - .../signature/openharmony_sx.p7b | Bin 3457 -> 0 bytes .../videoCodecFormat/src/main/config.json | 98 - .../src/main/js/default/app.js | 23 - .../src/main/js/default/i18n/en-US.json | 6 - .../src/main/js/default/i18n/zh-CN.json | 6 - .../main/js/default/pages/display/display.css | 61 - .../main/js/default/pages/display/display.hml | 26 - .../main/js/default/pages/display/display.js | 33 - .../src/main/js/default/pages/index/index.css | 61 - .../src/main/js/default/pages/index/index.hml | 20 - .../src/main/js/default/pages/index/index.js | 42 - .../src/main/js/test/List.test.js | 17 - .../VideoDecoderFormatPromiseTest.test.js | 812 ------ .../VideoEncoderFormatPromiseTest.test.js | 447 --- .../main/resources/base/element/string.json | 12 - .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../src/main/resources/base/media/info.txt | 1 - .../src/main/resources/base/media/mp3_MP3.mp3 | Bin 222715 -> 0 bytes .../media_js_standard/videoDecoder/BUILD.gn | 33 - .../media_js_standard/videoDecoder/Test.json | 49 - .../videoDecoder/signature/openharmony_sx.p7b | Bin 3437 -> 0 bytes .../videoDecoder/src/main/config.json | 76 - .../videoDecoder/src/main/js/default/app.js | 23 - .../src/main/js/default/i18n/en-US.json | 6 - .../src/main/js/default/i18n/zh-CN.json | 6 - .../main/js/default/pages/display/display.css | 61 - .../main/js/default/pages/display/display.hml | 26 - .../main/js/default/pages/display/display.js | 33 - .../src/main/js/default/pages/index/index.css | 61 - .../src/main/js/default/pages/index/index.hml | 20 - .../src/main/js/default/pages/index/index.js | 42 - .../src/main/js/test/List.test.js | 22 - .../main/js/test/VideoDecoderEnumTest.test.js | 338 --- .../test/VideoDecoderFuncCallbackTest.test.js | 460 --- .../test/VideoDecoderFuncPromiseTest.test.js | 498 ---- .../test/VideoDecoderReliCallbackTest.test.js | 1287 --------- .../test/VideoDecoderReliPromiseTest.test.js | 1284 --------- ...deoDecoderSoftwareFuncCallbackTest.test.js | 571 ---- ...ideoDecoderSoftwareFuncPromiseTest.test.js | 566 ---- ...deoDecoderSoftwareReliCallbackTest.test.js | 1284 --------- ...ideoDecoderSoftwareReliPromiseTest.test.js | 1279 --------- .../main/resources/base/element/string.json | 12 - .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes .../src/main/resources/base/media/info.txt | 1 - .../src/main/resources/base/media/mp3_MP3.mp3 | Bin 222715 -> 0 bytes .../media_js_standard/videoEncoder/BUILD.gn | 34 - .../media_js_standard/videoEncoder/Test.json | 46 - .../videoEncoder/signature/openharmony_sx.p7b | Bin 3456 -> 0 bytes .../videoEncoder/src/main/config.json | 97 - .../videoEncoder/src/main/js/default/app.js | 23 - .../src/main/js/default/i18n/en-US.json | 6 - .../src/main/js/default/i18n/zh-CN.json | 6 - .../src/main/js/default/pages/index/index.css | 61 - .../src/main/js/default/pages/index/index.hml | 20 - .../src/main/js/default/pages/index/index.js | 41 - .../src/main/js/test/List.test.js | 16 - .../main/js/test/VideoEncoderEnumTest.test.js | 52 - ...deoEncoderHardwareFuncCallbackTest.test.js | 801 ------ ...ideoEncoderHardwareFuncPromiseTest.test.js | 811 ------ .../VideoEncoderMultiInstancesTest.test.js | 394 --- ...deoEncoderSoftwareFuncCallbackTest.test.js | 638 ----- ...ideoEncoderSoftwareFuncPromiseTest.test.js | 774 ----- ...derSoftwareReliabilityCallbackTest.test.js | 1551 ---------- ...oderSoftwareReliabilityPromiseTest.test.js | 1523 ---------- .../test/VideoHardwareEncoderEnumTest.test.js | 64 - .../main/resources/base/element/string.json | 12 - .../src/main/resources/base/media/icon.png | Bin 6790 -> 0 bytes 123 files changed, 31940 deletions(-) delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/BUILD.gn delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/Test.json delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/signature/openharmony_sx.p7b delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/config.json delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/app.js delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/en-US.json delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/zh-CN.json delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.css delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.hml delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.js delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioDecoderFormatCompatibilityPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioEncoderFormatCompatibilityPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/List.test.js delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/element/string.json delete mode 100644 multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/media/icon.png delete mode 100644 multimedia/media/media_js_standard/audioDecoder/BUILD.gn delete mode 100644 multimedia/media/media_js_standard/audioDecoder/Test.json delete mode 100644 multimedia/media/media_js_standard/audioDecoder/signature/openharmony_sx.p7b delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/config.json delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/default/app.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/en-US.json delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/zh-CN.json delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.css delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.hml delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderEnumTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderMultiInstancesTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/js/test/List.test.js delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/element/string.json delete mode 100644 multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/media/icon.png delete mode 100644 multimedia/media/media_js_standard/audioEncoder/BUILD.gn delete mode 100644 multimedia/media/media_js_standard/audioEncoder/Test.json delete mode 100644 multimedia/media/media_js_standard/audioEncoder/signature/openharmony_sx.p7b delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/config.json delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/default/app.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/en-US.json delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/zh-CN.json delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.css delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.hml delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderMultiInstancesTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/js/test/List.test.js delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/element/string.json delete mode 100644 multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/media/icon.png delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/BUILD.gn delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/Test.json delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/signature/openharmony_sx.p7b delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/config.json delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/app.js delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/en-US.json delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/zh-CN.json delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.css delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.hml delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.js delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.css delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.hml delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.js delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/List.test.js delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoDecoderFormatPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoEncoderFormatPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/element/string.json delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/media/icon.png delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/media/info.txt delete mode 100644 multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/media/mp3_MP3.mp3 delete mode 100644 multimedia/media/media_js_standard/videoDecoder/BUILD.gn delete mode 100644 multimedia/media/media_js_standard/videoDecoder/Test.json delete mode 100644 multimedia/media/media_js_standard/videoDecoder/signature/openharmony_sx.p7b delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/config.json delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/app.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/en-US.json delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/zh-CN.json delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.css delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.hml delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.css delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.hml delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/List.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderEnumTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/element/string.json delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/media/icon.png delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/media/info.txt delete mode 100644 multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/media/mp3_MP3.mp3 delete mode 100644 multimedia/media/media_js_standard/videoEncoder/BUILD.gn delete mode 100644 multimedia/media/media_js_standard/videoEncoder/Test.json delete mode 100644 multimedia/media/media_js_standard/videoEncoder/signature/openharmony_sx.p7b delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/config.json delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/default/app.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/en-US.json delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/zh-CN.json delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.css delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.hml delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/List.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderEnumTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderMultiInstancesTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityCallbackTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityPromiseTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoHardwareEncoderEnumTest.test.js delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/element/string.json delete mode 100644 multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/media/icon.png diff --git a/multimedia/media/media_js_standard/audioCodecFormat/BUILD.gn b/multimedia/media/media_js_standard/audioCodecFormat/BUILD.gn deleted file mode 100644 index dbf8d937b..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/BUILD.gn +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2021 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//test/xts/tools/build/suite.gni") - -ohos_js_hap_suite("audio_codec_format_js_hap") { - hap_profile = "./src/main/config.json" - js2abc = true - deps = [ - ":audio_codec_format_js_assets", - ":audio_codec_format_resources", - ] - certificate_profile = "./signature/openharmony_sx.p7b" - hap_name = "ActsAudioCodecFormatJsTest" - subsystem_name = "multimedia" - part_name = "multimedia_player_framework" -} -ohos_js_assets("audio_codec_format_js_assets") { - source_dir = "./src/main/js/default" -} -ohos_resources("audio_codec_format_resources") { - sources = [ "./src/main/resources" ] - hap_profile = "./src/main/config.json" -} diff --git a/multimedia/media/media_js_standard/audioCodecFormat/Test.json b/multimedia/media/media_js_standard/audioCodecFormat/Test.json deleted file mode 100644 index 74d3669de..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/Test.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "description": "Configuration for audio codec format Tests", - "driver": { - "type": "JSUnitTest", - "test-timeout": "2000000", - "package": "ohos.acts.multimedia.audio.codecformat", - "shell-timeout": "600000" - }, - "kits": [ - { - "test-file-name": [ - "ActsAudioCodecFormatJsTest.hap" - ], - "type": "AppInstallKit", - "cleanup-apps": true - }, - { - "type": "ShellKit", - "run-command": [ - "rm -rf /storage/media/100/local/files/*", - "mkdir -p /data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/" - ], - "teardown-command":[ - ] - }, - { - "type": "PushKit", - "pre-push": [ - ], - "push": [ - "./resource/audio/codecFormat/HEv2_AAC_2_96000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_2_96000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_1_96000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_2_8000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_1_8000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_2_11025.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_1_11025.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_2_12000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_1_12000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_2_16000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_1_16000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_2_22050.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/LC_AAC_1_22050.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_1_24000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_2_24000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_1_32000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_2_32000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_1_44100.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_2_44100.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_1_48000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_2_48000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_1_64000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_2_64000.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_1_88200.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/HE_AAC_2_88200.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_96000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_8000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_8000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_11025.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_11025.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_12000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_12000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_16000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_22050.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_16000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_22050.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_24000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_24000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_32000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_32000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_44100.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_44100.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_48000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_48000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_64000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_64000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_88200.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_1_88200.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/FLAC_2_96000.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_96000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_96000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_8000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_12000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_16000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_22050.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_24000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_32000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_44100.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_48000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_64000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_1_88200.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_8000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_12000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_16000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_22050.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_24000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_32000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_44100.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_48000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_64000.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "./resource/audio/codecFormat/S16LE_2_88200.pcm ->/data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/" - ] - }, - { - "type": "ShellKit", - "run-command": [ - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/", - "chmod 777 /data/app/el2/100/base/ohos.acts.multimedia.audio.codecformat/haps/entry/files/*", - "chmod 777 -R /storage/media/100/local/files/", - "chmod 777 /storage/media/100/local/files/*" - ], - "teardown-command":[ - ] - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/audioCodecFormat/signature/openharmony_sx.p7b deleted file mode 100644 index 9cb0936d4cbbf5dab6e1d2fb4466d1fcb0c83964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3456 zcmcgvYj6|S71ql(#t2Ld7${&P9;SfoyRu|UPD!#WtzLK~OO|ZQ5j87m^{}N~Sz38z z5eSIlgoh!NDY)TfFc=7rv_N8Lewv^)DGq_8I3VEjAu-5EO`qGO=MzGafDe)> z;~ypRTazh6Mah)G^CS&KBpRSdshjc;k`idJglhzvSOD? zMMxE1_D^1<@JLk(pp@b&0zidwua|(7Y&P8(<`zeYAc02-)`5q^QcoaCM*^-G&AqQL zgNoJ!NSg3PaL&snHsHa4CqOq!O6EyOik7+vFBRdCDO7T0kwT_W&g}8yUYdxo?jog1 zUR=n!=g*Y5Vx%WXNCTvo;+A`e1|mp>iHNiZx;adcdOQ-M$VT=(1Hib62p#YS+&Iml zmU2G?)fr5=YSd~oXbo!EhW2=!BxW$Ev4mO;y9gi57!cTJKykCWAfbUV#OJH`*VUTK zEEWyS*kMeE#nlPei1y$V-{N>5_Hx1{q7Ld;3DgM6}k$)lXTh8T1<`hWWjL^e>}@lg)lB%u+~v! z4ZCD=p9P?d-tRVHwJ3wt!i_8jn;~wtVev}VYtq!kv05zt&{vC4m?g@nEj<`@C}Y&v zYEe6e7Ja|xJo<8-dbY_!kE-BY;!rx zYKtXYsqlL09D0*n(EzFnVLcv)WVL082h~tft<_Ks5mlkM*^wyMIY}dfd82y2-L3+t zGH3v{Dn~VG3i&W7N;Sk>gry#~QILVLYhW*jTwji%It^UuLu@X8#2s*wTH0Pp*<*!; zJOL`7lO8ua7jqM+T!{Hz&J}mxR zH4G+Xi)9dy0U0D?pNi^iv0Meo3ZXs|gnuRo0P=f5C=FBZ4t@c*@U`o}9SUbr*?+gW@^ z_}R^4q+o{a#hefR+-g~!KI%_v@?)dlY_ozgki)_mKS?wij9NJ2?@b+&QRgzY z%_b4CC{E6p4g_w1r?iXAc#P5{)>CUwwZ^!gTiZ?+*OtddmIp zYQ%i&z@7;MJm3{Tyge)Tr6*mD`}C8CBiG*`I{m5ppWB$pXkWO0eQQg{Wn`7-g7?m) z9k(wvrxwk9@YY6lNo!MW;>!m^O5p30=ai;QT=r4>LNmCa`D)qJF6-D2`RbilCm(22 zWX5+rh%V^<$FKt|e>5zAPW16-*d^uifmne5XSQw{nA+RAoTs(UN>TJ8gb{OrySW!=c&pI;9yK8s5L=aGZI0 z{nnR~KfL?7L!?`d=~}{Tk?nh0Z+F(*v$YQy+U0(I)!%f(+m?tg9@@V3Ud_mRQ*)L_ zx^jOx-V${f78IxH{?mqlm%uQNC|MkFQh<wJ)!IaP#RQhe|ppELk{Rk#KI`GETbb z>`_WIDd5PX*9*Yp-IHIV=Ioi2W*xDu`F86HV0^Jr^WPZS9p2Wkal>t}uHL-5@%)bL zvoqRH=|(rDusp(99(DKeXae!!tbs_LVfXrp5u_-T_2&_1J{v`R3WX+a`sVn?x3d*{ zmwmFW=AT#LDS4tRV>jRWoL;Qnw=?y-y*Kj4o;<%s{NADBZ41IxOOG%3MRIE3rJ1+Rv`k$3{i|~i&dB-x+KEdme~{YS+yEaSPEX{> z|G}{*irat_M(F1OLI6S+eyv>md-}$!fB3${U$g6Y(WWbhGmoFox-#FJY3|nBzg)U- zjK9P1?b&M`BR{)#emE;u#|BZ%u9CedNg3{s}*>DgSo2I>>wD=Fyu= z+E%`HXY(L1_~A(|5a|Fan8>?))v;Jq#`~!L?(+I!<_FgguNk?hcG>y@ZN-diLAE9&d+f9#yKCQlXoAHH2%O8@`> diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/config.json b/multimedia/media/media_js_standard/audioCodecFormat/src/main/config.json deleted file mode 100644 index 751e465b8..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/config.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "app": { - "apiVersion": { - "compatible": 6, - "releaseType": "Beta1", - "target": 7 - }, - "vendor": "acts", - "bundleName": "ohos.acts.multimedia.audio.codecformat", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - "default": { - "debug": true - } - }, - "module": { - "abilities": [ - { - "iconId": 16777218, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "descriptionId": 16777217, - "visible": true, - "labelId": 16777216, - "icon": "$media:icon", - "name": "ohos.acts.multimedia.audio.codecformat.MainAbility", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "homeAbility": true, - "launchType": "standard" - } - ], - "deviceType": [ - "default", - "default", - "tablet", - "tv", - "wearable" - ], - "reqPermissions": [ - { - "name" : "ohos.permission.GRANT_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.GRANT_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.REVOKE_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.REVOKE_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.MEDIA_LOCATION", - "reason" : "use ohos.permission.MEDIA_LOCATION" - }, - { - "name" : "ohos.permission.READ_MEDIA", - "reason" : "use ohos.permission.READ_MEDIA" - }, - { - "name" : "ohos.permission.WRITE_MEDIA", - "reason" : "use ohos.permission.WRITE_MEDIA" - } - ], - "mainAbility": "ohos.acts.multimedia.audio.codecformat.MainAbility", - "distro": { - "moduleType": "entry", - "installationFree": false, - "deliveryWithInstall": true, - "moduleName": "entry" - }, - "package": "ohos.acts.multimedia.audio.codecformat", - "name": ".MyApplication", - "js": [ - { - "pages": [ - "pages/index/index" - ], - "name": "default", - "window": { - "designWidth": 720, - "autoDesignWidth": true - } - } - ] - } - } \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/app.js b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/app.js deleted file mode 100644 index e423f4bce..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/app.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - } -}; diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/en-US.json b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/en-US.json deleted file mode 100644 index e63c70d97..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "Hello", - "world": "World" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/zh-CN.json b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index de6ee5748..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "您好", - "world": "世界" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.css b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.css deleted file mode 100644 index 5bd756702..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,46 +0,0 @@ -.container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.hml b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.hml deleted file mode 100644 index f64b040a5..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,5 +0,0 @@ -
- - {{ $t('strings.hello') }} {{ title }} - -
diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.js b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.js deleted file mode 100644 index 3a52b6658..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - this.title = this.$t('strings.world'); - }, - onShow() { - console.info('onShow finish') - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - core.addService('expect', expectExtend) - core.init() - const configService = core.getDefaultService('config') - this.timeout = 600000 - configService.setConfig(this) - require('../../../test/List.test') - core.execute() - }, - onReady() { - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioDecoderFormatCompatibilityPromiseTest.test.js b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioDecoderFormatCompatibilityPromiseTest.test.js deleted file mode 100644 index ddaaa088f..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioDecoderFormatCompatibilityPromiseTest.test.js +++ /dev/null @@ -1,2511 +0,0 @@ -/* - * Copyright (C) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderFormatCompatibilityPromise', function () { - let audioDecodeProcessor; - let readStreamSync; - let needGetMediaDes = false; - let frameCnt = 1; - let timestamp = 0; - let codecProfile = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = []; - let NEW_ES_LIST = []; - let configList = []; - let ES_LIST = []; - let channelCountList = []; - let sampleRateList = []; - let ES_LENGTH = 0; - let ES_DICT = {}; - let rate = 44.1; - let isMp3 = false; - let isVorbis = false; - let readPath; - let fdRead; - let fdWrite; - let fileAssetWrite; - const LC_AAC_2_96000 = - [0, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512]; - const LC_AAC_1_96000 = - [0, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512]; - const LC_AAC_2_8000 = - [0, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536]; - const LC_AAC_1_8000 = - [0, 279, 279, 315, 433, 280, 257, 280, 270, 266, 334, 261, 242, 266, 274, 310, 345, 248, 248, 266, 292, 247, - 251, 260, 263, 330, 330, 245, 252, 272, 266, 280, 285, 272, 271, 346, 257, 272, 265, 268, 263, 337, - 255, 265, 276, 266, 272, 307, 271, 363, 251, 347, 232, 266, 250, 266, 254, 302, 285, 356, 264, 262, - 271, 276, 263, 303, 268, 348, 300, 242, 315, 306, 262, 235, 252, 318, 275, 250, 265, 323, 253, 263, - 254, 272, 279, 283, 287, 335, 257, 255, 257, 343, 255, 285, 265, 254, 273, 279, 283, 280, 264, 287, - 271, 256, 337, 270, 295, 261, 313, 273, 352, 252, 264, 253, 263, 260, 260, 269, 265, 312, 303, 312, - 255, 265, 281, 277, 278, 277, 255, 335, 262, 274, 294, 325, 247, 306, 236, 314, 257, 272, 264, 305, - 264, 267, 272, 341, 279, 251, 260, 285, 278, 269, 251, 362, 263, 276, 262, 276, 264, 291, 301, 279, - 267, 260, 292, 275, 258, 368, 245, 257, 264, 269, 277, 291, 282, 269, 274, 269, 263, 284, 302, 295, - 334, 269, 278, 258, 263, 260, 292, 281, 280, 255, 347, 251, 258, 272, 270, 265, 285, 263, 307, 263, - 281, 274, 311, 265, 273, 276, 277, 284, 288, 279, 270, 277, 292, 265, 264, 287, 285, 322, 260, 250, - 269, 352, 258, 267, 275, 263, 270, 273, 284, 279, 279, 285, 291, 337, 265, 305, 309, 291, 251, 241, - 252, 272, 270, 281, 319, 252, 267, 286, 320, 319, 298, 251, 284, 243, 259, 278, 282, 260, 331, 257, - 270, 322, 271, 251, 318, 246, 265, 263, 302, 269, 269, 274, 280, 286, 343, 244, 274, 251, 266, 282, - 268, 278, 277, 272, 323, 265, 287, 261, 270, 263, 301, 269, 276, 276, 283, 296, 292, 293, 298, 291, - 253, 267, 265, 295, 268, 301, 277, 347, 278, 309, 259, 315, 241, 289, 272, 297, 248, 245, 242, 264, - 288, 295, 360, 231, 296, 256, 257, 270, 267, 277, 362, 296, 231, 252, 253, 269, 307, 332, 242, 257, - 267, 271, 327, 359, 275, 269, 308, 291, 265, 259, 358, 239, 222, 246, 249, 260, 275, 267, 312, 269, - 267, 296, 345, 249, 248, 266, 271, 294, 309, 266, 263, 277, 275, 268, 309, 264, 271, 282, 275, 270, - 288, 268, 276, 280, 275, 273, 286, 264, 354, 279, 268, 261, 260, 356, 252, 242, 272, 280, 281, 307, - 252, 256, 279, 302, 275, 334, 255, 266, 285, 288, 278, 268, 266, 268, 271, 273, 274, 283, 275, 291, - 283, 308, 268, 273, 283, 342, 249, 267, 335, 310, 301, 231, 254, 249, 268, 280, 365, 231, 259, 262, - 321, 275, 244, 256, 262, 275, 341, 267, 279, 264, 310, 268, 281, 266, 287, 262, 266, 272, 282, 272, - 276, 350, 256, 332, 251, 253, 256, 294, 261, 293, 255, 322, 255, 258, 260, 351, 258, 267, 259, 259, - 277, 275, 275, 274, 274, 277, 283, 308, 285, 265, 278, 286, 307, 292, 276, 278, 277, 278, 291, 275, - 262, 273, 308, 254, 264, 259, 345, 249, 275, 265, 264, 272, 285, 274, 277, 274, 274, 287, 335, 260, - 269, 329, 324, 374, 278, 223, 238, 272, 245, 258, 317, 261, 265, 344, 308, 262, 273, 279, 268, 262, - 263, 258, 274, 269, 273, 278, 266, 277, 266, 324, 257, 258, 283, 279, 278, 289, 282, 283, 280, 272, - 280, 302, 270, 281, 279, 300, 260, 280, 279, 362, 257, 261, 263, 249, 278, 283, 265, 283, 286, 274, - 284, 274, 274, 277, 270, 257, 288, 273, 272, 286, 295, 278, 309, 284, 285, 336, 395, 229, 254, 258, - 314, 231, 245, 265, 265, 279, 278, 289, 301, 269, 254, 271, 294, 286, 263, 287, 321, 257, 263, 289, - 323, 267, 257, 280, 275, 271, 281, 282, 282, 286, 271, 266, 279, 308, 276, 318, 262, 261, 262, 339, - 260, 265, 285, 268, 263, 263, 271, 268, 281, 293, 279, 292, 266, 273, 281, 303, 289, 282, 285, 278, - 305, 262, 276, 268, 267, 269, 296, 272, 280, 264, 329, 312, 269, 250, 279, 251, 272, 293, 349, 238, - 281, 255, 324, 260, 275, 265, 271, 266, 288, 272, 275, 273, 294, 292, 308, 342, 267, 238, 275, 250, - 243, 356, 262, 260, 267, 274, 279, 261, 280, 289, 288, 342, 250, 256, 270, 267, 299, 323, 268, 289, - 255, 275, 271, 273, 265, 284, 272, 281, 275, 354, 252, 290, 262, 278, 254, 272, 255, 355, 259, 260, - 257, 282, 277, 267, 271, 358, 251, 266, 275, 260, 276, 276, 288, 277, 275, 278, 283, 278, 278, 285, - 273, 288, 283, 264, 306, 271, 291, 283, 317, 270, 270, 273, 279, 266, 269, 297, 310, 290, 279, 264]; - const LC_AAC_1_11025 = - [0, 279, 279, 324, 320, 436, 260, 245, 245, 267, 270, 269, 283, 342, 270, 258, 274, 272, 287, 272, 268, - 362, 255, 258, 251, 276, 281, 286, 261, 273, 275, 282, 286, 260, 299, 332, 261, 272, 260, 271, 353, - 249, 285, 300, 251, 252, 252, 256, 354, 257, 255, 261, 284, 285, 261, 283, 332, 263, 271, 268, 265, - 274, 278, 281, 299, 273, 283, 343, 254, 309, 318, 241, 268, 257, 253, 279, 263, 322, 248, 273, 345, - 251, 278, 273, 282, 275, 297, 272, 312, 260, 286, 325, 318, 292, 263, 231, 318, 296, 252, 233, 265, - 266, 263, 353, 251, 259, 270, 275, 290, 266, 277, 265, 258, 327, 262, 256, 283, 283, 272, 363, 260, - 248, 262, 261, 320, 257, 275, 280, 264, 280, 267, 285, 294, 278, 283, 281, 286, 279, 282, 331, 262, - 264, 342, 244, 262, 285, 271, 260, 302, 271, 275, 310, 267, 268, 288, 266, 263, 270, 258, 267, 275, - 268, 267, 295, 331, 300, 301, 267, 267, 281, 289, 282, 290, 268, 267, 269, 275, 342, 262, 280, 267, - 261, 269, 292, 271, 303, 255, 261, 332, 253, 271, 263, 273, 300, 265, 277, 264, 284, 306, 337, 273, - 257, 258, 272, 274, 339, 259, 257, 249, 256, 356, 267, 265, 291, 265, 312, 251, 271, 290, 270, 299, - 277, 271, 272, 270, 339, 275, 261, 336, 237, 252, 257, 290, 271, 270, 267, 280, 355, 254, 272, 287, - 263, 283, 262, 274, 259, 281, 329, 270, 276, 322, 263, 273, 275, 271, 273, 276, 270, 277, 283, 271, - 269, 267, 268, 357, 258, 258, 268, 278, 277, 267, 275, 296, 270, 289, 278, 272, 270, 283, 284, 338, - 257, 266, 279, 278, 268, 283, 281, 264, 289, 280, 299, 271, 268, 296, 274, 295, 262, 275, 271, 285, - 304, 287, 265, 258, 277, 273, 341, 255, 250, 278, 271, 269, 290, 266, 291, 281, 289, 281, 272, 288, - 300, 289, 321, 251, 274, 311, 297, 315, 277, 255, 248, 255, 253, 275, 258, 263, 281, 302, 315, 264, - 271, 260, 302, 395, 273, 270, 297, 227, 254, 310, 223, 248, 271, 270, 288, 278, 301, 334, 249, 255, - 332, 247, 261, 263, 281, 332, 251, 276, 274, 260, 282, 286, 267, 271, 282, 285, 287, 292, 264, 320, - 250, 283, 248, 259, 280, 291, 265, 328, 257, 274, 280, 277, 332, 262, 266, 272, 282, 279, 275, 277, - 271, 288, 281, 283, 277, 272, 282, 271, 324, 280, 268, 316, 283, 295, 259, 276, 286, 304, 260, 293, - 270, 262, 292, 270, 318, 271, 263, 288, 247, 288, 293, 265, 288, 253, 280, 288, 269, 266, 265, 260, - 277, 266, 280, 298, 280, 367, 245, 320, 247, 257, 268, 270, 269, 275, 282, 281, 331, 288, 254, 264, - 270, 261, 273, 273, 333, 290, 264, 256, 263, 277, 281, 268, 298, 319, 301, 282, 326, 300, 310, 270, - 281, 250, 265, 287, 267, 252, 254, 270, 260, 277, 260, 280, 279, 268, 300, 290, 272, 300, 289, 317, - 317, 231, 247, 273, 278, 279, 263, 298, 300, 260, 253, 273, 298, 282, 279, 280, 334, 252, 286, 264, - 264, 272, 260, 262, 281, 300, 264, 270, 280, 288, 278, 273, 295, 278, 263, 282, 358, 262, 272, 261, - 280, 254, 319, 261, 275, 264, 280, 286, 292, 284, 310, 278, 250, 263, 261, 288, 328, 281, 279, 319, - 250, 247, 257, 261, 294, 276, 300, 278, 272, 265, 266, 264, 323, 274, 271, 320, 273, 261, 304, 293, - 256, 301, 252, 274, 270, 285, 335, 268, 256, 277, 270, 307, 255, 282, 335, 251, 264, 275, 287, 290, - 264, 265, 373, 250, 246, 307, 249, 334, 254, 262, 244, 258, 263, 265, 279, 324, 288, 258, 299, 259, - 264, 295, 271, 315, 266, 265, 319, 259, 271, 308, 259, 303, 291, 278, 278, 245, 333, 259, 264, 306, - 289, 242, 245, 297, 283, 327, 251, 273, 319, 244, 290, 260, 262, 247, 272, 289, 293, 256, 265, 277, - 276, 272, 275, 273, 277, 294, 291, 269, 264, 264, 277, 283, 319, 292, 272, 273, 269, 292, 291, 291, - 282, 271, 278, 284, 273, 294, 265, 281, 258, 272, 279, 275, 276, 298, 282, 273, 276, 266, 302, 316, - 261, 274, 256, 274, 305, 270, 264, 278, 267, 308, 267, 271, 279, 284, 285, 290, 273, 268, 284, 359, - 330, 277, 292, 307, 229, 235, 246, 269, 272, 267, 279, 313, 265, 267, 261, 286, 311, 268, 272, 266, - 280, 278, 298, 261, 267, 289, 283, 282, 279, 271, 278, 282, 276, 278, 274, 272, 273, 277, 307, 274, - 277, 280, 290, 290, 279, 282, 267, 281, 278, 284, 275, 279, 289, 276, 289, 275, 274, 282, 265, 304]; - const LC_AAC_2_11025 = - [0, 372, 372, 418, 415, 558, 380, 385, 386, 401, 388, 381, 382, 453, 357, 350, 352, 377, 355, 361, 378, - 447, 359, 363, 387, 367, 346, 369, 353, 358, 371, 371, 369, 371, 396, 421, 344, 368, 359, 363, 467, - 338, 370, 384, 336, 348, 347, 360, 442, 332, 354, 359, 369, 350, 362, 370, 415, 354, 380, 383, 363, - 352, 354, 367, 380, 363, 384, 428, 365, 396, 427, 343, 359, 344, 346, 371, 367, 407, 366, 364, 445, - 347, 365, 341, 362, 368, 390, 361, 403, 357, 361, 448, 446, 394, 368, 349, 415, 403, 327, 327, 342, - 349, 348, 429, 347, 352, 354, 358, 385, 355, 362, 361, 352, 405, 361, 364, 358, 361, 356, 446, 373, - 350, 362, 351, 423, 356, 376, 376, 350, 364, 355, 364, 371, 361, 360, 365, 368, 381, 386, 421, 361, - 353, 462, 344, 353, 383, 368, 355, 398, 366, 377, 398, 360, 362, 385, 355, 363, 354, 344, 358, 368, - 360, 365, 375, 415, 389, 387, 365, 369, 359, 375, 382, 389, 363, 367, 370, 368, 439, 374, 367, 370, - 362, 361, 387, 358, 394, 353, 370, 420, 357, 364, 377, 362, 381, 366, 369, 357, 367, 384, 440, 376, - 344, 362, 358, 364, 426, 364, 347, 338, 351, 435, 359, 358, 382, 355, 396, 353, 356, 372, 352, 375, - 358, 364, 376, 372, 426, 380, 348, 451, 326, 348, 365, 374, 380, 361, 358, 366, 447, 356, 363, 390, - 352, 366, 374, 364, 346, 368, 407, 357, 374, 429, 358, 358, 368, 367, 366, 366, 354, 361, 373, 372, - 364, 370, 358, 446, 360, 362, 360, 345, 375, 367, 364, 375, 374, 391, 353, 378, 352, 379, 365, 435, - 365, 353, 363, 376, 363, 368, 383, 366, 367, 360, 387, 350, 370, 395, 379, 365, 385, 351, 362, 383, - 394, 398, 360, 353, 383, 354, 443, 357, 362, 367, 380, 370, 385, 365, 376, 383, 376, 375, 377, 383, - 383, 390, 406, 357, 369, 396, 388, 410, 376, 361, 337, 349, 363, 352, 354, 362, 362, 390, 409, 358, - 368, 353, 375, 488, 387, 383, 407, 336, 345, 390, 327, 336, 341, 345, 363, 357, 378, 439, 339, 355, - 430, 355, 340, 363, 357, 424, 341, 342, 377, 350, 366, 389, 356, 362, 374, 355, 374, 378, 362, 411, - 356, 384, 359, 352, 360, 370, 359, 418, 368, 355, 361, 365, 431, 359, 367, 376, 376, 380, 378, 379, - 375, 375, 382, 386, 381, 362, 383, 361, 404, 368, 369, 410, 374, 390, 360, 371, 373, 389, 356, 389, - 354, 365, 379, 365, 407, 342, 340, 377, 345, 383, 392, 361, 370, 355, 363, 387, 380, 348, 358, 360, - 351, 362, 368, 371, 358, 482, 353, 418, 352, 352, 363, 351, 355, 363, 362, 373, 437, 356, 375, 362, - 357, 380, 372, 366, 410, 382, 352, 377, 358, 367, 367, 363, 368, 425, 409, 395, 427, 384, 414, 377, - 389, 338, 347, 385, 366, 347, 337, 354, 366, 374, 359, 364, 362, 364, 376, 379, 354, 389, 370, 406, - 433, 356, 358, 350, 370, 362, 356, 391, 408, 344, 338, 348, 373, 381, 351, 361, 435, 346, 376, 341, - 361, 367, 356, 364, 366, 386, 355, 363, 370, 386, 361, 358, 380, 373, 368, 378, 454, 363, 370, 352, - 369, 346, 407, 359, 347, 364, 374, 367, 387, 377, 418, 391, 353, 363, 362, 365, 430, 378, 378, 413, - 354, 333, 357, 341, 382, 350, 376, 367, 352, 367, 371, 373, 392, 367, 372, 433, 366, 350, 393, 396, - 360, 386, 356, 367, 355, 364, 438, 363, 360, 369, 357, 406, 345, 365, 450, 352, 350, 352, 381, 383, - 335, 357, 488, 358, 354, 403, 338, 413, 343, 348, 360, 346, 369, 364, 371, 392, 377, 364, 376, 354, - 367, 367, 375, 414, 359, 360, 398, 373, 366, 388, 354, 378, 392, 379, 376, 351, 425, 349, 350, 385, - 385, 339, 354, 380, 378, 420, 349, 366, 418, 347, 401, 345, 352, 356, 350, 392, 381, 356, 356, 360, - 363, 360, 354, 358, 370, 363, 374, 364, 368, 362, 370, 366, 390, 378, 376, 374, 367, 380, 379, 385, - 384, 364, 369, 367, 375, 385, 358, 369, 362, 369, 360, 365, 367, 388, 361, 361, 363, 366, 391, 405, - 365, 377, 366, 367, 386, 367, 367, 371, 364, 387, 371, 360, 381, 369, 366, 384, 375, 369, 382, 435, - 436, 378, 408, 415, 338, 347, 347, 358, 361, 358, 346, 382, 352, 344, 361, 361, 394, 354, 350, 351, - 363, 361, 392, 362, 367, 382, 363, 376, 382, 362, 374, 382, 375, 369, 373, 370, 364, 374, 395, 374, - 375, 374, 373, 366, 375, 383, 376, 374, 382, 387, 373, 354, 374, 373, 375, 370, 375, 378, 365, 382]; - const LC_AAC_1_12000 = - [0, 279, 279, 330, 328, 373, 290, 266, 267, 260, 290, 266, 278, 287, 314, 255, 264, 271, 280, 282, 288, - 266, 343, 330, 229, 242, 252, 250, 265, 299, 272, 272, 277, 297, 285, 274, 270, 309, 296, 258, 272, - 282, 268, 329, 252, 269, 327, 244, 271, 266, 271, 264, 358, 258, 257, 260, 276, 274, 286, 272, 279, - 339, 261, 272, 265, 283, 272, 272, 271, 263, 282, 270, 322, 290, 285, 317, 312, 242, 276, 252, 272, - 290, 257, 255, 345, 254, 254, 340, 264, 254, 260, 271, 279, 315, 281, 273, 308, 249, 258, 363, 324, - 295, 261, 239, 303, 303, 234, 254, 242, 276, 274, 266, 349, 252, 263, 271, 266, 278, 339, 262, 254, - 260, 249, 279, 282, 285, 285, 276, 283, 356, 276, 256, 256, 295, 258, 335, 269, 272, 270, 265, 302, - 255, 269, 280, 282, 278, 279, 270, 289, 268, 286, 350, 277, 263, 245, 362, 248, 243, 345, 253, 241, - 299, 276, 257, 337, 257, 272, 271, 277, 283, 269, 258, 272, 269, 267, 255, 266, 266, 365, 273, 282, - 288, 276, 275, 282, 277, 284, 300, 279, 266, 264, 265, 330, 350, 263, 278, 243, 305, 257, 275, 256, - 261, 271, 256, 294, 319, 267, 265, 277, 267, 292, 264, 278, 261, 311, 294, 325, 320, 278, 246, 264, - 272, 296, 317, 258, 288, 233, 257, 328, 255, 255, 261, 276, 297, 289, 265, 272, 266, 280, 273, 263, - 264, 278, 272, 308, 352, 278, 260, 318, 247, 281, 256, 271, 274, 272, 276, 274, 318, 325, 255, 263, - 284, 260, 279, 255, 258, 268, 269, 325, 300, 281, 286, 335, 257, 272, 280, 270, 264, 264, 266, 284, - 275, 277, 278, 282, 252, 270, 343, 269, 255, 278, 277, 266, 278, 267, 297, 276, 279, 257, 300, 278, - 266, 280, 273, 279, 306, 273, 284, 274, 275, 283, 270, 278, 287, 291, 278, 280, 280, 270, 291, 277, - 272, 290, 267, 286, 330, 283, 283, 291, 260, 258, 257, 257, 299, 335, 250, 254, 270, 273, 284, 276, - 288, 285, 275, 287, 279, 275, 292, 289, 297, 286, 332, 267, 270, 312, 300, 291, 308, 279, 279, 249, - 229, 255, 259, 251, 256, 275, 281, 356, 277, 272, 269, 267, 309, 378, 280, 279, 272, 253, 235, 295, - 249, 251, 255, 264, 257, 282, 285, 275, 333, 254, 274, 315, 335, 239, 269, 260, 270, 300, 260, 269, - 274, 278, 311, 318, 305, 238, 293, 261, 261, 292, 295, 275, 332, 227, 251, 266, 260, 263, 263, 289, - 270, 333, 265, 267, 272, 295, 268, 346, 252, 264, 270, 279, 277, 273, 278, 273, 276, 279, 271, 287, - 281, 275, 272, 291, 325, 267, 272, 304, 296, 259, 297, 258, 296, 298, 308, 266, 298, 248, 277, 315, - 275, 241, 303, 265, 278, 261, 255, 329, 266, 263, 276, 273, 277, 280, 278, 267, 274, 260, 264, 269, - 263, 283, 295, 275, 282, 353, 319, 254, 260, 272, 274, 262, 266, 269, 287, 269, 345, 256, 275, 272, - 278, 264, 271, 282, 278, 325, 298, 255, 261, 256, 256, 274, 276, 291, 314, 351, 258, 285, 288, 263, - 327, 293, 274, 271, 264, 268, 297, 257, 247, 256, 268, 278, 284, 270, 271, 276, 269, 272, 314, 266, - 273, 308, 268, 295, 330, 250, 266, 258, 278, 365, 235, 264, 334, 246, 252, 267, 265, 301, 297, 278, - 271, 329, 234, 261, 320, 255, 265, 277, 270, 279, 279, 300, 258, 272, 276, 271, 282, 272, 270, 302, - 276, 269, 278, 340, 262, 278, 254, 265, 271, 263, 349, 265, 288, 262, 284, 265, 306, 283, 289, 294, - 256, 261, 277, 266, 273, 359, 276, 258, 310, 245, 263, 272, 253, 299, 317, 259, 298, 265, 264, 268, - 258, 268, 306, 310, 269, 294, 307, 247, 261, 334, 308, 251, 287, 234, 258, 274, 263, 333, 323, 256, - 253, 293, 264, 303, 255, 254, 300, 300, 257, 268, 279, 311, 283, 263, 258, 362, 248, 243, 271, 254, - 292, 329, 245, 262, 256, 258, 277, 280, 278, 281, 332, 266, 313, 267, 258, 278, 275, 275, 312, 268, - 261, 322, 267, 270, 295, 258, 308, 314, 293, 274, 264, 265, 325, 260, 260, 323, 332, 227, 234, 250, - 322, 306, 308, 269, 242, 314, 237, 271, 270, 276, 268, 259, 264, 314, 283, 250, 250, 262, 265, 270, - 289, 279, 286, 271, 293, 293, 274, 266, 275, 270, 279, 312, 279, 274, 270, 276, 271, 291, 297, 279, - 298, 268, 273, 279, 271, 285, 300, 271, 301, 259, 271, 263, 269, 283, 302, 270, 268, 278, 278, 270, - 320, 285, 265, 262, 279, 273, 300, 271, 282, 271, 269, 274, 304, 267, 283, 282, 266, 273, 315, 270]; - const LC_AAC_2_12000 = - [0, 372, 372, 424, 417, 433, 474, 385, 393, 398, 398, 381, 397, 396, 432, 343, 344, 359, 353, 363, 372, - 374, 422, 431, 342, 374, 359, 360, 332, 374, 347, 366, 366, 387, 374, 360, 384, 394, 380, 363, 359, - 361, 390, 416, 386, 347, 399, 346, 360, 364, 351, 362, 444, 349, 343, 358, 351, 348, 366, 368, 384, - 433, 356, 364, 380, 382, 365, 350, 368, 368, 373, 362, 410, 389, 369, 418, 425, 338, 372, 340, 344, - 405, 347, 357, 456, 359, 373, 429, 342, 348, 322, 358, 379, 390, 357, 360, 396, 349, 367, 442, 442, - 385, 355, 342, 422, 406, 341, 349, 340, 351, 343, 350, 425, 349, 363, 353, 361, 350, 411, 363, 349, - 362, 349, 361, 367, 374, 372, 371, 356, 443, 370, 362, 352, 416, 343, 431, 374, 358, 380, 353, 393, - 348, 355, 352, 360, 359, 362, 359, 366, 374, 382, 445, 395, 353, 360, 472, 333, 348, 436, 351, 369, - 386, 356, 343, 434, 356, 360, 359, 378, 368, 360, 354, 353, 363, 356, 358, 351, 362, 433, 362, 368, - 373, 362, 376, 368, 361, 375, 386, 366, 375, 366, 375, 410, 459, 371, 367, 350, 423, 368, 377, 357, - 341, 363, 353, 371, 394, 368, 374, 369, 373, 387, 357, 361, 348, 390, 405, 412, 415, 376, 353, 357, - 360, 383, 425, 342, 374, 319, 353, 415, 341, 355, 344, 376, 381, 387, 352, 347, 343, 361, 353, 349, - 364, 364, 368, 373, 448, 382, 347, 432, 344, 371, 352, 362, 377, 365, 360, 366, 400, 429, 356, 355, - 381, 360, 374, 372, 358, 359, 377, 410, 388, 360, 377, 429, 358, 357, 368, 355, 365, 358, 357, 365, - 356, 365, 371, 370, 369, 359, 442, 356, 364, 364, 368, 359, 363, 365, 378, 355, 375, 379, 399, 365, - 354, 372, 372, 361, 401, 372, 366, 374, 370, 374, 366, 373, 367, 372, 360, 370, 367, 353, 385, 366, - 384, 370, 388, 365, 425, 393, 371, 415, 348, 356, 353, 357, 378, 446, 369, 356, 376, 364, 372, 377, - 379, 370, 362, 367, 376, 383, 385, 389, 397, 369, 433, 376, 373, 410, 399, 388, 401, 377, 380, 357, - 337, 331, 347, 346, 348, 351, 353, 425, 383, 355, 358, 359, 411, 488, 384, 373, 392, 344, 327, 387, - 341, 338, 339, 331, 342, 357, 352, 354, 437, 346, 355, 398, 434, 358, 354, 374, 350, 391, 343, 359, - 344, 376, 390, 420, 419, 350, 382, 358, 356, 370, 382, 358, 419, 351, 347, 353, 377, 366, 356, 365, - 350, 401, 369, 356, 359, 398, 366, 446, 359, 368, 370, 370, 381, 370, 369, 375, 385, 368, 375, 368, - 383, 363, 361, 369, 406, 374, 367, 393, 388, 352, 394, 348, 386, 383, 392, 365, 397, 353, 357, 421, - 373, 334, 386, 354, 365, 340, 334, 435, 352, 362, 362, 354, 363, 378, 373, 351, 355, 363, 365, 358, - 356, 376, 377, 358, 379, 454, 412, 348, 353, 358, 362, 350, 360, 363, 371, 363, 451, 339, 345, 383, - 352, 392, 383, 395, 371, 415, 399, 349, 353, 363, 354, 381, 386, 360, 388, 451, 369, 372, 391, 349, - 415, 390, 371, 357, 359, 344, 388, 361, 341, 346, 372, 367, 383, 365, 367, 370, 368, 348, 411, 364, - 354, 398, 356, 394, 434, 357, 368, 345, 360, 453, 329, 345, 446, 323, 360, 336, 351, 379, 384, 361, - 364, 440, 342, 355, 421, 329, 351, 359, 376, 373, 362, 379, 356, 368, 353, 360, 375, 352, 364, 381, - 381, 370, 367, 453, 361, 362, 362, 360, 356, 358, 447, 358, 361, 361, 371, 353, 392, 383, 369, 412, - 343, 366, 369, 371, 359, 436, 369, 368, 421, 350, 346, 355, 352, 376, 412, 369, 387, 347, 343, 370, - 355, 363, 397, 410, 357, 384, 426, 354, 357, 425, 386, 366, 379, 345, 344, 377, 346, 419, 421, 339, - 358, 379, 344, 386, 346, 351, 382, 397, 355, 371, 358, 396, 372, 349, 351, 473, 347, 349, 356, 345, - 374, 431, 347, 334, 395, 374, 376, 376, 381, 362, 407, 362, 384, 343, 364, 355, 349, 385, 394, 359, - 374, 394, 356, 394, 379, 360, 394, 387, 391, 378, 371, 352, 419, 351, 350, 421, 445, 328, 338, 343, - 398, 401, 406, 378, 358, 412, 347, 349, 348, 349, 343, 349, 366, 391, 377, 344, 342, 353, 363, 354, - 369, 379, 366, 361, 374, 382, 375, 366, 371, 373, 367, 393, 370, 372, 367, 366, 370, 385, 375, 370, - 381, 367, 365, 363, 369, 374, 381, 372, 396, 365, 374, 366, 363, 364, 393, 369, 369, 369, 358, 378, - 399, 384, 356, 361, 379, 356, 390, 365, 362, 369, 362, 369, 393, 373, 378, 369, 354, 358, 416, 367]; - const LC_AAC_1_16000 = - [0, 279, 279, 343, 338, 311, 320, 291, 242, 270, 273, 257, 279, 301, 274, 303, 290, 299, 309, 238, 249, - 260, 269, 279, 274, 280, 287, 295, 281, 321, 327, 244, 262, 261, 269, 262, 274, 288, 297, 258, 279, - 275, 276, 277, 274, 281, 286, 271, 293, 322, 251, 259, 279, 279, 280, 278, 285, 333, 271, 266, 269, - 325, 261, 268, 261, 263, 265, 269, 308, 336, 266, 257, 263, 276, 276, 276, 260, 269, 280, 279, 328, - 285, 269, 275, 269, 285, 287, 279, 268, 266, 273, 283, 304, 271, 287, 286, 333, 267, 265, 264, 324, - 245, 253, 264, 294, 271, 269, 268, 305, 268, 260, 329, 263, 266, 274, 313, 297, 272, 270, 269, 271, - 271, 287, 294, 273, 266, 272, 310, 267, 272, 262, 347, 335, 330, 279, 283, 231, 238, 317, 305, 243, - 229, 278, 273, 261, 270, 271, 260, 303, 333, 265, 270, 272, 262, 263, 280, 316, 272, 283, 268, 266, - 270, 283, 319, 265, 277, 277, 271, 278, 278, 278, 279, 333, 280, 269, 257, 329, 259, 254, 291, 256, - 285, 276, 279, 282, 262, 292, 259, 261, 280, 282, 276, 275, 275, 276, 267, 274, 289, 281, 285, 349, - 299, 263, 252, 264, 338, 277, 252, 268, 256, 334, 261, 252, 288, 296, 281, 270, 271, 274, 274, 281, - 287, 278, 270, 276, 278, 268, 281, 277, 263, 290, 277, 291, 259, 288, 292, 345, 280, 266, 290, 264, - 285, 268, 276, 265, 281, 275, 271, 291, 277, 278, 284, 286, 268, 269, 271, 333, 258, 278, 276, 271, - 264, 359, 238, 266, 262, 268, 267, 347, 262, 261, 264, 355, 261, 278, 265, 268, 270, 286, 269, 282, - 266, 279, 269, 300, 336, 283, 269, 311, 248, 257, 268, 265, 285, 277, 313, 329, 254, 274, 251, 268, - 261, 269, 347, 253, 266, 271, 254, 275, 281, 275, 293, 264, 250, 280, 271, 275, 291, 283, 282, 280, - 276, 276, 279, 281, 315, 324, 260, 257, 277, 251, 345, 277, 255, 273, 255, 296, 269, 274, 268, 316, - 261, 306, 324, 266, 260, 274, 278, 272, 283, 272, 272, 272, 270, 277, 269, 308, 357, 286, 266, 266, - 260, 320, 257, 255, 266, 265, 281, 274, 274, 274, 283, 264, 273, 285, 291, 282, 275, 301, 262, 266, - 357, 313, 233, 272, 262, 269, 270, 275, 291, 276, 261, 269, 288, 281, 273, 261, 254, 357, 266, 273, - 261, 273, 262, 295, 297, 305, 272, 256, 269, 290, 283, 295, 285, 253, 279, 281, 283, 293, 271, 273, - 291, 270, 281, 265, 311, 264, 276, 259, 355, 256, 266, 256, 284, 307, 259, 285, 294, 268, 268, 268, - 270, 265, 273, 324, 300, 262, 268, 269, 277, 287, 268, 284, 277, 281, 276, 289, 283, 284, 274, 286, - 281, 303, 275, 290, 276, 274, 313, 314, 250, 271, 287, 282, 279, 273, 291, 283, 258, 268, 269, 261, - 275, 265, 267, 280, 273, 280, 288, 277, 287, 300, 276, 275, 274, 283, 288, 328, 243, 270, 321, 250, - 273, 290, 291, 267, 257, 337, 251, 255, 271, 253, 270, 274, 279, 263, 293, 270, 274, 291, 265, 273, - 335, 284, 289, 273, 268, 270, 275, 285, 267, 308, 266, 270, 274, 284, 285, 281, 305, 292, 289, 259, - 278, 285, 266, 270, 262, 295, 303, 281, 265, 330, 260, 261, 292, 262, 281, 262, 275, 273, 281, 312, - 261, 286, 276, 267, 266, 268, 351, 262, 294, 320, 235, 265, 262, 275, 269, 284, 281, 273, 279, 273, - 279, 275, 275, 290, 280, 273, 277, 284, 278, 266, 282, 292, 331, 253, 293, 296, 307, 262, 268, 287, - 282, 273, 285, 286, 328, 286, 247, 300, 250, 278, 257, 270, 327, 269, 233, 297, 271, 274, 267, 287, - 256, 272, 337, 282, 257, 280, 257, 253, 276, 312, 274, 284, 266, 267, 282, 276, 283, 271, 270, 271, - 274, 295, 303, 263, 260, 271, 362, 292, 266, 271, 276, 265, 269, 269, 284, 273, 265, 284, 267, 274, - 275, 353, 263, 261, 279, 284, 280, 275, 280, 268, 277, 279, 320, 314, 282, 317, 253, 252, 253, 254, - 262, 270, 268, 282, 315, 309, 327, 289, 243, 284, 286, 284, 270, 320, 277, 241, 267, 275, 268, 275, - 275, 288, 263, 285, 263, 273, 284, 287, 277, 277, 288, 279, 266, 274, 275, 268, 277, 302, 277, 268, - 275, 331, 284, 253, 293, 317, 245, 261, 272, 258, 272, 285, 290, 262, 274, 285, 330, 259, 265, 261, - 273, 277, 299, 307, 306, 267, 259, 342, 296, 246, 255, 310, 291, 256, 265, 264, 263, 284, 267, 285, - 292, 276, 266, 272, 281, 271, 276, 297, 278, 296, 261, 264, 286, 279, 279, 273, 281, 337, 259, 274]; - const LC_AAC_2_16000 = - [0, 372, 372, 433, 428, 416, 410, 439, 393, 384, 366, 363, 373, 370, 389, 392, 392, 417, 427, 337, 353, - 364, 355, 357, 369, 365, 369, 366, 379, 426, 420, 350, 354, 376, 379, 359, 357, 369, 373, 363, 358, - 379, 373, 370, 357, 373, 379, 367, 381, 421, 344, 361, 363, 382, 369, 368, 372, 419, 370, 367, 385, - 397, 353, 355, 359, 351, 361, 361, 404, 443, 370, 353, 352, 367, 366, 369, 367, 364, 373, 365, 412, - 382, 359, 378, 350, 367, 376, 372, 367, 355, 369, 377, 386, 361, 376, 374, 430, 364, 364, 354, 440, - 345, 337, 350, 386, 358, 361, 371, 386, 347, 366, 403, 368, 380, 371, 387, 374, 362, 346, 369, 340, - 359, 373, 389, 375, 360, 366, 402, 376, 369, 375, 441, 437, 428, 397, 386, 351, 338, 408, 408, 345, - 315, 342, 352, 336, 357, 343, 353, 388, 416, 344, 355, 372, 352, 348, 353, 410, 363, 368, 353, 352, - 369, 398, 413, 371, 362, 360, 370, 370, 362, 373, 375, 417, 372, 360, 349, 441, 362, 342, 392, 345, - 372, 382, 380, 373, 370, 368, 356, 361, 370, 365, 371, 369, 357, 361, 358, 362, 365, 366, 379, 465, - 401, 363, 357, 361, 445, 384, 342, 358, 349, 421, 362, 354, 366, 382, 371, 353, 378, 362, 353, 370, - 363, 359, 352, 354, 353, 361, 363, 384, 374, 389, 385, 375, 361, 388, 388, 440, 378, 358, 411, 349, - 433, 345, 353, 352, 379, 362, 365, 367, 352, 371, 370, 368, 374, 367, 376, 431, 363, 373, 361, 353, - 351, 441, 344, 380, 351, 364, 360, 451, 343, 366, 348, 454, 350, 365, 368, 358, 365, 386, 349, 373, - 371, 366, 346, 395, 445, 386, 360, 421, 338, 350, 379, 369, 357, 362, 390, 444, 347, 368, 354, 360, - 336, 356, 438, 347, 364, 376, 358, 362, 363, 379, 380, 369, 359, 363, 345, 349, 362, 365, 360, 367, - 366, 365, 357, 355, 422, 421, 361, 350, 374, 359, 444, 365, 366, 364, 354, 370, 363, 359, 354, 422, - 370, 397, 424, 358, 352, 356, 360, 357, 362, 370, 371, 375, 378, 364, 360, 403, 458, 403, 374, 360, - 361, 426, 342, 338, 338, 350, 356, 353, 359, 359, 366, 369, 369, 354, 371, 374, 375, 391, 373, 360, - 415, 447, 369, 361, 361, 356, 371, 360, 374, 371, 353, 361, 389, 353, 371, 361, 345, 459, 367, 363, - 342, 377, 379, 370, 383, 416, 382, 347, 345, 369, 368, 372, 393, 370, 379, 366, 390, 370, 372, 357, - 401, 355, 356, 359, 405, 343, 376, 360, 454, 368, 356, 345, 383, 412, 356, 371, 400, 364, 366, 365, - 375, 362, 341, 452, 383, 358, 366, 364, 376, 381, 363, 379, 380, 368, 360, 370, 376, 379, 371, 371, - 378, 384, 371, 392, 367, 368, 407, 409, 373, 380, 363, 366, 361, 355, 370, 360, 359, 361, 342, 362, - 360, 352, 353, 368, 361, 359, 385, 379, 379, 398, 383, 372, 378, 362, 361, 451, 348, 359, 429, 325, - 348, 401, 383, 369, 357, 423, 351, 367, 376, 352, 344, 354, 363, 362, 355, 357, 350, 388, 355, 358, - 416, 372, 392, 370, 362, 358, 375, 380, 366, 416, 343, 372, 362, 357, 372, 370, 404, 407, 397, 359, - 367, 369, 366, 374, 363, 373, 397, 363, 346, 443, 339, 346, 390, 351, 368, 370, 366, 377, 367, 399, - 376, 369, 354, 373, 349, 378, 452, 363, 396, 425, 339, 370, 360, 376, 378, 361, 377, 359, 373, 366, - 369, 378, 376, 375, 372, 364, 375, 366, 371, 374, 372, 381, 409, 361, 379, 379, 400, 368, 350, 377, - 391, 363, 388, 378, 422, 402, 356, 386, 359, 355, 348, 353, 406, 370, 341, 386, 347, 351, 351, 372, - 350, 356, 428, 364, 361, 374, 349, 341, 363, 382, 352, 362, 348, 365, 365, 374, 371, 367, 371, 363, - 369, 381, 387, 360, 363, 354, 464, 388, 356, 356, 343, 366, 361, 354, 355, 350, 365, 373, 366, 367, - 367, 447, 360, 365, 388, 385, 375, 369, 380, 381, 382, 378, 405, 415, 394, 431, 350, 361, 361, 362, - 364, 364, 367, 377, 398, 388, 422, 402, 356, 359, 382, 366, 344, 425, 361, 347, 351, 355, 345, 346, - 345, 379, 372, 374, 362, 356, 384, 388, 372, 387, 377, 373, 367, 366, 380, 369, 373, 405, 366, 370, - 369, 400, 386, 338, 383, 428, 353, 373, 362, 352, 357, 384, 370, 353, 354, 373, 427, 355, 369, 359, - 359, 360, 386, 404, 387, 369, 361, 430, 378, 330, 354, 402, 391, 330, 337, 343, 356, 369, 377, 365, - 383, 361, 362, 376, 375, 356, 371, 382, 357, 382, 352, 358, 382, 373, 372, 369, 375, 449, 366, 365]; - const LC_AAC_1_22050 = - [0, 279, 279, 363, 332, 328, 308, 276, 379, 237, 212, 254, 266, 285, 274, 280, 282, 286, 272, 277, 283, - 267, 271, 307, 324, 239, 249, 284, 277, 271, 281, 283, 284, 278, 275, 278, 281, 275, 271, 290, 336, - 267, 269, 265, 263, 289, 280, 277, 274, 270, 279, 288, 269, 276, 279, 277, 291, 279, 278, 284, 280, - 269, 288, 290, 270, 278, 289, 335, 232, 259, 268, 276, 284, 284, 283, 288, 292, 295, 306, 247, 267, - 260, 274, 338, 241, 264, 274, 281, 274, 274, 271, 288, 271, 302, 343, 258, 260, 271, 261, 270, 269, - 274, 300, 271, 273, 275, 268, 281, 276, 289, 356, 254, 267, 276, 273, 272, 280, 276, 280, 267, 284, - 284, 277, 266, 283, 278, 299, 319, 290, 242, 294, 336, 292, 246, 256, 265, 262, 336, 252, 261, 265, - 276, 275, 265, 276, 272, 280, 274, 309, 275, 273, 271, 276, 356, 263, 265, 268, 278, 305, 264, 274, - 272, 278, 263, 271, 276, 279, 270, 271, 308, 283, 274, 306, 275, 266, 293, 303, 265, 266, 305, 323, - 335, 324, 275, 291, 256, 256, 232, 287, 257, 318, 289, 246, 240, 264, 279, 257, 275, 292, 270, 279, - 285, 273, 287, 333, 260, 273, 275, 282, 272, 275, 278, 269, 281, 310, 308, 275, 281, 275, 261, 266, - 258, 281, 336, 246, 262, 275, 292, 282, 268, 270, 281, 286, 283, 272, 282, 337, 260, 274, 271, 258, - 264, 347, 281, 248, 262, 293, 254, 275, 288, 272, 265, 295, 289, 287, 272, 258, 270, 271, 274, 284, - 282, 282, 269, 290, 290, 279, 274, 266, 276, 268, 272, 272, 299, 306, 342, 291, 254, 262, 262, 263, - 287, 321, 275, 268, 255, 275, 279, 345, 273, 262, 267, 263, 335, 274, 288, 269, 272, 273, 324, 252, - 263, 272, 279, 281, 270, 276, 261, 278, 273, 270, 278, 275, 279, 285, 264, 287, 270, 284, 288, 262, - 272, 279, 293, 334, 329, 237, 261, 274, 300, 276, 278, 273, 277, 271, 274, 285, 278, 271, 286, 288, - 280, 276, 275, 280, 271, 284, 262, 279, 276, 283, 308, 322, 257, 274, 270, 263, 284, 260, 277, 353, - 324, 234, 247, 254, 284, 265, 275, 329, 265, 276, 265, 265, 273, 344, 272, 262, 286, 263, 274, 271, - 281, 278, 289, 260, 321, 261, 276, 277, 278, 288, 301, 316, 281, 254, 262, 323, 257, 264, 266, 260, - 259, 262, 315, 296, 288, 283, 330, 267, 264, 266, 268, 284, 252, 265, 260, 313, 332, 256, 281, 259, - 263, 266, 285, 270, 278, 276, 278, 291, 277, 264, 265, 267, 283, 282, 288, 278, 274, 285, 281, 271, - 278, 279, 268, 279, 266, 283, 312, 337, 300, 256, 268, 260, 259, 338, 284, 268, 264, 279, 270, 273, - 285, 287, 276, 272, 276, 277, 336, 274, 253, 259, 305, 308, 264, 268, 271, 269, 272, 276, 281, 270, - 292, 264, 277, 281, 273, 284, 272, 268, 269, 371, 341, 274, 253, 258, 270, 256, 249, 346, 254, 283, - 265, 278, 271, 269, 273, 284, 277, 270, 275, 300, 277, 280, 267, 286, 283, 271, 282, 277, 270, 318, - 273, 266, 268, 285, 331, 257, 269, 269, 269, 274, 264, 280, 278, 278, 282, 303, 269, 264, 279, 273, - 273, 269, 270, 318, 259, 277, 313, 267, 266, 273, 274, 272, 293, 270, 289, 296, 286, 341, 268, 253, - 272, 286, 276, 256, 269, 281, 291, 308, 289, 281, 280, 263, 282, 267, 288, 284, 280, 250, 293, 287, - 271, 267, 274, 306, 278, 276, 269, 272, 270, 311, 270, 267, 269, 266, 344, 263, 297, 274, 269, 271, - 277, 275, 276, 261, 272, 271, 284, 260, 274, 300, 371, 277, 240, 261, 274, 274, 274, 287, 279, 273, - 280, 283, 276, 278, 268, 275, 280, 289, 286, 289, 272, 289, 284, 271, 282, 294, 289, 280, 278, 285, - 273, 275, 300, 280, 259, 269, 276, 272, 300, 259, 283, 283, 280, 278, 286, 259, 268, 286, 272, 264, - 280, 274, 272, 284, 277, 270, 282, 291, 281, 272, 283, 286, 299, 277, 305, 264, 270, 277, 280, 271, - 279, 341, 319, 253, 246, 332, 299, 243, 253, 278, 265, 298, 273, 277, 268, 275, 331, 274, 264, 247, - 268, 270, 274, 282, 279, 295, 281, 267, 280, 274, 263, 276, 375, 250, 266, 254, 270, 325, 260, 265, - 277, 275, 288, 266, 273, 279, 272, 286, 270, 325, 255, 265, 282, 265, 307, 275, 269, 285, 281, 285, - 305, 276, 264, 274, 280, 277, 283, 264, 292, 262, 278, 305, 295, 271, 272, 247, 341, 264, 258, 263, - 302, 250, 290, 280, 260, 254, 282, 286, 281, 299, 324, 271, 263, 287, 283, 275, 281, 287, 269, 278]; - const LC_AAC_2_22050 = - [0, 372, 372, 373, 372, 372, 373, 372, 526, 359, 358, 308, 320, 364, 373, 372, 372, 373, 372, 372, 373, - 372, 372, 374, 424, 357, 388, 347, 357, 360, 372, 379, 366, 372, 373, 372, 372, 373, 372, 373, 494, - 431, 422, 414, 387, 380, 388, 387, 399, 403, 372, 363, 351, 371, 353, 352, 324, 329, 385, 325, 327, - 295, 335, 349, 373, 372, 372, 386, 359, 372, 373, 372, 372, 373, 372, 373, 372, 411, 504, 379, 444, - 395, 371, 470, 380, 386, 392, 391, 375, 375, 386, 361, 368, 368, 423, 366, 362, 366, 367, 365, 378, - 378, 379, 377, 370, 335, 351, 322, 387, 368, 440, 372, 371, 346, 359, 383, 364, 390, 366, 382, 348, - 367, 396, 371, 351, 302, 403, 406, 363, 348, 323, 446, 361, 367, 368, 315, 395, 452, 395, 370, 387, - 377, 351, 372, 370, 366, 392, 368, 433, 358, 369, 356, 380, 377, 364, 374, 388, 383, 344, 418, 354, - 359, 359, 391, 360, 356, 369, 376, 379, 345, 362, 366, 370, 379, 370, 371, 361, 334, 371, 339, 446, - 454, 364, 356, 360, 436, 423, 324, 328, 337, 333, 434, 399, 382, 345, 355, 402, 354, 355, 374, 353, - 357, 366, 354, 431, 361, 370, 381, 368, 373, 373, 407, 341, 357, 335, 359, 376, 384, 423, 408, 348, - 416, 352, 340, 359, 370, 370, 372, 371, 362, 371, 370, 449, 432, 345, 335, 389, 368, 332, 364, 360, - 423, 342, 352, 337, 429, 326, 431, 383, 369, 389, 354, 335, 352, 365, 349, 379, 376, 370, 380, 382, - 378, 360, 369, 384, 367, 363, 373, 362, 363, 368, 377, 400, 388, 434, 420, 353, 341, 355, 339, 368, - 362, 429, 469, 333, 355, 356, 363, 345, 369, 366, 356, 343, 356, 428, 357, 359, 342, 364, 373, 445, - 367, 343, 368, 435, 433, 338, 361, 347, 360, 359, 359, 361, 363, 356, 367, 374, 448, 371, 366, 362, - 370, 357, 371, 353, 389, 355, 439, 428, 415, 344, 340, 363, 361, 380, 359, 364, 366, 354, 370, 373, - 357, 352, 364, 373, 367, 339, 372, 374, 380, 323, 381, 362, 451, 378, 367, 367, 370, 429, 447, 357, - 328, 350, 425, 411, 346, 345, 328, 350, 383, 432, 380, 358, 364, 425, 361, 354, 372, 373, 367, 361, - 375, 357, 351, 405, 420, 358, 370, 379, 384, 355, 362, 366, 431, 360, 333, 432, 381, 378, 351, 350, - 347, 341, 342, 357, 360, 359, 353, 369, 388, 377, 373, 441, 364, 427, 351, 353, 426, 383, 365, 363, - 368, 370, 333, 351, 360, 368, 363, 364, 361, 371, 366, 369, 369, 361, 392, 360, 367, 362, 367, 429, - 360, 435, 344, 350, 328, 355, 441, 436, 350, 341, 352, 400, 371, 348, 353, 426, 351, 363, 364, 433, - 357, 361, 371, 343, 374, 422, 422, 354, 361, 354, 374, 362, 370, 363, 368, 418, 360, 361, 364, 433, - 334, 370, 356, 356, 357, 374, 358, 371, 361, 448, 364, 364, 348, 362, 425, 343, 346, 438, 368, 349, - 356, 354, 352, 351, 373, 372, 375, 364, 375, 364, 421, 360, 366, 365, 353, 356, 403, 370, 435, 431, - 414, 337, 336, 421, 337, 342, 358, 356, 362, 372, 365, 364, 422, 357, 345, 358, 358, 370, 365, 445, - 438, 429, 339, 407, 345, 347, 336, 348, 374, 372, 354, 349, 388, 426, 431, 429, 330, 344, 351, 376, - 414, 411, 407, 389, 354, 346, 326, 420, 405, 333, 329, 354, 348, 351, 344, 338, 345, 348, 441, 353, - 369, 428, 417, 351, 354, 343, 372, 400, 351, 344, 347, 355, 463, 352, 383, 446, 334, 343, 359, 347, - 354, 361, 378, 391, 426, 423, 352, 389, 350, 349, 510, 315, 403, 347, 359, 359, 369, 361, 355, 358, - 386, 351, 364, 380, 365, 368, 362, 369, 370, 378, 388, 376, 364, 396, 367, 360, 398, 371, 360, 384, - 381, 360, 357, 354, 370, 451, 356, 364, 353, 412, 340, 344, 363, 349, 352, 375, 367, 366, 367, 363, - 370, 391, 397, 369, 366, 399, 436, 395, 351, 349, 350, 356, 352, 356, 342, 367, 374, 326, 381, 383, - 449, 336, 358, 332, 440, 504, 465, 375, 322, 336, 409, 402, 374, 348, 327, 342, 336, 346, 329, 366, - 383, 337, 371, 375, 362, 345, 378, 368, 374, 412, 356, 361, 516, 356, 406, 352, 344, 427, 373, 363, - 352, 349, 364, 347, 355, 379, 384, 360, 401, 334, 357, 372, 368, 420, 343, 382, 397, 355, 369, 354, - 426, 354, 370, 365, 378, 347, 357, 438, 350, 357, 343, 441, 357, 368, 421, 409, 333, 340, 418, 413, - 406, 376, 324, 367, 351, 393, 334, 353, 363, 430, 335, 344, 364, 444, 353, 364, 376, 334, 363, 373]; - const HE_AAC_1_24000 = - [0, 279, 279, 328, 324, 352, 305, 267, 268, 274, 294, 277, 272, 283, 324, 259, 258, 261, 271, 268, 297, - 275, 312, 343, 251, 257, 258, 247, 264, 302, 261, 283, 267, 277, 282, 273, 267, 328, 291, 267, 276, - 267, 277, 319, 264, 269, 335, 244, 264, 268, 272, 257, 339, 255, 260, 261, 275, 276, 277, 271, 287, - 343, 268, 269, 283, 279, 275, 267, 283, 282, 285, 277, 338, 265, 260, 311, 307, 246, 279, 248, 260, - 288, 263, 265, 334, 258, 265, 335, 249, 277, 271, 268, 281, 308, 265, 266, 308, 265, 276, 329, 316, - 304, 264, 246, 313, 306, 257, 250, 241, 273, 265, 268, 330, 265, 273, 261, 272, 272, 313, 272, 275, - 265, 244, 277, 285, 271, 292, 289, 283, 334, 269, 264, 266, 280, 272, 320, 262, 269, 296, 266, 291, - 266, 277, 269, 273, 280, 284, 271, 279, 269, 287, 325, 268, 270, 252, 348, 264, 259, 329, 252, 264, - 302, 270, 272, 327, 268, 263, 270, 270, 266, 282, 261, 273, 262, 283, 257, 270, 275, 353, 292, 293, - 282, 259, 260, 280, 280, 265, 275, 280, 277, 278, 265, 309, 327, 268, 272, 270, 292, 274, 272, 266, - 264, 270, 277, 284, 308, 268, 275, 280, 270, 308, 265, 266, 260, 281, 296, 337, 322, 289, 242, 260, - 267, 302, 323, 256, 296, 247, 246, 324, 265, 255, 278, 278, 272, 291, 256, 275, 276, 277, 273, 271, - 273, 270, 275, 284, 330, 285, 266, 331, 255, 279, 263, 280, 262, 265, 269, 276, 296, 324, 262, 276, - 281, 269, 282, 268, 278, 260, 265, 312, 302, 268, 276, 328, 260, 273, 266, 280, 278, 268, 266, 273, - 280, 279, 272, 278, 264, 268, 344, 266, 276, 272, 270, 271, 279, 276, 281, 279, 276, 259, 320, 273, - 263, 285, 271, 283, 300, 268, 276, 277, 278, 271, 270, 276, 280, 296, 285, 282, 274, 270, 275, 294, - 265, 311, 258, 285, 308, 274, 284, 295, 267, 267, 261, 266, 293, 339, 257, 251, 270, 270, 278, 281, - 275, 283, 267, 285, 279, 280, 286, 275, 294, 289, 338, 269, 284, 316, 299, 284, 304, 267, 265, 249, - 245, 263, 257, 269, 264, 272, 285, 318, 272, 260, 294, 272, 304, 360, 279, 269, 301, 260, 246, 277, - 260, 256, 261, 266, 260, 284, 290, 272, 330, 255, 274, 286, 338, 252, 278, 262, 276, 290, 266, 272, - 269, 277, 278, 304, 302, 263, 269, 270, 262, 284, 296, 283, 336, 252, 255, 270, 266, 280, 264, 277, - 270, 316, 269, 268, 270, 287, 278, 341, 252, 271, 271, 278, 266, 274, 273, 282, 277, 284, 272, 286, - 282, 280, 278, 279, 328, 275, 270, 304, 286, 271, 307, 264, 274, 278, 270, 281, 298, 267, 289, 316, - 266, 276, 284, 263, 275, 269, 246, 341, 272, 257, 280, 275, 272, 289, 288, 260, 261, 266, 274, 278, - 268, 279, 283, 272, 270, 352, 307, 257, 266, 262, 280, 257, 269, 278, 291, 264, 334, 262, 280, 263, - 267, 277, 263, 270, 284, 320, 311, 279, 248, 248, 260, 281, 284, 282, 313, 337, 258, 288, 305, 270, - 291, 269, 264, 267, 260, 272, 308, 271, 266, 260, 275, 277, 279, 279, 272, 267, 271, 280, 317, 274, - 278, 292, 265, 290, 320, 259, 276, 267, 272, 339, 245, 262, 335, 251, 267, 271, 260, 285, 299, 281, - 257, 334, 251, 265, 312, 254, 253, 276, 283, 285, 264, 290, 277, 276, 283, 269, 288, 266, 276, 289, - 281, 263, 286, 326, 266, 282, 263, 265, 268, 269, 350, 264, 288, 250, 269, 279, 299, 274, 294, 313, - 240, 250, 274, 280, 283, 330, 274, 273, 322, 261, 258, 259, 258, 295, 324, 271, 309, 279, 257, 259, - 261, 266, 298, 307, 267, 276, 325, 239, 262, 309, 297, 269, 294, 250, 263, 257, 265, 303, 327, 259, - 270, 289, 266, 306, 256, 266, 302, 320, 250, 261, 277, 306, 275, 267, 265, 360, 252, 237, 280, 255, - 303, 317, 250, 270, 257, 258, 282, 268, 284, 276, 325, 261, 318, 258, 263, 285, 279, 270, 329, 260, - 260, 309, 254, 283, 302, 253, 282, 302, 288, 276, 268, 266, 327, 265, 262, 322, 333, 232, 245, 250, - 299, 293, 328, 249, 260, 301, 243, 277, 272, 261, 265, 260, 268, 315, 283, 259, 269, 266, 271, 270, - 277, 280, 284, 278, 274, 300, 267, 270, 279, 279, 290, 299, 282, 283, 268, 272, 273, 297, 290, 279, - 286, 274, 278, 284, 274, 282, 287, 274, 308, 269, 267, 268, 269, 274, 299, 267, 273, 278, 273, 273, - 326, 292, 261, 265, 270, 269, 295, 268, 284, 276, 269, 284, 287, 279, 275, 284, 252, 286, 316, 268]; - const HE_AAC_2_24000 = - [0, 372, 372, 373, 372, 462, 461, 379, 362, 352, 363, 389, 375, 393, 473, 388, 399, 395, 377, 393, 367, - 383, 404, 437, 384, 389, 381, 376, 338, 365, 349, 367, 380, 376, 382, 380, 364, 381, 369, 369, 376, - 372, 374, 379, 373, 374, 399, 357, 374, 373, 359, 369, 412, 340, 372, 386, 365, 372, 349, 352, 360, - 428, 360, 380, 388, 382, 372, 357, 349, 362, 369, 354, 408, 382, 376, 409, 391, 337, 352, 354, 357, - 374, 353, 384, 422, 381, 387, 399, 347, 365, 350, 362, 368, 390, 363, 350, 378, 354, 365, 416, 402, - 382, 361, 344, 413, 395, 358, 341, 342, 347, 352, 341, 405, 361, 358, 350, 345, 358, 405, 362, 363, - 355, 345, 368, 372, 364, 367, 373, 369, 400, 379, 362, 353, 363, 368, 428, 368, 381, 387, 359, 389, - 357, 358, 365, 360, 365, 370, 364, 376, 366, 362, 402, 361, 358, 366, 503, 346, 354, 407, 357, 350, - 391, 350, 367, 426, 364, 357, 358, 370, 354, 358, 360, 360, 380, 389, 364, 374, 369, 431, 391, 391, - 390, 354, 359, 366, 361, 353, 356, 363, 363, 370, 368, 389, 429, 361, 368, 360, 402, 393, 390, 357, - 355, 376, 381, 361, 381, 369, 374, 375, 359, 387, 380, 369, 350, 360, 372, 419, 431, 395, 373, 346, - 346, 364, 414, 360, 394, 329, 350, 422, 371, 371, 385, 366, 352, 376, 349, 346, 357, 360, 354, 349, - 357, 367, 362, 357, 394, 364, 357, 483, 369, 352, 353, 364, 360, 358, 355, 365, 381, 412, 361, 355, - 373, 364, 391, 384, 376, 371, 383, 380, 379, 365, 386, 421, 352, 351, 357, 356, 355, 364, 357, 360, - 364, 366, 363, 365, 356, 354, 442, 362, 361, 367, 374, 356, 360, 363, 373, 382, 377, 356, 432, 383, - 365, 377, 372, 355, 412, 372, 352, 378, 368, 367, 366, 371, 360, 362, 358, 374, 364, 369, 360, 391, - 389, 408, 387, 360, 391, 367, 362, 439, 361, 354, 362, 370, 372, 488, 354, 365, 371, 369, 364, 382, - 367, 362, 369, 368, 372, 378, 380, 374, 371, 380, 415, 363, 362, 412, 398, 383, 390, 362, 366, 345, - 346, 356, 354, 359, 346, 358, 359, 405, 369, 368, 360, 362, 392, 511, 405, 380, 401, 355, 338, 365, - 341, 358, 347, 351, 346, 351, 343, 350, 433, 354, 353, 364, 437, 355, 373, 371, 355, 415, 350, 350, - 349, 366, 367, 392, 389, 360, 355, 355, 356, 364, 362, 366, 441, 360, 366, 374, 371, 400, 364, 357, - 351, 390, 371, 360, 357, 363, 353, 443, 367, 370, 385, 370, 381, 373, 372, 377, 382, 377, 374, 374, - 372, 368, 377, 377, 400, 366, 366, 378, 372, 362, 385, 357, 364, 360, 358, 374, 378, 360, 380, 414, - 369, 375, 395, 352, 373, 367, 342, 403, 373, 364, 375, 354, 353, 375, 388, 347, 349, 353, 356, 362, - 354, 356, 380, 354, 362, 450, 396, 360, 367, 361, 369, 348, 355, 367, 369, 367, 487, 356, 359, 379, - 359, 380, 380, 383, 373, 400, 426, 391, 372, 362, 368, 380, 389, 352, 382, 421, 343, 356, 387, 350, - 382, 370, 359, 352, 353, 357, 378, 360, 353, 353, 366, 373, 381, 374, 373, 365, 369, 369, 399, 373, - 370, 370, 356, 391, 434, 366, 363, 354, 367, 443, 338, 356, 435, 339, 361, 359, 353, 355, 369, 350, - 364, 427, 362, 364, 396, 347, 345, 373, 361, 372, 363, 389, 363, 375, 360, 365, 381, 361, 363, 379, - 378, 359, 367, 445, 355, 369, 366, 351, 350, 360, 435, 359, 387, 371, 376, 376, 370, 354, 360, 419, - 353, 361, 361, 370, 367, 398, 371, 362, 432, 368, 365, 366, 364, 372, 411, 365, 390, 355, 355, 361, - 365, 365, 359, 386, 368, 361, 461, 352, 356, 365, 389, 372, 392, 359, 359, 374, 351, 373, 422, 360, - 363, 352, 362, 383, 355, 362, 367, 482, 349, 361, 368, 356, 365, 349, 356, 511, 358, 357, 375, 349, - 362, 411, 346, 370, 375, 375, 377, 376, 369, 362, 411, 362, 399, 352, 366, 373, 372, 373, 406, 359, - 365, 408, 354, 369, 403, 348, 349, 361, 356, 365, 362, 350, 422, 381, 358, 383, 473, 347, 349, 358, - 370, 367, 408, 348, 345, 406, 353, 377, 350, 338, 342, 341, 346, 386, 365, 353, 359, 369, 363, 366, - 373, 374, 367, 364, 370, 391, 373, 373, 378, 375, 377, 391, 362, 361, 361, 368, 372, 378, 374, 367, - 384, 365, 371, 364, 366, 375, 370, 379, 409, 380, 378, 370, 370, 373, 394, 362, 355, 364, 361, 367, - 413, 376, 360, 370, 367, 358, 384, 365, 361, 383, 366, 368, 386, 381, 372, 369, 368, 378, 416, 362]; - const HE_AAC_1_32000 = - [0, 279, 279, 340, 324, 311, 349, 297, 244, 271, 275, 272, 274, 289, 278, 298, 274, 302, 318, 251, 253, - 262, 266, 276, 270, 280, 284, 286, 285, 324, 307, 242, 257, 274, 290, 262, 269, 289, 297, 261, 283, - 274, 277, 281, 280, 276, 276, 275, 297, 331, 266, 262, 264, 268, 269, 287, 280, 336, 261, 278, 276, - 301, 254, 261, 257, 268, 282, 282, 308, 326, 256, 265, 261, 271, 277, 285, 276, 282, 279, 282, 317, - 286, 268, 266, 272, 275, 287, 264, 271, 286, 290, 270, 301, 285, 282, 278, 329, 266, 263, 252, 327, - 254, 246, 257, 292, 260, 267, 282, 291, 272, 278, 305, 296, 269, 278, 308, 300, 264, 265, 263, 263, - 272, 278, 311, 279, 271, 273, 306, 262, 267, 280, 325, 333, 305, 281, 280, 245, 244, 308, 305, 256, - 241, 266, 259, 278, 274, 274, 274, 294, 302, 271, 271, 278, 261, 269, 297, 317, 270, 271, 273, 268, - 270, 256, 320, 269, 278, 281, 283, 275, 279, 277, 289, 307, 283, 266, 261, 311, 269, 252, 326, 277, - 271, 275, 292, 279, 273, 294, 253, 253, 272, 269, 271, 280, 275, 290, 277, 268, 278, 280, 284, 330, - 300, 273, 265, 262, 322, 298, 250, 265, 266, 315, 272, 265, 268, 284, 269, 275, 289, 288, 268, 279, - 281, 280, 277, 269, 277, 272, 279, 280, 261, 288, 294, 285, 264, 276, 265, 314, 273, 274, 297, 270, - 277, 271, 279, 267, 286, 289, 283, 288, 263, 284, 283, 270, 287, 283, 276, 332, 261, 271, 278, 279, - 274, 316, 258, 270, 255, 270, 271, 351, 259, 263, 271, 316, 270, 263, 285, 274, 281, 273, 278, 281, - 268, 275, 273, 299, 306, 291, 283, 306, 259, 257, 274, 277, 268, 275, 290, 315, 270, 276, 266, 274, - 254, 278, 326, 287, 265, 271, 266, 281, 287, 268, 298, 269, 254, 268, 270, 283, 282, 278, 277, 272, - 273, 283, 285, 274, 295, 296, 276, 265, 273, 282, 333, 281, 267, 265, 273, 279, 273, 273, 279, 304, - 269, 300, 315, 266, 268, 266, 272, 270, 271, 294, 279, 273, 273, 273, 261, 297, 336, 283, 283, 267, - 264, 315, 267, 262, 256, 278, 274, 278, 272, 266, 272, 273, 275, 277, 278, 288, 284, 297, 267, 269, - 329, 316, 261, 264, 268, 266, 275, 278, 283, 268, 265, 271, 296, 282, 284, 274, 258, 338, 271, 270, - 268, 275, 270, 288, 303, 290, 271, 260, 281, 268, 279, 291, 311, 253, 283, 270, 292, 289, 280, 273, - 287, 257, 272, 273, 315, 256, 269, 279, 330, 261, 272, 257, 286, 314, 267, 294, 308, 262, 261, 254, - 273, 273, 280, 322, 286, 261, 267, 276, 281, 277, 273, 284, 285, 275, 275, 281, 271, 281, 278, 283, - 289, 302, 281, 295, 275, 273, 323, 296, 263, 284, 286, 284, 280, 277, 287, 274, 268, 265, 263, 255, - 274, 265, 268, 275, 271, 271, 289, 275, 274, 312, 292, 268, 278, 280, 275, 334, 274, 291, 336, 254, - 279, 286, 279, 247, 258, 309, 269, 249, 266, 260, 262, 262, 275, 267, 272, 277, 279, 307, 264, 267, - 295, 304, 318, 262, 272, 272, 270, 286, 273, 318, 262, 263, 264, 290, 266, 283, 303, 309, 275, 269, - 271, 294, 264, 277, 269, 286, 275, 266, 278, 326, 261, 269, 291, 260, 285, 265, 272, 276, 281, 298, - 269, 281, 281, 269, 270, 274, 308, 271, 293, 333, 248, 283, 263, 266, 278, 276, 292, 275, 270, 269, - 282, 279, 277, 292, 291, 269, 288, 274, 282, 271, 282, 293, 323, 250, 287, 276, 314, 283, 258, 281, - 283, 276, 289, 297, 306, 287, 254, 286, 268, 271, 271, 271, 282, 275, 259, 308, 273, 266, 265, 269, - 263, 261, 330, 293, 260, 274, 274, 266, 270, 286, 285, 278, 272, 266, 281, 274, 269, 276, 277, 276, - 279, 296, 290, 263, 279, 271, 337, 300, 282, 262, 271, 272, 262, 267, 269, 275, 279, 279, 280, 272, - 283, 383, 254, 256, 275, 275, 270, 275, 269, 283, 281, 281, 310, 300, 301, 304, 259, 257, 260, 258, - 269, 276, 268, 275, 293, 299, 323, 297, 261, 278, 296, 281, 263, 310, 286, 255, 281, 265, 268, 265, - 274, 287, 264, 273, 261, 282, 283, 276, 287, 275, 273, 285, 278, 270, 270, 281, 283, 304, 267, 265, - 280, 303, 289, 267, 304, 312, 263, 269, 268, 258, 257, 300, 279, 257, 269, 297, 329, 258, 261, 270, - 267, 276, 295, 308, 286, 265, 269, 321, 312, 247, 259, 313, 310, 254, 259, 270, 278, 271, 267, 273, - 289, 286, 266, 268, 271, 278, 280, 296, 271, 265, 273, 283, 280, 275, 281, 281, 279, 331, 251, 277]; - const HE_AAC_2_32000 = - [0, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, 1024, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1023, - 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1023, 1024, 1048, 1001, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1071, 977, 1024, 1024, 1024, 1024, 1024, 1024, - 1024, 1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024]; - const HE_AAC_1_44100 = - [0, 279, 279, 356, 328, 314, 313, 292, 375, 243, 248, 252, 268, 270, 283, 276, 286, 288, 274, 274, 283, - 271, 273, 296, 325, 257, 254, 277, 276, 275, 265, 287, 276, 279, 269, 285, 286, 276, 287, 296, 320, - 261, 268, 261, 275, 271, 279, 278, 286, 280, 264, 299, 266, 286, 271, 270, 280, 273, 288, 293, 278, - 287, 280, 284, 269, 271, 290, 326, 251, 268, 276, 277, 284, 272, 265, 288, 284, 286, 312, 273, 281, - 268, 263, 321, 253, 270, 281, 280, 268, 274, 269, 278, 282, 296, 333, 250, 267, 261, 283, 266, 280, - 282, 280, 275, 271, 275, 278, 279, 280, 293, 336, 259, 270, 269, 275, 271, 270, 279, 284, 283, 290, - 286, 272, 280, 286, 277, 294, 288, 292, 249, 285, 313, 288, 259, 264, 269, 263, 317, 267, 272, 266, - 273, 280, 265, 282, 270, 284, 269, 298, 263, 273, 282, 278, 338, 266, 267, 263, 284, 311, 274, 273, - 275, 257, 281, 274, 259, 275, 274, 280, 306, 293, 285, 282, 280, 297, 315, 277, 256, 282, 289, 308, - 313, 305, 277, 275, 257, 259, 251, 266, 274, 316, 291, 247, 254, 267, 279, 267, 272, 273, 279, 277, - 272, 266, 291, 340, 277, 267, 273, 276, 275, 273, 275, 278, 276, 294, 286, 273, 275, 280, 272, 269, - 268, 275, 343, 256, 279, 280, 285, 281, 267, 277, 276, 277, 273, 283, 280, 318, 276, 272, 268, 266, - 264, 323, 276, 256, 273, 298, 258, 273, 272, 291, 272, 300, 279, 273, 282, 278, 269, 272, 280, 271, - 287, 273, 274, 287, 277, 276, 261, 276, 273, 279, 291, 272, 287, 304, 329, 307, 261, 283, 247, 257, - 297, 316, 291, 255, 267, 269, 278, 318, 276, 265, 274, 267, 319, 269, 285, 260, 275, 257, 320, 256, - 273, 271, 271, 282, 275, 275, 273, 271, 284, 268, 274, 268, 278, 276, 273, 297, 284, 285, 287, 272, - 275, 283, 280, 309, 325, 256, 269, 274, 294, 277, 283, 275, 275, 277, 273, 273, 270, 275, 273, 278, - 290, 278, 284, 279, 274, 281, 265, 291, 274, 280, 303, 322, 266, 271, 283, 270, 271, 263, 284, 322, - 326, 249, 255, 263, 279, 275, 284, 315, 262, 254, 271, 271, 274, 321, 279, 265, 273, 276, 272, 277, - 282, 280, 280, 270, 304, 272, 271, 280, 283, 290, 266, 335, 289, 256, 282, 310, 262, 258, 259, 274, - 271, 261, 298, 293, 273, 291, 314, 276, 273, 271, 268, 297, 259, 253, 264, 301, 330, 262, 278, 268, - 262, 269, 283, 277, 272, 284, 285, 284, 273, 260, 271, 278, 276, 272, 275, 282, 281, 285, 271, 275, - 282, 282, 277, 275, 280, 278, 296, 312, 291, 277, 257, 268, 269, 307, 320, 271, 260, 274, 281, 267, - 274, 289, 282, 277, 265, 261, 315, 282, 281, 274, 315, 298, 267, 266, 270, 258, 270, 278, 273, 266, - 286, 264, 283, 287, 273, 284, 271, 267, 280, 333, 329, 295, 282, 276, 264, 261, 256, 320, 255, 271, - 267, 264, 267, 267, 272, 284, 271, 277, 282, 294, 286, 269, 278, 276, 269, 284, 289, 283, 271, 313, - 281, 271, 267, 290, 335, 260, 269, 263, 271, 286, 265, 277, 282, 283, 270, 293, 266, 268, 269, 282, - 286, 277, 272, 288, 274, 281, 322, 278, 274, 274, 266, 270, 291, 266, 280, 292, 289, 331, 269, 267, - 272, 277, 266, 264, 274, 278, 286, 294, 269, 271, 301, 291, 282, 270, 282, 275, 270, 260, 278, 274, - 271, 272, 274, 283, 281, 298, 283, 284, 272, 299, 284, 271, 277, 281, 319, 259, 281, 279, 275, 270, - 274, 268, 280, 267, 266, 273, 288, 271, 274, 290, 348, 275, 269, 269, 278, 266, 284, 281, 289, 268, - 280, 281, 275, 288, 269, 288, 283, 287, 271, 272, 274, 303, 276, 274, 280, 290, 289, 268, 285, 276, - 285, 268, 317, 287, 252, 272, 277, 274, 287, 266, 276, 280, 278, 288, 271, 277, 270, 259, 268, 279, - 278, 274, 276, 266, 281, 282, 280, 286, 275, 282, 279, 289, 283, 289, 302, 274, 291, 271, 271, 270, - 278, 322, 318, 252, 273, 342, 298, 239, 263, 275, 279, 290, 270, 265, 258, 298, 322, 264, 257, 260, - 276, 266, 271, 280, 265, 287, 277, 289, 262, 278, 280, 279, 358, 253, 264, 263, 276, 328, 271, 266, - 276, 264, 287, 260, 269, 271, 279, 280, 265, 329, 272, 279, 273, 273, 300, 262, 280, 288, 292, 299, - 288, 285, 262, 262, 277, 277, 275, 266, 275, 269, 269, 297, 283, 272, 270, 263, 339, 264, 271, 279, - 306, 264, 289, 274, 271, 269, 297, 279, 280, 279, 296, 272, 264, 296, 273, 267, 276, 278, 278, 294]; - const HE_AAC_2_44100 = - [0, 742, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 780, 707, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 742, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 846, 690, 742, 710, 727, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 802, 731, 696, 743, 743, 743, - 743, 743, 743, 743, 743, 760, 726, 743, 743, 743, 743, 743, 743, 895, 685, - 690, 725, 720, 743, 743, 743, 743, 743, 743, 743, 743, 839, 688, 702, 743, - 743, 743, 910, 709, 719, 717, 796, 691, 680, 722, 743, 743, 743, 743, 742, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 833, 751, 728, 706, 697, 743, 743, 825, 786, 660, - 701, 743, 743, 743, 743, 743, 743, 743, 850, 733, 752, 726, 710, 703, 886, - 696, 677, 697, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 824, 666, 739, 743, 754, - 732, 762, 724, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 787, 724, 718, 743, 743, 743, 743, 743, - 800, 994, 626, 666, 684, 688, 743, 743, 852, 695, 682, 743, 743, 743, 830, - 710, 689, 743, 743, 743, 743, 742, 743, 743, 743, 745, 741, 743, 743, 743, - 743, 743, 862, 790, 645, 719, 895, 695, 739, 692, 650, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 967, 646, 690, - 669, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 791, 752]; - const HE_AAC_1_48000 = - [0, 279, 279, 354, 333, 317, 301, 298, 346, 284, 270, 240, 268, 285, 269, 267, 270, 269, 282, 275, 279, - 279, 268, 282, 283, 340, 316, 251, 261, 264, 261, 268, 270, 288, 279, 276, 275, 271, 273, 298, 275, - 281, 283, 317, 268, 269, 267, 264, 298, 280, 269, 277, 278, 279, 285, 282, 270, 290, 282, 271, 290, - 284, 272, 272, 268, 278, 284, 283, 275, 279, 280, 284, 317, 320, 257, 261, 255, 281, 270, 275, 284, - 277, 277, 277, 304, 294, 276, 266, 273, 267, 321, 268, 256, 272, 276, 270, 278, 270, 277, 286, 278, - 282, 339, 257, 262, 279, 271, 268, 268, 271, 275, 277, 285, 280, 277, 288, 271, 285, 303, 305, 322, - 260, 261, 269, 278, 273, 259, 272, 284, 278, 291, 270, 284, 281, 281, 285, 276, 322, 293, 293, 248, - 297, 285, 313, 250, 259, 253, 282, 270, 322, 249, 275, 262, 279, 277, 288, 268, 268, 271, 272, 290, - 290, 279, 265, 274, 274, 313, 262, 275, 278, 279, 268, 318, 273, 274, 291, 272, 278, 257, 268, 272, - 279, 285, 272, 306, 283, 302, 276, 266, 291, 308, 286, 263, 268, 283, 326, 315, 309, 285, 280, 269, - 274, 266, 254, 265, 285, 283, 309, 254, 256, 257, 261, 267, 271, 282, 275, 275, 288, 276, 269, 272, - 295, 309, 273, 270, 277, 280, 275, 273, 282, 271, 270, 281, 333, 279, 269, 270, 290, 263, 270, 275, - 279, 303, 331, 244, 269, 281, 276, 269, 273, 281, 278, 275, 273, 279, 273, 326, 276, 279, 276, 259, - 273, 268, 333, 292, 260, 257, 266, 288, 266, 283, 281, 287, 268, 288, 279, 273, 283, 280, 275, 270, - 269, 278, 280, 281, 278, 283, 286, 272, 270, 274, 273, 263, 279, 277, 285, 272, 277, 308, 341, 297, - 278, 256, 274, 250, 266, 318, 356, 253, 255, 265, 278, 265, 295, 297, 273, 258, 274, 285, 323, 265, - 268, 264, 265, 263, 302, 277, 277, 274, 268, 270, 277, 275, 277, 274, 277, 275, 281, 279, 283, 274, - 274, 283, 286, 280, 282, 278, 282, 280, 279, 278, 292, 283, 326, 291, 320, 249, 258, 284, 272, 278, - 263, 270, 271, 272, 278, 278, 281, 277, 280, 275, 279, 280, 280, 283, 286, 283, 275, 284, 287, 275, - 271, 306, 313, 271, 270, 285, 264, 277, 261, 260, 285, 333, 304, 274, 281, 258, 265, 266, 284, 312, - 288, 258, 263, 280, 270, 264, 334, 266, 269, 280, 283, 270, 268, 273, 276, 295, 272, 270, 299, 280, - 279, 277, 271, 274, 309, 286, 310, 270, 264, 272, 299, 255, 265, 263, 275, 285, 268, 270, 297, 282, - 289, 294, 320, 264, 273, 275, 269, 284, 267, 258, 272, 272, 325, 292, 278, 259, 285, 272, 270, 274, - 295, 290, 274, 272, 281, 267, 286, 252, 264, 272, 273, 276, 273, 280, 281, 281, 280, 271, 274, 280, - 291, 278, 273, 275, 281, 277, 325, 298, 269, 267, 266, 279, 265, 308, 331, 265, 265, 266, 279, 276, - 270, 283, 282, 272, 273, 267, 273, 317, 278, 274, 269, 295, 301, 273, 280, 271, 268, 274, 273, 283, - 271, 272, 270, 300, 270, 283, 279, 275, 285, 269, 270, 271, 331, 321, 303, 287, 269, 260, 260, 258, - 267, 322, 275, 265, 263, 267, 277, 268, 274, 274, 277, 284, 277, 275, 289, 271, 276, 279, 284, 283, - 289, 274, 281, 277, 280, 320, 280, 271, 283, 279, 320, 293, 259, 266, 263, 269, 273, 267, 276, 276, - 283, 271, 293, 276, 268, 272, 275, 291, 291, 290, 273, 294, 260, 274, 356, 263, 274, 269, 268, 253, - 314, 264, 268, 281, 273, 271, 328, 276, 274, 261, 271, 287, 327, 261, 261, 274, 289, 294, 297, 270, - 277, 270, 270, 274, 276, 286, 280, 269, 261, 277, 267, 272, 271, 266, 270, 332, 272, 271, 280, 277, - 278, 306, 275, 277, 284, 278, 289, 284, 300, 284, 269, 275, 279, 297, 262, 271, 277, 265, 279, 290, - 270, 272, 275, 281, 391, 279, 242, 261, 272, 273, 267, 273, 284, 273, 268, 281, 280, 276, 282, 277, - 280, 279, 286, 276, 279, 295, 282, 284, 282, 271, 282, 288, 279, 273, 287, 275, 278, 274, 290, 292, - 276, 265, 256, 276, 268, 287, 286, 280, 275, 282, 280, 278, 273, 270, 266, 279, 277, 270, 275, 273, - 286, 267, 282, 273, 279, 276, 277, 283, 288, 287, 280, 290, 286, 289, 303, 276, 274, 278, 278, 272, - 277, 314, 318, 251, 257, 264, 325, 263, 265, 264, 281, 270, 305, 275, 275, 256, 268, 340, 264, 269, - 279, 270, 272, 279, 279, 276, 276, 279, 279, 281, 284, 268, 281, 265, 287, 355, 254, 260, 255, 267]; - const HE_AAC_2_48000 = - [0, 682, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, - 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, - 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, - 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, - 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, - 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, - 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, - 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, - 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 682, 683, - 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, - 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, - 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, - 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, - 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, - 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, 683, 684, 682, - 683, 683, 682, 683, 682, 683, 683, 682, 685, 681, 682, 683, 682, 683, 683, - 682, 683, 709, 700, 686, 664, 700, 643, 676, 683, 683, 682, 683, 682, 683, - 683, 754, 690, 652, 672, 662, 665, 683, 837, 687, 637, 651, 654, 667, 666, - 662, 683, 682, 685, 738, 698, 679, 695, 690, 661, 661, 665, 665, 700, 673, - 681, 700, 701, 693, 689, 695, 682, 665, 667, 662, 656, 682, 683, 692, 785, - 757, 652, 648, 675, 648, 662, 760, 785, 612, 634, 623, 624, 682, 683, 737, - 661, 672, 660, 683, 735, 671, 692, 673, 685, 672, 732, 667, 658, 646, 678, - 682, 689, 696, 680, 666, 683, 684, 693, 686, 667, 683, 682, 683, 683, 682, - 683, 682, 683, 683, 682, 683, 683, 682, 759, 729, 664, 670, 676, 735, 662, - 738, 632, 665, 635, 635, 674, 683, 683, 682, 683, 682, 685, 681, 682, 683, - 683, 682, 683, 682, 683, 683, 682, 690, 785, 658, 680, 709, 688, 681, 676, - 640, 619, 833, 721, 637, 660, 674, 648, 606, 682, 745, 730, 665, 636, 638, - 682, 683, 798, 686, 682, 659, 657, 639, 659, 681, 682, 683, 683, 682, 745, - 636, 667, 683, 682, 683, 733, 709, 939, 604, 625, 660, 730, 622, 657, 652, - 643, 618, 682, 683, 682, 683, 683, 682, 759, 661, 640, 671, 682, 713, 674, - 664, 680, 683, 748, 771, 633, 642, 619, 682, 683, 683, 695, 672, 680, 683, - 683, 692, 693, 663, 682, 683, 688, 682, 700, 688, 685, 696, 702, 676, 686, - 670, 651, 667, 683, 683, 682, 683, 776, 739, 653, 657, 675, 671, 670, 807, - 673, 636, 675, 657, 678, 686, 669, 693, 682, 681, 658, 631, 679, 769, 705, - 676, 668, 706, 742, 621, 659, 654, 641, 685, 664, 692, 664, 682, 683, 703, - 670, 675, 682, 683, 683, 682, 683, 682, 710, 761, 725, 704, 685, 671, 645, - 659, 653, 785, 643, 663, 674, 667, 684, 664, 681, 696, 670, 686, 675, 679, - 656, 684, 676, 665, 683, 686, 703, 677, 687, 686, 686, 774, 654, 622, 680, - 700, 713, 709, 644, 677, 686, 679, 686, 669, 691, 655, 674, 694, 733, 663, - 674, 674, 677, 729, 668, 770, 643, 674, 677, 660, 776, 621, 648, 643, 630, - 691, 806, 659, 658, 687, 714, 680, 822, 634, 620, 635, 670, 671, 763, 635, - 599, 661, 683, 708, 728, 676, 705, 674, 670, 680, 688, 706, 689, 693, 665, - 719, 668, 657, 666, 667, 676, 863, 624, 634, 630, 637, 659, 721, 654, 673, - 683, 683, 726, 689, 746, 756, 622, 683, 724, 700, 646, 648, 594, 665, 685, - 739, 616, 683, 682, 689, 810, 734, 680, 653, 630, 615, 650, 683, 682, 683, - 683, 682, 683, 683, 682, 683, 682, 683, 683, 682, 683, 683, 682, 683, 682, - 683, 683, 682, 683, 683, 682, 683, 682, 683, 683, 692, 690, 666, 682, 683, - 682, 683, 683, 682, 683, 700, 703, 689, 688, 672, 690, 683, 691, 676, 663]; - const HE_AAC_1_64000 = - [0, 279, 279, 279, 284, 282, 281, 292, 286, 282, 357, 304, 292, 299, 268, 279, 272, 283, 274, 271, 268, - 288, 257, 289, 285, 277, 280, 285, 278, 290, 278, 287, 277, 329, 307, 257, 255, 264, 275, 266, 276, - 271, 272, 269, 270, 280, 286, 274, 284, 277, 286, 274, 280, 287, 278, 284, 285, 330, 283, 283, 283, - 290, 274, 276, 289, 274, 278, 274, 276, 272, 277, 292, 271, 272, 271, 274, 271, 262, 271, 282, 274, - 283, 285, 284, 277, 286, 276, 287, 288, 271, 280, 276, 286, 288, 281, 274, 318, 267, 270, 267, 271, - 275, 267, 269, 276, 279, 278, 272, 291, 262, 278, 291, 324, 284, 289, 281, 283, 273, 282, 305, 301, - 270, 255, 271, 266, 268, 271, 279, 286, 289, 275, 264, 278, 280, 279, 311, 272, 270, 271, 276, 274, - 282, 274, 282, 277, 275, 293, 280, 282, 275, 282, 273, 275, 279, 278, 284, 276, 281, 311, 316, 263, - 258, 263, 262, 275, 273, 276, 271, 306, 278, 283, 281, 282, 286, 289, 283, 273, 277, 278, 275, 283, - 277, 307, 282, 251, 300, 251, 270, 263, 301, 321, 257, 274, 279, 276, 268, 281, 300, 312, 254, 263, - 270, 262, 280, 275, 281, 281, 268, 273, 281, 278, 278, 280, 296, 282, 278, 277, 282, 273, 270, 284, - 333, 281, 276, 273, 276, 290, 289, 269, 317, 260, 280, 283, 276, 262, 289, 275, 269, 269, 275, 274, - 273, 286, 284, 287, 307, 297, 280, 286, 258, 271, 263, 298, 294, 268, 276, 275, 269, 269, 292, 317, - 297, 283, 275, 271, 265, 264, 260, 265, 277, 265, 261, 272, 271, 277, 327, 264, 261, 266, 269, 274, - 278, 276, 282, 279, 279, 275, 275, 276, 278, 274, 277, 280, 274, 304, 303, 278, 273, 278, 273, 284, - 279, 277, 274, 274, 286, 271, 271, 284, 278, 340, 268, 271, 272, 268, 278, 277, 272, 283, 284, 271, - 286, 332, 314, 265, 259, 263, 268, 272, 282, 275, 281, 269, 283, 272, 267, 280, 278, 276, 279, 289, - 338, 278, 271, 265, 266, 269, 278, 274, 270, 330, 322, 268, 262, 259, 269, 288, 267, 263, 287, 289, - 287, 287, 286, 293, 294, 270, 272, 266, 271, 280, 279, 265, 269, 270, 275, 279, 279, 276, 280, 273, - 277, 281, 274, 272, 283, 276, 277, 282, 281, 279, 276, 282, 279, 282, 288, 284, 309, 310, 290, 267, - 270, 261, 271, 273, 270, 272, 287, 327, 314, 255, 258, 265, 284, 277, 273, 279, 307, 269, 272, 270, - 272, 271, 285, 316, 282, 263, 283, 268, 275, 268, 278, 273, 277, 274, 288, 266, 277, 276, 279, 291, - 281, 270, 279, 271, 268, 280, 283, 292, 270, 274, 275, 276, 283, 283, 284, 282, 284, 279, 274, 283, - 277, 277, 277, 285, 275, 270, 280, 288, 279, 315, 334, 332, 253, 258, 266, 257, 279, 274, 280, 274, - 268, 271, 278, 270, 270, 274, 286, 290, 273, 271, 282, 272, 276, 274, 278, 273, 287, 273, 283, 273, - 279, 273, 280, 286, 286, 279, 277, 287, 298, 330, 269, 268, 280, 288, 276, 277, 273, 278, 269, 284, - 279, 294, 337, 266, 261, 270, 262, 264, 276, 281, 280, 275, 332, 259, 268, 263, 277, 279, 277, 285, - 279, 314, 271, 268, 265, 278, 283, 275, 280, 279, 278, 288, 282, 282, 285, 275, 283, 280, 279, 283, - 286, 275, 272, 285, 302, 299, 258, 321, 283, 277, 263, 263, 316, 288, 258, 259, 257, 264, 270, 289, - 293, 281, 277, 297, 287, 276, 273, 278, 276, 314, 259, 271, 264, 274, 276, 271, 285, 268, 260, 272, - 281, 274, 292, 328, 263, 274, 272, 273, 291, 282, 289, 277, 283, 272, 279, 268, 274, 275, 274, 291, - 273, 271, 267, 278, 278, 274, 276, 267, 279, 283, 285, 275, 281, 274, 280, 266, 283, 282, 284, 274, - 273, 282, 285, 280, 276, 277, 277, 303, 296, 271, 272, 266, 270, 278, 271, 283, 271, 310, 338, 265, - 262, 269, 268, 272, 271, 282, 271, 281, 286, 288, 279, 280, 277, 278, 273, 289, 303, 270, 272, 274, - 280, 283, 293, 277, 270, 284, 275, 275, 276, 282, 285, 299, 277, 267, 273, 280, 270, 288, 271, 281, - 286, 281, 290, 281, 284, 280, 281, 283, 287, 306, 311, 287, 289, 284, 273, 266, 269, 263, 262, 267, - 293, 308, 255, 261, 262, 264, 275, 280, 291, 269, 274, 275, 270, 274, 291, 275, 269, 273, 284, 283, - 284, 275, 277, 279, 279, 275, 288, 286, 275, 280, 284, 277, 291, 321, 277, 266, 287, 276, 261, 306, - 325, 289, 257, 258, 264, 267, 273, 276, 268, 277, 277, 289, 273, 280, 276, 284, 292, 283, 273, 265]; - const HE_AAC_2_64000 = - [0, 372, 372, 373, 372, 372, 373, 372, 372, 373, 377, 368, 373, 372, 373, 372, 372, 373, 372, 372, 373, - 372, 372, 373, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 460, 332, 342, 356, 372, 373, 372, - 372, 373, 372, 372, 373, 372, 372, 373, 372, 373, 372, 372, 373, 372, 372, 373, 419, 348, 350, 372, - 372, 373, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 391, 354, 373, 372, 372, 373, 372, 372, - 373, 372, 372, 373, 372, 372, 373, 372, 373, 372, 372, 373, 372, 372, 373, 467, 375, 315, 332, 373, - 372, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 431, 330, 357, 372, 372, 373, 372, 390, 412, - 338, 349, 373, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 373, 413, 370, 351, 356, 372, 372, - 372, 373, 372, 372, 373, 372, 372, 373, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 437, 354, - 331, 368, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 373, 372, 373, 372, 372, 373, 372, 372, - 373, 372, 372, 373, 372, 372, 373, 372, 373, 416, 359, 342, 372, 372, 373, 372, 372, 497, 352, 345, - 348, 362, 337, 366, 372, 373, 372, 372, 373, 372, 372, 373, 375, 373, 369, 372, 373, 372, 372, 373, - 413, 335, 369, 372, 373, 372, 372, 373, 426, 342, 349, 372, 372, 373, 372, 372, 373, 372, 373, 372, - 372, 373, 372, 372, 373, 372, 372, 373, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 373, 395, - 448, 428, 421, 408, 389, 382, 365, 362, 370, 351, 337, 358, 349, 363, 424, 372, 362, 367, 363, 371, - 376, 377, 368, 366, 365, 359, 363, 359, 365, 358, 382, 362, 363, 393, 403, 371, 378, 377, 381, 385, - 378, 377, 372, 368, 371, 351, 359, 367, 356, 415, 378, 379, 381, 375, 382, 375, 369, 368, 376, 360, - 375, 422, 434, 359, 358, 356, 356, 376, 377, 376, 373, 374, 374, 367, 366, 376, 362, 362, 350, 366, - 400, 383, 372, 365, 370, 362, 361, 367, 359, 425, 414, 364, 361, 361, 367, 382, 359, 350, 397, 389, - 387, 369, 380, 400, 394, 374, 362, 351, 366, 374, 361, 353, 361, 363, 366, 371, 369, 373, 371, 366, - 371, 376, 364, 364, 377, 357, 368, 372, 374, 365, 366, 380, 370, 378, 384, 382, 409, 426, 400, 364, - 365, 356, 357, 359, 357, 358, 389, 427, 419, 342, 349, 359, 365, 367, 360, 358, 396, 365, 376, 366, - 367, 357, 377, 422, 382, 349, 380, 358, 367, 361, 356, 455, 350, 363, 376, 362, 368, 366, 365, 367, - 366, 365, 366, 364, 363, 370, 371, 377, 361, 370, 366, 363, 365, 367, 377, 360, 370, 368, 359, 365, - 364, 369, 369, 371, 364, 374, 368, 383, 372, 421, 427, 460, 348, 358, 365, 385, 366, 372, 364, 420, - 357, 358, 368, 359, 361, 367, 371, 380, 367, 360, 371, 360, 362, 362, 370, 365, 376, 370, 366, 367, - 366, 366, 372, 372, 374, 378, 370, 378, 408, 434, 367, 367, 377, 379, 374, 372, 368, 371, 357, 379, - 360, 394, 426, 350, 350, 371, 352, 351, 367, 366, 368, 365, 429, 358, 364, 355, 358, 362, 371, 369, - 370, 417, 371, 366, 371, 370, 377, 366, 378, 367, 380, 379, 368, 382, 378, 381, 373, 377, 381, 387, - 385, 382, 370, 368, 382, 388, 367, 410, 381, 379, 346, 353, 423, 385, 342, 345, 361, 349, 365, 385, - 379, 371, 362, 392, 371, 364, 360, 359, 364, 419, 357, 369, 354, 369, 370, 365, 392, 356, 346, 357, - 360, 358, 382, 433, 349, 366, 376, 366, 362, 368, 369, 397, 384, 382, 372, 358, 360, 368, 368, 379, - 360, 371, 360, 367, 374, 366, 359, 365, 366, 368, 372, 368, 374, 373, 365, 369, 374, 363, 375, 357, - 365, 364, 365, 373, 361, 390, 363, 409, 405, 378, 363, 354, 366, 364, 360, 376, 359, 409, 416, 364, - 361, 368, 361, 373, 375, 380, 369, 363, 378, 378, 373, 378, 379, 370, 361, 385, 398, 364, 360, 361, - 374, 372, 400, 368, 374, 375, 366, 371, 371, 366, 389, 389, 378, 361, 363, 370, 367, 383, 373, 374, - 376, 376, 390, 380, 379, 371, 363, 370, 365, 418, 437, 408, 397, 388, 372, 365, 362, 349, 343, 349, - 393, 428, 342, 341, 342, 345, 361, 357, 370, 349, 362, 361, 361, 363, 381, 361, 360, 362, 377, 373, - 378, 368, 372, 368, 375, 363, 381, 380, 370, 371, 375, 367, 394, 433, 374, 364, 377, 381, 353, 413, - 431, 389, 339, 347, 347, 364, 358, 367, 356, 365, 359, 382, 375, 371, 366, 383, 386, 366, 355, 360]; - const HE_AAC_1_88200 = - [0, 279, 279, 279, 326, 326, 336, 316, 306, 307, 294, 285, 288, 282, 277, 252, 251, 258, 265, 307, 256, - 305, 301, 291, 284, 281, 275, 277, 267, 266, 267, 269, 270, 269, 260, 274, 271, 272, 279, 274, 268, - 275, 281, 270, 281, 328, 316, 246, 262, 283, 257, 287, 277, 273, 276, 262, 270, 275, 268, 287, 270, - 278, 272, 270, 270, 271, 293, 286, 290, 285, 283, 290, 277, 289, 275, 278, 287, 299, 330, 271, 268, - 269, 273, 282, 287, 282, 281, 277, 276, 266, 277, 281, 276, 283, 272, 278, 281, 279, 288, 281, 293, - 261, 278, 285, 281, 274, 275, 272, 270, 279, 274, 283, 282, 279, 280, 281, 285, 275, 277, 282, 274, - 277, 276, 278, 277, 272, 290, 285, 293, 280, 274, 285, 315, 257, 250, 271, 265, 279, 279, 264, 275, - 282, 283, 280, 286, 283, 277, 274, 282, 270, 297, 273, 286, 323, 301, 267, 273, 271, 275, 285, 285, - 281, 291, 279, 325, 275, 265, 264, 276, 274, 279, 277, 276, 278, 277, 279, 284, 285, 280, 270, 280, - 278, 277, 275, 278, 309, 320, 259, 267, 264, 277, 269, 280, 268, 278, 271, 277, 277, 283, 278, 285, - 281, 280, 280, 285, 277, 277, 275, 275, 273, 281, 279, 285, 283, 289, 279, 277, 283, 319, 259, 274, - 269, 261, 261, 272, 270, 284, 272, 280, 278, 266, 279, 280, 293, 282, 287, 284, 281, 287, 285, 278, - 271, 281, 282, 280, 278, 279, 289, 277, 269, 286, 257, 266, 301, 306, 288, 288, 284, 280, 266, 289, - 313, 270, 262, 262, 267, 258, 262, 285, 288, 284, 290, 340, 252, 276, 260, 266, 285, 280, 271, 285, - 268, 297, 299, 273, 281, 268, 276, 285, 272, 266, 278, 282, 298, 278, 271, 278, 273, 268, 275, 275, - 274, 281, 288, 322, 267, 282, 274, 279, 275, 284, 292, 277, 279, 280, 325, 270, 266, 269, 275, 259, - 268, 283, 297, 286, 290, 279, 283, 276, 294, 268, 282, 280, 273, 270, 282, 284, 271, 284, 271, 288, - 276, 267, 272, 274, 283, 279, 294, 271, 275, 291, 289, 270, 271, 280, 280, 285, 296, 321, 311, 285, - 281, 260, 256, 267, 258, 272, 267, 273, 275, 287, 286, 271, 279, 278, 282, 278, 300, 327, 260, 260, - 269, 274, 265, 262, 269, 278, 281, 279, 275, 279, 279, 281, 284, 283, 273, 279, 286, 279, 283, 279, - 281, 282, 281, 278, 318, 291, 267, 267, 271, 282, 276, 279, 272, 280, 283, 279, 285, 276, 269, 282, - 281, 284, 277, 274, 279, 320, 316, 266, 263, 270, 275, 272, 278, 263, 273, 269, 285, 278, 278, 266, - 276, 294, 285, 328, 265, 271, 267, 272, 272, 279, 274, 285, 280, 280, 274, 281, 280, 277, 278, 280, - 281, 275, 277, 280, 275, 274, 273, 293, 354, 275, 273, 266, 265, 274, 267, 271, 283, 266, 280, 279, - 301, 325, 318, 258, 256, 258, 262, 260, 274, 282, 274, 275, 275, 287, 293, 286, 283, 285, 286, 284, - 288, 277, 283, 272, 276, 269, 276, 274, 296, 272, 281, 273, 273, 272, 274, 279, 273, 279, 286, 280, - 277, 288, 281, 277, 283, 274, 280, 274, 275, 284, 277, 276, 274, 277, 276, 274, 271, 277, 281, 282, - 287, 274, 287, 280, 290, 294, 303, 308, 283, 268, 267, 271, 272, 272, 274, 267, 278, 268, 279, 267, - 342, 275, 314, 262, 260, 267, 273, 277, 280, 272, 274, 272, 289, 302, 276, 283, 276, 272, 272, 273, - 275, 277, 287, 333, 256, 263, 268, 275, 271, 268, 272, 273, 273, 272, 293, 282, 283, 277, 296, 281, - 271, 271, 280, 277, 282, 284, 279, 280, 276, 280, 274, 274, 285, 281, 287, 282, 274, 280, 279, 274, - 279, 273, 272, 285, 280, 289, 292, 281, 295, 275, 274, 280, 281, 277, 275, 280, 277, 292, 277, 266, - 277, 278, 274, 304, 271, 279, 293, 274, 268, 300, 271, 273, 276, 279, 271, 277, 280, 280, 277, 287, - 275, 291, 268, 274, 283, 274, 278, 278, 287, 294, 295, 293, 281, 270, 270, 281, 273, 281, 273, 275, - 285, 269, 277, 275, 268, 279, 282, 283, 277, 273, 281, 280, 267, 285, 290, 281, 284, 280, 284, 310, - 278, 294, 276, 264, 271, 271, 277, 277, 269, 276, 273, 271, 273, 270, 275, 291, 292, 274, 345, 299, - 273, 262, 268, 272, 265, 279, 276, 280, 275, 269, 294, 286, 289, 299, 268, 268, 271, 271, 282, 280, - 283, 274, 283, 278, 297, 320, 271, 269, 275, 269, 275, 277, 271, 283, 284, 278, 271, 282, 281, 285, - 283, 284, 295, 275, 283, 266, 297, 287, 271, 282, 276, 266, 281, 272, 281, 280, 271, 305, 326, 271]; - const HE_AAC_2_88200 = - [0, 372, 372, 373, 372, 372, 373, 372, 372, 373, 372, 372, 373, 372, 378, 368, 372, 373, 372, 374, 371, - 380, 386, 381, 379, 371, 372, 379, 371, 350, 359, 368, 372, 372, 373, 372, 372, 373, 372, 373, 372, - 372, 373, 372, 372, 391, 480, 347, 346, 381, 338, 394, 376, 375, 356, 362, 338, 357, 372, 392, 376, - 366, 366, 369, 366, 372, 372, 373, 376, 368, 378, 371, 368, 378, 367, 373, 376, 388, 413, 365, 363, - 379, 361, 371, 382, 369, 380, 357, 361, 348, 372, 372, 373, 387, 392, 372, 365, 350, 368, 386, 413, - 338, 383, 342, 381, 385, 372, 351, 372, 373, 372, 373, 372, 373, 372, 372, 372, 373, 372, 372, 373, - 372, 373, 372, 372, 373, 372, 372, 374, 371, 372, 379, 415, 352, 344, 372, 373, 386, 392, 358, 376, - 377, 375, 366, 379, 366, 369, 367, 368, 370, 364, 372, 372, 430, 414, 331, 321, 374, 365, 381, 373, - 385, 383, 388, 455, 389, 350, 342, 347, 392, 396, 381, 377, 379, 382, 364, 390, 348, 386, 334, 374, - 378, 377, 379, 366, 391, 452, 365, 359, 362, 379, 364, 361, 361, 365, 358, 356, 364, 347, 349, 380, - 369, 371, 358, 378, 368, 359, 360, 359, 359, 372, 373, 372, 372, 373, 372, 372, 373, 396, 356, 365, - 372, 373, 372, 372, 373, 378, 366, 380, 365, 373, 372, 372, 373, 372, 372, 373, 383, 365, 374, 374, - 366, 372, 372, 373, 372, 372, 373, 372, 372, 375, 370, 372, 376, 394, 384, 393, 369, 365, 366, 391, - 462, 330, 360, 369, 350, 372, 366, 362, 384, 364, 385, 428, 361, 378, 341, 349, 384, 388, 380, 352, - 380, 396, 408, 363, 376, 346, 365, 398, 365, 355, 377, 374, 413, 368, 337, 371, 367, 324, 371, 366, - 374, 365, 381, 418, 372, 346, 372, 368, 357, 344, 362, 360, 372, 373, 480, 347, 339, 343, 353, 372, - 372, 373, 372, 372, 373, 373, 372, 372, 379, 366, 389, 355, 373, 372, 372, 385, 376, 361, 368, 396, - 355, 378, 360, 374, 371, 372, 393, 373, 369, 386, 388, 363, 373, 370, 376, 384, 409, 450, 422, 410, - 398, 368, 364, 371, 350, 371, 355, 350, 363, 365, 369, 347, 360, 364, 359, 358, 395, 434, 366, 361, - 369, 369, 367, 357, 364, 374, 374, 384, 373, 370, 369, 361, 371, 377, 370, 377, 368, 368, 375, 368, - 373, 373, 372, 369, 428, 412, 365, 373, 365, 375, 370, 374, 366, 370, 374, 371, 375, 372, 370, 380, - 370, 373, 364, 359, 359, 420, 435, 364, 359, 361, 370, 366, 374, 359, 367, 362, 376, 358, 368, 359, - 367, 381, 370, 445, 355, 364, 358, 365, 365, 376, 372, 371, 366, 372, 361, 362, 368, 371, 378, 381, - 372, 374, 365, 371, 365, 369, 362, 370, 441, 384, 378, 371, 364, 365, 366, 374, 378, 358, 360, 372, - 394, 450, 430, 349, 342, 341, 352, 347, 360, 368, 358, 364, 371, 382, 390, 385, 377, 395, 382, 375, - 387, 376, 369, 366, 372, 360, 364, 361, 389, 368, 364, 368, 366, 369, 358, 368, 366, 369, 369, 374, - 371, 374, 373, 381, 372, 368, 368, 366, 370, 377, 364, 365, 366, 370, 370, 366, 365, 366, 377, 367, - 376, 363, 367, 365, 378, 404, 432, 435, 384, 355, 355, 366, 354, 359, 363, 355, 369, 358, 362, 357, - 454, 362, 414, 355, 348, 361, 361, 365, 371, 366, 364, 364, 401, 412, 374, 374, 360, 366, 365, 373, - 364, 373, 385, 436, 354, 352, 353, 350, 352, 351, 358, 357, 359, 363, 413, 375, 370, 369, 388, 372, - 373, 369, 376, 373, 367, 370, 366, 376, 371, 378, 365, 373, 384, 369, 379, 379, 366, 368, 377, 365, - 370, 366, 365, 372, 365, 377, 387, 367, 368, 373, 368, 371, 375, 365, 368, 366, 367, 381, 368, 361, - 368, 367, 360, 399, 370, 390, 403, 365, 374, 388, 370, 372, 373, 373, 370, 384, 374, 376, 374, 395, - 390, 378, 359, 370, 367, 365, 373, 368, 369, 387, 381, 396, 373, 359, 363, 376, 367, 376, 362, 355, - 380, 364, 368, 360, 367, 360, 372, 372, 370, 368, 372, 367, 360, 366, 374, 372, 377, 369, 366, 425, - 377, 403, 368, 363, 357, 364, 372, 378, 359, 365, 362, 368, 366, 358, 361, 378, 374, 368, 460, 417, - 360, 359, 348, 365, 355, 364, 373, 370, 376, 356, 371, 369, 384, 401, 370, 368, 369, 368, 365, 364, - 374, 359, 375, 367, 396, 447, 363, 365, 366, 365, 371, 372, 369, 380, 381, 373, 367, 371, 374, 379, - 381, 388, 387, 368, 380, 362, 399, 389, 366, 374, 380, 366, 381, 365, 362, 365, 369, 402, 432, 369]; - const FLAC_2_96000 = - [0, 2378, 2361, 3098, 3324, 3297, 3232, 3153, 3038, 2952, 2940, 2893, 3194, 3251, 3248, - 3195, 3127, 3081, 3043, 2966, 2919, 3469, 3281, 3430, 3531, 3393, 3284, 3437, 3336, 3255, - 3158, 3068, 2991, 2972, 2936, 2899, 3375, 3317, 3235, 3162, 3072, 3097, 3449, 3264, 3225, - 3542, 3524, 3450, 3296, 3192, 3266, 3460, 3354, 3298, 3214, 3173, 3057, 2985, 2959, 3247, - 3270, 3221, 3196, 3132, 3070, 2996, 2966, 2939, 3001, 2970, 2950, 3227, 3241, 3105, 3449, - 3442, 3330, 3441, 3367, 3329, 3452, 3413, 3409, 3308, 3424, 3553, 3610, 3355, 3411, 3418, - 3348, 3291, 3281, 3229, 3224, 3242, 3170, 3270, 3578, 3846, 3468, 3430, 3631, 4403, 4812, - 5197, 4682, 4905, 4625, 4198, 4685, 5172, 5677, 5212, 4379, 4147, 5076, 5252, 4862, 4360, - 3782, 4844, 4794, 5256, 5102, 4983, 4087, 4465, 5295, 5334, 4373, 7286, 7334, 5638, 5674, - 5332, 5408, 5799, 5802, 6210, 6712, 6591, 6384, 6272, 5908, 5075, 4279, 3847, 3717, 4810, - 5359, 4261, 4001, 5015, 4784, 4170, 5117, 5327, 4584, 5030, 5798, 5286, 5073, 5127, 5051, - 5029, 5303, 4847, 4483, 4082, 3923, 3700, 3586, 3531, 3531, 3794, 4730, 5454, 5489, 5441, - 5354, 5444, 5321, 5215, 4875, 4811, 4474, 4062, 3880, 3614, 3686, 4225, 4726, 4936, 4300, - 4631, 5367, 4967, 4897, 4355, 5242, 4167, 4161, 5383, 5209, 5018, 4956, 4910, 4800, 5652, - 5497, 4247, 4968, 6998, 4772, 5476, 5481, 5613, 5443, 4302, 4153, 4909, 4943, 4730, 4724, - 3837, 6326, 5144, 5466, 5379, 5596, 5643, 6163, 6367, 6307, 6204, 6401, 5899, 5420, 4690, - 4130, 3773, 3657, 4307, 5038, 4539, 4010, 4787, 5817, 5819, 5183, 5744, 5498, 4156, 4334, - 4426, 5329, 5669, 5197, 5289, 5264, 4960, 4566, 4083, 3885, 3579, 4276, 5233, 5010, 4145, - 5143, 5851, 5760, 5590, 5343, 4989, 4631, 5034, 5067, 5015, 5285, 5916, 6476, 5108, 3982, - 5781, 6108, 5735, 5673, 5533, 5412, 5320, 5748, 6211, 4906, 6768, 5057, 5664, 6232, 5443, - 6207, 5755, 6352, 5950, 6268, 5316, 6028, 5815, 5109, 5800, 5873, 5700, 5078, 4705, 4712, - 5567, 5272, 5079, 5298, 4872, 5052, 6238, 5920, 6476, 7549, 5612, 5536, 5971, 5830, 5259, - 5642, 4587, 5574, 5570, 5372, 5269, 5232, 5244, 5253, 5333, 5588, 5563, 5601, 5653, 5458, - 5563, 5622, 5597, 5610, 5583, 5591, 5601, 5607, 5615, 5492, 5553, 5280, 4797, 4291, 4060, - 4038, 4079, 4093, 4002, 3975, 4050, 4084, 4648, 4949, 4988, 4252, 7063, 6748, 5342, 5169, - 5345, 6145, 5204, 5544, 6257, 6242, 6613, 6573, 5994, 5028, 4413, 4253, 4451, 5408, 4778, - 7215, 5709, 6551, 6398, 7119, 6020, 6179, 6532, 6022, 5538, 5987, 5123, 5045, 6389, 6195, - 6245, 5899, 4987, 4694, 5669, 5015, 5490, 5700, 5453, 5518, 6180, 5730, 6171, 6473, 7301, - 7762, 6693, 6880, 6207, 7498, 6854, 6106, 6137, 6252, 6132, 6172, 6201, 6190, 6165, 6138, - 6068, 6008, 5940, 5874, 5888, 6025, 6072, 5944, 5971, 5776, 5624, 5623, 5911, 5973, 5908, - 5422, 4703, 4417, 6301, 4479, 4932, 5214, 4327, 5650, 7001, 4841, 6015, 6025, 6091, 6162, - 5181, 6707, 6621, 6127, 5988, 5967, 6766, 6866, 5885, 5553, 5349, 5131, 4958, 4239, 3794, - 3653, 3727, 3540, 3353, 4547, 5317, 5915, 5938, 5785, 5448, 4651, 4120, 3823, 3570, 3467, - 3706, 5039, 5658, 5688, 5079, 5270, 5659, 5621, 5327, 6490, 4622, 5635, 5385, 5465, 6520, - 6400, 6210, 6187, 5049, 5931, 7130, 6070, 6382, 6523, 7201, 7497, 7081, 7355, 7359, 8373, - 7500, 7137, 7042, 6360, 7315, 7064, 6700, 7159, 7114, 6948, 7071, 7274, 7081, 6884, 6773, - 7117, 7710, 7418, 7132, 7086, 6933, 7198, 6059, 6458, 6522, 5742, 5960, 6530, 6569, 6457, - 6050, 5662, 6239, 6304, 5267, 7822, 6525, 5423, 6785, 7591, 7738, 7346, 6423, 6323, 5854, - 7415, 6267, 6111, 7685, 7143, 6435, 7789, 7901, 6961, 6038, 5440, 6805, 6172, 5951, 6075, - 6641, 5669, 6449, 4600, 5552, 6554, 6187, 7003, 6660, 6493, 5647, 6441, 6738, 5647, 5846, - 5632, 5360, 5228, 5101, 6010, 6599, 5393, 5707, 7191, 7162, 6409, 7282, 5408, 6865, 6877, - 6891, 7066, 7124, 7330, 7895, 7431, 5878, 6921, 6209, 5669, 7144, 6844, 6266, 5997, 7496, - 6893, 6661, 6648, 6283, 7094, 5930, 6471, 6202, 6908, 6726, 7297, 7026, 6970, 5665, 4910, - 5729, 6413, 6818, 6675, 5992, 5527, 6269, 6402, 5415, 6031, 7321, 7056, 6137, 6490, 5366, - 6542, 6757, 6060, 6777, 7031, 7035, 7005, 7047, 6947, 6547, 7146, 6943, 6876, 6867, 6816, - 6572, 7006, 6897, 6746, 6809, 6659, 6576, 6829, 6770, 5937, 5881, 5929, 5812, 5199, 4901, - 4618, 4920, 6129, 4438, 4865, 5603, 6742, 6510, 6190, 5952, 6843, 5796, 4778, 4330, 4746, - 5440, 5145, 5015, 4887, 4616, 4115, 4082, 4156, 4992, 4252, 4127, 4639, 4166, 4199, 5036, - 4918, 4492, 4707, 4239, 4638, 4823, 4408, 4677, 4445, 4283, 4721, 4301, 4132, 4149, 4027, - 4094, 4525, 4281, 4162, 4477, 4276, 4172, 4708, 4610, 4218, 4751, 4025, 4003, 4513, 4250, - 4164, 4022, 4097, 3991, 3774, 3662, 3765, 3830, 4015, 4226, 4992, 4116, 4216, 4632, 4006, - 4519, 4723, 4470, 4464, 4399, 4055, 4820, 4645, 4243, 4595, 4205, 3992, 4481, 4082, 4171, - 4085, 4109, 4687, 5458, 4118, 4790, 5411, 5486, 5259, 5326, 5359, 5444, 4994, 7688, 6537, - 5700, 4801, 4897, 5190, 5128, 5323, 5358, 4841, 4498, 4460, 4458, 4672, 5522, 4539, 4486, - 4923, 4486, 4833, 5521, 4995, 4571, 4606, 4320, 4964, 5030, 4649, 4755, 4474, 4256, 4800, - 4317, 4309, 4367, 4634, 4800, 5545, 4910, 4867, 5114, 4919, 4869, 5297, 4940, 4865, 5155, - 4632, 4678, 4888, 4778, 4827, 4611, 4764, 4522, 4172, 4086, 4181, 4276, 4420, 4979, 5077, - 4682, 4692, 4899, 4615, 4903, 5179, 4914, 4735, 4562, 4310, 4869, 4376, 4167, 4489, 4027, - 4166, 4624, 4249, 4183, 4074, 4150, 4024, 3937, 3871, 3858, 3730, 3650, 3577, 3572, 3476, - 3481, 3359, 3287, 3405, 3504, 3396, 3405, 3362, 3409, 3403, 3495, 3866, 3967, 3364, 3406]; - const FLAC_1_96000 = - [0, 2096, 2313, 2304, 3104, 3084, 3008, 2956, 2866, 2769, 2720, 2703, 2806, 3075, 3013, - 3004, 2929, 2885, 2836, 2788, 2720, 3291, 3414, 3401, 3322, 3233, 3165, 3194, 3099, 3039, - 3011, 2892, 2844, 2764, 2751, 2698, 3116, 3096, 3043, 2982, 2923, 2817, 3205, 3158, 3034, - 3353, 3332, 3254, 3158, 3044, 3037, 3269, 3158, 3109, 3074, 3011, 2945, 2840, 2752, 2887, - 3084, 3041, 3004, 2956, 2909, 2800, 2769, 2736, 2779, 2768, 2723, 2973, 3046, 2947, 3309, - 3203, 3135, 3128, 3210, 3137, 3165, 3212, 3130, 3358, 3356, 3330, 3386, 3402, 3358, 3195, - 3120, 3093, 3088, 3060, 3008, 3127, 2994, 2963, 3376, 3566, 3494, 3016, 3067, 3938, 4533, - 4686, 4477, 4532, 4548, 4252, 4375, 4807, 4885, 4790, 4300, 4079, 4507, 4747, 4727, 4369, - 3822, 4696, 4405, 4835, 4855, 4719, 4198, 4009, 4874, 4857, 4542, 5183, 6291, 5735, 5096, - 5018, 4900, 4963, 4890, 4985, 5086, 5116, 5145, 5065, 4967, 4772, 4419, 3759, 3445, 4347, - 4859, 4514, 3460, 4617, 4840, 4044, 4490, 4883, 4616, 4581, 4914, 4790, 4775, 4955, 4801, - 4552, 4786, 4612, 4335, 4015, 3589, 3405, 3337, 3355, 3291, 3342, 4395, 4840, 4919, 4968, - 4949, 4873, 4878, 4858, 4689, 4617, 4365, 4135, 3764, 3318, 3414, 3909, 4464, 4816, 4417, - 3709, 5320, 4560, 4811, 3916, 4865, 4261, 4048, 4730, 4696, 4599, 4512, 4592, 4671, 4938, - 5041, 4511, 4752, 5982, 4990, 4959, 5054, 5080, 5138, 4119, 4055, 4492, 4668, 4634, 4519, - 3835, 4911, 4872, 5034, 4958, 4891, 4896, 4992, 5095, 5035, 4963, 5010, 4900, 4865, 4472, - 4132, 3625, 3309, 3853, 4580, 4573, 3624, 4500, 4971, 4981, 4887, 5051, 4933, 4211, 4215, - 4165, 4775, 4934, 4881, 4649, 4846, 4718, 4567, 4091, 3782, 3426, 3873, 4744, 4805, 4100, - 4562, 5165, 5009, 4931, 4810, 4580, 4343, 4663, 4619, 4643, 4721, 4962, 4991, 4870, 3577, - 4867, 5396, 5037, 5064, 5095, 4999, 4850, 4986, 5615, 4574, 5207, 5593, 4727, 5230, 5128, - 5148, 5465, 5094, 5233, 5658, 5309, 5121, 5194, 4823, 5060, 5166, 5038, 4882, 4384, 4248, - 4888, 4904, 4124, 4934, 4814, 4283, 5113, 5072, 5387, 6348, 5799, 4731, 5078, 5110, 4806, - 4968, 4756, 4780, 5173, 4953, 4936, 4893, 4843, 4837, 4850, 4890, 4877, 4893, 4903, 4882, - 4888, 4893, 4871, 4879, 4924, 4946, 4952, 4982, 4935, 4835, 4834, 4785, 4453, 4148, 3850, - 3700, 3598, 3578, 3510, 3476, 3511, 3782, 4152, 4524, 4752, 4148, 6033, 6089, 4825, 4885, - 4850, 5256, 4917, 4706, 5456, 5312, 5525, 5625, 5355, 4794, 4271, 4002, 4071, 4942, 4679, - 5895, 5229, 5845, 5789, 5872, 5600, 5184, 5648, 5360, 4754, 5308, 4830, 4654, 5243, 5281, - 5359, 5265, 4797, 4261, 4885, 4832, 4491, 5344, 4827, 4959, 5343, 5178, 5309, 5630, 6320, - 6455, 5767, 5901, 5380, 5784, 6369, 5427, 5310, 5325, 5323, 5402, 5493, 5355, 5368, 5348, - 5395, 5337, 5190, 5127, 5164, 5164, 5273, 5287, 5258, 5157, 5099, 5009, 5071, 5125, 5087, - 4976, 4557, 4108, 5384, 4875, 4505, 4873, 4431, 4608, 6246, 5188, 5017, 5139, 5078, 4981, - 4854, 5171, 6053, 5268, 5105, 4980, 5156, 5895, 5452, 4918, 4878, 4790, 4592, 4207, 3634, - 3363, 3445, 3349, 3456, 3879, 4717, 4937, 4942, 4879, 4797, 4470, 4070, 3658, 3332, 3381, - 3330, 4737, 5019, 5023, 4823, 4817, 4953, 5007, 4953, 5160, 4776, 4849, 4964, 4953, 5450, - 5630, 5546, 5423, 4848, 4832, 5892, 5467, 5204, 5799, 5818, 6484, 5792, 5945, 5917, 6737, - 6126, 5851, 5871, 5379, 5851, 5849, 5503, 5920, 5833, 5761, 5529, 5855, 5746, 5568, 5252, - 5642, 6357, 6091, 5886, 5908, 5680, 5700, 5025, 5101, 5333, 5014, 4891, 5256, 5531, 5422, - 5332, 4887, 5148, 5389, 4948, 6343, 5755, 5066, 5270, 6237, 6433, 6204, 5326, 5292, 5245, - 6062, 5710, 5130, 5968, 6429, 5520, 6269, 6545, 6387, 5169, 4899, 5039, 5429, 5072, 5094, - 5371, 5124, 5565, 4266, 4506, 5726, 5372, 5739, 5532, 5563, 5085, 5072, 5566, 5223, 4986, - 4917, 4863, 4751, 4728, 4963, 5596, 5135, 4759, 5783, 5810, 5343, 5961, 5349, 5399, 5405, - 5771, 5878, 5862, 5797, 5771, 5915, 5006, 5594, 5681, 4787, 6222, 5670, 5537, 4965, 6272, - 5720, 5471, 5527, 5392, 5516, 5432, 5016, 5611, 5572, 5627, 5904, 6424, 5416, 5003, 4514, - 4771, 5304, 5668, 5574, 5287, 4831, 5169, 5305, 5008, 4978, 5875, 6069, 5120, 5529, 4846, - 5625, 5315, 5379, 5437, 5736, 5812, 5838, 5844, 5808, 5697, 5847, 5804, 5738, 5602, 5592, - 5582, 5879, 5824, 5863, 5761, 5736, 5597, 5820, 5831, 5227, 5124, 5056, 4942, 4745, 4451, - 4288, 4323, 5293, 4583, 4204, 4774, 5611, 5631, 5494, 4871, 6011, 5739, 4947, 4239, 4385, - 4954, 4789, 4727, 4531, 4392, 4121, 3747, 3758, 4493, 4195, 3902, 4231, 4086, 4035, 4452, - 4405, 4160, 4300, 4094, 4107, 4484, 4115, 4152, 4165, 4058, 4283, 4080, 4104, 4107, 3892, - 3993, 4160, 4081, 4122, 4098, 4140, 4108, 4229, 4248, 4102, 4346, 4068, 3851, 4219, 4084, - 4069, 3964, 3903, 3665, 3570, 3449, 3503, 3547, 3618, 3682, 4540, 4087, 3893, 4237, 3960, - 4038, 4349, 4086, 4031, 4108, 3755, 4343, 4444, 4104, 4166, 4176, 3612, 4188, 3911, 4056, - 3850, 3641, 4269, 4906, 4280, 4238, 4908, 4965, 4844, 4894, 4880, 4869, 4699, 5944, 6144, - 5135, 4515, 4319, 4663, 4703, 4608, 4894, 4554, 4191, 4036, 4060, 4031, 4775, 4335, 4064, - 4398, 4162, 4173, 4765, 4596, 4098, 4253, 3975, 4407, 4560, 4334, 4192, 4208, 4053, 4379, - 4122, 4041, 4031, 4202, 4285, 4739, 4686, 4494, 4655, 4649, 4408, 4737, 4609, 4433, 4681, - 4380, 4313, 4445, 4346, 4385, 4301, 4333, 4235, 4032, 4087, 4077, 4009, 4088, 4341, 4733, - 4386, 4297, 4523, 4250, 4296, 4675, 4497, 4244, 4384, 4035, 4346, 4188, 4056, 4153, 4043, - 3878, 4291, 4039, 4063, 4066, 3805, 3735, 3673, 3634, 3554, 3521, 3440, 3401, 3381, 3300, - 3274, 3342, 3480, 3435, 3307, 3233, 3135, 3089, 3068, 3143, 3405, 3407, 3775, 3344, 3182]; - const FLAC_2_8000 = - [0, 742, 743, 742, 1239, 1316, 1315, 1302, 1288, 1274, 1253, 1238, 1226, 1204, 1246, - 1333, 1325, 1310, 1301, 1286, 1283, 1262, 1261, 1237, 1233, 1431, 1423, 1396, 1379, - 1345, 1323, 1309, 1356, 1341, 1323, 1309, 1288, 1278, 1256, 1246, 1224, 1198, 1296, - 1343, 1328, 1310, 1293, 1282, 1272, 1334, 1345, 1326, 1318, 1400, 1390, 1378, 1357, - 1324, 1303, 1318, 1397, 1379, 1362, 1347, 1332, 1314, 1298, 1275, 1255, 1244, 1335, - 1342, 1328, 1328, 1318, 1301, 1282, 1270, 1263, 1250, 1258, 1258, 1243, 1236, 1321, - 1322, 1312, 1361, 1420, 1399, 1376, 1385, 1378, 1372, 1373, 1385, 1367, 1351, 1406, - 1391, 1376, 1424, 1447, 1444, 1392, 1379, 1360, 1346, 1366, 1357, 1341, 1327, 1330, - 1315, 1297, 1284, 1318, 1324, 1311, 1263, 1240, 1257, 1394, 1465, 1458, 1403, 1389, - 1411, 1382, 1352, 1423, 1468, 1471, 1461, 1434, 1363, 1356, 1429, 1500, 1476, 1438, - 1378, 1296, 1384, 1435, 1457, 1453, 1455, 1449, 1356, 1317, 1447, 1479, 1464, 1391, - 1389, 1349, 1355, 1422, 1472, 1456, 1446, 1464, 1454, 1521, 1518, 1507, 1493, 1504, - 1490, 1469, 1478, 1453, 1414, 1392, 1373, 1388, 1413, 1395, 1355, 1331, 1448, 1472, - 1405, 1387, 1452, 1447, 1378, 1392, 1357, 1324, 1333, 1463, 1448, 1424, 1397, 1412, - 1425, 1387, 1388, 1367, 1334, 1383, 1387, 1368, 1376, 1386, 1378, 1373, 1434, 1425, - 1439, 1468, 1484, 1472, 1455, 1447, 1419, 1417, 1403, 1408, 1387, 1363, 1371, 1350, - 1333, 1412, 1439, 1445, 1427, 1391, 1395, 1452, 1418, 1447, 1358, 1368, 1484, 1441, - 1421, 1472, 1502, 1480, 1472, 1463, 1442, 1463, 1494, 1521, 1497, 1443, 1470, 1388, - 1366, 1443, 1490, 1492, 1495, 1467, 1385, 1369, 1332, 1411, 1415, 1440, 1436, 1371, - 1347, 1405, 1466, 1457, 1448, 1455, 1438, 1452, 1485, 1485, 1474, 1479, 1489, 1472, - 1454, 1451, 1413, 1387, 1379, 1337, 1335, 1365, 1388, 1380, 1318, 1393, 1491, 1489, - 1482, 1462, 1495, 1483, 1406, 1358, 1361, 1356, 1438, 1452, 1453, 1420, 1453, 1443, - 1441, 1467, 1452, 1430, 1419, 1407, 1403, 1409, 1423, 1397, 1391, 1457, 1466, 1458, - 1447, 1453, 1440, 1419, 1395, 1418, 1405, 1400, 1410, 1450, 1454, 1397, 1457, 1280, - 1311, 1509, 1558, 1526, 1526, 1525, 1504, 1463, 1395, 1365, 1361, 1471, 1488, 1423, - 1409, 1544, 1579, 1548, 1533, 1606, 1455, 1454, 1566, 1566, 1498, 1481, 1525, 1497, - 1480, 1556, 1545, 1541, 1522, 1470, 1443, 1443, 1460, 1454, 1434, 1458, 1491, 1471, - 1455, 1565, 1549, 1445, 1531, 1400, 1395, 1445, 1512, 1485, 1456, 1502, 1533, 1437, - 1483, 1517, 1499, 1505, 1501, 1510, 1509, 1508, 1517, 1507, 1519, 1524, 1528, 1525, - 1525, 1524, 1525, 1520, 1518, 1520, 1520, 1510, 1516, 1512, 1500, 1510, 1490, 1493, - 1513, 1481, 1464, 1452, 1437, 1423, 1404, 1401, 1394, 1386, 1384, 1374, 1378, 1395, - 1465, 1453, 1444, 1422, 1396, 1403, 1415, 1481, 1472, 1504, 1534, 1524, 1484, 1480, - 1559, 1598, 1585, 1565, 1559, 1507, 1456, 1422, 1420, 1427, 1506, 1506, 1451, 1435, - 1500, 1545, 1533, 1565, 1567, 1518, 1488, 1585, 1561, 1501, 1514, 1554, 1467, 1472, - 1517, 1558, 1538, 1524, 1506, 1465, 1445, 1460, 1455, 1453, 1536, 1554, 1496, 1528, - 1546, 1555, 1537, 1571, 1589, 1490, 1493, 1550, 1584, 1580, 1547, 1516, 1466, 1475, - 1537, 1556, 1545, 1540, 1541, 1537, 1539, 1539, 1534, 1547, 1560, 1549, 1553, 1538, - 1539, 1543, 1542, 1541, 1542, 1534, 1541, 1527, 1528, 1523, 1515, 1537, 1521, 1541, - 1515, 1481, 1450, 1448, 1432, 1417, 1457, 1459, 1441, 1400, 1452, 1401, 1415, 1501, - 1520, 1519, 1508, 1505, 1418, 1383, 1459, 1516, 1510, 1488, 1480, 1416, 1390, 1409, - 1442, 1455, 1443, 1422, 1397, 1342, 1281, 1248, 1255, 1284, 1252, 1199, 1274, 1391, - 1472, 1487, 1491, 1471, 1474, 1438, 1387, 1341, 1305, 1284, 1288, 1287, 1378, 1487, - 1481, 1463, 1442, 1404, 1413, 1420, 1425, 1420, 1377, 1385, 1430, 1485, 1460, 1463, - 1556, 1556, 1558, 1557, 1536, 1422, 1503, 1589, 1555, 1495, 1596, 1587, 1559, 1603, - 1602, 1592, 1606, 1522, 1514, 1554, 1611, 1593, 1539, 1522, 1600, 1591, 1568, 1629, - 1620, 1625, 1581, 1599, 1647, 1614, 1589, 1573, 1573, 1567, 1503, 1501, 1543, 1603, - 1597, 1599, 1567, 1482, 1503, 1535, 1501, 1498, 1518, 1585, 1588, 1587, 1566, 1527, - 1505, 1517, 1521, 1489, 1475, 1578, 1583, 1502, 1508, 1564, 1507, 1518, 1561, 1593, - 1583, 1553, 1491, 1540, 1579, 1550, 1518, 1485, 1514, 1521, 1486, 1477, 1533, 1549, - 1506, 1470, 1456, 1556, 1568, 1583, 1604, 1558, 1536, 1503, 1451, 1504, 1588, 1549]; - const FLAC_1_8000 = - [0, 228, 233, 231, 692, 771, 767, 752, 741, 732, 712, 691, 677, 662, 701, 794, 785, 761, 752, 737, 738, - 723, 720, 688, 685, 883, 878, 854, 829, 802, 783, 762, 812, 799, 782, 762, 741, 735, 716, 703, 675, - 657, 749, 802, 789, 761, 745, 738, 730, 788, 803, 782, 770, 862, 842, 827, 810, 783, 755, 769, 854, - 831, 815, 805, 791, 770, 751, 731, 715, 701, 790, 803, 789, 789, 774, 751, 736, 728, 724, 707, 716, - 716, 698, 687, 776, 781, 766, 817, 877, 857, 826, 839, 825, 822, 825, 837, 816, 806, 867, 849, 825, - 877, 902, 896, 847, 830, 810, 802, 817, 811, 798, 785, 790, 768, 748, 745, 774, 784, 763, 720, 693, - 705, 843, 922, 911, 857, 848, 868, 835, 808, 878, 929, 934, 915, 886, 822, 808, 882, 954, 940, 896, - 830, 749, 839, 888, 909, 903, 907, 895, 813, 770, 902, 938, 919, 845, 846, 803, 813, 879, 930, 912, - 894, 920, 904, 972, 966, 957, 948, 956, 947, 929, 936, 903, 872, 847, 824, 840, 872, 854, 810, 783, - 901, 930, 864, 843, 903, 899, 837, 850, 813, 778, 787, 921, 899, 879, 853, 872, 880, 840, 842, 819, - 795, 839, 840, 821, 825, 838, 833, 823, 888, 880, 891, 920, 942, 932, 907, 898, 876, 873, 860, 867, - 841, 816, 823, 808, 792, 863, 886, 897, 880, 845, 852, 907, 876, 899, 813, 821, 943, 891, 877, 927, - 956, 940, 931, 917, 891, 918, 947, 973, 953, 893, 926, 844, 818, 896, 948, 949, 951, 922, 838, 822, - 790, 871, 873, 898, 886, 819, 805, 859, 925, 911, 897, 907, 891, 905, 944, 943, 933, 940, 946, 930, - 904, 902, 872, 844, 833, 797, 796, 818, 844, 830, 771, 849, 948, 945, 942, 918, 951, 943, 858, 814, - 814, 814, 894, 903, 906, 874, 906, 892, 893, 924, 905, 884, 877, 867, 864, 870, 879, 857, 848, 912, - 925, 913, 897, 905, 890, 875, 850, 873, 861, 859, 869, 902, 905, 848, 912, 737, 768, 965, 1014, 979, - 977, 976, 957, 916, 851, 817, 814, 930, 945, 878, 869, 1001, 1031, 1002, 987, 1063, 907, 906, 1021, - 1020, 955, 938, 981, 957, 938, 1016, 1004, 1002, 974, 928, 893, 899, 915, 908, 886, 913, 949, 931, - 908, 1023, 1004, 900, 990, 860, 849, 896, 961, 947, 913, 957, 992, 893, 934, 967, 954, 957, 954, 961, - 961, 960, 964, 960, 968, 975, 983, 979, 975, 976, 979, 970, 966, 971, 968, 963, 967, 962, 955, 960, - 950, 948, 964, 939, 921, 904, 888, 879, 863, 862, 849, 842, 836, 825, 827, 849, 921, 907, 897, 877, - 854, 863, 870, 939, 930, 954, 989, 978, 936, 934, 1016, 1051, 1037, 1022, 1018, 961, 909, 879, 876, - 881, 962, 960, 905, 886, 952, 1005, 992, 1020, 1023, 970, 944, 1035, 1018, 953, 969, 1006, 923, 932, - 972, 1013, 996, 978, 955, 924, 896, 912, 909, 904, 992, 1013, 954, 980, 1005, 1013, 996, 1026, 1038, - 948, 948, 1002, 1036, 1029, 1003, 974, 926, 935, 992, 1014, 1004, 998, 1000, 993, 999, 998, 991, 1007, - 1017, 1009, 1012, 1000, 999, 1003, 1004, 1000, 1003, 992, 997, 982, 982, 975, 966, 996, 975, 1000, 966, - 939, 902, 899, 886, 873, 909, 913, 894, 862, 907, 862, 873, 959, 969, 969, 958, 956, 870, 838, 914, - 967, 960, 946, 940, 874, 845, 869, 893, 910, 893, 879, 852, 801, 740, 706, 712, 738, 711, 658, 727, - 847, 927, 946, 947, 930, 935, 892, 839, 799, 756, 740, 741, 740, 828, 945, 940, 917, 892, 865, 871, - 877, 879, 877, 831, 837, 886, 943, 912, 920, 1015, 1013, 1014, 1016, 994, 879, 954, 1037, 1009, 952, - 1051, 1040, 1011, 1052, 1057, 1043, 1063, 974, 964, 1006, 1071, 1042, 991, 974, 1051, 1045, 1022, 1084, - 1081, 1084, 1040, 1051, 1101, 1074, 1045, 1026, 1027, 1023, 954, 954, 994, 1058, 1051, 1052, 1022, 941, - 958, 991, 956, 954, 973, 1036, 1035, 1039, 1020, 984, 957, 967, 971, 945, 935, 1027, 1039, 955, 960, - 1017, 960, 972, 1014, 1046, 1035, 1007, 945, 996, 1028, 1011, 975, 944, 970, 977, 946, 938, 989, 1010, - 961, 929, 911, 1011, 1023, 1033, 1060, 1009, 991, 956, 902, 956, 1040, 1007, 1016, 1001, 970, 996, 956, - 909, 892, 895, 967, 988, 983, 963, 947, 952, 947, 961, 969, 966, 1006, 1047, 1068, 1035, 1023, 1074, - 982, 984, 1015, 1082, 1045, 1071, 1044, 1020, 1062, 1069, 1003, 956, 1050, 1059, 950, 970, 1071, 1069, - 1039, 942, 973, 1064, 1063, 1059, 1055, 1031, 1058, 1028, 952, 964, 1020, 1059, 1068, 1035, 949, 929]; - const FLAC_2_11025 = - [0, 396, 411, 1177, 1285, 1193, 1172, 1108, 1081, 1039, 1222, 1284, 1259, 1224, 1196, 1158, 1096, 1370, - 1543, 1486, 1435, 1359, 1396, 1318, 1229, 1184, 1156, 1121, 1040, 1185, 1311, 1281, 1240, 1210, 1375, - 1363, 1343, 1469, 1445, 1358, 1264, 1360, 1433, 1380, 1327, 1286, 1228, 1170, 1215, 1330, 1304, 1284, - 1234, 1182, 1150, 1130, 1135, 1092, 1262, 1287, 1345, 1480, 1382, 1441, 1413, 1405, 1423, 1413, 1543, - 1479, 1624, 1590, 1478, 1425, 1351, 1374, 1325, 1326, 1287, 1228, 1327, 1370, 1242, 1121, 1549, 1758, - 1662, 1520, 1504, 1391, 1629, 1717, 1684, 1525, 1448, 1720, 1730, 1521, 1349, 1597, 1684, 1691, 1683, - 1403, 1566, 1744, 1606, 1605, 1562, 1665, 1753, 1722, 1719, 1760, 1754, 1742, 1735, 1712, 1689, 1576, - 1494, 1464, 1596, 1545, 1343, 1742, 1615, 1547, 1693, 1541, 1576, 1431, 1579, 1696, 1611, 1611, 1655, - 1574, 1490, 1447, 1468, 1429, 1439, 1426, 1612, 1644, 1741, 1736, 1700, 1660, 1612, 1589, 1573, 1481, - 1425, 1368, 1597, 1661, 1643, 1500, 1683, 1638, 1509, 1614, 1658, 1576, 1747, 1726, 1719, 1679, 1699, - 1823, 1717, 1711, 1592, 1601, 1769, 1815, 1723, 1498, 1444, 1625, 1669, 1594, 1411, 1682, 1744, 1719, - 1699, 1667, 1732, 1724, 1724, 1684, 1637, 1564, 1463, 1371, 1411, 1554, 1535, 1381, 1740, 1755, 1698, - 1785, 1660, 1496, 1491, 1655, 1721, 1626, 1707, 1683, 1699, 1605, 1557, 1532, 1605, 1598, 1529, 1791, - 1717, 1707, 1654, 1585, 1663, 1675, 1642, 1736, 1658, 1669, 1301, 1828, 1883, 1850, 1823, 1750, 1609, - 1557, 1699, 1684, 1565, 1899, 1902, 1877, 1753, 1724, 1973, 1792, 1833, 1758, 1784, 1828, 1816, 1714, - 1598, 1673, 1656, 1647, 1742, 1665, 1922, 1812, 1825, 1670, 1618, 1760, 1708, 1751, 1758, 1734, 1809, - 1796, 1802, 1814, 1810, 1827, 1844, 1858, 1856, 1840, 1823, 1807, 1815, 1815, 1814, 1813, 1805, 1770, - 1793, 1726, 1648, 1589, 1550, 1513, 1489, 1476, 1468, 1498, 1669, 1655, 1573, 1594, 1599, 1732, 1753, - 1887, 1754, 1793, 1875, 1943, 1930, 1813, 1642, 1583, 1631, 1784, 1628, 1735, 1879, 1871, 1940, 1717, - 1953, 1900, 1778, 1786, 1671, 1792, 1874, 1847, 1740, 1617, 1688, 1671, 1911, 1782, 1824, 1871, 1858, - 1917, 1738, 1816, 1989, 1954, 1856, 1737, 1861, 1898, 1891, 1897, 1896, 1890, 1877, 1874, 1880, 1869, - 1865, 1873, 1888, 1888, 1874, 1855, 1843, 1835, 1843, 1832, 1719, 1619, 1633, 1590, 1695, 1609, 1633, - 1585, 1665, 1855, 1841, 1763, 1567, 1750, 1806, 1761, 1713, 1577, 1605, 1725, 1702, 1654, 1525, 1339, - 1264, 1311, 1200, 1290, 1647, 1794, 1764, 1736, 1651, 1474, 1339, 1307, 1290, 1697, 1766, 1730, 1621, - 1647, 1700, 1598, 1536, 1691, 1743, 1782, 1914, 1916, 1925, 1638, 1811, 1898, 1834, 2005, 1944, 2009, - 1989, 1944, 1860, 1980, 1967, 1840, 1935, 1926, 1948, 2001, 2009, 1976, 2022, 1924, 1862, 1923, 1791, - 1814, 1995, 1965, 1919, 1712, 1791, 1735, 1764, 1941, 1915, 1866, 1767, 1812, 1780, 1748, 1987, 1768, - 1934, 1931, 1936, 1924, 1918, 1846, 1935, 1907, 1842, 1746, 1848, 1776, 1816, 1836, 1707, 1699, 1903, - 1902, 1902, 1838, 1662, 1713, 1906, 1881, 1849, 1827, 1754, 1670, 1688, 1823, 1803, 1743, 1725, 1751, - 1826, 1774, 1910, 1989, 1839, 2010, 1753, 1854, 1988, 1973, 1895, 1910, 1924, 1789, 1934, 1832, 1815, - 1956, 1916, 1807, 1973, 1917, 1908, 1841, 1972, 1719, 1841, 1993, 1983, 1848, 1778, 1767, 1696, 1748, - 1921, 1900, 1844, 1770, 1816, 1791, 1811, 2007, 1853, 1901, 1776, 1884, 1901, 1878, 1925, 1925, 1943, - 1927, 1931, 1965, 1964, 1909, 1909, 1905, 1928, 1929, 1913, 1898, 1932, 1952, 1913, 1777, 1721, 1652, - 1591, 1586, 1575, 1829, 1602, 1627, 1797, 1910, 1879, 1641, 1629, 1698, 1595, 1646, 1749, 1727, 1650, - 1579, 1520, 1506, 1624, 1639, 1632, 1693, 1654, 1716, 1717, 1687, 1703, 1699, 1795, 1735, 1737, 1721, - 1722, 1650, 1604, 1624, 1618, 1688, 1651, 1689, 1715, 1683, 1699, 1678, 1683, 1667, 1626, 1765, 1722, - 1658, 1623, 1613, 1621, 1583, 1584, 1590, 1637, 1679, 1624, 1724, 1667, 1689, 1657, 1632, 1638, 1615, - 1736, 1704, 1668, 1627, 1604, 1655, 1609, 1588, 1586, 1699, 1640, 1579, 1876, 1888, 1858, 1813, 1794]; - const FLAC_1_11025 = - [0, 448, 465, 1245, 1346, 1272, 1250, 1172, 1153, 1113, 1296, 1339, 1318, 1294, 1275, 1226, 1160, 1444, - 1605, 1566, 1497, 1433, 1460, 1387, 1301, 1265, 1225, 1177, 1111, 1258, 1384, 1339, 1307, 1287, 1439, - 1434, 1404, 1546, 1515, 1433, 1323, 1432, 1497, 1450, 1398, 1343, 1298, 1242, 1276, 1407, 1371, 1343, - 1303, 1259, 1214, 1185, 1196, 1159, 1323, 1346, 1411, 1556, 1446, 1508, 1468, 1470, 1477, 1481, 1604, - 1557, 1693, 1661, 1550, 1488, 1425, 1442, 1400, 1406, 1352, 1295, 1404, 1440, 1313, 1181, 1617, 1829, - 1728, 1589, 1575, 1456, 1698, 1781, 1752, 1597, 1521, 1792, 1797, 1599, 1418, 1673, 1749, 1750, 1742, - 1474, 1635, 1813, 1680, 1683, 1623, 1731, 1830, 1789, 1781, 1835, 1833, 1814, 1802, 1772, 1751, 1638, - 1569, 1536, 1671, 1613, 1421, 1811, 1681, 1614, 1756, 1614, 1648, 1503, 1645, 1765, 1682, 1686, 1725, - 1631, 1558, 1514, 1541, 1489, 1504, 1485, 1681, 1711, 1813, 1808, 1758, 1727, 1689, 1654, 1632, 1559, - 1487, 1440, 1667, 1729, 1717, 1573, 1757, 1711, 1574, 1684, 1729, 1640, 1817, 1791, 1781, 1745, 1770, - 1890, 1788, 1771, 1662, 1673, 1844, 1880, 1791, 1573, 1512, 1704, 1735, 1665, 1472, 1751, 1820, 1783, - 1768, 1733, 1797, 1786, 1789, 1751, 1702, 1634, 1527, 1441, 1483, 1617, 1597, 1449, 1804, 1826, 1769, - 1859, 1733, 1565, 1568, 1720, 1782, 1686, 1768, 1752, 1758, 1677, 1614, 1595, 1682, 1669, 1598, 1864, - 1780, 1761, 1728, 1654, 1728, 1741, 1716, 1804, 1730, 1742, 1366, 1900, 1951, 1905, 1887, 1823, 1670, - 1613, 1766, 1755, 1628, 1973, 1971, 1949, 1824, 1795, 2040, 1862, 1894, 1822, 1853, 1890, 1882, 1782, - 1671, 1739, 1724, 1721, 1818, 1732, 1998, 1884, 1890, 1733, 1684, 1837, 1769, 1820, 1822, 1799, 1881, - 1868, 1871, 1882, 1878, 1890, 1900, 1918, 1912, 1894, 1888, 1877, 1882, 1877, 1880, 1878, 1876, 1848, - 1866, 1791, 1720, 1661, 1609, 1584, 1564, 1557, 1548, 1575, 1735, 1724, 1642, 1666, 1666, 1794, 1819, - 1958, 1826, 1859, 1941, 2014, 2003, 1884, 1715, 1647, 1700, 1855, 1703, 1807, 1949, 1936, 2004, 1779, - 2019, 1970, 1846, 1853, 1737, 1857, 1941, 1910, 1806, 1695, 1748, 1736, 1981, 1851, 1893, 1940, 1926, - 1992, 1802, 1890, 2040, 2018, 1917, 1810, 1931, 1973, 1967, 1971, 1972, 1964, 1948, 1941, 1952, 1935, - 1927, 1940, 1963, 1960, 1941, 1913, 1902, 1895, 1909, 1897, 1787, 1695, 1712, 1654, 1751, 1676, 1700, - 1652, 1735, 1913, 1898, 1835, 1638, 1821, 1875, 1838, 1773, 1642, 1671, 1793, 1761, 1727, 1592, 1405, - 1324, 1385, 1270, 1364, 1712, 1862, 1843, 1803, 1722, 1542, 1416, 1381, 1356, 1764, 1839, 1795, 1698, - 1720, 1760, 1671, 1599, 1755, 1815, 1846, 1992, 1995, 1995, 1709, 1880, 1975, 1905, 2063, 2013, 2074, - 2058, 2010, 1924, 2046, 2029, 1911, 2002, 1995, 2019, 2065, 2072, 2046, 2092, 1994, 1921, 1998, 1863, - 1880, 2053, 2027, 1979, 1772, 1865, 1804, 1832, 2011, 1995, 1930, 1844, 1880, 1850, 1814, 2046, 1841, - 1997, 2004, 2008, 2001, 1998, 1917, 2010, 1979, 1917, 1815, 1914, 1852, 1888, 1899, 1772, 1765, 1980, - 1977, 1974, 1907, 1735, 1781, 1980, 1951, 1913, 1891, 1817, 1737, 1759, 1885, 1874, 1818, 1789, 1817, - 1888, 1850, 1977, 2050, 1910, 2073, 1818, 1919, 2051, 2034, 1966, 1980, 1992, 1859, 2003, 1902, 1888, - 2020, 1979, 1871, 2045, 1994, 1989, 1904, 2034, 1783, 1905, 2049, 2040, 1913, 1846, 1830, 1752, 1822, - 1998, 1974, 1911, 1846, 1880, 1864, 1875, 2067, 1922, 1971, 1841, 1958, 1981, 1944, 1999, 2001, 2013, - 2003, 2004, 2029, 2025, 1987, 1990, 1990, 2004, 2002, 1992, 1976, 2003, 2019, 1980, 1852, 1782, 1723, - 1659, 1654, 1634, 1901, 1675, 1691, 1871, 1994, 1948, 1715, 1708, 1771, 1666, 1708, 1824, 1790, 1724, - 1646, 1588, 1578, 1687, 1714, 1712, 1751, 1725, 1775, 1782, 1747, 1760, 1759, 1866, 1802, 1808, 1788, - 1786, 1722, 1679, 1702, 1697, 1757, 1721, 1752, 1772, 1743, 1755, 1743, 1756, 1734, 1707, 1839, 1786, - 1728, 1700, 1685, 1695, 1643, 1648, 1657, 1702, 1746, 1703, 1789, 1730, 1752, 1725, 1709, 1714, 1696, - 1807, 1764, 1735, 1707, 1676, 1727, 1685, 1654, 1650, 1764, 1707, 1642, 1949, 1961, 1921, 1878, 1866]; - const FLAC_2_12000 = - [0, 398, 412, 1043, 1225, 1156, 1131, 1083, 1038, 1016, 984, 1191, 1204, 1182, 1160, 1143, 1108, 1048, - 1013, 1514, 1468, 1437, 1359, 1291, 1330, 1259, 1174, 1139, 1114, 1061, 1020, 961, 1250, 1226, 1194, - 1164, 1144, 1355, 1336, 1248, 1438, 1426, 1360, 1275, 1201, 1409, 1361, 1311, 1269, 1221, 1171, 1127, - 1097, 1311, 1261, 1231, 1198, 1156, 1120, 1074, 1054, 1061, 1030, 1204, 1251, 1183, 1476, 1384, 1360, - 1374, 1336, 1376, 1361, 1386, 1506, 1458, 1587, 1588, 1471, 1414, 1335, 1316, 1299, 1272, 1278, 1217, - 1173, 1299, 1353, 1253, 1076, 1243, 1723, 1698, 1556, 1505, 1405, 1334, 1630, 1712, 1685, 1543, 1405, - 1618, 1717, 1630, 1431, 1388, 1581, 1675, 1653, 1652, 1394, 1458, 1732, 1662, 1545, 1587, 1639, 1712, - 1735, 1690, 1659, 1732, 1721, 1714, 1699, 1682, 1659, 1584, 1506, 1447, 1489, 1590, 1497, 1319, 1702, - 1616, 1487, 1679, 1607, 1557, 1484, 1408, 1687, 1655, 1583, 1619, 1651, 1569, 1494, 1401, 1454, 1391, - 1395, 1392, 1387, 1625, 1591, 1700, 1688, 1628, 1606, 1575, 1560, 1565, 1503, 1441, 1341, 1341, 1614, - 1654, 1633, 1475, 1691, 1594, 1581, 1432, 1696, 1557, 1633, 1715, 1692, 1694, 1642, 1664, 1805, 1727, - 1661, 1608, 1546, 1736, 1759, 1786, 1609, 1451, 1434, 1599, 1635, 1569, 1392, 1548, 1718, 1703, 1682, - 1604, 1642, 1687, 1677, 1678, 1631, 1569, 1534, 1400, 1363, 1308, 1456, 1560, 1451, 1424, 1724, 1722, - 1659, 1752, 1695, 1451, 1467, 1533, 1695, 1693, 1616, 1688, 1673, 1669, 1584, 1545, 1500, 1578, 1597, - 1517, 1669, 1742, 1703, 1694, 1630, 1570, 1639, 1646, 1619, 1703, 1694, 1624, 1375, 1479, 1873, 1811, - 1803, 1782, 1730, 1616, 1577, 1667, 1696, 1553, 1770, 1898, 1732, 1928, 1604, 1776, 1906, 1733, 1772, - 1732, 1673, 1784, 1783, 1752, 1633, 1585, 1661, 1608, 1683, 1717, 1625, 1866, 1816, 1744, 1741, 1624, - 1694, 1707, 1636, 1737, 1651, 1728, 1763, 1751, 1745, 1765, 1759, 1770, 1781, 1791, 1806, 1808, 1785, - 1768, 1763, 1764, 1777, 1766, 1773, 1764, 1773, 1748, 1750, 1679, 1600, 1557, 1499, 1471, 1455, 1441, - 1440, 1446, 1594, 1621, 1612, 1539, 1605, 1596, 1693, 1712, 1846, 1749, 1711, 1867, 1863, 1896, 1872, - 1711, 1589, 1547, 1603, 1748, 1590, 1678, 1842, 1810, 1865, 1776, 1734, 1885, 1787, 1818, 1688, 1637, - 1732, 1841, 1817, 1757, 1605, 1637, 1657, 1698, 1874, 1739, 1779, 1817, 1798, 1888, 1771, 1749, 1917, - 1938, 1850, 1796, 1771, 1865, 1852, 1855, 1860, 1853, 1850, 1833, 1814, 1823, 1818, 1806, 1812, 1824, - 1838, 1843, 1813, 1791, 1788, 1766, 1801, 1806, 1718, 1611, 1585, 1622, 1585, 1668, 1577, 1598, 1577, - 1548, 1821, 1812, 1757, 1686, 1555, 1819, 1773, 1734, 1692, 1564, 1578, 1719, 1718, 1671, 1607, 1425, - 1269, 1270, 1276, 1161, 1313, 1613, 1773, 1760, 1731, 1687, 1532, 1371, 1297, 1284, 1266, 1760, 1728, - 1695, 1589, 1591, 1660, 1608, 1531, 1491, 1727, 1659, 1826, 1876, 1880, 1880, 1599, 1736, 1882, 1768, - 1961, 1930, 2016, 1993, 1982, 1913, 1863, 1968, 1944, 1830, 1896, 1914, 1875, 1975, 1985, 1924, 2009, - 1964, 1880, 1838, 1905, 1782, 1801, 1943, 1933, 1910, 1710, 1750, 1746, 1718, 1782, 1909, 1883, 1844, - 1749, 1785, 1779, 1701, 1892, 1884, 1778, 1984, 1931, 1944, 1902, 1886, 1801, 1925, 1889, 1878, 1751, - 1818, 1796, 1779, 1850, 1774, 1675, 1678, 1877, 1868, 1884, 1772, 1762, 1582, 1835, 1827, 1844, 1765, - 1767, 1693, 1656, 1656, 1763, 1784, 1727, 1683, 1695, 1784, 1796, 1742, 1900, 1941, 1805, 1983, 1747, - 1797, 1937, 1904, 1911, 1839, 1925, 1842, 1746, 1938, 1793, 1800, 1910, 1909, 1713, 1920, 1889, 1883, - 1864, 1838, 1881, 1692, 1836, 1941, 1929, 1879, 1766, 1822, 1666, 1675, 1820, 1878, 1856, 1790, 1754, - 1799, 1767, 1753, 1953, 1886, 1774, 1856, 1759, 1894, 1826, 1835, 1869, 1866, 1880, 1874, 1879, 1902, - 1906, 1887, 1864, 1860, 1856, 1868, 1884, 1854, 1857, 1867, 1881, 1879, 1753, 1687, 1671, 1593, 1568, - 1558, 1542, 1800, 1573, 1602, 1692, 1865, 1847, 1700, 1615, 1701, 1592, 1557, 1643, 1712, 1689, 1619, - 1564, 1508, 1473, 1516, 1613, 1580, 1627, 1645, 1623, 1679, 1674, 1637, 1655, 1647, 1766, 1740, 1706]; - const FLAC_1_12000 = - [0, 457, 473, 1095, 1294, 1223, 1187, 1151, 1114, 1084, 1044, 1256, 1281, 1261, 1229, 1205, 1170, 1123, - 1075, 1582, 1550, 1499, 1433, 1350, 1409, 1323, 1247, 1197, 1173, 1136, 1088, 1021, 1311, 1298, 1272, - 1235, 1206, 1415, 1412, 1319, 1508, 1488, 1431, 1336, 1277, 1473, 1432, 1384, 1329, 1291, 1246, 1185, - 1167, 1386, 1319, 1299, 1276, 1222, 1177, 1145, 1128, 1135, 1100, 1268, 1315, 1259, 1546, 1448, 1430, - 1445, 1412, 1444, 1430, 1459, 1580, 1531, 1658, 1655, 1542, 1471, 1413, 1387, 1364, 1329, 1335, 1290, - 1246, 1362, 1428, 1328, 1149, 1308, 1794, 1755, 1626, 1577, 1473, 1414, 1696, 1769, 1749, 1615, 1474, - 1689, 1779, 1696, 1499, 1457, 1651, 1737, 1723, 1723, 1466, 1527, 1803, 1730, 1609, 1660, 1704, 1785, - 1805, 1758, 1730, 1798, 1786, 1773, 1755, 1743, 1728, 1650, 1574, 1517, 1554, 1664, 1566, 1388, 1774, - 1687, 1564, 1744, 1682, 1636, 1557, 1466, 1754, 1733, 1653, 1691, 1725, 1629, 1564, 1460, 1524, 1454, - 1457, 1455, 1452, 1693, 1660, 1761, 1746, 1710, 1686, 1639, 1621, 1622, 1574, 1504, 1414, 1411, 1685, - 1725, 1709, 1537, 1761, 1662, 1648, 1503, 1759, 1615, 1700, 1776, 1753, 1754, 1717, 1729, 1874, 1796, - 1732, 1682, 1619, 1807, 1838, 1860, 1679, 1519, 1503, 1677, 1711, 1639, 1453, 1617, 1784, 1760, 1748, - 1677, 1715, 1748, 1741, 1741, 1703, 1633, 1597, 1466, 1437, 1379, 1523, 1616, 1519, 1495, 1792, 1783, - 1730, 1832, 1766, 1518, 1542, 1602, 1753, 1750, 1677, 1747, 1747, 1737, 1650, 1607, 1570, 1649, 1671, - 1585, 1738, 1812, 1764, 1756, 1706, 1630, 1710, 1722, 1694, 1757, 1763, 1691, 1441, 1543, 1938, 1877, - 1871, 1855, 1797, 1687, 1640, 1732, 1766, 1619, 1838, 1973, 1798, 2001, 1675, 1845, 1975, 1799, 1836, - 1795, 1746, 1858, 1859, 1822, 1701, 1647, 1729, 1679, 1747, 1775, 1695, 1929, 1878, 1816, 1808, 1692, - 1766, 1770, 1705, 1806, 1722, 1793, 1828, 1827, 1817, 1849, 1841, 1845, 1854, 1862, 1877, 1874, 1859, - 1849, 1842, 1844, 1852, 1848, 1849, 1846, 1850, 1821, 1825, 1740, 1676, 1613, 1574, 1551, 1528, 1507, - 1506, 1516, 1663, 1698, 1685, 1606, 1679, 1667, 1759, 1781, 1920, 1820, 1788, 1931, 1927, 1972, 1943, - 1779, 1658, 1608, 1669, 1820, 1657, 1752, 1901, 1878, 1943, 1839, 1805, 1959, 1859, 1892, 1760, 1713, - 1797, 1899, 1881, 1828, 1674, 1709, 1724, 1766, 1944, 1802, 1846, 1882, 1871, 1963, 1842, 1822, 1986, - 2010, 1921, 1870, 1835, 1923, 1911, 1913, 1921, 1911, 1907, 1893, 1879, 1885, 1883, 1874, 1879, 1886, - 1898, 1896, 1880, 1865, 1861, 1844, 1872, 1872, 1779, 1678, 1650, 1695, 1652, 1731, 1650, 1665, 1647, - 1609, 1884, 1876, 1825, 1754, 1623, 1891, 1853, 1803, 1754, 1626, 1646, 1782, 1780, 1737, 1673, 1497, - 1331, 1337, 1340, 1229, 1382, 1681, 1851, 1840, 1800, 1751, 1602, 1439, 1366, 1344, 1332, 1837, 1792, - 1751, 1659, 1664, 1729, 1683, 1604, 1557, 1796, 1728, 1899, 1944, 1949, 1945, 1663, 1808, 1955, 1845, - 2032, 2001, 2079, 2051, 2047, 1980, 1926, 2035, 2010, 1900, 1964, 1992, 1944, 2038, 2046, 1992, 2074, - 2025, 1945, 1894, 1986, 1855, 1868, 2012, 2005, 1988, 1772, 1812, 1817, 1781, 1855, 1990, 1955, 1904, - 1822, 1858, 1853, 1758, 1960, 1951, 1851, 2045, 2003, 2013, 1988, 1960, 1864, 1996, 1963, 1950, 1825, - 1886, 1864, 1852, 1914, 1844, 1737, 1748, 1943, 1933, 1956, 1837, 1832, 1648, 1902, 1890, 1901, 1835, - 1842, 1763, 1725, 1722, 1836, 1856, 1798, 1743, 1754, 1855, 1868, 1816, 1976, 2012, 1884, 2042, 1812, - 1861, 2008, 1981, 1983, 1903, 2001, 1906, 1816, 2003, 1852, 1869, 1990, 1985, 1782, 1994, 1962, 1950, - 1930, 1905, 1953, 1751, 1903, 2012, 2004, 1940, 1832, 1888, 1729, 1745, 1893, 1947, 1919, 1858, 1828, - 1870, 1843, 1818, 2020, 1950, 1839, 1925, 1827, 1957, 1891, 1901, 1930, 1932, 1949, 1943, 1950, 1982, - 1984, 1960, 1926, 1923, 1916, 1931, 1954, 1916, 1915, 1933, 1952, 1950, 1823, 1751, 1735, 1665, 1627, - 1619, 1603, 1860, 1630, 1663, 1760, 1928, 1910, 1773, 1692, 1769, 1652, 1614, 1717, 1767, 1747, 1691, - 1621, 1580, 1547, 1590, 1683, 1645, 1696, 1719, 1701, 1739, 1735, 1713, 1728, 1721, 1843, 1808, 1767]; - const FLAC_2_16000 = - [0, 416, 418, 426, 1010, 1021, 1003, 956, 948, 924, 898, 884, 871, 861, 927, 1036, 1010, 995, 993, 975, - 972, 948, 919, 885, 873, 1396, 1356, 1315, 1269, 1221, 1149, 1115, 1114, 1045, 996, 983, 953, 929, 907, - 898, 869, 844, 1001, 1050, 1027, 1004, 990, 980, 974, 1139, 1205, 1108, 1064, 1249, 1234, 1187, 1143, - 1081, 1030, 1055, 1208, 1158, 1114, 1096, 1049, 1017, 1002, 971, 938, 909, 1092, 1129, 1041, 1043, 1039, - 992, 973, 946, 927, 907, 911, 901, 896, 872, 1062, 1089, 1016, 1145, 1266, 1201, 1148, 1183, 1151, 1127, - 1145, 1227, 1170, 1129, 1370, 1301, 1291, 1384, 1478, 1408, 1321, 1256, 1177, 1136, 1133, 1099, 1085, - 1050, 1044, 1022, 994, 1034, 1191, 1280, 1230, 1018, 950, 990, 1470, 1620, 1570, 1427, 1315, 1389, 1291, - 1241, 1336, 1568, 1598, 1593, 1513, 1334, 1296, 1445, 1581, 1584, 1440, 1311, 1147, 1470, 1489, 1543, - 1558, 1539, 1514, 1319, 1192, 1546, 1585, 1550, 1331, 1635, 1640, 1639, 1567, 1657, 1644, 1593, 1608, - 1573, 1620, 1625, 1629, 1620, 1632, 1611, 1579, 1522, 1446, 1383, 1308, 1265, 1398, 1536, 1494, 1305, - 1204, 1521, 1574, 1416, 1378, 1569, 1557, 1410, 1505, 1446, 1392, 1348, 1568, 1515, 1478, 1444, 1505, - 1542, 1463, 1438, 1341, 1259, 1278, 1247, 1199, 1191, 1219, 1212, 1265, 1482, 1487, 1540, 1587, 1579, - 1548, 1530, 1520, 1473, 1468, 1444, 1447, 1380, 1302, 1226, 1174, 1155, 1405, 1521, 1579, 1560, 1383, - 1400, 1689, 1483, 1553, 1323, 1377, 1552, 1429, 1405, 1536, 1604, 1593, 1561, 1540, 1533, 1536, 1569, - 1690, 1617, 1450, 1540, 1635, 1585, 1547, 1639, 1621, 1674, 1634, 1394, 1342, 1275, 1497, 1508, 1513, - 1483, 1299, 1209, 1536, 1639, 1633, 1614, 1596, 1535, 1541, 1573, 1594, 1599, 1576, 1582, 1535, 1493, - 1474, 1381, 1259, 1283, 1153, 1204, 1384, 1460, 1424, 1185, 1365, 1564, 1602, 1599, 1517, 1623, 1623, - 1433, 1362, 1408, 1380, 1522, 1577, 1567, 1445, 1549, 1553, 1526, 1583, 1501, 1436, 1375, 1348, 1397, - 1504, 1532, 1441, 1336, 1557, 1649, 1636, 1609, 1598, 1548, 1468, 1430, 1543, 1516, 1497, 1503, 1585, - 1616, 1490, 1582, 1185, 1281, 1723, 1770, 1711, 1713, 1710, 1669, 1658, 1643, 1625, 1614, 1587, 1614, - 1617, 1432, 1684, 1760, 1720, 1644, 1863, 1532, 1498, 1841, 1828, 1675, 1579, 1767, 1647, 1560, 1704, - 1699, 1701, 1676, 1579, 1498, 1474, 1569, 1581, 1444, 1641, 1613, 1564, 1483, 1784, 1746, 1513, 1758, - 1736, 1588, 1535, 1722, 1699, 1594, 1622, 1688, 1514, 1536, 1701, 1627, 1616, 1617, 1614, 1614, 1617, - 1621, 1614, 1629, 1629, 1641, 1655, 1663, 1654, 1638, 1639, 1651, 1650, 1648, 1638, 1644, 1638, 1634, - 1647, 1634, 1627, 1631, 1585, 1523, 1464, 1420, 1379, 1348, 1333, 1321, 1304, 1299, 1292, 1309, 1397, - 1518, 1524, 1514, 1421, 1600, 1638, 1564, 1602, 1557, 1621, 1722, 1691, 1571, 1759, 1859, 1756, 1805, - 1811, 1798, 1686, 1564, 1462, 1432, 1433, 1575, 1611, 1467, 1653, 1701, 1757, 1752, 1739, 1817, 1648, - 1608, 1837, 1789, 1642, 1673, 1711, 1522, 1579, 1609, 1746, 1743, 1744, 1712, 1563, 1469, 1552, 1579, - 1524, 1689, 1739, 1596, 1655, 1706, 1711, 1677, 1772, 1802, 1719, 1747, 1837, 1843, 1853, 1775, 1809, - 1821, 1747, 1793, 1753, 1739, 1736, 1736, 1723, 1723, 1725, 1737, 1722, 1730, 1729, 1720, 1726, 1705, - 1719, 1718, 1730, 1734, 1726, 1717, 1696, 1701, 1678, 1655, 1706, 1697, 1685, 1608, 1541, 1473, 1506, - 1693, 1473, 1570, 1604, 1518, 1370, 1604, 1627, 1498, 1622, 1702, 1701, 1659, 1633, 1478, 1568, 1823, - 1721, 1683, 1616, 1592, 1546, 1539, 1546, 1569, 1592, 1566, 1550, 1501, 1383, 1242, 1142, 1139, 1197, - 1136, 1038, 1126, 1450, 1579, 1671, 1658, 1646, 1627, 1563, 1451, 1333, 1213, 1157, 1152, 1135, 1326, - 1656, 1623, 1604, 1575, 1505, 1546, 1601, 1600, 1563, 1475, 1457, 1512, 1737, 1697, 1676, 1805, 1775, - 1791, 1790, 1708, 1476, 1591, 1844, 1814, 1717, 1895, 1904, 1932, 2009, 1932, 1910, 1927, 1889, 1893, - 1875, 1905, 1887, 1797, 1775, 1887, 1887, 1858, 1911, 1902, 1917, 1871, 1901, 1922, 1870, 1813, 1774, - 1757, 1860, 1826, 1832, 1781, 1867, 1850, 1839, 1803, 1622, 1656, 1726, 1678, 1647, 1702, 1818, 1825]; - const FLAC_1_16000 = - [0, 489, 491, 494, 1080, 1089, 1055, 1018, 1015, 994, 973, 947, 935, 922, 990, 1109, 1074, 1053, 1046, - 1032, 1029, 1011, 992, 950, 940, 1462, 1432, 1387, 1328, 1293, 1214, 1172, 1176, 1120, 1058, 1036, - 1017, 1001, 986, 976, 931, 893, 1067, 1130, 1095, 1064, 1048, 1038, 1030, 1212, 1276, 1173, 1140, 1314, - 1301, 1266, 1207, 1148, 1103, 1118, 1281, 1224, 1170, 1160, 1124, 1083, 1060, 1026, 1004, 985, 1155, - 1185, 1117, 1120, 1114, 1050, 1031, 1006, 999, 986, 983, 974, 968, 941, 1131, 1158, 1078, 1216, 1334, - 1275, 1209, 1261, 1220, 1183, 1213, 1297, 1238, 1186, 1440, 1367, 1357, 1449, 1554, 1471, 1399, 1318, - 1252, 1195, 1193, 1163, 1154, 1130, 1124, 1090, 1047, 1093, 1262, 1337, 1299, 1076, 1013, 1063, 1538, - 1688, 1630, 1495, 1386, 1450, 1358, 1305, 1400, 1630, 1672, 1666, 1586, 1401, 1366, 1518, 1648, 1654, - 1513, 1383, 1210, 1537, 1558, 1603, 1614, 1598, 1582, 1386, 1266, 1615, 1652, 1614, 1395, 1696, 1713, - 1707, 1635, 1726, 1717, 1664, 1683, 1636, 1699, 1704, 1708, 1699, 1710, 1687, 1643, 1589, 1514, 1445, - 1379, 1322, 1468, 1601, 1563, 1379, 1276, 1590, 1645, 1473, 1445, 1638, 1622, 1484, 1572, 1514, 1453, - 1415, 1642, 1589, 1560, 1514, 1578, 1603, 1538, 1500, 1412, 1322, 1336, 1308, 1278, 1274, 1292, 1285, - 1335, 1548, 1557, 1613, 1653, 1642, 1605, 1597, 1588, 1548, 1540, 1512, 1511, 1448, 1368, 1297, 1246, - 1225, 1474, 1591, 1644, 1623, 1450, 1471, 1760, 1551, 1623, 1388, 1439, 1611, 1489, 1465, 1602, 1677, - 1661, 1618, 1602, 1597, 1601, 1638, 1756, 1692, 1516, 1608, 1713, 1660, 1613, 1710, 1696, 1739, 1700, - 1456, 1412, 1339, 1573, 1579, 1575, 1560, 1362, 1278, 1612, 1707, 1708, 1692, 1672, 1596, 1599, 1634, - 1664, 1671, 1638, 1647, 1598, 1568, 1550, 1449, 1326, 1349, 1216, 1271, 1451, 1540, 1493, 1252, 1439, - 1635, 1679, 1676, 1583, 1700, 1704, 1498, 1425, 1466, 1445, 1591, 1639, 1626, 1509, 1615, 1609, 1598, - 1648, 1575, 1500, 1445, 1425, 1468, 1576, 1596, 1508, 1404, 1628, 1718, 1711, 1682, 1669, 1608, 1543, - 1491, 1607, 1586, 1570, 1575, 1647, 1692, 1555, 1657, 1251, 1351, 1793, 1844, 1770, 1774, 1768, 1734, - 1727, 1716, 1700, 1688, 1656, 1691, 1690, 1494, 1753, 1835, 1782, 1711, 1925, 1602, 1573, 1911, 1892, - 1743, 1644, 1844, 1719, 1625, 1764, 1757, 1755, 1738, 1651, 1572, 1543, 1633, 1645, 1506, 1710, 1684, - 1627, 1561, 1855, 1816, 1579, 1828, 1797, 1658, 1596, 1786, 1764, 1664, 1690, 1746, 1578, 1608, 1766, - 1702, 1691, 1696, 1692, 1691, 1696, 1699, 1694, 1706, 1707, 1716, 1726, 1729, 1726, 1713, 1713, 1724, - 1722, 1722, 1711, 1717, 1714, 1710, 1720, 1711, 1704, 1706, 1654, 1588, 1539, 1477, 1446, 1425, 1409, - 1399, 1377, 1370, 1359, 1381, 1470, 1584, 1588, 1581, 1489, 1670, 1711, 1633, 1668, 1619, 1688, 1784, - 1761, 1646, 1825, 1923, 1833, 1872, 1876, 1868, 1753, 1631, 1536, 1497, 1495, 1647, 1682, 1540, 1721, - 1769, 1835, 1831, 1806, 1882, 1714, 1677, 1900, 1861, 1707, 1738, 1783, 1589, 1647, 1674, 1817, 1817, - 1820, 1774, 1631, 1551, 1617, 1650, 1590, 1758, 1811, 1662, 1725, 1776, 1774, 1744, 1846, 1870, 1781, - 1819, 1906, 1899, 1912, 1845, 1879, 1886, 1813, 1864, 1829, 1812, 1803, 1808, 1791, 1789, 1789, 1809, - 1791, 1796, 1796, 1783, 1791, 1764, 1779, 1780, 1797, 1803, 1784, 1781, 1753, 1757, 1741, 1723, 1766, - 1760, 1746, 1679, 1604, 1553, 1578, 1755, 1540, 1638, 1678, 1582, 1440, 1678, 1705, 1573, 1685, 1759, - 1759, 1727, 1711, 1543, 1636, 1893, 1783, 1741, 1682, 1665, 1611, 1598, 1607, 1630, 1661, 1621, 1607, - 1572, 1451, 1314, 1203, 1201, 1276, 1199, 1113, 1197, 1520, 1650, 1735, 1728, 1719, 1706, 1631, 1519, - 1399, 1288, 1224, 1215, 1194, 1398, 1722, 1695, 1683, 1640, 1575, 1608, 1675, 1670, 1622, 1544, 1527, - 1588, 1812, 1752, 1739, 1872, 1850, 1862, 1861, 1774, 1538, 1660, 1902, 1880, 1778, 1960, 1981, 1996, - 2078, 2003, 1990, 2002, 1962, 1962, 1938, 1986, 1963, 1871, 1853, 1959, 1963, 1918, 1989, 1980, 1994, - 1943, 1975, 1996, 1939, 1880, 1851, 1838, 1924, 1891, 1897, 1856, 1930, 1905, 1897, 1870, 1701, 1729]; - const FLAC_2_22050 = - [0, 860, 869, 1718, 1700, 1624, 1603, 1521, 1503, 1459, 1720, 1702, 1662, 1660, 1646, 1590, 1505, 2001, - 2289, 2135, 2001, 1881, 1873, 1741, 1662, 1604, 1553, 1520, 1464, 1654, 1738, 1704, 1686, 1644, 1905, - 1887, 1828, 2035, 1978, 1855, 1754, 1867, 1919, 1810, 1754, 1702, 1650, 1579, 1659, 1819, 1723, 1728, - 1662, 1620, 1564, 1540, 1536, 1490, 1741, 1761, 1873, 2007, 1884, 1940, 1843, 1896, 1955, 1948, 2287, - 2169, 2518, 2382, 2108, 1956, 1836, 1823, 1772, 1759, 1701, 1712, 2179, 2367, 1933, 1696, 2516, 3071, - 3006, 2669, 2716, 2462, 2866, 3128, 3074, 2698, 2527, 3093, 3099, 2631, 2298, 2948, 3046, 3080, 3007, - 2529, 2784, 3122, 2817, 3315, 3416, 3098, 3272, 3166, 3130, 3165, 3218, 3247, 3215, 3145, 3037, 2802, - 2462, 2412, 3008, 2884, 2262, 3072, 2825, 2705, 3145, 2798, 2927, 2836, 2826, 3088, 2933, 2965, 3058, - 2847, 2626, 2383, 2239, 2134, 2136, 2301, 2930, 3064, 3217, 3178, 3130, 3088, 2983, 2889, 2799, 2535, - 2258, 2141, 2719, 3007, 2977, 2429, 3295, 2947, 2703, 2818, 2782, 2641, 3127, 3036, 2972, 2948, 2999, - 3309, 3031, 3012, 3516, 2991, 3221, 3256, 3217, 2672, 2579, 2970, 2934, 2855, 2289, 3181, 3232, 3193, - 3100, 3104, 3162, 3197, 3144, 3063, 3017, 2799, 2474, 2206, 2339, 2838, 2782, 2426, 3107, 3216, 3055, - 3185, 2912, 2693, 2798, 3022, 3125, 2879, 3083, 3013, 2973, 2720, 2458, 2572, 2971, 2919, 2545, 3257, - 3189, 3130, 3012, 2825, 2967, 2968, 2911, 3134, 3075, 3052, 2264, 3317, 3376, 3294, 3254, 3167, 3283, - 3404, 3099, 3419, 2874, 3355, 3279, 3423, 3219, 3158, 3628, 3306, 3448, 3282, 3219, 3348, 3285, 3068, - 2832, 3041, 3085, 3130, 3166, 2910, 3505, 3261, 3412, 3531, 2963, 3399, 3285, 3236, 3231, 2979, 3218, - 3137, 3136, 3146, 3138, 3142, 3157, 3160, 3202, 3180, 3158, 3159, 3189, 3204, 3243, 3222, 3222, 3115, - 3101, 2973, 2799, 2595, 2472, 2389, 2352, 2315, 2324, 2538, 2885, 2948, 2698, 3480, 3321, 3146, 3115, - 3364, 3091, 3494, 3567, 3626, 3600, 3341, 2935, 2705, 2713, 3144, 2886, 3482, 3551, 3494, 3609, 3178, - 3609, 3463, 3190, 3281, 3102, 3361, 3495, 3457, 3225, 2870, 3138, 3005, 3423, 3199, 3202, 3370, 3244, - 3497, 3616, 3727, 3668, 3611, 3572, 3665, 3479, 3454, 3446, 3429, 3457, 3468, 3455, 3456, 3445, 3431, - 3406, 3423, 3444, 3440, 3406, 3387, 3335, 3343, 3384, 3317, 3080, 2793, 3385, 2824, 3136, 2892, 2980, - 3416, 3018, 3350, 3326, 3190, 2843, 3661, 3366, 3231, 3112, 3148, 3180, 3139, 3110, 3050, 2793, 2329, - 2123, 2251, 2007, 2195, 3005, 3227, 3202, 3147, 2962, 2630, 2280, 2112, 2152, 2952, 3274, 3238, 3061, - 3162, 3240, 3101, 2969, 3049, 3398, 3406, 3560, 3487, 3471, 2994, 3415, 3652, 3433, 3728, 3838, 3808, - 3742, 3793, 3830, 3790, 3713, 3440, 3718, 3719, 3725, 3740, 3751, 3683, 3729, 3618, 3517, 3689, 3781, - 3604, 3650, 3587, 3449, 3110, 3326, 3168, 3201, 3570, 3587, 3512, 3235, 3428, 3332, 3581, 3675, 3239, - 3791, 3979, 3941, 3514, 3476, 3485, 3812, 3496, 3816, 3536, 3574, 3815, 3754, 3360, 3106, 3216, 3401, - 3429, 3500, 3461, 2964, 3057, 3665, 3591, 3563, 3515, 3274, 3286, 3335, 3290, 3262, 3144, 3112, 3190, - 3463, 3270, 3449, 3730, 3464, 3695, 3100, 3492, 3633, 3583, 3668, 3712, 3776, 3400, 3698, 3371, 3635, - 3646, 3486, 3452, 3771, 3632, 3640, 3467, 3715, 3189, 3617, 3624, 3679, 3830, 3485, 3305, 3012, 3221, - 3531, 3497, 3397, 3280, 3429, 3345, 3286, 3692, 3472, 3524, 3194, 3646, 3594, 3524, 3677, 3701, 3718, - 3704, 3690, 3708, 3711, 3689, 3697, 3687, 3703, 3697, 3732, 3723, 3702, 3724, 3653, 3308, 3238, 3142, - 2963, 2874, 2782, 3311, 2787, 2913, 3326, 3637, 3485, 3296, 3505, 3113, 2835, 2914, 3223, 3142, 2963, - 2829, 2575, 2509, 2751, 2723, 2655, 2805, 2726, 2884, 2889, 2836, 2840, 2821, 3010, 2862, 2891, 2828, - 2857, 2737, 2637, 2653, 2673, 2827, 2783, 2810, 2847, 2782, 2850, 2822, 2817, 2781, 2667, 2955, 2844, - 2708, 2652, 2581, 2493, 2444, 2500, 2547, 2680, 2832, 2652, 2850, 2685, 2811, 2781, 2721, 2713, 2613, - 3022, 2883, 2822, 2682, 2636, 2684, 2622, 2543, 2562, 3081, 2845, 2733, 3243, 3237, 3153, 3113, 3066]; - const FLAC_1_22050 = - [0, 986, 985, 1860, 1833, 1740, 1719, 1669, 1661, 1609, 1853, 1837, 1788, 1767, 1750, 1713, 1661, 2132, - 2432, 2273, 2135, 2006, 1999, 1883, 1771, 1726, 1690, 1669, 1619, 1798, 1889, 1834, 1814, 1758, 2043, - 2022, 1977, 2189, 2104, 1987, 1905, 2001, 2037, 1957, 1907, 1838, 1762, 1706, 1798, 1958, 1866, 1870, - 1773, 1737, 1692, 1679, 1676, 1646, 1876, 1904, 2009, 2144, 2011, 2049, 1979, 2038, 2076, 2086, 2420, - 2295, 2665, 2517, 2259, 2074, 1974, 1964, 1928, 1915, 1834, 1849, 2324, 2520, 2077, 1825, 2659, 3212, - 3145, 2813, 2860, 2598, 2997, 3264, 3201, 2833, 2654, 3230, 3225, 2774, 2443, 3097, 3174, 3200, 3148, - 2658, 2926, 3257, 2962, 3450, 3552, 3239, 3417, 3304, 3266, 3315, 3378, 3401, 3373, 3289, 3173, 2935, - 2611, 2564, 3141, 3024, 2395, 3210, 2966, 2853, 3290, 2939, 3063, 2968, 2967, 3232, 3079, 3107, 3191, - 2984, 2759, 2518, 2367, 2276, 2275, 2431, 3066, 3205, 3354, 3321, 3261, 3209, 3128, 3050, 2931, 2665, - 2395, 2278, 2862, 3145, 3118, 2579, 3428, 3088, 2832, 2959, 2927, 2793, 3267, 3163, 3121, 3106, 3129, - 3441, 3178, 3144, 3662, 3128, 3360, 3406, 3355, 2820, 2712, 3118, 3075, 3002, 2425, 3318, 3381, 3352, - 3237, 3223, 3314, 3350, 3283, 3192, 3154, 2939, 2619, 2347, 2475, 2979, 2933, 2567, 3251, 3368, 3196, - 3343, 3051, 2828, 2920, 3166, 3260, 3019, 3208, 3153, 3115, 2864, 2596, 2706, 3111, 3052, 2689, 3396, - 3346, 3268, 3150, 2953, 3108, 3119, 3065, 3273, 3220, 3197, 2393, 3453, 3516, 3430, 3404, 3320, 3424, - 3535, 3235, 3566, 3016, 3483, 3426, 3562, 3368, 3295, 3760, 3439, 3593, 3437, 3350, 3471, 3426, 3210, - 2961, 3178, 3230, 3263, 3311, 3055, 3644, 3404, 3549, 3665, 3110, 3531, 3411, 3358, 3371, 3122, 3356, - 3281, 3273, 3284, 3274, 3286, 3310, 3306, 3369, 3338, 3306, 3307, 3349, 3370, 3393, 3383, 3382, 3242, - 3224, 3121, 2930, 2735, 2598, 2538, 2511, 2467, 2483, 2676, 3039, 3105, 2842, 3628, 3463, 3281, 3257, - 3512, 3237, 3624, 3715, 3752, 3733, 3490, 3072, 2846, 2863, 3282, 3033, 3626, 3696, 3629, 3748, 3331, - 3743, 3610, 3335, 3416, 3225, 3497, 3648, 3607, 3369, 3016, 3281, 3140, 3564, 3322, 3339, 3487, 3384, - 3651, 3760, 3863, 3785, 3742, 3725, 3817, 3614, 3607, 3594, 3568, 3611, 3624, 3605, 3609, 3590, 3570, - 3530, 3561, 3593, 3586, 3539, 3508, 3460, 3477, 3504, 3447, 3224, 2919, 3525, 2960, 3283, 3031, 3129, - 3556, 3163, 3472, 3453, 3345, 2992, 3809, 3486, 3369, 3241, 3290, 3330, 3281, 3235, 3177, 2938, 2459, - 2269, 2380, 2136, 2330, 3150, 3384, 3361, 3290, 3100, 2764, 2418, 2262, 2291, 3092, 3416, 3389, 3188, - 3312, 3394, 3248, 3114, 3195, 3524, 3534, 3707, 3645, 3629, 3126, 3549, 3799, 3561, 3879, 3980, 3949, - 3884, 3936, 3971, 3926, 3852, 3567, 3868, 3862, 3857, 3887, 3907, 3832, 3869, 3748, 3669, 3832, 3945, - 3743, 3779, 3727, 3594, 3238, 3452, 3307, 3341, 3713, 3720, 3666, 3386, 3564, 3480, 3722, 3809, 3386, - 3928, 4115, 4061, 3669, 3638, 3630, 3947, 3650, 3966, 3666, 3709, 3969, 3882, 3489, 3239, 3359, 3531, - 3569, 3656, 3602, 3106, 3195, 3798, 3732, 3710, 3672, 3421, 3424, 3470, 3430, 3408, 3290, 3238, 3321, - 3623, 3418, 3592, 3877, 3606, 3827, 3249, 3637, 3764, 3721, 3787, 3848, 3941, 3538, 3836, 3510, 3779, - 3778, 3628, 3587, 3904, 3760, 3758, 3604, 3858, 3326, 3761, 3757, 3802, 3973, 3630, 3438, 3148, 3356, - 3683, 3659, 3546, 3422, 3572, 3484, 3421, 3831, 3609, 3653, 3338, 3783, 3730, 3668, 3804, 3836, 3859, - 3837, 3820, 3846, 3854, 3815, 3828, 3811, 3834, 3831, 3881, 3864, 3829, 3869, 3796, 3442, 3395, 3281, - 3111, 3025, 2903, 3458, 2924, 3041, 3459, 3756, 3631, 3438, 3645, 3254, 2963, 3049, 3369, 3287, 3106, - 2955, 2714, 2625, 2902, 2875, 2809, 2925, 2862, 3039, 3050, 2966, 2973, 2942, 3152, 3008, 3048, 2958, - 2993, 2865, 2799, 2811, 2823, 2961, 2908, 2926, 2986, 2905, 2987, 2949, 2948, 2927, 2822, 3098, 2980, - 2850, 2807, 2726, 2622, 2582, 2621, 2680, 2818, 2963, 2812, 2990, 2836, 2950, 2902, 2855, 2850, 2772, - 3152, 3029, 2952, 2832, 2785, 2834, 2783, 2670, 2692, 3231, 2991, 2881, 3382, 3376, 3297, 3241, 3188]; - const FLAC_2_24000 = - [0, 886, 878, 1601, 1662, 1573, 1545, 1510, 1467, 1451, 1423, 1675, 1646, 1603, 1582, 1565, 1534, 1475, - 1443, 2271, 2113, 1991, 1894, 1773, 1789, 1686, 1597, 1552, 1522, 1480, 1453, 1410, 1702, 1665, 1649, - 1612, 1573, 1859, 1815, 1709, 1967, 1926, 1821, 1727, 1662, 1883, 1791, 1735, 1684, 1648, 1571, 1524, - 1517, 1760, 1685, 1672, 1633, 1576, 1530, 1497, 1494, 1481, 1445, 1674, 1711, 1634, 1980, 1840, 1797, - 1819, 1741, 1880, 1839, 1913, 2170, 2058, 2365, 2330, 2069, 1928, 1784, 1753, 1725, 1695, 1695, 1645, - 1679, 2146, 2350, 2033, 1684, 2040, 3016, 3010, 2815, 2760, 2637, 2456, 2925, 3114, 3068, 2777, 2546, - 2926, 3114, 2883, 2537, 2579, 2857, 3086, 3076, 3004, 2538, 2638, 3129, 3013, 2709, 3481, 3397, 3212, - 3228, 3182, 3141, 3147, 3219, 3246, 3214, 3179, 3115, 2920, 2637, 2303, 2587, 3076, 2829, 2270, 3046, - 2861, 2615, 3118, 3019, 2930, 2885, 2751, 2997, 3026, 2915, 2984, 3041, 2837, 2641, 2325, 2228, 2102, - 2067, 2063, 2469, 3055, 3103, 3219, 3186, 3125, 3096, 3034, 2907, 2861, 2645, 2417, 2132, 2172, 2800, - 3024, 2945, 2398, 3393, 2874, 2885, 2548, 2970, 2657, 2892, 3106, 2984, 2933, 2961, 2988, 3342, 3125, - 2908, 3486, 3105, 3200, 3217, 3293, 2991, 2635, 2620, 2971, 2947, 2885, 2300, 3077, 3231, 3249, 3172, - 3100, 3127, 3191, 3205, 3149, 3066, 3044, 2870, 2499, 2290, 2138, 2627, 2916, 2586, 2590, 3152, 3214, - 3051, 3198, 3053, 2551, 2810, 2854, 3135, 3126, 2878, 3082, 3030, 2930, 2680, 2415, 2447, 2942, 3033, - 2651, 2978, 3269, 3156, 3124, 2959, 2811, 2987, 2982, 2923, 3114, 3169, 3098, 2440, 2678, 3468, 3278, - 3267, 3244, 3148, 3257, 3404, 3101, 3270, 3184, 3128, 3438, 3038, 3675, 3048, 3261, 3590, 3306, 3400, - 3304, 3121, 3352, 3299, 3184, 2908, 2802, 3139, 3008, 3274, 3170, 2886, 3435, 3379, 3231, 3690, 3054, - 3244, 3395, 3106, 3278, 3029, 3054, 3218, 3145, 3141, 3149, 3132, 3115, 3143, 3125, 3143, 3189, 3153, - 3133, 3140, 3174, 3186, 3227, 3221, 3193, 3159, 3063, 3059, 2889, 2722, 2519, 2399, 2325, 2300, 2268, - 2266, 2392, 2776, 2916, 2932, 2745, 3560, 3206, 3158, 3107, 3363, 3148, 3245, 3575, 3576, 3608, 3538, - 3196, 2821, 2629, 2692, 3145, 2780, 3513, 3554, 3626, 3622, 3377, 3412, 3588, 3285, 3338, 3202, 3085, - 3341, 3484, 3481, 3379, 2930, 3015, 3158, 2949, 3448, 3177, 3175, 3370, 3229, 3494, 3646, 3713, 3643, - 3664, 3479, 3724, 3487, 3484, 3480, 3468, 3439, 3470, 3480, 3492, 3475, 3491, 3458, 3445, 3442, 3458, - 3457, 3439, 3409, 3397, 3316, 3301, 3381, 3382, 3250, 2890, 2773, 3378, 2823, 3144, 2850, 2941, 3490, - 2979, 3325, 3335, 3209, 3099, 3039, 3661, 3368, 3203, 3106, 3203, 3218, 3130, 3131, 3066, 2942, 2561, - 2180, 2149, 2188, 1952, 2274, 3013, 3229, 3219, 3160, 3043, 2755, 2385, 2139, 2042, 2152, 3190, 3267, - 3233, 3085, 3186, 3220, 3232, 3029, 2736, 3368, 3375, 3517, 3549, 3504, 3465, 2963, 3311, 3694, 3309, - 3669, 3573, 3989, 3727, 3697, 3807, 3777, 3774, 3703, 3428, 3649, 3765, 3675, 3792, 3758, 3588, 3815, - 3705, 3561, 3478, 3676, 3797, 3622, 3602, 3603, 3561, 3158, 3250, 3288, 3099, 3252, 3614, 3570, 3515, - 3219, 3398, 3417, 3194, 3776, 3517, 3309, 3888, 3974, 3871, 3482, 3455, 3371, 3835, 3479, 3719, 3714, - 3424, 3793, 3840, 3548, 3312, 3077, 3226, 3369, 3391, 3516, 3287, 3335, 2800, 3516, 3609, 3661, 3582, - 3583, 3223, 3288, 3292, 3267, 3310, 3166, 3111, 3060, 3339, 3433, 3131, 3562, 3727, 3427, 3674, 3145, - 3390, 3633, 3542, 3669, 3670, 3745, 3708, 3345, 3731, 3324, 3579, 3666, 3592, 3187, 3825, 3652, 3620, - 3557, 3442, 3642, 3115, 3584, 3625, 3641, 3843, 3526, 3532, 3064, 3007, 3395, 3540, 3525, 3339, 3264, - 3429, 3363, 3150, 3632, 3698, 3253, 3507, 3279, 3554, 3543, 3516, 3671, 3689, 3690, 3692, 3690, 3690, - 3726, 3703, 3684, 3686, 3637, 3710, 3705, 3724, 3732, 3679, 3711, 3714, 3372, 3213, 3194, 3055, 2898, - 2833, 2763, 3385, 2714, 2873, 3222, 3687, 3596, 3108, 3478, 3454, 2971, 2750, 3006, 3206, 3155, 3008, - 2842, 2628, 2466, 2522, 2781, 2584, 2663, 2713, 2663, 2847, 2845, 2756, 2786, 2714, 2931, 2836, 2807]; - const FLAC_1_24000 = - [0, 950, 940, 1747, 1783, 1703, 1683, 1655, 1618, 1591, 1546, 1797, 1756, 1726, 1711, 1692, 1674, 1622, - 1589, 2407, 2257, 2125, 2018, 1933, 1937, 1810, 1721, 1685, 1665, 1628, 1603, 1532, 1827, 1780, 1757, - 1729, 1702, 1989, 1959, 1835, 2092, 2045, 1968, 1871, 1781, 2009, 1941, 1876, 1805, 1762, 1706, 1668, - 1663, 1916, 1809, 1795, 1750, 1709, 1671, 1648, 1647, 1631, 1589, 1804, 1845, 1746, 2114, 1977, 1946, - 1960, 1896, 2003, 1975, 2062, 2307, 2205, 2511, 2473, 2208, 2049, 1936, 1908, 1863, 1821, 1828, 1756, - 1800, 2289, 2511, 2177, 1817, 2188, 3156, 3149, 2959, 2901, 2772, 2583, 3061, 3248, 3196, 2911, 2675, - 3075, 3242, 3015, 2683, 2725, 3000, 3208, 3198, 3145, 2674, 2783, 3265, 3144, 2843, 3653, 3535, 3350, - 3385, 3328, 3278, 3295, 3374, 3397, 3370, 3338, 3246, 3069, 2776, 2450, 2729, 3198, 2966, 2394, 3183, - 3008, 2772, 3260, 3153, 3069, 3033, 2883, 3139, 3170, 3055, 3130, 3170, 2969, 2777, 2468, 2351, 2249, - 2230, 2221, 2618, 3194, 3243, 3359, 3331, 3257, 3223, 3168, 3069, 3006, 2786, 2559, 2273, 2323, 2946, - 3161, 3090, 2539, 3531, 3017, 3033, 2700, 3102, 2814, 3042, 3222, 3129, 3093, 3110, 3125, 3469, 3276, - 3035, 3615, 3241, 3342, 3359, 3430, 3126, 2786, 2755, 3119, 3082, 3035, 2438, 3222, 3362, 3403, 3322, - 3224, 3260, 3356, 3360, 3292, 3193, 3170, 3005, 2647, 2429, 2277, 2768, 3074, 2725, 2735, 3294, 3364, - 3190, 3358, 3196, 2697, 2926, 2983, 3274, 3256, 3013, 3203, 3168, 3081, 2824, 2557, 2599, 3081, 3165, - 2799, 3119, 3418, 3308, 3257, 3104, 2941, 3126, 3127, 3081, 3249, 3327, 3237, 2574, 2821, 3621, 3418, - 3411, 3393, 3287, 3406, 3540, 3243, 3414, 3331, 3267, 3583, 3183, 3807, 3191, 3401, 3727, 3441, 3546, - 3467, 3263, 3476, 3437, 3326, 3050, 2939, 3274, 3158, 3418, 3318, 3033, 3581, 3513, 3364, 3833, 3195, - 3372, 3522, 3251, 3417, 3170, 3185, 3355, 3286, 3278, 3290, 3268, 3242, 3287, 3255, 3283, 3358, 3299, - 3265, 3281, 3328, 3343, 3385, 3383, 3360, 3301, 3183, 3182, 3043, 2857, 2648, 2546, 2480, 2452, 2404, - 2404, 2534, 2931, 3074, 3077, 2878, 3708, 3344, 3301, 3252, 3504, 3295, 3391, 3726, 3715, 3734, 3681, - 3325, 2963, 2781, 2843, 3280, 2928, 3652, 3685, 3748, 3774, 3520, 3562, 3729, 3432, 3483, 3337, 3202, - 3481, 3630, 3645, 3521, 3073, 3153, 3308, 3089, 3586, 3308, 3320, 3489, 3358, 3633, 3795, 3854, 3765, - 3785, 3621, 3868, 3635, 3624, 3631, 3625, 3582, 3629, 3641, 3647, 3632, 3657, 3609, 3590, 3587, 3603, - 3615, 3584, 3538, 3525, 3449, 3442, 3501, 3497, 3395, 3024, 2914, 3525, 2965, 3284, 2999, 3082, 3632, - 3122, 3453, 3462, 3349, 3239, 3182, 3795, 3484, 3349, 3252, 3361, 3371, 3271, 3265, 3187, 3092, 2700, - 2312, 2294, 2321, 2080, 2410, 3150, 3388, 3379, 3311, 3178, 2892, 2526, 2282, 2212, 2301, 3332, 3413, - 3385, 3211, 3335, 3381, 3385, 3172, 2876, 3496, 3502, 3643, 3700, 3663, 3612, 3099, 3453, 3828, 3444, - 3813, 3724, 4142, 3872, 3833, 3947, 3912, 3922, 3840, 3555, 3795, 3929, 3805, 3943, 3916, 3736, 3966, - 3843, 3709, 3640, 3813, 3953, 3764, 3742, 3732, 3708, 3287, 3389, 3431, 3219, 3394, 3743, 3709, 3673, - 3359, 3526, 3561, 3335, 3912, 3656, 3453, 4020, 4102, 4012, 3635, 3605, 3515, 3978, 3629, 3852, 3862, - 3578, 3942, 3986, 3689, 3453, 3215, 3374, 3508, 3521, 3670, 3431, 3471, 2925, 3652, 3748, 3797, 3718, - 3720, 3374, 3425, 3428, 3418, 3444, 3314, 3237, 3182, 3487, 3577, 3261, 3697, 3874, 3564, 3796, 3297, - 3520, 3759, 3691, 3790, 3809, 3898, 3860, 3491, 3878, 3467, 3713, 3795, 3725, 3327, 3964, 3770, 3743, - 3701, 3586, 3788, 3255, 3725, 3767, 3767, 3985, 3654, 3674, 3193, 3163, 3534, 3693, 3678, 3494, 3401, - 3571, 3496, 3295, 3776, 3842, 3390, 3643, 3414, 3704, 3690, 3649, 3789, 3821, 3821, 3821, 3820, 3820, - 3876, 3835, 3802, 3812, 3765, 3845, 3838, 3865, 3880, 3805, 3856, 3859, 3500, 3376, 3350, 3185, 3056, - 2969, 2892, 3536, 2862, 3001, 3358, 3819, 3730, 3251, 3614, 3592, 3118, 2886, 3146, 3358, 3294, 3146, - 2982, 2768, 2591, 2654, 2918, 2734, 2814, 2856, 2815, 2985, 2982, 2894, 2913, 2855, 3076, 2969, 2936]; - const FLAC_2_32000 = - [0, 964, 969, 975, 1514, 1489, 1455, 1422, 1419, 1400, 1388, 1384, 1375, 1340, 1444, - 1489, 1459, 1440, 1434, 1427, 1433, 1412, 1399, 1382, 1370, 1975, 1871, 1800, 1729, 1685, - 1620, 1586, 1616, 1513, 1456, 1447, 1411, 1407, 1399, 1394, 1370, 1342, 1505, 1525, 1482, - 1465, 1454, 1437, 1425, 1619, 1670, 1559, 1534, 1727, 1707, 1684, 1617, 1555, 1500, 1526, - 1672, 1606, 1567, 1540, 1492, 1470, 1441, 1423, 1408, 1390, 1551, 1539, 1505, 1493, 1488, - 1439, 1428, 1414, 1402, 1400, 1393, 1403, 1389, 1342, 1507, 1547, 1488, 1644, 1692, 1639, - 1574, 1644, 1618, 1566, 1595, 1678, 1609, 1566, 1921, 1808, 1776, 1991, 2048, 1906, 1771, - 1689, 1627, 1559, 1566, 1532, 1522, 1497, 1500, 1468, 1467, 1614, 2011, 2229, 2091, 1649, - 1572, 1719, 2591, 2936, 2909, 2769, 2551, 2762, 2546, 2371, 2557, 2943, 2982, 2957, 2789, - 2448, 2397, 2683, 2977, 2972, 2709, 2526, 2036, 2787, 2659, 2945, 2935, 2899, 2820, 2434, - 2282, 2847, 2966, 2922, 2434, 3185, 3677, 3488, 2997, 3149, 3049, 2971, 3081, 3001, 3108, - 3162, 3199, 3182, 3159, 3149, 3110, 2958, 2807, 2520, 2219, 2086, 2477, 2941, 2893, 2309, - 2102, 2788, 2935, 2475, 2475, 2953, 2944, 2649, 2728, 2896, 2897, 2603, 2968, 2899, 2827, - 2677, 2906, 2922, 2807, 2707, 2498, 2201, 2059, 1981, 1938, 1896, 1918, 1960, 2430, 2907, - 2974, 3049, 3073, 3069, 3014, 3022, 2960, 2934, 2832, 2808, 2722, 2555, 2357, 2063, 1963, - 1949, 2432, 2764, 2896, 2870, 2430, 2372, 3270, 2703, 2946, 2424, 2553, 2924, 2495, 2457, - 2811, 2950, 2871, 2833, 2771, 2799, 2857, 2821, 3151, 3015, 2502, 2888, 3471, 3088, 2853, - 3038, 3011, 3094, 3094, 2535, 2487, 2362, 2840, 2815, 2712, 2781, 2342, 2015, 3114, 2987, - 3091, 3021, 3048, 2960, 3037, 3121, 3153, 3142, 3100, 3134, 3104, 3000, 2921, 2656, 2337, - 2197, 1978, 2066, 2547, 2811, 2738, 2090, 2580, 2914, 3080, 3083, 2883, 3102, 3068, 2618, - 2494, 2618, 2628, 2919, 3061, 3054, 2715, 2963, 2941, 2884, 2852, 2654, 2440, 2198, 2046, - 2465, 2890, 2958, 2678, 2355, 2935, 3197, 3160, 3106, 3073, 2903, 2746, 2668, 2871, 2848, - 2843, 2856, 3021, 3110, 2929, 2992, 2121, 2367, 3235, 3250, 3100, 3104, 3079, 3034, 2947, - 3073, 3224, 3320, 2796, 2979, 3423, 2566, 3087, 3231, 3073, 3015, 3511, 2882, 3025, 3308, - 3445, 3212, 2954, 3260, 3081, 2883, 3173, 3169, 3115, 3052, 2830, 2671, 2643, 2989, 3054, - 2459, 3132, 2988, 2757, 2635, 3312, 3245, 2889, 3349, 3698, 3027, 2894, 3218, 3243, 3037, - 2962, 3132, 2731, 2718, 3121, 2957, 2950, 2939, 2952, 2924, 2903, 2923, 2927, 2967, 2956, - 3005, 3032, 3016, 3005, 2988, 2987, 3015, 3022, 3065, 3107, 3098, 3098, 3079, 3082, 3008, - 2965, 2965, 2861, 2702, 2552, 2339, 2248, 2198, 2160, 2140, 2103, 2087, 2095, 2204, 2454, - 2739, 2830, 2869, 2549, 3227, 3601, 3126, 3039, 2954, 2968, 3155, 3141, 2867, 3116, 3363, - 3399, 3408, 3432, 3438, 3190, 2865, 2599, 2466, 2426, 2766, 2958, 2640, 3481, 3062, 3457, - 3484, 3293, 3563, 3201, 3131, 3493, 3384, 3057, 3090, 3236, 2937, 2879, 3099, 3361, 3280, - 3297, 3251, 2913, 2640, 2904, 3087, 2760, 3017, 3219, 2887, 2954, 3172, 3199, 3059, 3279, - 3375, 3613, 3726, 3560, 3501, 3479, 3328, 3376, 3749, 3186, 3303, 3315, 3311, 3277, 3296, - 3326, 3354, 3321, 3342, 3309, 3329, 3331, 3268, 3266, 3198, 3242, 3258, 3301, 3296, 3268, - 3242, 3194, 3165, 3134, 3123, 3202, 3175, 3165, 3095, 2832, 2586, 2595, 3388, 2496, 2839, - 3001, 2765, 2314, 3369, 3573, 2844, 3091, 3200, 3207, 3135, 3126, 2828, 3053, 3607, 3262, - 3172, 3105, 3086, 3150, 3357, 3265, 3039, 3082, 2970, 2916, 2846, 2622, 2259, 2056, 2004, - 2094, 1965, 1816, 1945, 2761, 3016, 3141, 3135, 3109, 3026, 2902, 2688, 2419, 2151, 1985, - 1946, 1974, 2321, 3017, 3081, 3129, 2982, 2882, 3036, 3135, 3131, 3077, 3020, 2840, 2727, - 3145, 3119, 3134, 3368, 3333, 3330, 3263, 3222, 2666, 3017, 3545, 3436, 3125, 3446, 3455, - 3637, 3765, 3571, 3559, 3539, 3692, 3840, 3589, 3600, 3544, 3298, 3281, 3650, 3577, 3436, - 3600, 3553, 3542, 3451, 3485, 3557, 3467, 3425, 3282, 3326, 3515, 3736, 3626, 3425, 3516, - 3487, 3439, 3414, 3062, 3127, 3276, 3163, 2981, 3101, 3349, 3411, 3375, 3309, 3155, 3066, - 3251, 3321, 3031, 3508, 3523, 3423, 2989, 3386, 3719, 3818, 3766, 3517, 3284, 3260, 3159, - 3454, 3631, 3269, 3258, 3770, 3628, 3371, 3374, 3829, 3810, 3397, 3219, 3018, 2966, 3157]; - const FLAC_1_32000 = - [0, 1002, 1002, 1011, 1652, 1645, 1597, 1551, 1544, 1520, 1488, 1483, 1473, 1452, 1561, 1648, 1609, 1574, - 1576, 1568, 1566, 1545, 1525, 1477, 1470, 2109, 2003, 1951, 1875, 1810, 1740, 1712, 1738, 1670, 1601, - 1584, 1535, 1527, 1505, 1504, 1472, 1451, 1633, 1666, 1639, 1614, 1604, 1578, 1558, 1748, 1786, 1698, - 1679, 1870, 1836, 1804, 1733, 1691, 1652, 1674, 1788, 1727, 1693, 1680, 1649, 1620, 1583, 1555, 1521, - 1496, 1687, 1682, 1656, 1648, 1648, 1576, 1564, 1542, 1526, 1501, 1515, 1491, 1479, 1458, 1653, 1686, - 1645, 1788, 1826, 1754, 1704, 1753, 1734, 1696, 1729, 1797, 1729, 1699, 2039, 1953, 1935, 2128, 2196, - 2040, 1923, 1819, 1743, 1692, 1702, 1675, 1666, 1655, 1656, 1614, 1625, 1757, 2157, 2350, 2225, 1781, - 1706, 1850, 2732, 3079, 3060, 2919, 2678, 2891, 2678, 2527, 2701, 3100, 3125, 3112, 2927, 2600, 2544, - 2819, 3123, 3121, 2851, 2650, 2168, 2925, 2805, 3100, 3096, 3057, 2949, 2588, 2423, 2999, 3116, 3076, - 2582, 3333, 3802, 3631, 3137, 3294, 3176, 3120, 3202, 3143, 3233, 3309, 3363, 3340, 3310, 3290, 3235, - 3106, 2939, 2665, 2346, 2242, 2615, 3090, 3033, 2465, 2248, 2932, 3078, 2600, 2604, 3099, 3097, 2792, - 2861, 3031, 3044, 2741, 3109, 3039, 2955, 2823, 3056, 3078, 2933, 2848, 2640, 2343, 2221, 2119, 2049, - 2024, 2039, 2093, 2564, 3042, 3117, 3189, 3212, 3210, 3161, 3164, 3109, 3080, 2963, 2932, 2863, 2693, - 2510, 2204, 2087, 2079, 2572, 2899, 3050, 3012, 2564, 2512, 3416, 2844, 3087, 2563, 2694, 3080, 2623, - 2590, 2941, 3104, 3021, 2965, 2898, 2929, 3001, 2959, 3299, 3140, 2623, 3038, 3604, 3227, 2996, 3175, - 3156, 3236, 3228, 2660, 2613, 2519, 2978, 2938, 2847, 2902, 2473, 2167, 3261, 3131, 3213, 3158, 3175, - 3114, 3172, 3246, 3296, 3286, 3221, 3267, 3230, 3137, 3067, 2805, 2468, 2332, 2114, 2211, 2690, 2934, - 2879, 2229, 2709, 3055, 3212, 3210, 3032, 3226, 3186, 2754, 2636, 2778, 2791, 3045, 3187, 3181, 2852, - 3100, 3098, 3027, 2997, 2791, 2583, 2333, 2209, 2608, 3041, 3107, 2811, 2486, 3073, 3346, 3312, 3230, - 3197, 3057, 2878, 2821, 3007, 2983, 2980, 2991, 3154, 3235, 3066, 3124, 2273, 2502, 3380, 3401, 3225, - 3230, 3193, 3167, 3100, 3203, 3367, 3456, 2934, 3122, 3572, 2702, 3228, 3385, 3216, 3154, 3667, 3022, - 3165, 3443, 3589, 3362, 3096, 3407, 3217, 3024, 3322, 3329, 3242, 3193, 2966, 2819, 2783, 3129, 3184, - 2610, 3271, 3124, 2888, 2794, 3450, 3397, 3025, 3490, 3829, 3163, 3051, 3373, 3399, 3184, 3101, 3267, - 2868, 2866, 3264, 3115, 3108, 3098, 3106, 3085, 3067, 3085, 3087, 3115, 3111, 3136, 3160, 3145, 3142, - 3128, 3128, 3150, 3155, 3186, 3230, 3218, 3220, 3198, 3196, 3147, 3113, 3113, 3006, 2846, 2685, 2498, - 2371, 2317, 2295, 2277, 2252, 2241, 2244, 2334, 2599, 2870, 2956, 3022, 2691, 3372, 3734, 3268, 3180, - 3102, 3118, 3294, 3268, 3014, 3261, 3500, 3526, 3539, 3575, 3582, 3330, 3000, 2735, 2598, 2565, 2908, - 3089, 2790, 3620, 3203, 3598, 3642, 3430, 3705, 3332, 3268, 3635, 3505, 3185, 3226, 3367, 3099, 3031, - 3242, 3493, 3425, 3433, 3395, 3044, 2791, 3042, 3209, 2886, 3156, 3353, 3027, 3093, 3314, 3360, 3202, - 3420, 3505, 3741, 3879, 3701, 3663, 3638, 3476, 3511, 3904, 3324, 3445, 3445, 3443, 3421, 3435, 3452, - 3475, 3448, 3470, 3442, 3456, 3455, 3415, 3411, 3364, 3393, 3408, 3436, 3434, 3417, 3395, 3358, 3317, - 3270, 3256, 3367, 3334, 3315, 3222, 2983, 2731, 2728, 3524, 2642, 2984, 3139, 2904, 2459, 3509, 3707, - 2984, 3242, 3355, 3364, 3277, 3260, 2967, 3193, 3744, 3408, 3326, 3235, 3220, 3295, 3477, 3400, 3169, - 3200, 3117, 3071, 2987, 2759, 2392, 2216, 2153, 2247, 2097, 1966, 2095, 2895, 3151, 3281, 3273, 3243, - 3157, 3049, 2833, 2561, 2292, 2122, 2066, 2102, 2451, 3162, 3220, 3270, 3129, 3027, 3166, 3276, 3267, - 3213, 3152, 2982, 2863, 3285, 3252, 3269, 3498, 3468, 3453, 3411, 3372, 2796, 3161, 3696, 3576, 3262, - 3590, 3596, 3772, 3896, 3708, 3705, 3689, 3830, 3972, 3734, 3728, 3692, 3450, 3430, 3774, 3716, 3579, - 3733, 3700, 3690, 3585, 3629, 3702, 3623, 3563, 3425, 3457, 3657, 3888, 3755, 3557, 3656, 3651, 3586]; - const FLAC_2_44100 = - [0, 1859, 1857, 2769, 2742, 2627, 2605, 2527, 2516, 2480, 2742, 2742, 2676, 2657, 2635, - 2606, 2515, 3141, 3291, 3141, 2992, 2885, 2877, 2773, 2736, 2635, 2592, 2529, 2494, 2700, - 2776, 2750, 2723, 2663, 2933, 2885, 2904, 3035, 2974, 2850, 2775, 2899, 2876, 2808, 2777, - 2752, 2684, 2602, 2708, 2780, 2763, 2773, 2680, 2615, 2571, 2550, 2543, 2479, 2767, 2784, - 2958, 2953, 2820, 2887, 2833, 2879, 2899, 2981, 3260, 3143, 3567, 3325, 3082, 2888, 2801, - 2807, 2768, 2749, 2762, 2790, 3462, 3823, 3143, 2887, 4172, 5022, 5229, 4729, 4858, 4358, - 5021, 5443, 5382, 4633, 4306, 5285, 5356, 4618, 3851, 5015, 5192, 5314, 5098, 4249, 4802, - 5440, 4791, 6169, 6876, 5400, 5638, 5372, 5591, 5641, 5905, 6019, 5893, 5771, 5415, 4756, - 3917, 3784, 5277, 5050, 3660, 5099, 4689, 4588, 5469, 4768, 5142, 5562, 4986, 5344, 5082, - 5181, 5224, 4786, 4315, 3823, 3545, 3435, 3429, 3703, 5096, 5486, 5588, 5519, 5535, 5432, - 5238, 5057, 4749, 4206, 3604, 3461, 4372, 5044, 5044, 3989, 5628, 5096, 4643, 4917, 4677, - 4376, 5449, 5195, 5094, 5049, 5046, 5656, 5085, 5027, 6587, 5059, 5577, 5576, 5515, 4503, - 4459, 5114, 4906, 4769, 3710, 5804, 5446, 5459, 5509, 5617, 5863, 5859, 5824, 5830, 5540, - 4909, 4181, 3649, 3790, 5009, 4997, 4059, 5174, 5639, 5336, 5628, 5085, 4465, 4583, 5238, - 5573, 4997, 5385, 5124, 4848, 4260, 3755, 3990, 5314, 5126, 4187, 5707, 5674, 5556, 5232, - 4860, 4992, 5118, 5085, 5468, 5661, 5408, 4016, 5820, 5803, 5618, 5616, 5434, 5516, 6144, - 5102, 6286, 4888, 5791, 5650, 5864, 5748, 5846, 6221, 5736, 5833, 5659, 5429, 5768, 5657, - 5143, 4726, 5331, 5436, 5222, 5267, 4776, 5825, 5656, 6177, 6910, 5188, 5811, 5675, 5457, - 5386, 5042, 5547, 5331, 5241, 5207, 5186, 5279, 5388, 5435, 5406, 5355, 5386, 5408, 5437, - 5549, 5593, 5564, 5574, 5425, 5368, 5145, 4679, 4253, 4021, 3941, 3909, 3867, 3892, 4253, - 4953, 5197, 4543, 6640, 6092, 5428, 5247, 5805, 5220, 5851, 5957, 6193, 6270, 5753, 4910, - 4476, 4536, 5377, 4947, 6218, 6304, 6168, 6454, 5639, 6388, 6011, 5591, 5652, 5125, 5866, - 5985, 5986, 5540, 4764, 5497, 5037, 5706, 5271, 5391, 5854, 5554, 6170, 6878, 7015, 6367, - 6244, 6144, 6844, 5905, 6027, 5905, 5958, 6055, 6037, 6002, 6016, 5929, 5848, 5800, 5811, - 5883, 5874, 5833, 5736, 5630, 5728, 5779, 5701, 5204, 4609, 6035, 4621, 5327, 4850, 5169, - 6683, 5228, 5816, 5859, 5659, 5020, 6666, 5917, 5751, 5603, 6348, 6276, 5462, 5302, 5143, - 4741, 3923, 3624, 3709, 3398, 3750, 5220, 5682, 5649, 5486, 5065, 4355, 3741, 3475, 3501, - 4961, 5583, 5541, 5247, 5560, 5635, 5413, 6030, 5188, 5549, 5671, 6160, 6103, 5981, 5112, - 5912, 6396, 5809, 6249, 6831, 6504, 6575, 6549, 7317, 6651, 6522, 6028, 6518, 6411, 6428, - 6560, 6418, 6437, 6505, 6427, 6172, 6499, 6978, 6565, 6437, 6356, 6293, 5678, 6090, 5713, - 5674, 6169, 6180, 6043, 5537, 6013, 5885, 6527, 6340, 5509, 6437, 6984, 6949, 6015, 5952, - 5911, 6672, 5808, 6952, 6411, 6213, 7302, 6680, 5783, 5358, 6114, 5713, 5794, 6156, 5826, - 4945, 5240, 6276, 6207, 6241, 6176, 5573, 6117, 6086, 5575, 5529, 5370, 5220, 5367, 6235, - 5466, 5876, 6477, 6099, 6597, 5360, 6264, 6361, 6415, 6427, 6610, 6805, 5813, 6273, 5705, - 6333, 6340, 6060, 5977, 6512, 6243, 6218, 5964, 6441, 5486, 6268, 6271, 6327, 7021, 5978, - 5614, 5029, 5531, 6189, 6135, 5857, 5556, 6086, 5841, 5567, 6619, 6261, 6166, 5456, 6139, - 6228, 5990, 6502, 6582, 6609, 6594, 6401, 6542, 6486, 6416, 6383, 6320, 6465, 6464, 6427, - 6409, 6258, 6408, 6214, 5739, 5712, 5575, 5189, 4936, 4695, 5869, 4660, 5062, 5973, 6277, - 6046, 5997, 6570, 5454, 4638, 4853, 5416, 5252, 5077, 4826, 4280, 4045, 4798, 4581, 4265, - 4671, 4326, 4941, 5006, 4675, 4672, 4488, 4948, 4593, 4809, 4489, 4707, 4541, 4362, 4288, - 4237, 4613, 4470, 4460, 4594, 4401, 4765, 4710, 4608, 4507, 4169, 4667, 4485, 4251, 4160, - 3954, 3720, 3702, 3831, 3912, 4365, 4826, 4182, 4741, 4195, 4788, 4650, 4598, 4569, 4051, - 4993, 4657, 4571, 4251, 4196, 4393, 4366, 4117, 4116, 5210, 4746, 4699, 5474, 5478, 5373, - 5337, 5331, 5240, 6873, 5585, 4991, 4979, 5188, 5030, 5520, 4976, 4630, 4585, 4579, 5320, - 4675, 4764, 4814, 4730, 5353, 4907, 4823, 4511, 4966, 5079, 4689, 4827, 4453, 4880, 4531]; - const FLAC_1_44100 = - [0, 2131, 2139, 3015, 2934, 2863, 2836, 2784, 2768, 2753, 2973, 2935, 2893, 2878, 2857, 2845, 2776, 3402, - 3521, 3400, 3296, 3192, 3177, 3028, 2931, 2861, 2840, 2787, 2765, 2967, 3023, 2949, 2921, 2876, 3222, - 3195, 3158, 3321, 3285, 3134, 3030, 3171, 3163, 3076, 3008, 2961, 2895, 2838, 2963, 3040, 2974, 2964, - 2891, 2855, 2818, 2798, 2797, 2765, 3020, 3047, 3192, 3263, 3086, 3184, 3110, 3178, 3210, 3245, 3505, - 3396, 3860, 3582, 3355, 3191, 3068, 3069, 3027, 2989, 2951, 3007, 3726, 4070, 3440, 3202, 4458, 5297, - 5547, 5024, 5134, 4630, 5283, 5712, 5673, 4901, 4565, 5572, 5646, 4895, 4132, 5303, 5494, 5619, 5390, - 4563, 5080, 5705, 5080, 6445, 7184, 5683, 5909, 5669, 5840, 5919, 6196, 6284, 6200, 6083, 5707, 5029, - 4189, 4065, 5545, 5331, 3944, 5386, 4963, 4843, 5730, 5066, 5438, 5832, 5270, 5634, 5390, 5470, 5513, - 5071, 4606, 4076, 3857, 3737, 3729, 3998, 5386, 5777, 5874, 5802, 5821, 5719, 5525, 5334, 5032, 4490, - 3905, 3763, 4683, 5332, 5345, 4258, 5915, 5378, 4940, 5203, 4946, 4631, 5716, 5519, 5373, 5319, 5332, - 5939, 5382, 5337, 6864, 5330, 5867, 5862, 5804, 4773, 4752, 5400, 5194, 5063, 3994, 6086, 5708, 5724, - 5762, 5886, 6180, 6176, 6145, 6135, 5788, 5202, 4455, 3946, 4081, 5299, 5287, 4342, 5462, 5929, 5623, - 5889, 5361, 4767, 4894, 5502, 5847, 5287, 5662, 5414, 5127, 4544, 4017, 4271, 5588, 5401, 4478, 5984, - 5963, 5817, 5524, 5139, 5266, 5408, 5363, 5739, 5944, 5702, 4280, 6093, 6083, 5880, 5872, 5721, 5784, - 6429, 5392, 6570, 5160, 6100, 5931, 6174, 6033, 6117, 6492, 6039, 6102, 5916, 5712, 6083, 5941, 5432, - 5024, 5600, 5705, 5496, 5556, 5066, 6107, 5940, 6453, 7174, 5480, 6112, 5978, 5727, 5682, 5326, 5821, - 5630, 5556, 5533, 5505, 5594, 5670, 5707, 5687, 5649, 5667, 5685, 5701, 5800, 5836, 5808, 5812, 5703, - 5655, 5438, 4979, 4526, 4330, 4228, 4172, 4118, 4152, 4556, 5215, 5511, 4821, 6918, 6389, 5705, 5547, - 6089, 5510, 6142, 6253, 6450, 6564, 6033, 5196, 4744, 4798, 5654, 5218, 6496, 6592, 6473, 6752, 5909, - 6665, 6269, 5876, 5938, 5422, 6153, 6263, 6268, 5827, 5060, 5781, 5326, 5997, 5552, 5683, 6154, 5845, - 6457, 7181, 7301, 6674, 6543, 6441, 7134, 6206, 6309, 6205, 6236, 6318, 6304, 6277, 6292, 6229, 6158, - 6114, 6122, 6189, 6176, 6124, 6038, 5886, 6023, 6088, 5993, 5481, 4921, 6331, 4901, 5615, 5132, 5460, - 6974, 5516, 6147, 6178, 5956, 5325, 6956, 6214, 6060, 5897, 6635, 6574, 5725, 5610, 5442, 5020, 4194, - 3917, 3976, 3682, 4010, 5510, 5961, 5928, 5755, 5342, 4640, 4021, 3795, 3805, 5239, 5868, 5824, 5554, - 5823, 5905, 5699, 6305, 5477, 5799, 5927, 6444, 6382, 6264, 5405, 6206, 6684, 6085, 6549, 7126, 6812, - 6849, 6852, 7608, 6922, 6806, 6320, 6783, 6706, 6687, 6835, 6728, 6723, 6794, 6736, 6422, 6793, 7287, - 6854, 6741, 6675, 6572, 5972, 6347, 5980, 5957, 6423, 6432, 6300, 5810, 6287, 6143, 6795, 6623, 5778, - 6719, 7273, 7257, 6286, 6242, 6185, 6943, 6130, 7226, 6708, 6511, 7547, 6970, 6093, 5654, 6376, 5999, - 6100, 6412, 6114, 5254, 5533, 6556, 6484, 6522, 6428, 5840, 6403, 6372, 5849, 5797, 5661, 5550, 5659, - 6515, 5752, 6175, 6781, 6393, 6856, 5635, 6544, 6664, 6728, 6739, 6894, 7069, 6077, 6571, 6021, 6627, - 6652, 6334, 6269, 6820, 6529, 6494, 6248, 6738, 5776, 6558, 6574, 6626, 7284, 6258, 5893, 5276, 5819, - 6441, 6376, 6135, 5851, 6336, 6111, 5852, 6906, 6546, 6468, 5752, 6417, 6503, 6291, 6799, 6849, 6879, - 6858, 6691, 6824, 6783, 6736, 6709, 6640, 6774, 6775, 6749, 6734, 6548, 6735, 6509, 6057, 6013, 5837, - 5476, 5196, 5000, 6147, 4947, 5350, 6254, 6574, 6309, 6280, 6839, 5726, 4932, 5125, 5707, 5569, 5353, - 5106, 4568, 4374, 5084, 4857, 4536, 4962, 4583, 5244, 5260, 4969, 4949, 4740, 5243, 4902, 5091, 4764, - 4969, 4834, 4605, 4557, 4516, 4880, 4740, 4708, 4886, 4648, 5049, 5018, 4887, 4787, 4470, 4954, 4752, - 4525, 4466, 4237, 3988, 3970, 4064, 4183, 4655, 5105, 4476, 5045, 4489, 5056, 4971, 4913, 4860, 4370, - 5271, 4953, 4841, 4528, 4476, 4685, 4606, 4415, 4409, 5490, 5031, 4978, 5751, 5753, 5659, 5639, 5629]; - const FLAC_2_48000 = - [0, 1848, 1926, 2642, 2628, 2547, 2515, 2484, 2447, 2425, 2400, 2678, 2589, 2559, 2538, - 2529, 2507, 2454, 2424, 3245, 3063, 2952, 2870, 2781, 2796, 2724, 2604, 2544, 2508, 2469, - 2435, 2407, 2745, 2655, 2608, 2580, 2535, 2847, 2805, 2767, 2916, 2890, 2815, 2748, 2689, - 2848, 2768, 2770, 2695, 2633, 2552, 2507, 2472, 2740, 2680, 2647, 2591, 2543, 2489, 2463, - 2462, 2447, 2403, 2677, 2744, 2652, 2926, 2785, 2778, 2784, 2766, 2819, 2803, 2950, 3096, - 2999, 3379, 3245, 2995, 2850, 2765, 2759, 2753, 2683, 2687, 2613, 2693, 3283, 3646, 3185, - 2812, 3332, 4666, 4940, 4810, 4711, 4542, 4128, 4892, 5241, 5255, 4584, 4101, 4800, 5185, - 4809, 4190, 4262, 4504, 5155, 5088, 4954, 4113, 4407, 5205, 5015, 4509, 6837, 6251, 5415, - 5253, 5267, 5392, 5501, 5756, 5884, 5761, 5684, 5478, 4921, 4156, 3521, 3986, 5243, 4611, - 3540, 4880, 4612, 4214, 5225, 5059, 4759, 5431, 5126, 4886, 5065, 4878, 5102, 5036, 4622, - 4231, 3723, 3473, 3355, 3329, 3317, 4076, 5124, 5291, 5362, 5295, 5321, 5235, 5106, 4887, - 4699, 4270, 3772, 3383, 3487, 4358, 4911, 4794, 3823, 5551, 4766, 4848, 4297, 4978, 4118, - 4735, 5192, 5035, 4907, 4863, 4851, 5440, 5095, 4578, 6085, 5207, 5328, 5329, 5453, 4910, - 4369, 4379, 4939, 4768, 4701, 3628, 5616, 5105, 5293, 5290, 5273, 5534, 5726, 5716, 5696, - 5712, 5423, 4866, 4219, 3702, 3422, 4235, 5068, 4227, 4255, 5192, 5446, 5126, 5462, 5220, - 4152, 4415, 4617, 5380, 5339, 4862, 5142, 4913, 4572, 4066, 3624, 3654, 4929, 5171, 4211, - 4831, 5576, 5430, 5309, 5017, 4647, 4848, 4988, 4935, 5170, 5481, 5603, 4164, 4688, 5840, - 5458, 5409, 5366, 5192, 5271, 5945, 4985, 5472, 5594, 5220, 5731, 5054, 6103, 5529, 5540, - 5947, 5478, 5591, 5522, 5080, 5597, 5532, 5248, 4752, 4611, 5360, 4999, 5279, 5165, 4630, - 5550, 5880, 5744, 6988, 5292, 5409, 5623, 5275, 5358, 4991, 4991, 5339, 5138, 5078, 5055, - 5034, 5073, 5198, 5208, 5235, 5253, 5166, 5230, 5254, 5257, 5323, 5387, 5349, 5344, 5320, - 5198, 5176, 4888, 4442, 4062, 3910, 3844, 3830, 3761, 3759, 3940, 4507, 4915, 4962, 4455, - 6673, 5399, 5246, 5104, 5551, 5225, 5170, 5811, 5882, 6070, 6021, 5268, 4597, 4311, 4418, - 5190, 4560, 6268, 5919, 6166, 6032, 5818, 5735, 6024, 5485, 5550, 5337, 4994, 5615, 5775, - 5800, 5566, 4760, 4903, 5384, 4706, 5631, 5129, 5218, 5688, 5344, 5932, 6505, 6865, 6011, - 6200, 5803, 6743, 5811, 5760, 5775, 5737, 5740, 5807, 5788, 5785, 5778, 5739, 5667, 5629, - 5621, 5643, 5695, 5651, 5640, 5543, 5411, 5465, 5626, 5599, 5299, 4680, 4516, 5815, 4535, - 5164, 4590, 4816, 6600, 4875, 5642, 5659, 5559, 5393, 5165, 6299, 5689, 5600, 5427, 6240, - 6170, 5268, 5179, 5027, 4835, 4180, 3581, 3520, 3510, 3268, 3794, 5058, 5513, 5513, 5367, - 5063, 4434, 3847, 3438, 3335, 3482, 5041, 5451, 5347, 5047, 5327, 5461, 5287, 6095, 4551, - 5436, 5283, 5646, 5951, 5843, 5752, 4979, 5593, 6363, 5447, 6095, 6012, 6895, 6263, 6375, - 6583, 6894, 6473, 6326, 5857, 6252, 6350, 6072, 6385, 6348, 6132, 6369, 6370, 6226, 5992, - 6309, 6818, 6450, 6281, 6218, 6387, 5657, 5758, 5875, 5356, 5611, 5975, 5958, 5818, 5344, - 5740, 5855, 5377, 6492, 5870, 5496, 6461, 6863, 6629, 5816, 5762, 5562, 6568, 5682, 6129, - 6798, 5921, 6854, 7100, 5927, 5555, 5272, 5963, 5533, 5610, 5994, 5430, 5539, 4528, 5859, - 5905, 6141, 6044, 5956, 5335, 5983, 5983, 5354, 5477, 5226, 5096, 5019, 5678, 5968, 5100, - 5935, 6349, 5880, 6378, 5308, 5995, 6162, 6180, 6277, 6280, 6599, 6525, 5503, 6152, 5489, - 5980, 6161, 6093, 5355, 6594, 6160, 6002, 6034, 5815, 6188, 5345, 6018, 6087, 6119, 6566, - 6038, 5883, 5075, 4998, 5702, 5994, 5991, 5576, 5395, 5900, 5739, 5207, 6307, 6428, 5644, - 5930, 5445, 5923, 6002, 5853, 6333, 6357, 6357, 6378, 6288, 6207, 6327, 6236, 6222, 6192, - 6132, 6268, 6263, 6216, 6211, 6047, 6207, 6182, 5617, 5553, 5525, 5274, 4954, 4702, 4622, - 5742, 4503, 4848, 5554, 6112, 5936, 5151, 6333, 5808, 4889, 4379, 4903, 5171, 5071, 4918, - 4679, 4258, 3949, 4113, 4812, 4123, 4310, 4389, 4157, 4865, 4834, 4504, 4568, 4275, 4817, - 4518, 4526, 4522, 4323, 4639, 4326, 4165, 4092, 4061, 4356, 4378, 4200, 4488, 4261, 4306, - 4636, 4415, 4614, 4167, 4035, 4491, 4317, 4103, 4006, 3863, 3675, 3500, 3587, 3685, 3828]; - const FLAC_1_48000 = - [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, 2806, 2796, 2786, 2774, 2758, - 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, 2839, 2794, 2770, 2763, 2756, 2722, 2950, 2876, 2842, - 2827, 2792, 3121, 3075, 2969, 3240, 3199, 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, - 2779, 2963, 2893, 2870, 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, 2876, 3223, 3040, 3006, - 3042, 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, 3300, 3140, 3014, 2975, 2952, 2896, 2897, 2842, - 2929, 3567, 3929, 3485, 3082, 3625, 4953, 5239, 5094, 4993, 4821, 4431, 5195, 5542, 5557, 4894, 4414, - 5085, 5496, 5089, 4459, 4532, 4778, 5460, 5372, 5224, 4395, 4701, 5512, 5304, 4798, 7128, 6534, 5704, - 5562, 5539, 5675, 5780, 6058, 6194, 6076, 5971, 5758, 5202, 4438, 3821, 4267, 5550, 4896, 3841, 5166, - 4904, 4504, 5530, 5354, 5047, 5695, 5422, 5168, 5338, 5154, 5385, 5322, 4934, 4512, 4001, 3793, 3624, - 3589, 3562, 4346, 5407, 5582, 5645, 5581, 5605, 5520, 5399, 5164, 4991, 4556, 4058, 3662, 3757, 4627, - 5183, 5061, 4114, 5840, 5051, 5126, 4573, 5269, 4437, 5021, 5508, 5289, 5171, 5153, 5118, 5721, 5375, - 4863, 6353, 5477, 5608, 5614, 5737, 5178, 4614, 4671, 5204, 5027, 4977, 3922, 5904, 5397, 5594, 5600, - 5591, 5796, 6044, 6022, 5994, 6015, 5700, 5163, 4484, 3987, 3725, 4514, 5340, 4509, 4541, 5468, 5727, - 5407, 5727, 5494, 4417, 4656, 4885, 5673, 5632, 5149, 5442, 5176, 4862, 4361, 3908, 3947, 5231, 5472, - 4490, 5130, 5846, 5700, 5619, 5295, 4952, 5129, 5241, 5198, 5455, 5746, 5888, 4432, 4970, 6133, 5731, - 5688, 5656, 5500, 5588, 6209, 5276, 5760, 5864, 5509, 6038, 5326, 6365, 5815, 5825, 6237, 5755, 5891, - 5817, 5365, 5850, 5791, 5522, 5056, 4884, 5659, 5270, 5561, 5436, 4949, 5844, 6162, 6030, 7279, 5559, - 5701, 5883, 5536, 5648, 5264, 5279, 5658, 5433, 5350, 5318, 5282, 5346, 5516, 5539, 5553, 5572, 5485, - 5558, 5580, 5582, 5627, 5670, 5648, 5646, 5622, 5527, 5497, 5161, 4709, 4394, 4175, 4081, 4061, 4011, - 4014, 4223, 4789, 5174, 5239, 4747, 6919, 5692, 5537, 5377, 5835, 5514, 5467, 6099, 6189, 6330, 6292, - 5544, 4863, 4575, 4693, 5478, 4844, 6558, 6200, 6434, 6316, 6088, 6020, 6317, 5786, 5829, 5622, 5229, - 5902, 6078, 6110, 5849, 5050, 5190, 5664, 4980, 5917, 5415, 5501, 5977, 5626, 6218, 6795, 7169, 6290, - 6471, 6082, 7028, 6106, 6046, 6071, 6033, 6025, 6106, 6086, 6080, 6072, 6040, 5948, 5889, 5881, 5915, - 6000, 5932, 5915, 5804, 5686, 5746, 5885, 5856, 5591, 4967, 4784, 6090, 4812, 5471, 4890, 5108, 6862, - 5153, 5918, 5936, 5845, 5674, 5444, 6582, 5977, 5855, 5703, 6552, 6468, 5587, 5490, 5280, 5115, 4460, - 3888, 3833, 3829, 3508, 4062, 5353, 5780, 5774, 5657, 5347, 4709, 4122, 3743, 3603, 3749, 5328, 5729, - 5630, 5315, 5626, 5727, 5574, 6360, 4835, 5701, 5598, 5932, 6239, 6134, 6044, 5270, 5875, 6670, 5712, - 6345, 6295, 7171, 6556, 6709, 6871, 7193, 6783, 6647, 6141, 6535, 6642, 6343, 6702, 6661, 6413, 6689, - 6658, 6501, 6264, 6626, 7097, 6742, 6578, 6492, 6699, 5931, 6014, 6182, 5646, 5876, 6254, 6243, 6145, - 5635, 6055, 6156, 5646, 6776, 6139, 5786, 6750, 7176, 6917, 6147, 6077, 5862, 6855, 5971, 6423, 7094, - 6191, 7137, 7390, 6224, 5825, 5558, 6257, 5805, 5870, 6265, 5719, 5821, 4812, 6136, 6201, 6424, 6299, - 6241, 5628, 6263, 6245, 5650, 5744, 5554, 5384, 5275, 5963, 6251, 5376, 6222, 6661, 6156, 6698, 5580, - 6283, 6429, 6437, 6574, 6574, 6869, 6794, 5774, 6448, 5767, 6261, 6411, 6342, 5652, 6890, 6417, 6274, - 6294, 6105, 6488, 5639, 6309, 6373, 6380, 6846, 6321, 6163, 5348, 5294, 5976, 6265, 6265, 5876, 5693, - 6200, 6020, 5489, 6589, 6710, 5915, 6210, 5728, 6208, 6281, 6125, 6636, 6664, 6661, 6679, 6592, 6493, - 6647, 6510, 6493, 6450, 6378, 6561, 6547, 6491, 6480, 6305, 6474, 6441, 5868, 5801, 5773, 5571, 5206, - 5003, 4905, 6027, 4755, 5163, 5827, 6382, 6230, 5445, 6622, 6095, 5204, 4645, 5178, 5478, 5345, 5174, - 4992, 4560, 4232, 4380, 5098, 4428, 4612, 4683, 4466, 5129, 5110, 4780, 4842, 4545, 5089, 4795, 4796]; - const FLAC_2_64000 = - [0, 1669, 1670, 1670, 2340, 2269, 2317, 2346, 2351, 2271, 2185, 2143, 2103, 2074, 2250, 2279, - 2306, 2310, 2333, 2300, 2281, 2243, 2211, 2139, 2098, 2662, 2524, 2467, 2423, 2363, 2292, 2272, - 2335, 2289, 2298, 2287, 2278, 2272, 2195, 2174, 2110, 2065, 2292, 2288, 2315, 2298, 2301, 2272, - 2232, 2305, 2326, 2288, 2321, 2428, 2393, 2360, 2303, 2266, 2326, 2336, 2392, 2318, 2295, 2310, - 2332, 2309, 2260, 2203, 2172, 2117, 2293, 2298, 2342, 2325, 2308, 2268, 2235, 2211, 2151, 2136, - 2182, 2215, 2204, 2145, 2320, 2299, 2333, 2463, 2411, 2334, 2261, 2319, 2300, 2269, 2297, 2348, - 2302, 2268, 2583, 2477, 2451, 2687, 2782, 2572, 2437, 2370, 2324, 2254, 2303, 2315, 2300, 2292, - 2294, 2329, 2304, 2398, 2756, 2931, 2845, 2394, 2328, 2521, 3519, 3885, 4046, 4025, 3759, 4006, - 3738, 3453, 3632, 4128, 4361, 4430, 4094, 3649, 3491, 3967, 4292, 4193, 3865, 3581, 2831, 3896, - 3704, 4195, 4205, 4125, 4085, 3517, 3352, 4156, 4262, 4226, 3496, 4662, 6024, 5461, 4187, 4517, - 4275, 4238, 4552, 4480, 4659, 4895, 5045, 4980, 4890, 4892, 4759, 4432, 3953, 3432, 2977, 2794, - 3316, 4302, 4165, 3131, 2899, 3817, 4169, 3547, 3573, 4309, 4263, 3964, 3901, 4435, 4507, 3750, - 4152, 4130, 4112, 3865, 4222, 4103, 3849, 3648, 3378, 3049, 2929, 2829, 2789, 2777, 2770, 2832, - 3430, 4126, 4320, 4379, 4339, 4323, 4335, 4379, 4231, 4168, 3996, 3919, 3711, 3449, 3205, 2847, - 2768, 2753, 3247, 3688, 3944, 3891, 3297, 3412, 4535, 3801, 4113, 3614, 3726, 4262, 3536, 3501, - 4110, 4227, 4111, 4017, 3989, 3911, 4060, 3981, 4443, 4252, 3533, 4064, 5218, 4409, 4039, 4357, - 4349, 4430, 4602, 3635, 3668, 3478, 4089, 3986, 3850, 3921, 3299, 2831, 4787, 4104, 4314, 4273, - 4406, 4396, 4502, 4768, 4834, 4835, 4776, 4879, 4804, 4581, 4284, 3830, 3349, 3056, 2792, 2828, - 3502, 4083, 3917, 2887, 3595, 4104, 4527, 4548, 4121, 4553, 4539, 3748, 3457, 3565, 3593, 4088, - 4517, 4487, 3903, 4308, 4197, 3997, 3818, 3499, 3259, 2982, 2798, 3251, 4069, 4283, 3624, 3313, - 4152, 4566, 4527, 4429, 4329, 4107, 3860, 3727, 4010, 4015, 4017, 3998, 4317, 4574, 4637, 4457, - 3082, 3492, 4898, 4738, 4425, 4421, 4359, 4378, 4158, 4189, 4552, 4861, 3852, 4246, 5264, 3549, - 4547, 4746, 4419, 4346, 5080, 4303, 4765, 4673, 4898, 4600, 4238, 4844, 4495, 4113, 4562, 4589, - 4519, 4378, 3979, 3762, 3713, 4377, 4504, 3512, 4297, 4295, 3976, 3874, 4777, 5204, 4368, 4872, - 6048, 4428, 4125, 4656, 4625, 4440, 4274, 4510, 3857, 3854, 4537, 4294, 4190, 4138, 4125, 4071, - 4068, 4113, 4204, 4292, 4284, 4326, 4349, 4309, 4273, 4353, 4353, 4342, 4362, 4366, 4425, 4411, - 4425, 4424, 4409, 4283, 4232, 4304, 4109, 3844, 3538, 3315, 3220, 3128, 3102, 3106, 3046, 3029, - 3059, 3165, 3384, 3817, 3977, 4094, 3551, 4535, 5708, 4500, 4272, 4246, 4224, 4445, 4485, 4064, - 4460, 4852, 4815, 5002, 5055, 5072, 4596, 4056, 3619, 3475, 3408, 3939, 4228, 3907, 5348, 4338, - 5019, 5100, 4821, 5333, 4726, 4440, 5217, 4833, 4415, 4566, 4678, 4172, 4061, 4538, 4907, 4858, - 4800, 4630, 4133, 3734, 4124, 4563, 3882, 4262, 4678, 4105, 4211, 4598, 4708, 4372, 4647, 5019, - 5553, 5935, 5259, 5132, 5211, 4868, 4928, 5996, 4450, 4735, 4762, 4811, 4723, 4714, 4827, 4774, - 4762, 4757, 4740, 4753, 4708, 4622, 4597, 4551, 4575, 4603, 4675, 4670, 4610, 4646, 4551, 4482, - 4415, 4450, 4635, 4625, 4595, 4405, 4039, 3661, 3631, 4942, 3496, 3910, 4211, 3810, 3203, 5047, - 5586, 3868, 4510, 4669, 4681, 4614, 4784, 4069, 4324, 5387, 4820, 4692, 4642, 4607, 4931, 5592, - 5133, 4404, 4368, 4161, 4066, 3975, 3627, 3060, 2832, 2784, 2854, 2775, 2592, 2764, 3951, 4435, - 4563, 4560, 4483, 4336, 4051, 3554, 3233, 2892, 2769, 2734, 2745, 3325, 4188, 4463, 4516, 4185, - 4094, 4352, 4505, 4453, 4274, 5178, 4375, 3927, 4473, 4296, 4400, 4917, 4914, 4841, 4758, 4758, - 3918, 4495, 5413, 5163, 4485, 5071, 4915, 5499, 5666, 5300, 5356, 5395, 5617, 6137, 5582, 5373, - 5380, 4976, 4912, 5553, 5322, 5054, 5356, 5378, 5330, 5175, 5267, 5444, 5278, 5335, 5079, 5130, - 5307, 5849, 5634, 5393, 5338, 5208, 5189, 5296, 4621, 4671, 5039, 4826, 4409, 4602, 4924, 5003, - 4984, 4854, 4552, 4504, 4825, 4958, 4431, 5407, 5202, 4985, 4330, 4957, 5508, 5925, 5814, 5185]; - const FLAC_1_64000 = - [0, 1899, 1923, 1932, 2561, 2511, 2475, 2450, 2428, 2382, 2318, 2271, 2264, 2309, 2485, 2522, 2475, 2457, - 2429, 2414, 2378, 2356, 2324, 2275, 2300, 2861, 2774, 2745, 2715, 2623, 2523, 2481, 2607, 2533, 2449, - 2432, 2389, 2363, 2329, 2312, 2262, 2289, 2478, 2533, 2502, 2449, 2424, 2378, 2346, 2543, 2577, 2441, - 2444, 2716, 2690, 2635, 2531, 2469, 2415, 2469, 2684, 2571, 2506, 2471, 2421, 2387, 2357, 2333, 2285, - 2268, 2511, 2476, 2440, 2422, 2413, 2387, 2352, 2326, 2302, 2268, 2319, 2349, 2343, 2293, 2451, 2492, - 2423, 2597, 2713, 2610, 2498, 2578, 2542, 2501, 2533, 2606, 2567, 2486, 2796, 2749, 2718, 2956, 3005, - 2800, 2721, 2645, 2573, 2488, 2491, 2462, 2444, 2399, 2439, 2403, 2395, 2576, 2989, 3240, 3075, 2656, - 2591, 2763, 3781, 4149, 4328, 4317, 4029, 4306, 4017, 3729, 3892, 4443, 4626, 4681, 4388, 3954, 3822, - 4242, 4560, 4484, 4145, 3879, 3028, 4151, 3986, 4494, 4497, 4424, 4388, 3792, 3621, 4439, 4537, 4506, - 3769, 4946, 6288, 5754, 4473, 4795, 4542, 4526, 4850, 4748, 4968, 5160, 5310, 5234, 5155, 5154, 5058, - 4694, 4213, 3691, 3240, 3020, 3568, 4565, 4430, 3369, 3142, 4081, 4445, 3866, 3879, 4573, 4538, 4245, - 4161, 4732, 4776, 4031, 4425, 4403, 4399, 4137, 4505, 4388, 4093, 3916, 3649, 3315, 3222, 3092, 3028, - 2972, 2973, 3050, 3695, 4403, 4599, 4660, 4611, 4603, 4620, 4663, 4508, 4438, 4274, 4183, 3975, 3717, - 3419, 3093, 2974, 2958, 3522, 3945, 4208, 4165, 3562, 3660, 4806, 4066, 4388, 3887, 3998, 4537, 3850, - 3818, 4365, 4514, 4424, 4313, 4273, 4177, 4339, 4256, 4743, 4522, 3842, 4338, 5504, 4691, 4331, 4640, - 4625, 4718, 4877, 3921, 3945, 3769, 4383, 4278, 4127, 4217, 3559, 3101, 5079, 4379, 4579, 4541, 4660, - 4634, 4774, 5063, 5113, 5108, 5067, 5141, 5091, 4885, 4565, 4074, 3613, 3322, 3024, 3055, 3752, 4380, - 4197, 3078, 3848, 4384, 4812, 4839, 4393, 4840, 4820, 3992, 3727, 3865, 3893, 4346, 4791, 4757, 4183, - 4573, 4473, 4283, 4074, 3774, 3488, 3261, 3030, 3519, 4358, 4552, 3863, 3558, 4419, 4865, 4809, 4684, - 4595, 4392, 4129, 3996, 4288, 4313, 4306, 4296, 4589, 4872, 4926, 4745, 3359, 3758, 5157, 5045, 4677, - 4669, 4615, 4632, 4462, 4483, 4808, 5121, 4110, 4525, 5534, 3844, 4823, 5042, 4707, 4624, 5359, 4581, - 5035, 4945, 5169, 4894, 4542, 5119, 4758, 4397, 4864, 4894, 4801, 4653, 4258, 4003, 4008, 4631, 4778, - 3773, 4587, 4570, 4270, 4128, 5061, 5504, 4649, 5150, 6318, 4709, 4422, 4942, 4943, 4727, 4564, 4783, - 4135, 4121, 4817, 4566, 4487, 4440, 4421, 4384, 4380, 4432, 4494, 4560, 4559, 4588, 4603, 4578, 4545, - 4600, 4602, 4587, 4610, 4620, 4676, 4645, 4675, 4669, 4652, 4564, 4520, 4561, 4418, 4098, 3823, 3547, - 3443, 3375, 3355, 3355, 3319, 3310, 3329, 3399, 3628, 4044, 4256, 4398, 3811, 4814, 6004, 4772, 4557, - 4531, 4518, 4729, 4754, 4341, 4761, 5159, 5100, 5278, 5348, 5348, 4876, 4345, 3907, 3778, 3676, 4212, - 4505, 4182, 5637, 4607, 5304, 5386, 5098, 5626, 4995, 4713, 5497, 5109, 4679, 4842, 4966, 4474, 4378, - 4827, 5176, 5127, 5089, 4938, 4404, 3990, 4404, 4868, 4174, 4542, 4953, 4398, 4486, 4885, 4995, 4659, - 4937, 5302, 5836, 6225, 5538, 5421, 5506, 5154, 5221, 6260, 4731, 5011, 5043, 5089, 5000, 5000, 5115, - 5049, 5035, 5040, 5019, 5036, 5000, 4929, 4900, 4834, 4865, 4895, 4968, 4949, 4908, 4926, 4830, 4741, - 4684, 4698, 4948, 4923, 4905, 4675, 4326, 3940, 3912, 5233, 3761, 4181, 4500, 4092, 3446, 5330, 5879, - 4118, 4814, 4989, 4998, 4901, 5078, 4338, 4608, 5686, 5100, 5014, 4950, 4919, 5205, 5838, 5411, 4660, - 4618, 4464, 4376, 4264, 3890, 3318, 3063, 3000, 3087, 2958, 2805, 3000, 4221, 4724, 4846, 4847, 4754, - 4606, 4341, 3846, 3465, 3158, 2957, 2904, 2934, 3566, 4451, 4747, 4802, 4459, 4391, 4622, 4780, 4725, - 4556, 5458, 4651, 4188, 4741, 4564, 4642, 5201, 5199, 5114, 5037, 5032, 4191, 4773, 5692, 5443, 4755, - 5345, 5189, 5780, 5974, 5610, 5646, 5679, 5915, 6412, 5853, 5656, 5666, 5270, 5203, 5824, 5618, 5314, - 5640, 5665, 5636, 5470, 5578, 5716, 5580, 5633, 5356, 5416, 5617, 6146, 5895, 5687, 5626, 5538, 5508]; - const FLAC_2_88200 = - [0, 2545, 2533, 3406, 3336, 3295, 3414, 3555, 3412, 3349, 3280, 3439, 3314, 3277, 3341, 3406, 3537, 3454, - 3357, 3707, 3747, 3591, 3471, 3398, 3347, 3391, 3313, 3380, 3447, 3527, 3440, 3384, 3319, 3347, 3330, - 3286, 3420, 3375, 3455, 3383, 3277, 3464, 3461, 3429, 3336, 3285, 3394, 3432, 3321, 3307, 3362, 3403, - 3513, 3416, 3476, 3336, 3258, 3423, 3424, 3499, 3433, 3384, 3405, 3439, 3370, 3372, 3294, 3401, 3532, - 3397, 3325, 3400, 3340, 3355, 3401, 3316, 3696, 3574, 3587, 4035, 3753, 3502, 3378, 3311, 3338, 3359, - 3348, 3301, 3368, 3468, 3987, 4078, 3815, 3424, 4028, 5193, 5507, 5562, 5239, 5278, 4821, 5140, 5740, - 6007, 5618, 4979, 5088, 5864, 5697, 5000, 4397, 5443, 5278, 5782, 5658, 5480, 4685, 5392, 5904, 5502, - 5473, 7988, 6833, 6042, 5902, 5911, 6088, 6141, 6502, 6589, 6599, 6414, 6245, 5774, 4898, 4146, 4145, - 5405, 5675, 4336, 4582, 5768, 4858, 5267, 5871, 5481, 5290, 6018, 5646, 5652, 5557, 5360, 5716, 5554, - 5053, 4709, 4168, 4068, 4092, 4035, 3982, 4384, 5517, 5931, 6002, 5875, 5894, 5926, 5710, 5419, 5249, - 4954, 4475, 4116, 4019, 4269, 4965, 5390, 5053, 4387, 6120, 5396, 5392, 5097, 5679, 4807, 5402, 5832, - 5669, 5558, 5339, 5371, 6069, 5944, 4969, 5958, 6859, 5637, 5924, 5917, 6267, 4956, 4879, 5384, 5476, - 5265, 5233, 4025, 6421, 5773, 5902, 5950, 5977, 6245, 6522, 6379, 6353, 6363, 6046, 5505, 4849, 4280, - 4126, 4380, 5430, 5236, 4379, 5353, 6161, 6006, 6003, 6095, 5016, 4890, 4909, 5562, 6038, 5738, 5705, - 5648, 5373, 4944, 4450, 4124, 4302, 5432, 5700, 4709, 5482, 6177, 6009, 5902, 5632, 5198, 5239, 5471, - 5505, 5590, 6083, 6238, 5721, 4344, 6327, 6442, 6125, 6018, 5985, 5769, 5866, 6458, 5309, 6678, 5627, - 6212, 6620, 5702, 6813, 6250, 6299, 6566, 6242, 6204, 6280, 5684, 6304, 6264, 6138, 5428, 4978, 5645, - 5951, 4934, 5746, 5605, 5548, 6576, 6086, 6797, 7853, 5490, 6212, 6236, 5820, 6015, 5387, 5954, 6010, - 5882, 5831, 5818, 5818, 5871, 5986, 6085, 6076, 6094, 5960, 6002, 5971, 5996, 6002, 6066, 5993, 5997, - 5983, 5882, 5890, 5762, 5211, 4809, 4477, 4324, 4271, 4241, 4179, 4219, 4417, 4995, 5321, 5472, 4940, - 7369, 6443, 5925, 5730, 6195, 6092, 5718, 6666, 6546, 6816, 6771, 6200, 5356, 4881, 4768, 5561, 5623, - 6782, 6307, 6805, 6711, 7228, 6270, 6725, 6663, 6053, 6421, 5959, 5561, 6401, 6481, 6532, 6238, 5408, - 5275, 6138, 5307, 6452, 5674, 5878, 6541, 6389, 6445, 6784, 7670, 7494, 6963, 6913, 6455, 7769, 6217, - 6477, 6541, 6473, 6490, 6530, 6517, 6461, 6503, 6374, 6324, 6264, 6259, 6286, 6392, 6344, 6328, 6163, - 6040, 6021, 6317, 6281, 6141, 5558, 4924, 6308, 5505, 5363, 5701, 4609, 6741, 7026, 5597, 6547, 6489, - 6382, 5989, 6403, 6964, 6453, 6320, 6110, 6988, 7032, 5940, 5955, 5672, 5502, 4858, 4127, 4056, 4012, - 3954, 3801, 5292, 6058, 6208, 6071, 5912, 5319, 4662, 4084, 4070, 4014, 4456, 5806, 6174, 5884, 5586, - 5942, 6066, 5870, 6952, 5211, 6035, 5853, 6163, 6750, 6653, 6493, 6105, 5744, 7229, 6576, 6627, 6766, - 7676, 7349, 7219, 7275, 8390, 7334, 7361, 7290, 6504, 7326, 7163, 6987, 7283, 7168, 6958, 7333, 7245, - 7176, 6893, 7116, 7757, 7419, 7249, 7203, 7223, 6579, 6152, 6787, 6219, 6069, 6756, 6937, 6915, 6401, - 6073, 6479, 6264, 7045, 6976, 6291, 6384, 7401, 7932, 7363, 6792, 6694, 6315, 7419, 6595, 6844, 7880, - 6694, 7416, 8329, 7314, 6416, 5968, 6634, 6463, 6347, 6644, 6564, 6725, 5216, 5528, 6857, 6548, 7113, - 6810, 6622, 5988, 6791, 6561, 6144, 6216, 5937, 5810, 5642, 6326, 6675, 5727, 6772, 7316, 7025, 7260, - 6635, 6818, 7053, 7078, 7282, 7263, 7570, 7826, 6818, 6554, 7167, 5751, 7318, 7084, 6727, 6377, 7464, - 7114, 6937, 6940, 6761, 7068, 6074, 6870, 7071, 7040, 7255, 7003, 6867, 5831, 5295, 6233, 7024, 6952, - 6694, 5817, 6375, 6605, 5817, 6521, 7497, 6856, 6782, 6287, 6747, 6794, 6589, 6774, 7212, 7176, 7200, - 7088, 7007, 6905, 7144, 6989, 7017, 7021, 6920, 7102, 7039, 6967, 6939, 6857, 6978, 6985, 6781, 6516, - 6393, 6263, 5740, 5308, 5037, 5538, 6307, 4918, 5531, 6613, 6890, 6676, 5845, 7143, 6493, 5291, 4843]; - const FLAC_1_88200 = - [0, 2788, 2776, 3594, 3609, 3577, 3513, 3458, 3372, 3299, 3297, 3543, 3607, 3537, 3509, 3441, 3419, 3371, - 3321, 3842, 4082, 3955, 3825, 3708, 3603, 3719, 3603, 3546, 3468, 3407, 3378, 3318, 3306, 3640, 3624, - 3547, 3503, 3431, 3639, 3659, 3527, 3789, 3793, 3721, 3588, 3536, 3701, 3748, 3615, 3551, 3520, 3458, - 3400, 3346, 3561, 3573, 3513, 3486, 3468, 3417, 3358, 3334, 3347, 3382, 3334, 3476, 3565, 3485, 3882, - 3723, 3596, 3687, 3606, 3640, 3690, 3610, 4058, 3933, 3919, 4214, 4022, 3830, 3703, 3574, 3574, 3548, - 3492, 3552, 3497, 3607, 4177, 4364, 4122, 3756, 4257, 5591, 5936, 6001, 5656, 5721, 5131, 5493, 6101, - 6406, 6028, 5324, 5455, 6270, 6100, 5365, 4543, 5748, 5630, 6146, 6043, 5880, 5031, 5768, 6296, 5867, - 5843, 8484, 7174, 6420, 6303, 6305, 6573, 6599, 6924, 6954, 6968, 6864, 6670, 6094, 5174, 4465, 4271, - 5690, 5981, 4557, 4909, 6175, 5189, 5659, 6224, 5899, 5663, 6343, 5891, 6026, 5942, 5767, 6067, 5902, - 5418, 4997, 4489, 4293, 4173, 4102, 4077, 4613, 5905, 6272, 6344, 6284, 6296, 6321, 6080, 5810, 5675, - 5227, 4804, 4284, 4100, 4536, 5313, 5800, 5392, 4690, 6503, 5808, 5811, 5466, 6079, 5092, 5783, 6215, - 6066, 5961, 5765, 5723, 6452, 6315, 5280, 6381, 7240, 6001, 6320, 6329, 6722, 5372, 5278, 5749, 5902, - 5646, 5647, 4290, 6810, 6154, 6301, 6366, 6386, 6756, 6931, 6834, 6803, 6769, 6384, 5887, 5205, 4606, - 4150, 4665, 5789, 5566, 4578, 5740, 6567, 6406, 6393, 6525, 5400, 5177, 5201, 5987, 6458, 6129, 6098, - 6004, 5763, 5235, 4802, 4311, 4540, 5806, 6003, 5027, 5856, 6571, 6377, 6182, 5983, 5593, 5611, 5866, - 5873, 5966, 6471, 6597, 6083, 4655, 6682, 6901, 6616, 6462, 6358, 6081, 6134, 6772, 5704, 7033, 5939, - 6584, 7024, 6091, 7162, 6605, 6684, 6988, 6618, 6585, 6705, 6105, 6804, 6787, 6633, 5850, 5348, 5963, - 6310, 5246, 6150, 6057, 6031, 7010, 6439, 7223, 8368, 5858, 6656, 6733, 6234, 6460, 5726, 6339, 6390, - 6242, 6207, 6182, 6189, 6217, 6437, 6571, 6578, 6569, 6412, 6446, 6372, 6397, 6442, 6479, 6384, 6396, - 6381, 6215, 6221, 6084, 5615, 5087, 4866, 4745, 4679, 4608, 4567, 4608, 4783, 5319, 5745, 5844, 5252, - 7821, 6760, 6290, 6165, 6641, 6524, 6144, 7062, 6949, 7225, 7144, 6560, 5734, 5122, 5021, 5935, 6052, - 7104, 6707, 7194, 7067, 7729, 6612, 7122, 7058, 6431, 6796, 6345, 5956, 6799, 6927, 6927, 6685, 5809, - 5623, 6620, 5666, 6870, 6085, 6298, 6982, 6764, 6844, 7212, 8093, 7945, 7394, 7310, 6904, 8266, 6560, - 6882, 6948, 6880, 6922, 6984, 6923, 6838, 6896, 6852, 6780, 6714, 6714, 6756, 6859, 6804, 6781, 6599, - 6469, 6466, 6784, 6758, 6614, 5942, 5238, 6596, 5800, 5738, 5986, 4980, 7069, 7432, 6006, 6990, 6955, - 6774, 6391, 6717, 7355, 6909, 6822, 6546, 7456, 7474, 6317, 6329, 6006, 5874, 5194, 4412, 4186, 4282, - 4097, 4088, 5696, 6462, 6633, 6442, 6222, 5679, 4964, 4373, 4117, 4151, 4628, 6235, 6550, 6267, 5973, - 6315, 6462, 6256, 7396, 5560, 6412, 6192, 6530, 7155, 7054, 6919, 6461, 6143, 7691, 7033, 7089, 7180, - 8099, 7867, 7729, 7763, 8875, 7805, 7891, 7810, 6910, 7784, 7623, 7415, 7803, 7695, 7386, 7860, 7741, - 7692, 7295, 7603, 8204, 7920, 7756, 7722, 7706, 7025, 6521, 7217, 6591, 6464, 7231, 7361, 7350, 6780, - 6473, 6901, 6632, 7408, 7438, 6713, 6739, 7867, 8393, 7780, 7205, 7115, 6708, 7858, 7017, 7236, 8386, - 7120, 7864, 8879, 7711, 6863, 6411, 7012, 6883, 6834, 7060, 6928, 7128, 5646, 5922, 7264, 6966, 7528, - 7191, 7056, 6346, 7169, 6943, 6566, 6665, 6345, 6176, 6015, 6683, 7047, 6102, 7251, 7781, 7476, 7775, - 7010, 7207, 7546, 7608, 7832, 7800, 8046, 8242, 7252, 7042, 7659, 6123, 7736, 7602, 7158, 6792, 7929, - 7632, 7385, 7393, 7217, 7572, 6428, 7277, 7542, 7504, 7685, 7359, 7244, 6192, 5755, 6631, 7504, 7393, - 7121, 6134, 6788, 6996, 6174, 6911, 7966, 7323, 7185, 6719, 7152, 7236, 7025, 7220, 7616, 7632, 7636, - 7563, 7427, 7304, 7620, 7444, 7435, 7475, 7312, 7580, 7515, 7402, 7337, 7250, 7411, 7425, 7260, 6994, - 6901, 6799, 6115, 5761, 5390, 5937, 6698, 5239, 5872, 7000, 7304, 7085, 6242, 7589, 6849, 5669, 5093]; - const HEV2_AAC_2_96000 = - [0, 279, 279, 279, 328, 361, 335, 315, 311, 295, 300, 289, 284, 276, 282, 304, 276, 284, 283, 231, 228, - 311, 307, 300, 294, 294, 285, 268, 271, 265, 275, 260, 244, 282, 279, 279, 271, 249, 270, 262, 266, - 277, 273, 277, 268, 281, 273, 271, 280, 281, 312, 253, 261, 273, 276, 261, 323, 306, 307, 284, 291, - 269, 271, 268, 274, 289, 278, 266, 279, 267, 277, 293, 276, 269, 290, 280, 268, 291, 262, 277, 270, - 274, 271, 284, 276, 280, 314, 271, 273, 278, 278, 281, 277, 279, 283, 275, 288, 282, 273, 272, 283, - 282, 275, 278, 281, 278, 285, 282, 274, 303, 303, 273, 270, 279, 279, 269, 268, 281, 271, 284, 272, - 275, 276, 281, 274, 275, 282, 279, 274, 283, 278, 280, 276, 274, 281, 287, 283, 283, 292, 270, 289, - 272, 291, 271, 310, 312, 247, 254, 308, 250, 261, 314, 293, 276, 274, 288, 263, 291, 280, 266, 280, - 266, 267, 284, 282, 270, 279, 273, 323, 258, 274, 273, 273, 276, 283, 284, 278, 280, 276, 292, 267, - 271, 304, 253, 273, 309, 297, 285, 281, 288, 277, 274, 273, 282, 277, 275, 268, 280, 280, 274, 280, - 276, 273, 330, 253, 262, 284, 285, 264, 279, 283, 282, 275, 276, 267, 277, 276, 280, 277, 292, 275, - 280, 278, 282, 273, 278, 271, 278, 288, 283, 273, 275, 287, 282, 284, 277, 280, 277, 321, 255, 302, - 278, 273, 273, 269, 286, 274, 277, 267, 290, 270, 266, 282, 281, 299, 279, 272, 304, 290, 261, 277, - 302, 284, 261, 271, 270, 266, 280, 267, 284, 281, 273, 284, 311, 302, 263, 247, 304, 305, 249, 306, - 299, 280, 271, 281, 291, 262, 260, 261, 265, 268, 287, 282, 287, 279, 279, 272, 289, 259, 253, 296, - 271, 270, 299, 298, 289, 291, 279, 289, 274, 279, 274, 287, 276, 286, 270, 274, 280, 271, 278, 297, - 276, 267, 273, 276, 283, 276, 273, 275, 275, 273, 311, 291, 273, 265, 286, 275, 286, 276, 275, 279, - 277, 282, 273, 307, 258, 272, 265, 270, 271, 281, 280, 289, 286, 280, 282, 287, 291, 276, 292, 268, - 282, 282, 279, 274, 271, 278, 303, 274, 266, 273, 301, 272, 276, 286, 270, 277, 298, 273, 280, 272, - 280, 273, 309, 266, 268, 273, 278, 288, 282, 308, 318, 288, 292, 282, 266, 261, 258, 256, 267, 275, - 268, 288, 293, 301, 284, 271, 276, 278, 291, 279, 292, 306, 263, 260, 265, 267, 271, 263, 270, 271, - 287, 279, 285, 282, 285, 299, 273, 278, 284, 280, 288, 269, 281, 281, 268, 271, 279, 278, 284, 278, - 315, 269, 260, 279, 272, 281, 276, 286, 279, 273, 275, 278, 284, 279, 278, 298, 287, 290, 287, 271, - 277, 270, 273, 280, 332, 270, 264, 253, 277, 272, 282, 279, 279, 284, 274, 299, 288, 285, 280, 273, - 303, 296, 303, 304, 256, 254, 261, 259, 271, 282, 273, 266, 280, 271, 280, 277, 274, 275, 275, 283, - 280, 280, 282, 279, 282, 288, 273, 280, 279, 283, 332, 270, 263, 273, 273, 270, 274, 272, 273, 272, - 282, 290, 284, 298, 291, 319, 271, 257, 263, 269, 268, 270, 276, 278, 280, 270, 275, 288, 293, 289, - 292, 277, 292, 279, 279, 269, 274, 277, 279, 279, 278, 280, 271, 283, 286, 282, 270, 277, 271, 278, - 280, 281, 280, 276, 287, 284, 281, 276, 281, 280, 285, 273, 282, 271, 278, 276, 272, 279, 287, 270, - 280, 283, 276, 277, 281, 276, 273, 278, 271, 284, 280, 273, 273, 290, 302, 317, 287, 284, 261, 264, - 267, 266, 275, 270, 276, 279, 286, 270, 278, 283, 291, 284, 269, 306, 263, 276, 281, 284, 271, 286, - 282, 276, 285, 277, 315, 307, 264, 268, 267, 273, 276, 277, 280, 295, 279, 315, 266, 259, 255, 310, - 288, 258, 269, 271, 272, 271, 277, 276, 302, 271, 272, 283, 275, 272, 286, 271, 280, 271, 279, 298, - 291, 281, 280, 268, 268, 269, 269, 281, 291, 283, 279, 286, 273, 282, 273, 285, 275, 271, 283, 302, - 286, 285, 304, 284, 280, 276, 282, 276, 274, 272, 274, 283, 278, 271, 267, 288, 282, 271, 267, 272, - 291, 273, 279, 291, 271, 267, 272, 303, 284, 266, 276, 278, 269, 285, 271, 276, 284, 274, 272, 289, - 280, 275, 285, 280, 281, 274, 278, 282, 275, 283, 293, 292, 292, 279, 267, 285, 283, 281, 282, 273, - 281, 278, 271, 273, 268, 278, 270, 288, 300, 284, 278, 277, 276, 279, 282, 284, 280, 282, 290, 274, - 280, 277, 292, 269, 271, 286, 272, 270, 279, 276, 276, 271, 279, 273, 280, 283, 272, 281, 279, 281]; - const AAC_ES_DICT = { - 'LC_AAC_2_96000' : LC_AAC_2_96000, - 'LC_AAC_1_96000' : LC_AAC_1_96000, - 'LC_AAC_2_8000' : LC_AAC_2_8000, - 'LC_AAC_1_8000' : LC_AAC_1_8000, - 'LC_AAC_2_11025' : LC_AAC_2_11025, - 'LC_AAC_1_11025' : LC_AAC_1_11025, - 'LC_AAC_2_12000' : LC_AAC_2_12000, - 'LC_AAC_1_12000' : LC_AAC_1_12000, - 'LC_AAC_2_16000' : LC_AAC_2_16000, - 'LC_AAC_1_16000' : LC_AAC_1_16000, - 'LC_AAC_2_22050' : LC_AAC_2_22050, - 'LC_AAC_1_22050' : LC_AAC_1_22050, - 'HE_AAC_2_24000' : HE_AAC_2_24000, - 'HE_AAC_1_24000' : HE_AAC_1_24000, - 'HE_AAC_2_32000' : HE_AAC_2_32000, - 'HE_AAC_1_32000' : HE_AAC_1_32000, - 'HE_AAC_2_44100' : HE_AAC_2_44100, - 'HE_AAC_1_44100' : HE_AAC_1_44100, - 'HE_AAC_2_48000' : HE_AAC_2_48000, - 'HE_AAC_1_48000' : HE_AAC_1_48000, - 'HE_AAC_2_64000' : HE_AAC_2_64000, - 'HE_AAC_1_64000' : HE_AAC_1_64000, - 'HE_AAC_2_88200' : HE_AAC_2_88200, - 'HE_AAC_1_88200' : HE_AAC_1_88200, - 'HEv2_AAC_2_96000' : HEV2_AAC_2_96000 - }; - const FLAC_ES_DICT = { - 'FLAC_2_96000' : FLAC_2_96000, - 'FLAC_1_96000' : FLAC_1_96000, - 'FLAC_2_8000' : FLAC_2_8000, - // 'FLAC_1_8000' : FLAC_1_8000, - 'FLAC_2_11025' : FLAC_2_11025, - 'FLAC_1_11025' : FLAC_1_11025, - 'FLAC_2_12000' : FLAC_2_12000, - 'FLAC_1_12000' : FLAC_1_12000, - // 'FLAC_2_16000' : FLAC_2_16000, - 'FLAC_1_16000' : FLAC_1_16000, - 'FLAC_2_22050' : FLAC_2_22050, - 'FLAC_1_22050' : FLAC_1_22050, - 'FLAC_2_24000' : FLAC_2_24000, - 'FLAC_1_24000' : FLAC_1_24000, - 'FLAC_2_32000' : FLAC_2_32000, - 'FLAC_1_32000' : FLAC_1_32000, - 'FLAC_2_44100' : FLAC_2_44100, - 'FLAC_1_44100' : FLAC_1_44100, - 'FLAC_2_48000' : FLAC_2_48000, - 'FLAC_1_48000' : FLAC_1_48000, - 'FLAC_2_64000' : FLAC_2_64000, - 'FLAC_1_64000' : FLAC_1_64000, - 'FLAC_2_88200' : FLAC_2_88200, - 'FLAC_1_88200' : FLAC_1_88200, - }; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - needGetMediaDes = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - NEW_ES_LIST = []; - channelCountList = []; - sampleRateList = []; - ES = []; - ES_LENGTH = 0; - rate = 44.1; - isMp3 = false; - isVorbis = false; - ES_DICT = {} - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - console.info('case audioDecodeProcessor is not null'); - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - async function beforeTest() { - console.info('beforeTest case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - needGetMediaDes = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = []; - ES_LENGTH = 0; - rate = 44.1; - isMp3 = false; - isVorbis = false; - } - - async function aferTest() { - console.info('afterTest case'); - if (audioDecodeProcessor != null) { - console.info('case audioDecodeProcessor is not null'); - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - inputCnt = 0; - outputCnt = 0; - await closeFdRead(); - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - async function closeFdRead() { - await fileio.close(fdRead).then(() => { - console.info('[fileio] case close fdRead success, fd is ' + fdRead); - }, failCallback).catch(failCatch); - } - - function writeFile(buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.writeSync buffer success'); - } catch(e) { - console.info('case fileio.writeSync buffer error is ' + e); - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - inputobject.timeMs = timestamp; - inputobject.offset = 0; - if (frameCnt==1 && isVorbis) { - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 8; - } else if (isMp3) { - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } else { - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - } - if (isMp3) { - timestamp += ES[1]/rate; - } else { - timestamp += ES[frameCnt]/rate; - } - frameCnt += 1; - audioDecodeProcessor.pushInputData(inputobject).then(() => { - console.info("pushInputData success"); - inputCnt += 1; - }) - } - } - - async function dequeueAllOutputs(queue, nextStep, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await audioDecodeProcessor.stop().then(() => { - console.log("stop success"); - }, failCallback).catch(failCatch); - inputQueue = []; - outputQueue = []; - await audioDecodeProcessor.reset().then(() => { - console.log("reset success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.release().then(() => { - console.info('release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - if(ES_LIST == false) { - done(); - } else { - await aferTest(); - nextStep(); - } - } - else{ - console.log("write to file success"); - } - audioDecodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }) - } - } - - function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info("AudioDecoder config is" + item + ":" + property); - } - } - - function setCallback(nextStep, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info("needInputData"); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info("newOutputData"); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.log("get OutputMediaDescription success"); - console.log('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }, failCallback).catch(failCatch);} - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, nextStep, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - eventEmitter.on('nextStep', async (done) => { - console.info('in case : nextStep success'); - await beforeTest(); - let fileName = ES_LIST.shift(); - let configList = fileName.split("_").reverse(); - let sampleRate = Number(configList[0]); - let channelCount = Number(configList[1]); - let mime = 'audio/mp4a-latm'; - let savePath = `${fileName}.pcm`; - let srcPath = `${fileName}.aac`; - rate = (sampleRate / 1000); - let mediaDescription = { - "channel_count": channelCount, - "sample_rate": sampleRate, - "audio_sample_format": 1, - } - needGetMediaDes = true; - ES = ES_DICT[fileName] - ES_LENGTH = ES.length - 1; - if(configList[2] === 'AAC') { - console.info('in case : AAC'); - mime = 'audio/mp4a-latm'; - if(configList[3] === 'LC') { - codecProfile = 0; - }else if(configList[3] === 'HE') { - codecProfile = 3; - }else if(configList[3] === 'HEv2') { - codecProfile = 4; - } - mediaDescription = { - "channel_count": channelCount, - "sample_rate": sampleRate, - "audio_sample_format": 1, - "codec_profile" : codecProfile, - } - }else if(configList[2] === 'FLAC') { - mime = 'audio/flac'; - srcPath = `${fileName}.flac` - } - console.info('ES_LENGTH: ' + ES_LENGTH); - await decoderSource(mediaDescription, savePath, mime, srcPath, done); - - }); - - async function getFormatCaps(decodeMime) { - await media.createAudioDecoderByMime(decodeMime).then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - console.info("print AudioCaps.supportedSampleRates: " + AudioCaps.supportedSampleRates) - console.info("print AudioCaps.supportedChannel.min: " + AudioCaps.supportedChannel.min) - console.info("print AudioCaps.supportedChannel.max: " + AudioCaps.supportedChannel.max) - sampleRateList = AudioCaps.supportedSampleRates; - for (let i = AudioCaps.supportedChannel.min; i <= AudioCaps.supportedChannel.max; i++) { - channelCountList.push(i); - } - }, failCallback).catch(failCatch); - - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - - async function getEsList(format) { - for (let index in configList) { - let fileName = `${format}_${configList[index]}`; - NEW_ES_LIST.push(fileName); - } - } - - async function decoderSource(config, savePath, mime, readPath, done) { - console.info('start test case'); - let mediaDescription = config; - let decodeMime = mime; - await getFdRead(readPath, done); - console.info('case getFdRead success'); - await media.createAudioDecoderByMime(decodeMime).then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback( - function(){eventEmitter.emit('nextStep', done);}, done - ); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getOutputMediaDescription().then((mediaDescription) => { - console.info("getOutputMediaDescription success"); - printfDescription(mediaDescription); - },failCallback).catch(failCatch); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_COMPATIBILITY_AAC_PROMISE_0100 - * @tc.name : 001.test AAC format compatibility - * @tc.desc : audio decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_COMPATIBILITY_AAC_PROMISE_0100', 0, async function (done) { - console.log("case test AAC format compatibility"); - await getFormatCaps('audio/mp4a-latm'); - ES_DICT = AAC_ES_DICT; - let FORMAT_LIST = ["LC_AAC", "HE_AAC", "HEv2_AAC"] - let COMPATIBILITY_LIST = [channelCountList, sampleRateList] - for (let index in COMPATIBILITY_LIST) { - configList = COMPATIBILITY_LIST[index]; - FORMAT_LIST.forEach(getEsList); - FORMAT_LIST = NEW_ES_LIST; - NEW_ES_LIST = []; - } - for (let index in FORMAT_LIST) { - let fileName = FORMAT_LIST[index]; - if (fileName in ES_DICT){ - NEW_ES_LIST.push(fileName); - } - } - ES_LIST = NEW_ES_LIST; - console.log('ES_LIST: ' + ES_LIST); - let nextStep = function(){eventEmitter.emit('nextStep', done);} - nextStep(); - - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_COMPATIBILITY_FLAC_PROMISE_0100 - * @tc.name : 001.test FLAC format compatibility - * @tc.desc : audio decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_COMPATIBILITY_FLAC_PROMISE_0100', 0, async function (done) { - console.log("case test FLAC format compatibility"); - await getFormatCaps('audio/flac'); - ES_DICT = FLAC_ES_DICT; - let FORMAT_LIST = ["FLAC"] - let COMPATIBILITY_LIST = [channelCountList, sampleRateList] - for (let index in COMPATIBILITY_LIST) { - configList = COMPATIBILITY_LIST[index]; - FORMAT_LIST.forEach(getEsList); - FORMAT_LIST = NEW_ES_LIST; - NEW_ES_LIST = []; - } - for (let index in FORMAT_LIST) { - let fileName = FORMAT_LIST[index]; - if (fileName in ES_DICT){ - NEW_ES_LIST.push(fileName); - } - } - ES_LIST = NEW_ES_LIST; - console.log('ES_LIST: ' + ES_LIST); - let nextStep = function(){eventEmitter.emit('nextStep', done);} - nextStep(); - - }) - -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioEncoderFormatCompatibilityPromiseTest.test.js b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioEncoderFormatCompatibilityPromiseTest.test.js deleted file mode 100644 index 07d6febc6..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/AudioEncoderFormatCompatibilityPromiseTest.test.js +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright (C) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioEncoderFormatCompatibilityPromise', function () { - let audioEncodeProcessor; - let eosframenum = 0; - let resetAtEOS = false; - let workdoneAtEOS = false; - let needgetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let rate = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = [0, 2048]; - let ES_LENGTH = 1000; - let readPath; - let fdRead; - let fdWrite; - let readStreamSync; - let fileAssetWrite; - let channelCount; - let channelCountList = []; - let sampleRateList = []; - let formatSampleRate = []; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioEncodeProcessor != null) { - console.info('case audioEncodeProcessor is not null'); - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - audioEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - async function resetParam() { - eosframenum = 0; - resetAtEOS = false; - workdoneAtEOS = false; - needgetMediaDes = false; - needrelease = false - frameCnt = 1; - timestamp = 0; - rate = 0; - sawInputEOS = false; - sawOutputEOS = false; - readStreamSync = undefined; - inputQueue = []; - outputQueue = []; - ES = [0, 4096] - ES_LENGTH = 1000; - outputCnt = 0; - inputCnt = 0; - } - - async function beforeTest() { - console.info('beforeTest case'); - audioEncodeProcessor = null; - eosframenum = 0; - resetAtEOS = false; - workdoneAtEOS = false; - needgetMediaDes = false; - needrelease = false - frameCnt = 1; - timestamp = 0; - rate = 0; - sawInputEOS = false; - sawOutputEOS = false; - readStreamSync = undefined; - inputQueue = []; - outputQueue = []; - ES = [0, 4096] - ES_LENGTH = 1000; - } - - async function aferTest() { - console.info('afterTest case'); - if (audioEncodeProcessor != null) { - console.info('case audioEncodeProcessor is not null'); - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - audioEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - await closeFdRead(); - inputCnt = 0; - outputCnt = 0; - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - async function closeFdRead() { - await fileio.close(fdRead).then(() => { - console.info('[fileio] case close fdRead success, fd is ' + fdRead); - }, failCallback).catch(failCatch); - } - - - function writeFile(buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function resetWork() { - resetParam(); - await audioEncodeProcessor.reset().then(async() => { - console.info("case reset success"); - if (needrelease) { - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - }, failCallback).catch(failCatch); - } - - async function doneWork() { - await audioEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - - async function enqueueInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - console.info("case frameCnt:" + frameCnt); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1) { - console.info("case EOS frame seperately") - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } - timestamp += 23; - frameCnt += 1; - audioEncodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - inputCnt += 1; - }); - } - } - - async function dequeueOutputs(queue, nextStep, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputObject = queue.shift(); - if (outputObject.flags == 1) { - sawOutputEOS = true; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await doneWork(); - if(sampleRateList == false && channelCountList[0] != undefined) { - await aferTest(); - channelCount = channelCountList.shift(); - sampleRateList = formatSampleRate.toString().split(','); - console.info('channelCountList[0]: ' + channelCountList[0]); - console.info('formatSampleRate ' + formatSampleRate); - nextStep(); - return; - }else if (channelCountList == false && sampleRateList == false) { - done(); - } else { - await aferTest(); - nextStep(); - return; - } - } else { - console.info("write to file success"); - } - audioEncodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('release output success'); - }); - } - } - - function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info("AudioEncoder config is" + item + ":" + property); - } - } - - function setCallback(nextStep, done) { - console.info('case callback'); - audioEncodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueInputs(inputQueue); - }); - audioEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needgetMediaDes) { - audioEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needgetMediaDes=false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - await dequeueOutputs(outputQueue, nextStep, done); - }); - audioEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - eventEmitter.on('nextStep', async (done) => { - console.info('in case : nextStep success'); - await beforeTest(); - let sampleRate = Number(sampleRateList.shift()); - let savePath = `AAC_LC_${channelCount}_${sampleRate}.aac`; - let srcPath = `S16LE_${channelCount}_${sampleRate}.pcm`; - if (channelCount === 2) { - ES = [0, 4096]; - } else { - ES = [0, 2048]; - } - let mediaDescription = { - "channel_count": channelCount, - "sample_rate": sampleRate, - "audio_sample_format": 1, - "codec_mime": 'audio/mp4a-latm', - } - - await encodeSource(mediaDescription, savePath, srcPath, done); - }); - - async function getFormatCaps() { - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps) - console.info("print AudioCaps.supportedSampleRates: " + AudioCaps.supportedSampleRates) - console.info("print AudioCaps.supportedChannel.min: " + AudioCaps.supportedChannel.min) - console.info("print AudioCaps.supportedChannel.max: " + AudioCaps.supportedChannel.max) - formatSampleRate = AudioCaps.supportedSampleRates; - for (let i = AudioCaps.supportedChannel.min; i <= AudioCaps.supportedChannel.max; i++) { - channelCountList.push(i); - } - }, failCallback).catch(failCatch); - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - audioEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - - async function encodeSource(config, savePath, srcPath, done){ - console.info('start test case'); - let mediaDescription = config; - readPath = srcPath; - needgetMediaDes = true; - workdoneAtEOS = true; - await getFdRead(readPath, done); - console.info('case getFdRead success'); - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps) - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(function(){eventEmitter.emit('nextStep', done);}, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success") - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getOutputMediaDescription().then((mediaDescription) => { - console.info("getOutputMediaDescription success"); - printfDescription(mediaDescription); - },failCallback).catch(failCatch); - audioEncodeProcessor.on('error',(err) => { - console.info(`case error called,errName is ${err.name}`); - console.info(`case error called,errCode is ${err.code}`); - console.info(`case error called,errMessage is ${err.message}`); - expect().assertFail(); - done(); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FORMAT_COMPATIBILITY_AAC_PROMISE_0100 - * @tc.name : 01.test acc format compatibility - * @tc.desc : audio encoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FORMAT_COMPATIBILITY_AAC_PROMISE_0100', 0, async function (done) { - console.info("case test acc format compatibility"); - await getFormatCaps(); - sampleRateList = formatSampleRate.toString().split(','); - channelCount = channelCountList.shift(); - let nextStep = eventEmitter.emit('nextStep', done); - nextStep(); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/List.test.js deleted file mode 100644 index e08357c00..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/js/test/List.test.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -require('./AudioEncoderFormatCompatibilityPromiseTest.test.js') -require('./AudioDecoderFormatCompatibilityPromiseTest.test.js') - diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/element/string.json deleted file mode 100644 index 0bae6bd40..000000000 --- a/multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "entry_MainAbility", - "value": "entry_MainAbility" - }, - { - "name": "mainability_description", - "value": "JS_Empty Ability" - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/audioCodecFormat/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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/data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/", - "./resource/audio/audioDecode/AAC_16000_1.aac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/", - "./resource/audio/audioDecode/FLAC_48000_32_1.flac ->/data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/", - "./resource/audio/audioDecode/mp3.es ->/data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/", - "./resource/audio/audioDecode/vorbis.es ->/data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/" - ] - }, - { - "type": "ShellKit", - "run-command": [ - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/", - "chmod 777 /data/app/el2/100/base/ohos.acts.multimedia.audio.audiodecoder/haps/entry/files/*", - "chmod 777 -R /storage/media/100/local/files/", - "chmod 777 /storage/media/100/local/files/*" - ], - "teardown-command":[ - ] - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/audioDecoder/signature/openharmony_sx.p7b deleted file mode 100644 index 02772ce36b607a459e0e124b0240997e7e0c5523..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmcgvYj6|S6}BF>V~ntg0fP(J2!jbA`>rh6l2a0PrPa$`$tz2?WlYUVTD>go%F@a! zi$bVq+yDVeGX*z1VlWtJcyxfoxHBOkO?V^?3<)Kf6q6F-X(1GvLJ|svcGq^nX5dFB zGwhGuIp>~x@3-fC=eu)3QnDm1V|Kft{d^v{ZS_3cg7fg zzo7^^+T^Dg(iGQzpb zRBA^3NYBTDL8rX&ocpE9qXw+Z{jRtm-UYIo^u-AwZ7EMV)3uB1a+u~~u zSgLVc3$u0@(_?W>0yZIDb1ecpY;d#L!mVJ%S=8&$*5Y_2$}-h1eQm5puWNJGsbi!K zZNLzh9)|3wCXV5@QY7eX_W4{PsMSd|du#QzzDCMvLj#xw9f*SC81ZlvUXQR&eK6pt zw}zc^g%<}XYw)?uSO8_Q0Nlo5uo>eP8y2tQyk>2491CFa`@R4|V|bL+-~$--C~MN% z0;nBBjDxs*SXCqS(4KL<4Xz*j&!`PW)oeqZ(&(r+F;2NsY1CPRjye#p)WV^`7|hm4 z8NfqPsE&2%<6(zf2M8_~Mx80>3Y zO>KG1gX%nlk+CLV%Rn@)LST;yMPN*WC}7sWXVeNT2;x9>)l57R^936zmleUICO7M9 zXsL>+X|ui7OJFdo*JxVwHJC!p&DJ6~tR-NWZNQCj*u)T^8kdI^T4Ssv9BrhkFn5(k z>&2CJ0~7>^qFV1mf|%FsmnS?bs#zTk6A2VImVkOQ8}=|N95%9sniwpvBZIa661tH} zz(E~QX(^{EVzDq53U5)e21|8N>p&D1#-6Y^Ox!Xqnu(y4DQ-&WqrQ?xYM>=hv-S~f z!gbhCHxB6t?W3c`go}w5hhjm-A0pj;qL_%e{q*3Qq<962aPx?8kZZzdTa+O~O)kFq z2j#;<5=@Mj0x7pt)6h7lD^jlWxh4%f-cb>5zt- z{R83?p@^V#NoO+c?;t7sF-QvD?i2|HLZP^PXXpqRo%R%`uczjTMWWOc;DRziMw-Yj zPRkK$%+NUSG;fT`$sDFG&?Jz{doy#ghj|NZBoTt9gK7MbC?{|D5F8E%dG+D&7ieHG zHCG~sfE>snIrmjI$!Z2%_k5AgUv@#~&mMtb+m$93UqxeIN}& z!B9R#f^-p*BCb0v{JOXMz?X2#k?|*gHS5*Ay7J|cj(ox2_RfCqoO+%;T6Rx5w+^r#8?JaHdQbPXrT|jr((Zk95MHGPhRt z^vzh@`%UVSZ8AL=!v|yu1pg6>MZ)xDU1^9)C>)Di{UzD!OFQuN=4@8?+}*3&I(oiD*1FGozP-5f z=Ec=%WsC0pb~87nvptab;@;>A_-f(8s?=#Kk9IG!fb-hFten|r&3i|n*>$<_V3#sG zzWZKuY5!MQ2RZ&|IsTj+;!oB^)vA$LfbR#EZWfq1Si1bjmCj1j%tIuC6p(5di3ZFk zh@=%{KOj%)oS%tPq#|dE7%S^*Th}aEzUjKebnMx#p1X2Hg7 z^OLvV{KO&Fufp^l;q}OlJ)Jjuo9@`UM~~@qy|nf-{n)M-B^M6w*mkFB{GFNkt0H{` z&rHFi4&&1Dbp1cN5HKHP@kGhtiIWOM+-D?{1Zl&Vlv|O#_4P?V?N71nInz;epre5u z^U=uaiM%PmEd*=>TLgXdJ-h3<4V%x^A6mPwsC(4v)1wbp^iF+o*=%K^amUulvMp!d zr^VC#jv{8G5EQ;%_zQaBp6ThEjd`1P+*q+9`^K4$X)A8Mu;|d7{99K}UR-lqX76$VVuUz7k|X~I z#~vweBTg8RF9nc75IX-8)$-pk*I)SEtqNb$?&D=!E*;4}elF+I5>K|J-(de@#j;7h z9^*gHUg;VC@s)F9Ik7tS6wU6gh-|g?%#_`Eqkhl(>(^($8+^8JLUQummoAuBNBY+g zm%lux%+E`Mgmr%Fw+q0(pXAS|xZ!1Z)rcJ_?2u50A^LSccF jzWuchKE1Ffd{jSw!I<7aI~v$8i>SkUtFd{Rp@#ngZh=_^ diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/config.json b/multimedia/media/media_js_standard/audioDecoder/src/main/config.json deleted file mode 100644 index 8cc8834a5..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/config.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "app": { - "apiVersion": { - "compatible": 6, - "releaseType": "Beta1", - "target": 7 - }, - "vendor": "acts", - "bundleName": "ohos.acts.multimedia.audio.audiodecoder", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - "default": { - "debug": true - } - }, - "module": { - "abilities": [ - { - "iconId": 16777218, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "descriptionId": 16777217, - "visible": true, - "labelId": 16777216, - "icon": "$media:icon", - "name": "ohos.acts.multimedia.audio.audiodecoder.MainAbility", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "homeAbility": true, - "launchType": "standard" - } - ], - "deviceType": [ - "default", - "default", - "tablet", - "tv", - "wearable" - ], - "reqPermissions": [ - { - "name" : "ohos.permission.GRANT_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.GRANT_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.REVOKE_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.REVOKE_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.MEDIA_LOCATION", - "reason" : "use ohos.permission.MEDIA_LOCATION" - }, - { - "name" : "ohos.permission.READ_MEDIA", - "reason" : "use ohos.permission.READ_MEDIA" - }, - { - "name" : "ohos.permission.WRITE_MEDIA", - "reason" : "use ohos.permission.WRITE_MEDIA" - } - ], - "mainAbility": "ohos.acts.multimedia.audio.audiodecoder.MainAbility", - "distro": { - "moduleType": "entry", - "installationFree": false, - "deliveryWithInstall": true, - "moduleName": "entry" - }, - "package": "ohos.acts.multimedia.audio.audiodecoder", - "name": ".MyApplication", - "js": [ - { - "pages": [ - "pages/index/index" - ], - "name": "default", - "window": { - "designWidth": 720, - "autoDesignWidth": true - } - } - ] - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/app.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/app.js deleted file mode 100644 index 830070d19..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/app.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - } -}; diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/en-US.json b/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/en-US.json deleted file mode 100644 index e63c70d97..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "Hello", - "world": "World" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/zh-CN.json b/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index de6ee5748..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "您好", - "world": "世界" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.css b/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.css deleted file mode 100644 index c9195944a..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.hml b/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.hml deleted file mode 100644 index 8d0e2061b..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,20 +0,0 @@ - - -
- - {{ $t('strings.hello') }} {{ title }} - -
diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.js deleted file mode 100644 index 67f8b8567..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - this.title = this.$t('strings.world'); - }, - onShow() { - console.info('onShow finish') - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - core.addService('expect', expectExtend) - core.init() - const configService = core.getDefaultService('config') - this.timeout = 60000 - configService.setConfig(this) - require('../../../test/List.test') - core.execute() - }, - onReady() { - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderEnumTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderEnumTest.test.js deleted file mode 100644 index 751206b67..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderEnumTest.test.js +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderEnum', function () { - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - }) - - afterEach(function() { - console.info('afterEach case'); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_ENUM_AACProfile_0100 - * @tc.name : 001.AACProfile - * @tc.desc : Test Enumerate AACProfile - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_ENUM_AACProfile_0100', 0, async function (done) { - expect(media.AACProfile.AAC_PROFILE_LC).assertEqual(0); - expect(media.AACProfile.AAC_PROFILE_ELD).assertEqual(1); - expect(media.AACProfile.AAC_PROFILE_ERLC).assertEqual(2); - expect(media.AACProfile.AAC_PROFILE_HE).assertEqual(3); - expect(media.AACProfile.AAC_PROFILE_HE_V2).assertEqual(4); - expect(media.AACProfile.AAC_PROFILE_LD).assertEqual(5); - expect(media.AACProfile.AAC_PROFILE_MAIN).assertEqual(6); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_ENUM_AudioCaps_0100 - * @tc.name : 002.AudioCaps - * @tc.desc : Test Interface AudioCaps - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_ENUM_AudioCaps_0100', 0, async function (done) { - console.info("case test Test Interface AudioCaps"); - let audioDecodeProcessor; - let audioCaps; - await media.createAudioDecoderByName('avdec_aac').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - audioCaps = AudioCaps; - }, failCallback).catch(failCatch); - // check AudioCaps - expect(audioCaps.codecInfo !== undefined).assertTrue(); - - // check AudioCaps.AVCodecInfo - let avCodecInfo = audioCaps.codecInfo; - expect(avCodecInfo.name !== undefined).assertTrue(); - console.info('avCodecInfo.name: '+ avCodecInfo.name); - expect(avCodecInfo.type !== undefined).assertTrue(); - console.info('avCodecInfo.type: '+ avCodecInfo.type); - expect(avCodecInfo.mimeType !== undefined).assertTrue(); - console.info('avCodecInfo.mimeType: '+ avCodecInfo.mimeType); - expect(avCodecInfo.isHardwareAccelerated !== undefined).assertTrue(); - console.info('avCodecInfo.isHardwareAccelerated: '+ avCodecInfo.isHardwareAccelerated); - expect(avCodecInfo.isSoftwareOnly !== undefined).assertTrue(); - console.info('avCodecInfo.isSoftwareOnly: '+ avCodecInfo.isSoftwareOnly); - expect(avCodecInfo.isVendor !== undefined).assertTrue(); - console.info('avCodecInfo.isVendor: '+ avCodecInfo.isVendor); - - // check AudioCaps.supportedBitrate - expect(audioCaps.supportedBitrate !== undefined).assertTrue(); - console.info('supportedBitrate.min: '+ audioCaps.supportedBitrate.min); - console.info('supportedBitrate.max: '+ audioCaps.supportedBitrate.max); - - // check AudioCaps.supportedChannel - expect(audioCaps.supportedChannel !== undefined).assertTrue(); - console.info('supportedChannel.min: '+ audioCaps.supportedChannel.min); - console.info('supportedChannel.max: '+ audioCaps.supportedChannel.max); - - // check AudioCaps.supportedFormats - expect(audioCaps.supportedFormats !== undefined).assertTrue(); - console.info('audioCaps.supportedFormats: '+ audioCaps.supportedFormats); - - // check AudioCaps.supportedSampleRates - expect(audioCaps.supportedSampleRates !== undefined).assertTrue(); - console.info('audioCaps.supportedSampleRates: '+ audioCaps.supportedSampleRates); - - // check AudioCaps.supportedProfiles - expect(audioCaps.supportedProfiles !== undefined).assertTrue(); - console.info('audioCaps.supportedProfiles: '+ audioCaps.supportedProfiles); - - // check AudioCaps.supportedComplexity - expect(audioCaps.supportedComplexity !== undefined).assertTrue(); - console.info('supportedComplexity.min: '+ audioCaps.supportedComplexity.min); - console.info('supportedComplexity.max: '+ audioCaps.supportedComplexity.max); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_ENUM_AVCodecType_0100 - * @tc.name : 003.AVCodecType - * @tc.desc : Test Enumerate AVCodecType - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_ENUM_AVCodecType_0100', 0, async function (done) { - expect(media.AVCodecType.AVCODEC_TYPE_VIDEO_ENCODER).assertEqual(0); - expect(media.AVCodecType.AVCODEC_TYPE_VIDEO_DECODER).assertEqual(1); - expect(media.AVCodecType.AVCODEC_TYPE_AUDIO_ENCODER).assertEqual(2); - expect(media.AVCodecType.AVCODEC_TYPE_AUDIO_DECODER).assertEqual(3); - done(); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatCallbackTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatCallbackTest.test.js deleted file mode 100644 index fe3178dda..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatCallbackTest.test.js +++ /dev/null @@ -1,943 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderFormatCallback', function () { - const AUDIOPATH1 = 'AAC_48000_32_1.aac'; - const AUDIOPATH2 = 'FLAC_48000_32_1.flac' - const AUDIOPATH3 = 'mp3.es'; - const AUDIOPATH4 = 'vorbis.es'; - const BASIC_PATH = 'results/decode_format_callback_'; - let audioDecodeProcessor; - let readStreamSync; - let needGetMediaDes = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = []; - let ES_LENGTH = 0; - let samplerate = 44.1; - let isMp3 = false; - let isVorbis = false; - let readpath; - let savepath; - let fdRead; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - needGetMediaDes = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = []; - ES_LENGTH = 0; - samplerate = 44.1; - isMp3 = false; - isVorbis = false; - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function writeFile(path, buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.writeSync buffer success'); - } catch(e) { - console.info('case fileio.writeSync buffer error is ' + e); - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - inputobject.timeMs = timestamp; - inputobject.offset = 0; - if (frameCnt==1 && isVorbis) { - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 8; - } else if (isMp3) { - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } else { - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - } - if (isMp3) { - timestamp += ES[1]/samplerate; - } else { - timestamp += ES[frameCnt]/samplerate; - } - frameCnt += 1; - audioDecodeProcessor.pushInputData(inputobject, () => { - console.info('queueInput success'); - inputCnt += 1; - }) - } - } - - async function dequeueAllOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.log("stop success"); - inputQueue = []; - outputQueue = []; - audioDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.log("reset success"); - audioDecodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioDecodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - }) - }) - } else { - console.log("write to file success"); - } - audioDecodeProcessor.freeOutputBuffer(outputobject, () => { - console.info('release output success'); - }) - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info("inputBufferAvailable"); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info("outputBufferAvailable"); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription((err, MediaDescription) => { - console.log("get OutputMediaDescription success"); - console.log('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }) - } - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_CALLBACK_0100 - * @tc.name : 001.test aac format(createbymime) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_CALLBACK_0100', 0, async function (done) { - console.log("case test aac format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_callback_aac_01.pcm'; - readpath = AUDIOPATH1; - await getFdRead(readpath, done); - needGetMediaDes = true; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338]; - ES_LENGTH = 1000; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_CALLBACK_0200 - * @tc.name : 001.test aac format(createbyname) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_CALLBACK_0200', 0, async function (done) { - console.log("case test aac format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_callback_aac_02.pcm'; - readpath = AUDIOPATH1; - await getFdRead(readpath, done); - needGetMediaDes = true; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338]; - ES_LENGTH = 1000; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByName('avdec_aac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_CALLBACK_0100 - * @tc.name : 002.test flac format(createbymime) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_CALLBACK_0100', 0, async function (done) { - console.log("case test flac format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_callback_flac_01.pcm'; - readpath = AUDIOPATH2; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - ES = [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, 2806, - 2796,2786, 2774, 2758, 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, 2839, 2794, - 2770, 2763,2756, 2722, 2950, 2876, 2842, 2827, 2792, 3121, 3075, 2969, 3240, 3199, - 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, 2779, 2963, 2893, 2870, - 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, 2876, 3223, 3040, 3006, 3042, - 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, 3300, 3140, 3014, 2975, 2952, 2896, - 2897, 2842, 2929, 3567, 3929, 3485, 3082, 3625, 4953, 5239, 5094, 4993, 4821, 4431, - 5195, 5542, 5557, 4894, 4414, 5085, 5496, 5089, 4459, 4532, 4778, 5460, 5372, 5224, - 4395, 4701, 5512, 5304, 4798, 7128, 6534, 5704, 5562, 5539, 5675, 5780, 6058, 6194, - 6076, 5971, 5758, 5202, 4438, 3821, 4267, 5550, 4896, 3841, 5166, 4904, 4504, 5530, - 5354, 5047, 5695, 5422, 5168, 5338, 5154, 5385, 5322, 4934, 4512, 4001, 3793, 3624, - 3589, 3562, 4346, 5407, 5582, 5645, 5581, 5605, 5520, 5399, 5164, 4991, 4556, 4058, - 3662, 3757, 4627, 5183, 5061, 4114, 5840, 5051, 5126, 4573, 5269, 4437, 5021, 5508, - 5289, 5171, 5153, 5118, 5721, 5375, 4863, 6353, 5477, 5608, 5614, 5737, 5178, 4614, - 4671, 5204, 5027, 4977, 3922, 5904]; - ES_LENGTH = 200; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByMime('audio/flac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_CALLBACK_0200 - * @tc.name : 002.test flac format(createbyname) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_CALLBACK_0200', 0, async function (done) { - console.log("case test flac format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_callback_flac_02.pcm'; - readpath = AUDIOPATH2; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - ES = [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, 2806, - 2796,2786, 2774, 2758, 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, 2839, 2794, - 2770, 2763,2756, 2722, 2950, 2876, 2842, 2827, 2792, 3121, 3075, 2969, 3240, 3199, - 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, 2779, 2963, 2893, 2870, - 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, 2876, 3223, 3040, 3006, 3042, - 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, 3300, 3140, 3014, 2975, 2952, 2896, - 2897, 2842, 2929, 3567, 3929, 3485, 3082, 3625, 4953, 5239, 5094, 4993, 4821, 4431, - 5195, 5542, 5557, 4894, 4414, 5085, 5496, 5089, 4459, 4532, 4778, 5460, 5372, 5224, - 4395, 4701, 5512, 5304, 4798, 7128, 6534, 5704, 5562, 5539, 5675, 5780, 6058, 6194, - 6076, 5971, 5758, 5202, 4438, 3821, 4267, 5550, 4896, 3841, 5166, 4904, 4504, 5530, - 5354, 5047, 5695, 5422, 5168, 5338, 5154, 5385, 5322, 4934, 4512, 4001, 3793, 3624, - 3589, 3562, 4346, 5407, 5582, 5645, 5581, 5605, 5520, 5399, 5164, 4991, 4556, 4058, - 3662, 3757, 4627, 5183, 5061, 4114, 5840, 5051, 5126, 4573, 5269, 4437, 5021, 5508, - 5289, 5171, 5153, 5118, 5721, 5375, 4863, 6353, 5477, 5608, 5614, 5737, 5178, 4614, - 4671, 5204, 5027, 4977, 3922, 5904]; - ES_LENGTH = 200; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByName('avdec_flac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_CALLBACK_0100 - * @tc.name : 003.test mp3 format(createbymime) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_CALLBACK_0100', 0, async function (done) { - console.log("test mp3 format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_callback_mp3_01.pcm'; - readpath = AUDIOPATH3; - await getFdRead(readpath, done); - needGetMediaDes = true; - isMp3 = true; - isVorbis = false; - ES = [0, 1044]; - ES_LENGTH = 1000; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByMime('audio/mpeg', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_CALLBACK_0200 - * @tc.name : 003.test mp3 format(createbyname) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_CALLBACK_0200', 0, async function (done) { - console.log("test mp3 format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_callback_mp3_02.pcm'; - readpath = AUDIOPATH3; - await getFdRead(readpath, done); - needGetMediaDes = true; - isMp3 = true; - isVorbis = false; - ES = [0, 1044]; - ES_LENGTH = 1000; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByName('avdec_mp3', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_CALLBACK_0100 - * @tc.name : 004.test vorbis format(createbymime) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_CALLBACK_0100', 0, async function (done) { - console.log("test vorbis format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_callback_vorbis_01.pcm'; - readpath = AUDIOPATH4; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - isVorbis = true; - ES = [0, 3251, 33, 160, 162, 159, 148, 160, 160, 159, 167, 156, 162, 173, 135, 137, 133, - 126, 126, 130, 127, 133, 138, 132, 124, 129, 134, 136, 146, 135, 137, 144, 137, 128, - 124, 127, 129, 127, 130, 127, 134, 130, 135, 146, 142, 140, 134, 134, 128, 119, 122, - 122, 123, 121, 128, 125, 128, 122, 137, 141, 136, 135, 127, 128, 125, 128, 122, 126, - 132, 127, 127, 135, 143, 134, 148, 133, 131, 140, 143, 135, 140, 141, 135, 149, 27, - 30, 36, 32, 157, 155, 158, 154, 136, 150, 149, 142, 150, 142, 149, 139, 142, 146, 138, - 138, 144, 138, 139, 132, 120, 130, 134, 124, 127, 130, 130, 123, 133, 141, 137, 135, - 140, 147, 139, 141, 134, 131, 146, 139, 136, 136, 130, 143, 147, 144, 138, 145, 137, - 137, 138, 142, 148, 149, 138, 141, 148, 139, 139, 139, 134, 135, 131, 124, 131, 131, - 120, 121, 132, 128, 127, 130, 136, 129, 130, 123, 133, 132, 141, 147, 147, 139, 127, - 149, 157, 165, 154, 143, 153, 141, 157, 144, 146, 135, 142, 133, 134, 140, 142, 133, - 136, 133, 141, 143, 128, 127, 136, 144, 138, 141, 133, 127, 123, 138, 131, 126, 130, - 131, 135, 131, 137, 136, 125, 127, 126, 143, 142, 127, 134, 140, 144, 128, 125, 139, - 144, 135, 141, 123, 130, 127, 126, 140, 136, 140, 139, 140, 133, 132, 146, 142, 138, - 134, 130, 125, 130, 130, 129, 137, 133, 128, 130, 130, 132, 135, 126, 129, 142, 129, - 151, 150, 146, 130, 130, 144, 137, 145, 140, 126, 123, 128, 138, 136, 140, 137, 137, - 147, 146, 141, 137, 139, 117, 133, 140, 126, 137, 138, 143, 141, 141, 132, 128, 132, - 145, 148, 151, 160, 162, 154, 140, 147, 30, 28, 28, 26, 27, 27, 31, 33, 32, 145, 132, - 130, 124, 142, 140, 128, 124, 131, 127, 130, 128, 135, 125, 137, 137, 127, 128, 127, - 125, 127, 130, 124, 134, 137, 129, 127, 146, 136, 131, 124, 125, 130, 131, 135, 147, - 148, 151, 147, 143, 148, 145, 158, 142, 137, 129, 127, 156, 147, 143, 137, 135, 142, - 141, 140, 137, 136, 132, 134, 130, 124, 127, 130, 127, 126, 127, 129, 132, 134, 141, - 147, 136, 141, 141, 134, 126, 127, 136, 135, 134, 122, 130, 128, 140, 133, 124, 128, - 137, 128, 141, 135, 141, 147, 153, 151, 151, 154, 150, 147, 157, 153, 153, 153, 151, - 155, 154, 153, 150, 143, 157, 146, 150, 154, 152, 153, 28, 35, 33, 34, 37, 36, 30, 31, - 27, 37, 38, 36, 38, 37, 36, 39, 38, 36, 172, 172, 179, 178, 172, 171, 180, 173, 163, - 164, 159, 159, 155, 163, 184, 187, 176, 176, 184, 179, 174, 167, 165, 166, 160, 166, - 169, 169, 159, 165, 166, 168, 162, 180, 174, 186, 179, 180, 186, 187, 178, 156, 158, - 156, 161, 165, 163, 160, 169, 160, 160, 168, 161, 159, 167, 173, 177, 170, 172, 172, - 169, 157, 161, 155, 165, 164, 154, 161, 160, 31, 30, 28, 31, 31, 29, 38, 36, 40, 31, - 33, 37, 39, 179, 30, 28, 27, 30, 28, 30, 30, 37, 42, 39, 184, 163, 158, 172, 166, 161, - 160, 167, 174, 175, 183, 176, 192, 176, 170, 179, 173, 164, 156, 160, 162, 152, 155, - 157, 174, 176, 184, 173, 180, 177, 182, 190, 170, 167, 154, 156, 171, 169, 172, 177, - 190, 192, 186, 188, 192, 192, 176, 179, 175, 191, 174, 197, 194, 203, 198, 190, 185, - 202, 179, 169, 179, 184, 193, 185, 185, 181, 197, 188, 189, 188, 189, 193, 197, 198, - 203, 188, 189, 198, 190, 196, 191, 191, 197, 202, 182, 178, 186, 194, 192, 186, 187, - 188, 186, 179, 179, 168, 165, 173, 165, 160, 161, 145, 162, 149, 155, 154, 145, 154, - 152, 152, 163, 174, 175, 170, 181, 177, 162, 167, 164, 162, 147, 147, 157, 159, 27, - 28, 28, 36, 36, 37, 35, 35, 35, 35, 37, 37, 35, 35, 36, 171, 40, 40, 176, 178, 171, - 174, 165, 161, 157, 160, 154, 167, 163, 174, 172, 155, 158, 165, 166, 181, 190, 160, - 158, 160, 30, 39, 36, 174, 157, 180, 174, 167, 178, 177, 171, 175, 173, 166, 28, 28, - 28, 29, 30, 34, 35, 36, 29, 36, 37, 38, 32, 29, 41, 38, 38, 35, 34, 34, 36, 34, 35, - 30, 30, 31, 31, 28, 30, 31, 36, 36, 36, 40, 38, 44, 41, 34, 38, 38, 38, 39, 184, 157, - 155, 167, 178]; - ES_LENGTH = 757; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByMime('audio/vorbis', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_CALLBACK_0200 - * @tc.name : 004.test vorbis format(createbyname) - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_CALLBACK_0200', 0, async function (done) { - console.log("test vorbis format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_callback_vorbis_02.pcm'; - readpath = AUDIOPATH4; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - isVorbis = true; - ES = [0, 3251, 33, 160, 162, 159, 148, 160, 160, 159, 167, 156, 162, 173, 135, 137, 133, - 126, 126, 130, 127, 133, 138, 132, 124, 129, 134, 136, 146, 135, 137, 144, 137, 128, - 124, 127, 129, 127, 130, 127, 134, 130, 135, 146, 142, 140, 134, 134, 128, 119, 122, - 122, 123, 121, 128, 125, 128, 122, 137, 141, 136, 135, 127, 128, 125, 128, 122, 126, - 132, 127, 127, 135, 143, 134, 148, 133, 131, 140, 143, 135, 140, 141, 135, 149, 27, - 30, 36, 32, 157, 155, 158, 154, 136, 150, 149, 142, 150, 142, 149, 139, 142, 146, 138, - 138, 144, 138, 139, 132, 120, 130, 134, 124, 127, 130, 130, 123, 133, 141, 137, 135, - 140, 147, 139, 141, 134, 131, 146, 139, 136, 136, 130, 143, 147, 144, 138, 145, 137, - 137, 138, 142, 148, 149, 138, 141, 148, 139, 139, 139, 134, 135, 131, 124, 131, 131, - 120, 121, 132, 128, 127, 130, 136, 129, 130, 123, 133, 132, 141, 147, 147, 139, 127, - 149, 157, 165, 154, 143, 153, 141, 157, 144, 146, 135, 142, 133, 134, 140, 142, 133, - 136, 133, 141, 143, 128, 127, 136, 144, 138, 141, 133, 127, 123, 138, 131, 126, 130, - 131, 135, 131, 137, 136, 125, 127, 126, 143, 142, 127, 134, 140, 144, 128, 125, 139, - 144, 135, 141, 123, 130, 127, 126, 140, 136, 140, 139, 140, 133, 132, 146, 142, 138, - 134, 130, 125, 130, 130, 129, 137, 133, 128, 130, 130, 132, 135, 126, 129, 142, 129, - 151, 150, 146, 130, 130, 144, 137, 145, 140, 126, 123, 128, 138, 136, 140, 137, 137, - 147, 146, 141, 137, 139, 117, 133, 140, 126, 137, 138, 143, 141, 141, 132, 128, 132, - 145, 148, 151, 160, 162, 154, 140, 147, 30, 28, 28, 26, 27, 27, 31, 33, 32, 145, 132, - 130, 124, 142, 140, 128, 124, 131, 127, 130, 128, 135, 125, 137, 137, 127, 128, 127, - 125, 127, 130, 124, 134, 137, 129, 127, 146, 136, 131, 124, 125, 130, 131, 135, 147, - 148, 151, 147, 143, 148, 145, 158, 142, 137, 129, 127, 156, 147, 143, 137, 135, 142, - 141, 140, 137, 136, 132, 134, 130, 124, 127, 130, 127, 126, 127, 129, 132, 134, 141, - 147, 136, 141, 141, 134, 126, 127, 136, 135, 134, 122, 130, 128, 140, 133, 124, 128, - 137, 128, 141, 135, 141, 147, 153, 151, 151, 154, 150, 147, 157, 153, 153, 153, 151, - 155, 154, 153, 150, 143, 157, 146, 150, 154, 152, 153, 28, 35, 33, 34, 37, 36, 30, 31, - 27, 37, 38, 36, 38, 37, 36, 39, 38, 36, 172, 172, 179, 178, 172, 171, 180, 173, 163, - 164, 159, 159, 155, 163, 184, 187, 176, 176, 184, 179, 174, 167, 165, 166, 160, 166, - 169, 169, 159, 165, 166, 168, 162, 180, 174, 186, 179, 180, 186, 187, 178, 156, 158, - 156, 161, 165, 163, 160, 169, 160, 160, 168, 161, 159, 167, 173, 177, 170, 172, 172, - 169, 157, 161, 155, 165, 164, 154, 161, 160, 31, 30, 28, 31, 31, 29, 38, 36, 40, 31, - 33, 37, 39, 179, 30, 28, 27, 30, 28, 30, 30, 37, 42, 39, 184, 163, 158, 172, 166, 161, - 160, 167, 174, 175, 183, 176, 192, 176, 170, 179, 173, 164, 156, 160, 162, 152, 155, - 157, 174, 176, 184, 173, 180, 177, 182, 190, 170, 167, 154, 156, 171, 169, 172, 177, - 190, 192, 186, 188, 192, 192, 176, 179, 175, 191, 174, 197, 194, 203, 198, 190, 185, - 202, 179, 169, 179, 184, 193, 185, 185, 181, 197, 188, 189, 188, 189, 193, 197, 198, - 203, 188, 189, 198, 190, 196, 191, 191, 197, 202, 182, 178, 186, 194, 192, 186, 187, - 188, 186, 179, 179, 168, 165, 173, 165, 160, 161, 145, 162, 149, 155, 154, 145, 154, - 152, 152, 163, 174, 175, 170, 181, 177, 162, 167, 164, 162, 147, 147, 157, 159, 27, - 28, 28, 36, 36, 37, 35, 35, 35, 35, 37, 37, 35, 35, 36, 171, 40, 40, 176, 178, 171, - 174, 165, 161, 157, 160, 154, 167, 163, 174, 172, 155, 158, 165, 166, 181, 190, 160, - 158, 160, 30, 39, 36, 174, 157, 180, 174, 167, 178, 177, 171, 175, 173, 166, 28, 28, - 28, 29, 30, 34, 35, 36, 29, 36, 37, 38, 32, 29, 41, 38, 38, 35, 34, 34, 36, 34, 35, - 30, 30, 31, 31, 28, 30, 31, 36, 36, 36, 40, 38, 44, 41, 34, 38, 38, 38, 39, 184, 157, - 155, 167, 178]; - ES_LENGTH = 757; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.log("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByName('avdec_vorbis', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatPromiseTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatPromiseTest.test.js deleted file mode 100644 index 29159a021..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFormatPromiseTest.test.js +++ /dev/null @@ -1,798 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderFormatPromise', function () { - const AUDIOPATH1 = 'AAC_48000_32_1.aac'; - const AUDIOPATH2 = 'FLAC_48000_32_1.flac' - const AUDIOPATH3 = 'mp3.es'; - const AUDIOPATH4 = 'vorbis.es'; - const BASIC_PATH = 'results/decode_format_promise_'; - let audioDecodeProcessor; - let readStreamSync; - let needGetMediaDes = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = []; - let ES_LENGTH = 0; - let samplerate = 44.1; - let isMp3 = false; - let isVorbis = false; - let readpath; - let savepath; - let fdRead; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - needGetMediaDes = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = []; - ES_LENGTH = 0; - samplerate = 44.1; - isMp3 = false; - isVorbis = false; - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function writeFile(path, buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.writeSync buffer success'); - } catch(e) { - console.info('case fileio.writeSync buffer error is ' + e); - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - inputobject.timeMs = timestamp; - inputobject.offset = 0; - if (frameCnt==1 && isVorbis) { - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 8; - } else if (isMp3) { - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } else { - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - } - if (isMp3) { - timestamp += ES[1]/samplerate; - } else { - timestamp += ES[frameCnt]/samplerate; - } - frameCnt += 1; - audioDecodeProcessor.pushInputData(inputobject).then(() => { - console.info("queueInput success"); - inputCnt += 1; - }) - } - } - - async function dequeueAllOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - await audioDecodeProcessor.stop().then(() => { - console.log("stop success"); - }, failCallback).catch(failCatch); - inputQueue = []; - outputQueue = []; - await audioDecodeProcessor.reset().then(() => { - console.log("reset success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.release().then(() => { - console.info('release success'); - }, failCallback).catch(failCatch); - audioDecodeProcessor = null; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await fileio.close(fdRead); - done(); - } - else{ - console.log("write to file success"); - } - audioDecodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }) - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info("inputBufferAvailable"); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info("outputBufferAvailable"); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.log("get OutputMediaDescription success"); - console.log('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }, failCallback).catch(failCatch);} - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_PROMISE_0100 - * @tc.name : 001.test aac format(createbymime) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_PROMISE_0100', 0, async function (done) { - console.log("case test aac format"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_promise_aac_01.pcm'; - readpath = AUDIOPATH1; - await getFdRead(readpath, done); - needGetMediaDes = true; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338]; - ES_LENGTH = 1000; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_PROMISE_0200 - * @tc.name : 001.test aac format(createbyname) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_AAC_PROMISE_0200', 0, async function (done) { - console.log("case test aac format"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_promise_aac_02.pcm'; - readpath = AUDIOPATH1; - await getFdRead(readpath, done); - needGetMediaDes = true; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338]; - ES_LENGTH = 1000; - await media.createAudioDecoderByName('avdec_aac').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_PROMISE_0100 - * @tc.name : 002.test flac format(createbymime) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_PROMISE_0100', 0, async function (done) { - console.log("case test flac format"); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_promise_flac_01.pcm'; - readpath = AUDIOPATH2; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - ES = [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, 2806, - 2796,2786, 2774, 2758, 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, 2839, 2794, - 2770, 2763,2756, 2722, 2950, 2876, 2842, 2827, 2792, 3121, 3075, 2969, 3240, 3199, - 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, 2779, 2963, 2893, 2870, - 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, 2876, 3223, 3040, 3006, 3042, - 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, 3300, 3140, 3014, 2975, 2952, 2896, - 2897, 2842, 2929, 3567, 3929, 3485, 3082, 3625, 4953, 5239, 5094, 4993, 4821, 4431, - 5195, 5542, 5557, 4894, 4414, 5085, 5496, 5089, 4459, 4532, 4778, 5460, 5372, 5224, - 4395, 4701, 5512, 5304, 4798, 7128, 6534, 5704, 5562, 5539, 5675, 5780, 6058, 6194, - 6076, 5971, 5758, 5202, 4438, 3821, 4267, 5550, 4896, 3841, 5166, 4904, 4504, 5530, - 5354, 5047, 5695, 5422, 5168, 5338, 5154, 5385, 5322, 4934, 4512, 4001, 3793, 3624, - 3589, 3562, 4346, 5407, 5582, 5645, 5581, 5605, 5520, 5399, 5164, 4991, 4556, 4058, - 3662, 3757, 4627, 5183, 5061, 4114, 5840, 5051, 5126, 4573, 5269, 4437, 5021, 5508, - 5289, 5171, 5153, 5118, 5721, 5375, 4863, 6353, 5477, 5608, 5614, 5737, 5178, 4614, - 4671, 5204, 5027, 4977, 3922, 5904]; - ES_LENGTH = 200; - await media.createAudioDecoderByMime('audio/flac').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - console.log("start configure"); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_PROMISE_0200 - * @tc.name : 002.test flac format(createbyname) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_FLAC_PROMISE_0200', 0, async function (done) { - console.log("case test flac format"); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_promise_flac_02.pcm'; - readpath = AUDIOPATH2; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - ES = [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, 2806, - 2796,2786, 2774, 2758, 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, 2839, 2794, - 2770, 2763,2756, 2722, 2950, 2876, 2842, 2827, 2792, 3121, 3075, 2969, 3240, 3199, - 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, 2779, 2963, 2893, 2870, - 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, 2876, 3223, 3040, 3006, 3042, - 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, 3300, 3140, 3014, 2975, 2952, 2896, - 2897, 2842, 2929, 3567, 3929, 3485, 3082, 3625, 4953, 5239, 5094, 4993, 4821, 4431, - 5195, 5542, 5557, 4894, 4414, 5085, 5496, 5089, 4459, 4532, 4778, 5460, 5372, 5224, - 4395, 4701, 5512, 5304, 4798, 7128, 6534, 5704, 5562, 5539, 5675, 5780, 6058, 6194, - 6076, 5971, 5758, 5202, 4438, 3821, 4267, 5550, 4896, 3841, 5166, 4904, 4504, 5530, - 5354, 5047, 5695, 5422, 5168, 5338, 5154, 5385, 5322, 4934, 4512, 4001, 3793, 3624, - 3589, 3562, 4346, 5407, 5582, 5645, 5581, 5605, 5520, 5399, 5164, 4991, 4556, 4058, - 3662, 3757, 4627, 5183, 5061, 4114, 5840, 5051, 5126, 4573, 5269, 4437, 5021, 5508, - 5289, 5171, 5153, 5118, 5721, 5375, 4863, 6353, 5477, 5608, 5614, 5737, 5178, 4614, - 4671, 5204, 5027, 4977, 3922, 5904]; - ES_LENGTH = 200; - await media.createAudioDecoderByName('avdec_flac').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - console.log("start configure"); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_PROMISE_0100 - * @tc.name : 003.test mp3 format(createbymime) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_PROMISE_0100', 0, async function (done) { - console.log("case test mp3 format"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_promise_mp3_01.pcm'; - readpath = AUDIOPATH3; - await getFdRead(readpath, done); - needGetMediaDes = true; - isMp3 = true; - ES = [0, 1044]; - ES_LENGTH = 1000; - await media.createAudioDecoderByMime('audio/mpeg').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_PROMISE_0200 - * @tc.name : 003.test mp3 format(createbyname) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_MP3_PROMISE_0200', 0, async function (done) { - console.log("case test mp3 format"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - savepath = 'format_promise_mp3_02.pcm'; - readpath = AUDIOPATH3; - await getFdRead(readpath, done); - needGetMediaDes = true; - isMp3 = true; - ES = [0, 1044]; - ES_LENGTH = 1000; - await media.createAudioDecoderByName('avdec_mp3').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_PROMISE_0100 - * @tc.name : 004.test vorbis format(createbymime) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_PROMISE_0100', 0, async function (done) { - console.log("case test vorbis format"); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_promise_vorbis_01.pcm'; - readpath = AUDIOPATH4; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - isVorbis = true; - ES = [0, 3251, 33, 160, 162, 159, 148, 160, 160, 159, 167, 156, 162, 173, 135, 137, 133, - 126, 126, 130, 127, 133, 138, 132, 124, 129, 134, 136, 146, 135, 137, 144, 137, 128, - 124, 127, 129, 127, 130, 127, 134, 130, 135, 146, 142, 140, 134, 134, 128, 119, 122, - 122, 123, 121, 128, 125, 128, 122, 137, 141, 136, 135, 127, 128, 125, 128, 122, 126, - 132, 127, 127, 135, 143, 134, 148, 133, 131, 140, 143, 135, 140, 141, 135, 149, 27, - 30, 36, 32, 157, 155, 158, 154, 136, 150, 149, 142, 150, 142, 149, 139, 142, 146, 138, - 138, 144, 138, 139, 132, 120, 130, 134, 124, 127, 130, 130, 123, 133, 141, 137, 135, - 140, 147, 139, 141, 134, 131, 146, 139, 136, 136, 130, 143, 147, 144, 138, 145, 137, - 137, 138, 142, 148, 149, 138, 141, 148, 139, 139, 139, 134, 135, 131, 124, 131, 131, - 120, 121, 132, 128, 127, 130, 136, 129, 130, 123, 133, 132, 141, 147, 147, 139, 127, - 149, 157, 165, 154, 143, 153, 141, 157, 144, 146, 135, 142, 133, 134, 140, 142, 133, - 136, 133, 141, 143, 128, 127, 136, 144, 138, 141, 133, 127, 123, 138, 131, 126, 130, - 131, 135, 131, 137, 136, 125, 127, 126, 143, 142, 127, 134, 140, 144, 128, 125, 139, - 144, 135, 141, 123, 130, 127, 126, 140, 136, 140, 139, 140, 133, 132, 146, 142, 138, - 134, 130, 125, 130, 130, 129, 137, 133, 128, 130, 130, 132, 135, 126, 129, 142, 129, - 151, 150, 146, 130, 130, 144, 137, 145, 140, 126, 123, 128, 138, 136, 140, 137, 137, - 147, 146, 141, 137, 139, 117, 133, 140, 126, 137, 138, 143, 141, 141, 132, 128, 132, - 145, 148, 151, 160, 162, 154, 140, 147, 30, 28, 28, 26, 27, 27, 31, 33, 32, 145, 132, - 130, 124, 142, 140, 128, 124, 131, 127, 130, 128, 135, 125, 137, 137, 127, 128, 127, - 125, 127, 130, 124, 134, 137, 129, 127, 146, 136, 131, 124, 125, 130, 131, 135, 147, - 148, 151, 147, 143, 148, 145, 158, 142, 137, 129, 127, 156, 147, 143, 137, 135, 142, - 141, 140, 137, 136, 132, 134, 130, 124, 127, 130, 127, 126, 127, 129, 132, 134, 141, - 147, 136, 141, 141, 134, 126, 127, 136, 135, 134, 122, 130, 128, 140, 133, 124, 128, - 137, 128, 141, 135, 141, 147, 153, 151, 151, 154, 150, 147, 157, 153, 153, 153, 151, - 155, 154, 153, 150, 143, 157, 146, 150, 154, 152, 153, 28, 35, 33, 34, 37, 36, 30, 31, - 27, 37, 38, 36, 38, 37, 36, 39, 38, 36, 172, 172, 179, 178, 172, 171, 180, 173, 163, - 164, 159, 159, 155, 163, 184, 187, 176, 176, 184, 179, 174, 167, 165, 166, 160, 166, - 169, 169, 159, 165, 166, 168, 162, 180, 174, 186, 179, 180, 186, 187, 178, 156, 158, - 156, 161, 165, 163, 160, 169, 160, 160, 168, 161, 159, 167, 173, 177, 170, 172, 172, - 169, 157, 161, 155, 165, 164, 154, 161, 160, 31, 30, 28, 31, 31, 29, 38, 36, 40, 31, - 33, 37, 39, 179, 30, 28, 27, 30, 28, 30, 30, 37, 42, 39, 184, 163, 158, 172, 166, 161, - 160, 167, 174, 175, 183, 176, 192, 176, 170, 179, 173, 164, 156, 160, 162, 152, 155, - 157, 174, 176, 184, 173, 180, 177, 182, 190, 170, 167, 154, 156, 171, 169, 172, 177, - 190, 192, 186, 188, 192, 192, 176, 179, 175, 191, 174, 197, 194, 203, 198, 190, 185, - 202, 179, 169, 179, 184, 193, 185, 185, 181, 197, 188, 189, 188, 189, 193, 197, 198, - 203, 188, 189, 198, 190, 196, 191, 191, 197, 202, 182, 178, 186, 194, 192, 186, 187, - 188, 186, 179, 179, 168, 165, 173, 165, 160, 161, 145, 162, 149, 155, 154, 145, 154, - 152, 152, 163, 174, 175, 170, 181, 177, 162, 167, 164, 162, 147, 147, 157, 159, 27, - 28, 28, 36, 36, 37, 35, 35, 35, 35, 37, 37, 35, 35, 36, 171, 40, 40, 176, 178, 171, - 174, 165, 161, 157, 160, 154, 167, 163, 174, 172, 155, 158, 165, 166, 181, 190, 160, - 158, 160, 30, 39, 36, 174, 157, 180, 174, 167, 178, 177, 171, 175, 173, 166, 28, 28, - 28, 29, 30, 34, 35, 36, 29, 36, 37, 38, 32, 29, 41, 38, 38, 35, 34, 34, 36, 34, 35, - 30, 30, 31, 31, 28, 30, 31, 36, 36, 36, 40, 38, 44, 41, 34, 38, 38, 38, 39, 184, 157, - 155, 167, 178]; - ES_LENGTH = 757; - await media.createAudioDecoderByMime('audio/vorbis').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_PROMISE_0200 - * @tc.name : 004.test vorbis format(createbyname) - * @tc.desc : decode format test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FORMAT_VORBIS_PROMISE_0200', 0, async function (done) { - console.log("case test vorbis format"); - let mediaDescription = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - savepath = 'format_promise_vorbis_02.pcm'; - readpath = AUDIOPATH4; - await getFdRead(readpath, done); - needGetMediaDes = true; - samplerate = 48; - isVorbis = true; - ES = [0, 3251, 33, 160, 162, 159, 148, 160, 160, 159, 167, 156, 162, 173, 135, 137, 133, - 126, 126, 130, 127, 133, 138, 132, 124, 129, 134, 136, 146, 135, 137, 144, 137, 128, - 124, 127, 129, 127, 130, 127, 134, 130, 135, 146, 142, 140, 134, 134, 128, 119, 122, - 122, 123, 121, 128, 125, 128, 122, 137, 141, 136, 135, 127, 128, 125, 128, 122, 126, - 132, 127, 127, 135, 143, 134, 148, 133, 131, 140, 143, 135, 140, 141, 135, 149, 27, - 30, 36, 32, 157, 155, 158, 154, 136, 150, 149, 142, 150, 142, 149, 139, 142, 146, 138, - 138, 144, 138, 139, 132, 120, 130, 134, 124, 127, 130, 130, 123, 133, 141, 137, 135, - 140, 147, 139, 141, 134, 131, 146, 139, 136, 136, 130, 143, 147, 144, 138, 145, 137, - 137, 138, 142, 148, 149, 138, 141, 148, 139, 139, 139, 134, 135, 131, 124, 131, 131, - 120, 121, 132, 128, 127, 130, 136, 129, 130, 123, 133, 132, 141, 147, 147, 139, 127, - 149, 157, 165, 154, 143, 153, 141, 157, 144, 146, 135, 142, 133, 134, 140, 142, 133, - 136, 133, 141, 143, 128, 127, 136, 144, 138, 141, 133, 127, 123, 138, 131, 126, 130, - 131, 135, 131, 137, 136, 125, 127, 126, 143, 142, 127, 134, 140, 144, 128, 125, 139, - 144, 135, 141, 123, 130, 127, 126, 140, 136, 140, 139, 140, 133, 132, 146, 142, 138, - 134, 130, 125, 130, 130, 129, 137, 133, 128, 130, 130, 132, 135, 126, 129, 142, 129, - 151, 150, 146, 130, 130, 144, 137, 145, 140, 126, 123, 128, 138, 136, 140, 137, 137, - 147, 146, 141, 137, 139, 117, 133, 140, 126, 137, 138, 143, 141, 141, 132, 128, 132, - 145, 148, 151, 160, 162, 154, 140, 147, 30, 28, 28, 26, 27, 27, 31, 33, 32, 145, 132, - 130, 124, 142, 140, 128, 124, 131, 127, 130, 128, 135, 125, 137, 137, 127, 128, 127, - 125, 127, 130, 124, 134, 137, 129, 127, 146, 136, 131, 124, 125, 130, 131, 135, 147, - 148, 151, 147, 143, 148, 145, 158, 142, 137, 129, 127, 156, 147, 143, 137, 135, 142, - 141, 140, 137, 136, 132, 134, 130, 124, 127, 130, 127, 126, 127, 129, 132, 134, 141, - 147, 136, 141, 141, 134, 126, 127, 136, 135, 134, 122, 130, 128, 140, 133, 124, 128, - 137, 128, 141, 135, 141, 147, 153, 151, 151, 154, 150, 147, 157, 153, 153, 153, 151, - 155, 154, 153, 150, 143, 157, 146, 150, 154, 152, 153, 28, 35, 33, 34, 37, 36, 30, 31, - 27, 37, 38, 36, 38, 37, 36, 39, 38, 36, 172, 172, 179, 178, 172, 171, 180, 173, 163, - 164, 159, 159, 155, 163, 184, 187, 176, 176, 184, 179, 174, 167, 165, 166, 160, 166, - 169, 169, 159, 165, 166, 168, 162, 180, 174, 186, 179, 180, 186, 187, 178, 156, 158, - 156, 161, 165, 163, 160, 169, 160, 160, 168, 161, 159, 167, 173, 177, 170, 172, 172, - 169, 157, 161, 155, 165, 164, 154, 161, 160, 31, 30, 28, 31, 31, 29, 38, 36, 40, 31, - 33, 37, 39, 179, 30, 28, 27, 30, 28, 30, 30, 37, 42, 39, 184, 163, 158, 172, 166, 161, - 160, 167, 174, 175, 183, 176, 192, 176, 170, 179, 173, 164, 156, 160, 162, 152, 155, - 157, 174, 176, 184, 173, 180, 177, 182, 190, 170, 167, 154, 156, 171, 169, 172, 177, - 190, 192, 186, 188, 192, 192, 176, 179, 175, 191, 174, 197, 194, 203, 198, 190, 185, - 202, 179, 169, 179, 184, 193, 185, 185, 181, 197, 188, 189, 188, 189, 193, 197, 198, - 203, 188, 189, 198, 190, 196, 191, 191, 197, 202, 182, 178, 186, 194, 192, 186, 187, - 188, 186, 179, 179, 168, 165, 173, 165, 160, 161, 145, 162, 149, 155, 154, 145, 154, - 152, 152, 163, 174, 175, 170, 181, 177, 162, 167, 164, 162, 147, 147, 157, 159, 27, - 28, 28, 36, 36, 37, 35, 35, 35, 35, 37, 37, 35, 35, 36, 171, 40, 40, 176, 178, 171, - 174, 165, 161, 157, 160, 154, 167, 163, 174, 172, 155, 158, 165, 166, 181, 190, 160, - 158, 160, 30, 39, 36, 174, 157, 180, 174, 167, 178, 177, 171, 175, 173, 166, 28, 28, - 28, 29, 30, 34, 35, 36, 29, 36, 37, 38, 32, 29, 41, 38, 38, 35, 34, 34, 36, 34, 35, - 30, 30, 31, 31, 28, 30, 31, 36, 36, 36, 40, 38, 44, 41, 34, 38, 38, 38, 39, 184, 157, - 155, 167, 178]; - ES_LENGTH = 757; - await media.createAudioDecoderByName('avdec_vorbis').then((processor) => { - console.log("create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.log("get AudioDecoderCaps success"); - console.log("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.log("configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.log("prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.log("start success"); - }, failCallback).catch(failCatch); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncCallbackTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncCallbackTest.test.js deleted file mode 100644 index c9dca9a6e..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncCallbackTest.test.js +++ /dev/null @@ -1,1143 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderFuncCallback', function () { - const AUDIOPATH = 'AAC_48000_32_1.aac'; - const AUDIOPATH2 = 'AAC_16000_1.aac'; - const AUDIOPATH3 = 'FLAC_48000_32_1.flac'; - const BASIC_PATH = 'results/decode_func_callback_'; - let audioDecodeProcessor; - let readStreamSync; - let eosframenum = 0; - let samplerate = 44.1; - let workdoneAtEOS = false; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let needGetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - let ES_LENGTH = 1500; - let readpath; - let savepath; - let fdRead; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - let lockFlag = false; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - eosframenum = 0; - samplerate = 44.1; - workdoneAtEOS = false; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - ES_LENGTH = 1500; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - function resetParam(){ - readStreamSync = undefined; - eosframenum = 0; - samplerate = 44.1; - workdoneAtEOS = false; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function writeFile(path, buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.writeSync buffer success'); - } catch(e) { - console.info('case fileio.writeSync buffer error is ' + e); - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function stopWork() { - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info("case stop success") - }) - } - - async function resetWork() { - resetParam(); - audioDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info("case reset success"); - if (needrelease) { - audioDecodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioDecodeProcessor = null; - }) - } - }) - } - - async function flushWork(done) { - lockFlag = true; - inputQueue = []; - outputQueue = []; - await getFdRead(readpath, done); - audioDecodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info("case flush at inputeos success"); - resetParam(); - workdoneAtEOS =true; - lockFlag = false; - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info("case start after flush success"); - }); - }) - } - - async function doneWork(done) { - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info("case stop success"); - resetParam(); - audioDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.log("case reset success"); - audioDecodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioDecodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - }) - }) - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function enqueueAllInputs(queue){ - while (queue.length > 0 && !sawInputEOS){ - let inputobject = queue.shift(); - console.info("frameCnt:" + frameCnt); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1){ - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } - else{ - console.info("read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - timestamp += ES[frameCnt]/samplerate; - frameCnt += 1; - if (!lockFlag) { - audioDecodeProcessor.pushInputData(inputobject, () => { - console.info('queueInput success'); - inputCnt += 1; - }) - } - } - } - - async function dequeueAllOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (stopAtEOS) { - await stopWork(); - } else if (resetAtEOS) { - await resetWork(); - } else if (flushAtEOS) { - await flushWork(done); - } else if (workdoneAtEOS) { - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await doneWork(done); - } else { - console.info("saw output EOS"); - } - } - else{ - console.info("write to file success"); - } - if (!lockFlag) { - audioDecodeProcessor.freeOutputBuffer(outputobject, () => { - console.info('release output success'); - }) - } - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needGetMediaDes){ - audioDecodeProcessor.getOutputMediaDescription((err, MediaDescription) => { - expect(err).assertUndefined(); - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }); - } - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0100 - * @tc.name : 000.test set EOS after last frame and reset - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0100', 0, async function (done) { - console.info("case test set EOS after last frame and reset"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - workdoneAtEOS = true; - needGetMediaDes = true; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_00.pcm'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - eventEmitter.on('createAudioDecoder', () => { - media.createAudioDecoderByName('avdec_aac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }); - media.getMediaCapability((err, mediaCaps) => { - expect(err).assertUndefined(); - console.info('getMediaCapability success'); - if (typeof (mediaCaps) != 'undefined') { - mediaCaps.getAudioDecoderCaps((err, audioCapsArray) => { - expect(err).assertUndefined(); - console.info('getAudioDecoderCaps success'); - if (typeof (audioCapsArray) != 'undefined') { - console.info('get first audioCaps'+ audioCapsArray[0]); - console.info('codecInfo: '+ audioCapsArray[0].codecInfo); - console.info('supportedBitrate: '+ audioCapsArray[0].supportedBitrate); - console.info('supportedBitrate.min: '+ audioCapsArray[0].supportedBitrate.min); - } else { - console.info('audioCaps is not defined'); - } - }) - } else { - console.info('mediaCaps is not defined'); - } - eventEmitter.emit('createAudioDecoder'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0200 - * @tc.name : 001.test set EOS manually before last frame and reset - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0200', 0, async function (done) { - console.info("case test set EOS manually before last frame and reset"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - eosframenum = 500; - workdoneAtEOS = true; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_01.pcm'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.getMediaCapability((err, mediaCaps) => { - expect(err).assertUndefined(); - console.info(`case getMediaCapability 1`); - mediaCaps.getAudioDecoderCaps((err, audioCaps) => { - expect(err).assertUndefined(); - console.info('getAudioDecoderCaps success'); - if (typeof (audioCaps) != 'undefined') { - console.info("case audioCaps " + audioCaps); - } else { - console.info("case audioCaps is not defined"); - } - }) - }) - media.createAudioDecoderByName('avdec_aac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0300 - * @tc.name : 002.test flush at running state - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0300', 0, async function (done) { - console.info("case test flush at running state"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - workdoneAtEOS = true; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_02.pcm'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start(async(err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - await sleep(500); - eventEmitter.emit('flush'); - }) - }); - eventEmitter.on('flush', () => { - lockFlag = true; - inputQueue = []; - outputQueue = []; - audioDecodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info(`case flush after 2s success`); - lockFlag = false; - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start after flush success`); - }); - }); - }); - media.createAudioDecoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0400 - * @tc.name : 003. test flush at EOS state - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0400', 0, async function (done) { - console.info("case test flush at EOS state"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - eosframenum = 200; - flushAtEOS = true; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_03.pcm'; - await getFdRead(readpath, done); - - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioDecoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0500 - * @tc.name : 004. test stop at running state and reset - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0500', 0, async function (done) { - console.info("case test stop at running state and reset"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_04.pcm'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - eventEmitter.emit('stop'); - }) - }); - eventEmitter.on('stop', () => { - sleep(5000).then(() => { - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`case stop 1`); - eventEmitter.emit('reset'); - }) - }) - }); - eventEmitter.on('reset', () => { - resetParam(); - audioDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info(`case reset 1`); - eventEmitter.emit('release'); - }) - }); - eventEmitter.on('release', () => { - audioDecodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.info(`case release 1`); - audioDecodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - }); - media.createAudioDecoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0600 - * @tc.name : 005. test stop and restart - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0600', 0, async function (done) { - console.info("case test start - stop - restart"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - eosframenum = 200; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_05.pcm'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - eventEmitter.emit('stop'); - }) - }); - eventEmitter.on('stop', () => { - sleep(5000).then(() => { - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`stop after 5s`); - resetParam(); - eventEmitter.emit('restart'); - }) - }) - }); - eventEmitter.on('restart', () => { - sleep(2000).then(async() => { - resetParam(); - await getFdRead(readpath, done); - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`restart after 2s`); - workdoneAtEOS=true; - enqueueAllInputs(inputQueue); - }) - }) - }); - media.createAudioDecoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0700 - * @tc.name : 006. test reconfigure for new file with the same format - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0700', 0, async function (done) { - console.info("case test reconfigure codec for new file with the same format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - eosframenum = 200; - resetAtEOS = true; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_06.pcm'; - await getFdRead(readpath, done); - let mediaDescription2 = { - "channel_count": 1, - "sample_rate": 16000, - "audio_sample_format": 1, - } - let hasreconfigured = false; - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - if (!hasreconfigured){ - eventEmitter.emit('reconfigure', mediaDescription2); - } - }) - }); - eventEmitter.on('reconfigure', (mediaDescription2) => { - sleep(10000).then(async() => { - resetParam(); - await fileio.close(fdRead); - audioDecodeProcessor.configure(mediaDescription2, async(err) => { - expect(err).assertUndefined(); - console.info(`case configure 2`); - resetParam(); - console.info('resetParam success, resetAtEOS IS :' + resetAtEOS) - readpath = AUDIOPATH2; - savepath = 'audioDecode_function_callback_06_2.pcm'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - ES = [0, 239, 302, 309, 330, 474, 684, 699, 683, 674, 647, 649, 638, 644, 640, - 639, 650, 702, 713, 718, 707, 707, 683, 670, 674, 699, 654, 650, 715, 770, - 764, 736, 697, 664, 643, 649, 704, 730, 720, 710, 689, 670, 673, 653, 635, - 643, 638, 653, 658, 683, 683, 705, 690, 681, 648, 659, 743, 681, 706, 707, - 718, 714, 746, 725, 741, 709, 675, 675, 751, 698, 736, 738, 711, 702, 691, - 668, 668, 650, 661, 678, 694, 719, 685, 700, 657, 671, 668, 701, 689, 685, - 682, 668, 696, 690, 683, 739, 704, 667, 694, 716, 757, 714, 701, 664, 619, - 609, 591, 644, 573, 572, 605, 595, 597, 529, 581, 578, 586, 537, 577, 535, - 572, 570, 534, 547, 581, 530, 591, 521, 556, 570, 557, 541, 506, 572, 579, - 502, 516, 582, 540, 584, 548, 555, 539, 578, 588, 541, 539, 526, 575, 535, - 571, 525, 569, 560, 584, 551, 574, 572, 537, 550, 582, 512, 559, 593, 601, - 594, 546, 560, 567, 547, 529, 576, 577, 556, 551, 530, 542, 575, 510, 559, - 613, 628, 511, 566, 515, 539, 594, 536, 565, 551, 533, 613, 557, 523, 574, - 582, 616, 610, 573, 509, 535]; - ES_LENGTH = 200; - samplerate = 16; - hasreconfigured = true; - eventEmitter.emit('prepare'); - }) - }) - }); - media.createAudioDecoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0800 - * @tc.name : 007. test reconfigure for new file with different formats - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_CALLBACK_0800', 0, async function (done) { - console.info("case test reconfigure codec for new file with different format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - let mediaDescription2 = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - let hasrecreate = false; - eosframenum = 200; - resetAtEOS = true; - needrelease = true; - readpath = AUDIOPATH; - savepath = 'audioDecode_function_callback_07.pcm'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioDecoderCaps', () => { - audioDecodeProcessor.getAudioDecoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioDecoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - if (!hasrecreate){ - eventEmitter.emit('recreate'); - } - }) - }); - eventEmitter.on('recreate', () => { - sleep(10000).then(async() => { - await fileio.close(fdRead); - media.createAudioDecoderByMime('audio/flac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder flac`); - audioDecodeProcessor = processor; - hasrecreate = true; - eventEmitter.emit('reconfigure', mediaDescription2); - }) - }) - }); - eventEmitter.on('reconfigure', (mediaDescription2) => { - audioDecodeProcessor.configure(mediaDescription2, async(err) => { - expect(err).assertUndefined(); - console.info(`case configure 2`); - resetParam(); - readpath = AUDIOPATH3; - savepath = 'audioDecode_function_callback_07_2.pcm'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - ES = [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, - 2806, 2796, 2786, 2774, 2758, 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, - 2839, 2794, 2770, 2763, 2756, 2722, 2950, 2876, 2842, 2827, 2792, 3121, 3075, - 2969, 3240, 3199, 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, - 2779, 2963, 2893, 2870, 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, - 2876, 3223, 3040, 3006, 3042, 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, - 3300, 3140, 3014, 2975, 2952, 2896, 2897, 2842, 2929, 3567, 3929, 3485, 3082, - 3625, 4953, 5239, 5094, 4993, 4821, 4431, 5195, 5542, 5557, 4894, 4414]; - ES_LENGTH = 100; - samplerate = 48; - eventEmitter.emit('prepare'); - }) - }); - media.createAudioDecoderByName('avdec_aac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - eventEmitter.emit('getAudioDecoderCaps'); - }) - }) -}) diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncPromiseTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncPromiseTest.test.js deleted file mode 100644 index e325067ae..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderFuncPromiseTest.test.js +++ /dev/null @@ -1,942 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderFuncPromise', function () { - const AUDIOPATH = 'AAC_48000_32_1.aac'; - const AUDIOPATH2 = 'AAC_16000_1.aac'; - const AUDIOPATH3 = 'FLAC_48000_32_1.flac'; - let audioDecodeProcessor; - let readStreamSync; - let eosframenum = 0; - let samplerate = 44.1; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needGetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - let ES_LENGTH = 1500; - let readpath; - let savepath; - let fdRead; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - let lockFlag = false; - - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case 3'); - audioDecodeProcessor = undefined; - readStreamSync = undefined; - eosframenum = 0; - samplerate = 44.1; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - ES_LENGTH = 1500; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - readStreamSync = undefined; - eosframenum = 0; - samplerate = 44.1; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function writeFile(path, buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.writeSync buffer success'); - } catch(e) { - console.info('case fileio.writeSync buffer error is ' + e); - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function stopWork() { - await audioDecodeProcessor.stop().then(() => { - console.info("case stop success") - }, failCallback).catch(failCatch); - } - - async function resetWork() { - resetParam(); - await audioDecodeProcessor.reset().then(() => { - console.info("case reset success"); - if (needrelease) { - audioDecodeProcessor = null; - } - }, failCallback).catch(failCatch); - } - - async function flushWork(done) { - lockFlag = true; - inputQueue = []; - outputQueue = []; - await getFdRead(readpath, done); - await audioDecodeProcessor.flush().then(() => { - console.info("case flush at inputeos success"); - resetParam(); - workdoneAtEOS =true; - }, failCallback).catch(failCatch); - lockFlag = false; - await audioDecodeProcessor.start().then(() => { - console.info("case start after flush success"); - resetParam(); - workdoneAtEOS =true; - }, failCallback).catch(failCatch); - } - - async function doneWork() { - await audioDecodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioDecodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioDecodeProcessor = null; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - timestamp += ES[frameCnt]/samplerate; - frameCnt += 1; - if (!lockFlag) { - audioDecodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - inputCnt += 1; - }); - } - } - } - - async function dequeueAllOutputs(queue, savapath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - console.info("sawOutputEOS == true"); - if (stopAtEOS) { - await stopWork(); - } else if (resetAtEOS) { - await resetWork(); - } else if (flushAtEOS) { - await flushWork(done); - } else if (workdoneAtEOS) { - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await doneWork(); - await fileio.close(fdRead); - done(); - } else { - console.info("saw output EOS"); - } - } - else{ - console.info("write to file success"); - } - if (!lockFlag) { - audioDecodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }); - } - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - console.info("outputbuffer.flags: " + outBuffer.flags); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }, failCallback).catch(failCatch);} - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0100 - * @tc.name : 000.test set EOS after last frame and reset - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0100', 0, async function (done) { - console.info("case test set EOS after last frame and reset"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_00.pcm'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - needGetMediaDes = true; - await media.getMediaCapability().then((mediaCaps) => { - console.info('getMediaCapability success'); - if (typeof (mediaCaps) != 'undefined') { - mediaCaps.getAudioDecoderCaps().then((audioCapsArray) => { - console.info('getAudioDecoderCaps success'); - if (typeof (audioCapsArray) != 'undefined') { - console.info('audioCapsArray is not null'); - console.info('get first audioCaps'+ audioCapsArray[0]); - console.info('codecInfo: '+ audioCapsArray[0].codecInfo); - console.info('supportedBitrate: '+ audioCapsArray[0].supportedBitrate); - console.info('supportedBitrate.min: '+ audioCapsArray[0].supportedBitrate.min); - } else { - console.info('audioCaps is not defined'); - } - }, failCallback).catch(failCatch); - } else { - console.info('mediaCaps is not defined'); - } - }, failCallback).catch(failCatch); - await media.createAudioDecoderByName('avdec_aac').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0200 - * @tc.name : 001.test set EOS manually before last frame and reset - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0200', 0, async function (done) { - console.info("case test set EOS manually before last frame and reset"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_01.pcm'; - await getFdRead(readpath, done); - eosframenum = 500; - workdoneAtEOS = true; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - console.info("get AudioDecoderCaps:"); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0300 - * @tc.name : 002.test flush at running state - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0300', 0, async function (done) { - console.info("case test flush at running state"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_02.pcm'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(500).then(async() => { - lockFlag = true; - inputQueue = []; - outputQueue = []; - await audioDecodeProcessor.flush().then(() => { - console.info("case flush after 5s"); - }, failCallback).catch(failCatch); - lockFlag = false; - await audioDecodeProcessor.start().then(() => { - console.info("case start after flush success"); - }, failCallback).catch(failCatch); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0400 - * @tc.name : 003. test flush at EOS state - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0400', 0, async function (done) { - console.info("case test flush at EOS state"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_03.pcm'; - await getFdRead(readpath, done); - eosframenum = 200; - flushAtEOS = true; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0500 - * @tc.name : 004. test stop at running state and reset - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0500', 0, async function (done) { - console.info("case test stop at running state and reset"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_04.pcm'; - await getFdRead(readpath, done); - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(5000).then(() => { - audioDecodeProcessor.stop().then(() => { - console.info("case stop after 5s success"); - }, failCallback).catch(failCatch);}); - resetParam(); - await audioDecodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioDecodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0600 - * @tc.name : 005. test stop and restart - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0600', 0, async function (done) { - console.info("case test stop and restart"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_05.pcm'; - await getFdRead(readpath, done); - eosframenum = 200; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(5000).then(() => { - console.info("case stop decoding after 5s"); - }); - await audioDecodeProcessor.stop().then(() => { - console.info("case stop after 5s success"); - }, failCallback).catch(failCatch); - await sleep(2000).then(() => { - console.info("case restart decoding after 2s"); - }); - resetParam(); - await getFdRead(readpath, done); - await audioDecodeProcessor.start().then(() => { - console.info("case restart after 3s success"); - workdoneAtEOS = true; - enqueueAllInputs(inputQueue); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0700 - * @tc.name : 006. test reconfigure for new file with the same format - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0700', 0, async function (done) { - console.info("case test reconfigure codec for new file with the same format"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - let mediaDescription2 = { - "channel_count": 1, - "sample_rate": 16000, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_06.pcm'; - await getFdRead(readpath, done); - eosframenum = 200; - resetAtEOS = true; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(10000).then(() => { - console.info("case start configure 2"); - }); - resetParam(); - await fileio.close(fdRead); - await audioDecodeProcessor.configure(mediaDescription2).then(() => { - console.info("case configure 2 success"); - resetParam(); - }, failCallback).catch(failCatch); - readpath = AUDIOPATH2; - savepath = 'audioDecode_function_promise_06_2.pcm'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - ES = [0, 239, 302, 309, 330, 474, 684, 699, 683, 674, 647, 649, 638, 644, 640, - 639, 650, 702, 713, 718, 707, 707, 683, 670, 674, 699, 654, 650, 715, 770, - 764, 736, 697, 664, 643, 649, 704, 730, 720, 710, 689, 670, 673, 653, 635, - 643, 638, 653, 658, 683, 683, 705, 690, 681, 648, 659, 743, 681, 706, 707, - 718, 714, 746, 725, 741, 709, 675, 675, 751, 698, 736, 738, 711, 702, 691, - 668, 668, 650, 661, 678, 694, 719, 685, 700, 657, 671, 668, 701, 689, 685, - 682, 668, 696, 690, 683, 739, 704, 667, 694, 716, 757, 714, 701, 664, 619, - 609, 591, 644, 573, 572, 605, 595, 597, 529, 581, 578, 586, 537, 577, 535, - 572, 570, 534, 547, 581, 530, 591, 521, 556, 570, 557, 541, 506, 572, 579, - 502, 516, 582, 540, 584, 548, 555, 539, 578, 588, 541, 539, 526, 575, 535, - 571, 525, 569, 560, 584, 551, 574, 572, 537, 550, 582, 512, 559, 593, 601, - 594, 546, 560, 567, 547, 529, 576, 577, 556, 551, 530, 542, 575, 510, 559, - 613, 628, 511, 566, 515, 539, 594, 536, 565, 551, 533, 613, 557, 523, 574, - 582, 616, 610, 573, 509, 535]; - ES_LENGTH = 200; - samplerate = 16; - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare2 success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start2 success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0800 - * @tc.name : 007. test reconfigure for new file with different formats - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_FUNCTION_PROMISE_0800', 0, async function (done) { - console.info("case test reconfigure codec for new file with different formats"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - let mediaDescription2 = { - "channel_count": 1, - "sample_rate": 48000, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioDecode_function_promise_07.pcm'; - await getFdRead(readpath, done); - eosframenum = 200; - resetAtEOS = true; - needrelease = true; - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioDecoder success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.getAudioDecoderCaps().then((AudioCaps) => { - console.info("case get AudioDecoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(10000).then(() => { - console.info("start createaudiodecoder 2"); - }); - await fileio.close(fdRead); - await media.createAudioDecoderByMime('audio/flac').then((processor) => { - console.info("case create createAudioDecoder flac success"); - audioDecodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioDecodeProcessor.configure(mediaDescription2).then(() => { - console.info("case configure 2 success"); - resetParam(); - }, failCallback).catch(failCatch); - readpath = AUDIOPATH3; - savepath = 'audioDecode_function_promise_07_2.pcm'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - ES = [0, 2116, 2093, 2886, 2859, 2798, 2778, 2752, 2752, 2754, 2720, 2898, 2829, - 2806, 2796, 2786, 2774, 2758, 2741, 3489, 3342, 3272, 3167, 3048, 3060, 2919, - 2839, 2794, 2770, 2763, 2756, 2722, 2950, 2876, 2842, 2827, 2792, 3121, 3075, - 2969, 3240, 3199, 3082, 2975, 2895, 3135, 3024, 2970, 2902, 2860, 2802, 2778, - 2779, 2963, 2893, 2870, 2831, 2800, 2762, 2752, 2760, 2759, 2726, 2889, 2960, - 2876, 3223, 3040, 3006, 3042, 2980, 3097, 3069, 3215, 3365, 3296, 3653, 3480, - 3300, 3140, 3014, 2975, 2952, 2896, 2897, 2842, 2929, 3567, 3929, 3485, 3082, - 3625, 4953, 5239, 5094, 4993, 4821, 4431, 5195, 5542, 5557, 4894, 4414]; - ES_LENGTH = 100; - samplerate = 48; - setCallback(savepath, done); - await audioDecodeProcessor.prepare().then(() => { - console.info("case prepare2 success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.start().then(() => { - console.info("case start2 success"); - }, failCallback).catch(failCatch); - }) -}) diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderMultiInstancesTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderMultiInstancesTest.test.js deleted file mode 100644 index 8b7cbde45..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderMultiInstancesTest.test.js +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderMultiInstances', function () { - const AUDIOPATH = 'AAC_48000_32_1.aac'; - let readStreamSync; - let eosframenum = 0; - let samplerate = 44.1; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needGetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = []; - let ES_LENGTH = 1500; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - }) - - afterEach(function() { - console.info('afterEach case'); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - readStreamSync = undefined; - eosframenum = 0; - samplerate = 44.1; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - } - - function writeFile(path, buf, len) { - try{ - let writestream = fileio.createStreamSync(path, "ab+"); - let num = writestream.writeSync(buf, {length:len}); - writestream.flushSync(); - writestream.closeSync(); - }catch(e) { - console.info(e) - } - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.createStreamSync(path, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = readStreamSync.readSync(buf,{length:len}); - } - - async function stopWork(audioDecodeProcessor) { - await audioDecodeProcessor.stop().then(() => { - console.info("case stop success") - }, failCallback).catch(failCatch); - } - - async function resetWork(audioDecodeProcessor) { - resetParam(); - await audioDecodeProcessor.reset().then(() => { - console.info("case reset success"); - if (needrelease) { - audioDecodeProcessor = null; - } - }, failCallback).catch(failCatch); - } - - async function flushWork(audioDecodeProcessor) { - inputQueue = []; - outputQueue = []; - await audioDecodeProcessor.flush().then(() => { - console.info("case flush at inputeos success"); - resetParam(); - readFile(AUDIOPATH); - workdoneAtEOS =true; - }, failCallback).catch(failCatch); - } - - async function doneWork(audioDecodeProcessor) { - await audioDecodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioDecodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - audioDecodeProcessor = null; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function enqueueAllInputs(audioDecodeProcessor, queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - timestamp += ES[frameCnt]/samplerate; - frameCnt += 1; - audioDecodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - }); - } - } - - async function dequeueAllOutputs(audioDecodeProcessor, queue, savapath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - console.info("sawOutputEOS == true"); - if (stopAtEOS) { - await stopWork(audioDecodeProcessor); - } else if (resetAtEOS) { - await resetWork(audioDecodeProcessor); - } else if (flushAtEOS) { - await flushWork(audioDecodeProcessor); - } else if (workdoneAtEOS) { - await doneWork(audioDecodeProcessor); - done(); - } else { - console.info("saw output EOS"); - } - } - else{ - writeFile(savapath, outputobject.data, outputobject.length); - console.info("write to file success"); - } - audioDecodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }); - } - } - - function setCallback(audioDecodeProcessor, savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(audioDecodeProcessor, inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - console.info("outputbuffer.flags: " + outBuffer.flags); - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }, failCallback).catch(failCatch);} - outputQueue.push(outBuffer); - await dequeueAllOutputs(audioDecodeProcessor, outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_MULTIINSTANCE_0100 - * @tc.name : 001.create multiple decoders - * @tc.desc : basic decode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_MULTIINSTANCE_0100', 0, async function (done) { - console.info("case test multiple instances"); - let array = new Array(); - for (let i = 0; i < 2; i += 1) { - await media.createAudioDecoderByMime('audio/mp4a-latm').then((processor) => { - if (typeof(processor) != 'undefined') { - console.info("case create createAudioDecoder success: " + i); - array[i] = processor; - } else { - console.info("case create createAudioDecoder failed: " + i); - } - }, failCallback).catch(failCatch); - } - console.info('case has created multiple decoders'); - for (let j = 0; j < 2; j++) { - resetParam(); - await array[j].reset().then(() => { - console.info("reset decoder " + j); - }, failCallback).catch(failCatch); - await array[j].release().then(() => { - console.info('release success'); - array[j] = null; - }, failCallback).catch(failCatch); - } - done(); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityCallbackTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityCallbackTest.test.js deleted file mode 100644 index ea96afdd5..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityCallbackTest.test.js +++ /dev/null @@ -1,1355 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderReliabilityCallback', function () { - const AUDIOPATH = 'AAC_48000_32_1.aac'; - const BASIC_PATH = 'results/decode_reliability_callback'; - const END = 0; - const CONFIGURE = 1; - const PREPARE = 2; - const START = 3; - const FLUSH = 4; - const STOP = 5; - const RESET = 6; - const HOLDON = 7; - const WAITFORALLOUTS = 8; - const CONFIGURE_ERROR = 9; - const PREPARE_ERROR = 10; - const START_ERROR = 11; - const FLUSH_ERROR = 12; - const STOP_ERROR = 13; - const JUDGE_EOS = 14; - const WAITTIME = 3000; - let audioDecodeProcessor; - let readStreamSync; - let EOSFrameNum = 0; - let samplerate = 44.1; - let workdoneAtEOS = false; - let flushAtEOS = false; - let needGetMediaDes = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - let ES_LENGTH = 500; - let mime = 'audio/mp4a-latm'; - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - }; - let fdRead; - let lockFlag = false; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - EOSFrameNum = 0; - samplerate = 44.1; - workdoneAtEOS = false; - flushAtEOS = false; - needGetMediaDes = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - ES_LENGTH = 500; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - function resetParam() { - readStreamSync = undefined; - EOSFrameNum = 0; - samplerate = 44.1; - workdoneAtEOS = false; - flushAtEOS = false; - needGetMediaDes = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - lockFlag = false; - } - - async function createAudioDecoder(savepath, mySteps, done) { - await getFdRead(AUDIOPATH, done); - media.createAudioDecoderByMime(mime, (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - setCallback(savepath, done); - console.info("case start api test"); - nextStep(mySteps, mediaDescription, done); - }) - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function doneWork(done) { - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info("case stop success"); - resetParam(); - audioDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.log("case reset success"); - audioDecodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioDecodeProcessor = null; - done(); - }) - }) - }) - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function nextStep(mySteps, mediaDescription, done) { - console.info("case myStep[0]: " + mySteps[0]); - if (mySteps[0] == END) { - console.info('case to done'); - audioDecodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info(`case release 1`); - audioDecodeProcessor = null; - done(); - }); - } - switch (mySteps[0]) { - case CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - await getFdRead(AUDIOPATH, done); - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - audioDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case START: - mySteps.shift(); - console.info(`case to start`); - if (sawOutputEOS) { - resetParam(); - await getFdRead(AUDIOPATH, done); - workdoneAtEOS = true; - enqueueAllInputs(inputQueue); - } - audioDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case FLUSH: - mySteps.shift(); - console.info(`case to flush`); - lockFlag = true; - inputQueue = []; - outputQueue = []; - audioDecodeProcessor.flush(async(err) => { - expect(err).assertUndefined(); - console.info(`case flush 1`); - if (flushAtEOS) { - resetParam(); - await getFdRead(AUDIOPATH, done); - workdoneAtEOS = true; - flushAtEOS = false; - } - lockFlag = false; - nextStep(mySteps, mediaDescription, done); - }); - break; - case STOP: - mySteps.shift(); - console.info(`case to stop`); - audioDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`case stop 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case RESET: - mySteps.shift(); - console.info(`case to reset`); - resetParam(); - audioDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info(`case reset 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case HOLDON: - mySteps.shift(); - setTimeout(() =>{ - nextStep(mySteps, mediaDescription, done); - }, WAITTIME); - break; - case WAITFORALLOUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - case CONFIGURE_ERROR: - mySteps.shift(); - console.info(`case to configure 2`); - audioDecodeProcessor.configure(mediaDescription, (err) => { - expect(err != undefined).assertTrue(); - console.info(`case configure error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case PREPARE_ERROR: - mySteps.shift(); - console.info(`case to prepare`); - audioDecodeProcessor.prepare((err) => { - expect(err != undefined).assertTrue(); - console.info(`case prepare error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case START_ERROR: - mySteps.shift(); - console.info(`case to start`); - audioDecodeProcessor.start((err) => { - expect(err != undefined).assertTrue(); - console.info(`case start error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case FLUSH_ERROR: - mySteps.shift(); - console.info(`case to flush`); - audioDecodeProcessor.flush((err) => { - expect(err != undefined).assertTrue(); - console.info(`case flush error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case STOP_ERROR: - mySteps.shift(); - console.info(`case to stop`); - audioDecodeProcessor.stop((err) => { - expect(err != undefined).assertTrue(); - console.info(`case stop error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case JUDGE_EOS: - mySteps.shift(); - console.info(`case judge EOS state`); - expect(sawOutputEOS).assertTrue(); - nextStep(mySteps, mediaDescription, done); - break; - default: - break; - } - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - console.info("frameCnt:" + frameCnt); - if (frameCnt == EOSFrameNum || frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } - else{ - console.info("read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - timestamp += ES[frameCnt]/samplerate; - frameCnt += 1; - if (!lockFlag) { - audioDecodeProcessor.pushInputData(inputobject, () => { - console.info('queueInput success'); - }) - } - } - } - - async function dequeueAllOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (workdoneAtEOS) { - await doneWork(done); - } else { - console.info("sawOutputEOS = true"); - } - } - else{ - console.info("not last frame, continue"); - } - if (!lockFlag) { - audioDecodeProcessor.freeOutputBuffer(outputobject, () => { - console.info('release output success'); - }) - } - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription((err, MediaDescription) => { - expect(err).assertUndefined(); - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }); - } - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0100 - * @tc.name : 001.create -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0100.pcm'; - let mySteps = new Array(CONFIGURE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0200.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0300 - * @tc.name : 003.start -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, CONFIGURE_ERROR, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0700.pcm'; - let mySteps = new Array(RESET, CONFIGURE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0800.pcm'; - let mySteps = new Array(CONFIGURE, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_CALLBACK_0900', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0900.pcm'; - let mySteps = new Array(CONFIGURE, RESET, CONFIGURE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0100.pcm'; - let mySteps = new Array(PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0200.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, PREPARE_ERROR, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0100 - * @tc.name : 001.create -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0100.pcm'; - let mySteps = new Array(START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0200 - * @tc.name : 002.configure -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0200.pcm'; - let mySteps = new Array(CONFIGURE, START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0400 - * @tc.name : 004.start -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0500 - * @tc.name : 005.flush -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0600 - * @tc.name : 006.stop -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, START_ERROR, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0800 - * @tc.name : 008.reset -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0100 - * @tc.name : 001.create -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0100.pcm'; - let mySteps = new Array(FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0200.pcm'; - let mySteps = new Array(CONFIGURE, FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0400 - * @tc.name : 004.start -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, FLUSH, START, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0100 - * @tc.name : 001.create -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0100.pcm'; - let mySteps = new Array(STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0200.pcm'; - let mySteps = new Array(CONFIGURE, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0400 - * @tc.name : 004.start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, STOP, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0100 - * @tc.name : 001.create -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0100.pcm'; - let mySteps = new Array(RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0200.pcm'; - let mySteps = new Array(CONFIGURE, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0400 - * @tc.name : 004.start -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0100.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, STOP, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0200.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, END); - EOSFrameNum = 2; - flushAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, CONFIGURE, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, STOP, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityPromiseTest.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityPromiseTest.test.js deleted file mode 100644 index 6ad1811b0..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/AudioDecoderReliabilityPromiseTest.test.js +++ /dev/null @@ -1,1361 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioDecoderReliabilityPromise', function () { - const AUDIOPATH = 'AAC_48000_32_1.aac'; - const BASIC_PATH = 'results/decode_reliability_promise'; - const END = 0; - const CONFIGURE = 1; - const PREPARE = 2; - const START = 3; - const FLUSH = 4; - const STOP = 5; - const RESET = 6; - const HOLDON = 7; - const WAITFORALLOUTS = 8; - const CONFIGURE_ERROR = 9; - const PREPARE_ERROR = 10; - const START_ERROR = 11; - const FLUSH_ERROR = 12; - const STOP_ERROR = 13; - const JUDGE_EOS = 14; - const WAITTIME = 3000; - let audioDecodeProcessor; - let readStreamSync; - let EOSFrameNum = 0; - let samplerate = 44.1; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needGetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - let ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - let ES_LENGTH = 500; - let mime = 'audio/mp4a-latm'; - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - }; - let expectError = false; - let fdRead; - let lockFlag = false; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - audioDecodeProcessor = null; - readStreamSync = undefined; - EOSFrameNum = 0; - samplerate = 44.1; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES = [0, 283, 336, 291, 405, 438, 411, 215, 215, 313, 270, 342, 641, 554, 545, 545, 546, - 541, 540, 542, 552, 537, 533, 498, 472, 445, 430, 445, 427, 414, 386, 413, 370, 380, - 401, 393, 369, 391, 367, 395, 396, 396, 385, 391, 384, 395, 392, 386, 388, 384, 379, - 376, 381, 375, 373, 349, 391, 357, 384, 395, 384, 380, 386, 372, 386, 383, 378, 385, - 385, 384, 342, 390, 379, 387, 386, 393, 397, 362, 393, 394, 391, 383, 385, 377, 379, - 381, 369, 375, 379, 346, 382, 356, 361, 366, 394, 393, 385, 362, 406, 399, 384, 377, - 385, 389, 375, 346, 396, 388, 381, 383, 352, 357, 397, 382, 395, 376, 388, 373, 374, - 353, 383, 384, 393, 379, 348, 364, 389, 380, 381, 388, 423, 392, 381, 368, 351, 391, - 355, 358, 395, 390, 385, 382, 383, 388, 388, 389, 376, 379, 376, 384, 369, 354, 390, - 389, 396, 393, 382, 385, 353, 383, 381, 377, 411, 387, 390, 377, 349, 381, 390, 378, - 373, 375, 381, 351, 392, 381, 380, 381, 378, 387, 379, 383, 348, 386, 364, 386, 371, - 399, 399, 385, 380, 355, 397, 395, 382, 380, 386, 352, 387, 390, 373, 372, 388, 378, - 385, 368, 385, 370, 378, 373, 383, 368, 373, 388, 351, 384, 391, 387, 389, 383, 355, - 361, 392, 386, 354, 394, 392, 397, 392, 352, 381, 395, 349, 383, 390, 392, 350, 393, - 393, 385, 389, 393, 382, 378, 384, 378, 375, 373, 375, 389, 377, 383, 387, 373, 344, - 388, 379, 391, 373, 384, 358, 361, 391, 394, 363, 350, 361, 395, 399, 389, 398, 375, - 398, 400, 381, 354, 363, 366, 400, 400, 356, 370, 400, 394, 398, 385, 378, 372, 354, - 359, 393, 381, 363, 396, 396, 355, 390, 356, 355, 371, 399, 367, 406, 375, 377, 405, - 401, 390, 393, 392, 384, 386, 374, 358, 397, 389, 393, 385, 345, 379, 357, 388, 356, - 381, 389, 367, 358, 391, 360, 394, 396, 357, 395, 388, 394, 383, 357, 383, 392, 394, - 376, 379, 356, 386, 395, 387, 377, 377, 389, 377, 385, 351, 387, 350, 388, 384, 345, - 358, 368, 399, 394, 385, 384, 395, 378, 387, 386, 386, 376, 375, 382, 351, 359, 356, - 401, 388, 363, 406, 363, 374, 435, 366, 400, 393, 392, 371, 391, 359, 359, 397, 388, - 390, 420, 411, 369, 384, 382, 383, 383, 375, 381, 361, 380, 348, 379, 386, 379, 379, - 386, 371, 352, 378, 378, 388, 384, 385, 352, 355, 387, 383, 379, 362, 386, 399, 376, - 390, 350, 387, 357, 403, 398, 397, 360, 351, 394, 400, 399, 393, 388, 395, 370, 377, - 395, 360, 346, 381, 370, 390, 380, 391, 387, 382, 384, 383, 354, 349, 394, 358, 387, - 400, 386, 402, 354, 396, 387, 391, 365, 377, 359, 361, 365, 395, 388, 388, 384, 388, - 378, 374, 382, 376, 377, 389, 378, 341, 390, 376, 381, 375, 414, 368, 369, 387, 411, - 396, 391, 378, 389, 349, 383, 344, 381, 387, 380, 353, 361, 391, 365, 390, 396, 382, - 386, 385, 385, 409, 387, 386, 378, 372, 372, 374, 349, 388, 389, 348, 395, 380, 382, - 388, 375, 347, 383, 359, 389, 368, 361, 405, 398, 393, 395, 359, 360, 395, 395, 362, - 354, 388, 348, 388, 386, 390, 350, 388, 356, 369, 364, 404, 404, 391, 394, 385, 439, - 432, 375, 366, 441, 362, 367, 382, 374, 346, 391, 371, 354, 376, 390, 373, 382, 385, - 389, 378, 377, 347, 414, 338, 348, 385, 352, 385, 386, 381, 388, 387, 364, 465, 405, - 443, 387, 339, 376, 337, 379, 387, 370, 374, 358, 354, 357, 393, 356, 381, 357, 407, - 361, 397, 362, 394, 394, 392, 394, 391, 381, 386, 379, 354, 351, 392, 408, 393, 389, - 388, 385, 375, 388, 375, 388, 375, 354, 384, 379, 386, 394, 383, 359, 405, 395, 352, - 345, 403, 427, 373, 380, 350, 415, 378, 434, 385, 388, 387, 400, 405, 329, 391, 356, - 419, 358, 359, 375, 367, 391, 359, 369, 361, 376, 378, 379, 348, 390, 345, 388, 390, - 406, 349, 368, 364, 391, 384, 401, 384, 391, 361, 399, 359, 386, 392, 382, 386, 380, - 383, 345, 376, 393, 400, 395, 343, 352, 354, 381, 388, 357, 393, 389, 384, 389, 388, - 384, 404, 372, 358, 381, 352, 355, 485, 393, 371, 376, 389, 377, 391, 387, 376, 342, - 390, 375, 379, 396, 376, 402, 353, 392, 382, 383, 387, 386, 372, 377, 382, 388, 381, - 387, 357, 393, 385, 346, 389, 388, 357, 362, 404, 398, 397, 402, 371, 351, 370, 362, - 350, 388, 399, 402, 406, 377, 396, 359, 372, 390, 392, 368, 383, 346, 384, 381, 379, - 367, 384, 389, 381, 371, 358, 422, 372, 382, 374, 444, 412, 369, 362, 373, 389, 401, - 383, 380, 366, 365, 361, 379, 372, 345, 382, 375, 376, 375, 382, 356, 395, 383, 384, - 391, 361, 396, 407, 365, 351, 385, 378, 403, 344, 352, 387, 397, 399, 377, 371, 381, - 415, 382, 388, 368, 383, 405, 390, 386, 384, 374, 375, 381, 371, 372, 374, 377, 346, - 358, 381, 377, 359, 385, 396, 385, 390, 389, 391, 375, 357, 389, 390, 377, 370, 379, - 351, 381, 381, 380, 371, 386, 389, 389, 383, 362, 393, 388, 355, 396, 383, 352, 384, - 352, 383, 362, 396, 385, 396, 357, 388, 382, 377, 373, 379, 383, 386, 350, 393, 355, - 380, 401, 392, 391, 402, 391, 427, 407, 394, 332, 398, 367, 373, 343, 381, 383, 386, - 382, 349, 353, 393, 378, 386, 375, 390, 356, 392, 384, 387, 380, 381, 385, 386, 383, - 378, 379, 359, 381, 382, 388, 357, 357, 397, 358, 424, 382, 352, 409, 374, 368, 365, - 399, 352, 393, 389, 385, 352, 380, 398, 389, 385, 387, 387, 353, 402, 396, 386, 357, - 395, 368, 369, 407, 394, 383, 362, 380, 385, 368, 375, 365, 379, 377, 388, 380, 346, - 383, 381, 399, 359, 386, 455, 368, 406, 377, 339, 381, 377, 373, 371, 338, 371, 387, - 376, 386, 388, 382, 381, 377, 389, 352, 391, 396, 398, 374, 352, 358, 387, 368, 401, - 395, 387, 387, 354, 393, 401, 382, 390, 371, 374, 387, 377, 379, 377, 383, 374, 367, - 372, 393, 365, 392, 350, 378, 385, 377, 382, 388, 353, 389, 359, 366, 404, 390, 381, - 396, 388, 394, 380, 379, 372, 355, 397, 382, 351, 397, 378, 375, 378, 369, 387, 380, - 383, 346, 357, 362, 371, 413, 393, 365, 395, 391, 384, 386, 385, 390, 355, 385, 394, - 384, 383, 431, 369, 373, 392, 397, 396, 353, 391, 352, 375, 382, 397, 393, 371, 403, - 375, 338, 418, 368, 372, 370, 344, 392, 360, 402, 402, 425, 374, 378, 376, 380, 378, - 347, 379, 414, 377, 390, 383, 357, 390, 385, 377, 378, 368, 399, 389, 383, 368, 372, - 358, 386, 355, 380, 386, 349, 381, 379, 380, 351, 389, 380, 353, 359, 365, 370, 407, - 388, 381, 358, 364, 396, 369, 407, 391, 358, 440, 419, 412, 395, 344, 382, 391, 353, - 403, 391, 371, 354, 362, 407, 411, 397, 385, 388, 357, 348, 368, 401, 404, 380, 370, - 369, 365, 349, 373, 346, 351, 394, 399, 387, 393, 363, 402, 394, 375, 389, 386, 395, - 386, 386, 353, 403, 363, 376, 398, 383, 372, 350, 381, 353, 445, 386, 369, 383, 351, - 392, 397, 384, 389, 354, 400, 392, 379, 386, 355, 391, 388, 361, 390, 408, 357, 390, - 387, 352, 393, 357, 358, 401, 383, 391, 384, 388, 377, 380, 354, 393, 387, 357, 396, - 360, 362, 388, 390, 359, 367, 366, 396, 388, 394, 363, 391, 394, 351, 391, 391, 350, - 360, 365, 397, 366, 375, 400, 412, 372, 380, 383, 384, 383, 390, 380, 361, 363, 387, - 358, 385, 359, 385, 399, 351, 392, 388, 385, 384, 350, 379, 385, 383, 375, 389, 381, - 382, 376, 389, 390, 375, 381, 382, 390, 385, 380, 359, 351, 383, 391, 388, 379, 354, - 387, 382, 358, 381, 381, 386, 397, 373, 381, 387, 387, 381, 378, 383, 370, 360, 386, - 362, 402, 357, 398, 398, 397, 378, 394, 381, 375, 380, 390, 373, 369, 388, 347, 356, - 384, 391, 386, 394, 388, 357, 403, 381, 376, 414, 383, 387, 349, 379, 383, 384, 377, - 394, 426, 373, 392, 367, 381, 378, 378, 374, 373, 369, 368, 332, 335, 381, 392, 388, - 381, 424, 367, 398, 399, 392, 379, 391, 379, 370, 343, 405, 378, 367, 345, 379, 347, - 388, 353, 392, 382, 384, 387, 350, 363, 398, 398, 359, 402, 454, 440, 341, 383, 381, - 385, 355, 349, 369, 360, 388, 383, 354, 435, 405, 404, 399, 385, 386, 364, 388, 373, - 376, 384, 395, 400, 408, 390, 375, 341, 372, 371, 407, 345, 378, 345, 407, 365, 398, - 396, 339, 379, 375, 410, 386, 407, 387, 365, 375, 384, 347, 393, 377, 350, 376, 375, - 381, 410, 394, 386, 345, 345, 354, 397, 386, 375, 390, 347, 411, 381, 383, 374, 379, - 380, 378, 391, 380, 339, 390, 383, 375]; - ES_LENGTH = 500; - expectError = false; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioDecodeProcessor != null) { - await audioDecodeProcessor.release().then(() => { - console.info('audioDecodeProcessor release success'); - audioDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCallbackTrue = function(err, mySteps, done) { - console.info('case callback err : ' + err); - expect(err != undefined).assertTrue(); - nextStep(mySteps, done); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - readStreamSync = undefined; - EOSFrameNum = 0; - samplerate = 44.1; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - lockFlag = false; - } - - async function createAudioDecoder(savepath, mySteps, done) { - await getFdRead(AUDIOPATH, done); - media.createAudioDecoderByMime(mime, (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioDecoder 1`); - audioDecodeProcessor = processor; - setCallback(savepath, done); - console.info("case start api test"); - nextStep(mySteps, done); - }) - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - async function closeFdRead() { - await fileio.close(fdRead).then(() => { - console.info('[fileio] case close fdRead success, fd is ' + fdRead); - }, failCallback).catch(failCatch); - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function doneWork() { - await audioDecodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioDecodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await audioDecodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioDecodeProcessor = null; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function nextStep(mySteps, done) { - console.info("case myStep[0]: " + mySteps[0]); - if (mySteps[0] == END) { - audioDecodeProcessor.release().then(() => { - console.info("case release success"); - audioDecodeProcessor = null; - done(); - }, failCallback).catch(failCatch); - } - switch (mySteps[0]) { - case CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - audioDecodeProcessor.prepare().then(() => { - console.info(`case prepare 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case START: - mySteps.shift(); - console.info(`case to start`); - if (sawOutputEOS) { - resetParam(); - await getFdRead(AUDIOPATH, done); - workdoneAtEOS = true; - enqueueAllInputs(inputQueue); - } - audioDecodeProcessor.start().then(() => { - console.info(`case start 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case FLUSH: - mySteps.shift(); - console.info(`case to flush`); - lockFlag = true; - inputQueue = []; - outputQueue = []; - audioDecodeProcessor.flush().then(async() => { - console.info(`case flush 1`); - if (flushAtEOS) { - await getFdRead(AUDIOPATH, done); - resetParam(); - workdoneAtEOS = true; - flushAtEOS = false; - } - lockFlag = false; - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case STOP: - mySteps.shift(); - console.info(`case to stop`); - audioDecodeProcessor.stop().then(() => { - console.info(`case stop 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case RESET: - mySteps.shift(); - console.info(`case to reset`); - resetParam(); - audioDecodeProcessor.reset().then(() => { - console.info(`case reset 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case HOLDON: - mySteps.shift(); - setTimeout(() =>{ - nextStep(mySteps, done); - }, WAITTIME); - break; - case WAITFORALLOUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - case CONFIGURE_ERROR: - mySteps.shift(); - console.info(`case to configure 2`); - audioDecodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case PREPARE_ERROR: - mySteps.shift(); - console.info(`case to prepare 2`); - audioDecodeProcessor.prepare().then(() => { - console.info(`case prepare error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case START_ERROR: - mySteps.shift(); - console.info(`case to start 2`); - audioDecodeProcessor.start().then(() => { - console.info(`case start error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case FLUSH_ERROR: - mySteps.shift(); - console.info(`case to flush 2`); - audioDecodeProcessor.flush().then(() => { - console.info(`case flush error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case STOP_ERROR: - mySteps.shift(); - console.info(`case to stop 2`); - audioDecodeProcessor.stop().then(() => { - console.info(`case stop error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case JUDGE_EOS: - mySteps.shift(); - console.info(`case judge EOS state`); - expect(sawOutputEOS).assertTrue(); - nextStep(mySteps, done); - break; - default: - break; - } - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == EOSFrameNum || frameCnt == ES_LENGTH + 1) { - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[frameCnt]; - getContent(inputobject.data, ES[frameCnt]); - inputobject.flags = 0; - } - timestamp += ES[frameCnt]/samplerate; - frameCnt += 1; - if (!lockFlag) { - audioDecodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - }); - } - } - } - - async function dequeueAllOutputs(queue, savapath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (workdoneAtEOS) { - await doneWork(); - done(); - } else { - console.info("sawOutputEOS = true") - } - } - else{ - console.info("not last frame, continue"); - } - if (!lockFlag) { - audioDecodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }); - } - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioDecodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioDecodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - if (needGetMediaDes) { - audioDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }, failCallback).catch(failCatch);} - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioDecodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioDecodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0100 - * @tc.name : 001.create -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0100.pcm'; - let mySteps = new Array(CONFIGURE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0200.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0300 - * @tc.name : 003.start -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, CONFIGURE_ERROR, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0700.pcm'; - let mySteps = new Array(RESET, CONFIGURE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0800.pcm'; - let mySteps = new Array(CONFIGURE, CONFIGURE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_CONFIGURE_PROMISE_0900', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0900.pcm'; - let mySteps = new Array(CONFIGURE, RESET, CONFIGURE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0100.pcm'; - let mySteps = new Array(PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0200.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, PREPARE_ERROR, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_PREPARE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, PREPARE_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0100 - * @tc.name : 001.create -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0100.pcm'; - let mySteps = new Array(START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0200 - * @tc.name : 002.configure -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0200.pcm'; - let mySteps = new Array(CONFIGURE, START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0400 - * @tc.name : 004.start -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0500 - * @tc.name : 005.flush -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0600 - * @tc.name : 006.stop -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, START_ERROR, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0800 - * @tc.name : 008.reset -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_START_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, START_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0100 - * @tc.name : 001.create -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0100.pcm'; - let mySteps = new Array(FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0200.pcm'; - let mySteps = new Array(CONFIGURE, FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0400 - * @tc.name : 004.start -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, FLUSH, START, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_FLUSH_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, FLUSH_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0100 - * @tc.name : 001.create -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0100.pcm'; - let mySteps = new Array(STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0200.pcm'; - let mySteps = new Array(CONFIGURE, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0400 - * @tc.name : 004.start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, STOP, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_STOP_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, STOP_ERROR, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0100 - * @tc.name : 001.create -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0100.pcm'; - let mySteps = new Array(RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0200.pcm'; - let mySteps = new Array(CONFIGURE, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0400 - * @tc.name : 004.start -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0600.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0700.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_RESET_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0800.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, RESET, END); - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0100.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, STOP, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0200.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, END); - EOSFrameNum = 2; - flushAtEOS = true; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0300.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, CONFIGURE, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0400.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_DECODER_API_EOS_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0500.pcm'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, STOP, END); - EOSFrameNum = 2; - createAudioDecoder(savepath, mySteps, done); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/List.test.js deleted file mode 100644 index 239657117..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/js/test/List.test.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -require('./AudioDecoderFuncPromiseTest.test.js') -require('./AudioDecoderFuncCallbackTest.test.js') -require('./AudioDecoderFormatPromiseTest.test.js') -require('./AudioDecoderFormatCallbackTest.test.js') -require('./AudioDecoderReliabilityPromiseTest.test.js') -require('./AudioDecoderReliabilityCallbackTest.test.js') -require('./AudioDecoderMultiInstancesTest.test.js') -require('./AudioDecoderEnumTest.test.js') - diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/element/string.json deleted file mode 100644 index 0bae6bd40..000000000 --- a/multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "entry_MainAbility", - "value": "entry_MainAbility" - }, - { - "name": "mainability_description", - "value": "JS_Empty Ability" - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/audioDecoder/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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/data/app/el2/100/base/ohos.acts.multimedia.audio.audioencoder/haps/entry/files/" - ] - }, - { - "type": "ShellKit", - "run-command": [ - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.audio.audioencoder/haps/entry/files/", - "chmod 777 /data/app/el2/100/base/ohos.acts.multimedia.audio.audioencoder/haps/entry/files/*", - "chmod 777 -R /storage/media/100/local/files/", - "chmod 777 /storage/media/100/local/files/*" - ], - "teardown-command":[ - ] - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/audioEncoder/signature/openharmony_sx.p7b deleted file mode 100644 index 6a18cb457cfc106b6271d29a3b5d031224eeee96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3458 zcmcgvYj6|S6}BF>F-F*q0R!bJ2&RC{U0Jdvrx13fm9)Yud4*(Kj;UEmtA{P^%F@a! zi$JJo+<*g=G6fefn3sWuM{7uonF)C`;gK{@2w`Z-qd;g1rJ)p(&`@Z1Z5M0?esnU! z{@9&!?z#7Vd(L;hI~OEn3)3>DG?|*dm5I{DZAlpelCnCnNCe41W?II)CXq2wjdw1*Cw4Dk**Q~(Nqe40EK3wU@_4V1+$ zt(H=#z5Gj6r1mJZYM@b&S_(jgDzBGdN7%S}8 z8^J_t0yIncBBbEu0~^R-z!P8_MkNiR!9cz2OT zt12$!-3zA4T`}4dq!a<#%LvmwR09=c!c;`j4c!{1XcHL;F?1upPd_kjD#8Z50XNAC zs1?G4phnCxPKVm;m;uwlcC_1DP2(7*!xK6k?4o=yhas>JLrJS{dO{E5h|gE=udB6| z5riJ*958Ogo$Q;ZRQuZm*_I z;ISywz`2d_uv2LOB%ce+U=F(Y|8*-JT!kIBBR+R;b}>ZAbT!?RYaBs1iw=hEE~iyT z5a9~7*Hh;-SybuLdVvezzHgmW)YVtcAT7YVT z7_e75t7uEeheJ`OA?Bipdf3iD80XN#UIDpj4vrf2aD@-CyZjM%pqe(Yj#9=ED=eH- zUL5nH1}}-RwghbLjwUn+?A4$MjO!2;%$bCY+JF^7oT#CUjYnesU^VTwAw<;d;oMdA zr7ffCqsP-)@9URFcE7-yOjgOwFjuskrGsiqTf z&;T@g+GUPdt*n(M>eZadS{Bqh5tWs7B&<#|zl@tcit7r-Q+m zJed*#N}z<4{8wF-CsS!5Wg*mSg7EhQ0YE_yi2SF4D2p)OK#&?|>k)9^1i5MH-Dwbu zdh;O>rAv?$X~hZg-@4j6F2nVQh93LH`SfFPytH2H#QqwdB;T z!?bv+{l&5G9Bm_3W(@n?D%Eib-F$fX+ATIv2FCJmMo*9q2g4Q(`BPJ;eAs81n`U>O ze|~<~t<(jZ6-F>v2*?tN{v(x2#OaH`Xu%#V9VQ*}F?sFn?Fq~26TjT|(;KPxzp0Ul zZ2fB{38Vn87)sf-d{0Kw)wstrF$cNvbE?aq*700xHfNZ5|HkH)&dbOO&pGecm$u)z zv@ES?-h*Ga@>ANHY7-Y93@U+dOq^SqI)3SU?Tf77oc_;CC!M#Ad{?B~ac$zhE$Zy} z&Ii$jSHH;G$MZ+e^XFJEf3hxVn)_n`{_k13$zW1X>Bc^-bT)=zA0rW@f;4?d)NMXP zBn=?@5qVOl{zRH0m$*`-c+vUBm36Yk>u<`;haXI4zH-B%+4H*;nd=+gzV39Md}-b0 zS;_C-`qU{kHsi*Y@M>h+uC_Z}HTUf8g9e{>zqaD6F=xxGvI_^cZN67C^xmYg&5`rt zemI(lIBfI-LBK4KB@iW7AWkZf@Spxn5~cNFQeH{+rZ+~sd^N?o>tsuQM@tnq z_>=zCllW4AM+~?sE+6{jTW-h9HLYhV_pjKK-#&2Ji9rWSy2iY^Xo@;fy=~Jd#fH-# zGSUeFXFj`53?{xY@n_83T@%u6L$)rv)Al+rzu2h%R}8%x-rCT*{tj4EZ(Z4VW_#Z0 zsqM#&!<$lh9+5ncuJ-b14E64e{z#r-_4PYL}JoWCS zA8oDq@*4bnzVyn-jkiB#7wh)yNc(2@&HRxcpIIe4c%XRe!f@r1BMW~J?r3O#>-RQL zvH$ZmlZ(pU?A-hQx{>R*-CnXJ`}WC}@k{Q$GH?IXv3IW@yR`f}g=32wkp0Bzi5&Sq zIQB$w>vzIP{3(DEgV4DjYZm{Cz4^*-?w0s#b{;9(aOF_;ku$kh7I?F*S51zKOBRjr zcVhoMeZ6z&sq1HQc(FP>fZ=wQL^jzvCn@f|S-I=O)vL4L5591ISaQ_;*DhF=MXoL< zuY{fKGT%q4jW2v&03}5TPqLZ(WdYPZlQQ<6sD1AxZ2>U+;k_h70`X)2yUmEesE0;I zDwM?^ib|jY8lWvy1E>m2e>5tE>>?mAD+{4b0EUBmzY diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/config.json b/multimedia/media/media_js_standard/audioEncoder/src/main/config.json deleted file mode 100644 index 89ce75b7d..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/config.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "app": { - "apiVersion": { - "compatible": 6, - "releaseType": "Beta1", - "target": 7 - }, - "vendor": "acts", - "bundleName": "ohos.acts.multimedia.audio.audioencoder", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - "default": { - "debug": true - } - }, - "module": { - "abilities": [ - { - "iconId": 16777218, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "descriptionId": 16777217, - "visible": true, - "labelId": 16777216, - "icon": "$media:icon", - "name": "ohos.acts.multimedia.audio.audioencoder.MainAbility", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "homeAbility": true, - "launchType": "standard" - } - ], - "deviceType": [ - "default", - "default", - "tablet", - "tv", - "wearable" - ], - "reqPermissions": [ - { - "name" : "ohos.permission.GRANT_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.GRANT_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.REVOKE_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.REVOKE_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.MEDIA_LOCATION", - "reason" : "use ohos.permission.MEDIA_LOCATION" - }, - { - "name" : "ohos.permission.READ_MEDIA", - "reason" : "use ohos.permission.READ_MEDIA" - }, - { - "name" : "ohos.permission.WRITE_MEDIA", - "reason" : "use ohos.permission.WRITE_MEDIA" - } - ], - "mainAbility": "ohos.acts.multimedia.audio.audioencoder.MainAbility", - "distro": { - "moduleType": "entry", - "installationFree": false, - "deliveryWithInstall": true, - "moduleName": "entry" - }, - "package": "ohos.acts.multimedia.audio.audioencoder", - "name": ".MyApplication", - "js": [ - { - "pages": [ - "pages/index/index" - ], - "name": "default", - "window": { - "designWidth": 720, - "autoDesignWidth": true - } - } - ] - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/app.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/app.js deleted file mode 100644 index 830070d19..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/app.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - } -}; diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/en-US.json b/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/en-US.json deleted file mode 100644 index e63c70d97..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "Hello", - "world": "World" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/zh-CN.json b/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index de6ee5748..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "您好", - "world": "世界" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.css b/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.css deleted file mode 100644 index 9f1321a1d..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.hml b/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.hml deleted file mode 100644 index 689212399..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,20 +0,0 @@ - - -
- - {{ $t('strings.hello') }} {{ title }} - -
diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.js deleted file mode 100644 index 67f8b8567..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - this.title = this.$t('strings.world'); - }, - onShow() { - console.info('onShow finish') - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - core.addService('expect', expectExtend) - core.init() - const configService = core.getDefaultService('config') - this.timeout = 60000 - configService.setConfig(this) - require('../../../test/List.test') - core.execute() - }, - onReady() { - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncCallbackTest.test.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncCallbackTest.test.js deleted file mode 100644 index bfc7580a4..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncCallbackTest.test.js +++ /dev/null @@ -1,826 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioEncoderFuncCallback', function () { - const AUDIOPATH = 'S16LE.pcm'; - let audioEncodeProcessor; - let readStreamSync; - let eosframenum = 0; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needGetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - const ES = [0, 4096]; - let ES_LENGTH = 1500; - let readpath; - let savepath; - let fdRead; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - let lockFlag = false; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - audioEncodeProcessor = null; - readStreamSync = undefined; - eosframenum = 0; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES_LENGTH = 1500; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioEncodeProcessor != null) { - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - audioEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - function resetParam() { - readStreamSync = undefined; - eosframenum = 0; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needrelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - function writeFile(path, buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - async function stopWork() { - audioEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info("case stop success") - }) - } - - async function resetWork() { - resetParam(); - audioEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info("case reset success"); - if (needrelease) { - audioEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info("case release success"); - audioEncodeProcessor = null; - }) - } - }) - } - - async function flushWork(done) { - lockFlag = true; - inputQueue = []; - outputQueue = []; - await getFdRead(readpath, done); - audioEncodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info("case flush at inputeos success"); - resetParam(); - workdoneAtEOS =true; - lockFlag = false; - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info("case start after flush success"); - }) - }) - } - - async function doneWork(done) { - audioEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info("case stop success"); - resetParam(); - audioEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - audioEncodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioEncodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - }) - }) - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1) { - console.info("EOS frame seperately") - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } - timestamp += 23; - frameCnt += 1; - if (!lockFlag) { - audioEncodeProcessor.pushInputData(inputobject, () => { - console.info('queueInput success'); - inputCnt += 1; - }) - } - } - } - - async function dequeueAllOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (stopAtEOS) { - await stopWork(); - } else if (resetAtEOS) { - await resetWork(); - } else if (flushAtEOS) { - await flushWork(done); - } else if (workdoneAtEOS) { - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await doneWork(done); - } else { - console.info("sawOutputEOS = true"); - } - } - else{ - console.info("write to file success"); - } - if (!lockFlag) { - audioEncodeProcessor.freeOutputBuffer(outputobject, () => { - console.info('release output success'); - }) - } - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioEncodeProcessor.on('needInputData', async(inBuffer) => { - console.info('case inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('case outputBufferAvailable'); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needGetMediaDes) { - audioEncodeProcessor.getOutputMediaDescription((err, MediaDescription) => { - expect(err).assertUndefined(); - console.info("case get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }); - } - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioEncodeProcessor.on('streamChanged',(format) => { - console.info('case Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0100 - * @tc.name : 000.test set EOS after last frame and reset - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0100', 0, async function (done) { - console.info("test set EOS after last frame and reset"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - let mediaDescription2 = { - "codec_mime": 'audio/mp4a-latm', - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_00.aac'; - await getFdRead(readpath, done); - needGetMediaDes = true; - workdoneAtEOS = true; - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, AudioCaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info(`AudioCaps: ` + AudioCaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.getMediaCapability((err, mediaCaps) => { - expect(err).assertUndefined(); - console.info(`case getMediaCapability 1`); - mediaCaps.getAudioEncoderCaps((err, audioCaps) => { - expect(err).assertUndefined(); - console.info('getAudioEncoderCaps success'); - if (typeof (audioCaps) != 'undefined') { - console.info("case audioCaps " + audioCaps); - } else { - console.info("case audioCaps is not defined"); - } - }) - mediaCaps.findAudioEncoder(mediaDescription2, (err, codecname) => { - expect(err).assertUndefined(); - console.info('findAudioEncoder success'); - if (typeof (codecname) != 'undefined') { - console.info("case codecname " + codecname); - } else { - console.info("case codecname is not defined"); - } - }) - }) - media.createAudioEncoderByName('avenc_aac', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder by mime 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0200 - * @tc.name : 001.test set EOS manually before last frame and reset - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0200', 0, async function (done) { - console.info("case test set EOS manually before last frame and reset"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_01.aac'; - await getFdRead(readpath, done); - eosframenum = 500; - workdoneAtEOS = true; - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioEncoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0300 - * @tc.name : 002.test flush at running state - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0300', 0, async function (done) { - console.info("case test flush at running state"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_02.aac'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start(async(err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - await sleep(500); - eventEmitter.emit('flush'); - }) - }); - eventEmitter.on('flush', () => { - lockFlag = true; - inputQueue = []; - outputQueue = []; - audioEncodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info(`case flush after 2s success`); - lockFlag = false; - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start after flush success`); - }) - }) - }); - media.createAudioEncoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0400 - * @tc.name : 003. test flush at EOS state - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0400', 0, async function (done) { - console.info("case test flush at EOS state"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_03.aac'; - await getFdRead(readpath, done); - eosframenum = 500; - flushAtEOS = true; - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - }) - }); - media.createAudioEncoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0500 - * @tc.name : 004.test stop at running state and reset - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0500', 0, async function (done) { - console.info("case test stop at running state and reset"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_04.aac'; - await getFdRead(readpath, done); - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - eventEmitter.emit('stop'); - }) - }); - eventEmitter.on('stop', () => { - sleep(5000).then(() => { - audioEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`case stop 1`); - eventEmitter.emit('reset'); - }) - }) - }); - eventEmitter.on('reset', () => { - resetParam(); - audioEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info(`case reset 1`); - eventEmitter.emit('release'); - }) - }); - eventEmitter.on('release', () => { - audioEncodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.info(`case release 1`); - audioEncodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - }); - media.createAudioEncoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0600 - * @tc.name : 005.test stop and restart - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0600', 0, async function (done) { - console.info("case test stop and restart"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_05.aac'; - await getFdRead(readpath, done); - eosframenum = 100; - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - eventEmitter.emit('stop'); - }) - }); - eventEmitter.on('stop', () => { - sleep(5000).then(() => { - audioEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`stop after 5s`); - resetParam(); - eventEmitter.emit('restart'); - }) - }) - }); - eventEmitter.on('restart', () => { - sleep(2000).then(async() => { - resetParam(); - await getFdRead(readpath, done); - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`restart after 2s`); - workdoneAtEOS = true; - enqueueAllInputs(inputQueue); - }) - }) - }); - media.createAudioEncoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0700 - * @tc.name : 006.test reconfigure for new file with the same format - * @tc.desc : basic Encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_CALLBACK_0700', 0, async function (done) { - console.info("case test reconfigure for new file with the same format"); - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_06.aac'; - await getFdRead(readpath, done); - eosframenum = 100; - resetAtEOS = true; - let mediaDescription2 = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - let hasreconfigured = false; - eventEmitter.on('getAudioEncoderCaps', () => { - audioEncodeProcessor.getAudioEncoderCaps((err, Audiocaps) => { - expect(err).assertUndefined(); - console.info(`case getAudioEncoderCaps 1`); - console.info("AudioCaps: " + Audiocaps); - eventEmitter.emit('configure', mediaDescription); - }) - }); - eventEmitter.on('configure', (mediaDescription) => { - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - setCallback(savepath, done); - eventEmitter.emit('start'); - }) - }); - eventEmitter.on('start', () => { - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - if (!hasreconfigured) { - eventEmitter.emit('reconfigure', mediaDescription2); - } - }) - }); - eventEmitter.on('reconfigure', (mediaDescription2) => { - sleep(10000).then(async() => { - resetParam(); - await fileio.close(fdRead); - audioEncodeProcessor.configure(mediaDescription2, async(err) => { - expect(err).assertUndefined(); - console.info(`case configure 2`); - resetParam(); - readpath = AUDIOPATH; - savepath = 'audioEncode_function_callback_06_2.aac'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - hasreconfigured = true; - eventEmitter.emit('prepare'); - }) - }) - }); - media.createAudioEncoderByMime('audio/mp4a-latm', (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - eventEmitter.emit('getAudioEncoderCaps'); - }) - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncPromiseTest.test.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncPromiseTest.test.js deleted file mode 100644 index 95fd3a3ab..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderFuncPromiseTest.test.js +++ /dev/null @@ -1,663 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioEncoderFuncPromise', function () { - const AUDIOPATH = 'S16LE.pcm'; - let audioEncodeProcessor; - let readStreamSync; - let eosframenum = 0; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needgetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - const ES = [0, 4096]; - let ES_LENGTH = 1500; - let readpath; - let savepath; - let fdRead; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - let lockFlag = false; - - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - audioEncodeProcessor = null; - readStreamSync = undefined; - eosframenum = 0; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needgetMediaDes = false; - needrelease = false - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES_LENGTH = 1500; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioEncodeProcessor != null) { - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - audioEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - readStreamSync = undefined; - eosframenum = 0; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needgetMediaDes = false; - needrelease = false - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - outputCnt = 0; - inputCnt = 0; - lockFlag = false; - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - function writeFile(path, buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - async function stopWork() { - await audioEncodeProcessor.stop().then(() => { - console.info("case stop success") - }, failCallback).catch(failCatch); - } - - async function resetWork() { - resetParam(); - await audioEncodeProcessor.reset().then(async() => { - console.info("case reset success"); - if (needrelease) { - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - }, failCallback).catch(failCatch); - } - - async function flushWork(done) { - lockFlag = true; - inputQueue = []; - outputQueue = []; - await getFdRead(readpath, done); - await audioEncodeProcessor.flush().then(() => { - console.info("case flush at inputeos success"); - resetParam(); - workdoneAtEOS =true; - lockFlag = false; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start after flush success"); - }, failCallback).catch(failCatch); - } - - async function doneWork() { - await audioEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now();Date.now() - t <= time;); - } - - async function enqueueInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - console.info("case frameCnt:" + frameCnt); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1) { - console.info("case EOS frame seperately") - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } - timestamp += 23; - frameCnt += 1; - if (!lockFlag) { - await audioEncodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - inputCnt += 1; - }); - } - } - } - - async function dequeueOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (stopAtEOS) { - await stopWork(); - } else if (resetAtEOS) { - await resetWork(); - } else if (flushAtEOS) { - await flushWork(done); - } else if (workdoneAtEOS) { - expect(outputCnt).assertClose(inputCnt, frameThreshold); - await doneWork(); - await fileio.close(fdRead); - done(); - } else { - console.info('sawOutputEOS = true'); - } - } - else{ - console.info("write to file success"); - } - if (!lockFlag) { - await audioEncodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }); - } - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioEncodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueInputs(inputQueue); - }); - audioEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - if (needgetMediaDes) { - audioEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needgetMediaDes=false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - await dequeueOutputs(outputQueue, savepath, done); - }); - audioEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0100 - * @tc.name : 000.test set EOS after last frame and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0100', 0, async function (done) { - console.info("case test set EOS after last frame and reset"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - let mediaDescription2 = { - "codec_mime": 'audio/mp4a-latm', - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_00.aac'; - await getFdRead(readpath, done); - needgetMediaDes = true; - workdoneAtEOS = true; - await media.getMediaCapability().then((mediaCaps) => { - console.info('getMediaCapability success'); - if (typeof (mediaCaps) != 'undefined') { - mediaCaps.getAudioEncoderCaps().then((audioCaps) => { - console.info('getAudioEncoderCaps success'); - if (typeof (audioCaps) != 'undefined') { - console.info("case audioCaps " + audioCaps); - } else { - console.info("case audioCaps is not defined"); - } - }, failCallback).catch(failCatch); - mediaCaps.findAudioEncoder(mediaDescription2).then((codecname) => { - console.info('getAudioEncoderCaps success'); - if (typeof (codecname) != 'undefined') { - console.info("case codecname " + codecname); - } else { - console.info("case codecname is not defined"); - } - }, failCallback).catch(failCatch); - } else { - console.info('mediaCaps is not defined'); - } - }, failCallback).catch(failCatch); - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps) - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success") - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0200 - * @tc.name : 001.test set EOS manually before last frame and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0200', 0, async function (done) { - console.info("case test set EOS manually before last frame and reset"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_01.aac'; - await getFdRead(readpath, done); - eosframenum = 500; - workdoneAtEOS = true; - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0300 - * @tc.name : 002.test flush at running state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0300', 0, async function (done) { - console.info("case test flush at running state"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_02.aac'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps) - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success") - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success") - }, failCallback).catch(failCatch); - await sleep(500).then(async() => { - lockFlag = true; - inputQueue = []; - outputQueue = []; - await audioEncodeProcessor.flush().then(() => { - console.info("case flush after 5s"); - lockFlag = false; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start after flush success"); - }, failCallback).catch(failCatch); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0400 - * @tc.name : 003.test flush at EOS state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0400', 0, async function (done) { - console.info("case test flush at EOS state"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_03.aac'; - await getFdRead(readpath, done); - eosframenum = 500; - flushAtEOS = true; - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0500 - * @tc.name : 004.test stop at running state and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0500', 0, async function (done) { - console.info("case test stop at running state and reset"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_04.aac'; - await getFdRead(readpath, done); - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(5000).then(() => { - audioEncodeProcessor.stop().then(() => { - console.info("stop after 5s success"); - }, failCallback).catch(failCatch);}); - resetParam(); - await audioEncodeProcessor.reset().then(() => { - console.info("reset success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - await fileio.close(fdRead); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0600 - * @tc.name : 005.test stop and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0600', 0, async function (done) { - console.info("case test stop and restart"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_05.aac'; - await getFdRead(readpath, done); - eosframenum = 100; - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await sleep(5000).then(() => { - console.info("stop encoding after 5s"); - }); - await audioEncodeProcessor.stop().then(() => { - console.info("case stop after 5s success"); - }, failCallback).catch(failCatch); - await sleep(2000).then(() => { - console.info("restart encoding after 2s"); - }); - resetParam(); - await getFdRead(readpath, done); - await audioEncodeProcessor.start().then(() => { - console.info("case restart after 3s success"); - workdoneAtEOS = true; - enqueueInputs(inputQueue); - }, failCallback).catch(failCatch); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0700 - * @tc.name : 006.test reconfigure for new file with the same format - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_FUNCTION_PROMISE_0700', 0, async function (done) { - console.info("case test reconfigure for new file with the same format"); - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_06.aac'; - await getFdRead(readpath, done); - eosframenum = 100; - resetAtEOS = true; - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - console.info("case create createAudioEncoder success"); - audioEncodeProcessor = processor; - }, failCallback).catch(failCatch); - await audioEncodeProcessor.getAudioEncoderCaps().then((AudioCaps) => { - console.info("case get AudioEncoderCaps success"); - console.info("print AudioCaps: " + AudioCaps); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - let mediaDescription2 = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - } - await sleep(10000).then(() => { - console.info("start configure 2"); - }); - resetParam(); - await fileio.close(fdRead); - await audioEncodeProcessor.configure(mediaDescription2).then(() => { - console.info("configure 2 success"); - resetParam(); - }, failCallback).catch(failCatch); - readpath = AUDIOPATH; - savepath = 'audioEncode_function_promise_06_2.aac'; - await getFdRead(readpath, done); - workdoneAtEOS = true; - setCallback(savepath, done); - await audioEncodeProcessor.prepare().then(() => { - console.info("prepare2 success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.start().then(() => { - console.info("start2 success"); - }, failCallback).catch(failCatch); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderMultiInstancesTest.test.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderMultiInstancesTest.test.js deleted file mode 100644 index ca290f527..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderMultiInstancesTest.test.js +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import Fileio from '@ohos.fileio' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioEncoderMultiInstances', function () { - const RESOURCEPATH = '/data/accounts/account_0/appdata/ohos.acts.multimedia.audio.audioencoder/' - const AUDIOPATH = RESOURCEPATH + 'S16LE.pcm'; - let readStreamSync; - let eosframenum = 0; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needgetMediaDes = false; - let needrelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - const ES = [0, 4096]; - let ES_LENGTH = 1500; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - readStreamSync = undefined; - eosframenum = 0; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needgetMediaDes = false; - needrelease = false - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES_LENGTH = 1500; - }) - - afterEach(function() { - console.info('afterEach case'); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - readStreamSync = undefined; - eosframenum = 0; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - workdoneAtEOS = false; - needgetMediaDes = false; - needrelease = false - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - } - - function writeHead(path, len) { - try{ - let writestream = Fileio.createStreamSync(path, "ab+"); - let head = new ArrayBuffer(7); - addADTStoPacket(head, len); - let num = writestream.writeSync(head, {length:7}); - writestream.flushSync(); - writestream.closeSync(); - } catch(e) { - console.info(e) - } - } - - function writeFile(path, buf, len) { - try{ - let writestream = Fileio.createStreamSync(path, "ab+"); - let num = writestream.writeSync(buf, {length:len}); - writestream.flushSync(); - writestream.closeSync(); - } catch(e) { - console.info(e); - } - } - - function readFile(path) { - try{ - console.info('filepath: ' + path); - readStreamSync = Fileio.createStreamSync(path, 'rb'); - } catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = readStreamSync.readSync(buf,{length:len}); - console.info('lengthreal: ' + lengthreal); - } - - function addADTStoPacket(head, len) { - let view = new Uint8Array(head); - console.info("start add ADTS to Packet"); - let packetLen = len + 7; // 7: head length - let profile = 2; // 2: AAC LC - let freqIdx = 4; // 4: 44100HZ - let chanCfg = 2; // 2: 2 channel - view[0] = 0xFF; - view[1] = 0xF9; - view[2] = ((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2); - view[3] = ((chanCfg & 3) << 6) + (packetLen >> 11); - view[4] = (packetLen & 0x7FF) >> 3; - view[5] = ((packetLen & 7) << 5) + 0x1F; - view[6] = 0xFC; - } - - async function stopWork(audioEncodeProcessor) { - await audioEncodeProcessor.stop().then(() => { - console.info("case stop success") - }, failCallback).catch(failCatch); - } - - async function resetWork(audioEncodeProcessor) { - resetParam(); - await audioEncodeProcessor.reset().then(async() => { - console.info("case reset success"); - if (needrelease) { - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - }, failCallback).catch(failCatch); - } - - async function flushWork(audioEncodeProcessor) { - inputQueue = []; - outputQueue = []; - await audioEncodeProcessor.flush().then(() => { - console.info("case flush at inputeos success"); - resetParam(); - readFile(AUDIOPATH); - workdoneAtEOS =true; - }, failCallback).catch(failCatch); - } - - async function doneWork(audioEncodeProcessor) { - await audioEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now();Date.now() - t <= time;); - } - - async function enqueueInputs(audioEncodeProcessor, queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - console.info("case frameCnt:" + frameCnt); - if (frameCnt == eosframenum || frameCnt == ES_LENGTH + 1) { - console.info("case EOS frame separately") - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES[1]; - getContent(inputobject.data, ES[1]); - inputobject.flags = 0; - } - timestamp += 23; - frameCnt += 1; - audioEncodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - }); - } - } - - async function dequeueOutputs(audioEncodeProcessor, queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (stopAtEOS) { - await stopWork(audioEncodeProcessor); - } else if (resetAtEOS) { - await resetWork(audioEncodeProcessor); - } else if (flushAtEOS) { - await flushWork(audioEncodeProcessor); - } else if (workdoneAtEOS) { - await doneWork(audioEncodeProcessor); - done(); - } else { - console.info('sawOutputEOS = true'); - } - } - else{ - writeFile(savepath, outputobject.data, outputobject.length); - console.info("write to file success"); - } - audioEncodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }); - } - } - - function setCallback(audioEncodeProcessor, savepath, done) { - console.info('case callback'); - audioEncodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueInputs(audioEncodeProcessor, inputQueue); - }); - audioEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - if (needgetMediaDes) { - audioEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needgetMediaDes=false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - await dequeueOutputs(audioEncodeProcessor, outputQueue, savepath, done); - }); - audioEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_MULTIINSTANCE_0100 - * @tc.name : 001.create multiple encoder2 - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_MULTIINSTANCE_0100', 0, async function (done) { - console.info("case test multiple encoder instances"); - let array = new Array(); - for (let i = 0; i < 2; i += 1) { - await media.createAudioEncoderByMime('audio/mp4a-latm').then((processor) => { - if (typeof(processor) != 'undefined') { - console.info("case create createAudioEncoder success: " + i); - array[i] = processor; - } else { - console.info("case create createAudioEncoder failed: " + i); - } - }, failCallback).catch(failCatch); - } - console.info('case has created multiple encoders'); - for (let j = 0; j < 2; j++) { - resetParam(); - await array[j].reset().then(() => { - console.info("reset encoder " + j); - }, failCallback).catch(failCatch); - await array[j].release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - array[j] = null; - } - done(); - }) -}) - - \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityCallbackTest.test.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityCallbackTest.test.js deleted file mode 100644 index e3fa8c2d5..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityCallbackTest.test.js +++ /dev/null @@ -1,1171 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioEncoderReliabilityCallback', function () { - const AUDIOPATH = 'S16LE.pcm'; - const BASIC_PATH = 'results/encode_reliability_callback_'; - const END = 0; - const CONFIGURE = 1; - const PREPARE = 2; - const START = 3; - const FLUSH = 4; - const STOP = 5; - const RESET = 6; - const HOLDON = 7; - const WAITFORALLOUTS = 8; - const CONFIGURE_ERROR = 9; - const PREPARE_ERROR = 10; - const START_ERROR = 11; - const FLUSH_ERROR = 12; - const STOP_ERROR = 13; - const JUDGE_EOS = 14; - const WAITTIME = 3000; - let audioEncodeProcessor; - let readStreamSync; - let EOSFrameNum = 0; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needGetMediaDes = false; - let needRelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - const ES_SIZE = [0, 4096]; - let ES_LENGTH = 200; - let mime = 'audio/mp4a-latm'; - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - }; - let fdRead; - let lockFlag = false; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - audioEncodeProcessor = null; - readStreamSync = undefined; - EOSFrameNum = 0; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needRelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES_LENGTH = 200; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioEncodeProcessor != null) { - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - function resetParam() { - readStreamSync = undefined; - EOSFrameNum = 0; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needRelease = false; - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - lockFlag = false; - } - - async function createAudioEncoder(savepath, mySteps, done) { - await getFdRead(AUDIOPATH, done); - media.createAudioEncoderByMime(mime, (err, processor) => { - expect(err).assertUndefined(); - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - setCallback(savepath, done); - console.info("case start api test"); - nextStep(mySteps, mediaDescription, done); - }) - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function doneWork(done) { - audioEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info("case stop success"); - resetParam(); - audioEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.log("case reset success"); - audioEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioEncodeProcessor = null; - done(); - }) - }) - }) - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function nextStep(mySteps, mediaDescription, done) { - console.info("case myStep[0]: " + mySteps[0]); - if (mySteps[0] == END) { - audioEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.log("case release success"); - audioEncodeProcessor = null; - done(); - }) - } - switch (mySteps[0]) { - case CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - audioEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info(`case prepare 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case START: - mySteps.shift(); - console.info(`case to start`); - if (sawOutputEOS) { - resetParam(); - await getFdRead(AUDIOPATH, done); - workdoneAtEOS = true; - enqueueAllInputs(inputQueue); - } - audioEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info(`case start 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case FLUSH: - mySteps.shift(); - console.info(`case to flush`); - lockFlag = true; - inputQueue = []; - outputQueue = []; - audioEncodeProcessor.flush(async(err) => { - expect(err).assertUndefined(); - console.info(`case flush 1`); - if (flushAtEOS) { - await getFdRead(AUDIOPATH, done); - resetParam(); - workdoneAtEOS = true; - flushAtEOS = false; - } - lockFlag = false; - nextStep(mySteps, mediaDescription, done); - }); - break; - case STOP: - mySteps.shift(); - console.info(`case to stop`); - audioEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`case stop 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case RESET: - mySteps.shift(); - console.info(`case to reset`); - resetParam(); - audioEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info(`case reset 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case HOLDON: - mySteps.shift(); - setTimeout(() =>{ - nextStep(mySteps, mediaDescription, done); - }, WAITTIME); - break; - case WAITFORALLOUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - case CONFIGURE_ERROR: - mySteps.shift(); - console.info(`case to configure`); - audioEncodeProcessor.configure(mediaDescription, (err) => { - expect(err != undefined).assertTrue(); - console.info(`case configure error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case PREPARE_ERROR: - mySteps.shift(); - console.info(`case to prepare`); - audioEncodeProcessor.prepare((err) => { - expect(err != undefined).assertTrue(); - console.info(`case prepare error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case START_ERROR: - mySteps.shift(); - console.info(`case to start`); - audioEncodeProcessor.start((err) => { - expect(err != undefined).assertTrue(); - console.info(`case start error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case FLUSH_ERROR: - mySteps.shift(); - console.info(`case to flush`); - audioEncodeProcessor.flush((err) => { - expect(err != undefined).assertTrue(); - console.info(`case flush error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case STOP_ERROR: - mySteps.shift(); - console.info(`case to stop`); - audioEncodeProcessor.stop((err) => { - expect(err != undefined).assertTrue(); - console.info(`case stop error 1`); - nextStep(mySteps, mediaDescription, done); - }); - break; - case JUDGE_EOS: - mySteps.shift(); - console.info(`case judge EOS state`); - expect(sawOutputEOS).assertTrue(); - nextStep(mySteps, mediaDescription, done); - break; - default: - break; - } - } - - async function enqueueAllInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - if (frameCnt == EOSFrameNum || frameCnt == ES_LENGTH + 1) { - console.info("EOS frame seperately") - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES_SIZE[1]; - getContent(inputobject.data, ES_SIZE[1]); - inputobject.flags = 0; - } - timestamp += 23; - frameCnt += 1; - audioEncodeProcessor.pushInputData(inputobject, () => { - console.info('queueInput success'); - }) - } - } - - async function dequeueAllOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (workdoneAtEOS) { - await doneWork(done); - } else { - console.info("sawOutputEOS = true"); - } - } - else{ - console.info("not last frame, continue"); - } - audioEncodeProcessor.freeOutputBuffer(outputobject, () => { - console.info('release output success'); - }) - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioEncodeProcessor.on('needInputData', async(inBuffer) => { - console.info('case inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueAllInputs(inputQueue); - }); - audioEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('case outputBufferAvailable'); - if (needGetMediaDes) { - audioEncodeProcessor.getOutputMediaDescription((err, MediaDescription) => { - expect(err).assertUndefined(); - console.info("case get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }); - } - outputQueue.push(outBuffer); - await dequeueAllOutputs(outputQueue, savepath, done); - }); - audioEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioEncodeProcessor.on('streamChanged',(format) => { - console.info('case Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0100 - * @tc.name : 001.create -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0100.es'; - let mySteps = new Array(CONFIGURE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0200.es'; - let mySteps = new Array(CONFIGURE, PREPARE, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0300 - * @tc.name : 003.start -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, CONFIGURE_ERROR, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0700.es'; - let mySteps = new Array(RESET, CONFIGURE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0800.es'; - let mySteps = new Array(CONFIGURE, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_CALLBACK_0900', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0900.es'; - let mySteps = new Array(CONFIGURE, RESET, CONFIGURE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0100.es'; - let mySteps = new Array(PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0200.es'; - let mySteps = new Array(CONFIGURE, PREPARE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, PREPARE_ERROR, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0100 - * @tc.name : 001.create -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0100.es'; - let mySteps = new Array(START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0200 - * @tc.name : 002.configure -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0200.es'; - let mySteps = new Array(CONFIGURE, START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0400 - * @tc.name : 004.start -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0500 - * @tc.name : 005.flush -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0600 - * @tc.name : 006.stop -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, START_ERROR, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0800 - * @tc.name : 008.reset -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0100 - * @tc.name : 001.create -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0100.es'; - let mySteps = new Array(FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0200.es'; - let mySteps = new Array(CONFIGURE, FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0400 - * @tc.name : 004.start -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, FLUSH, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0100 - * @tc.name : 001.create -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0100.es'; - let mySteps = new Array(STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0200.es'; - let mySteps = new Array(CONFIGURE, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0400 - * @tc.name : 004.start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, STOP, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0100 - * @tc.name : 001.create -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0100.es'; - let mySteps = new Array(RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0200.es'; - let mySteps = new Array(CONFIGURE, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0400 - * @tc.name : 004.start -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_CALLBACK_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0100.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, STOP, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0200.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, END); - EOSFrameNum = 2; - flushAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, CONFIGURE, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_CALLBACK_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, STOP, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityPromiseTest.test.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityPromiseTest.test.js deleted file mode 100644 index 3d2f5133f..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/AudioEncoderReliabilityPromiseTest.test.js +++ /dev/null @@ -1,1173 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('AudioEncoderReliabilityPromise', function () { - const AUDIOPATH = 'S16LE.pcm'; - const BASIC_PATH = 'results/encode_reliability_promise_'; - const END = 0; - const CONFIGURE = 1; - const PREPARE = 2; - const START = 3; - const FLUSH = 4; - const STOP = 5; - const RESET = 6; - const HOLDON = 7; - const WAITFORALLOUTS = 8; - const CONFIGURE_ERROR = 9; - const PREPARE_ERROR = 10; - const START_ERROR = 11; - const FLUSH_ERROR = 12; - const STOP_ERROR = 13; - const JUDGE_EOS = 14; - const WAITTIME = 3000; - let audioEncodeProcessor; - let readStreamSync; - let EOSFrameNum = 0; - let flushAtEOS = false; - let workdoneAtEOS = false; - let needGetMediaDes = false; - let needRelease = false; - let frameCnt = 1; - let timestamp = 0; - let sawInputEOS = false; - let sawOutputEOS = false; - let inputQueue = []; - let outputQueue = []; - const ES_SIZE = [0, 4096]; - let ES_LENGTH = 200; - let mime = 'audio/mp4a-latm'; - let mediaDescription = { - "channel_count": 2, - "sample_rate": 44100, - "audio_sample_format": 1, - }; - let expectError = false; - let fdRead; - let lockFlag = false; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - audioEncodeProcessor = null; - readStreamSync = undefined; - EOSFrameNum = 0; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needRelease = false - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - ES_LENGTH = 200; - expectError = false; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (audioEncodeProcessor != null) { - await audioEncodeProcessor.release().then(() => { - console.info('audioEncodeProcessor release success'); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCallbackTrue = function(err, mySteps, done) { - console.info('case callback err : ' + err); - expect(err != undefined).assertTrue(); - nextStep(mySteps, done); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - readStreamSync = undefined; - EOSFrameNum = 0; - flushAtEOS = false; - workdoneAtEOS = false; - needGetMediaDes = false; - needRelease = false - frameCnt = 1; - timestamp = 0; - sawInputEOS = false; - sawOutputEOS = false; - inputQueue = []; - outputQueue = []; - lockFlag = false; - } - - async function createAudioEncoder(savepath, mySteps, done) { - await getFdRead(AUDIOPATH, done); - media.createAudioEncoderByMime(mime).then((processor) => { - console.info(`case createAudioEncoder 1`); - audioEncodeProcessor = processor; - setCallback(savepath, done); - console.info("case start api test"); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('read file start execution'); - try{ - console.info('filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - async function doneWork() { - await audioEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - resetParam(); - await audioEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - audioEncodeProcessor = null; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now();Date.now() - t <= time;); - } - - async function nextStep(mySteps, done) { - console.info("case myStep[0]: " + mySteps[0]); - if (mySteps[0] == END) { - await audioEncodeProcessor.release().then(() => { - console.info("case release success"); - audioEncodeProcessor = null; - done(); - }, failCallback).catch(failCatch); - } - switch (mySteps[0]) { - case CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - await audioEncodeProcessor.prepare().then(() => { - console.info(`case prepare 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case START: - mySteps.shift(); - console.info(`case to start`); - if (sawOutputEOS) { - resetParam(); - await getFdRead(AUDIOPATH, done); - workdoneAtEOS = true; - enqueueInputs(inputQueue); - } - await audioEncodeProcessor.start().then(() => { - console.info(`case start 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case FLUSH: - mySteps.shift(); - console.info(`case to flush`); - lockFlag = true; - inputQueue = []; - outputQueue = []; - await audioEncodeProcessor.flush().then(async() => { - console.info(`case flush 1`); - if (flushAtEOS) { - await getFdRead(AUDIOPATH, done); - resetParam(); - workdoneAtEOS = true; - flushAtEOS = false; - } - lockFlag = false; - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case STOP: - mySteps.shift(); - console.info(`case to stop`); - await audioEncodeProcessor.stop().then(() => { - console.info(`case stop 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case RESET: - mySteps.shift(); - console.info(`case to reset`); - resetParam(); - await audioEncodeProcessor.reset().then(() => { - console.info(`case reset 1`); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - break; - case HOLDON: - mySteps.shift(); - setTimeout(() =>{ - nextStep(mySteps, done); - }, WAITTIME); - break; - case WAITFORALLOUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - case CONFIGURE_ERROR: - mySteps.shift(); - console.info(`case to configure 2`); - await audioEncodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case PREPARE_ERROR: - mySteps.shift(); - console.info(`case to prepare 2`); - await audioEncodeProcessor.prepare().then(() => { - console.info(`case prepare error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case START_ERROR: - mySteps.shift(); - console.info(`case to start 2`); - await audioEncodeProcessor.start().then(() => { - console.info(`case start error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case FLUSH_ERROR: - mySteps.shift(); - console.info(`case to flush 2`); - await audioEncodeProcessor.flush().then(() => { - console.info(`case flush error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case STOP_ERROR: - mySteps.shift(); - console.info(`case to stop 2`); - await audioEncodeProcessor.stop().then(() => { - console.info(`case stop error 1`); - expect(expectError).assertTrue(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - break; - case JUDGE_EOS: - mySteps.shift(); - console.info(`case judge EOS state`); - expect(sawOutputEOS).assertTrue(); - nextStep(mySteps, done); - break; - default: - break; - } - } - - async function enqueueInputs(queue) { - while (queue.length > 0 && !sawInputEOS) { - let inputobject = queue.shift(); - console.info("case frameCnt:" + frameCnt); - if (frameCnt == EOSFrameNum || frameCnt == ES_LENGTH + 1) { - console.info("case EOS frame seperately") - inputobject.flags = 1; - inputobject.timeMs = 0; - inputobject.length = 0; - sawInputEOS = true; - } else { - console.info("case read frame from file"); - inputobject.timeMs = timestamp; - inputobject.offset = 0; - inputobject.length = ES_SIZE[1]; - getContent(inputobject.data, ES_SIZE[1]); - inputobject.flags = 0; - } - timestamp += 23; - frameCnt += 1; - audioEncodeProcessor.pushInputData(inputobject).then(() => { - console.info('case queueInput success'); - }); - } - } - - async function dequeueOutputs(queue, savepath, done) { - while (queue.length > 0 && !sawOutputEOS) { - let outputobject = queue.shift(); - if (outputobject.flags == 1) { - sawOutputEOS = true; - if (workdoneAtEOS) { - await doneWork(); - done(); - } else { - console.info('sawOutputEOS = true'); - } - } - else{ - console.info("not last frame, continue"); - } - audioEncodeProcessor.freeOutputBuffer(outputobject).then(() => { - console.info('release output success'); - }); - } - } - - function setCallback(savepath, done) { - console.info('case callback'); - audioEncodeProcessor.on('needInputData', async(inBuffer) => { - console.info('inputBufferAvailable'); - inputQueue.push(inBuffer); - await enqueueInputs(inputQueue); - }); - audioEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - if (needGetMediaDes) { - audioEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes=false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - await dequeueOutputs(outputQueue, savepath, done); - }); - audioEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - audioEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0100 - * @tc.name : 001.create -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0100.es'; - let mySteps = new Array(CONFIGURE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0200.es'; - let mySteps = new Array(CONFIGURE, PREPARE, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0300 - * @tc.name : 003.start -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, CONFIGURE_ERROR, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0700.es'; - let mySteps = new Array(RESET, CONFIGURE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0800.es'; - let mySteps = new Array(CONFIGURE, CONFIGURE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_CONFIGURE_PROMISE_0900', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0900.es'; - let mySteps = new Array(CONFIGURE, RESET, CONFIGURE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0100.es'; - let mySteps = new Array(PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0200.es'; - let mySteps = new Array(CONFIGURE, PREPARE, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, PREPARE_ERROR, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_PREPARE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, PREPARE_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0100 - * @tc.name : 001.create -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0100.es'; - let mySteps = new Array(START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0200 - * @tc.name : 002.configure -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0200.es'; - let mySteps = new Array(CONFIGURE, START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0400 - * @tc.name : 004.start -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0500 - * @tc.name : 005.flush -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0600 - * @tc.name : 006.stop -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, START_ERROR, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0800 - * @tc.name : 008.reset -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_START_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, START_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0100 - * @tc.name : 001.create -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0100.es'; - let mySteps = new Array(FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0200.es'; - let mySteps = new Array(CONFIGURE, FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0400 - * @tc.name : 004.start -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, START, FLUSH, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP ,FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, FLUSH, START, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_FLUSH_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, FLUSH_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0100 - * @tc.name : 001.create -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0100.es'; - let mySteps = new Array(STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0200.es'; - let mySteps = new Array(CONFIGURE, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0400 - * @tc.name : 004.start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, STOP, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_STOP_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, STOP_ERROR, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0100 - * @tc.name : 001.create -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0100.es'; - let mySteps = new Array(RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0200.es'; - let mySteps = new Array(CONFIGURE, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0400 - * @tc.name : 004.start -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, FLUSH, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0600.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, STOP, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0700.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_RESET_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0800.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, RESET, RESET, END); - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0100.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, STOP, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0200.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, FLUSH, END); - EOSFrameNum = 2; - flushAtEOS = true; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0300.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, RESET, CONFIGURE, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0400.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_AUDIO_ENCODER_API_EOS_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0500.es'; - let mySteps = new Array(CONFIGURE, PREPARE, START, HOLDON, JUDGE_EOS, STOP, START, STOP, END); - EOSFrameNum = 2; - createAudioEncoder(savepath, mySteps, done); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/List.test.js deleted file mode 100644 index 45c9bbdb7..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/js/test/List.test.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -require('./AudioEncoderFuncCallbackTest.test.js') -require('./AudioEncoderFuncPromiseTest.test.js') -require('./AudioEncoderReliabilityCallbackTest.test.js') -require('./AudioEncoderReliabilityPromiseTest.test.js') -require('./AudioEncoderMultiInstancesTest.test.js') \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/element/string.json deleted file mode 100644 index 0bae6bd40..000000000 --- a/multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "entry_MainAbility", - "value": "entry_MainAbility" - }, - { - "name": "mainability_description", - "value": "JS_Empty Ability" - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/audioEncoder/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_BP_720_480_30_768000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_BP_720_480_30_2000000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_HP_352_288_30_3000000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_HP_640_480_30_3000000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_HP_720_480_25_3000000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_HP_720_480_30_3000000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_MP_720_480_30_64000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_MP_720_480_30_128000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_MP_720_480_30_192000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "./resource/media/es/H264_MP_720_480_30_384000.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/" - ] - }, - { - "type": "ShellKit", - "run-command": [ - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/", - "chmod 777 /data/app/el2/100/base/ohos.acts.multimedia.video.codecformat/haps/entry/files/*" - ], - "teardown-command":[ - ] - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/videoCodecFormat/signature/openharmony_sx.p7b deleted file mode 100644 index b4cabd60c32a22e68621381d77cd2a8801120077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmcgvX>b$g8MZDPV+1A!3@%_J4iiB3x3XkQPD8RQtuDNhB}=wtM9oTCU6yubY2}qg zIU*W2Kn$gsfE$jO%Ro8O;fQf(fRr{+2!SD?q(d>OLp?2&h7d?X!$7-hyI?c$qmvo* zLp$&Bef#YDKJW9*2U6n2>6x=y^ex|sc^Ulnl$Zo5agfjBL1K`Vp1H6^&m#mvJ`bcs zlO8AX+Eb#D!jx$EB1sbwjRh!D>ZUw|q#T;_$U)*^)**q4KoOA4k;LNx4{IubtjwiS z5mJSh{gam}JW`bcD5bcH08okC>m?v1n@u-IxW!Q-MBp)kb>NYR)Dwu&(SR#XbMG6- zpknm_k|umnob$4YO?W8a3DC`w@48vYCC)5HM~cN(a0FH%@b? zrQ8oebp}&`8nxOCT7w$4p?zK_i5U!PEU8w*F2V;h1_bsQP~5C8PHJEb@%bA44MB6I z#iD^3JB;bDggOZu5ud3VfgLuu!DME4uv!?@=g?GJEb~x?u5|0F<5fCsv#UlGCv0dP zhPZVwWJlEr%wj7+LaqkC-yMdUTx5f#MEeC7M#HFC$lWI2;z~TNJ%;qHZ z;E60$%eZxkh(o3YI9m&Y));cJ-|LpynHn2xLwxRm>KYKP(oV9!));~?CN&J(Tn@9^ zVu{o!yq*S!-XvEvf!Y#Sk0&5muoCg08Y-r>8tNdTHk>d!l2tkF{m{$5ihN@zy?NN6^CUtM5sDYOgYIU z9MS@%hIARDW;1OjEsY9BZ>|h!9EjXZ+mmL8k=@2k(NUB%CX7j4%wOyz`$hsaX`V7B z?1T+Wv~)_w{V8k9 zyw2|Fi@I)$7H^g6z(_7(6p!~Gp-{ljSOz9>_DJD4;h2x`>qmDcO&8CDMGwBM z7xSz`dnO2^0WTj)+q-&yX3EvPUq5X$a`P8Nmp}c$3!AbT?c4`9x3+bDfvoXd@qW{@ z^KMUTdg;Q4zuv?yX>SQ8KYuu)9KJbiL4|0_%HMS?GlMIdzpk9oZO!|Dr`~ma+QDs# z?8NSeu_e8K8+DN7kA~&X=>h(X>QSy5iUs(8VC!ar8U3xxe^%?P6h%KlB1jG?2a%}H ze2z$(K=xzuh-SYgOp^#)X+o^DyLoMcc=^U#V&ln&GpR4#aCqLLE@{@rrlU6;jtlcQ zY<)HL{rjIfgt}Fjt}U_-*|E3%Zdd(%TgQlz-R?Km{8=}8+w0=1M|NzzUqAN#jQmy6 z?t&L5Sz->ulClilSKAQqDj3BPC5I!92ng86P$u!x2QewPJbTNY2|w*kGw;37R(PPT zjv4v!(C!I*X~4q=OdV4Qef%A>Ywr3@mue5K*eJ;@=)A+rA`HyW-T6A4Lu{b-aJp z3Th5rUO%(6@^I&SCpP45+;L~citIZV+NP|yw{+p5+4=WwobFluz0|(V4e%l2^i+=g z9~^tCxD7dB1pYKY@Im;>Pn64lMc-Qbn|tN{`rW5WH(xuJedu+xaJPi##r{kqF~Qm<%Ry(Ltv`RYKNO<7)5 k_i*9F&1ZI|9X)$nC22jJJJm5PYZjvE`0TUd)pzv&1qC%%Z2$lO diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/config.json b/multimedia/media/media_js_standard/videoCodecFormat/src/main/config.json deleted file mode 100644 index ff7acc2a6..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/config.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "app": { - "apiVersion": { - "compatible": 6, - "releaseType": "Beta1", - "target": 7 - }, - "vendor": "acts", - "bundleName": "ohos.acts.multimedia.video.codecformat", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - "default": { - "debug": true - } - }, - "module": { - "abilities": [ - { - "iconId": 16777218, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "descriptionId": 16777217, - "visible": true, - "labelId": 16777216, - "icon": "$media:icon", - "name": "ohos.acts.multimedia.video.codecformat.MainAbility", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "homeAbility": true, - "launchType": "singleton" - } - ], - "deviceType": [ - "default", - "default", - "tablet", - "tv", - "wearable" - ], - "reqPermissions": [ - { - "name" : "ohos.permission.GRANT_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.GRANT_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.REVOKE_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.REVOKE_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.MEDIA_LOCATION", - "reason" : "use ohos.permission.MEDIA_LOCATION" - }, - { - "name" : "ohos.permission.READ_MEDIA", - "reason" : "use ohos.permission.READ_MEDIA" - }, - { - "name" : "ohos.permission.WRITE_MEDIA", - "reason" : "use ohos.permission.WRITE_MEDIA" - } - ], - "mainAbility": "ohos.acts.multimedia.video.codecformat.MainAbility", - "distro": { - "moduleType": "entry", - "installationFree": false, - "deliveryWithInstall": true, - "moduleName": "entry" - }, - "package": "ohos.acts.multimedia.video.codecformat", - "name": ".MyApplication", - "js": [ - { - "pages": [ - "pages/index/index", - "pages/display/display" - ], - "name": "default", - "window": { - "designWidth": 720, - "autoDesignWidth": true - } - } - ] - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/app.js b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/app.js deleted file mode 100644 index 830070d19..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/app.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - } -}; diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/en-US.json b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/en-US.json deleted file mode 100644 index e63c70d97..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "Hello", - "world": "World" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/zh-CN.json b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index de6ee5748..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "您好", - "world": "世界" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.css b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.css deleted file mode 100644 index c9195944a..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.hml b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.hml deleted file mode 100644 index 9e58ed9e3..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.hml +++ /dev/null @@ -1,26 +0,0 @@ - - -
- - {{ $t('strings.hello') }} {{ title }} - - - - -
diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.js b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.js deleted file mode 100644 index 5d5b9ac7e..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/display/display.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - console.info('onInit finish') - this.title = this.$t('strings.world'); - }, - onShow() { - }, - onReady() { - }, - LoadXcomponent() { - globalThis.value = this.$element('XcomponentId').getXComponentSurfaceId(); - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.css b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.css deleted file mode 100644 index c3517ad15..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.hml b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.hml deleted file mode 100644 index 8d0e2061b..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,20 +0,0 @@ - - -
- - {{ $t('strings.hello') }} {{ title }} - -
diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.js b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.js deleted file mode 100644 index cfb5ff123..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - console.info('onInit finish') - this.title = this.$t('strings.world'); - }, - onShow() { - console.info('onShow finish') - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - core.addService('expect', expectExtend) - core.init() - const configService = core.getDefaultService('config') - this.timeout = 60000 - configService.setConfig(this) - require('../../../test/List.test') - core.execute() - }, - onReady() { - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/List.test.js deleted file mode 100644 index 276ecf100..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/List.test.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -require('./VideoDecoderFormatPromiseTest.test.js') -require('./VideoEncoderFormatPromiseTest.test.js') diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoDecoderFormatPromiseTest.test.js b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoDecoderFormatPromiseTest.test.js deleted file mode 100644 index fc823a8c6..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoDecoderFormatPromiseTest.test.js +++ /dev/null @@ -1,812 +0,0 @@ -/* - * Copyright (C) 2021 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - - -describe('VideoDecoderFormatPromise', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let inputQueue = []; - let outputQueue = []; - let isCodecData = false; - let inputEosFlag = false; - let surfaceID = ''; - let fdRead; - let readPath; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - const H264_HP_720_480_30_3000000 = - [728, 40437, 1906, 332, 1686, 2982, 757, 418, 429, 4448, 843, 502, 589, 8593, 1479, 755, 958, 4426, - 655, 7936, 1266, 871, 699, 9715, 1126, 806, 578, 7895, 1272, 825, 821, 11842, 1417, 801, 685, - 8102, 1147, 673, 517, 8747, 1488, 708, 774, 11322, 1788, 893, 851, 11258, 1920, 804, 893, 10941, - 1932, 1020, 1003, 10665, 2159, 926, 869, 12877, 2336, 956, 1116, 11833, 2313, 1261, 1117, 11244, - 2288, 1330, 1147, 11050, 2409, 1170, 1089, 12664, 2214, 1148, 1021, 10131, 2078, 1165, 1116, 10119, - 2029, 1109, 951, 9146, 2022, 1011, 968, 12018, 2155, 1210, 934, 10460, 1928, 1034, 1024, 9221, 1798, - 1119, 907, 11673, 2070, 996, 918, 8907, 1823, 947, 892, 9064, 1924, 853, 845, 9037, 1939, 962, 947, - 13892, 1813, 1003, 1100, 15610, 2047, 1014, 997, 7361, 1624, 726, 806, 8081, 1849, 879, 889, 11001, - 1805, 1111, 874, 8621, 1997, 817, 837, 10759, 2090, 809, 915, 7513, 1896, 754, 817, 13041, 2318, - 1086, 922, 9502, 1856, 1016, 846, 8742, 1765, 942, 882, 11996, 2094, 992, 1066, 11028, 2131, 892, - 922, 10127, 2008, 820, 775, 10027, 2072, 864, 827, 13105, 2045, 894, 908, 10002, 2012, 999, 947, - 11283, 2198, 1027, 1073, 13148, 2021, 1157, 1045, 14008, 1921, 1265, 892, 11677, 2206, 1059, 910, - 11252, 2166, 959, 987, 10932, 2306, 1000, 1052, 15844, 2812, 1460, 1220, 14077, 2599, 1270, 987, - 13004, 2780, 1028, 1073, 17485, 3059, 1061, 1281, 12442, 2763, 1050, 1066, 13364, 2980, 1040, 1058, - 13577, 3145, 1031, 1207, 20744, 3196, 1181, 1251, 15036, 3198, 1350, 1256, 13803, 3182, 1381, 1328, - 55738, 13170, 3310, 1203, 1416, 18895, 4845, 1459, 1566, 16371, 4074, 1545, 1404, 19016, 3848, 1722, - 1369, 21951, 4223, 1509, 1773, 19066, 4667, 1400, 1488, 17942, 4359, 1391, 1355, 18426, 4791, 1455, - 1532, 20372, 4725, 1585, 1538, 18356, 4784, 1793, 1821, 14652, 4161, 1794, 1705, 9162, 3985, 1780, - 1679, 4662, 1990]; - const H264_HP_640_480_30_3000000 = - [743, 63936, 4460, 396, 10897, 1792, 679, 940, 11454, 1710, 737, 1290, 17241, 3312, 1680, 1693, 11061, - 2780, 1453, 1302, 23837, 2632, 1282, 2176, 35973, 6681, 2633, 3444, 42011, 8777, 3216, 6874, 38772, - 8060, 3365, 4494, 35185, 8901, 3273, 4695, 33756, 8701, 3823, 5087, 38271, 9178, 4816, 6756, 36184, - 9334, 4563, 4805, 36973, 11092, 5606, 6194, 33918, 10006, 4902, 6477, 40721, 13116, 5890, 6768, 36257, - 12561, 5395, 6879, 35119, 11022, 5688, 5774, 34217, 10554, 4757, 6331, 35387, 12323, 5931, 6045, - 32344, 10362, 5022, 5825, 30627, 9493, 4649, 5483, 35773, 11762, 4427, 6933, 27406, 7668, 3767, 4399, - 30636, 9420, 4498, 4063, 29005, 8269, 3835, 4091, 32397, 8079, 4030, 5067, 26621, 4409, 2476, 27101, - 6079, 2597, 2357, 26866, 5981, 2970, 2901, 35881, 5607, 3052, 3172, 38951, 6441, 2768, 3087, 24246, - 5105, 2088, 2370, 25463, 5952, 2535, 2549, 31704, 5851, 3275, 2586, 28264, 6431, 2721, 2539, 32251, - 7212, 2727, 2885, 24577, 6191, 2510, 2781, 38290, 7584, 3358, 2696, 30966, 6312, 3219, 2801, 28991, - 5771, 2989, 2694, 35444, 7185, 3387, 3446, 33693, 7236, 3138, 3150, 32460, 6919, 3148, 2821, 32533, - 7376, 3380, 3241, 38535, 7123, 3545, 3315, 32887, 7049, 3637, 3335, 35576, 7974, 3661, 3797, 38577, - 7304, 3990, 3766, 41779, 7278, 4270, 3254, 37088, 7838, 3935, 3301, 35575, 7863, 3274, 3685, 34905, - 8328, 3706, 3880, 44228, 9725, 4943, 4088, 41434, 8537, 4344, 3415, 38094, 8691, 3707, 3624, 46871, - 9739, 3740, 4382, 36805, 8894, 3364, 3489, 38708, 9526, 3923, 3833, 38738, 10251, 4035, 3970, 52101, - 9865, 4296, 4306, 41157, 10454, 4493, 4141, 37595, 10394, 4305, 4464, 104472, 35250, 8448, 3308, 4712, - 44980, 12853, 4810, 4576, 41299, 10986, 4550, 4010, 45272, 11350, 4848, 3869, 50554, 11692, 4471, 5039, - 46210, 12196, 4929, 4757, 43445, 11696, 4745, 4387, 43209, 12442, 4849, 4662, 46742, 12373, 5002, 4550, - 42787, 12206, 5258, 4955, 35329, 11197, 5068, 4761, 23276, 10832, 4967, 4683, 11847, 5721]; - const H264_HP_352_288_30_3000000 = - [742, 36497, 5278, 212, 6150, 5552, 8919, 12122, 5996, 15180, 2588, 475, 830, 19788, 5367, 931, 2712, - 22962, 5980, 1420, 3952, 28389, 7696, 4122, 5502, 29632, 10135, 6434, 7119, 30403, 12246, 7684, - 6269, 27573, 5078, 26781, 6530, 2991, 2204, 27175, 11539, 6180, 5660, 30117, 9143, 7689, 7241, - 30681, 11321, 6951, 7532, 29027, 11887, 6534, 6894, 28780, 12298, 4863, 6583, 30142, 12234, 6025, - 6773, 29164, 12888, 8220, 6745, 28869, 12614, 8579, 7127, 28191, 11547, 7938, 6810, 29429, 11982, - 5941, 6362, 27297, 10981, 8020, 6912, 26342, 11157, 7225, 5811, 25430, 10934, 5939, 6450, 27865, - 10635, 7425, 5724, 25732, 10184, 6180, 5200, 26895, 9935, 6148, 5004, 27885, 11012, 6118, 5283, - 26388, 9679, 5465, 4702, 25873, 8785, 4146, 3926, 25744, 8620, 4436, 4397, 22665, 4487, 28251, - 12077, 5772, 4643, 30974, 10517, 4675, 3716, 26544, 10492, 4079, 4453, 29068, 12315, 4539, 5448, - 27197, 10351, 4325, 5139, 27197, 11107, 4856, 5021, 27573, 11015, 5506, 3668, 31021, 11234, 4444, - 5128, 27541, 10158, 4461, 4812, 27553, 10129, 4572, 4739, 27503, 10766, 4444, 5549, 29377, 11983, - 6007, 6116, 29258, 11378, 6150, 5993, 29260, 11518, 6179, 5677, 28332, 11544, 6257, 6051, 30606, - 12887, 7401, 6438, 28131, 12275, 6542, 6759, 30492, 13558, 7399, 6868, 32975, 14744, 7528, 8233, - 29525, 12300, 6482, 7367, 29630, 12717, 7198, 6864, 28971, 12234, 7058, 7117, 32200, 13661, 7122, - 7684, 30213, 12982, 7067, 6718, 31374, 13440, 6318, 5720, 30542, 12722, 5390, 5823, 32150, 13747, - 5847, 4949, 30227, 13087, 4889, 6989, 31044, 13790, 6614, 7787, 31120, 14286, 7850, 8052, 34565, - 16446, 9818, 8794, 30881, 14559, 8200, 7963, 16479, 7882, 58919, 28702, 13492, 6564, 7880, 33011, - 14889, 8653, 8195, 32121, 13675, 7376, 6760, 32498, 14412, 7331, 7701, 34309, 14522, 8507, 8905, - 32786, 14655, 9382, 9863, 31939, 14323, 9314, 9444, 31232, 14584, 9551, 9587, 32446, 14877, 9517, - 9745, 31232, 15121, 9074, 8991, 28188, 14357, 8382, 8945, 21889, 14254, 8563, 8656, 14054, 9237]; - const H264_HP_720_480_25_3000000 = - [743, 60211, 13239, 2404, 721, 583, 15194, 3156, 698, 1305, 19512, 4168, 2265, 1964, 5082, 836, 23296, - 2413, 1066, 2395, 45168, 8091, 2133, 3059, 51275, 10454, 1989, 1667, 50231, 11000, 6240, 2852, - 31581, 6058, 5392, 1839, 50092, 8396, 1985, 8991, 33764, 5318, 1928, 26902, 5189, 2134, 47829, - 10578, 2229, 10068, 60009, 23327, 7081, 12297, 45044, 15151, 2740, 3803, 46563, 16209, 9797, 5845, - 44561, 8182, 12401, 2359, 45573, 12349, 2651, 9682, 43127, 15810, 5811, 9279, 43962, 14386, 2270, - 2632, 39471, 11830, 6869, 4661, 30940, 5559, 6094, 1824, 40202, 7871, 2183, 6841, 26306, 4385, 1941, - 32358, 10212, 3832, 5078, 38561, 14111, 4071, 2257, 42239, 16583, 2551, 3728, 49743, 16669, 7062, - 3694, 18227, 4029, 1618, 1600, 25356, 4526, 1801, 40613, 10173, 1883, 7923, 40666, 11985, 4629, 7445, - 46053, 13073, 1829, 2126, 42021, 11787, 8567, 4217, 32222, 6250, 5758, 2011, 48044, 9596, 2247, 10336, - 33612, 4829, 1979, 45756, 15151, 4731, 5700, 42536, 13382, 4085, 2116, 51106, 19127, 1966, 4540, 36989, - 11179, 5329, 4492, 28014, 4266, 2228, 1992, 30706, 4585, 1825, 45353, 9172, 2156, 7298, 32588, 5422, - 2087, 23603, 5832, 2136, 54917, 14394, 3006, 9240, 39316, 6710, 1825, 50371, 16490, 6229, 8822, 59214, - 21224, 6862, 2073, 32776, 1903, 52810, 17090, 6242, 9555, 52896, 21251, 6748, 2295, 62780, 28542, 2313, - 6233, 41294, 16753, 8849, 6811, 81209, 32379, 19115, 11043, 50019, 12939, 4210, 2401, 57348, 21554, - 9758, 9795, 56247, 20227, 7331, 4734, 63172, 28454, 2681, 10578, 51879, 15705, 10655, 8051, 41145, - 12054, 4073, 2301, 56660, 22137, 10170, 9181, 47945, 16788, 7329, 5933, 37066, 19820, 2623, 6587, - 12775, 7829, 74448]; - const H264_BP_720_480_10_3000000 = - [680, 126740, 23028, 17628, 34165, 50078, 53489, 50449, 51692, 51133, 49406, 61788, 57943, 19487, 39050, - 51366, 58590, 46431, 47553, 44008, 40903, 43186, 46840, 41363, 38577, 36246, 47333, 37886, 36028, - 32547, 34046, 42447, 29904, 31922, 32428, 33792, 35887, 29424, 29191, 32212, 28429, 39255, 26639, - 46125, 29321, 25941, 36184, 29629, 31368, 32575, 27336, 42706, 33502, 29499, 31225, 30249, 40616, - 34124, 35283, 33528, 36250, 38209, 35903, 34273, 38720, 39956, 47535, 38312, 38075, 34822, 38343, - 51007, 38141, 40807, 41597, 42305, 48904, 38583, 42058, 41818, 43584, 53600, 45287, 41925, 84667, - 43272, 50947, 51329, 42615, 55263, 44633, 59839, 48709, 52740, 44754, 51337, 47877, 49915, 40111, - 37680, 25386]; - const H264_BP_720_480_30_2000000 = - [680, 49724, 1285, 1261, 1708, 1747, 2620, 2662, 1490, 1779, 2361, 3189, 4068, 2004, 906, 3253, 5253, - 4275, 5281, 6861, 8592, 7656, 10797, 9571, 11650, 15580, 7380, 12554, 7993, 8004, 12172, 17409, - 8588, 7552, 12740, 9769, 9501, 5744, 6334, 8456, 7815, 9238, 9193, 7411, 9530, 8489, 13051, 8510, - 9198, 11093, 10317, 6356, 12730, 9230, 11289, 8106, 10540, 8782, 10877, 7584, 10706, 13111, 10250, - 10543, 13859, 6702, 9674, 9418, 11851, 7675, 10324, 8274, 10460, 6414, 11198, 7486, 14728, 7472, - 8481, 8262, 9580, 7510, 9418, 8441, 9051, 8178, 8906, 7224, 9435, 7386, 8289, 14392, 8568, 5416, - 7530, 6513, 10988, 7935, 6047, 6952, 9597, 7051, 6756, 6254, 9586, 6145, 12074, 6462, 7193, 5281, - 9665, 6277, 8296, 5740, 8345, 5904, 9326, 6029, 7547, 5725, 8113, 16515, 6141, 4945, 7807, 4278, - 20449, 5011, 5539, 6759, 6707, 6500, 6322, 6935, 7172, 6970, 11064, 6268, 6409, 7461, 6162, 7159, - 7184, 7211, 6803, 8987, 9551, 7912, 5032, 8016, 5218, 16041, 7563, 8061, 6689, 8839, 7014, 8217, - 6664, 8307, 6154, 8126, 5474, 6795, 6740, 8027, 11368, 8868, 6207, 8343, 9793, 9689, 5711, 9753, - 6156, 9720, 6010, 9767, 6680, 8312, 6426, 15208, 6078, 8184, 7522, 9259, 6684, 8617, 7536, 9989, - 8981, 7948, 10001, 12890, 7360, 6745, 15933, 7280, 7910, 9347, 7600, 9639, 9134, 6721, 9088, 8114, - 9831, 7774, 8513, 8648, 9059, 15029, 10979, 8706, 10016, 7460, 10915, 12219, 9660, 7793, 11334, 8018, - 11665, 7278, 11586, 9058, 16880, 7223, 9440, 9107, 11077, 9344, 9383, 8555, 11157, 8415, 9976, 9098, - 11488, 9006, 10534, 22505, 8890, 9126, 11692, 9655, 11609, 8359, 10764, 9269, 10429, 72196, 5123, 7357, - 12030, 9882, 17039, 7044, 13383, 9575, 12643, 8266, 12365, 8596, 11837, 14485, 10228, 9531, 11412, - 8195, 11795, 17081, 13839, 8466, 14967, 11254, 12838, 8544, 14473, 9963, 13612, 8580, 14640, 10393, - 12139, 8665, 18055, 8449, 11454, 7941, 13955, 10724, 10074, 8741, 9950, 9508, 7961, 6732, 6925, 6344, - 4010, 4664]; - const H264_BP_720_480_30_768000 = - [679, 24012, 438, 391, 520, 539, 689, 718, 475, 533, 657, 898, 1072, 668, 423, 514, 712, 879, 1250, 1706, - 2620, 2480, 3922, 3336, 4092, 5666, 2934, 4643, 3587, 3285, 5005, 5732, 3112, 2701, 4596, 3333, 3211, - 2030, 2159, 2591, 2459, 2981, 3000, 2343, 2940, 2811, 4875, 2882, 3460, 4231, 3988, 2636, 4753, 3482, - 4578, 3051, 4091, 3497, 4109, 2987, 4145, 4737, 4048, 3943, 5325, 2591, 3631, 3377, 4414, 3076, 4151, - 3234, 3676, 2499, 4222, 2547, 5258, 2929, 3159, 3028, 3700, 2979, 3456, 3219, 3348, 3151, 3539, 2753, - 3511, 3010, 3211, 5316, 3637, 2234, 2955, 2566, 4239, 3261, 2364, 2795, 3936, 2919, 2699, 2625, 3824, - 2281, 4868, 2599, 2993, 2087, 4001, 2523, 3360, 2197, 3408, 2272, 3739, 2423, 2871, 2269, 3023, 6413, - 2863, 1839, 2812, 1853, 8341, 2240, 2453, 2606, 2736, 2536, 2576, 2686, 2664, 2588, 3946, 2681, 2467, - 2654, 2463, 2734, 2822, 2656, 2618, 3509, 3668, 2991, 1972, 3093, 1996, 5495, 3447, 3320, 2681, 3466, - 2565, 3449, 2516, 3108, 2191, 3335, 2203, 2608, 2370, 2967, 4195, 3429, 2405, 3295, 3669, 3909, 2189, - 3790, 2563, 3711, 2355, 3885, 2493, 3004, 2375, 5746, 2367, 3156, 2912, 3823, 2519, 3251, 2768, 4080, - 3354, 2974, 3500, 5067, 2947, 2663, 5328, 3321, 3001, 3663, 2865, 3783, 3525, 2530, 3536, 3129, 4080, - 2906, 3327, 3325, 3463, 5093, 4389, 3257, 3975, 2801, 4020, 4622, 3750, 2885, 4318, 2920, 4509, 2675, - 4512, 3333, 6607, 2841, 3760, 3454, 4273, 3588, 3777, 3264, 4352, 3100, 3978, 3449, 4367, 3266, 3707, - 8386, 3680, 3443, 4691, 3708, 4481, 2777, 3951, 3540, 3899, 42203, 1407, 3017, 4043, 2997, 5491, 2550, - 4857, 3142, 4463, 3081, 4083, 2731, 3937, 4763, 3590, 3293, 3972, 2917, 3971, 5633, 4970, 3350, 5260, - 3999, 4581, 3386, 4779, 3462, 4743, 3379, 5042, 3641, 4177, 3326, 6202, 3249, 4218, 2917, 4868, 3915, - 3813, 3443, 3700, 3353, 3119, 2587, 2638, 2157, 1606, 1572]; - const H264_MP_720_480_30_384000 = - [739, 13489, 299, 105, 269, 439, 288, 164, 157, 579, 305, 190, 212, 393, 311, 239, 213, 322, 147, 689, - 308, 186, 185, 2657, 331, 294, 260, 4683, 342, 257, 339, 5843, 412, 351, 327, 3954, 480, 427, 321, - 3595, 662, 445, 432, 3926, 653, 520, 416, 2951, 461, 5036, 850, 503, 523, 4673, 903, 559, 501, 4882, - 977, 522, 581, 6158, 1129, 634, 617, 4693, 933, 598, 617, 4478, 944, 571, 609, 5104, 926, 520, 546, - 3934, 941, 533, 559, 4243, 905, 575, 580, 4085, 916, 518, 508, 5300, 908, 513, 563, 4076, 874, 484, - 469, 4152, 890, 467, 494, 3842, 861, 465, 504, 3748, 776, 469, 455, 2958, 432, 4066, 770, 454, 422, - 4137, 816, 495, 446, 5667, 814, 525, 506, 6038, 888, 532, 448, 3501, 782, 472, 438, 3709, 901, 484, - 470, 4257, 849, 552, 450, 3888, 928, 499, 457, 4742, 899, 506, 433, 3498, 876, 441, 422, 5571, 963, - 541, 453, 4315, 831, 547, 426, 4093, 773, 525, 470, 4960, 852, 515, 446, 4933, 940, 511, 476, 4483, - 890, 474, 478, 4539, 900, 507, 488, 5386, 878, 498, 483, 4650, 879, 531, 467, 5244, 961, 520, 508, - 5511, 882, 611, 541, 5619, 829, 624, 528, 5490, 949, 553, 503, 5009, 954, 545, 541, 4856, 978, 568, - 553, 6329, 1067, 663, 577, 5621, 969, 621, 503, 5643, 1093, 576, 547, 7022, 1170, 589, 578, 5031, - 1084, 599, 541, 5343, 1149, 624, 606, 5230, 1209, 597, 604, 3500, 621, 6934, 1569, 650, 641, 5236, - 1282, 656, 622, 3793, 602, 32774, 3475, 1077, 577, 696, 5238, 1493, 680, 658, 4734, 1343, 738, 638, - 4983, 1273, 680, 621, 5450, 1210, 658, 642, 5555, 1345, 669, 658, 4918, 1322, 692, 632, 5199, 1396, - 686, 600, 5294, 1266, 701, 621, 5074, 1477, 728, 656, 4218, 1260, 720, 641, 2575, 1265, 652, 650, - 1203, 719]; - const H264_MP_720_480_30_192000 = - [739, 6283, 234, 71, 152, 264, 151, 111, 110, 301, 173, 121, 116, 208, 152, 111, 142, 183, 100, 348, 170, - 89, 88, 868, 203, 169, 189, 1798, 203, 183, 179, 2721, 251, 183, 218, 2212, 307, 297, 250, 1943, 371, - 335, 291, 1670, 421, 354, 282, 1345, 304, 2140, 458, 364, 300, 1976, 494, 400, 292, 2106, 542, 381, - 375, 2702, 553, 459, 370, 2166, 518, 404, 412, 2091, 530, 391, 371, 2260, 537, 335, 319, 1798, 537, - 357, 348, 1907, 521, 439, 350, 1892, 555, 407, 338, 2320, 489, 364, 351, 1880, 488, 350, 320, 1905, - 520, 306, 300, 1740, 501, 326, 317, 1583, 462, 340, 282, 1318, 308, 1920, 443, 310, 273, 1914, 467, - 306, 291, 2271, 430, 312, 282, 2332, 467, 314, 255, 1634, 499, 287, 247, 1802, 491, 304, 281, 1856, - 506, 327, 282, 1855, 523, 341, 279, 2064, 481, 345, 293, 1590, 499, 287, 279, 2466, 542, 346, 274, - 1990, 487, 345, 239, 1739, 471, 308, 272, 2023, 480, 322, 262, 2145, 480, 327, 304, 2069, 505, 333, - 308, 2114, 598, 336, 288, 2224, 506, 370, 313, 2117, 487, 360, 296, 2271, 503, 362, 333, 2393, 569, - 359, 316, 2509, 470, 384, 315, 2321, 541, 379, 337, 2269, 514, 376, 319, 2170, 573, 373, 361, 2700, - 632, 456, 369, 2516, 527, 398, 325, 2546, 551, 392, 351, 2956, 614, 383, 345, 2256, 582, 365, 327, - 2359, 597, 408, 368, 2327, 632, 394, 339, 1651, 343, 2955, 651, 462, 391, 2324, 646, 450, 360, 1619, - 392, 18036, 1446, 540, 366, 434, 2109, 757, 454, 421, 2099, 773, 429, 362, 1903, 659, 437, 368, 2238, - 682, 395, 385, 2287, 698, 430, 376, 2023, 696, 405, 365, 2033, 686, 441, 363, 2042, 670, 431, 373, - 2239, 731, 404, 392, 1888, 682, 417, 395, 1345, 644, 409, 392, 648, 398]; - const H264_MP_720_480_30_128000 = - [739, 3759, 141, 53, 88, 193, 97, 97, 42, 217, 120, 53, 85, 156, 159, 103, 62, 137, 48, 274, 143, 81, 103, - 541, 144, 141, 132, 1026, 160, 110, 134, 1746, 170, 164, 172, 1435, 221, 244, 181, 1335, 273, 267, - 186, 1060, 315, 312, 221, 897, 263, 1298, 379, 280, 219, 1171, 356, 302, 200, 1365, 404, 309, 258, - 1666, 442, 343, 276, 1393, 418, 274, 256, 1342, 424, 278, 267, 1291, 383, 288, 225, 1197, 408, 262, - 270, 1205, 413, 309, 275, 1269, 417, 286, 263, 1378, 359, 291, 243, 1224, 350, 253, 208, 1243, 354, - 244, 226, 1263, 402, 233, 223, 988, 318, 232, 169, 893, 216, 1158, 324, 221, 172, 1255, 303, 219, 192, - 1415, 285, 232, 194, 1363, 312, 241, 162, 1066, 345, 211, 182, 1094, 373, 215, 198, 1231, 353, 238, - 206, 1286, 363, 227, 221, 1322, 335, 265, 209, 944, 309, 200, 199, 1369, 318, 278, 191, 1210, 297, 234, - 161, 1202, 298, 201, 184, 1255, 334, 251, 223, 1444, 371, 235, 249, 1261, 359, 256, 233, 1399, 384, - 241, 237, 1287, 371, 260, 261, 1302, 346, 261, 232, 1366, 406, 274, 231, 1487, 396, 287, 235, 1387, - 331, 277, 224, 1460, 353, 283, 221, 1298, 365, 262, 257, 1342, 408, 289, 247, 1510, 440, 331, 258, - 1493, 371, 296, 256, 1517, 390, 286, 252, 1758, 393, 297, 230, 1411, 412, 264, 224, 1453, 437, 313, - 299, 1524, 430, 287, 269, 1064, 261, 1805, 455, 325, 296, 1403, 451, 312, 269, 1026, 284, 11888, 975, - 392, 270, 325, 1332, 482, 328, 301, 1248, 506, 298, 259, 1227, 445, 292, 264, 1289, 466, 330, 278, - 1391, 419, 322, 289, 1275, 468, 321, 320, 1283, 505, 335, 300, 1281, 452, 336, 296, 1335, 517, 350, - 314, 1139, 480, 317, 287, 882, 495, 316, 307, 495, 340]; - const H264_MP_720_480_30_64000 = - [738, 1462, 127, 49, 40, 128, 71, 40, 27, 138, 46, 25, 30, 166, 67, 38, 30, 130, 30, 166, 61, 31, 36, 201, - 100, 35, 38, 308, 113, 76, 58, 456, 150, 107, 117, 606, 190, 138, 123, 724, 222, 180, 121, 637, 273, - 168, 159, 493, 138, 585, 215, 190, 151, 567, 168, 202, 156, 586, 259, 186, 171, 645, 283, 202, 181, - 660, 279, 196, 148, 646, 290, 165, 161, 621, 251, 177, 151, 563, 254, 171, 128, 579, 246, 150, 123, - 543, 207, 144, 132, 599, 226, 130, 106, 534, 183, 118, 103, 604, 198, 109, 81, 664, 185, 117, 74, 480, - 179, 118, 43, 407, 114, 535, 171, 95, 61, 565, 155, 80, 54, 620, 152, 88, 71, 651, 151, 124, 62, 585, - 162, 74, 50, 561, 161, 107, 73, 625, 185, 131, 74, 633, 151, 117, 45, 594, 178, 135, 60, 525, 158, 108, - 65, 716, 184, 118, 49, 630, 147, 103, 50, 531, 146, 82, 63, 588, 207, 132, 59, 660, 201, 104, 79, 617, - 226, 130, 126, 614, 215, 97, 102, 656, 184, 131, 105, 646, 233, 133, 110, 633, 209, 141, 95, 684, 196, - 152, 100, 683, 180, 118, 107, 655, 201, 137, 69, 546, 204, 135, 83, 687, 183, 146, 75, 692, 225, 179, - 84, 686, 216, 133, 123, 651, 224, 161, 121, 791, 203, 149, 113, 618, 202, 136, 121, 608, 231, 153, 127, - 656, 264, 161, 120, 528, 159, 763, 275, 173, 110, 686, 257, 180, 123, 486, 158, 5082, 460, 219, 173, - 160, 626, 252, 169, 153, 624, 220, 174, 135, 636, 243, 153, 151, 659, 288, 168, 147, 657, 293, 179, 152, - 650, 270, 174, 134, 649, 286, 178, 173, 609, 269, 192, 149, 635, 274, 177, 146, 570, 293, 173, 132, 513, - 259, 172, 131, 306, 167]; - - beforeAll(async function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = false; - inputEosFlag = false; - surfaceID = globalThis.value; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear(); - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - console.info("case start get content length is: " + len); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf,{length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(){ - console.info('in case: enqueueInputs in'); - while (inputQueue.length > 0 && !inputEosFlag) { - let inputObject = inputQueue.shift(); - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case: pushInputData success '); - }, failCallback).catch(failCatch); - } - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep){ - console.log('outputQueue.length:' + outputQueue.length); - while (outputQueue.length > 0){ - let outputObject = outputQueue.shift(); - if (outputObject.flags == 1) { - nextStep(); - return; - } - frameCountOut++; - await videoDecodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.log('in case: release output count:' + frameCountOut); - }, failCallback).catch(failCatch); - } - } - - async function toGetVideoDecoderCaps() { - await videoDecodeProcessor.getVideoDecoderCaps().then((videoCaps) => { - console.info("case get getVideoDecoderCaps success"); - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - }, failCallback).catch(failCatch); - } - - function setCallback(nextStep){ - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: needInputData inBuffer.index: '+ inBuffer.index); - inputQueue.push(inBuffer); - await enqueueInputs(); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: newOutputData outBuffer.index: '+ outBuffer.index); - outputQueue.push(outBuffer); - await dequeueOutputs(nextStep); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - console.info('in case: setCallback out'); - } - - eventEmitter.on('nextStep', async (done) => { - console.info('in case : nextStep success'); - await videoDecodeProcessor.stop().then(() => { - console.info('in case : stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('in case : reset success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.release().then(() => { - console.info('in case : release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - console.info('in case : done'); - done(); - }); - - function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info("AudioEncoder config is " + item + ":" + property); - } - } - - async function decoderSource(config, name, srcPath, done){ - let mediaDescription = config; - console.info('start test case'); - readPath = srcPath; - await getFdRead(readPath, done); - await media.createVideoDecoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByName success'); - } else { - console.info('in case : createVideoDecoderByName fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - - await toGetVideoDecoderCaps(); - - await videoDecodeProcessor.configure(mediaDescription).then(() =>{ - console.info('in case : configure success'); - }, failCallback).catch(failCatch); - - await videoDecodeProcessor.setOutputSurface(surfaceID, true).then(() => { - console.info('in case : setOutputSurface success. surfaceID ' + surfaceID); - }, failCallback).catch(failCatch); - - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - - await videoDecodeProcessor.prepare().then(() => { - console.info('in case : prepare success'); - }, failCallback).catch(failCatch); - - await videoDecodeProcessor.start().then(() => { - console.info('in case : start success'); - }, failCallback).catch(failCatch); - - await videoDecodeProcessor.getOutputMediaDescription().then((mediaDescription) => { - console.info("getOutputMediaDescription success"); - printfDescription(mediaDescription); - },failCallback).catch(failCatch); - - videoDecodeProcessor.on('error',(err) => { - console.info(`case error called,errName is ${err.name}`); - console.info(`case error called,errCode is ${err.code}`); - console.info(`case error called,errMessage is ${err.message}`); - expect().assertFail(); - done(); - }); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0100 - * @tc.name : 001.test h264 format-HP-resolution 720*480-frame rate 30FPS-bitrate 3000000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0100', 0, async function (done) { - console.info("case test h264 format-HP-resolution 720*480-frame rate 30FPS-bitrate 3000000bps"); - ES_FRAME_SIZE = H264_HP_720_480_30_3000000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_HP_720_480_30_3000000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 4, - "bitrate" : 3000000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0200 - * @tc.name : 001.test h264 format-HP-resolution 640*480-frame rate 30FPS-bitrate 3000000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0200', 0, async function (done) { - console.info("case test h264 format-HP-resolution 640*480-frame rate 30FPS-bitrate 3000000bps"); - ES_FRAME_SIZE = H264_HP_640_480_30_3000000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_HP_640_480_30_3000000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 640, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 4, - "bitrate" : 3000000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0300 - * @tc.name : 001.test h264 format-HP-resolution 352*288-frame rate 30FPS-bitrate 3000000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0300', 0, async function (done) { - console.info("case test h264 format-HP-resolution 352*288-frame rate 30FPS-bitrate 3000000bps"); - ES_FRAME_SIZE = H264_HP_352_288_30_3000000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_HP_352_288_30_3000000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 352, - "height": 288, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 4, - "bitrate" : 3000000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0400 - * @tc.name : 001.test h264 format-HP-resolution 720*480-frame rate 25FPS-bitrate 3000000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0400', 0, async function (done) { - console.info("case test h264 format-HP-resolution 720*480-frame rate 25FPS-bitrate 3000000bps"); - ES_FRAME_SIZE = H264_HP_720_480_25_3000000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_HP_720_480_25_3000000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 25.00, - "max_input_size": 150000, - "codec_profile" : 4, - "bitrate" : 3000000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0500 - * @tc.name : 001.test h264 format-BP-resolution 720*480-frame rate 10FPS-bitrate 3000000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0500', 0, async function (done) { - console.info("case test h264 format-BP-resolution 720*480-frame rate 10FPS-bitrate 3000000bps"); - ES_FRAME_SIZE = H264_BP_720_480_10_3000000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_BP_720_480_10_3000000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 10.00, - "max_input_size": 150000, - "codec_profile" : 0, - "bitrate" : 3000000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0600 - * @tc.name : 001.test h264 format-BP-resolution 720*480-frame rate 30FPS-bitrate 2000000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0600', 0, async function (done) { - console.info("case test h264 format-BP-resolution 720*480-frame rate 30FPS-bitrate 2000000bps"); - ES_FRAME_SIZE = H264_BP_720_480_30_2000000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_BP_720_480_30_2000000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 0, - "bitrate" : 2000000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0700 - * @tc.name : 001.test h264 format-BP-resolution 720*480-frame rate 30FPS-bitrate 768000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0700', 0, async function (done) { - console.info("case test h264 format-BP-resolution 720*480-frame rate 30FPS-bitrate 768000bps"); - ES_FRAME_SIZE = H264_BP_720_480_30_768000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_BP_720_480_30_768000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 0, - "bitrate" : 768000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0800 - * @tc.name : 001.test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 384000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0800', 0, async function (done) { - console.info("case test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 384000bps"); - ES_FRAME_SIZE = H264_MP_720_480_30_384000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_MP_720_480_30_384000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 8, - "bitrate" : 384000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0900 - * @tc.name : 001.test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 192000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_0900', 0, async function (done) { - console.info("case test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 192000bps"); - ES_FRAME_SIZE = H264_MP_720_480_30_192000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_MP_720_480_30_192000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 8, - "bitrate" : 192000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_1000 - * @tc.name : 001.test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 128000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_1000', 0, async function (done) { - console.info("case test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 128000bps"); - ES_FRAME_SIZE = H264_MP_720_480_30_128000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_MP_720_480_30_128000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 8, - "bitrate" : 128000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_1100 - * @tc.name : 001.test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 64000bps - * @tc.desc : video decoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_SOFTWARE_FORMAT_H264_PROMISE_1100', 0, async function (done) { - console.info("case test h264 format-MP-resolution 720*480-frame rate 30FPS-bitrate 64000bps"); - ES_FRAME_SIZE = H264_MP_720_480_30_64000; - let name = "avdec_h264"; - isCodecData = true; - let srcPath = 'H264_MP_720_480_30_64000.h264'; - let mediaDescription = { - "track_type": 1, - "codec_mime": 'video/avc', - "width": 720, - "height": 480, - "pixel_format": 3, - "frame_rate": 30.00, - "max_input_size": 150000, - "codec_profile" : 8, - "bitrate" : 64000, - } - - await decoderSource(mediaDescription, name, srcPath, done); - }) - -}) - diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoEncoderFormatPromiseTest.test.js b/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoEncoderFormatPromiseTest.test.js deleted file mode 100644 index 5cb9c658a..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/js/test/VideoEncoderFormatPromiseTest.test.js +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import mediademo from '@ohos.multimedia.mediademo' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import mediaLibrary from '@ohos.multimedia.mediaLibrary' -import * as mediaTestBase from '../../../../../MediaTestBase.js' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('VideoEncoderFormatPromise', function () { - let videoEncodeProcessor; - let mediaTest; - let surfaceID = ''; - let outputQueue = []; - let outputCnt = 0; - let frameTotal = 100; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let sawOutputEOS = false; - let needGetMediaDes = false; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - const mediaLibraryTest = mediaLibrary.getMediaLibrary(context); - let fileKeyObj = mediaLibrary.FileKey; - - beforeAll(async function() { - console.info('beforeAll case 1'); - let permissionName1 = 'ohos.permission.MEDIA_LOCATION'; - let permissionName2 = 'ohos.permission.READ_MEDIA'; - let permissionName3 = 'ohos.permission.WRITE_MEDIA'; - let permissionNameList = [permissionName1, permissionName2, permissionName3]; - let appName = 'ohos.acts.multimedia.video.codecformat'; - await mediaTestBase.applyPermission(appName, permissionNameList); - console.info('beforeAll case after get permission'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - videoEncodeProcessor = null; - mediaTest = null; - surfaceID = ''; - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null){ - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - await closeFdWrite(); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - } - - async function getFdWrite(pathName) { - console.info('[mediaLibrary] case start getFdWrite'); - console.info('[mediaLibrary] case getFdWrite pathName is ' + pathName); - let mediaType = mediaLibrary.MediaType.VIDEO; - console.info('[mediaLibrary] case mediaType is ' + mediaType); - let publicPath = await mediaLibraryTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); - console.info('[mediaLibrary] case getFdWrite publicPath is ' + publicPath); - let dataUri = await mediaLibraryTest.createAsset(mediaType, pathName, publicPath); - if (dataUri != undefined) { - let args = dataUri.id.toString(); - let fetchOp = { - selections : fileKeyObj.ID + "=?", - selectionArgs : [args], - } - let fetchWriteFileResult = await mediaLibraryTest.getFileAssets(fetchOp); - console.info('[mediaLibrary] case getFdWrite getFileAssets() success'); - fileAsset = await fetchWriteFileResult.getAllObject(); - console.info('[mediaLibrary] case getFdWrite getAllObject() success'); - fdWrite = await fileAsset[0].open('Rw'); - console.info('[mediaLibrary] case getFdWrite fdWrite is ' + fdWrite); - } - } - - async function closeFdWrite() { - if (fileAsset != null) { - await fileAsset[0].close(fdWrite).then(() => { - console.info('[mediaLibrary] case close fdWrite success, fd is ' + fdWrite); - }).catch((err) => { - console.info('[mediaLibrary] case close fdWrite failed'); - }); - } else { - console.info('[mediaLibrary] case fileAsset is null'); - } - } - - function writeFile(buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - async function dequeueOutputs(done) { - while (outputQueue.length > 0) { - let outputObject = outputQueue.shift(); - outputCnt += 1; - if (outputObject.flags == 1) { - console.info("last frame, make choice"); - mediaTest.closeStream(surfaceID); - sawOutputEOS = true; - if (stopAtEOS) { - await toStop(); - } else if (resetAtEOS) { - await toReset(); - } else if (flushAtEOS) { - await toFlush(); - } else { - await toReset(); - await toRelease(); - done(); - } - } else { - console.info('not last frame, write data to file'); - writeFile(outputObject.data, outputObject.length); - console.info("write to file success"); - videoEncodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('release output success'); - }); - } - } - } - - function setCallback(done) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('newOutputData'); - console.info('outBuffer.flags: ' + outBuffer.flags); - if (needGetMediaDes) { - videoEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes = false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - dequeueOutputs(done); - }); - - videoEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - async function printVideoCaps(videoCaps, width, height) { - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - await videoCaps.getPreferredFrameRate(width, height).then((valueRange) => { - console.info("case getPreferredFrameRate valueRange success"); - if (typeof (valueRange) != 'undefined') { - console.info('getPreferredFrameRate.min: ' + valueRange.min); - console.info('getPreferredFrameRate.max: ' + valueRange.max); - } else { - console.info('case getPreferredFrameRate valueRange is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - await videoCaps.getSupportedFrameRate(width, height).then((valueRange) => { - console.info("case getSupportedFrameRate valueRange success"); - if (typeof (valueRange) != 'undefined') { - console.info('getSupportedFrameRate.min: ' + valueRange.min); - console.info('getSupportedFrameRate.max: ' + valueRange.max); - } else { - console.info('case getSupportedFrameRate valueRange is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - await videoCaps.isSizeSupported(width, height).then((trueORfalse) => { - console.info("case isSizeSupported valueRange for width:" + width + ", height: " + height); - if (typeof (trueORfalse) != 'undefined') { - console.info('videoCaps.isSizeSupported: ' + trueORfalse); - } else { - console.info('case isSizeSupported is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - } - - function printfDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info("AudioEncoder config is " + item + ":" + property); - } - } - - function toCreateStream() { - mediaTest = mediademo.createMediaTest(); - } - - function toSetStreamParam(width, height, framerate, frameTotal) { - console.info('case set stream parameter'); - mediaTest.setResolution(width, height); - mediaTest.setFrameRate(framerate); - mediaTest.setFrameCount(frameTotal); - } - - function toStartStream() { - console.info('case start stream'); - mediaTest.startStream(surfaceID); - } - - async function toFlush() { - outputQueue = []; - await videoEncodeProcessor.flush().then(() => { - console.info("case flush success"); - }, failCallback).catch(failCatch); - } - - async function toStop() { - await videoEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - } - - async function toReset() { - resetParam(); - await videoEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - } - - async function toRelease() { - resetParam(); - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - videoEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - - async function encodeSource(config, path, name, done){ - let mediaDescription = config; - await getFdWrite(path) - console.info('case getFdWrite success'); - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - },failCallback).catch(failCatch); - await videoEncodeProcessor.getVideoEncoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - printVideoCaps(videoCaps, mediaDescription.width, mediaDescription.height); - },failCallback).catch(failCatch); - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, mediaDescription.frame_rate, frameTotal); - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - setCallback(done); - await videoEncodeProcessor.getInputSurface().then((inputSurface) => { - expect(inputSurface != undefined).assertTrue(); - console.info('case getInputSurface success'); - surfaceID = inputSurface; - }, failCallback).catch(failCatch); - await videoEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - toStartStream(); - await videoEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.getOutputMediaDescription().then((mediaDescription) => { - console.info("getOutputMediaDescription success"); - printfDescription(mediaDescription); - },failCallback).catch(failCatch); - videoEncodeProcessor.on('error',(err) => { - console.info(`case error called,errName is ${err.name}`); - console.info(`case error called,errCode is ${err.code}`); - console.info(`case error called,errMessage is ${err.message}`); - expect().assertFail(); - done(); - }); - - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0100 - * @tc.name : 000.test MPEG4 format-resolution 640*480-frame rate 30 FPS - * @tc.desc : video encoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0100', 0, async function (done) { - console.info("case test MPEG4 format-resolution 640*480-frame rate 30 FPS"); - let savePath = 'rk_mpeg4_video_software_640_480_30.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - "codec_mime": 'video/mp4v-es', - "width": 640, - "height": 480, - "pixel_format": 3, - "frame_rate" : 30 - } - - await encodeSource(mediaDescription, savePath, name, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0200 - * @tc.name : 000.test MPEG4 format-resolution 352*288-frame rate 30 FPS - * @tc.desc : video encoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0200', 0, async function (done) { - console.info("case test MPEG4 format-resolution 352*288-frame rate 30 FPS"); - let savePath = 'rk_mpeg4_video_software_352_288_30.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - "codec_mime": 'video/mp4v-es', - "width": 352, - "height": 288, - "pixel_format": 3, - "frame_rate" : 30, - } - - await encodeSource(mediaDescription, savePath, name, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0300 - * @tc.name : 000.test MPEG4 format-resolution 640*480-frame rate 25 FPS - * @tc.desc : video encoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0300', 0, async function (done) { - console.info("case test MPEG4 format-resolution 640*480-frame rate 25 FPS"); - let savePath = 'rk_mpeg4_video_software_640_480_25.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - "codec_mime": 'video/mp4v-es', - "width": 640, - "height": 480, - "pixel_format": 3, - "frame_rate" : 25, - } - - await encodeSource(mediaDescription, savePath, name, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0400 - * @tc.name : 000.test MPEG4 format-resolution 640*480-frame rate 10 FPS - * @tc.desc : video encoder format compatibility test - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_ENCODER_SOFTWARE_FORMAT_MPEG4_PROMISE_0400', 0, async function (done) { - console.info("case test MPEG4 format-resolution 640*480-frame rate 10 FPS"); - let savePath = 'rk_mpeg4_video_software_640_480_10.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - "codec_mime": 'video/mp4v-es', - "width": 640, - "height": 480, - "pixel_format": 3, - "frame_rate" : 10, - } - - await encodeSource(mediaDescription, savePath, name, done); - }) - -}) - diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/element/string.json deleted file mode 100644 index 0bae6bd40..000000000 --- a/multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "entry_MainAbility", - "value": "entry_MainAbility" - }, - { - "name": "mainability_description", - "value": "JS_Empty Ability" - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/videoCodecFormat/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 zcmX|G1ymHk)?T_}Vd;>R?p|tHQo6fg38|$UVM!6BLrPFWk?s;$LOP{GmJpBl$qoSA!PUg~PA65-S00{{S`XKG6NkG0RgjEntPrmV+?0|00mu7;+5 zrdpa{2QLqPJ4Y{j7=Mrl{BaxrkdY69+c~(w{Fv-v&aR%aEI&JYSeRTLWm!zbv;?)_ ziZB;fwGbbeL5Q}YLx`J$lp~A09KK8t_z}PZ=4ZzgdeKtgoc+o5EvN9A1K1_<>M?MBqb#!ASf&# zEX?<)!RH(7>1P+j=jqG(58}TVN-$psA6K}atCuI!KTJD&FMmH-78ZejBm)0qc{ESp z|LuG1{QnBUJRg_E=h1#XMWt2%fcoN@l7eAS!Es?Q+;XsRNPhiiE=@AqlLkJzF`O18 zbsbSmKN=aaq8k3NFYZfDWpKmM!coBU0(XnL8R{4=i|wi{!uWYM2je{U{B*K2PVdu&=E zTq*-XsEsJ$u5H4g6DIm2Y!DN`>^v|AqlwuCD;w45K0@eqauiqWf7l&o)+YLHm~|L~ z7$0v5mkobriU!H<@mVJHLlmQqzQ3d6Rh_-|%Yy2li*tHO>_vcnuZ7OR_xkAIuIU&x z-|8Y0wj|6|a6_I(v91y%k_kNw6pnkNdxjqG8!%Vz_d%c_!X+6-;1`GC9_FpjoHev5fEV7RhJ>r=mh-jp$fqbqRJ=obwdgLDVP5+s zy1=_DWG0Y-Jb3t^WXmkr(d9~08k-|#Ly zaNOmT(^9tIb&eb4%CzIT zAm3CUtWSr1t4?h1kk#NBi{U|pJslvME{q|_eS^3En>SOqSxyuN1x;Is@8~m?*>}** znrRFArP!K_52RpX*&JHMR<^lVdm8ypJ}0R(SD(51j;6@ni$6bQ+2XL+R^|NnSp5}(kzvMZ^(@4fD_{QVu$(&K6H|C37TG1Am9Re{<<3gd zh@`>;BqkXMW&p0T6rt|iB$)~CvFe(XC)F9WgAZn*0@t$oZo;!*}r@_`h?KKH&6A@3= zISXoQB+~`op>NP-buiA*^0n{@i{_?MRG)&k)c)k_F+-2Lud!S9pc+i`s74NpBCaGF zXN+pHkubw*msGBTY27BKHv)RRh3;nMg4&$fD_6X9Vt~;_4D+5XPH~#Kn-yjcy!$}1 zigv#FNY>TqMhtIBb@UoF!cE~Q8~;!Pek>SQQwHnHuWKoVBosAiOr}q>!>aE*Krc)V zBUMEcJ5NU0g8}-h6i1zpMY9>m4ne?=U2~`w7K7Q0gB_=p@$5K7p6}thw z-~3dMj?YNX2X$lZ+7ngQ$=s}3mizNN@kE%OtB)?c&i~2L55z8^=yz;xMHLmlY>&Q# zJj?!)M#q_SyfkQh)k?j8IfLtB)ZCp|*vf4_B zos?73yd^h-Ac+;?E4*bpf=o*^3x3-`TVjbY4n6!EN10K6o@fxdyps05Vo3PU)otB} z`3kR+2w7_C#8Z!q`J)p{Vh!+m9-UP!$STp+Hb}}#@#_u^SsUQg<}59< zTvH3%XS4G+6FF^(m6bVF&nSUIXcl;nw{=H$%fgeJ>CgDYiLdpDXr{;-AnG z8dvcrHYVMI&`R6;GWekI@Ir3!uo)oz4^{6q0m^}@f2tM9&=YHNi6-?rh0-{+k@cQm zdp`g#YdQn%MDVg2GR>wZ`n2<0l4)9nx1Wfr&!Dvz=bPwU!h2S?ez6MVc5APE4-xLB zi&W9Q8k2@0w!C53g?iAIQ}~p*3O(@zja6KQ=M3zfW*_6o5SwR-)6VBh~m7{^-=MC-owYH5-u40a}a0liho3QZZ5L{bS_xM1)4}19)zTU$$MY zq3eZML1WC{K%YFd`Be0M-rkO^l?h{kM{$2oK1*A@HVJ57*yhDkUF!2WZ&oA4Y-sK( zCY69%#`mBCi6>6uw(x4gbFaP0+FD*JKJ-q!F1E?vLJ+d35!I5d7@^eU?(CS|C^tmI5?lv@s{{*|1F zFg|OzNpZ0hxljdjaW%45O0MOttRrd(Z?h{HYbB-KFUx&9GfFL3b8NwZ$zNu)WbBD` zYkj$^UB5%3Pj1MDr>S2Ejr9pUcgA!;ZG!@{uAy12)vG=*^9-|dNQBc8&`oxBlU~#y zs!anJX&T?57Jdr^sb>e+V`MVfY>Y0ESg7MG<7W0g&bR-ZYzzZ%2H&Etcp zcd6QeXO1D!5A#zM0lx*GH}`M)2~ZFLE;sP^RSB5wVMNfiZXPd(cmO>j=OSA3`o5r& zna(|^jGXbdN7PK)U8b7^zYtYkkeb%<%F~=OqB~kXMQkq}ii|skh@WSRt>5za;cjP0 zZ~nD%6)wzedqE}BMLt~qKwlvTr33))#uP~xyw#*Eaa|DbMQ_%mG0U8numf8)0DX`r zRoG2bM;#g|p-8gWnwRV5SCW0tLjLO&9Z?K>FImeIxlGUgo0Zk`9Qzhj1eco~7XZy+hXc@YF&ZQ=? zn*^1O56yK^x{y}q`j7}blGCx%dydV!c7)g~tJzmHhV=W~jbWRRR{1<^oDK+1clprm zz$eCy7y9+?{E|YgkW~}}iB#I4XoJ*xr8R?i_Hv$=Cof5bo-Nj~f`-DLebH}&0% zfQj9@WGd4;N~Y?mzQsHJTJq6!Qzl^-vwol(+fMt#Pl=Wh#lI5Vmu@QM0=_r+1wHt` z+8WZ~c2}KQQ+q)~2Ki77QvV&`xb|xVcTms99&cD$Zz4+-^R4kvUBxG8gDk7Y`K*)JZ^2rL(+ZWV~%W(@6 z)0bPArG#BROa_PHs~&WplQ_UIrpd)1N1QGPfv!J(Z9jNT#i%H?CE6|pPZb9hJ1JW4 z^q;ft#!HRNV0YgPojzIYT`8LuET2rUe-J|c!9l4`^*;4WtY@Ew@pL>wkjmMgGfN7 ze}}GtmU0@<_#08~I-Suk=^*9GLW=H4xhsml;vAV{%hy5Eegl@!6qKqbG024%n2HHw zCc@ivW_$@5ZoHP70(7D+(`PvgjW1Pd`wsiuv-aCukMrafwDm)B!xXVy*j2opohhoU zcJz%ADmj>i3`-3-$7nQKBQQuGY;2Qt&+(L~C>vSGFj5{Mlv?T_^dql;{zkpe4R1}R z%XfZyQ}wr*sr>jrKgm*PWLjuVc%6&&`Kbf1SuFpHPN&>W)$GmqC;pIoBC`=4-hPY8 zT*>%I2fP}vGW;R=^!1be?ta2UQd2>alOFFbVl;(SQJ4Jk#)4Z0^wpWEVvY4=vyDk@ zqlModi@iVPMC+{?rm=4(n+<;|lmUO@UKYA>EPTS~AndtK^Wy^%#3<;(dQdk3WaUkRtzSMC9}7x2||CNpF#(3T4C)@ z$~RWs`BNABKX|{cmBt>Q=&gkXl&x!!NK_%5hW0LS)Z4PB>%sV?F-{Wyj#s7W%$F{D zXdK^Fp3wvy+48+GP6F_|^PCRx=ddcTO3sG;B23A49~Qaw31SZ0Rc~`r4qqt%#OGW{ zCA_(LG5^N>yzUn&kAgVmxb=EA8s&tBXC}S1CZ(KoW)(%^JjLTPo^fs`Va;`=YlVPgmB$!yB}<(4ym6OeZ3xAJJ#;)2+B%p3P1Wt+d$eo`vz`T zXfUP2))kBDPoscH;Jc7I3NU<({|@wM$&GaDt`n7WLgIY3IA7A6-_R?z8N3mz|}*i z(zl5ot--Oq@f2-nv{X(ujT2T(k1vY_qh93pK@>H-qc%2Xta)IP0Q%zt%bqYgI`o!wv!0QerB`nCN^1n|@$sVOQ!V0teVG!I z_fD%JvfDeT1cK#-{o6Gv7}& zY0#NWin~kVaf$aufV&;63Hbs|`QVZWpDX6IMk1Hj2G}fiH9e-^6u2zf^FIr^BwD<6zjw63+{yUe8PUFvk8v{sJ=R{d#`O!sz`Q13~< zPT$JS(w=yQfU2`zPCNfSw=&zup@DXc(98afjhv@1w_f!m2Z>rMJ19AB&dB%P#Ls3b z=lK7OILM+SQ&VEd=1GN6o&>YVVtIzoZ%=Z_SdqJN2}E43{bE`>w+A;=y->@^k{oCC z$F*WTY&?34;kfyFV?b*Xb1Pq`Z=%OgwEg)Rz)tx=`f%5#w_INP=x&z5!jI;#;N$ma zhO)+MDm;SxOEVL15; zGq(v2pL3&P1Sl)8P*;G-fd{l1QJsv@e@d8)1PK4w2m*M%V3j-V~L^$i|&C@b?D?9tfwE{B^}Z$k8e5FmQ>v7Xz)sG32g9t}YBt zyR$+*_00RmPx+0mW+vVG4mxd(n$(eQf3-w>JPl2UJpafrPaL5@2j}%{VE-) zBI%6Qpj*dsdH<;g!S!avA~bv^0E+ zfyJbSjPb+j;J52U)<|cIcntQBI2T#>2;tOxu{%D?kML476AErF(qN9hPva5Nkc@BF zC-tLF@3ZFb%Kpj)M<{)x*l|*Ia@ECeXo2E4h2f!aV=cHAhi_E_mfUth(sM4^hJq7B zQsGWqdZUm9S%F`$nQ*_#NcuD`&)Ek%_s{&^78{9Hm ztri&rYLOxgFdG>O@+XHy z9#;|&vBCPXH5Mon^I`jSuR$&~ZWtyB67ujzFSj!51>#C}C17~TffQ{c-!QFQkTQ%! zIR^b1`zHx|*1GU?tbBx23weFLz5H?y_Q%N&t$}k?w+``2A=aotj0;2v$~AL z{scF-cL{wsdrmPvf#a9OHyYLcwQD4Kcm)`LLwMh4WT~p29f7M!iafJSU`IV}QY5Wa z(n44-9oA}?J{a+ah*@31WTs#&J#o1`H98#6IQf;Wv0N_!);f&9g7o-k(lW5rWnDUR zQBFIRG+X=6NnsI@mxnwm;tf5;_Uxg?jZ8m-m0}&6+DA!qam(p$mN5R})yA_7m$q@| zFEd|dpS595rxQr-n#GjI5i-AhnUE>Cr;jpCqSrD~EwK_DqI^7%3#p5)%T_od!t3SOmH9MyXeeGO2(UQL;ax|x?Ncixmeo1=$ z{-);Au{*tfzOG?KQ~K|ak8-HQ?`Pekhe2WM(8s{xv-p>Zmu_6{G!-oE$7$mY`MOJorI=+mMx?H;`pr!;fVYz?5~yXBACruWB`Ph zZM}90_<^OBxIhyZ9BW$`>6JvO;%VFpqVr8|7t3~AmxYak6?`Pp#c;**_SYmi`&z23 z`p6_~ePvH)C6x-G9$hgL=eVALq`-AiamN>!3~Lxw&{H(b{B(7xSRm6<3<{%{yXiH# zos5Rv1L+8fUKJLo%P>4I&$}yXCZ(XJp<`rbEFvm8E+IKBJu5fAsJNuOs;0iFrLD8;b^qJJk+I2{xetrW zYa5$icJ~iYzJ5QyxW4&&|JeD%80{X$$S3gsjpU)gi1EL>hjCy$TWR_42KiTa6hKLo zlw)>6D1a$G2h^v^M+^jNj4xhp<`X_txVT3zA!tv_XU@dSsn)+-l4b$l$+M6pLc2W_5%`wtUHuGV<5`b%yDE zxZ}|k-)Z}GU0A)j?KAakRM_cIKrOx~znJ>2?7Z0toXiNY9i|$ED|P-Uvs*s`;Q~-{ zBladT9Z+x`v;773F|2IohD$`#+bU3A$-*?w^_Q5{8A=bG=QPo`=ee%#v!D9bpU{7~ zUeLq#4{vy;bbwUsBQMr(Bs1$1Dz0D`GSxK%=dsdJuQ?i{9Lvq3$hR^d9q-GMqT3ip zFwHBqrIEm>iD|q|la~siqT@g8DF$Yrcl_*63F2+RPdEJD@-^V{^S*<4`N_BIe~B-U z9CtD+8~U!}Se1-P_>vt{u~{pfVn7`#Ff}!<8_Z|3ihu2DkFM*+-BE$?UVa3EMr+RL zan6$IM1?gt%$1hzgaf6 z_Hp?3QLbyp-5I@V=2;P_NjFQ4(v80m$bdKB8UZL67&)*hJCe-%2pA5^DQF@u~;7i6law zPVX~5%BrpW3w;%-OAW5p+%RlcX->!64P8-ghbd6(R@8^K7niQ6QVNFNMm|gopWH!% z0hADeNRmbk`)CA#s;o;BCdN_{KaaB>y_6NiYMC7tZUmlqEoY_FL0z=m(MTn(o$;au z!zgU&KH{p9U0me1dc;~|CKJ?AIgkMBzFq&0pB-h+y#atj?E&lj(Yi+j)3RBrIaOAibTbJZuz&V?gQX0B^yA>zxT`@x@fmMxe0bSE&WRpXk^ zROGAo4SGNQh-kd}Yu50?zj9+E;LDX8#7Vg;s-alGunLE3iE(5Q?awI&g*_U^g26XS ze9{awOg`!<Q6JTj!xA12TMc~;4YH?mp-u_?>T%EVnh! zDR)bePkuAFpQ!q4PKWxKeqwvyO6CGEZ?JEfuAHFQE!#JNMC&K zX&#!nKAF4}G+%_AZmOlP9+Zt&v;_vqeoQR_(Zg|C8vvec#3K+o04Wy|OGwq*vB`7x zzlJ`?A@=^olRh&X`;X3DRlRM_Rg#jWR1p@7ZAh9VJ6tS^T$?TY_prAo*Nw|=7#B5^4c**)k^pAx4Ama4}^v8-9%tx zd>m+k5$5Tb=FLIAN~-)DaxqbTYh8sxc43tDp2$^q&58U^{)m%Yc5};&0Ic|=KFElQ zF`xEko628su1RcNsNrxwr|n2CfTB{AlUkpULSUPg-#wf8pM?N$QzIW|l?Nz-xz;Bt z+5d}z%Bx)dl{cr;A3>k{i1QSu#%#!iDiAZbjoyuYgx`FtGtK;F5|*To2JZ84J6Fa$ zmA*@MUh_$-oyhyn;IJ5McYL@g!;nks>zC(5sOK&H+aLJ(wd%(>3*E=!2&!P4KmR@l zFK7t$U7-)DbfjW}(}iP{wdqWl#`gS9@p*J~N=K;)+fTjC2SP31rnOfRb5#%Aw`?td z_k9X@{4zL*$(T5n0aSfgU3gxD9r_Zr5OK3h6~deJjl@f7v@25r^!{CT2jxL@&M?7bU*BZAIzqEf)!t?_%%^9quERZn6Y`WmzFTtfsc znLL@(eYmh9!vv)gN6${SY*G|o_x2%*R!5X;#wZq<4ak~$ceX4uo9Cey>zV@JLn|dA zvauqk9*ywqs)W8BoY&+k`ncp*lhqL&Y)@SY2PUaBEBJirOfhmqCBt;P-kItIb)D{pF{ix8 z?r66%qQ64nASfdyqF|EkL0F&41ed7UL- z$|2Lv1ueyBV+iB2ER+L1&$qFM=7|pmeNn=X&+oVbNqrPi&I5`0{Q2+n43AASc**Ht zjN&WRgInq#um<4duHi1g!$noV3 zULp?1_ac{JPKlFSRQc{vUd9EZ5v4(QYx-E?cl@D`Km-8TUg5z)<3m1_4~qiP958OhUf|2>1oGtyX$||lEZhDC?dtY2OE4WXsio9IjcgOkdu_a*;1k3YN6Tfpd z=-6P`TMuQ~EN#dgioQdEPkq7vGqK$IT8FC#$I~!m^k_RsgKgtY|MJn94?u^el)2S) zwsJ8p=qWgrp&WGYZeLLR*FUT+7<M$D^bQJLYyO;l0wskBR!P}MmwVgQ}+|xbDGBogDj-GWE76Gz){^K@d zGFlxJ4R?HCY@&g8`LrOT@$^`?+nGkI$BV>dJ})leNgQ>AUEhydPzt&|-_#0>BEpU! zxQ_GGI|hm-_w>dA+1PT{GBn{=#5X72x>jI0`-DV#0J%`BWvWplM@KBuxdNb|4RW?( z$L&&Q)bEsHEpacQl5Pa7wCnVCX45{&j}dQq1i}X(cTx(Ph{ma~+OLe4;J|T~@RX-d zS4={8&cki*MXP($y*mxP28y>&rHf8cyK6_lx0F$n~!haso(|nFVPl>*e7DA zJT_lRDh~_Gh5_1FGD6sR*naPLkO7g0KGuKnAreLJxm$0G6^HkL?T%(F?UEN-3$Wo> z`T91!l?H4WppBLc9^Vs0sd9>+tVG97g@N`z51Z%4{-UoDld$)81&FvZUD9}x>YCQV zvfpmwp!y+W%I)7fdi=eEI@XIza+GDUi3UU_8J|DJZaNRhSFNkVQJLwTa(HeEkO2Va z3ye2w*zfqTXbOghM59!&RSY31X**S)AAxY;VBHV}&1xr*an^BHJoF4#K!C|CBmP$M zvfb$4zh8@TuSsBvwc>B*4}N~wSD3&c(jN}mlfdQu=^x$Ga~(y#S63v?nE?px!Q{*q zNuwxm`Fgf-<{NJ=)ViLQcdRbQCN zJRxo7;0hVbTxQK8eo+N8@19oCQ~YmHAOj#+dooQ36*|9~+N;c@Z`39|ME2RgX=w|u zYzjLaWBK(=!SBQ0bU(MQ#7x*XNnfD?^aA|Z{=(67_1QG&RK=}HRC1+P!?x^;14#n} zd|%JmwkJyaVvIn^RcHn;Ru1#X7&{Uf$-z}=F%pQ1x#_d%lZw!Cvm@~~vmUQcT~FjU z)2}#?D;Hmk6_TJk309GU5er6G!=Rcy#W)vyM3vYO=%Z0;I6i3@j2c&7z;4g3OExP? z6Mua0?whm72DeO_@EbHGSo~7k>Z64y0Z4JFh!$cp$`jA&BoBvoveMx1{U00i(rmkA zv=MbdEqc-pTNpk{AAVrlWXZjMQA|99v2PI|?Q$6}#x}IkZB3tFP%RkB{1OQJmYJ-c z2%R1ZSqUH%0AGFm%GLv=wT{;OH5G+b;G^hRzzZC^a0&Ls5DT>5bib~i z;qDC7h>^SOtsr{C+tvWMs|znFVV0$F4Fz)9Ne(d?ceI5B`%^EG;6B&H2n?0*=PDL= zyll0JRESLK(+hQonpfqtFA*_$1fqgNdBasycHrgKc*oSWZLIqXuf-RiBe+2Xty#gn zwQX_9f`yQpO>^*x-9UC9U~}JFmBt3# z=P96CJ1kJENT5DLwgfrd!XAOB;b7;XXSD^oZBH3p>f?#|fkxazjN40b2mJ`xST>(d#Md46H_dSEUdCd%(6Nmj6zmZ_7wJhE@#LIZ`<=(JPG4wY0ZXp6WJabqlN+^WYeNQmI1EEp@Ct4f}jzl7K4b zPW!^1AXp4&g~Yw35|Aj4 zaDH`T;bzPrsF{4RuV>2^+_{tEC|>wEw@^<-f>MPKBnlBhp6cAcAjYk){d&K+ox#C# z5^b3=LGmuA>=_94YwjZu2OP{qt)bbZ8>L#)a1cveliT&f_FV~DQdLTCI$;RytGr7x zT`ovM)V|kVkitNo5$$@|77&0m7D_(j_q zY`;4YS+95@GpzeW{M8#PLL-m0?UM0f$ud<4{8Ly`Bbii17r!_vEy_MyCs8wETVyx8 zda{bqK(?(MRz?fAI8`W-oTVwj$_l+V3R1t`Y^YG5a+BTx`S0*9&b=4!nabV zPA2}n;jp@U24e6CBnyDch0JTKYH#G2Pub$JPNg0AQ;`4S30V6EnB?l#kXue!Dt4x% z$g3as;~0TT){a=o#rrD&2!>XJu`0XpRQDuB*^7=!!FgJx>f3ARz9w2~2I~`I?7Y0G z6E(1KoBn4jj{*lU5$IKi86$gi`i)%~X<;HJ2KwD0i8YO=%Qu}1I%29Mx$GKhy8<<* zI5@zrnr3cev_Qp9drU7&Mw6#joDm&s+eR0)@2lf?@b+P*+r`9_eft~gsMZZ%D{PC$ z5O{V?>+NTq@d%^=Kvcuzni$t@i!h|E}BRmXA*Gmon*aZeVU zggxM`#@o=OkWN=E3`Y*zQDzeP;^k_qwy{_D8DRvUtlSKCiq3QT=DW~v(cfK08R5Za zF;pZa!%iic#AE1`y5AV63xnE;Ag6$`R;Q&FXc1yf4>K9z%y`FKaI%2WJ;Rroq%uNx zm2?GN*49*Ir4)5i89VP_%;y)XF`B3SfJDBzI1&5D!p=#zmjp$M?{7|sX5WAEfIPQu z2G9!QL4_Vf#+5v3XU)$Q-=5`!e@s`;rH4UPx&~767+Kt`5uV zeQnHB-9V3m&kzP$ArC1qf$jEZRd@JQjG zWdxG19)WBCuy=@D6R#7UKFR6j2(Dw1PX{E8{rN$~3nS%TfDluu>&}dJ<0%bCx&aHf zi8sFJan|eZ2__WZgfX?NH+BWDd$e90>SCvZRf-MMI@|!zM;K=_9C26=GJjA7l<)&d zB%i!KpBr1srZp5xqF{C^D@8$&)L@0v7R4g zMXNjlxd9N`aD^s5tQ~z4C$^lVGIx)gm+BuA>lC<(Q{xoUu~Wm5V?Dyh+WTbaHYE*o z`lr|t@7ee3!0sf%h7E4Zg8+bT#wcch9qOnolrasrN5#pu-Xl|p*CX9|=db{H`7=+E ze6`m^9FHB#{Ze*qE=KI(fnd7IktFoVSjhX_rmr>?3Rsys%U9Z90i>a7_F=&<9=;F) zSH^s!ZsmOh9}qiCkK19rB>rB0+m8`#4BeXlSdBoyy!QUz%Ghik)Ii^CnQAcF+5eR7 z5y%$+|Ljs|Vr;ar%X12-$}RINj=Xz|&!guCGYn>>V?Vjn4b~(8h@Fs4iJ!>uq_Bvw zayGkas?+GON}(tOTAFnKd`rL~2CeD)ViavzD!BBngvhBZxVgY}*WcMfb&L1Q5Uhe4 znfEz_mC86FoHxnunVZSZ z2o8pKSk_iG`lym}2wo5$GLort`&WD<0Rb+aT_E)09U|uAihqJ%2a?EgT$2BlG~>aD zN(lo+$da1KEh{;4n)6%KCAK8;Ba%U+D9KeuHvPtBiF&O8?DX~kpGR-q-!3oj$?Kqr zB`p#RX5SzG$|_)6Ci(lhYK^$5kb}zII!E!mF|}7Ve)FR}RF;c>=f@TQ66A{N9#SQe z=ip=N^C=C<8DkZ}J4dX>7dTAjCyiA$E8c~ie!dF*j-F+ncGX@U7#Q51Km3Yl{t+k| z4yM%-(L^|bl+zs@@^DN%1uHA**OwQEY&zL{BukA}gBlJtwZ4CE75%yG#UP0dty24f zrdtm0w%|eH`mvGd+{?sZV_YkXTQN&I8oDq4K4v_1F^8c>8T_a5ix z0_~24>SsDn4^JT-dg3OnBvW(B!bQiMQ&`Wg$psI)!MDP{hm(y6u~Ny}UILW}@yuL| z&#d&4I3e#eY=^9JPyUv!W@ED{>oaNwN-fVj$O9l+m}VLgEB5%H-kn1|2}S-RP%!}Z zZetGV2i0#aY4icF=r4Wq zO{&z#v6kitE8@oXn)uDnii^F_XSV`II8J7bME9kaKa|yM{r_H2EB?PREsubOeN|51pO+MrMwk%bMq>9Zg7c* zsQx&_kQ;K+N$=a>-nY+v;Ss0Ft$!Wt?QrRz zO_Gv;+pAnr6y$+&ILegl3E9Je5wGS80owMC9>dTA0L_wNy%Xa|HY<2s?hz>GVfzpw z)AS&x*swSqUy#swv#Ov-co9WQjxrl*HTLA9lj$W#evx=3rn@eRNeD`X(O9EmW1>eQ zk8WPDS=B$gTXiDD>wh&kFJ@F!(bFXWZ^PkQ0A>1E`x z^^mcGj6q`oe#u;X?M=d0$J#hznN{a{0-M*lw3yTT<}YMj0Y-~_a!scHrW_o?g({{= zrUzQwaYFS!wQVS5b*0+O|71fJdML0Frp4qRFTS zdiuo8`GWX!qlas_x;UPpwmvjDt?9_7N37zt6d@9M9yUz1tqqgB0MqJlbJ`4MD#q;J zg|Hq`a|$bpe%{V}c%0+F{EL#yMpFJj{}?i`0JA0vs!{^${8TUb3w0ScHZr6-elikV z3x*}$;LVSaHeW|_{@fx5hnv(fk`ah^4VubahA6$M;rV{IwL<;vw1Z;|jh#x>Z&*;z zYl<^0E>@h-ptR!oK9jNmOwKp&_%fNbYSw2ks>D%dPHZ*Gq5uQq5$F{Fq2|)j_*&tXmPKCJ#V`>A5=U*^p4d*chkd6}%`P^R+5ggvAIYKB@up$! z^s`p(bUipn4O#W>=#5~B5X2d4vpg=wqJMCqiXJ_2X<}uX{N+ zB?h#uT@XJ5&(6sp+RA^kl2tT9rq{)ws=4G8p?I8ppG0l&)mltFmv$jJ;WR>ZP_lSE6>Kji{q5pjZDvg0&-pFZTi^#c@ z9H(Vcbb4I2UukjnPOyGA#csZ%E3UR*_?R@WTIF<~qZZWjeT+QuL|<&_Hf#%8%bJ~0 zkGwBTuw4TY)f_YeTrBk7{DK|&xrya--n4oeZ6?32=eV+uOy8<$M53F(T}->JLq3BM z{=WC>!*hJyX8$^g+M;8UW$rIk_J1sxI+FY15y;$LsyFnfW9QhQYal;&m_#>t)s+Zj zXGNz~GWZS`6udre;{HLBxFARyuP->D{r(D3m{QK{k~i2MJNKUt#Xxddq&;Z$hg_b?3NoBQq3wu7t`d2fcTTay+ksz@Z0a@H58%B4A! zN%4oCw^t*Xlsxc7IA&bLD|uZ+t?>pmwvD^FNcLRP#ftSi4bpwGL@B(w8=a?0X}Dng zN`;X)^vHWX79)-#Gh6+b$Bl`Hl__p!18*^-*sB*f27(}T=htEwk<4jUHd{_CD4(l-$&eA ze!A(YaN+3%Dp5aLIQeKM+e8=4Y7^f3U?tWQ4@i%Ee)?7TsDJ#|#r{}!By1-nC9#RN zt7w<96|mjrf|EtlJB4n71pH(Yx$yz&DM~w!hRENY zyu3H<(ofXSPUTsU{dBWve6LFHuu?Yf_rp9a2hO?#CkXT&ff^ricomea#J)21-fS%|KkHD{4Jz%zvEiLy$C znLIqD5Fd~t^?j#}%}BA!J_ik+tBUY1=V6Y~5-br-8vIX^>;fRo0^&_%9#c=N>jlqq ze?p;nBSVF|KD3g!i^8T>xpA+5<*4>yKsCAf$_t(Ng@!8KN*qdvFglXZjX9cdQ^D(E z%o?alC>jiz&rVGeTlaGwPTH(rSAr>^^%~d;I_&@nj6KnU=tSPU>}=#$QtyNM1>=U7 zRQe5jEX7C~P-+GIMY>lmTDd)s{NTdT^4S`S6i-plP%xP-4SOkiyo#|bbCAd76gLolh7tr zI02CJn_Yh8p(SZ%wS~umX2?B`LEYDZ_YHYS8h*vQPVPb)-BZkbqU$ zhj)-y+vpl}-HET{H(h-UBcTGLsPsGs7_W?bT!9R7{kK&02o~EcSwiKZno247Sz!HV zJauEqcp}0w4x*1XmoxL<5;~$qZ8HY?EV1*VMQk5|M&V$Ke2D~vlbjum(@8e=Pr*OR z#E$UT9}I~EhmrF&F_eukKvouR+h%G~moXMPrmf#{eMy&L!6CHCn_b;% zi650rFUVa5d|r%iZ+yo=Qv0sscP@RGeK)H}^drzL9Q^S@MUz*JP6_u!@I0A_yhMBz zptb&~$ZJ1Z=@DC{Y50eFAyLZ(xAJ4>f~g55<_UG?WXwN1rA^_1)I)=>jYrd7H?xXx zeupx{J&&>m)ywD$T1-7~(+@sLg1QJ+mhS1qE|naXNrfZ{e`nx-{4bx0vNgPZEoiasq&~X0>e6P^?=k*w^}#}EYPD7FI|{hRmlrs*SKZgl zv9tle&yIMjd83Oy2CzH-cqa^>lLE3_2+P5n(SBNt#2vIR5Fw`6wvI|0RX_CWaDZNm zEzsl0<7%D-E|~@u5>Sgrq9n-UpFn%kyUZjP>30c0mk>)u} zoAQsXj;>k+QrMmemdTUHj;rRprC1|yn|W!Vv|3oMK-*TErS56eK4*Gj#Httpx&4x> z6GNxNuWpx^$9+l{C$)Qa2FHwUkzP+QIU#*C&@KRG3{a{?sM)v@FcZg<>;5XE6+88W z3*D|(@m~tc|0%L-1q-?$mJ3_Vt zxwxN!If-pi?KTH{XEGpGImVM6zNldn(Yq~&VmMNcsA>A|f?u&Gk8JM}IC#9lnF_S7Qgx|<218X+LBcGXU@`J1aCI#?j2666mHLomv4cK*{Y<3xsWYZBNFBI z?D+-stTO;x5CL<$e1%Xd|gS!dg0W!^FT8T|70PUk(rcC+-8vR;f zg8q?XdGZ~cmcV&rzM)#$zs-9m{65(e|{o1|kN)NE{+ceG%x8uQ32rO|)f zA%qk*?xAPA2P1h^7kY2-C*n$z`sM9P}ieeulnMElJ-U*zrp~ z+|6_de+f`l>A!XBZs;p=GLq=jd@V-@;4eU=$pIx=P(3BD&(cW*!=8v4{?Yk$ftfO` zzp+FKA~rY+GCuYGkS-IHeYyAA#-|N-O=%@ zLTEfAY?7W93s>$pI@L$~S(^V%IdDNfAC$~{D3$rqLf)AK23G(Y9E$|7@?%K3ezU*8 zLYJs$m$vmOxtFluUGluV#pf3VTMXJ5Sq!pE z*}E}Ei=tC!VO-CvoI+h~K*M3ig@gm0NwZb?Q3en0BjYx}q*5yr zc01$y>8@Amam(~HEdK+7GX8!D^=TM#%Q~cs!8r~o&&PN>Obe)$qdGaI)YU=7M?bCn z*`i@HJF{GMDY>bGfySaiUsM^DMg&x;#_m3w)zY*0mg1qJaP2XfE4nwG8k^B=xi>w`Y>$DDxg>7)-7(@^^)CO%*c@s;}g29;9W)s76)pUiMHY`&-rh z+o{Q3#}F-#w3*knU`tpmmNw@C*SGxUtWzSaE~`M>&iGS7_Io5*w!9}zjA!Z44(43P zJiNQh`=ks51@wOw%GKg-V$_Lx!BXQ83+BZ;H?cGla?$W^x29(pq1Bq+85h0(Tq`_j ziC=S0GRHKL2&;JKWi%zPNv?YQX&%2JbT0Y8eZ%+stsnbx&6ob1U#EM66?=VxMxj^F zU%5zV97yXl+^v?e`a_1w_zmg?8 zlb4aL$a~5E#D`-*qpAPFhrB>;EX-Wl*vCfV-wW6N$Ou0;F=`=yiE=C}D^ZBz=Y(&9 zpOxy`%WssS;-}RLAuiyjv6;+NlclMw;Ah~} zw}xPz0O+==uqvNuJxT!+c9q~|7$})NR#F}~+#eimgwQgwkrR^rI+C!2&8A3pWahOj zPxj;-{YtS*8fg|L?5&52hP@l6jnNXR>rrweHT9<2f&S^gpuT!YFcH;J_>-@WMj{@? zzVD@L{BE{z$uPV+w-R5CYfb-8o0cPBkI==U?jHXlWUwbT9_4rAkIO5%;> z8Xd?9Uhlm}A3BJJJna2B`RLTLtE;QC!J-%@YMRev^v2~mN%|VBg$^2xROQEER8Ukb z3k~1(=*8|Z3Pai9DBS;k7$v~PY zN~nyi#p(?tY84fUWTHA2Wr{?>{$!>>f+5@TZ3nyGO%R?;*pN|&WGAz0uzG1)SL?sF z4h(g%gPBL5Jpji>fU`+bW5_g}X(zwH8A4-LCaO57$txR|+`#zN6EV}Cmlz;Rh{TX2 zIkZ+kF0&b4FFYG=OU~|ox$=AFm4IP)ysL&|x09OYta1fr=7%Xc(jsM^!>-(vEy3$- zIOjrVc>+Q!#e=>l+Dg_3zG?|A z-zquv{bp`pb>j8ysGlzvD|K{b>1{mbrx91|c2}m2Di7vb{GHLC?>ZY&lJY@O8G}$9 z*L|CKx_oN1Yw_adbSVEm*JMk3lIA;-al}3L@`1#z2FK>rGR&$}) z;!wrAIX(g%Mr-gI@Nqtf;O;dCQ@Pot;$pEX|11UX~Z*1q!Pl5xvQCoQgP~U4JOSS{9WnF;vlK;YL44@!y4y&a>U2gBN;LXDh>fB)`qkLeoST*fTfci%H~|T+!dSq~fpF zdb(XdV@i^l-z%tjx??Oh7kBFKq4y9vzThh@BR}oLIgdNE6rEM{D$QM?9V;?&#Z^Bu z@@}C^?Gfk{70UXRl@s9x%4l>L%LcQ4;{W!$gTuGxnT~l7r#LPQB!w1_*7a45#q!MY zY^S`6-=|-Dw9j?6drJ_X(yvM%+p_<8Y@jfKQAWmRPp0I!!xw3qoNbK(?o_l*m!8^8cy3_fKITH(xM0fZ>*BOgVL3)+u^ zxJy}V=66Kx|8z##jJ zDWmS+_6T$U;2fVT)mF`vn-#FM#Y2PN%XHqcbneSOh`}$1tuavGnfwgfgX1t4$U-jo zgqA>rRf|fDHfQ{p9EGR)ud*NA#6Coql`^y!n>L=vN9t7jrG4s6PiX(-3h8b6fG0Nan5a&WG$dO@L01X7Ls9)^Fe6HQ5|I z0__9f<5v=zyiRgejI~Tv$<~DQY&b1k4EZ8Nevr{^H0&|}Ep2*C9y0$4C+|Dau7(1q zXpXHpQ+@bSHuQILT)W9FRl(bmmG?=gH@%;r%57KcX-#|*@>7McUxynQYEagitj471 z569O3Qjk4cy*L_8`x1fm29d|AS~>9N6d;zdj&}NV-pzehx%W>uZqDXgKgvjsHv=+f z-xMkuP^W~}?RaAHqAu=<(5v}sDoWoZkD0rYDkBD|$w&oEgO#lTBV#rEFr&#MBKH4M zA9mo7?F%JNG6Onyl4F-V;^1^eb4Zzm;vktV(Xk@)x1^j(7v8WW4m}}>Rr#D@)(maV z7@OImb8d`x84@qv9+%D5)zw-v1v)7c4JY2?3tgk0GUAen{}IF|0SK<~Et=m(R<1j z+hoD{*5k*g5br>x>nz5sj zz?6OfiR}5JTsmR%Rcv|&fXD(beX`LM%!U@_9fcezG6P@t`Ox7?c&9G#OOxm2NxH~p zB$g+x7g_hIs#54Pe>E|hoDmb1xb;c2MJjT)25qmaJCW>wKirv}y4Em7#_uJXd$aQ$*cbd%vzX5zLxS(K_jh@7@5P@t6kXfa4wzq4v) zhB9RKO?_x&lhmev4h!O7hhVej;OCj-U8UsfOokMUd-8eH?92HVt5Wt{L>=|uAg{ko zTVeO=r~XH7fs4&~D;0*WifV~*_hSG$r8R)uF&QC~Lb9O{MUdfm_K=urVVL>Ts{Dyl zUgl5Kr6FfVHz(EcdTTsP7>4&D*9n_S^ur$dh6>U>vBAZ(Byk@PapC#%Pxm9xF&qcl zDv~DYHe|)(A{0Y>VB=v|VI*R;CNtO`NUREC;{;%r-BAyknQ-=%Z)SLRHv7j=XheY8 z6Cwapkd2=4kDWs0%0DSo<}vQ>=j3!VzZv7b?pXM}Hj}IDjK4kmiXGwrc|pp1lgB3& z|6cKmOX*nO2*3d_U7xfiy4LBO+48C}6|@zvv1fLxvm1gPEE?GhEAvffik>IPhhPRr za$(=>_glNfUP89h`_K!iL#|> zh{#2(7j1fr*pM_%vjZa3$xrXhvFBik47eC-XIg727gvF~4V4uQ=v@4rzvj_{y_#t| z#R~5-!lD$PAQr}g?s89T*!x-S@}V_ouLTZkJ^vKK-bH4KCB(uhUIB zeq&*VcxR`qTAZRD9N<<;^CKe-Hu|gL%Z%_de|q+X04!PioJmzp%6~o+T=V5&M=Ez| znY#Wz;N_iv@MiA3s$_^ky62-<))Wf59e+k=twA;&2ZRsT)7hg^;o5iZHb zAwPnXfY|!yoNg%(sT3vvmNfwR1ZB&>w}a(;Vg~B*GT_XBW&Gj!7fxIS#Jv(@vBd6C z3Lu+dJF#|;qkg8M(NW{uEULzap(I*T3PJ<+eRxihWXj?N9p&Kf_7ob9puizT^e*#f zZgu8BUOZ9zsU16jY86GovSwXgiES@OM_ov0NuFSAjE(_;f>m&!uk^s=7iSdxul}Nv zj7MAv3WSbPG+t5hs%i%t?xa9PIe{<^oZxZV-`|!eJJg`i|IXzO0C3&K(}aSS^He;h zs5g>{u8yR_?8-$srL?bu`^I%Gvasm*O0c$Cl?+v) zKjQWwLtYMrxUF*(OO70kxlD0?rZPo6&n=;|+ zmaDXJs#K>_!=)QbZ90RapcNCnUu{3e6aplH^FR*p7uS~N|M?Kaze9+N(<3S`pSi7u zI2h}tk8`n)3d1r0xGz_oyu52?9ky>|i2~Tth4<=^a8HKW_@Fvw-{;Fjp{VK$UAUJ% zPEqZCe_aJK4jqQ3l?$5ZhjE!0U5>pm8%H6E_RJ%9j3KP2vJQnB5??#+y5?4clz$tn zS3*hNAJQ^zC3S@HD{2-@FFFu;;>TDQ!m`xNs)L1POs1C3*=!6d^qbCUyEtyC5a;G; zd~Om^Ben0bzETM>{yq&gqCKO>E(W4d3la)zmGX-`|I>{3;Na&eN==Mva`AO6T~$d4 zYtT^Av!;yCiUXi)cmTa%iZbk1`viG>M?zsvd<+w%c&xqbb883uguc+VMe_C#qSJq0 z1=XLxc#v}HRmH6yzVx5}Nl-icsnO}CYu((ACl_nh70Ugz>7AWUWNurqE33EFe)jO! z2g@i}cgKVA<}oq&aCa+Hw{$e$^S&UqY0u$x;!rnCQCx#A_ley>76H|;{KE*$K zv#J*UADYg>q3QQ~``c(3IA9-cZ4Zk(yS&E_j^SQ;BlWf?)Kx|$H`V+_lryJeNKD(VY(iPp-!`X z_9PpCrU^(2N$5G5nvNJ2!6lEN1wr(>;}$=_1#i~q=J($>DUTlt;D4L3rIzH_yt|)wD^=*tHZ{c#EQcweM>U__hAl z>!4uB-mUcyu&C4O{Q>lW1zE&dtlC%6pNaSc5NTnU_$(G`i|83sOn@}#< zOqUG+po9THjowr*z;vn=`V3;vc4YKZDp^ve#Wk$aaus+u3^MPZ+8FxXr3@#|;7IFL zyKpm*EnrK$(m;!lEViSh@fOGQ!-=45Lh3Qk8-|KRRo!yr#*+&E13CtP9VCQeN>uuF zpeF($se<}5@7s^<-^+Owh$DgA!{AbRGbSmo&aZ2ijyBt2`-oN7g1c7m{AULB&I!_#M%QM$&U};L{+p-VzFhdxFLr#!x6;dL3_X66<=4a%9!$G zN@!yFvjNyL0D!cJjcA~ptdkd?#jqx~A`D7&Z86f3Fi#QP#Wg)yg}<3>_04UQOF>2b ztqrep_{YbQPi>XI9Om3SP8%>ampHT}(L$aOc1CV>Ziawa(f`U^OY z4wG?CH~PJop%6Ti4SeFTV3C z6N!w18_I?RmwA5Xnm89 zOG7fbX`V`q5@JJ%65s&hESRd2WY)fQ0K4_Q9ZtaR=iM*MZhm!4dXTy^r2F1v!ThgE zs^_-`FOfWyia;xne5s@Dr^iGiN+hj{pRet>ysyl_bwyNi8%e^=LYhxV&CVg_nP%_q_l*;2m zRB!w3qx`SGbt0$y0Ur|+D=TGq<%wITRMB=;4R;dKj72ev&u|Ic%y{xknl+c`iEqO{ zTxv@4D!d~^cxmNw@cT-$OZ=if-cY|0YWBSQtmB$i>TAPqYo@Q$*lpn!W%ec8%@ zXH`=am;>WePG3k+b%A>BTTbSt-6rr8~)=+Dh6KgY^Bb zUy8Npo~ZQag)%PJD)b!iIDn9lT zoRH5e{Djz}_x*|{$biQ9p`lYyL(*flJOne?O*$W+oN#njx9{w6kz_`^)W8PA>-_T& zN0WBs@-RWm0Dp)Fj>(rSl_oCV27_il8mREvmQf*^LK21MD6_&=8|Ea3q48~&=AI*< zQW9G#jynk>lOqcVScJJkEv7K~um^s$F-KpLoQk$fDpbj_=8EDbk^lh(1UL}XsI0AQ z%%tpV(2CEpj8%vJS_J=u=K{fw-DFBb0vt%^o0?04R+O@8btCPr0P{@Ogo)EGk6BAkyE-GCHhgDESjE$ORt# z2i|*azKL_PCB;mcP?VHb?LA8)g4lVxnCK!864w|YNGmi}M(Uo&_U?Phcq2GYp(8;5 z>X!oJ@`N+a0pg0Kh-6=pagZqEBIi0Pbu?W*qLDv;hV}Lt4SrA0yU`*iLE=bR5RJtaf`xCzW+6-P`nlj*SR;u1o#1n#K)28D@yk4>IQD;pMb*){F?FqkY9p%9P zq@I5@(1QutZw{OY8Jo6B)GZd;)-FsXjhbjyP`eCt_i{1neb^cse8PKM>&I9LKnq28 z3K}R9t&W{-d_5`Dcq;}=?&fqAoOJQJ#`N*g zKpY|^j*RIlOBcGh`g1XArtTw6l$~5>#moP{2<>=rsdY03S&^2rreXhx@WP&aYDn}X zeEf4dI^)wfW7d&KXK*kMokj7C2tA!qYSYf6r<- zg&zH%&NhUl+u)gCC;L8mEk`{FH^oQWYY+P|fAuNTB*k}D8T}sX`kUz2q5Fm{p>JWd z?87~Qmk(i30H3|Lt`k#iTcY*dh_K``55b_KBG)7zUGMxJFodP7oc?ASM zx&j2}HDdtWGRISP2PP4vJ&p;Os_exV5mj_fuC0WS`Rag7LSy(8? z{?>!)r7(@iG+fafR-T~u?1q4ef>h1IN1t`QWkbTSFr%Y~GUz(aI`ueoWL4&0W&dq- znCIbZ6Ke(u!XrupJ4wzkZj84E`r=qb!3l6)OsZN#25E06pq+gCM@N1jXT)xGG0B&#PDYRd1 z8Ix7r!`{hDjqxGT8!HUu2&|<$D9~--1ZmdFnhyTnUo_JrmH;N`1=X#(QyPpVa@9oU~LkbP1$sEUmB{DXbWSCM^EXhsnKO(e_9 zq^x(%MufHAm|B)GC+hgOQq8LNKOj_-gy;E7PVOoxKN4n?9;!Y>J))w#vGsiRQ+_)f zsK3)FWn4_qLAV9o)0mgm=}r(K)kc{Q?3{|GG(@n=18Jasvoek;w%?B5{kA?kv)Sz@ z)%aTZg|*$3-z`e*Z-#d1@CMW)1PM7OOedJ+;j79sQLF@jXr$?=KkG;DN=h7zFaUMH zD4}gXPjT2jvZ$C_`A{G>uSB+7Vs2P9G+H!(vq;eO&qzycZkI4{#9c+4C@Ly_ z(m09md=*h?Z+`E#lsALZDUuB$e{~Sfge8#Z`IY&5^9~sOdFzh}hz_&Gow&7Bkv@X}pZL zrIwTPz5!9(GJVsw>*WW4oqs^6KUS@`VyZ9=DPxrTKrqh1>x(fYfCWmPsI+Te{B#^M z91`2;#Z3a3>9>HviAgc7>1^N?xYNqG&5<36{0^<37b6l?93#j^%u=+FIR2;p3?4u# z3UcWjm_K-CnE<#ohWVjd^FU3}98vmWgu3=U0w{h;O*Ic)j zUJb$T{xr;S<*G4wybHrWpc4RI{Vgg&$NllSrK`oHh90vKpGdIbOmu~(RJ{%Qk-{^X z&-e)AGRJjyH4Pjwbv=^UOgz&ZKdO8c0TN<}aPOi9S;MjhVjNPl4 z4U($Ov3w%1^I{TjPPw4Hgn(M5(6r<=34lOJ2?E;98wByP|Zqt3tZChR_(j z6r#vF1fM$)CGqQc&O2ChmA}GM)`3TYrzy!Ipr+3&37Gmda(&Mu$0TCG&2U89w#qNR z$3$^}RBU)pYumrx~hE{rB-Vl0UibOi!5v4fQ}hMyp8tt1lx*hpug&wgGd=2>ttCbz&Kr73XUq*stdn1u;)PP?CKs zX40Zd{!6PFIbhNMUrqqwS?@l_XHWxLBp!yM1Z(RVr`88Bu?he^1}I5M?k^}qXD?p+ zNHv1Z;;Vq49R*(eda&IotU~uue-PYPKSK^jfY#ac)=3Y%9=Io7k5&(HJ#HqRd5wK5 ze)_A+GykC{^${h(*#x1bO!K_w87Yif6pDWZgpn|<%^V~$iGc(~pw_E7iO)$fhfdke z)doK-BZ0nTxRwjGThA=*6ES79y-4><9b>*+aAUmdN<(_ff1)RB;=G~HJpEm8=f!6S zr4$&Sw8l9GKK?8k zrSJ26OI6=|Wk2=t`T72VweUo~jurXr1hB8apf5-Cm1F~~ zUQsm5^H1o1M-Gnn@eoyP*U`FB9)AtPr}U8pd{PUM2_uu% zbB3Kwi@Db^^w%`0RGM7zvQ{?>s(-=$nK`+H#ZX|!MLUGx zqk>J3#E*Lcu7t_Js$KDus7?X2l;7jHNKI3{JMVN0p*)OPuJ#7;Hf;d2__z}DoeG2& z7Z$`Qe-<-jKrhTgvHQ%}+1h1%yTjUEe>hpQOgbaw9I58f{n5zECa2FJ7`v51-~pz$G_ zfK4^?4Cos*yiu_X3;VRE`8*fxyy`mr3W73P)VN|HzlmkteED0-$E;d}%&AgmT9jfl zRURjXG#+K>Gz*1NUs_iKP<0=i`qxG# z%TXPk8-s#5lY4Z-@~iKikYPa%O8Uve0!Br@w;Ch|+Ei`Sr!N)z2g&NbI3>M&l;51r zJ5KrsbOr$La`JGN)C6_qRD8US4$0RgO5kD%?mpz6=X&ruoU@07piwDWx~fnbIKx-3jh5?<2bT zG6h(TLl@T}(aD8hN%kdc?p zpC$Ar?Uh*pL-G8t__XHmW|5@2XXuUE$R_le7YT=R)9i)KU8a_Ap8A<&Ct4_S?+y+O zJpTu@4#yKMSEy!G16t*>+y;}Ze7q?Pi`0LY&2gw&jR6#;$a8+?0|2l95d4l5H-nV+ zL7Jbh6W}FRj6|hQI~aK5Ae-zVZtG7UQhY(u#f^-_jtc{xv&J^pIhyvhswiaIK(#FClo ziOq2I8@4BEdI{DXG?S811BC(e4(F0^-B*zt#Wbs&!^C((@UKFVym^i$3Yc7nyiF03 z?MO0JfvDH>WYg+>v;~07l`s2S_AMrQiM?b3ysZSvU^%87!c z48c&3g_RDk`0ls9;m-Td3JX}7tmpEi_!hDyT2e-Ym`QczK@xxO=`&StO=?VQBsKqg z)n5hRRsWVj{jmbyrkq@(v?*AM#81jKEPw!paBL|#eqrp8C?ZE<#EyU=g;DHHZS;H^ znHFt0p&IBZKKx)8jTU`;JEbBkJrBFDHcZGt^s&xC=d>Z~uclPX9itEa9j;;;e>!Bi zR0*h753!Jx{YIYCiGil$&R@(x2-#uAQk;<1M$(7AYL_P6=6TLSqYak|cB#&`avx}x zEk4V4R*6_NlT#EW8-M@18~yB-Rz11ipeo%VR|-MtDYEJ4*w9;z>=_;LYr%cNBlIsq zYXCe-OO4}#8CsJ#`{ohwAB;pYO>9zpZLh#aq!v&&0t_TBLY~9T$u*WvlkvzuGAm=Z z37&m1eX3j?AU1s5hRhg4`8{5#*T#IFp{|xG0k<3BTl*y5GZGKno3iKuNm!Jcx);<5Cl36tqP1dEi#+c zn1Aj2;s*9HPn)GPlb$V4%Lehvz>6>JS$Lv&psYy|&#YM)5F@&_?(vU*$^QKL&!%Vx zfV0Fd#vI}u>fS#-Kiw5MFbhB<`WK-S zI5^>0s=P!aNG2Is{~c%N3I0#d$O~S60JOa$$peC*X1G;G%A|}R5+0OK=-m<;hiQVv zzg*di-O$Q1^(fM)OMGdNHpj^SAtwoY3vK_Y4i+rbl@3rvesq4#i$R}Kx0A5e`)2T4 zTD3d8U|77p?k|`GNBYnj&OSsDB``lp@mkdS>*t2G+K1ji^pOI#U#U~aI_z&GNwl&M zmbd5HUGDM^^b~}DcpriWc&_h*chVZpU5I}jx%E63vI%kdMo(R_UgXI^$*P?8@*mJS zT(v<>7*%cKxRsY*e8**}GXJaPqR2+YQh?5ijS(o!l?^VjyfT4b9mb%=;L)UoR)Zsx zw0)et+e3=-*}5*yJEl!PSC5%zELGNCx}Th+%0P=u9!Q96m+e^6Um@-EY$blJB{e!f zrgz)_b&}^k17Jc8b!GUsW!U<1xlBGb5N7mr29Zuys8itq8v`6f6!`65vxkM8jt?oVQfQw zx&B)w+;jHIV{J=?6@==fO75356_Pi0yuuz2o?oIyySTo{SNVHB=rIAobZCaW5@J0B%_AYLjV--@G^}*K*~Ne_*xR7SQd+n7g>mI7 z_UAFTSbk<$3^nPyh>-BtPX~T1bU&x}SX~()9HjlyYMKeGjJT~AN0UfP5e8c$2;R+c zjZ#~(9)f8BZ}};JQG|0bPrs@{`;`~7pDKi*R9?m~B6vbZzdk{m_`rg4)z54M4{b!0 zTJGXc8SbH>53WV5hWk(!^jOV8f$1DEx;Y3oEq$Sl)=l-vOJfYppJBECHBL_vc-UU3 zpoU5jy?Ykzqi;VtFx^a*W3a+QAR{S9$9%cWdjev0VMza>H(U%gnG8_?qzK6k%Z z1c)TIhS@K}%UM97{7D4~{fZw;Ocq7t^hACW#tbIcA2_meB`mFAGUQk&@|IdwPOSKa z$>m~je_e8!bLT5`Jnwc4pzl%Bmd{#USiKrAH~)3XDKEQQnrsM~zxppiX9zH%8(VdZ zPLSu*!_qSR49QAbZjbLQAUVxWV6YyssqPs|eywNe)v%A+wDvIjge;vL^r99q6RAKx z#dC8s-u?N}41XSnr;djj7x`J3R$8pm^V9DeJ(bO=(pr)7QqD&ue>x>E5gbruyFHQE zeGdS}0kh*E268T>P(r{!lho#q)jS;7;nk_{Po7vQezT&^8LB{C7`)mwcZ17or9>UG zh!TB+adZ??$+3HDMmN5`l8UeU!E8S#&ZT&GJdnTGRA>X3{k}F*_3y}?!ts#VocO2+ zy-7aQE5lE^23G0umIcZu9)9szW*3t`I{UmB5YW^DOn}+;)lbS%NYcKNJ<(H0wwvHS zA=u>PXfAN?&DfKA=FdXN`T3mkmxTJ)gRW!BLhoebfdvVd*f7#acU;jRjp}w|ARO-~ zF9F*JTkr%k6&xYU5(GfWqnunIq=*{=@WmfTHLmx2E$5=M9nOP{pOY{MZH&fBEi<|` z9ho1KIEFr8OH}&3t12|Pbw2+bXrN6+m|Z?uEEFFK{cHdZg~p8im*qfs!<=k2;KqJL zS*cPnYHXXW?U9e=1yKQ@ZV1GO?5-B8s_SDRyft}-i`9y;Pl0AVbN~bRT5wM|O(ias ziNnE998Kb_wS~V!USEJ0-v4C(-l;VUrXw^9CC&&N`4SCJ^)MIzeKQ&Fa-4KauqXAH zhz$ecPF%pT31**;ON9~f`Ro!jOufdl`el()Fo)R6vvo3{nkQ4kISA-2PwWM zm`&8P`mmwd`HH9y*IY;HdqP|*_Jm|%JDN`7WX}tC*BtyJ{{dZ~fp@D3_jYv%l04=}iDD6l(f9p;)%htSk>!yQE8-edKCWJZQeNK*QGhZ0a>tJ+s zu52O6IL%H~Ss6rMpggAE#yS0GeS89khB}Cp*Kat;Cze~^ z#KLlp10s~{#MOK6U&RrYMCa||e0TEUwq6A>!pLG4R&c9V08UTY@{b1?VY4x$zTCt^ zS27YZh+>gN+E2vwg>e)Jx_-YXGAl=&)&Xj@qv+E21tri*JdVcP<8)_J$Wji41)xc$ zw128_K=S2=pX%veC2p7GruSPH*hBfffHua~ek#;^J&WK)ZSr|@L;H?43)Z*=*$o>? z?~5MXN2=>+sE#On8FE3Q)KT(DL8R42K$l9(LI2Wc=D)d%NjRQjA^#M&UH_Y;($qA3 z3#OtS*A)4?3LbAN<8m)nWyCby{P`TAQ>g}KkR}H2O`{=bn>>LtHI%I7ZWxd zSYJxWcW>Gst2q@1K8jAo+z{gp0=hbO9B@MwuAFA0U2|h-dn_oKX@6L=5_q~IPn8lW zBi<`pe?758)GMONw*cN684MjrRFc+51v1ZwJ?{S;?N=Hjwoa4+V>=8I4ZGaFm9)+v z0TM=8jSu1xJ>+dWy}MguhvSk*16|={=+#In0<0A_je(bET!qfNA0|J)vuY{UOlBDi zU8ukq`uFW2@UQY#eYWCylGpvi41Xv91d&9K z7UtFdQrAyEJ9x?w%DQ4Cr(B!?X~-+lBqN#@}yr| z7Y2lZQqezZJ5qFKH8-fFtpSYumrur%ixeO>u+=1YGB-A766qplJ$;^6C4zGLydqR_ z{o!I;r3V6v4tY_IfhX=gM=p7(4ie=j%QDSNi`<=bmgg+-!d!;{1?~o^k-kyQ z#fWGlFeW*mt%{X70?@=>2Nxt2$5D3TjZDpVcvIGhb+oT0*6oL#oBPivv0ip2dYPdfGyi~&5O}k5Y$!cckaGL=lZHa!lNqaj9SN}KV+Bx0Ug8fgdCo8fVHIjnGO#_A~RU&HpVmU zQo|V&i$$0{mLfg5)6}h3#ixXSx*e`s0teF_h=TFamGh)W zpTA%;UBot9{AxUofg7~G{ zhlVzmc`*}L+C?b)9_gB`BkMf=pbO{G+LIf7S5MgyK02VYBi!EZpoEIz+)v6#e zBP2`I^u$!lPQ;)dGtK&1Z%XCITV}3pAh&B90r?aT!xH0}J_F0>C%(C)!Kvw_c|k8H zmD@On*14()l5d+RcQ4PLC?h=xSpx18l7A8U0s;rX!Eky3>Dze5@yKo=p51=J=Aw3|b(#^Tx$#iLM^No`|E#M&Nl9h&G%|Hs=g;D-IW$$PfmdMMdr zQ9A#VsP}^=A^y|P5p9o|ckv>&5sj|p{{!OB<(T50k_xV1)C$J=`7>5Ha7Sn64`#Kp zR5pcq39qT*=+_~MR73$CG$PDGRcWt(`~!b%ehCDqoApyj3e!Y5PkxieRP(N9JW(;k zkg)d51m;6m!;05yJo4$qD8x)%G~a5hLLp1j$+YB1@nG;<*a(%zWK3gO^L$b|BLm>ML4En^rXUaPCQY4Iae1>EPUwJ7i~EJixn@g+Bq@HV#;oJFSMSPqFgE9)m1W)*i40R z4CYgcraFh&%ekxINIQZ2uSM(2Lc4_&{b8v!;8(^Nl4uchibULC4B^aHH961c@IHcl zLMwnLS8nn!T%)%0N$T2-V1KWaf_7l`a5v7>sZWaS%I`|PL5*%rjrXe>-{wzFI1E>bzp-U0MNS0PtPNWy>%O1i6Z$JP5Ns;6S)njj71~)V0T7xtXXtQEQrIU}G9jX<@%K_otuX%w;VW z&T#lm^dWFv2CZnhU{>)z)#oV)Y^1=)fl3P2P}|awSbG=cPQuv7o8HHtzn2I&_LJj2 z!bw4iLeJQ-q_y-tDWHmNGz?4b6{f7)RU{huqIO0H;|}$yU&Ka4U*G+#qnXsuAf)0u z7Pwpe`j@orGB>%JgeX1bvi|Y0>(xR}?u$6Yak9@j9V?R{Ulb4&Gyht~$j_TuQ(}&v$vWva%IB!KKV>{ZxLYM|_ z-%0SU{jFZo`1DLz8?br(i_j?m@2d#cG+6^MIq%3Om;jayKfTg6I$$*;B#E62w*O!# zOO>L_4lp1{1$(VG{@)&p~`u8WLFS1q*KuiW?n}iA@X9nOHgfLX6 zVSd)_rYi@O?UtP!U(c@rdF-~!g?KA$%8^=hxxx$ zTnyPKWpaBOqA0(2aXR@Y}!oP3;VxIMLa( zSe6oS6(bda$mm6DcxyX_y)763ORRU*6;A87IP7s2Sl3@Zu`Z%Fj=oVK* z2(065FDx8#*M(RA35^foxYwCN93>i3^<2zmDUsKS*mCbE*DUFl8Gr@oNwO@02hpx= z*3u0lx)zboq=@Zwzsb4eI&}r4044BU%nuI^)Vhhph)CDg`Gih=8PF(-dLPE5$=BYG zNX2kbk!n{2X1#b{ZCB+M>SV+~eNH$8H<3rkzkOYM0i@epAAQlNtc5r!dEO#gOj3n| zJaHQ<8}eEcNF6b4roEv61zOA75P!!l)5?j2uq5wv4*%p8c3!}(WwlGg_layEOQi6w z?&@)eM;Q9N&^!Ilu^y$%Rcu1}|5f?^)8!_UoFvUf0KZm7b$*oz{)iSO#AKY#9j4!m zG=B=k!^OmVLi@tyo2`8cTT=UirXe12P z`XL_me@9F*a?)4qw?}Zc7`cQZavis;r(VgasnA61BUqJY-g-z!%sAV}RB3Kwx1UR@-?AUdDIkW=?II?D(=yHSgz z%{RRygcan?jMI3eo(T-L<}OF>EvRN30RUYqpF(c{S6+pZ3Jf6g)eQqW%q9hA!k0wM$Id5;p zs=mTAYLS0HXMm}kQ{Ebwo04lWQ(+qTWd_wkM9+3D0jlTrv8>Rd6 zLjJ-5daWk3J~`LBS5FGnuwgK;dSY*GSDDwxd&5o{&+WkLLu##}cx|D}Oe^o)6;W(c zmIjI~u4a?104MwMiZ15Xvq;sN_`PcvHULqPaihQ+Nq*d24n@4VjR3Cwywq2C7=)<> zRSLhyglm?gUqY`v&<#8SpUIedUq3Fj8JEU$F%pEKofQ^c6sl4~3QU%#X?K8=#EaQ9 zsU%Q_`hP&E>w_4p2nT~w{|Ab)-D3O`bS$&dG+rWt3xl%}u+>l<$#Zg&KW{uSq1_5nD+o8w%!Fd^op}#5raVgxEL3IGp$HLw zqL$iy8u;Lk-OCg&4Rc@I-!21@%aB?El=sVvh<(Sk(M(jC0PV0FJ z6Yps93unB_Yc?Un#w}$TtV$ukMDvKv=&s;=_VZ!8g5OX*9W&@%yaAwo4kJuJ=tq!M zFF`Y1^S}8&lyaJKlP{LLPU;op_%w`Rhf!9)zbp4-o#ZAXLDFzM%i1UdZcAB6$bgwD zS$gj6SX;eV7G@5Eudu_v<6`qD7PLAyeUtyh<#1@O(_cju-?%wytfQjO#3PCLf)Tu1 zfzPN~kS?;6yp%=EPl`r+ym>}u^AHJS)PY?$Gjc>Q@M1m3ZDWVTz9>n>rR+IK)U+tt zv#`*sN~lMG&f0klGJtw?+T11R98e_-c_=QNSSeUhoQ4>Wg07s&z-!5|seJH~35XeA z__FeUpO9<3Qh6!vZY0amYDyH@00;emcL=F9hC8@q1hV;p^39~PB=4w<)hrb+?vp`} zWNRortC9SU$+rd3{hKeeB%Ip5nVEEU>T6nWTqH;tG3XRp6$hdPwHd7e%ogJM1;W#E z?_4jXb?VX?%@8!1APzS85;(PCwrCjwEHS{wz5XZ#U-s*Y+_2)-3mth+^lT)>@s9x2 zOQqTos|63M0s8QFOj1?Auy2ZvpMKH&P%nJy5=VniAZ+nb5e+^-Z&sV8*Xnpkr6N!J zpCic$0t`#%RkH#1zb7usEXIXpNp})qM`dZ;ph=O27#GgOBBtg|3K1&i+8QF(X7QB# zkLpI{foGlHMgpH00%Fk$3n&k-P1P+!X>%h^>$@!aOp63eJFHftp9`7Hop<|Kp|`{R z3%D&m*4*6&n())QGAL?oa^((Uqjp4I|4WRG*^%n#;Qp z&SkJ}-O3LjrrI*Aya$qFkcpw!IO+q_$a`|LB5;Btn=@XBM5p=ZE9Xlama>Ku%GB`# zIVL!9r$a)lH_HH+_KKNu>dO2E&kM(+bn(D-%T4dznS3@v3irVcW6Of|#|6l9mR2s_ zM&v{d40*0IKSisHV}5*<=;dYq(_NM4)eKP%^5 z0PfThs!*u?`U*9*jS_t-{H7~_(@O1RsIwSIyYgi=8$HhwQ%tCU8hE;kY6wbjz0{jX zn>CBi+vLNIvMnreP>{wE#+7~d`&@g@OlzSf*C-*y&QGE(XX4n{EU}w3O5LC~#s6U~ zomh3E?3tY+(pm-x(oKnqfS1gDBzxgLOY#csy)mB$4%%Q}Br%{6G{mK+$c|}-d}#m~!v&U*b~=Ob=WRbvK+J(O4~)#v`LUgRMDBM?NdPjzd}eoEew2@oKa5GE zr>}nAQBOqy0U&fX7&FWQs`7@dx#tkLQd~5edEnBm%Og}_s+~nsUXN2s7nq_(tx7bb zCo=xCw)QKA=3&bby?Y0#mG8&k(F^L6ka5qosFRY0eoktI#$ryFz~678Moj)4In;Hi zx`OY&?Xs+lyJeXDNABLgQyxhRmLX*z!&h7=AV?x8DP{?->oIEbxM5`U}dCp(RgTn4U%}tNAd+ zw)eUV#xA>e)t+KB&DSgnqkHTip6m9b7Yrt4;bM((z;IZlh@S>hwiB}aXP0*Z$E)7w zQ)O_Fa(!|r6`rXD+S}zWJ~;;n!;P1aio9**vltbF7%m&oIx<*27a`M^^l6G-q zhBPP{S_93{0O%X}1+oJsn#ykk@myeZs+?)1CFqlzf)8l%3hW(}K`f8~DU6LO)`Ft@ zMt)N4%=nMiNMCeq)d(aahnV`wvmC<>Z~00)TyASvxFE$}1=h^8Se*YH_)igFDG`oo z)Q$u{R>sgU5})Di?;rns_kA)pkn?DbvU%A`DkZ5rTCeg5?)v2d0jaA4%d+UOsK>Az zv@!b3$J@VsyeW5hlE`h)m zeDfw=0U;GD|A1zf507%Fy;@LD0?P1-FHkQ48w3!Yh9*e(C884&_93Bgc(S(Stjm2R zMn14%?A9m7Y%??M;X?e@gnYuK+Hm_VkRyCie({F^&#;Wb3+%EU8n=P-}b`3hY7ij$!>OW}izBVi&T z{&d1toe-T@rM?C2vW!dlv2r%<-GD^7(b_9Is^*2Z)@jpob)5W1ySKltwqIK+Yv-6F z6a_6RmPxs;>RJ4DI48_YE@J|uoM@hNkO6J48cOMtB;y!@$rN#l=e2Fxc?1aX5c_mM z{>vWKl}>{CG}jFX1t0TW;(p;vn563pRC7+NQbxA~w6fG_uX;d@^WSQl6A(e93jZ|s zJ1G|y7Kbz(ANWV{w^tjfA8EK)euY4Q+)#LDpIZAqNFb7|dpBQlWzy6PNa$J1NuaNJ zJewWs=mQ@6w68+SMf;`W;s-yDg|Pd@hhh8*>$k!2uT8i?#1QTW%cQ^W8!SG3@HmxC z57GlkhEP>WX42bp6si||^#=irF<)>hd@w%fOpLhjjbIZR-D<5+m+!q-o_FWc5Sr0k zS$_Higxeehf{pWpk2vb_2||A<_^V$IYfSjmVsF3G5SuD}Aw)dD9{9`G_6Yt7OV$Q_F0cZGV_LHWjBcXxwycL^vmy1PrdyF*C< zX=zCb=@2Cqg}u|?`xorGug}>z=X;+!V4MWTNh##(yBv;c#?uyfjN_X?JSj^V&tiEd zvx0=~ea{4W8r|3eK1bWg1Tr`N!aOxBkF~Xw&P}@RiZ-=6L)XaZ*?~Lz6@UBj-x>>dZ z)9Z=R71HqIYAjsUk6!zme|+4!sZ`oEq0O2a@Mf^|ZQec6!AXDi9RV~$*DGRwtkg4( z3_mUqdcF?>z){i&a28hD%rY^uCC)Md<3Mn3cWwQwVo7(m6?>d~cD{w~s~Q!K>7q?* z%FRC4*}+Z>yN(!_>AwF?s%*cNe)>M1qLdRd8o7jrSu)47f#9$^Ag7A}p#Dq7I)UTH zvLnA9yrf?yS9hdV63~BqDhAL=ffROmzs|(*V-iZTnGF$qVCFc5@u9_pmpGDE3jv(+20NkTjC~h^uFQpVJyoXg|UbB6w9~6{r z{|xpU;eOTH(1uL{g_HatzSalA@jDsl5S9$A99plnV_H{V_tGm6qn&iAoXeOi`JLiW za?!MBypt@GWWly8gKdsa`msh*A5=!Yo(ZPupnPL@KYZ=?p0eR{u0iJAKNbs_w*99^ zwVuauNIS{#HX~Qbv~SXFxQRLxjuvTTD}~_?2W!67TqfBSYlImk!+VWmvA< zYwv<2X%kP(>gNlc0f5v7657vN3o8PA-PDu%?^RN&$z1&1ipSYKXWr@cd|3K0hMmjF zGZ$y*yZe!khaRKR??n9|rB>FMbaL9>`RlCyanmEw$^-XxWiIP!nL;)4CE}klX08M2 z?@}GAtg1XIk8MGCG_6|40sw=+8iI1xEFrvc5vl5YvuFtG2)*3c@R;H2_dlaJ=rVH) zO2a691f#be#An+dSEl^Ok|t7;mf7W<8mM(Of5k{y*(YXG1xy&p)(p?$&M2Y7PZx%7 zv!xQip8x_c<^JH^_(!Sb1CsJ`U3>(n}o7 zywyK6sTXcdsS)bYIB~bvh?6bR@G#^$k3G|8g5BiR-`slKcR1K_rd|F8gpB&qmPB$S z8WSG14!7ypkPDL~>O&d;v`X2&1XMM+LFBAmajw?Mk2V`?Z@IM>XocD?E^hs0Pe@*_ zajZm%8O*z+FqFQkyicG(WAUL&ZI{v5xYR4*F78#xz3%(2yTXG5LMEcFGV|~NCq=O* zdvuTEkb&O-9(B2ZW!@AtAEf)oNw>xBVUR(WP{hf8zrd#^i#p4;=?CvXK%CuVkIDMd zx<9$@__$Uy6(3Y&n`EYG_haFMvegq8ICi?G=&k(a(;NBQLkAl0{a-)_a2$F~*?MsE zL>OVET@-G!$)yM+mhjK@AwkGV}zyXBW<G<90LpuP6LJO@TkNY9iZoyK-4;Y zxk}Pul;nBZ%xm}?45L)0hW z1V>&`;0D@Z=eN2h)QjZ9@K%s}Eew@xYenV|J@+mb*J~0C z6}uN$USxPR$2c1m-y0C+PFB+q{fE_ofuCzWVZWGt!)+QHm2&uZLPr2RdQ-6kWEh)% z70dUV*g!EBvX?82%AtN)VfAuoz8GoADhn1hw_Glsu6WBXA1xi-O`ur>&@<*ql2{b2 zkB)&J+ib}qv`#58UIqpTu!4^$TD%`c^MJhPpQeF7g>9dT5ag1d{?K&vTZrER$$#&W z$>{?Ca?mtrtI!O9f}4?!iE0^hDh#7!efTBbviAE}$t0Uk`+m)I_*!2T^ZwEpR}g{MU3=iq{Q{beqD$m~4Nv7fZQu~GLGirYyS##TafLu12+u>Z8J zMd01Zx7s+Q52snw(jfZMVMki6+Ye20rjp8^gLSr-r}SOi|B)o;AaFqw7bkK;uZUT0 z!?8}LeOOyrpGtP*4hyR}>)b+pQB(Ce$LPl+iX!Nd<~JKB8@{<#tw`L_h~cQ0GybFh zEr6ftXx`(9e1=yVn{vnLY40=%;O;daK`~%hn1=n4{ArRP=smrUT_C5N=-O8Gsn7atqStgJMy z#0sS1vP>Wc1xJ6t*zCamZ{vAK4DOFYrD9gK4CdHbfjWq%>1X9DH4KPxvI||6Q$(mw zZ4F5=f!4%g$jf)LJ9JWgOxX>8&e_OJG~5PdZf)Jn7guAfY4q9zGa`d2g59mVRMl^A)T& z-;WpV^wt|K67tkgEd({njmvbr!XJ_k( zhz*WTs*s%qolQGq0Rh~{1aNyCPts6*5o<_;e!`S74UoV|JqIg^kFw*0(E>X2I(YN5 zy}dO*jde!DPL4-qIdfns;VTRKdO{o2JGPbb+RvN9bASN-8PoFX-3%DIyex?)r#TcI zyPn8Cm4FrXK!|0{T=2)9U=(&0CU>5I|G~(+>pI@#;3`)^OiMUxS&x1Fw`kG| z?Y_Vv?Y2r~XIc2;YVE;RANA(N9ioAN7@WXrw773e_3sh<3joLULbobMBiE+x#P>&* z(E~wPD|%GmDFmIF+f6+@2cKE(Gw*CXuii~`+BZg$5DIb<0lRQt{I@Zz?2IJ0|4p~C zydBH_;fBF@U1xqmGMD}XO{cGAjS{cYx6@@Sch;EtkuB|W*H)JE>PK5r_VuNBf}an7 z(grD1k;%kZ*s#lYKn~(W=xlTw=Xi~3=_wnv zIg#!vRFQXSeP|crtHezC5Y*2Qwh1r(3K))wW~d08u_AUB?=Ef$o$mYWda4i%@vGQ} zDB|QRr9zkD05q(|S{ZJ#MYdn{Z41~$rVP*Vs^9WivwUy2rW`v6fWO`ySz(kfFAv0! zBjp9-yqBX~-?hviKN6s|acvQl^V||QPYf=^QpeU^{X3zfFfis2*EEldv?pN|Qx-0h zYdWgUL|+*I5C{N}eRT#AB>FO8(`v{)=`}6%6GPJ?l`75GYVxDl93Y-^ktU^Y&DDi1&hiRoZ3V8Lsnp0nyvi&3IJ zblk=Qh%^7dEZ*XtR(x0>^IJ!GP3GEIR8!hex8?9Wefy;4WJPkNVwmn?V!GI8W4Kn7 zN3A~myt(tlu-2?7&DZc5OaAhk&PCtLIY`goFR!RSPYa;U|} zU`&8q*jETD4Mj>7<(PDZtkN#e$IPnhVvlNkf3idJO9(s0Pc+o`<1*_S*{(tU{xJ*s zvQRSgz%E#B$`!$&W`s9p1eKd9NfPvH@uePLcRRUs`e=3GN%5Df!i}% zcaK>U6+0O*vz@dGz)@s5%f@%k3M-QUJSC}^9m+x?E4u8>#?jgKVI{d~<54%O+O3uQ zj&~cews`@M07lf}GbaN4BI}A7rawMnTVab2eetCSuneVKCp~G~F&%2`i>nEC^ zGIn`+lFX${rZqf2wHb0nc)=|~~0=A}Lj&<_7c1z&{W;>z>mB0B}fVD`q@u>qh_VV8$`XH_Pw~;K5rdUA5xm+G5 z?6wd#uF#d&c6wWLBoum_tzVGx&Cz&wa1=@F+151}j83_Th6WnhG($5zT4Ai&HuJ3Y z?slopzG@fVr{-8<^AAe51Dcg)pTD1@8%5HU=drnnaRUfYq>`dpA|hO*c7RbM1vem- zlBzpeN5_1Jrht~J@Ja&lig`zdH?%D##TKGyH_d|MxIK!StK-hr!I%^N$ScC9CM-TJ zqf|Dk;cqQ_AD7SL@x0{mI`$`3ak_8+rOTa$;ebOV6?5D}-C@j>$a6?6)QK0w8JeYH z*RQOqG^il05GBTBv5?Jh4ue~Hx3YfNJ}iq_VhYP`=m4M+(pN~+S4RpJSv-gC>hcik ziYt^wtJC2!aWZFt_9<(Y9;0KSgzW+m@fE7z7nevH!MPGNgOg~@9&y$O=+g2=D~M%2 zsft|PGc#9OsJ6i~=4>ZwYtz0k6TWEC@1JC%O1jT;`MlAiE{SNZ@?ui9=ZkyBLNOue z8YuK%@8|;yS{y663!CzO_t&S2X~5qJeG3DpGI4NFXiEn%GgF3RQ(X|7y1*?Mv7A&rp=$?)#S%-=6aW zUh11q52z$yJD(Y@wo9rN_S07&>*9En38|J2UPLYOrHi00g?(;EuR&nxz@M9_gac$1 zrjTPxGQxBvL*(}*U7#a9#&%l=S}W=ILhm-F@tZWa3?37F=54iZ3Z^P}`8AVD=CiOr zCj)-(zPxP}W8$oOsAJAeNVGE}fw}($bOuzNo8qXaa369ft{6?n-FX;t*3QQjFm6yz z*0(r~Jm(HFV3#e}mDSid5i(C^h+MNa#iT{Gj2hWJE$4~I(B>)Nv2n_MQy;ZeZ7`j* z7lk@U!8%5){WBCZZXzQnb<)K(m0qR|O+o&%OD#a2m4V8ptT(O%4!@dT05j>J6in;8 z)_ktx!c9vfBT!Zx!h&7&CaZPU9(*zFbRDkLa*dchz2-l*D{GmlxuA=5aJJ~rdn|uy zqrN;d%&M=hlAHD+?=i3c)d8&+=J*Tf9NBAB!OtN+J`_yBG#ZY_>NuY)I^hXTm6~$` zd9=1u;BxI>ywKj)*62~2$wiguSbb%ys1b*W-OX1pL0Y!$rW!#YWNJ8q7j}(DbDm;i z`3utK!X+JzN9&-iKKB&TG(720gdK9*_Y{J7@>zc`l#2f>A?v>Gr}sOtS^*;}H0Bmr zqB6B+Kka>rBDk(*4@RoXre}KXVCYP))`KN=|)De%V`Y% z1(YWCs(zCp;9vBZj~_+D-aJhh{wLc$3kPF8=W;FA1Ui!1D~IE*HZ`-dPe>1z%kzCO zuFZwMa-kCpWk(fNXih5m#AHAVIgGUW#a~rw4aL*Ck59v72y=7zaQI4@)Mo5Ogr96V z1j8;VVywq5qBCZ2hTBf>`WADKk>RKyYy5~h1bKzaP&icJg9#m1smgBO3A9mvWLkes zU8o$xwPYWL)9a272P*2v9nW(0?j`Su^INkpD&D}pd`u)F3aSqI$p)3KiIAxOBFEh! z**Jr^a#MWiujuD1&0;+TGc1Yy_au3ak|6kkg9EAwtgNk&&PamHV8Q{#%92A0?ND>8 z@KEj%4q7(vzGgxG3)UV*?WyM9s%*+cvL+ebNdkrww~B*{JswulE07%2*NC9H^y&ei%ViT@dshgy=Hs+sci zl;O0$E~4W&rBJ5y96IDvA^)AWTgaKIkH+M<{iKp%uz@d6Q{$0Rnv?WXN5v13=$J=7 zdZ9$61B{4S2}l41yf({7LYRZXJ*f)!^?~f;I#UM>2*EUnVFqgTuB`6|S`t|$@q8}X zcIG?A)@LIzQd%NupsIvuW(79KD>SHeWkq)7H}!S&A1OUlRlN`$ZMbNkC=^xaT?>~_jwJRe6(| zK$%KRA}GYiIC7G18^A)##TstiRR5Cb$kHs=XaWldDsMICQ^ zoE7>Ozwldidt5)iJen$$oUvH*&xy!%UfApMje(hG+h7wLnm-G+uwZk6dpsqwDu(#i7BtG(3^}u6{9KvhzK=GX9SHX z^aLZ)H^UacC4;*Rbvi_rP)QO06{>;Qfw)&%3p7GSGqYMKdK=bv7S=R zIKJss@!eL7~!Z&_?-weZcpB4RDO?E-e!J+^B z-bOY|pQyufGUdBS01TO3_Lpc>{hrR%U^x`)L2Q>Uoaz5}Hn8G|M$D zB_U@1SWH7^@%IwqF=edCoNa~iUoN(atZos5$1gcxS#57kYTqAEv14ofcc2igAy*{U z`c3Zknu5CQh554N%F_tvg-=F+1h%>L0)AntIRLT*FR^o>BqGA`o-Y7cVHUGG1{!bZ zyQF?-tk21!OY`@BfqL)(EJ&dc! ze&IdY!lvXmF;b%a&#`s_Q2nz7t1s3J^-nq|LEaQF?pWy!{nD&EWms!lgF24)Y{_c! zSx|x+sWXIyNt1Q=HpYmc^KQX|9j90q;=V6&2z4vRs8F!d>w>8np37&-tLln-&{!2+ zl{ieT3N89-5wMNd0l@3q9kqIdQKv`W&-amu0DwdsG`c*vN*}G4ZherM* zQ>Ze{YH)E@+gz%|w8>0U%Ub@regiDbKOQr~ZN|ki_+fi5GX?3uf^B03L@loIF)1_} zcWk#3n{g?gDJe$rezPDV7oa_Fw> zN5u6y3j$Os06aFG;O) zNn~GkI~h8zqwzUYQg5l5eN6#9&e1fY6vU z>^1#Vb$6mm;}a`&6@JQN`AqH4{iriw92^q~H;EbcB5w&8N0G*~bT+D#pSMqurq}Lj{`@kpPF3MogJbDC*1{^$K zo4-?y!<0phg^W!6|A3Z4xjD*RhfIkNkm|A&t?X}7d~90VVZ0x3{*d9q%!YJq;PH+l z^P~e7>hh2MyPsY}*?$0`@PsZg+GsONkMD%56&Kg7b15{d9Ti%5{TA9%_g=l2d04#} za1Qs6nZG>$)n}^0t67kgCs!-yM%UkSu)UNCutRC`lG3U;G$Ivp+?$M+i<`eA%fr7N zks|b*VCKUrk+W+E8R9toV?rV&9OqIwk!o0l`+FTgB2c~hvgm`WU`PTr;v=^*mj+Rk zhEP@e6JomSUyH>VNOdq9#!>D83}j-`&WNo(b68ssF3;xmx_)@EG8B|PL`61az%KzI zVfxA4=1f8<#RtZARnen>sE3Z_>s#eoVDtJW*5w*c8U2Zqh|0NG$R~O?@Bx9SWk@3( zc$}J?I`}cI9dfPDMeP$!ZZviraZE!9B9Sgn_##NHvr3CYbN9Ah0ZKH=0s^oy3yZU3 zeS2^EdhqU>zMo~5QI!slCSMYZmt2YQfRn^C1c_m}K4TMt2zM`b%D z%oOb^ReYL%mu=*^3h3jQM(Y0(s}A%_;&|`%tB5jzpwzjVN=kc@HSvW>S}AMSo`iM| z>=ZbQRQfP{4Ld?E0dHx3$|A~vwd4MOK3Vm>j8D2I0`~e!0L$ zuj4wtS>0R9Az$fIIaUg*_IXjI38jKJ`C))Q)(EZ0`$k08i(j9_KRt|>>>62=8|yCA zz@>S01Ao)Z8^+ED>yI?lq{A2_i6~f$r!vt&C~ibVkY`#v*(52qRKDUR1)Qp}6l4VF z+xmx)N}X8{E5%yNPN0#)&oqL+R?W%&h-Uwg8Z8ia+OPycjK z)p#oUMgH$U1jiZt#m$NAyQ-+J$jnGA&hJ4Wp3)IpHVaW(v$1R_^ZoPF6=&G?%OA?S z_s&Ep@-_J}rpE>!MJ@0qCdbWInKbUWU6Ef^IlCmonGlOW;Di|amp3ze^ zX#7T)`~`%xOTgn(!~9B%A-xi{)q4-xNq zv(poCqI|B1f@*gM%ytZck2)av>a~|!Gw%bl54VaRl3jLqrK0;JDmWYUpV)YUNINb9 zdLrWD8rBIR7aCu#xY%j#`DoZDv(b2Lpo~C@QUm%liE$VMm34_}t2inIc5;3Ydaxr?W;OF@ovZ1sxq1BMQ}q zk90$_%wa;^+eGh^9vyh2%T!p@lxFzs{q4)vW)u_*O6X1-N+>a6Be7vu2-k*}>Vyv9LB^Lp zBehFa->j4(saq>(+20A`lt}&`JUNiw4PF@QOx{cw0ozqH) z?*Z@LeY_V%=#O0hb?2m>i|D=Jk&+B=%y^78{SYQwgi0XQ(55lPIl~gdL+I0q2_JMI zyXtQ179rs;2QAtj8c0X|0I=M}$NR}fB}xt_8zPS%UL>syl*%_;5or$F9pOwbg@EP> zOGTHB|8sEn|EgCWfkoar;vAZ(^l9~*=b|s^vKvW>`DBpT7oG86O`q)Fj_aNsWgj8+ zOh`b;&wvC)o}-+1$wl7trFD;~Z#X=# zBF%y`b8*wH!+mN2z+%eU5lfhH3o)D?SKT4c%*e58GTiYZ)KM}`#2zj2na0*)xHSUO zG|`3Mxb z?+Ws9AZ6R0_^dZKxitPR5ATXu5rY+BKogaxcCk=lG_K{8i?-d7&{`Q~*?IQ7lmUdn zH=SBP)F>1PdCe6CT!+KK-nXN~2}|zbdY>!f({E>ms-UPB%taLMWYHJ%ODe zP@zz&8b>``RWxjzLZ7YyTLfbKg!i9b{LNJ!Wwp>3`Hu1%bE^Ch9Dqx({l6v{Bv*gj zA*m+rIOLh^K$(!Un$R4^%KmkP2%IifiPY4Vfym9VSFb>8=$&B>fm!stHs4}zaEDf` z7>Qb6z#>p=ExXI+dj<0ZOd>X2^R<&lTg$l8U!aM6_1;aj20PEpH1Kt#`3g|DY)|q| zVYQoSkNvxHLPEMFDdU96}S#_R~zY7L7#@hmK%%ik=?N(+6jg zyEtA;*xqyxAdnF~G-WH4g8@w}Hi*N3#rRu#V=R^J zDIMSk&(5FPSX!cL$)f)hp_yYJd8@|KY^llehD4s|HdAvC$e%%Gw{HGz3Sl_aqrx2J z&O_1Z_N4X2JgP3qJn3YME=&3-jr*tN_esB9I~0aZg*LufzAT!WtD=&ZEjaP(e3!kl zx|>;$ec5*JSRcDgt*oQ*4JjcO3C@@pK-@00`2ygC4ZV5Ap%c7mI`R?5xlvaD>6)5a zZyvjB_R!0R_2^-orf(8y(?8E&FZ*bB4S^v2EgR;qQWX{^dQi)hGcnLphDY4YP3_k_ zIz!bbzm+y<)SplRP}-3My8;=%Zz?6fV-3wt`PXkK2~U$|j(O9u|9=i)|Fn`$K)!cn zkUI6hokLZutPZ6)S_vn-s|H3JO&NsZ5D-|QM`u`j+hJ|eqm1f9X`hX|*(h_oS|krE zR~AIny~m4^P(C9IDMdJVXk;|=50V7+G?FW!Cc-AM2o za6+%M$Cgj;n+n&H>yF)`X3%_bs(73BeD%mp4wby@V7hipMwcPjUa9&;fw>d8l$vBpk~i z$sxZr1w7L$NbV5RgoPSk4D1Lib|?=tHG9ocbJQG%bDN$I-Fo+DnnG+lvvwy4vb2H|NUr zRhv!G-i=mv8bykfL8)8f-1d{@BXb9Gk9yNe6dM`(2Dcy}OiT`bpD$D>{vRoj2ApMv;VbI@c0`C zsELCQxs=qZL%N^OpIOEL(qZ+2G+v{7e1c=K8vQu;W&GEMQBLtrnuPhynoF)Na>y*D z!42H}B}Q~h4wgY`ij#-?B)yd6=|t=v4M&24@gv0DfxYgG8^{MgbqBIeV zL9XbHEbk_V`ax(y&@?WAH&5jdcWR<%S zCCwX4lYz^nOLusH{=q^h z@;gA{@XsfN9b_km`PnDahQ9O>u;W^gob>qhbWs=VQ6GTm2RLXGRmR--33g%=IgU&* z&vr}klwrq$+R_ALS~4m9c5%3nOF5NV(WPWO)( z%O6(YRfD)g^fn^JB;{1zE^x_O92pum^;=$7Osn4T=f@HOJ;5ACk53p8 zy?Y&C#p6Ej5~y%w7tEVYefa47@_lLzIWHIozL#g!SNxFJvw)Fx~=n0OSu@%0063I z3atUgG3AD-!i&v&I+joMs&@^nYP+-)J92UK0Q< z#W>z`$ylvrm`=;g$C<^pI6-~~zINZq2(kdL%||E6^OzdkDrf(j{|`KJz5cFb&guMrrXcAY^Bp(vfCWj;2*G?D#ev>-!P( zEHc@(OGyi$4$%&69VouY*oxrNV{_*aoNjPmR<*+^V$*{6+lwH@+?{JYNpBR+iDV9RCriq_~YU^9))}N!kl8`|S8_rpbvUl|6 z^s&%kFj1U-|+;exI8V=5N3K1%#yKrVC~3ktE5hq$8$6o}AFg zQ9lf9ML4q~eMriBPI`dlhz^dZL=3c>yuPK~li@olnxgTx1D@%mx=Ybz)n_{_U6l-J zf8~V;I`kOn6-%$39GCz8JiBG^^Iw<62LeGiekt;ER{=c^{KhV0J>e-c2C=7d?mc07 z6jN98b_BW4gl99-M}DNlNhvIZdaD@Zl7MyFUcTAHn=HsQVAC4-#^^sgiGer_lxB`J z*f~=;v3kT<8cP`aBQe3wlD|9@xqv%@sXk8O_ThX_8?)HE$Mp&ZvTCkLO$=B@TH}DY!P}H>i%vmopTXK z9n;!h($={rTD>=hArIE+XfYP8FYkj9Cfdom{~T+`2!1<$fxnGpzG+nz;an8;h#AEF z6C6V7q2`4_pJgVL`e6wgDxB@oJuxdUyXV-51CInb)iNzq@-C+hf>l~#jQ-a`|8yxgO@IPZsafZ0pxNPb$Kyy=qk90 zB&HF@PP~fWHw%18bCRl17dJ|1ZgloBnx`(eob`=H!LjwbQ6p5(5`F*c*|FT6tJv2k z1JzZIw@_uJ2Jv!da@}UU3YS6WEBXik0^q`5?98`Dy%?w2G?#sLq@poj{n=QOT83c++h{P&*Y z3@F2o;N7vc=ut*YG@~LGuYCsF$dc4a4b^k6oq_EyLP*pLJq#!bJXvbJn25Q3#7&v*vU~)??nyyANkGn<@E}i?S>XQ*fq-TZd zQw2|D%DAwmeLY0Pw_r)`g`)fv9(itwZ;m0CetV&BpmpN3^a}ULV-S%{}<2+9D5{MlB3y4I;M)bq7o~BChtwVMlODx zdq8@ST*xgY81usi^q`G2gS9ALSu5LI>Ip7qj)&B@s&5W;98>&=G1|`+=NJ2_bf4#p za(_rw5oH{%+qZR+Ot1XNA^g(bK({Ac` zjWLDGQVQ+HQC1hgCjaTd1Z$VVk~|4NODcDtNX|>ef!HX@NLAkIsshV3n_)}0xj3{0 zNb#PdETgl?MjtjvoPtiqBVSSPL9yD)^cN7a)laKSR&XT4%HcI2z{LzBT^G`TKuME*#7nD4=fnF*Ka{2rCQgxXZwzHPQDL*4*Wu zeCHwUixo{8DB$WQ1(vPEA|z$X9@!3KVx}o*ulX*Z0@C?>F!=H-N&Po0SWT&*7Mb_> zf3LnOljHR-L^Uw9*-2}EB=IT>4W&fk4Z#c3vvSlVZgD)Y(=n2`1l33TAo^5#N(>7C z{>XDSfPl&?A_{lVw?oNd#70W@As6$I9U2MbNfF2-;p?p$cQF*Q!`scWbV?+IO@@$h zi3`X|ttk)^l_9R9=pg8uMF;85@MS>06b?G*`Ho5HpcH~gk2DB{QVx$H35W$9R}4nlcl*yNjs3|5rnA1B z=_YR%wd@G6V1N2bhqXHgR-~>#eE;+Q#4O}WI@&q*Pf{j|{mq;5G>Su!big*3J1S)l zK|vA*sesMIaC<5JluPPyyi&Z{kL5JYMYBv*4>WB%0fl>Q>$0tT_7xg3wL#!uIRy}? z{P60Q1v01;_f940B?UqtMTF#^jdc$WPGo!j*9z`K!JJzjd+hJ9)rkL$94A!zgWQYa zQWG6jc|`2j7GER6>H=cNh}a1~1;L=m&=FL-$pQ>wjv9y{*Kou3>SQyMiPi?4H^yNVOSI4wd{IQ7oa>@!J8ZucRrDS!zON}3kA+B6fbWvEj+DmB&) zp>X1!Xfx^lh@R~jcHHOGOP4=di}u%U4@?uC_Y1DC-n6J&AzPTVtb5c#5M82k`D1PD z0?RCt3ntlZzl>kDElXbe1^u1Sb{LLQs;F8E7SNycFgJ@nfIV}%sFf6wmHzT|XEm0A$>W-YI8AsVa}z zSoHO{FpSApCws9ZRu67db%ZBPNjB;sJe6|vv*AVL8v_*VSe)l^olQU7>?tV8QlDub zb&)NF^v?(1nN>rHNSI$sVE+Y#j47fRRaOJH5UOXM@%)Ir7v}B(0KigakaMm`rH{?E2>_Bt1QYTu@UI#v`m8Mj8XvPj)D7&K=J`{npI72=x8H4GjChukroU zLj}&Ikif(nYKrC|a<}!c{)bgx%fhp zMxXNURpOyj9bLDGx<1w3zkrZoY|64?_00{j5y=M=8GSpm&nc8_R5Ox|Om3rR$vUF>7M-PilR^NOvxQYQ zD1zZGp*o*0bQt!lsP4NShO6;Sv_yuvg2KH}x}~-tSRaTePBOyE?WV&J9e}9m z30EwPTnfyuLb0+^dX;0hND;WKnTzwh`L^>qNiuFrh_x0mBp4l`3m;<4#cF%7^PuGc8fZX+Y>h1FivlsHClnGLn1bcr z2CCo7Tg!oyxC%0qjYp|@9+hk_{h~!D*u}FC+3jrst?!l^H+b>o>`Ro!>W};Sk2B5t zJoxrC`Wl?AjtYid|M%b(1{Rd$Rin@hb;YZY&d!BUUTOnS!jmtvvTHnWXn99$`2Q%7 zvN>=(yd?NOmow@2fibM7*Du&kUE*{s2XSGNOy~83Wa)J$=BwK5IP5O1ay=6@AM`T!kEiCqntDmGQGKY$HEAZ2 zVDcH*>VPfX+4!02`o4myJG0-`gYBN{UcZlmS}i>+|8TD{wA!El3GoIi@M1W1^6PYpIR9ptuMsZ2^X)^Li z6%W~?!ct_ckwlytKD$AqMaf+#dn%p)ppY2kNk?$%e11hxvL3@f;$9cNcRAEbso-ri zNEKS6`E!|IX5APLcTh?B^Z5}igCO0AL?(Xg@j|aYWoV>KC;3%foamB8;?qcJRhg!b z9XH|zqR1Rc4gK*K&?yLKS(Il6swwT2R*@QoTg~{n{$qLx01fg^ZID8+|Ai3tmhL2_ z&PvKkW$rQ!^JeMjYpD4OW?f7qTE3YQ2`3$gp>Ln|uKLW!vX`i;sA!XN;k=*2X=XeVOUJ z(h#AWQ}eU}_$LZJh2u!G3nIB~U~(Okd^$GI2NXyQRcP^Yj;hf9j7*beMxULBbAWG# zF9nnu^ogcjOSaTVKqf6d)8p<)iFMOQ&$#7f13$}^9I9fdBH}XRMIqrV0;Sr*q-zi*FuC@iAh!l z2>Sa+99-{^XoK~4;o3QwxXA|68Kg1<0=t<#b{(s4ozm-mJb&@j^*A0ceknnoy?8*& zO2f+K%b~gQZ&N@9UI3YpfRO(o7JDRF?^wTA__JUH)l?B0=L8$;ijsoV*4C);-ApoQ z5|^!YnK+MdLee?PI44%cVqPoiY5SV-EN!8%jZ5b>6$KdtMM*(-v4|r+j>vQJh{6q9 zDvr(B0?2F8P4DN}F(opxDA=2F>HjjncD6fg^5UM<-pml}K8Vk@xWloimw? z`ZdDiy4shl24mUOKHBSo3E}iA7v`-QHx2`OoG96L@3sycm@I3L4m6K<1`v7yd`nBh z)!z6s|Ge$U;zhXwelQfNQ>Zt=)h*)J&*5DXc{GglC$ zYxM^^HulUlLT?Eo!;}0YwWICUh%{mQ$GWz<>8c`T^|5ssoPOvPPal7MIQjlmsi=A# zi9kFEurD&W-`@~SK-(6`+YZ>ZNTVOV!(ibbfa{~=^tmdh#KlbIJM*A_Q0yI$q>Ue`O+ygqOvfjAjBwG(YKuEoNJIo=(m>|zH)gr`Hsek z_dG#!C_%orWAo+JwDZ4_B*wZ@wscv1e^1j(0HaqRAztl0>LDrlSAvMMX zwAPcBQ?uOVMWy6a6bvgC1uVkHI;?3a;Mi$X9x# zH#1W`DXWuKlmb!u6$8yd~0pcDqCI!p+x6*Gu z3EzkP?g{(d_Mkz}B(c^|!P>pGF9%3~fa85UPkTfUvdB4sWBC+tQFB&S(Y0EIaFoWr zm@nuwCd*QnmB3TTT+p>Ie7C5S_0q~vc~wP`>_gy`gFq&lvKPBXmKSXb+`kdE$PRP* zv^u?i&o0Nj9>=fnuMVLgl$;ngmeznL(QaNLjE_`{rr(|b@(^&xg)`$XM_edRCG#pF zybM@)K0cnEP_orK?*dUfK;I}6g{$`X#$3cby=v^H7o7TGi!lh8uEmw36N`*e)=f3J zOT4a#{=WT*x>kx9`K#XnWrjUT@)86K2ZA7QmQ-RjyYL3TW}dZS6O@i@f7ay!qTz&5 zO|qh+l9JDHc;kKFCl;QKMv1k? z&^Kk8&()Z8mj4050yktJG+`b<+uF*k$heZ-ksA3434McgPO?GQ>I6aSv}zl|cyi6vdAMK`iM!tIgrdfCSJenV0*u?>3nFx6@bJ)RxEs(9JAsK)BM#73tI@T0=~4S_2YzxQtNv*LPD$?cQ96prGVmhrV0CqH*b4R!4J zg3~UO1bp%S^8b#ph!~~0Fh@?-irmow)0ZnLBX^4q$qST)4rK{? zN*E;Qap#7Ph02Glhwb*&-fyhjNjvf%pI_*7hd!O$OY}2xv$${wwK`u0u;6%n$oGI- zY}@v|YY(lb6pEQ-IAAj{slq)pG|8kjFo$(gzqeOw#G15{nTm|S% zHy-xm{GUNH7I^&;Mt2E0fg$TSWF~zy&2g@hwex%}@Vl9E{57wV49d7>VoqFmwg69K z`Mh9!Q;nd7mZ9(gA)rw8zbM$Zt_!bv-NujGBF1qHDodmLmk#{4b@)iNl+zcA9@&hx zLl`N=>BZ{8o}!HfR;In+Y?qbj53$(xVp*51*a~chk*Xe@ow8TqXbRD1Tn`fL$;cg} zVOeE%8xWxY&{qP}kbziI8Ffu6G3h18E@BG}Ok|*9;O;CnViF{Luneo{31t><)H0VG$-uxNFX zX+mgZlCS#yzo)M+>JMKuCA+?sk0q`6WE8y0DmL*jaj^s?p|Q&mg*M*v z(UUT_?r519T33u-Vq+0X;u1Gg7koSa$Kt7%vDAUJdA){?z@Kp!E(QZ?nis`pW~57* zmIpUu-G2e?06;A%%6m9I%n?l-!sz&C`^NTsLkQ;7tCc*|`ypQcQs!6%{~+x8>&^$b z748VN$<-B2dLx+2TMB^573KPC`K4q7b}c8o{e@S|VbhBP^I%<9EcA&gQsprp|09M6FWVjJiZ)vG zW(Tsr5in3dGr_GxdGj+A$<03VS^6x2y;DYV^QlGBDO|OlD=zS{(W<@_bi%uf?| zWbGaQUOpIw#(8OkCPWVySL?`@L3r3#d!1aT3y91d?fBxy*BQeAQy^1k@A9q#-PGIF ztCbA`%yTHLf4+h(0%DY?NjD9dRTUpAoGJ^l$J{SfvtJPms2QC8IFGA%{rerP$f=Jy z)rTi?<9@h%W}V>P=w;OPYa$zelTv0?mPkH(Np^2XV<8JF!?m31ONI%u_2LoiQhjH| zy=ee~Y;Ho1yCeB#&ygsTkAdQpng}O~uwPtPm01o4P{EqvQ)0t=ZJ*Rz_YD^Pn1NC= zhV9^Ags?!yK|<3lE|= zJ^una0YFA1MG<_eF5ww$7=~ur4>4H}SMF+chy6veSyL|=uAgoVp(#wb4OQ_n1qEm( z&k+Ai%`{5E;kIlATKlN_B86-q+;Mf!v%2}4z{j78!`)|#E>+R40plEd)MR*E>8g)nyy{*XX@ zL)09dk_`waY23bOe9KJJYX9WNf{BKTwHDesHDvcY&73)tjP+Z?C}mRKb9?&c>(DW# zf3$5(uU_FP-!z}QY+U*tTV&F+HLEAJ_1hG(eQ781X(M)my+`GYZGV?$EQERZ;J=3mKVYV91$oeSjkVW6EeN-HFd;at-`C9@MNQ-}NO5EZT53>F3 z-w5piAUeVr?^5krE8@MK3!+V%6SAIeAGs(CPzykPhAAyT=ty6C_G_VX!cUm3wJyVy z%{*E&$S-%W&&3WqfheLx?$7v?usp``GYWqrGag4lXhR9dC=MbvL*Ir`YzgBt zOKixgr6nl8Pr}X>+7{@iD$J<%#?l6hiRFhq##rrhe?Rka3_jMpFRV(&nle5Qi~H^$ zAQU*$U%8=Wj5$7w)9->9maL?_&aE|2B=Om$$_^N1USkLK+=GD>8?uq@zUKXv=^8EI4%WPI|7(0{t zWt`T^riV;z>xZ{>BaOfm{?2+viyJiMRQzQ-H zoK@=xOgtxTmjc8t?>Qkmw zVCm+9gI>l_6CkN&xwqH^krAVbasAQrOfDn2ItHr0TvzPTh0B7%Pu_)Td>F=If2K&4 zN&;ab1AOccDX?SkPY$#8kIT_2jc8xbkcSye+E7VgluQywacGo0}^e1%#U4+@D__<916bvfy03BT?!N-ECwZqC>YAFCI^i|GX1u?R7Xakl^f+THl zrHw3Nc52M#{i_tZ7Qa`|8QJnmC2IUa?l~Z zOcwJivzb^51lVrRL#lCtgwFK}L>dQ+nE>ggGqhAx#$&*g-F!Az%a>1KsPWAOzL@7k z6l@sH-)Fo4AP^Uq+k28grF4;jvJ|RVVfiu6ukyV{`tYM{kG}2bY?WN~Bl?nV`X_Ql zc|0*sK39uw8#q9h;*(D)gOEwHbswY>o*Y#>o-bu7Uga164zxNvd?x1m?+yXLNrcjg zQZ{IP@&mtXB4eI}z1LC#n(6$5{SpPPrGCc`OZn&6nK|ts2NneKX{b|4GLm_U#bmKT z(VX$gx*wT!6$KTcvL?unP6%EP>|!Z;{C@n8s(}f(t@?d)*K3lg)tRMxD}EBIaEsFl zyND~&T04RedB|!EyB4U;rk@zM;VV7~>VeU~UA0t;ro(ItZ{@98W32f}Y~0yww5r`i z(<5zH!S%~KRO1SJ8)%k;;a9mvM|GN4M=nxAW86(tC z;f0PNaU^Vj)%4_4lQ84p+X)V|*?~0$0 zJo$8e4&gDH3`0}N;I*L?dfm!HvyVyGYc1PpH9|XIz{fE-%FHp3FO6| zB&Xa6=BF@|d5Z#o7IKxNq$CQdzHnC5gcHL+Asv%ba>5HFjm}R#BqzKpa%#xC>m`J%&l@i;8OIFSjMrun}UJ%Gt{efU1OML#b=M}t5g({XtMaL0RIC5{R z%Ea>x40V70F;G))pa`G?VAZ%a4M&kTH{S2%@|B8G+RO*k_KZrNo>2I_U*+>!9AG2O zmKUxAU^M{boA8Kz_{2*%a(-3TS1bs}J&LN*5P_g7s=~~J#Kfz@$#rrIvfsY%!0DB( z9(~LsT=A`!11eiQUwLHFVN~$RtH<@kjlDRxQGxPVaD15QMQzGoKp3enp%`Jr+aX{S zbnh%Cw?#lPX@iN)nW=aM8^l_bQ6eU;{<6kFe~c6thA3?E9&wlt{0d>dd95XL^TFrh zzx4C#fTeHN3d|TYo(Q7Ky8OE=&Ij)%N1Px5rlr(w+@8mVhGk`MR?O}VLMIEl+dAMJ zq)a2N=UEV7E`Tu}Ni<~WP44*F$>oO&I}?p{bx=uXkb{xQ@2c_=I*VZ24S_}CAf26{ zF(Bm0kzNv1<~MJ(hxoBdjmR+#6M5HAc|YM}_~6Ek&Mx7bu75`k^ZD?sUGncVaX;>v}NT4V^@?0p|ZV(dOLsqoj%PW;z;gPf6AMC6YzB>rQAcGXBg zU5ohmy1xU>5ofmYZrjg#rh9)V|M>L@v+!@hf`*w_I6#>)KiFr6veuvXhWAl-h91xM zb$r?Oc#j89PALvIvI>^?uda@Taid*-d*?-;)y;>M$vQoOzY*FG2ZwA({{i65;_uVxLvq_Yl{$?HdN_7{|H_JdXtM&^xo z;8sO62(W^>=%*3B>?lN+Vc%sH5I~Hb{>32FWYK~#qJ)YeRzCLQWF1vUPmFCITIz+l z9`Xh4B=zMju0Ev@Q~y+cIqofs@_TlXifk3dNsAb(DB}D3%~t7k^@2Zp8b4_)s>xP7 z2r`LLiUiAm{yJUkS>UO~xZ-7aoY*^j0N{?*$p!*zX=cV*ztdAIMCbE*GjOt}RV z!Igcg3);1A4fUwqvjohP@AF^Y=QQ6R+)Zvg+R%vpUzP*c3Jd)0VntxOSlL7^@N~1P zpFljeVd0O;P{{>-nV3>D6|8Jqv536-df&mAAZE^FX*DTnz zEw`pF3$#4;vT`5U6!PTge*NM7xsV`F>+UPlPx_hW+ZeT@pUw-SIYIz{xWVpB;)Slc zi8BRXy8Q_1fnRtu9jLBNTxbrUG9^XBfbg0Y>!?VhU}neJ&krO1?25`Sk7XG12K#+I4Tj+aSUKHcfoa83Xez6hw>i69-UBJDkWc7>Re^%ChY?V8UcF+YB-~Vb<;o$-jL~*%% z3HD50zArRKOoqj??H>ZKhcgfcbk}ut9m; z)Ph=PcQovIaJwqgtgpM~aFkk1w-+XSO4`m-7-deuFfR83WlFj#YQk{b&%D28s_LLv zMb&kqjI1U?md0PFA_7W`8gv=4$$>bLO)P2@3U3XEiE~Uur+Ms&d2aEziJlyOImWIj zQ^7@F(ibqBu7&4E4Ie?MwQO#x)2K^cS#WRt?+%4S5Do~UUEqWtl*2nGR~Ys%r1Uom zz(i4r#4Is4*Tq+vrxH`nGo&bDts3CR#kk-)*viVtxAP;! zq0`dXLnZCEMFBOYjNe>ls zG=QMIKY9sjIDghPAj*Mhk!c5r@BhX_7~aJ}9LAB%b?_xGyF&vXoF2SYSye&xecluR zCr^_B&{T%|S&Y&Nhyg0n=di>ydC9sj0zR}9tnMEf&xPkw;vDKE=4!u$&sGoHl{QLB zmp<4`oXv{oK+6QIn8@vy9g7#Dp%c0h z%KMOdFOjqE_=Uqq^g&f&BT}9@I?JaVmmKPY`N#D0`D>SXYZ<&HUztz$WHGL-Pvv~F zwBWS&bB%Iw3TfUCAXFJ?6A%W-{f*EN3d*A?)ll(%LL;iq?;3^-&^ORlOyY;aHV4hx zk>OUa+1_+{P5lC4%(JjEEKS)tE)TMwRiPZ-?RDgJZ_`~4e-yo~&~Tf|_8mvI>_3$9 zUi{gkfMhEhEuIRo{SwIo!9IB)=?*|K7)CPb*Yw4n=7jSx0l54ch|~Wt`x;tTdoq z$657(EvLyyZU4=A)#uYoP&B|z;J-r!ML<@pY_h{(=A9g$*Tjd{6-f`-$=I$S zc0?EHlpoWgrJKOrOnVRFQQPs*1jqkdpU;y z;vgp3hc0ofA2KbN!cC{Y|1$;e1%NKA1rfPVf&MvcaaBald;~Ug$&ScJb=cHc&QM@m+~1jI`;R-+Z+USfV^#Dt64I~V z4yoyTF+j>;(`@_n&y60+TTb`pw|lEifuJEC6b2MnxhbcElPZ*j2O{$qyQ|S``Yy}h z0y+~8LF~IV{O(r_I#dD3zY*$3fg^npjTosfGpcH@OTrUVQ}wjkN4nNq#Yu6^OQ$@XK8Sz2g=NUcc6u%qOjOWThyy7n#1RpzcNcr zqlMl_$=5RW?PjY5-uj&U1vG*M%G41Ut0V@hkvW>6vuVUsI)di@drhI-w9R{c#ncE( zs8*3V6N-m;SE3Pa#q<520bY2iG38oR1K;U%`e)=d(*LW?L=}p}xP+%eNSg_e(m}z_WOH~_h-QLdX1G2P5Kvoa%3#maYb`cH6tuBDv z?U{V;NxN#paqT|{`nQ++9srUG6Gvdgt#uL|9mb?^g(VEPLR3v-#MRpD_yqXFc{$54H2AXvEcX^An?0M!cEDwFg6U zp2S(>8mp2>|;8aYAarhSQ|($iG|6K&qP z62rMVQ^>YjH*@KK1FuySD6?A>0doOr(ZKmGWB&x8;wj!}%b@hPGqkzex>|TYvrzj| z8YkHme)Y7Vd&ERR0mBl@WloxGpAr6*r@oTE=(CmTy)c!)^_D#=+ab(eOLcS3Nl=0= z#nedh$dyMYsN*){AS`3!^-*(QaD6#6%Gnep<6%+r^PTRmc}xD$HyTxPEZ|KUq;L^I zGn zUP6Z2ql(}stB8u2f7hd)<+ljT>u&AD(#5IPlS31SeEV+i_xubLTj)0KO39kdC@=Tk zr;N>EZJ(+{hWsoM+!)n}MD zrO&`Twq?c>4j&379lBZ$(4{N5nDrC+wjFV~A8e^*|BeR3hUg`vnllCH)MI+(!4Jv5 z8Y+}-WBTy~fA0{++or2inj_bX`6(|P;}6x)K+#1YNNU2%-ABc`ogdnI$U{k7b!+Sg&HEqHlajyQ*Q6(EQ<;OJ;-j&^`suzc1jbTkIltuXqibv7 z?u^8o?}JqT0y+SK6#{t?e3NL4bau+fq>_6oY8w0uzle0An)zLKoY$=i94&arrX16* zXM9g>;@rJQnh9K0&1yu$0QRG@lylb7`iKBrter1B<(xSxVyt6xR5Dlbx`yNC~;x zI>mSOZT|)I4I2Up!s!1^qunzqCo%{(nP?z?_9$3L(xhPnqVhQ>~;%9JpDQT8ux8I+g_t6VXx=&^$t*R`me+w%LLx$Q; zW-pf(N_=AsFD6wKa>?G=ivvvU!29ryxa;#0TrN@`t%8EjJ0kD1+V!Ahe38c=O?Xk; zN`~3-HmbQF7^B^to6~y!up;CV&!Scp+f!#WPwmu_A6(*V($aXX>kCK56|?*Dxz}jv zC6E=3`~!pqDJeoUv`nMj7%I0SKuo8KsIk}O+IG`d%u6&$XexYyE$F%WqB{&uhsWe|z?3e}B%8 z)2*Lu2^pm=ZFt>@WWpxDfXE1f;0QA@CPpqJv>SE4`YT$uKAW>Q?gY%6Ccbh0^A-B2 zn{E3SqWbmF#gBCK0 z(KG)AbPNE`rSL#n+|lSFOj1b7y_sWGo7gU@@}icaQ!KHO%X_maBlt{DP(uuP!~HLcSGEUF4kDp8aU9 z220p}J`2l)b?&b_N`yo>kePIAhP13J)Kd_y305=;Mezr$`Tw}nID}wL<%_wx7ku?VTZ2@ zz36=AO8CB4rH0FAZSASg+h$57DqDX28YNtY|DG3Tty>=J6=^602KI&A5{KngPWV-> z3UVCZE7*!pQ2NTiyl&JiEXuN&!Xa@lKyhALz&focbmTDy+iO?fXBSUWLDWKt_-v9} zsn#VDxHb{^Ug&r=EkCO?7>lEMW3a`OZ!uTFRc%l5E;~Wjo?jeyizB*Z#3uncr73w# z|00CZL&wMH6lnu|Ok-q?inom& z^OaD(k&y{mjh*TDz19S(HHB0EVqhm=0pR;CWRfMC$iKuMOtN*OuxVW(Gj7$G> zefVpVz|A*?q02pIXDiK&n;Sjf+{8h#`lbDBXrQHpE<+W|IbSh>iM&6QN5wF9fYM1O zpMcrU+!A?xKZ&P3C+bliQq|$6(Z?!}&iBfdkx13pLdz)LC8@dW#8?Qcdpp6->Dub> z@hP9bhifhoWC5@Mgh+sJa@9^romIoqq491%X`M+m-|N}L$F52xAN?Oc3$uA0D#BD@ z!+z+54>K7u(6v{MHs-h&?D@kp_^7FfWy#(3-Q^hR(|1C2Sij$g1hi-n^31RQP zd`XOd%bCohxYiLBYW0P9<&*#bP|8gD8M~-H#|M6K{VsE`tU^!T$<@N9@l$xYXsv^J ztz}B2`kQtZ$3&bM@r23)W4c6l_wh=H)felUIyMAsq!A})RhI!gv}4mToP?zUx&Cs`n8{l|yeAm?|QV7qQyF8JX^tZ6C*IN$qyYLW3d%U?i8 zSdiROZbXawLXyd~%uq0xjYRQ5RSD|FMj$S1JZc=Pqodgt z>g_AhAG{%djY;Z%e0euuRROeF4l$ZUfrc! zIhj-nvKjn|4)acrtO?*C;Q~-FIZYCK3arROOAv z;hXv+M4}$hlcMS>CYKLZD5nh;v#vqWKuFa1E-60g)H=ph2N>TY&U+E`CU1;Ea0+M zEQ8egT1tkqnr|hP3HM+E;9$X8D8Tk|hV1`!pz5(2HGHjU*Y2ErP#Q{;>>55!4lTXvdVA0w3?(c-!NQOEcX2NTuGNph@Qz=@3p#j}pzX0foT%3qpd>TR7civ0hZ4xdym1_Ar9n|SU zr4)EMnqedqbIp2cf+nygkJ34Y9;Z(!U8MEegF=;T$MtiSpXKsVtv3RJT>bL360P

Sez^YphRw)TUHhNqb{5x4;FG0)5dwf!UL&Sq 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%0Dn+3gS5%-*Hd&$*?7~#HH~cr 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�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Ð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

9icbP0KP8b|+~auDDPLFQ6b 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 diff --git a/multimedia/media/media_js_standard/videoDecoder/BUILD.gn b/multimedia/media/media_js_standard/videoDecoder/BUILD.gn deleted file mode 100644 index cddb7a4fa..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/BUILD.gn +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2022 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//test/xts/tools/build/suite.gni") -ohos_js_hap_suite("video_decoder_js_hap") { - hap_profile = "./src/main/config.json" - js2abc = true - deps = [ - ":video_decoder_js_assets", - ":video_decoder_resources", - ] - certificate_profile = "./signature/openharmony_sx.p7b" - hap_name = "ActsVideoDecoderJsTest" - subsystem_name = "multimedia" - part_name = "multimedia_player_framework" -} -ohos_js_assets("video_decoder_js_assets") { - source_dir = "./src/main/js/default" -} -ohos_resources("video_decoder_resources") { - sources = [ "./src/main/resources" ] - hap_profile = "./src/main/config.json" -} diff --git a/multimedia/media/media_js_standard/videoDecoder/Test.json b/multimedia/media/media_js_standard/videoDecoder/Test.json deleted file mode 100644 index 995cbe799..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/Test.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "description": "Configuration for video decoder Tests", - "driver": { - "type": "JSUnitTest", - "test-timeout": "2000000", - "package": "ohos.acts.multimedia.video.videodecoder", - "shell-timeout": "60000" - }, - "kits": [ - { - "test-file-name": [ - "ActsVideoDecoderJsTest.hap" - ], - "type": "AppInstallKit", - "cleanup-apps": true - }, - { - "type": "ShellKit", - "run-command": [ - "rm -rf /storage/media/100/local/files/*", - "mkdir -p /data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/", - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/" - ], - "teardown-command":[ - ] - }, - { - "type": "PushKit", - "pre-push": [ - ], - "push": [ - "./resource/media/es/out_1920_1080_30fps_3s.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/", - "./resource/media/es/h263_1408_1152.es ->/data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/", - "./resource/media/es/MPEG2_720_480.es ->/data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/", - "./resource/media/es/mpeg4_320_240.es ->/data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/", - "./resource/media/es/out_320_240_10s.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/" - ] - }, - { - "type": "ShellKit", - "run-command": [ - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/", - "chmod 777 /data/app/el2/100/base/ohos.acts.multimedia.video.videodecoder/haps/entry/files/*" - ], - "teardown-command":[ - ] - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/videoDecoder/signature/openharmony_sx.p7b deleted file mode 100644 index 9be1e98fa4c0c28ca997ed660112fa16b194f0f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3437 zcmcgvX>b$g8MY4FF(5FQyMT=#m||qU)nQ9cId-MBB-<-lvSdq&snM}IENNF>t+bK| zgowuF2vC|SxSZxNN5eHhV%(WPpbeB9Fc3;JDMtzMBv1-XAc2N~c2_tCXW&OCGw6qQ z-s9VS-tT?h=bI0tMS+~WDXqHJyCPmLzdbE-fV8Nd&*MRZfG8(#POFZG3xs@Lb{0ry z=R8j3wWo!5g=yjKx#BoZMFS)uA)H}cTp@-^K`9VV?RC3J59@}eik*>n|pRKOLZ zxdn7G!Yv@9O#y<&eUy{)vMXb;fQR)ffVAADQsEMXm;IBMDLfLD0w^U;6%HVo-0Q_5 zCHEa?DBuauNpZzoF+tK27w#n~?u%toS-DhR4k@Q*{7x^8Q=D6&kd^_~J#VVG2LXkL zaAy=}U*?Jto)9hx5MGjdp9hcQAu@tfk_;l!PeyxPY<8b&+&D!CyaBh9=8BSVKLpk4 z4Ml3yY|&Th)vyK4cpC{!uU8v2YBlVV`d~(nz&<@{G1oe*DHub1z7~J5*;s2bX<)_* zV_GbsPQg`(&rpxRb_*Od7}++3+liSw-$!1 zs5*g}EHWhI3i|!-FcfzYL0`SL-rq>LENC;PMl)G(0(1U2%Va|smp0UFx0xd@soZA* zD5LYc4OlbE7@ARt#h}rr3>K@bf%B#^-c+xz8Hr)0D5ExIFltezN@Hn8>o5d~bSfYtkc+_Z&kI#-N5_GhCg*V-^TSO=!G~ z(fXy{n2XV+k}6w_W`dTOP2a4u0ly;ANZ>4OxSKAzFB!yBzdo`gX zO?o|H@WiAw$y6l?=^3jA_Hy0S)nTYs12;4hKE&ekQ|>?|ZLJ}#F`2BczC7kdE4@xV zZBD_)Otwjhz+NSaz?d45!;FsGSu-#qh#hStD%B}f!mCT!KqzSo>I`NGH_9Dea$1Qi zg29Ydt!~lQVR99_T7#Hije~(12drl-P)SV?QR*9sus`8th-8^OQ7@xI$(Yp|^;bL1 zR50O$mDXw6P>i7B(TJ)ciPzTE>XY%X6HAa)b#OBRXv&~%Bw|J#Y><i4=e%95bjtw|cJp=#P#Pf#*luqI_wR;fISDCJhAqSG6R%xItn%~QtZ@m%&u zjGGLX;t6Ls62eQvNmf@v+}J%54^CygxRZ`?8X#r|wkev7(s;Ou4T#y1XNNf)h;o7z z8a^Lfq<1uH`E{G9E z*(=)Css_LSk=>E9jr)s5^2-!+MN=Ds}>1hRma4`uCIz9%p3O77839E{xf z4c_I?**|1`K2tg4!Hvyrou4BsJQuv*UfF)<%CelYIS>D^o?X)3+MK%la6kooW8&G@BU)Y0hT`+mOm$Z_%rB=a%o>I z!2c6lHyKQN)VjiFwa!eE^p8jc$sy$vB+8i25lI~6KPFFh$!o$avA~rj#L6xvR|Z83 z*WD6T9e+5Pyy=F+)pNTf{ny3cy>7Rkd3o*TS?TZJ`NS^NF2%HMkyS{?uJ$`!P4_L^ z1`NFDUbNyg_qREifgktnp1_v{Jbb`7m}2PTyUdOmtJj~m z9bB=ecw4_^rw1IW=of+>nrW5=d3k`3qHCxsIN_F{T1A545};;+fsyC&qChi+YV zr~M63H8ZLCPYmsjY>ls9cL%I)F|JIW-#+48$+lD4k*(P*kDM%zx_fvu4u5ZYUnI}5 zdrycFq>xFU)&X3p@pP2u%$o}}YcRn(MhJ&B2o?KS@cIVz>Ye%o^xV?CB{_Qhu z;}_q1bvO^g{8<3!gYbo4Di{8qzV+(9 zdlmksohQmRTs@qB;(Wo?dER_ux6XQb@q$tQPW?CMu6GVQd;R=iR;-S{Kr%Zks7>b1 zNs{|-+jhObYE}NR&`TGGr^h^4bjh%c>R#@=8nM&Md>_a+zVulsl;){flFekV1t9ob z+SqfV_Pv3$2f)bQ8%Ul2>fdYR^1zs0BQF~olsOj5AodC&Q_7SMFzsz2 z9newxE&jodk~tNHwl%LBMMDbrk=(^b diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/config.json b/multimedia/media/media_js_standard/videoDecoder/src/main/config.json deleted file mode 100644 index bd20539f5..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/config.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "app": { - "apiVersion": { - "compatible": 6, - "releaseType": "Beta1", - "target": 7 - }, - "vendor": "acts", - "bundleName": "ohos.acts.multimedia.video.videodecoder", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - "default": { - "debug": true - } - }, - "module": { - "abilities": [ - { - "iconId": 16777218, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "descriptionId": 16777217, - "visible": true, - "labelId": 16777216, - "icon": "$media:icon", - "name": "ohos.acts.multimedia.video.videodecoder.MainAbility", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "homeAbility": true, - "launchType": "singleton" - } - ], - "deviceType": [ - "default", - "default", - "tablet", - "tv", - "wearable" - ], - "mainAbility": "ohos.acts.multimedia.video.videodecoder.MainAbility", - "distro": { - "moduleType": "entry", - "installationFree": false, - "deliveryWithInstall": true, - "moduleName": "entry" - }, - "package": "ohos.acts.multimedia.video.videodecoder", - "name": ".MyApplication", - "js": [ - { - "pages": [ - "pages/index/index", - "pages/display/display" - ], - "name": "default", - "window": { - "designWidth": 720, - "autoDesignWidth": true - } - } - ] - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/app.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/app.js deleted file mode 100644 index 830070d19..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/app.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - } -}; diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/en-US.json b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/en-US.json deleted file mode 100644 index e63c70d97..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "Hello", - "world": "World" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/zh-CN.json b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index de6ee5748..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "您好", - "world": "世界" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.css b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.css deleted file mode 100644 index c9195944a..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.hml b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.hml deleted file mode 100644 index 9e58ed9e3..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.hml +++ /dev/null @@ -1,26 +0,0 @@ - - -

- - {{ $t('strings.hello') }} {{ title }} - - - - -
diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.js deleted file mode 100644 index 5d5b9ac7e..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/display/display.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - console.info('onInit finish') - this.title = this.$t('strings.world'); - }, - onShow() { - }, - onReady() { - }, - LoadXcomponent() { - globalThis.value = this.$element('XcomponentId').getXComponentSurfaceId(); - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.css b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.css deleted file mode 100644 index c3517ad15..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.hml b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.hml deleted file mode 100644 index 8d0e2061b..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,20 +0,0 @@ - - -
- - {{ $t('strings.hello') }} {{ title }} - -
diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.js deleted file mode 100644 index cfb5ff123..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - console.info('onInit finish') - this.title = this.$t('strings.world'); - }, - onShow() { - console.info('onShow finish') - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - core.addService('expect', expectExtend) - core.init() - const configService = core.getDefaultService('config') - this.timeout = 60000 - configService.setConfig(this) - require('../../../test/List.test') - core.execute() - }, - onReady() { - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/List.test.js deleted file mode 100644 index 41e919840..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/List.test.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -require('./VideoDecoderFuncCallbackTest.test.js') -require('./VideoDecoderFuncPromiseTest.test.js') -require('./VideoDecoderReliCallbackTest.test.js') -require('./VideoDecoderReliPromiseTest.test.js') -require('./VideoDecoderSoftwareFuncCallbackTest.test.js') -require('./VideoDecoderSoftwareFuncPromiseTest.test.js') -require('./VideoDecoderEnumTest.test.js') \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderEnumTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderEnumTest.test.js deleted file mode 100644 index 335638a5e..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderEnumTest.test.js +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - - -describe('VideoDecoderEnum', function () { - let videoDecodeProcessor = null; - let videoPlayer = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let inputQueue = []; - let outputQueue = []; - let isCodecData = false; - let inputEosFlag = false; - let surfaceID = ''; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465]; - let readpath; - let fdRead; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = false; - inputEosFlag = false; - surfaceID = globalThis.value; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - }) - - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.error('in case readFile' + e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - function getSurfaceID() { - let surfaceIDTest = new ArrayBuffer(20); - let readSurfaceID = fileio.createStreamSync('/data/media/surfaceID.txt', 'rb'); - readSurfaceID.readSync(surfaceIDTest, {length: 13}); - let view2 = new Uint8Array(surfaceIDTest); - for (let i = 0; i < 13; i++) { - let value = view2[i] - 48; - surfaceID = surfaceID + '' + value; - } - console.info('in case surfaceID ' + surfaceID); - readSurfaceID.closeSync(); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.info('in case: enqueueInputs in'); - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - if (frameCountIn == ES_FRAME_SIZE.length / 2) { - videoDecodeProcessor.setParameter({ - 'bitrate': 6400, - }).then(() => { - console.info('in case: setParameter success '); - }, failCallback).catch(failCatch); - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case: queueInput success '); - }, failCallback).catch(failCatch); - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject){ - if (outputObject.flags == 1) { - nextStep(); - return; - } - frameCountOut++; - await videoDecodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.log('in case: release output count:' + frameCountOut); - }, failCallback).catch(failCatch); - } - - function setCallback(nextStep){ - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - expect(inBuffer.index !== undefined).assertTrue(); - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - expect(inBuffer.data !== undefined).assertTrue(); - console.info('in case: inputBufferAvailable inBuffer.data: '+ inBuffer.data); - expect(inBuffer.offset !== undefined).assertTrue(); - console.info('in case: inputBufferAvailable inBuffer.offset: '+ inBuffer.offset); - expect(inBuffer.length !== undefined).assertTrue(); - console.info('in case: inputBufferAvailable inBuffer.length: '+ inBuffer.length); - expect(inBuffer.flags !== undefined).assertTrue(); - console.info('in case: inputBufferAvailable inBuffer.flags: '+ inBuffer.flags); - expect(inBuffer.timeMs !== undefined).assertTrue(); - console.info('in case: inputBufferAvailable inBuffer.timeMs: '+ inBuffer.timeMs); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - videoDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info('get outputMediaDescription : ' + MediaDescription); - }, failCallback).catch(failCatch); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - expect(err.code !== undefined).assertTrue(); - console.info('in case: err.code is ' + err.code); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - console.info('in case: setCallback out'); - } - - async function toCreateVideoDecoderByMime(mime, done) { - await media.createVideoDecoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByMime success'); - } else { - console.info('in case : createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - async function toGetVideoDecoderCaps() { - await videoDecodeProcessor.getVideoDecoderCaps().then((videoCaps) => { - console.info("case get getVideoDecoderCaps success"); - console.info("print videoCaps: " + videoCaps) - }, failCallback).catch(failCatch); - } - async function toCreateVideoDecoderByName(name, done) { - await media.createVideoDecoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByName success'); - } else { - console.info('in case : createVideoDecoderByName fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - async function toConfigure(mediaDescription, srcPath) { - await videoDecodeProcessor.configure(mediaDescription).then(() =>{ - console.info('in case : configure success'); - }, failCallback).catch(failCatch); - } - async function setSurfaceID(done) { - await media.createVideoPlayer().then((video) => { - if (typeof (video) != 'undefined') { - videoPlayer = video; - console.info('in case : createVideoPlayer success'); - } else { - expect().assertFail(); - console.info('in case error: createVideoPlayer fail'); - done(); - } - }, failCallback).catch(failCatch); - await videoPlayer.getDisplaySurface().then((surface) => { - console.info('in case : getDisplaySurface success and surfaceID is ' + surface); - surfaceID = surface; - }, failCallback).catch(failCatch); - } - async function toSetOutputSurface(isDisplay) { - await videoDecodeProcessor.setOutputSurface(surfaceID, isDisplay).then(() => { - console.info('in case : setOutputSurface success. surfaceID ' + surfaceID); - }, failCallback).catch(failCatch); - } - eventEmitter.on('nextStep', async (done) => { - console.info('in case : nextStep success'); - await videoDecodeProcessor.stop().then(() => { - console.info('in case : stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('in case : reset success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.release().then(() => { - console.info('in case : release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - console.info('in case : done'); - done(); - }); - async function toPrepare() { - await videoDecodeProcessor.prepare().then(() => { - console.info('in case : prepare success'); - }, failCallback).catch(failCatch); - } - async function toStart() { - await videoDecodeProcessor.start().then(() => { - console.info('in case : start success'); - }, failCallback).catch(failCatch); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_ENUM_CodecBuffer_0100 - * @tc.name : 001.CodecBuffer - * @tc.desc : Test Interface CodecBuffer - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_ENUM_CodecBuffer_0100', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await mediaTestBase.getFdRead(readpath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByMime('video/avc', done); - await toGetVideoDecoderCaps(); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncCallbackTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncCallbackTest.test.js deleted file mode 100644 index 86d93447c..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncCallbackTest.test.js +++ /dev/null @@ -1,460 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('VideoDecoderFuncCallbackTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let inputQueue = []; - let outputQueue = []; - let isCodecData = false; - let inputEosFlag = false; - let surfaceID = ''; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - const BASIC_PATH = '/data/accounts/account_0/appdata/ohos.acts.multimedia.video.videodecoder/'; - let ES_FRAME_SIZE = []; - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124]; - const H263_FRAME_SIZE = - [ 96618, 3515, 4132, 4336, 4646, 3497, 4430, 5437, 7560, 4613, 4876, 4734, 53617, 4079, 4507, 5222, 6244, - 5843, 6601, 6622, 6751, 6539, 7666, 7706, 53977, 7311, 12906, 10308, 26791, 15983, 34794, 22110, 37165, - 24267, 36171, 18330, 53228, 7893, 13088, 9502, 8485, 9207, 8681, 9202, 8537, 7603, 9726, 8191, 51872, - 5535, 6146, 6341, 6933, 9365, 7828, 6547, 7638, 7009, 7025, 8873, 51045, 5056, 4858, 4887, 9614, 5953, - 5972, 6116, 6060, 6296, 6239, 6400, 50928, 4937, 5054, 5371, 6728, 6286, 6524, 6646, 6549, 6036, 6214, - 5866, 51109, 4778, 5273, 6327]; - const MPEG2_FRAME_SIZE = - [ 38462, 55096, 8660, 3417, 1197, 2209, 984, 718, 783, 623, 659, 694, 14174, 580, 421, 495, 480, 476, 534, - 660, 699, 601, 603, 720, 12585, 555, 532, 776, 789, 762, 766, 732, 671, 735, 777, 948, 12650, 827, 766, - 835, 747, 847, 940, 1121, 1092, 1001, 980, 989, 12746, 945, 912, 1046, 1118, 1134, 1050, 1073, 1051, 1195, - 1085, 1182, 12874, 992, 1007, 985, 1040, 1143, 1157, 1150, 1247, 1149, 1246, 1145, 12870, 1041, 1066, 1314, - 1239, 1283, 1223, 1224, 1270, 1427, 1406, 1516, 12949, 1228, 1299, 1439, 1358, 1455, 1311, 1396, 1416, 1470, - 1393, 1502, 12999, 1232, 1400, 1348, 1335, 1461, 1404, 1412, 1426, 1548, 1481, 1488, 12840, 1229, 1342, 1323, - 1353, 1524, 1363, 1475, 1540, 1495, 1489, 1438, 12762, 1291, 1303, 1470, 1494, 1488, 1474, 1453, 1607, 1485, - 1589, 1762, 12548, 1363, 1317, 1435, 1411, 1338, 1373, 1605, 1639, 1429, 1392, 1543, 12332, 1255, 1200, 1291, - 1337, 1341, 1356, 1214, 1456, 1353, 1314, 1502, 12151, 1192, 1290, 1203, 1284, 1154, 1264, 1358, 1390, 1433, - 1194, 1325, 11904, 993, 1007, 1149, 1099, 1182, 1076, 1074, 1092, 1030, 1272, 1178, 11710, 966, 879, 860, 955, - 898, 967, 927, 1066, 997, 1083, 940, 11717, 648, 705, 901, 925, 930, 868, 798, 846, 781, 825, 1027, 11587, 785, - 733, 731, 848, 753, 806, 699, 837, 750, 762, 748, 11541, 678, 742, 667, 735, 702, 837, 695, 773, 849, 869, 769, - 11381, 664, 705, 714, 698, 814, 846, 757, 802, 857, 905, 772, 11265, 718, 643, 597, 687, 774, 843, 747, 785, - 683, 1135, 676, 11259, 616, 595, 773, 746, 798, 722, 798, 790, 959, 771, 907, 11234, 705, 675, 773, 764, 846, - 789, 840, 853, 828, 774, 842, 11263, 758, 758, 757, 820, 847, 834, 884, 842, 988, 750, 952, 11236, 776, 640, 727, - 832, 855, 733, 822, 827, 862, 697, 924, 11176, 675, 615, 688, 818, 783, 746, 901, 834, 892, 759, 923, 11181, 661, - 578, 720, 697]; - const MPEG4_FRAME_SIZE = - [ 11895, 8109, 1578, 1616, 1313, 572, 805, 837, 755, 706, 952, 879, 13193, 422, 389, 509, 725, 465, 479, 959, - 677, 364, 541, 696, 9306, 322, 318, 767, 590, 422, 530, 403, 505, 566, 445, 508, 7783, 460, 405, 343, 451, - 608, 431, 411, 543, 487, 527, 400, 6287, 385, 418, 391, 592, 434, 412, 398, 504, 492, 479, 561, 5413, 317, - 355, 422, 467, 452, 476, 460, 490, 492, 485, 451, 5036, 312, 408, 460, 432, 502, 388, 475, 407, 544, 401, - 487, 4404, 362, 378, 427, 416, 426, 456, 414, 438, 424, 442, 444, 4310, 362, 388, 393, 390, 441, 398, 423, - 369, 443, 406, 392, 4231, 343, 363, 355, 390, 459, 371, 378, 381, 405, 392, 426, 3975, 387, 337, 393, 439, - 378, 355, 374, 484, 381, 373, 423, 3869, 312, 350, 400, 345, 356, 320, 473, 431, 386, 338, 431, 3426, 268, - 315, 416, 383, 373, 381, 354, 383, 328, 348, 418, 3715, 324, 361, 331, 350, 302, 409, 377, 359, 384, 334, - 326, 3439, 266, 324, 329, 353, 405, 303, 357, 332, 292, 361, 333, 3542, 294, 284, 247, 331, 306, 322, 287, - 367, 341, 276, 258, 3980, 246, 245, 259, 309, 333, 250, 275, 334, 281, 253, 371, 3640, 213, 231, 301, 302, - 228, 289, 290, 281, 201, 284, 277, 4242, 205, 328, 237, 283, 295, 266, 230, 321, 348, 212, 308, 4103, 259, - 238, 245, 298, 330, 265, 271, 287, 267, 286, 290, 3856, 269, 242, 209, 314, 267, 278, 280, 314, 250, 433, - 238, 3654, 195, 246, 301, 298, 250, 270, 320, 269, 305, 258, 368, 3810, 231, 212, 279, 289, 252, 303, 287, - 295, 206, 264, 349, 4071, 242, 296, 271, 231, 307, 265, 254, 267, 317, 232, 348, 4077, 259, 222, 268, 235, - 324, 266, 256, 312, 246, 248, 325, 4000, 266, 201, 230, 293, 264, 265, 273, 301, 304, 253, 266, 3978, 228, - 232, 250, 248, 281, 219, 243, 293, 287, 253, 328, 3719]; - let fdRead; - let readpath; - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = false; - inputEosFlag = false; - surfaceID = globalThis.value; - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - console.info("case getcontent length is: "+ len); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - if (frameCountIn == ES_FRAME_SIZE.length / 2) { - videoDecodeProcessor.setParameter({ - 'bitrate': 6400, - }, (err) => { - expect(err).assertUndefined(); - console.info('in case: setParameter success '); - }); - } - videoDecodeProcessor.pushInputData(inputObject, (err) => { - if (typeof (err) == 'undefined') { - console.info('in case: queueInput success '); - inputCnt += 1; - } else { - console.info(`in case queueInput err called,errMessage is ${error.message}`); - } - }) - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject){ - if (outputObject.flags == 1 ) { - nextStep(); - return; - } - frameCountOut++; - videoDecodeProcessor.freeOutputBuffer(outputObject, (err) => { - if (typeof (err) == 'undefined') { - console.log('in case: release output count:' + frameCountOut); - } else { - console.info(`in case releaseOutput error called,errMessage is ${error.message}`); - } - }) - } - - function setCallback(nextStep){ - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - videoDecodeProcessor.getOutputMediaDescription((err, MediaDescription) => { - expect(err).assertUndefined(); - console.info('get outputMediaDescription : ' + MediaDescription); - }); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - console.info('in case: setCallback out'); - } - eventEmitter.on('configure', (mediaDescription, srcPath, nextStep, done) => { - console.info('in case : configure in'); - videoDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info('in case : configure success'); - setCallback(nextStep); - eventEmitter.emit('getVideoDecoderCaps', done); - // eventEmitter.emit('setOutputSurface', done); - }); - }); - eventEmitter.on('getVideoDecoderCaps', (done) => { - videoDecodeProcessor.getVideoDecoderCaps((err, videoCaps) => { - expect(err).assertUndefined(); - console.info('case get getVideoDecoderCaps success'); - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - eventEmitter.emit('setOutputSurface', done); - }); - }); - - eventEmitter.on('setOutputSurface', (done) => { - videoDecodeProcessor.setOutputSurface(surfaceID, true, (err) => { - expect(err).assertUndefined(); - console.info('in case : setOutputSurface success, surfaceID ' + surfaceID); - eventEmitter.emit('prepare', done); - }) - }); - eventEmitter.on('prepare', (done) => { - videoDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case : prepare success'); - eventEmitter.emit('start', done); - }); - }); - eventEmitter.on('start', (done) => { - videoDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case : start success'); - }); - }); - eventEmitter.on('stop', (done) => { - videoDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info('in case : stop success'); - eventEmitter.emit('reset', done); - }); - }); - eventEmitter.on('reset', (done) => { - videoDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info('in case : reset success'); - eventEmitter.emit('release', done); - }); - }); - eventEmitter.on('release', (done) => { - videoDecodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.info('in case : release success'); - videoDecodeProcessor = null; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - done(); - }); - }); - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_H264_CALLBACK_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0s - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_H264_CALLBACK_0100', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - media.createVideoDecoderByMime('video/avc', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByMime success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, - done); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG2_CALLBACK_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG2_CALLBACK_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG2_FRAME_SIZE; - let srcPath = 'MPEG2_720_480.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mpeg2', - 'width': 720, - 'height': 480, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - media.createVideoDecoderByMime('video/mpeg2', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByMime success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, - done); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG4_CALLBACK_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG4_CALLBACK_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG4_FRAME_SIZE; - let srcPath = 'mpeg4_320_240.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mp4v-es', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - media.createVideoDecoderByMime('video/mp4v-es', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByMime success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, - done); - }); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncPromiseTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncPromiseTest.test.js deleted file mode 100644 index 4cc7d507d..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderFuncPromiseTest.test.js +++ /dev/null @@ -1,498 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - - -describe('VideoDecoderFuncPromiseTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let inputQueue = []; - let outputQueue = []; - let isCodecData = false; - let inputEosFlag = false; - let surfaceID = ''; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124]; - const H263_FRAME_SIZE = - [ 96618, 3515, 4132, 4336, 4646, 3497, 4430, 5437, 7560, 4613, 4876, 4734, 53617, 4079, 4507, 5222, 6244, - 5843, 6601, 6622, 6751, 6539, 7666, 7706, 53977, 7311, 12906, 10308, 26791, 15983, 34794, 22110, 37165, - 24267, 36171, 18330, 53228, 7893, 13088, 9502, 8485, 9207, 8681, 9202, 8537, 7603, 9726, 8191, 51872, - 5535, 6146, 6341, 6933, 9365, 7828, 6547, 7638, 7009, 7025, 8873, 51045, 5056, 4858, 4887, 9614, 5953, - 5972, 6116, 6060, 6296, 6239, 6400, 50928, 4937, 5054, 5371, 6728, 6286, 6524, 6646, 6549, 6036, 6214, - 5866, 51109, 4778, 5273, 6327]; - const MPEG2_FRAME_SIZE = - [ 38462, 55096, 8660, 3417, 1197, 2209, 984, 718, 783, 623, 659, 694, 14174, 580, 421, 495, 480, 476, 534, - 660, 699, 601, 603, 720, 12585, 555, 532, 776, 789, 762, 766, 732, 671, 735, 777, 948, 12650, 827, 766, - 835, 747, 847, 940, 1121, 1092, 1001, 980, 989, 12746, 945, 912, 1046, 1118, 1134, 1050, 1073, 1051, 1195, - 1085, 1182, 12874, 992, 1007, 985, 1040, 1143, 1157, 1150, 1247, 1149, 1246, 1145, 12870, 1041, 1066, 1314, - 1239, 1283, 1223, 1224, 1270, 1427, 1406, 1516, 12949, 1228, 1299, 1439, 1358, 1455, 1311, 1396, 1416, 1470, - 1393, 1502, 12999, 1232, 1400, 1348, 1335, 1461, 1404, 1412, 1426, 1548, 1481, 1488, 12840, 1229, 1342, 1323, - 1353, 1524, 1363, 1475, 1540, 1495, 1489, 1438, 12762, 1291, 1303, 1470, 1494, 1488, 1474, 1453, 1607, 1485, - 1589, 1762, 12548, 1363, 1317, 1435, 1411, 1338, 1373, 1605, 1639, 1429, 1392, 1543, 12332, 1255, 1200, 1291, - 1337, 1341, 1356, 1214, 1456, 1353, 1314, 1502, 12151, 1192, 1290, 1203, 1284, 1154, 1264, 1358, 1390, 1433, - 1194, 1325, 11904, 993, 1007, 1149, 1099, 1182, 1076, 1074, 1092, 1030, 1272, 1178, 11710, 966, 879, 860, 955, - 898, 967, 927, 1066, 997, 1083, 940, 11717, 648, 705, 901, 925, 930, 868, 798, 846, 781, 825, 1027, 11587, 785, - 733, 731, 848, 753, 806, 699, 837, 750, 762, 748, 11541, 678, 742, 667, 735, 702, 837, 695, 773, 849, 869, 769, - 11381, 664, 705, 714, 698, 814, 846, 757, 802, 857, 905, 772, 11265, 718, 643, 597, 687, 774, 843, 747, 785, - 683, 1135, 676, 11259, 616, 595, 773, 746, 798, 722, 798, 790, 959, 771, 907, 11234, 705, 675, 773, 764, 846, - 789, 840, 853, 828, 774, 842, 11263, 758, 758, 757, 820, 847, 834, 884, 842, 988, 750, 952, 11236, 776, 640, 727, - 832, 855, 733, 822, 827, 862, 697, 924, 11176, 675, 615, 688, 818, 783, 746, 901, 834, 892, 759, 923, 11181, 661, - 578, 720, 697]; - const MPEG4_FRAME_SIZE = - [ 11895, 8109, 1578, 1616, 1313, 572, 805, 837, 755, 706, 952, 879, 13193, 422, 389, 509, 725, 465, 479, 959, - 677, 364, 541, 696, 9306, 322, 318, 767, 590, 422, 530, 403, 505, 566, 445, 508, 7783, 460, 405, 343, 451, - 608, 431, 411, 543, 487, 527, 400, 6287, 385, 418, 391, 592, 434, 412, 398, 504, 492, 479, 561, 5413, 317, - 355, 422, 467, 452, 476, 460, 490, 492, 485, 451, 5036, 312, 408, 460, 432, 502, 388, 475, 407, 544, 401, - 487, 4404, 362, 378, 427, 416, 426, 456, 414, 438, 424, 442, 444, 4310, 362, 388, 393, 390, 441, 398, 423, - 369, 443, 406, 392, 4231, 343, 363, 355, 390, 459, 371, 378, 381, 405, 392, 426, 3975, 387, 337, 393, 439, - 378, 355, 374, 484, 381, 373, 423, 3869, 312, 350, 400, 345, 356, 320, 473, 431, 386, 338, 431, 3426, 268, - 315, 416, 383, 373, 381, 354, 383, 328, 348, 418, 3715, 324, 361, 331, 350, 302, 409, 377, 359, 384, 334, - 326, 3439, 266, 324, 329, 353, 405, 303, 357, 332, 292, 361, 333, 3542, 294, 284, 247, 331, 306, 322, 287, - 367, 341, 276, 258, 3980, 246, 245, 259, 309, 333, 250, 275, 334, 281, 253, 371, 3640, 213, 231, 301, 302, - 228, 289, 290, 281, 201, 284, 277, 4242, 205, 328, 237, 283, 295, 266, 230, 321, 348, 212, 308, 4103, 259, - 238, 245, 298, 330, 265, 271, 287, 267, 286, 290, 3856, 269, 242, 209, 314, 267, 278, 280, 314, 250, 433, - 238, 3654, 195, 246, 301, 298, 250, 270, 320, 269, 305, 258, 368, 3810, 231, 212, 279, 289, 252, 303, 287, - 295, 206, 264, 349, 4071, 242, 296, 271, 231, 307, 265, 254, 267, 317, 232, 348, 4077, 259, 222, 268, 235, - 324, 266, 256, 312, 246, 248, 325, 4000, 266, 201, 230, 293, 264, 265, 273, 301, 304, 253, 266, 3978, 228, - 232, 250, 248, 281, 219, 243, 293, 287, 253, 328, 3719]; - let fdRead; - let readpath; - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = false; - inputEosFlag = false; - surfaceID = globalThis.value; - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - console.info("case start get content length is: " + len); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - if (frameCountIn == ES_FRAME_SIZE.length / 2) { - videoDecodeProcessor.setParameter({ - 'bitrate': 6400, - }).then(() => { - console.info('in case: setParameter success '); - }, failCallback).catch(failCatch); - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case: queueInput success '); - inputCnt += 1; - }, failCallback).catch(failCatch); - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1) { - nextStep(); - return; - } - frameCountOut++; - await videoDecodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.log('in case: release output count:' + frameCountOut); - }, failCallback).catch(failCatch); - } - - function setCallback(nextStep){ - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - videoDecodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info('get outputMediaDescription : ' + MediaDescription); - }, failCallback).catch(failCatch); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - console.info('in case: setCallback out'); - } - - async function toCreateVideoDecoderByMime(mime, done) { - await media.createVideoDecoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByMime success'); - } else { - console.info('in case : createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - async function toGetVideoDecoderCaps() { - await videoDecodeProcessor.getVideoDecoderCaps().then((videoCaps) => { - console.info("case get getVideoDecoderCaps success"); - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - }, failCallback).catch(failCatch); - } - async function toConfigure(mediaDescription, srcPath) { - await videoDecodeProcessor.configure(mediaDescription).then(() =>{ - console.info('in case : configure success'); - }, failCallback).catch(failCatch); - } - async function toSetOutputSurface(isDisplay) { - await videoDecodeProcessor.setOutputSurface(surfaceID, isDisplay).then(() => { - console.info('in case : setOutputSurface success. surfaceID ' + surfaceID); - }, failCallback).catch(failCatch); - } - eventEmitter.on('nextStep', async (done) => { - console.info('in case : nextStep success'); - await videoDecodeProcessor.stop().then(() => { - console.info('in case : stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('in case : reset success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.release().then(() => { - console.info('in case : release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - console.info('in case : done'); - done(); - }); - async function toPrepare() { - await videoDecodeProcessor.prepare().then(() => { - console.info('in case : prepare success'); - }, failCallback).catch(failCatch); - } - async function toStart() { - await videoDecodeProcessor.start().then(() => { - console.info('in case : start success'); - }, failCallback).catch(failCatch); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_H264_PROMISE_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_H264_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByMime('video/avc', done); - await toGetVideoDecoderCaps(); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG2_PROMISE_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG2_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG2_FRAME_SIZE; - let srcPath = 'MPEG2_720_480.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mpeg2', - 'width': 720, - 'height': 480, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByMime('video/mpeg2', done); - await toGetVideoDecoderCaps(); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG4_PROMISE_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MPEG4_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG4_FRAME_SIZE; - let srcPath = 'mpeg4_320_240.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mp4v-es', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByMime('video/mp4v-es', done); - await toGetVideoDecoderCaps(); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MULTIINSTANCE_PROMISE_0100 - * @tc.name : 001.creat multiple video decoders - * @tc.desc : creat multiple video decoders - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_MULTIINSTANCE_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - let array = new Array(); - eventEmitter.on('releaseAllDecoder', async () => { - for (let j = 0; j < 2; j++) { - await array[j].release().then(() => { - array[j] = null; - }, failCallback).catch(failCatch); - } - await videoDecodeProcessor.release().then(() => { - console.info('in case : release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - done(); - }) - for (let i = 0; i < 3; i++) { - await media.createVideoDecoderByMime('video/avc').then((processor) => { - if (typeof (processor) != 'undefined') { - console.info('in case : createVideoDecoderByMime success'); - if (i == 2) { - videoDecodeProcessor = processor; - } else { - array[i] = processor; - } - } else { - console.info('in case : createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('releaseAllDecoder', done);} - ); - await toPrepare(); - await toStart(); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliCallbackTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliCallbackTest.test.js deleted file mode 100644 index 349fe720a..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliCallbackTest.test.js +++ /dev/null @@ -1,1287 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -const DECODE_STEP = { - WAIT_FOR_EOS : 'waitForEOS', - CONFIGURE : 'configure', - SETSURFACE : 'setSurface', - PREPARE : 'prepare', - START : 'start', - FLUSH : 'flush', - STOP : 'stop', - RESET : 'reset', - WAIT_FOR_ALL_OUTS : 'waitForAllOuts', - ERROR : 'error', - RELEASE : 'release', -} - -describe('VideoDecoderReliCallbackTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let position = 0; - let eosFrameId = -1; - let inputQueue = []; - let outputQueue = []; - let isCodecData = true; - let inputEosFlag = false; - let workdoneAtEOS = false; - let surfaceID = ''; - const SRCPATH = 'out_320_240_10s.h264'; - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60, - 'max_input_size': 150000, - } - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124]; - let ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - let fdRead; - let lockFlag = false; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - workdoneAtEOS = false; - eosFrameId = -1; - inputEosFlag = false; - position = 0; - surfaceID = globalThis.value; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - function printError(err, expectFail) { - expect((err != undefined) == expectFail).assertTrue(); - if (expectFail == false && err != undefined) { - console.info('in case error failCatch called,err is ' + err); - console.info(`in case error failCatch called,errMessage is ${err.message}`); - } - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, pos, len) { - console.info('case start get content, len ' + len + ' buf.byteLength ' + buf.byteLength); - let lengthReal = -1; - try { - if (pos == -1) { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - }); - } else { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - position: pos, - }); - } - console.info('in case: lengthReal: ' + lengthReal); - } catch(e) { - console.error('in case error getContent err ' + err); - } - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, position, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - position = position + ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 1000 / mediaDescription.frame_rate; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length || frameCountIn == eosFrameId) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject, (err) => { - console.info('in case: queueInput success '); - }) - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1 ) { - if (workdoneAtEOS) { - doneWork(nextStep); - } - return; - } - frameCountOut++; - videoDecodeProcessor.freeOutputBuffer(outputObject, () => { - console.log('in case: release output count:' + frameCountOut); - }) - } - - function toConfigure(mySteps, done, expectFail) { - videoDecodeProcessor.configure(mediaDescription, (err) => { - console.info(`case configure callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }) - } - function toPrepare(mySteps, done, expectFail) { - videoDecodeProcessor.prepare((err) => { - console.info(`case prepare callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toStart(mySteps, done, expectFail) { - let timeDelay = 0; - videoDecodeProcessor.start((err) => { - console.info(`case start callback`); - printError(err, expectFail); - if (mySteps[0] == DECODE_STEP.FLUSH) { - timeDelay = 50; - } - setTimeout(() => { - toNextStep(mySteps, done); - }, timeDelay); - }); - } - function toFlush(mySteps, done, expectFail) { - lockFlag = true; - videoDecodeProcessor.flush((err) => { - console.info(`case flush callback`); - printError(err, expectFail); - if (expectFail == false) { - inputEosFlag = false; - position = ES_FRAME_SIZE[0]; - inputQueue = []; - timestamp = 0; - frameCountIn = 1; - } - lockFlag = false; - toNextStep(mySteps, done); - }); - } - function toStop(mySteps, done, expectFail) { - videoDecodeProcessor.stop((err) => { - console.info(`case stop callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toReset(mySteps, done, expectFail) { - videoDecodeProcessor.reset((err) => { - console.info(`case reset callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toSetOutputSurface(mySteps, done, expectFail) { - videoDecodeProcessor.setOutputSurface(surfaceID, true, (err) => { - console.info('case setOutputSurface callback, surfaceID ' + surfaceID); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toNextStep(mySteps, done) { - console.info('case myStep[0]: ' + mySteps[0]); - if (mySteps[0] == DECODE_STEP.RELEASE) { - if (videoDecodeProcessor != null){ - videoDecodeProcessor.release(async(err) => { - printError(err, false); - console.info('in case : videoDecodeProcessor release callback'); - videoDecodeProcessor = null; - console.info('case to done'); - done(); - }); - } - return; - } - switch (mySteps[0]) { - case DECODE_STEP.CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toConfigure(mySteps, done, true); - } else { - toConfigure(mySteps, done, false); - } - break; - case DECODE_STEP.SETSURFACE: - mySteps.shift(); - console.info(`case to setOutputSurface`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toSetOutputSurface(mySteps, done, true); - } else { - toSetOutputSurface(mySteps, done, false); - } - break; - case DECODE_STEP.PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toPrepare(mySteps, done, true); - } else { - toPrepare(mySteps, done, false); - } - break; - case DECODE_STEP.START: - mySteps.shift(); - console.info(`case to start`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toStart(mySteps, done, true); - } else { - readStreamSync = undefined; - frameCountIn = 0; - frameCountOut = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - position = 0; - toStart(mySteps, done, false); - } - break; - case DECODE_STEP.FLUSH: - mySteps.shift(); - console.info(`case to flush`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toFlush(mySteps, done, true); - } else { - toFlush(mySteps, done, false); - } - break; - case DECODE_STEP.STOP: - mySteps.shift(); - console.info(`case to stop`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toStop(mySteps, done, true); - } else { - toStop(mySteps, done, false); - } - break; - case DECODE_STEP.RESET: - mySteps.shift(); - console.info(`case to reset`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toReset(mySteps, done, true); - } else { - toReset(mySteps, done, false); - } - break; - case DECODE_STEP.WAIT_FOR_EOS: - mySteps.shift(); - setTimeout(() =>{ - expect(inputEosFlag).assertTrue(); - if (inputEosFlag == false) { - console.info(`in case error wait for eos: inputEosFlag = false`); - } - toNextStep(mySteps, done); - }, 7000); // wait 7000 ms for eos - break; - case DECODE_STEP.WAIT_FOR_ALL_OUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - default: - break; - } - } - - function setCallback(nextStep){ - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - } - - async function toCreateVideoDecoderByMime(mime, mySteps, done) { - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - await media.createVideoDecoderByMime(mime, (err, processor) => { - console.info(`case createVideoDecoderByMime callback`); - printError(err, false); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }) - } - function toCreateVideoDecoderByName(name, mySteps, done) { - media.createVideoDecoderByName(name, (err, processor) => { - printError(err, false); - console.info(`case createVideoDecoderByName callback`); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }) - } - async function doneWork(nextStep) { - videoDecodeProcessor.stop((err) => { - printError(err, false); - console.info('case stop callback'); - videoDecodeProcessor.reset((err) => { - printError(err, false); - console.info('case reset callback'); - videoDecodeProcessor.release((err) => { - printError(err, false); - console.info('case release callback'); - videoDecodeProcessor = null; - nextStep(); - }) - }) - }) - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0100 - * @tc.name : test set EOS manually before last frame and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0200 - * @tc.name : test flush at running state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0300 - * @tc.name : test flush at EOS state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - eosFrameId = 10; - workdoneAtEOS = true; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0400 - * @tc.name : test stop at running state and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0500 - * @tc.name : test stop and restart - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0100 - * @tc.name : 001.create -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0300 - * @tc.name : 003.start -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_CALLBACK_0900', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS , - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0100 - * @tc.name : 001.create -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0200 - * @tc.name : 002.configure -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0400 - * @tc.name : 004.start -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0500 - * @tc.name : 005.flush -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0600 - * @tc.name : 006.stop -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.START, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0800 - * @tc.name : 008.reset -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0100 - * @tc.name : 001.create -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.FLUSH, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0400 - * @tc.name : 004.start -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP , DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0100 - * @tc.name : 001.create -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.STOP, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0400 - * @tc.name : 004.start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0100 - * @tc.name : 001.create -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.RESET, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0400 - * @tc.name : 004.start -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByMime('video/avc', mySteps, done); - }) -}) diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliPromiseTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliPromiseTest.test.js deleted file mode 100644 index 6a88d5b01..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderReliPromiseTest.test.js +++ /dev/null @@ -1,1284 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -const DECODE_STEP = { - WAIT_FOR_EOS : 'waitForEOS', - CONFIGURE : 'configure', - SETSURFACE : 'setSurface', - PREPARE : 'prepare', - START : 'start', - FLUSH : 'flush', - STOP : 'stop', - RESET : 'reset', - WAIT_FOR_ALL_OUTS : 'waitForAllOuts', - ERROR : 'error', - RELEASE : 'release', -} - -describe('VideoDecoderReliPromiseTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let position = 0; - let eosFrameId = -1; - let inputQueue = []; - let outputQueue = []; - let isCodecData = true; - let inputEosFlag = false; - let workdoneAtEOS = false; - let surfaceID = ''; - const SRCPATH = 'out_320_240_10s.h264'; - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 4, - 'frame_rate': 60, - 'max_input_size': 150000, - } - const H264_FRAME_SIZE_60FPS_320 = - [2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124]; - let ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - let fdRead; - let lockFlag = false; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - workdoneAtEOS = false; - eosFrameId = -1; - inputEosFlag = false; - position = 0; - surfaceID = globalThis.value; - lockFlag = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - let caseCallback = function(err) { - console.info(`in case caseCallback called, caseMessage is ${err.message}`); - } - let failCallback = function(err) { - console.error(`in case error failCallback called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let failCatch = function(err) { - console.error(`in case error failCatch called,errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let callbackExpectOK = function(err, mySteps, done) { - console.error(`in case error callbackExpectOK called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - toNextStep(mySteps, done); - } - let callbackExpectFail = function(err, mySteps, done) { - console.info(`in case callbackExpectFail called, errMessage is ${err.message}`); - expect(err != undefined).assertTrue(); - toNextStep(mySteps, done); - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, pos, len) { - console.info('start get content, len ' + len + ' buf.byteLength ' + buf.byteLength); - let lengthReal = -1; - try { - if (pos == -1) { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - }); - } else { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - position: pos, - }); - } - console.info('in case: lengthReal: ' + lengthReal); - } catch(e) { - console.error('in case error getContent err ' + err); - } - } - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, position, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - position = position + ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 1000 / mediaDescription.frame_rate; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length || frameCountIn == eosFrameId) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case: queueInput success '); - }, caseCallback).catch(failCatch); - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1 ) { - if (workdoneAtEOS) { - await doneWork(); - nextStep(); - } - return; - } - frameCountOut++; - videoDecodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('in case: release output success'); - console.log('in case: release output count:' + frameCountOut); - }, caseCallback).catch(failCatch); - } - - async function toConfigure(mySteps, done, failureCallback, catchCallback) { - await videoDecodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toPrepare(mySteps, done, failureCallback, catchCallback) { - await videoDecodeProcessor.prepare().then(() => { - console.info(`case prepare success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toStart(mySteps, done, failureCallback, catchCallback) { - let timeDelay = 0; - await videoDecodeProcessor.start().then(() => { - console.info(`case start success`); - if (mySteps[0] == DECODE_STEP.FLUSH) { - timeDelay = 50; - } - setTimeout(() => { - toNextStep(mySteps, done); - }, timeDelay); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toFlush(mySteps, done, failureCallback, catchCallback) { - lockFlag = true; - await videoDecodeProcessor.flush().then(() => { - console.info(`case flush success`); - position = ES_FRAME_SIZE[0]; - inputQueue = []; - timestamp = 0; - inputEosFlag = false; - frameCountIn = 1; - lockFlag = false; - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toStop(mySteps, done, failureCallback, catchCallback) { - await videoDecodeProcessor.stop().then(() => { - console.info(`case stop success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toReset(mySteps, done, failureCallback, catchCallback) { - await videoDecodeProcessor.reset().then(() => { - console.info(`case reset success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toSetOutputSurface(mySteps, done, failureCallback, catchCallback) { - await videoDecodeProcessor.setOutputSurface(surfaceID, true).then(() => { - console.info('in case : setOutputSurface success, surfaceID ' + surfaceID); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - async function toNextStep(mySteps, done) { - console.info('case myStep[0]: ' + mySteps[0]); - if (mySteps[0] == DECODE_STEP.RELEASE) { - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(async() => { - console.info('in case : videoDecodeProcessor release success'); - videoDecodeProcessor = null; - console.info('case to done'); - done(); - }, failCallback).catch(failCatch); - } - return; - } - switch (mySteps[0]) { - case DECODE_STEP.CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toConfigure(mySteps, done, callbackExpectFail, failCatch); - } else { - await toConfigure(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.SETSURFACE: - mySteps.shift(); - console.info(`case to setOutputSurface`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toSetOutputSurface(mySteps, done, callbackExpectFail, failCatch); - } else { - await toSetOutputSurface(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toPrepare(mySteps, done, callbackExpectFail, failCatch); - } else { - await toPrepare(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.START: - mySteps.shift(); - console.info(`case to start`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toStart(mySteps, done, callbackExpectFail, failCatch); - } else { - readStreamSync = undefined; - frameCountIn = 0; - frameCountOut = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - position = 0; - await toStart(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.FLUSH: - mySteps.shift(); - console.info(`case to flush`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toFlush(mySteps, done, callbackExpectFail, failCatch); - } else { - await toFlush(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.STOP: - mySteps.shift(); - console.info(`case to stop`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toStop(mySteps, done, callbackExpectFail, failCatch); - } else { - await toStop(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.RESET: - mySteps.shift(); - console.info(`case to reset`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - await toReset(mySteps, done, callbackExpectFail, failCatch); - } else { - await toReset(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.WAIT_FOR_EOS: - mySteps.shift(); - setTimeout(async() =>{ - expect(inputEosFlag).assertTrue(); - if (inputEosFlag == false) { - console.info(`in case error inputEosFlag == false`); - } - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - toNextStep(mySteps, done); - }, 7000); // wait 7000 ms for eos - break; - case DECODE_STEP.WAIT_FOR_ALL_OUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - default: - break; - } - } - - function setCallback(nextStep){ - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged', (format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - } - - async function toCreateVideoDecoderByMime(mime, mySteps, done) { - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - await media.createVideoDecoderByMime(mime).then((processor) => { - console.info(`case createVideoDecoderByMime success`); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }, failCallback).catch(failCatch); - } - async function toCreateVideoDecoderByName(name, mySteps, done) { - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - media.createVideoDecoderByName(name).then((processor) => { - console.info(`case createVideoDecoderByName success`); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }, failCallback).catch(failCatch); - } - async function doneWork() { - await videoDecodeProcessor.stop().then(() => { - console.info('case stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('case reset success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.release().then(() => { - console.info('case release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0100 - * @tc.name : test set EOS manually before last frame and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0200 - * @tc.name : test flush at running state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0300 - * @tc.name : test flush at EOS state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - eosFrameId = 10; - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0400 - * @tc.name : test stop at running state and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0500 - * @tc.name : test stop and restart - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_FUNCTION_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0100 - * @tc.name : 001.create -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0300 - * @tc.name : 003.start -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_CONFIGURE_PROMISE_0900', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS , - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_PREPARE_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0100 - * @tc.name : 001.create -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0200 - * @tc.name : 002.configure -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0400 - * @tc.name : 004.start -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0500 - * @tc.name : 005.flush -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0600 - * @tc.name : 006.stop -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.START, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0800 - * @tc.name : 008.reset -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_START_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0100 - * @tc.name : 001.create -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.FLUSH, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0400 - * @tc.name : 004.start -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP , DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_FLUSH_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0100 - * @tc.name : 001.create -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.STOP, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0400 - * @tc.name : 004.start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_STOP_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0100 - * @tc.name : 001.create -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.RESET, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0400 - * @tc.name : 004.start -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_RESET_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_API_EOS_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) -}) diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncCallbackTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncCallbackTest.test.js deleted file mode 100644 index f6608e20d..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncCallbackTest.test.js +++ /dev/null @@ -1,571 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('VideoSoftwareDecoderFuncCallbackTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let inputQueue = []; - let outputQueue = []; - let isCodecData = false; - let inputEosFlag = false; - let surfaceID = ''; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - const H264_FRAME_SIZE_240 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124, - 2049, 180, 122, 128, 1334, 143, 128, 1379, 116, 1884, 149, 122, 150, 1962, 176, 122, 122, 1197, 139, - 1853, 184, 151, 148, 1692, 209, 129, 126, 1736, 149, 135, 104, 1775, 165, 160, 121, 1653, 163, 123, - 112, 1907, 181, 129, 107, 1808, 177, 125, 111, 2405, 166, 144, 114, 1833, 198, 136, 113, 1960, 206, - 139, 116, 1791, 175, 130, 129, 1909, 194, 138, 119, 1807, 160, 156, 124, 1998, 184, 173, 114, 2069, 181, - 127, 139, 2212, 182, 138, 146, 1993, 214, 135, 139, 2286, 194, 137, 120, 2090, 196, 159, 132, 2294, 194, - 148, 137, 2312, 183, 163, 106, 2118, 201, 158, 127, 2291, 187, 144, 116, 2413, 139, 115, 2148, 178, 122, - 103, 2370, 207, 161, 117, 2291, 213, 159, 129, 2244, 243, 157, 133, 2418, 255, 171, 127, 2316, 185, 160, - 132, 2405, 220, 165, 155, 2539, 219, 172, 128, 2433, 199, 154, 119, 1681, 140, 1960, 143, 2682, 202, 153, - 127, 2794, 239, 158, 155, 2643, 229, 172, 125, 2526, 201, 181, 159, 2554, 233, 167, 125, 2809, 205, 164, - 117, 2707, 221, 156, 138, 2922, 240, 160, 146, 2952, 267, 177, 149, 3339, 271, 175, 136, 3006, 242, 168, - 141, 3068, 232, 194, 149, 2760, 214, 208, 143, 2811, 218, 184, 149, 137, 15486, 2116, 235, 167, 157, 2894, - 305, 184, 139, 3090, 345, 179, 155, 3226, 347, 160, 164, 3275, 321, 184, 174, 3240, 269, 166, 170, 3773, - 265, 169, 155, 3023, 301, 188, 161, 3343, 275, 174, 155, 3526, 309, 177, 173, 3546, 307, 183, 149, 3648, - 295, 213, 170, 3568, 305, 198, 166, 3641, 297, 172, 148, 3608, 301, 200, 159, 3693, 322, 209, 166, 3453, - 318, 206, 162, 3696, 341, 200, 176, 3386, 320, 192, 176, 3903, 373, 207, 187, 3305, 361, 200, 202, 3110, - 367, 220, 197, 2357, 332, 196, 201, 1827, 377, 187, 199, 860, 472, 173, 223, 238]; - const H263_FRAME_SIZE = - [ 96618, 3515, 4132, 4336, 4646, 3497, 4430, 5437, 7560, 4613, 4876, 4734, 53617, 4079, 4507, 5222, 6244, - 5843, 6601, 6622, 6751, 6539, 7666, 7706, 53977, 7311, 12906, 10308, 26791, 15983, 34794, 22110, 37165, - 24267, 36171, 18330, 53228, 7893, 13088, 9502, 8485, 9207, 8681, 9202, 8537, 7603, 9726, 8191, 51872, - 5535, 6146, 6341, 6933, 9365, 7828, 6547, 7638, 7009, 7025, 8873, 51045, 5056, 4858, 4887, 9614, 5953, - 5972, 6116, 6060, 6296, 6239, 6400, 50928, 4937, 5054, 5371, 6728, 6286, 6524, 6646, 6549, 6036, 6214, - 5866, 51109, 4778, 5273, 6327]; - const MPEG2_FRAME_SIZE = - [ 38462, 55096, 8660, 3417, 1197, 2209, 984, 718, 783, 623, 659, 694, 14174, 580, 421, 495, 480, 476, 534, - 660, 699, 601, 603, 720, 12585, 555, 532, 776, 789, 762, 766, 732, 671, 735, 777, 948, 12650, 827, 766, - 835, 747, 847, 940, 1121, 1092, 1001, 980, 989, 12746, 945, 912, 1046, 1118, 1134, 1050, 1073, 1051, 1195, - 1085, 1182, 12874, 992, 1007, 985, 1040, 1143, 1157, 1150, 1247, 1149, 1246, 1145, 12870, 1041, 1066, 1314, - 1239, 1283, 1223, 1224, 1270, 1427, 1406, 1516, 12949, 1228, 1299, 1439, 1358, 1455, 1311, 1396, 1416, 1470, - 1393, 1502, 12999, 1232, 1400, 1348, 1335, 1461, 1404, 1412, 1426, 1548, 1481, 1488, 12840, 1229, 1342, 1323, - 1353, 1524, 1363, 1475, 1540, 1495, 1489, 1438, 12762, 1291, 1303, 1470, 1494, 1488, 1474, 1453, 1607, 1485, - 1589, 1762, 12548, 1363, 1317, 1435, 1411, 1338, 1373, 1605, 1639, 1429, 1392, 1543, 12332, 1255, 1200, 1291, - 1337, 1341, 1356, 1214, 1456, 1353, 1314, 1502, 12151, 1192, 1290, 1203, 1284, 1154, 1264, 1358, 1390, 1433, - 1194, 1325, 11904, 993, 1007, 1149, 1099, 1182, 1076, 1074, 1092, 1030, 1272, 1178, 11710, 966, 879, 860, 955, - 898, 967, 927, 1066, 997, 1083, 940, 11717, 648, 705, 901, 925, 930, 868, 798, 846, 781, 825, 1027, 11587, 785, - 733, 731, 848, 753, 806, 699, 837, 750, 762, 748, 11541, 678, 742, 667, 735, 702, 837, 695, 773, 849, 869, 769, - 11381, 664, 705, 714, 698, 814, 846, 757, 802, 857, 905, 772, 11265, 718, 643, 597, 687, 774, 843, 747, 785, - 683, 1135, 676, 11259, 616, 595, 773, 746, 798, 722, 798, 790, 959, 771, 907, 11234, 705, 675, 773, 764, 846, - 789, 840, 853, 828, 774, 842, 11263, 758, 758, 757, 820, 847, 834, 884, 842, 988, 750, 952, 11236, 776, 640, 727, - 832, 855, 733, 822, 827, 862, 697, 924, 11176, 675, 615, 688, 818, 783, 746, 901, 834, 892, 759, 923, 11181, 661, - 578, 720, 697]; - const MPEG4_FRAME_SIZE = - [ 11895, 8109, 1578, 1616, 1313, 572, 805, 837, 755, 706, 952, 879, 13193, 422, 389, 509, 725, 465, 479, 959, - 677, 364, 541, 696, 9306, 322, 318, 767, 590, 422, 530, 403, 505, 566, 445, 508, 7783, 460, 405, 343, 451, - 608, 431, 411, 543, 487, 527, 400, 6287, 385, 418, 391, 592, 434, 412, 398, 504, 492, 479, 561, 5413, 317, - 355, 422, 467, 452, 476, 460, 490, 492, 485, 451, 5036, 312, 408, 460, 432, 502, 388, 475, 407, 544, 401, - 487, 4404, 362, 378, 427, 416, 426, 456, 414, 438, 424, 442, 444, 4310, 362, 388, 393, 390, 441, 398, 423, - 369, 443, 406, 392, 4231, 343, 363, 355, 390, 459, 371, 378, 381, 405, 392, 426, 3975, 387, 337, 393, 439, - 378, 355, 374, 484, 381, 373, 423, 3869, 312, 350, 400, 345, 356, 320, 473, 431, 386, 338, 431, 3426, 268, - 315, 416, 383, 373, 381, 354, 383, 328, 348, 418, 3715, 324, 361, 331, 350, 302, 409, 377, 359, 384, 334, - 326, 3439, 266, 324, 329, 353, 405, 303, 357, 332, 292, 361, 333, 3542, 294, 284, 247, 331, 306, 322, 287, - 367, 341, 276, 258, 3980, 246, 245, 259, 309, 333, 250, 275, 334, 281, 253, 371, 3640, 213, 231, 301, 302, - 228, 289, 290, 281, 201, 284, 277, 4242, 205, 328, 237, 283, 295, 266, 230, 321, 348, 212, 308, 4103, 259, - 238, 245, 298, 330, 265, 271, 287, 267, 286, 290, 3856, 269, 242, 209, 314, 267, 278, 280, 314, 250, 433, - 238, 3654, 195, 246, 301, 298, 250, 270, 320, 269, 305, 258, 368, 3810, 231, 212, 279, 289, 252, 303, 287, - 295, 206, 264, 349, 4071, 242, 296, 271, 231, 307, 265, 254, 267, 317, 232, 348, 4077, 259, 222, 268, 235, - 324, 266, 256, 312, 246, 248, 325, 4000, 266, 201, 230, 293, 264, 265, 273, 301, 304, 253, 266, 3978, 228, - 232, 250, 248, 281, 219, 243, 293, 287, 253, 328, 3719]; - let fdRead; - let readpath; - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = false; - inputEosFlag = false; - surfaceID = globalThis.value; - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - console.info("case start get content length is: " + len); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject, (err) => { - if (typeof (err) == 'undefined') { - console.info('in case: queueInput success '); - inputCnt += 1; - } else { - console.info(`in case queueInput err called,errMessage is ${error.message}`); - } - }) - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1 ) { - nextStep(); - return; - } - frameCountOut++; - videoDecodeProcessor.freeOutputBuffer(outputObject, (err) => { - if (typeof (err) == 'undefined') { - console.log('in case: release output count:' + frameCountOut); - } else { - console.info(`in case releaseOutput error called,errMessage is ${error.message}`); - } - }) - } - - function setCallback(nextStep){ - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - console.info('in case: setCallback out'); - } - eventEmitter.on('configure', (mediaDescription, srcPath, nextStep, done) => { - console.info('in case : configure in'); - videoDecodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info('in case : configure success'); - setCallback(nextStep); - eventEmitter.emit('setOutputSurface', done); - }); - }); - eventEmitter.on('setOutputSurface', (done) => { - videoDecodeProcessor.setOutputSurface(surfaceID, true, (err) => { - expect(err).assertUndefined(); - console.info('in case : setOutputSurface success, surfaceID ' + surfaceID); - eventEmitter.emit('prepare', done); - }) - }); - eventEmitter.on('prepare', (done) => { - videoDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case : prepare success'); - eventEmitter.emit('start', done); - }); - }); - eventEmitter.on('start', (done) => { - videoDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case : start success'); - }); - }); - eventEmitter.on('stop', (done) => { - videoDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info('in case : stop success'); - eventEmitter.emit('reset', done); - }); - }); - eventEmitter.on('reset', (done) => { - videoDecodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info('in case : reset success'); - eventEmitter.emit('release', done); - }); - }); - eventEmitter.on('release', (done) => { - videoDecodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.info('in case : release success'); - videoDecodeProcessor = null; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - done(); - }); - }); - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_H264_CALLBACK_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_H264_CALLBACK_0100', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - media.createVideoDecoderByName('avdec_h264', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByName success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, done); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG2_CALLBACK_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG2_CALLBACK_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG2_FRAME_SIZE; - let srcPath = 'MPEG2_720_480.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mpeg2', - 'width': 720, - 'height': 480, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - media.createVideoDecoderByName('avdec_mpeg2video', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByName success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, done); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG4_CALLBACK_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG4_CALLBACK_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG4_FRAME_SIZE; - let srcPath = 'mpeg4_320_240.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mp4v-es', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - media.createVideoDecoderByName('avdec_mpeg4', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByName success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, done); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0600 - * @tc.name : test reconfigure for new file with the same format - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0600', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - eventEmitter.on('stop_for_callback_01_0600', (done) => { - videoDecodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info('in case : stop_for_callback_01_0600 success'); - eventEmitter.emit('reset_for_callback_01_0600', done); - }); - }); - eventEmitter.on('reset_for_callback_01_0600', (done) => { - videoDecodeProcessor.reset(async (err) => { - expect(err).assertUndefined(); - console.info('in case : reset_for_callback_01_0600 success'); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - readStreamSync = null; - await getFdRead(readpath, done); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - surfaceID = globalThis.value; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, done); - }); - }); - media.createVideoDecoderByName('avdec_h264', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByName success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop_for_callback_01_0600', done); - }, done); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0700 - * @tc.name : test reconfigure for new file with the different format - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0700', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - eventEmitter.on('stop_for_callback_01_0700', (done) => { - videoDecodeProcessor.stop(async(err) => { - expect(err).assertUndefined(); - console.info('in case : stop_for_callback_01_0700 success'); - eventEmitter.emit('reset_for_callback_01_0700', done); - }); - }); - eventEmitter.on('reset_for_callback_01_0700', (done) => { - videoDecodeProcessor.reset(async (err) => { - expect(err).assertUndefined(); - console.info('in case : reset_for_callback_01_0700 success'); - srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - readStreamSync = null; - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - surfaceID = globalThis.value; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop', done); - }, done); - }); - }); - media.createVideoDecoderByName('avdec_h264', (err, processor) => { - expect(err).assertUndefined(); - console.info('in case : createVideoDecoderByName success'); - videoDecodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription, srcPath, - function() { - eventEmitter.emit('stop_for_callback_01_0700', done); - }, done); - }); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncPromiseTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncPromiseTest.test.js deleted file mode 100644 index 00f9aaa10..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareFuncPromiseTest.test.js +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - - -describe('VideoSoftwareDecoderFuncPromiseTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let inputQueue = []; - let outputQueue = []; - let isCodecData = false; - let inputEosFlag = false; - let surfaceID = ''; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - const H264_FRAME_SIZE_240 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124, - 2049, 180, 122, 128, 1334, 143, 128, 1379, 116, 1884, 149, 122, 150, 1962, 176, 122, 122, 1197, 139, - 1853, 184, 151, 148, 1692, 209, 129, 126, 1736, 149, 135, 104, 1775, 165, 160, 121, 1653, 163, 123, - 112, 1907, 181, 129, 107, 1808, 177, 125, 111, 2405, 166, 144, 114, 1833, 198, 136, 113, 1960, 206, - 139, 116, 1791, 175, 130, 129, 1909, 194, 138, 119, 1807, 160, 156, 124, 1998, 184, 173, 114, 2069, 181, - 127, 139, 2212, 182, 138, 146, 1993, 214, 135, 139, 2286, 194, 137, 120, 2090, 196, 159, 132, 2294, 194, - 148, 137, 2312, 183, 163, 106, 2118, 201, 158, 127, 2291, 187, 144, 116, 2413, 139, 115, 2148, 178, 122, - 103, 2370, 207, 161, 117, 2291, 213, 159, 129, 2244, 243, 157, 133, 2418, 255, 171, 127, 2316, 185, 160, - 132, 2405, 220, 165, 155, 2539, 219, 172, 128, 2433, 199, 154, 119, 1681, 140, 1960, 143, 2682, 202, 153, - 127, 2794, 239, 158, 155, 2643, 229, 172, 125, 2526, 201, 181, 159, 2554, 233, 167, 125, 2809, 205, 164, - 117, 2707, 221, 156, 138, 2922, 240, 160, 146, 2952, 267, 177, 149, 3339, 271, 175, 136, 3006, 242, 168, - 141, 3068, 232, 194, 149, 2760, 214, 208, 143, 2811, 218, 184, 149, 137, 15486, 2116, 235, 167, 157, 2894, - 305, 184, 139, 3090, 345, 179, 155, 3226, 347, 160, 164, 3275, 321, 184, 174, 3240, 269, 166, 170, 3773, - 265, 169, 155, 3023, 301, 188, 161, 3343, 275, 174, 155, 3526, 309, 177, 173, 3546, 307, 183, 149, 3648, - 295, 213, 170, 3568, 305, 198, 166, 3641, 297, 172, 148, 3608, 301, 200, 159, 3693, 322, 209, 166, 3453, - 318, 206, 162, 3696, 341, 200, 176, 3386, 320, 192, 176, 3903, 373, 207, 187, 3305, 361, 200, 202, 3110, - 367, 220, 197, 2357, 332, 196, 201, 1827, 377, 187, 199, 860, 472, 173, 223, 238]; - const H263_FRAME_SIZE = - [ 96618, 3515, 4132, 4336, 4646, 3497, 4430, 5437, 7560, 4613, 4876, 4734, 53617, 4079, 4507, 5222, 6244, - 5843, 6601, 6622, 6751, 6539, 7666, 7706, 53977, 7311, 12906, 10308, 26791, 15983, 34794, 22110, 37165, - 24267, 36171, 18330, 53228, 7893, 13088, 9502, 8485, 9207, 8681, 9202, 8537, 7603, 9726, 8191, 51872, - 5535, 6146, 6341, 6933, 9365, 7828, 6547, 7638, 7009, 7025, 8873, 51045, 5056, 4858, 4887, 9614, 5953, - 5972, 6116, 6060, 6296, 6239, 6400, 50928, 4937, 5054, 5371, 6728, 6286, 6524, 6646, 6549, 6036, 6214, - 5866, 51109, 4778, 5273, 6327]; - const MPEG2_FRAME_SIZE = - [ 38462, 55096, 8660, 3417, 1197, 2209, 984, 718, 783, 623, 659, 694, 14174, 580, 421, 495, 480, 476, 534, - 660, 699, 601, 603, 720, 12585, 555, 532, 776, 789, 762, 766, 732, 671, 735, 777, 948, 12650, 827, 766, - 835, 747, 847, 940, 1121, 1092, 1001, 980, 989, 12746, 945, 912, 1046, 1118, 1134, 1050, 1073, 1051, 1195, - 1085, 1182, 12874, 992, 1007, 985, 1040, 1143, 1157, 1150, 1247, 1149, 1246, 1145, 12870, 1041, 1066, 1314, - 1239, 1283, 1223, 1224, 1270, 1427, 1406, 1516, 12949, 1228, 1299, 1439, 1358, 1455, 1311, 1396, 1416, 1470, - 1393, 1502, 12999, 1232, 1400, 1348, 1335, 1461, 1404, 1412, 1426, 1548, 1481, 1488, 12840, 1229, 1342, 1323, - 1353, 1524, 1363, 1475, 1540, 1495, 1489, 1438, 12762, 1291, 1303, 1470, 1494, 1488, 1474, 1453, 1607, 1485, - 1589, 1762, 12548, 1363, 1317, 1435, 1411, 1338, 1373, 1605, 1639, 1429, 1392, 1543, 12332, 1255, 1200, 1291, - 1337, 1341, 1356, 1214, 1456, 1353, 1314, 1502, 12151, 1192, 1290, 1203, 1284, 1154, 1264, 1358, 1390, 1433, - 1194, 1325, 11904, 993, 1007, 1149, 1099, 1182, 1076, 1074, 1092, 1030, 1272, 1178, 11710, 966, 879, 860, 955, - 898, 967, 927, 1066, 997, 1083, 940, 11717, 648, 705, 901, 925, 930, 868, 798, 846, 781, 825, 1027, 11587, 785, - 733, 731, 848, 753, 806, 699, 837, 750, 762, 748, 11541, 678, 742, 667, 735, 702, 837, 695, 773, 849, 869, 769, - 11381, 664, 705, 714, 698, 814, 846, 757, 802, 857, 905, 772, 11265, 718, 643, 597, 687, 774, 843, 747, 785, - 683, 1135, 676, 11259, 616, 595, 773, 746, 798, 722, 798, 790, 959, 771, 907, 11234, 705, 675, 773, 764, 846, - 789, 840, 853, 828, 774, 842, 11263, 758, 758, 757, 820, 847, 834, 884, 842, 988, 750, 952, 11236, 776, 640, 727, - 832, 855, 733, 822, 827, 862, 697, 924, 11176, 675, 615, 688, 818, 783, 746, 901, 834, 892, 759, 923, 11181, 661, - 578, 720, 697]; - const MPEG4_FRAME_SIZE = - [ 11895, 8109, 1578, 1616, 1313, 572, 805, 837, 755, 706, 952, 879, 13193, 422, 389, 509, 725, 465, 479, 959, - 677, 364, 541, 696, 9306, 322, 318, 767, 590, 422, 530, 403, 505, 566, 445, 508, 7783, 460, 405, 343, 451, - 608, 431, 411, 543, 487, 527, 400, 6287, 385, 418, 391, 592, 434, 412, 398, 504, 492, 479, 561, 5413, 317, - 355, 422, 467, 452, 476, 460, 490, 492, 485, 451, 5036, 312, 408, 460, 432, 502, 388, 475, 407, 544, 401, - 487, 4404, 362, 378, 427, 416, 426, 456, 414, 438, 424, 442, 444, 4310, 362, 388, 393, 390, 441, 398, 423, - 369, 443, 406, 392, 4231, 343, 363, 355, 390, 459, 371, 378, 381, 405, 392, 426, 3975, 387, 337, 393, 439, - 378, 355, 374, 484, 381, 373, 423, 3869, 312, 350, 400, 345, 356, 320, 473, 431, 386, 338, 431, 3426, 268, - 315, 416, 383, 373, 381, 354, 383, 328, 348, 418, 3715, 324, 361, 331, 350, 302, 409, 377, 359, 384, 334, - 326, 3439, 266, 324, 329, 353, 405, 303, 357, 332, 292, 361, 333, 3542, 294, 284, 247, 331, 306, 322, 287, - 367, 341, 276, 258, 3980, 246, 245, 259, 309, 333, 250, 275, 334, 281, 253, 371, 3640, 213, 231, 301, 302, - 228, 289, 290, 281, 201, 284, 277, 4242, 205, 328, 237, 283, 295, 266, 230, 321, 348, 212, 308, 4103, 259, - 238, 245, 298, 330, 265, 271, 287, 267, 286, 290, 3856, 269, 242, 209, 314, 267, 278, 280, 314, 250, 433, - 238, 3654, 195, 246, 301, 298, 250, 270, 320, 269, 305, 258, 368, 3810, 231, 212, 279, 289, 252, 303, 287, - 295, 206, 264, 349, 4071, 242, 296, 271, 231, 307, 265, 254, 267, 317, 232, 348, 4077, 259, 222, 268, 235, - 324, 266, 256, 312, 246, 248, 325, 4000, 266, 201, 230, 293, 264, 265, 273, 301, 304, 253, 266, 3978, 228, - 232, 250, 248, 281, 219, 243, 293, 287, 253, 328, 3719]; - let fdRead; - let readpath; - let outputCnt = 0; - let inputCnt = 0; - let frameThreshold = 10; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = false; - inputEosFlag = false; - surfaceID = globalThis.value; - outputCnt = 0; - inputCnt = 0; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${error.message}`); - expect(err).assertUndefined(); - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - async function getFdRead(readPath, done) { - await mediaTestBase.getFdRead(readPath, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, len) { - console.info("case start get content"); - console.info("case start get content length is: " + len); - let lengthreal = -1; - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - console.info('case lengthreal is :' + lengthreal); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case: queueInput success '); - inputCnt += 1; - }, failCallback).catch(failCatch); - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1) { - nextStep(); - return; - } - frameCountOut++; - await videoDecodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.log('in case: release output count:' + frameCountOut); - }, failCallback).catch(failCatch); - } - - function setCallback(nextStep){ - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - outputCnt += 1; - if (outputCnt == 1 && outBuffer.flags == 1) { - console.info("case error occurs! first output is EOS"); - expect().assertFail(); - } - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - console.info('in case: setCallback out'); - } - - async function toCreateVideoDecoderByMime(mime, done) { - await media.createVideoDecoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByMime success'); - } else { - console.info('in case : createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - async function toCreateVideoDecoderByName(name, done) { - await media.createVideoDecoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByName success'); - } else { - console.info('in case : createVideoDecoderByName fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - async function toConfigure(mediaDescription, srcPath) { - await videoDecodeProcessor.configure(mediaDescription).then(() =>{ - console.info('in case : configure success'); - }, failCallback).catch(failCatch); - } - async function toSetOutputSurface(isDisplay) { - await videoDecodeProcessor.setOutputSurface(surfaceID, isDisplay).then(() => { - console.info('in case : setOutputSurface success. surfaceID ' + surfaceID); - }, failCallback).catch(failCatch); - } - eventEmitter.on('nextStep', async (done) => { - console.info('in case : nextStep success'); - await videoDecodeProcessor.stop().then(() => { - console.info('in case : stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('in case : reset success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.release().then(() => { - console.info('in case : release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - expect(outputCnt).assertClose(inputCnt, frameThreshold); - console.info('in case : done'); - done(); - }); - async function toPrepare() { - await videoDecodeProcessor.prepare().then(() => { - console.info('in case : prepare success'); - }, failCallback).catch(failCatch); - } - async function toStart() { - await videoDecodeProcessor.start().then(() => { - console.info('in case : start success'); - }, failCallback).catch(failCatch); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_H264_PROMISE_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_H264_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByName('avdec_h264', done); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG2_PROMISE_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG2_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG2_FRAME_SIZE; - let srcPath = 'MPEG2_720_480.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mpeg2', - 'width': 720, - 'height': 480, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByName('avdec_mpeg2video', done); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG4_PROMISE_0100 - * @tc.name : 001.basic Video decode function - * @tc.desc : start-> EOS -> stop -> reset - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_MPEG4_PROMISE_0100', 0, async function (done) { - ES_FRAME_SIZE = MPEG4_FRAME_SIZE; - let srcPath = 'mpeg4_320_240.es'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/mp4v-es', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByName('avdec_mpeg4', done); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0600 - * @tc.name : test reconfigure for new file with the same format - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0600', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByName('avdec_h264', done); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - eventEmitter.once('reConfigure_for_promise_01_0600', async (done) => { - console.info('in case : reConfigure_for_promise_01_0600 success'); - await videoDecodeProcessor.stop().then(() => { - console.info('in case : stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('in case : reset success'); - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - readStreamSync = null; - await getFdRead(readpath, done); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - surfaceID = globalThis.value; - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }); - setCallback( - function(){eventEmitter.emit('reConfigure_for_promise_01_0600', done);} - ); - await toPrepare(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0700 - * @tc.name : test reconfigure for new file with the different format - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0700', 0, async function (done) { - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - isCodecData = true; - let srcPath = 'out_320_240_10s.h264'; - readpath = srcPath; - await getFdRead(readpath, done); - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - await toCreateVideoDecoderByName('avdec_h264', done); - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - srcPath = 'out_320_240_10s.h264'; - mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60.00, - 'max_input_size': 150000, - } - eventEmitter.on('reConfigure_for_promise_01_0700', async (done) => { - console.info('in case : reConfigure_for_promise_01_0700 success'); - await videoDecodeProcessor.stop().then(() => { - console.info('in case : stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('in case : reset success'); - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - readStreamSync = null; - ES_FRAME_SIZE = H264_FRAME_SIZE_240; - readpath = srcPath; - await getFdRead(readpath, done); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - surfaceID = globalThis.value; - await toConfigure(mediaDescription, srcPath); - await toSetOutputSurface(true); - setCallback( - function(){eventEmitter.emit('nextStep', done);} - ); - await toPrepare(); - await toStart(); - }); - setCallback( - function(){eventEmitter.emit('reConfigure_for_promise_01_0700', done);} - ); - await toPrepare(); - await toStart(); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliCallbackTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliCallbackTest.test.js deleted file mode 100644 index 84bac5423..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliCallbackTest.test.js +++ /dev/null @@ -1,1284 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -const DECODE_STEP = { - WAIT_FOR_EOS : 'waitForEOS', - CONFIGURE : 'configure', - SETSURFACE : 'setSurface', - PREPARE : 'prepare', - START : 'start', - FLUSH : 'flush', - STOP : 'stop', - RESET : 'reset', - WAIT_FOR_ALL_OUTS : 'waitForAllOuts', - ERROR : 'error', - RELEASE : 'release', -} - -describe('VideoDecoderSoftwareReliCallbackTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let position = 0; - let eosFrameId = -1; - let inputQueue = []; - let outputQueue = []; - let isCodecData = true; - let inputEosFlag = false; - let workdoneAtEOS = false; - let surfaceID = ''; - const SRCPATH = 'out_320_240_10s.h264'; - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60, - 'max_input_size': 150000, - } - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124]; - let ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - let fdRead; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - workdoneAtEOS = false; - eosFrameId = -1; - inputEosFlag = false; - position = 0; - surfaceID = globalThis.value; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - let failCallback = function(err) { - console.info(`in case error failCallback called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let failCatch = function(err) { - console.info(`in case error failCatch called,errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - function printError(err, expectFail) { - expect((err != undefined) == expectFail).assertTrue(); - if (expectFail == false && err != undefined) { - console.info('in case error failCatch called,err is ' + err); - console.info(`in case error failCatch called,errMessage is ${err.message}`); - } - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, pos, len) { - console.info('start get content, len ' + len + ' buf.byteLength ' + buf.byteLength); - let lengthReal = -1; - try { - if (pos == -1) { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - }); - } else { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - position: pos, - }); - } - console.info('in case: lengthReal: ' + lengthReal); - } catch(e) { - console.error('in case error getContent err ' + err); - } - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, position, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - position = position + ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 1000 / mediaDescription.frame_rate; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length || frameCountIn == eosFrameId) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject, (err) => { - console.info('in case: queueInput success '); - }) - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1 ) { - if (workdoneAtEOS) { - doneWork(nextStep); - } - return; - } - frameCountOut++; - videoDecodeProcessor.freeOutputBuffer(outputObject, () => { - console.log('in case: release output count:' + frameCountOut); - }) - } - - function toConfigure(mySteps, done, expectFail) { - videoDecodeProcessor.configure(mediaDescription, (err) => { - console.info(`case configure callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }) - } - function toPrepare(mySteps, done, expectFail) { - videoDecodeProcessor.prepare((err) => { - console.info(`case prepare callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toStart(mySteps, done, expectFail) { - let timeDelay = 0; - videoDecodeProcessor.start((err) => { - console.info(`case start callback`); - printError(err, expectFail); - if (mySteps[0] == DECODE_STEP.FLUSH) { - timeDelay = 50; - } - setTimeout(() => { - toNextStep(mySteps, done); - }, timeDelay); - }); - } - function toFlush(mySteps, done, expectFail) { - videoDecodeProcessor.flush((err) => { - console.info(`case flush callback`); - printError(err, expectFail); - if (expectFail == false) { - inputEosFlag = false; - position = ES_FRAME_SIZE[0]; - inputQueue = []; - timestamp = 0; - frameCountIn = 1; - } - toNextStep(mySteps, done); - }); - } - function toStop(mySteps, done, expectFail) { - videoDecodeProcessor.stop((err) => { - console.info(`case stop callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toReset(mySteps, done, expectFail) { - videoDecodeProcessor.reset((err) => { - console.info(`case reset callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toSetOutputSurface(mySteps, done, expectFail) { - videoDecodeProcessor.setOutputSurface(surfaceID, true, (err) => { - console.info('case setOutputSurface callback, surfaceID ' + surfaceID); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - - function toNextStep(mySteps, done) { - console.info('case myStep[0]: ' + mySteps[0]); - if (mySteps[0] == DECODE_STEP.RELEASE) { - if (videoDecodeProcessor != null){ - videoDecodeProcessor.release((err) => { - printError(err, false); - console.info('in case : videoDecodeProcessor release callback'); - videoDecodeProcessor = null; - console.info('case to done'); - done(); - }); - } - return; - } - switch (mySteps[0]) { - case DECODE_STEP.CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toConfigure(mySteps, done, true); - } else { - toConfigure(mySteps, done, false); - } - break; - case DECODE_STEP.SETSURFACE: - mySteps.shift(); - console.info(`case to setOutputSurface`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toSetOutputSurface(mySteps, done, true); - } else { - toSetOutputSurface(mySteps, done, false); - } - break; - case DECODE_STEP.PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toPrepare(mySteps, done, true); - } else { - toPrepare(mySteps, done, false); - } - break; - case DECODE_STEP.START: - mySteps.shift(); - console.info(`case to start`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toStart(mySteps, done, true); - } else { - readStreamSync = undefined; - frameCountIn = 0; - frameCountOut = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - position = 0; - toStart(mySteps, done, false); - } - break; - case DECODE_STEP.FLUSH: - mySteps.shift(); - console.info(`case to flush`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toFlush(mySteps, done, true); - } else { - toFlush(mySteps, done, false); - } - break; - case DECODE_STEP.STOP: - mySteps.shift(); - console.info(`case to stop`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toStop(mySteps, done, true); - } else { - toStop(mySteps, done, false); - } - break; - case DECODE_STEP.RESET: - mySteps.shift(); - console.info(`case to reset`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toReset(mySteps, done, true); - } else { - toReset(mySteps, done, false); - } - break; - case DECODE_STEP.WAIT_FOR_EOS: - mySteps.shift(); - setTimeout(() =>{ - expect(inputEosFlag).assertTrue(); - if (inputEosFlag == false) { - console.info(`in case error wait for eos: inputEosFlag = false`); - } - toNextStep(mySteps, done); - }, 7000); // wait 7000 ms for eos - break; - case DECODE_STEP.WAIT_FOR_ALL_OUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - default: - break; - } - } - - function setCallback(nextStep){ - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - } - - function toCreateVideoDecoderByMime(mime, mySteps, done) { - media.createVideoDecoderByMime(mime, (err, processor) => { - console.info(`case createVideoDecoderByMime callback`); - printError(err, false); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }) - } - async function toCreateVideoDecoderByName(name, mySteps, done) { - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - await media.createVideoDecoderByName(name, (err, processor) => { - printError(err, false); - console.info(`case createVideoDecoderByName callback`); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }) - } - async function doneWork(nextStep) { - videoDecodeProcessor.stop((err) => { - printError(err, false); - console.info('case stop callback'); - videoDecodeProcessor.reset((err) => { - printError(err, false); - console.info('case reset callback'); - videoDecodeProcessor.release((err) => { - printError(err, false); - console.info('case release callback'); - videoDecodeProcessor = null; - nextStep(); - }) - }) - }) - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0100 - * @tc.name : test set EOS manually before last frame and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0200 - * @tc.name : test flush at running state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0300 - * @tc.name : test flush at EOS state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - eosFrameId = 10; - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0400 - * @tc.name : test stop at running state and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0500 - * @tc.name : test stop and restart - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0100 - * @tc.name : 001.create -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0300 - * @tc.name : 003.start -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_CALLBACK_0900', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS , - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0100 - * @tc.name : 001.create -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0200 - * @tc.name : 002.configure -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0400 - * @tc.name : 004.start -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0500 - * @tc.name : 005.flush -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0600 - * @tc.name : 006.stop -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.START, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0800 - * @tc.name : 008.reset -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0100 - * @tc.name : 001.create -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.FLUSH, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0400 - * @tc.name : 004.start -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP , DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0100 - * @tc.name : 001.create -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.STOP, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0400 - * @tc.name : 004.start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0100 - * @tc.name : 001.create -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.RESET, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0400 - * @tc.name : 004.start -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_CALLBACK_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_CALLBACK_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) -}) diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliPromiseTest.test.js b/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliPromiseTest.test.js deleted file mode 100644 index 3f483dcbe..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/js/test/VideoDecoderSoftwareReliPromiseTest.test.js +++ /dev/null @@ -1,1279 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import router from '@system.router' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -const DECODE_STEP = { - WAIT_FOR_EOS : 'waitForEOS', - CONFIGURE : 'configure', - SETSURFACE : 'setSurface', - PREPARE : 'prepare', - START : 'start', - FLUSH : 'flush', - STOP : 'stop', - RESET : 'reset', - WAIT_FOR_ALL_OUTS : 'waitForAllOuts', - ERROR : 'error', - RELEASE : 'release', -} - -describe('VideoDecoderSoftwareReliPromiseTest', function () { - let videoDecodeProcessor = null; - let readStreamSync = undefined; - let frameCountIn = 0; - let frameCountOut = 0; - let timestamp = 0; - let position = 0; - let eosFrameId = -1; - let inputQueue = []; - let outputQueue = []; - let isCodecData = true; - let inputEosFlag = false; - let workdoneAtEOS = false; - let surfaceID = ''; - const SRCPATH = 'out_320_240_10s.h264'; - let mediaDescription = { - 'track_type': 1, - 'codec_mime': 'video/avc', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 60, - 'max_input_size': 150000, - } - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122, - 2065, 262, 159, 206, 2251, 269, 179, 170, 2056, 308, 168, 191, 2090, 303, 191, 110, 1932, 272, 162, - 122, 1877, 245, 167, 141, 1908, 294, 162, 118, 1493, 132, 1782, 273, 184, 133, 1958, 274, 180, 149, - 2070, 216, 169, 143, 1882, 224, 149, 139, 1749, 277, 184, 139, 2141, 197, 170, 140, 2002, 269, 162, - 140, 1862, 202, 179, 131, 1868, 214, 164, 140, 1546, 226, 150, 130, 1707, 162, 146, 1824, 181, 147, - 130, 1898, 209, 143, 131, 1805, 180, 148, 106, 1776, 147, 141, 1572, 177, 130, 105, 1776, 178, 144, - 122, 1557, 142, 124, 114, 1436, 143, 126, 1326, 127, 1755, 169, 127, 105, 1807, 177, 131, 134, 1613, - 187, 137, 136, 1314, 134, 118, 2005, 194, 129, 147, 1566, 185, 132, 131, 1236, 174, 137, 106, 11049, - 574, 126, 1242, 188, 130, 119, 1450, 187, 137, 141, 1116, 124, 1848, 138, 122, 1605, 186, 127, 140, - 1798, 170, 124, 121, 1666, 157, 128, 130, 1678, 135, 118, 1804, 169, 135, 125, 1837, 168, 124, 124]; - let ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - let fdRead; - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await toDisplayPage().then(() => { - }, failCallback).catch(failCatch); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - frameCountIn = 0; - frameCountOut = 0; - timestamp = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - workdoneAtEOS = false; - eosFrameId = -1; - inputEosFlag = false; - position = 0; - surfaceID = globalThis.value; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoDecodeProcessor != null) { - await videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await router.clear().then(() => { - }, failCallback).catch(failCatch); - await fileio.close(fdRead); - }) - - afterAll(async function() { - console.info('afterAll case'); - }) - let caseCallback = function(err) { - console.info(`in case caseCallback called, caseMessage is ${err.message}`); - } - let failCallback = function(err) { - console.error(`in case error failCallback called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let failCatch = function(err) { - console.error(`in case error failCatch called,errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let callbackExpectOK = function(err, mySteps, done) { - console.error(`in case error callbackExpectOK called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - toNextStep(mySteps, done); - } - let callbackExpectFail = function(err, mySteps, done) { - console.info(`in case callbackExpectFail called, errMessage is ${err.message}`); - expect(err != undefined).assertTrue(); - toNextStep(mySteps, done); - } - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - async function toDisplayPage() { - let path = 'pages/display/display'; - let options = { - uri: path, - } - try { - await router.push(options); - } catch (e) { - console.error('in case toDisplayPage' + e); - } - } - - function readFile(path) { - console.info('case read file start execution'); - try{ - console.info('case filepath: ' + path); - readStreamSync = fileio.fdopenStreamSync(fdRead, 'rb'); - }catch(e) { - console.info(e); - } - } - - function getContent(buf, pos, len) { - console.info('start get content, len ' + len + ' buf.byteLength ' + buf.byteLength); - let lengthReal = -1; - try { - if (pos == -1) { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - }); - } else { - lengthReal = fileio.readSync(fdRead, buf, { - length: len, - position: pos, - }); - } - console.info('in case: lengthReal: ' + lengthReal); - } catch(e) { - console.error('in case error getContent err ' + err); - } - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - console.log('in case: inputObject.index: ' + inputObject.index); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, position, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - position = position + ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 1000 / mediaDescription.frame_rate; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length || frameCountIn == eosFrameId) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case: queueInput success '); - }, caseCallback).catch(failCatch); - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(nextStep, outputObject) { - if (outputObject.flags == 1 ) { - if (workdoneAtEOS) { - await doneWork(); - nextStep(); - } - return; - } - frameCountOut++; - videoDecodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('in case: release output success'); - console.log('in case: release output count:' + frameCountOut); - }, caseCallback).catch(failCatch); - } - - function toConfigure(mySteps, done, failureCallback, catchCallback) { - videoDecodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - function toPrepare(mySteps, done, failureCallback, catchCallback) { - videoDecodeProcessor.prepare().then(() => { - console.info(`case prepare success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - function toStart(mySteps, done, failureCallback, catchCallback) { - let timeDelay = 0; - videoDecodeProcessor.start().then(() => { - console.info(`case start success`); - if (mySteps[0] == DECODE_STEP.FLUSH) { - timeDelay = 50; - } - setTimeout(() => { - toNextStep(mySteps, done); - }, timeDelay); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - function toFlush(mySteps, done, failureCallback, catchCallback) { - videoDecodeProcessor.flush().then(() => { - console.info(`case flush success`); - position = ES_FRAME_SIZE[0]; - inputQueue = []; - timestamp = 0; - inputEosFlag = false; - frameCountIn = 1; - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - function toStop(mySteps, done, failureCallback, catchCallback) { - videoDecodeProcessor.stop().then(() => { - console.info(`case stop success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - function toReset(mySteps, done, failureCallback, catchCallback) { - videoDecodeProcessor.reset().then(() => { - console.info(`case reset success`); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - function toSetOutputSurface(mySteps, done, failureCallback, catchCallback) { - videoDecodeProcessor.setOutputSurface(surfaceID, true).then(() => { - console.info('in case : setOutputSurface success, surfaceID ' + surfaceID); - toNextStep(mySteps, done); - }, (err) => {failureCallback(err, mySteps, done)}).catch(catchCallback); - } - - function toNextStep(mySteps, done) { - console.info('case myStep[0]: ' + mySteps[0]); - if (mySteps[0] == DECODE_STEP.RELEASE) { - if (videoDecodeProcessor != null) { - videoDecodeProcessor.release().then(() => { - console.info('in case : videoDecodeProcessor release success'); - videoDecodeProcessor = null; - console.info('case to done'); - done(); - }, failCallback).catch(failCatch); - } - return; - } - switch (mySteps[0]) { - case DECODE_STEP.CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toConfigure(mySteps, done, callbackExpectFail, failCatch); - } else { - toConfigure(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.SETSURFACE: - mySteps.shift(); - console.info(`case to setOutputSurface`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toSetOutputSurface(mySteps, done, callbackExpectFail, failCatch); - } else { - toSetOutputSurface(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toPrepare(mySteps, done, callbackExpectFail, failCatch); - } else { - toPrepare(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.START: - mySteps.shift(); - console.info(`case to start`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toStart(mySteps, done, callbackExpectFail, failCatch); - } else { - readStreamSync = undefined; - frameCountIn = 0; - frameCountOut = 0; - inputQueue = []; - outputQueue = []; - isCodecData = true; - inputEosFlag = false; - position = 0; - toStart(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.FLUSH: - mySteps.shift(); - console.info(`case to flush`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toFlush(mySteps, done, callbackExpectFail, failCatch); - } else { - toFlush(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.STOP: - mySteps.shift(); - console.info(`case to stop`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toStop(mySteps, done, callbackExpectFail, failCatch); - } else { - toStop(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.RESET: - mySteps.shift(); - console.info(`case to reset`); - if (mySteps[0] == DECODE_STEP.ERROR) { - mySteps.shift(); - toReset(mySteps, done, callbackExpectFail, failCatch); - } else { - toReset(mySteps, done, callbackExpectOK, failCatch); - } - break; - case DECODE_STEP.WAIT_FOR_EOS: - mySteps.shift(); - setTimeout(async() =>{ - expect(inputEosFlag).assertTrue(); - if (inputEosFlag == false) { - console.info(`in case error inputEosFlag == false`); - } - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - toNextStep(mySteps, done); - }, 7000); // wait 7000 ms for eos - break; - case DECODE_STEP.WAIT_FOR_ALL_OUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - default: - break; - } - } - - function setCallback(nextStep){ - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - dequeueOutputs(nextStep, outBuffer); - }); - - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoDecodeProcessor.on('streamChanged', (format) => { - console.info('in case: Output format changed: ' + format.toString()); - }); - } - - function toCreateVideoDecoderByMime(mime, mySteps, done) { - media.createVideoDecoderByMime(mime).then((processor) => { - console.info(`case createVideoDecoderByMime success`); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }, failCallback).catch(failCatch); - } - async function toCreateVideoDecoderByName(name, mySteps, done) { - await mediaTestBase.getFdRead(SRCPATH, done).then((fdNumber) => { - fdRead = fdNumber; - }) - await media.createVideoDecoderByName(name).then((processor) => { - console.info(`case createVideoDecoderByName success`); - videoDecodeProcessor = processor; - setCallback(done); - toNextStep(mySteps, done); - }, failCallback).catch(failCatch); - } - async function doneWork() { - await videoDecodeProcessor.stop().then(() => { - console.info('case stop success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.reset().then(() => { - console.info('case reset success'); - }, failCallback).catch(failCatch); - await videoDecodeProcessor.release().then(() => { - console.info('case release success'); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0100 - * @tc.name : test set EOS manually before last frame and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0200 - * @tc.name : test flush at running state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.WAIT_FOR_ALL_OUTS); - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0300 - * @tc.name : test flush at EOS state - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_ALL_OUTS); - eosFrameId = 10; - workdoneAtEOS = true; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0400 - * @tc.name : test stop at running state and reset - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0500 - * @tc.name : test stop and restart - * @tc.desc : test basic function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_FUNCTION_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0100 - * @tc.name : 001.create -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0300 - * @tc.name : 003.start -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.CONFIGURE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_CONFIGURE_PROMISE_0900', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS , - DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_PREPARE_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.PREPARE, DECODE_STEP.ERROR, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0100 - * @tc.name : 001.create -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0200 - * @tc.name : 002.configure -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0400 - * @tc.name : 004.start -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0500 - * @tc.name : 005.flush -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0600 - * @tc.name : 006.stop -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.START, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0800 - * @tc.name : 008.reset -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_START_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.START, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0100 - * @tc.name : 001.create -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.FLUSH, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0400 - * @tc.name : 004.start -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP , DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_FLUSH_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.FLUSH, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0100 - * @tc.name : 001.create -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.STOP, - DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0400 - * @tc.name : 004.start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_STOP_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.STOP, DECODE_STEP.ERROR, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0100 - * @tc.name : 001.create -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.RESET, - DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0400 - * @tc.name : 004.start -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.FLUSH, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0600', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.STOP, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0700', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_RESET_PROMISE_0800', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.RESET, DECODE_STEP.RESET, DECODE_STEP.RELEASE); - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0100', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0200', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.FLUSH, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0300', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.RESET, DECODE_STEP.CONFIGURE, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0400', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_DECODER_API_EOS_PROMISE_0500', 0, async function (done) { - let mySteps = new Array(DECODE_STEP.CONFIGURE, DECODE_STEP.SETSURFACE, DECODE_STEP.PREPARE, DECODE_STEP.START, - DECODE_STEP.WAIT_FOR_EOS, DECODE_STEP.STOP, DECODE_STEP.START, DECODE_STEP.STOP, DECODE_STEP.RELEASE); - eosFrameId = 10; - toCreateVideoDecoderByName('avdec_h264', mySteps, done); - }) -}) diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/element/string.json deleted file mode 100644 index 0bae6bd40..000000000 --- a/multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "entry_MainAbility", - "value": "entry_MainAbility" - }, - { - "name": "mainability_description", - "value": "JS_Empty Ability" - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/videoDecoder/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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

Sez^YphRw)TUHhNqb{5x4;FG0)5dwf!UL&Sq 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%0Dn+3gS5%-*Hd&$*?7~#HH~cr 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�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Ð)u|CWOhL%OY(gQu9)!cRMhrw&UtKp+9D*~`+D8M|;jI$ww zOemk{G!hvJlayL@)RxjE77y3dp3C^h>^sVuUvMPan2}Sq5C6jKx7eW#9hR~u^J3Yw z{0nF{1e+I%tiV-iwV3v|!!aAR$WzEk*uF$`sD$@hg!F+FvCRkpI2RT)Z|&Q`W^BDJ zs|!4hYl^Mg@w{9St5r~5Z4o)8I<$az&P6%OBFj7b1I(A};44kNtV7I2&XdM;ee~YX z?W{jKf**XvT)$`4%~z}is~Kk)9*79zjH<-bjxM4vU(E@9b0LGML5DKn-x^awl9>)@ z&3V&!3~SKzpUbo#Vs+%mZR^Fymp4H)V!k%urXWN`=QHPj2mU<6uAh~ctB7XewjTbc z9zsTa0{TQbcpO9RD#{BlF}GPpG^aUQTj5R$a30?jBcP&P;0e0>AR})~XPr>Koqb}y zxyHckj#>pxN(j*eBf(qBKH{a~C0epY;u7np?(Wvxej^+|=BJY+X=T_7Lj9g7bTtO$ z2o)%jm+=kry|2U;;15Glei^F8hkp7CIy2_&GZn39ZWPKz;xGuGJz%WPFrLt*oEq|M zRMDgcimEEBEEs82Jy(*S%}pAe?b+N5e44?InLI4d-*7zhjnrJNRHTKSh(M+ZyCVGW z3ay7=tE7lBzqjdgVqvxkjTQO6tP2G#_vXa&zR&{126K|5uESol5Pv^vr4(Nx{YeHR za^?^;?3Sa7rtw?X@`;-@9NxYlTsehv-BXm$;_t!M9yVoOvY#^>xg6(R>tY#owR?+~ z43*2*J*DZMl06SHF1M{007ue2cv3$1Eh2qA2fg3v3cw?6P`2Y00{2#VauXlk z+C-w`4tOx5;cE|9{Lw|)i+x}a&yqypjJ`4IcoNRh5R9xG{jzS292!Qa^Jy4=m_6Yz z0^m{eSbNYs#h3mP6q=1+euOXF$vrbd)tN~^8Q+PI5xN@6Em0pNFyAD6tYS3XFIDyU z<(uQ%pbzgV>pups43l|gnu!@r@=PsUq&vuJD3-D8DfJ*+?++7dz8uxGv@CA?s`%G9 zJp#nlxd_#gsbadaSJ3>7Wzp92Ea8nmV==^iUnHBOA**Ua5{{SmNugZr+V6I2W9d3jQh6b3p%&ru5k6b7uxrR z86@>G)biruISIVL;qYMxd=^YrZh#v-inm1cHW--fO*-dkN6V6~Z3dO0Ch!2^eN;>t z6)DZ6Tx+nw5$|#oFLN6?yy6~osx!c`5?Brc7$`&JmT3ZZ*{t2g% zkL^)oVF-=tXfC_0MI??zgaj|wGb#v(57mKPx<9M!=WkY(c~Nsi6^oNZM|#qnD!J-Q z!iSN+V=%>EupQZZ9;3)wL! zkTHcBrs5oA>Y?6M$d+j-D@C>$zBCn92Oc0QhQ*Q%;0z26!6Tl_sw<6W&PJSpHgZw1$dJuvswT_9_Nj3DNJgoL^}~`gkkq znEtWUXqadfEh_F;HJDM0G8wZST#SzPtqjkxXjqe8CT-wrx3o-2QQ-&rOgY8PHZ3iW z!zYi`vkgo6C-BAG_eqbyMSYwvk^=hwo0j|5>ac0aXbK zBD+{nXXbs~aLmJMnF32(8;+4SCrkBZD4^M+iqXDx)PDEXGfiy&dI$U(p6>zKbg_*^AZ|uq=?$lHt zo)jyqrjV1fvHR!(P-Mw_h%|ym?+?j@NOREEctn5tdqcs%dVJa?X3*<`& zXm=V~Sb2mS)F~R$c&mJAB{j5s(vdEZC9ZYEhZFwvqvrYB^UUF5y8P?E{}56MUf3nf zob3jTui8h7K4<7Ew^rK4RW9D2Qs1LW!&rMGwOR+6<=Sk3D~6#X*Pdi3+Shr{2-V`^eM)61IQj|V+gaDBo`d-kHw?T&GQt$$SSi{K9ijz;zw77p9E zbn6hQiC7>rz+kH`l;)(Vl03Rtg6x68Sl*3Md;WYcxoOCfLNU?zbz{K%qGD^e$i8^- zj8oLYbcQB4VM&KJ|J5hA;=_E0lBc`!pL$yT-g!!ltc)wAy1UE>p?3dMg6{($#KwZm z*=nPX>~>c_V|jJg*ubDvc0fcS46Nw)V%$%Nx=_G?AiT&S>0QP|2`$xsz3``rd&9&OF9s983;p??un;#lvOCGq*FdV71}ux0ti8pXKiG z;?a4}s|`#tZguHcl0m>~O`=AbxUgvo6iy520Y%1F4!s_FIMa+bV5u=ie|C*0

9icbP0KP8b|+~auDDPLFQ6b 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 diff --git a/multimedia/media/media_js_standard/videoEncoder/BUILD.gn b/multimedia/media/media_js_standard/videoEncoder/BUILD.gn deleted file mode 100644 index b9f66aae0..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/BUILD.gn +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2022 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//test/xts/tools/build/suite.gni") - -ohos_js_hap_suite("video_encoder_js_hap") { - hap_profile = "./src/main/config.json" - js2abc = true - deps = [ - ":video_encoder_js_assets", - ":video_encoder_resources", - ] - certificate_profile = "./signature/openharmony_sx.p7b" - hap_name = "ActsVideoEncoderJsTest" - subsystem_name = "multimedia" - part_name = "multimedia_player_framework" -} -ohos_js_assets("video_encoder_js_assets") { - source_dir = "./src/main/js/default" -} -ohos_resources("video_encoder_resources") { - sources = [ "./src/main/resources" ] - hap_profile = "./src/main/config.json" -} diff --git a/multimedia/media/media_js_standard/videoEncoder/Test.json b/multimedia/media/media_js_standard/videoEncoder/Test.json deleted file mode 100644 index 8e438a023..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/Test.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "description": "Configuration for videoEncoder Tests", - "driver": { - "type": "JSUnitTest", - "test-timeout": "2000000", - "package": "ohos.acts.multimedia.video.videoencoder", - "shell-timeout": "60000" - }, - "kits": [ - { - "test-file-name": [ - "ActsVideoEncoderJsTest.hap" - ], - "type": "AppInstallKit", - "cleanup-apps": true - }, - { - "type": "ShellKit", - "run-command": [ - "rm -rf /storage/media/100/local/files/*", - "mkdir -p /data/app/el2/100/base/ohos.acts.multimedia.video.videoencoder/haps/entry/files/", - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.video.videoencoder/haps/entry/files/" - ], - "teardown-command":[ - ] - }, - { - "type": "PushKit", - "pre-push": [ - ], - "push": [ - "./resource/media/es/mpeg4_320_240.es ->/data/app/el2/100/base/ohos.acts.multimedia.video.videoencoder/haps/entry/files/", - "./resource/media/es/out_320_240_10s.h264 ->/data/app/el2/100/base/ohos.acts.multimedia.video.videoencoder/haps/entry/files/" - ] - }, - { - "type": "ShellKit", - "run-command": [ - "chmod 777 -R /data/app/el2/100/base/ohos.acts.multimedia.video.videoencoder/haps/entry/files/", - "chmod 777 /data/app/el2/100/base/ohos.acts.multimedia.video.videoencoder/haps/entry/files/*" - ], - "teardown-command":[ - ] - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/signature/openharmony_sx.p7b b/multimedia/media/media_js_standard/videoEncoder/signature/openharmony_sx.p7b deleted file mode 100644 index 7c21783c7ef7f146001fff5e15f554dd869f0208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3456 zcmcgvYj6|S6}BF>F-F*6UM7HzAeaEM@5+)b84}o)Rxen|D zghxcbJHGDS^-UZ;Gl>Q=a53hpcqIeNn^2qhclHxUhYz> zNtx2iy%c3ik4&uuDjA_B0aU8+dPzvdMKeudesY8il0=l`97H%Q^8}(yB;blM{C?dL zbhIu&F{Cd-@Ln!3P6Pv<0MjI`m?NcVM&=^Dbc9EyR4Y_vO1V-ssnbt*88X7T%T#Jb zc`4_fJ4xz_QJx?v3s7E~pY9>!WRMP%5m_g6OPHh#L?lF0P24`cz_`f>6YvJy1jD12 z@ehLPjpjlPYPA`4Mh$F3JH1W{Ga5BmQlo)gqz`6|2<$VWghf-5)WR6z^ELV#>MfNx zu7z1UjOnq2CJCDmpScQw9X7bZY~fb0;wZE4uj2@u-LFfHRm;J8xmMOmU!T+M`#R>vKqV-qaI~VT3bD8 z#}H!|ELT`g>y8bh2Ls2zbTdg!YYD|nvu2dRz)}W&rB&KWOP*)6Qb5aKI zNEE7L-TFk>A=d$d%Y{*A3c9%eb<6E+wGFl*K6iI^jR>DY@;C~YuCbF9=TyAhU&F&wGXkm{1JD+N$D8-4B8$mEuC3a z9`m9)FJWY?N!ZdEjjIsYt3nYN(;y0%HSig=0trGO;0!6raL^#MbVYDgAkfAy^-~3(j z;Ux(s#!G>eTdJ;moYNI4*ZEwNhXPSv$fA7bM@U|2+zjcF^%{9`78lFK#dztEh8qH% z;uE2Wpmc6)D&sql5>5dr!F#PDp+G1Umv0Ll0{t@jaQb@Ud9g^8o(9}dHpt2l*~J-o zLX8<31P1a(-@NP|>H_71p}aRcFSm!c&_)s=Xbc$54~g=I_Z))5;UKR*9R5NL3`Px= z$RQvHa!Ag7m9;}93N<7zg}O};{)Hd_DDDDL^du0K5!xFFl7-eT0S69{myy|-2BDxk zA0k1f2uTxHpA>%EzIE?Kxbe{7W4{~!#x7m?LP<-3;G10&{<`%1*$bnv?d3m+KD&8@ z5>B*DEqL#vR(xgFkPlu{oDfkm zT{BT24S0o6+Ro*>vr?|6-G;FPkZZps+x;1P2d>LybuZkzwy~w{BC^7B*89VSZMQEh z%P5g%dxSX?(5T>We_`pygK=G@D|k}rtTfF$LLx{3sd|v8(|n3Z z;vn}SdD17oEKZY(Txnvg>|E2z2Fb#;HzcMb_s7%M-Ee67oOW6E+W5Oy9gb5kuGu&( z_49$x9b)|wOy3e-g>2c`db_>uu5D|-{^#7UuJ}?vVACs-^9Q$VyjwT;?zn;_k#mL5 zjl`o4eBbiIT??Cmo2mPj4m(GI}s+XhrUZxAI@=NVDub)l#&#rIzjg zY47TZd}+WV1Z*u^1bzAwyZwdL>(12dU$MJrYu{xj`yH%kAN9(D3Cg5%%Z3rM^`}3i z#bW}FB4&*cjD2hDZ|GS&$7EUuZC-Y}bty1SZPNZbhIWKE$JedB4OTZ=RyLj4HuUtw ztta%un$tNR5gd;?x_LB;eE<30NSnnJ%xjWA9W38GFI=GLy}6bSgZ=A83-bMK z#_vyGZ5#aA)iVP)u{zR+W_MIXHdx!n$?m>Wv-87Mt8xzqC!ZUV8gcK{^X6rdj^)Iq zu!C9V`&jYj_7GIpP+J?|y00Wj>ry(CKnaby3x%?QAV2S!#p zl*1j0a-aZeP+rO%gtegL;iwpriVM9!c{nm=$w&EEzVq_t6$AUXO>8Wgcf3#Wp4r(`hYJf8 n!>;fCWXkKO4m>x%gxUMOQ26J8gTKrNFV9m>{rxw1*+2dZ!gg2~ diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/config.json b/multimedia/media/media_js_standard/videoEncoder/src/main/config.json deleted file mode 100644 index f0db2a150..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/config.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "app": { - "apiVersion": { - "compatible": 6, - "releaseType": "Beta1", - "target": 7 - }, - "vendor": "acts", - "bundleName": "ohos.acts.multimedia.video.videoencoder", - "version": { - "code": 1000000, - "name": "1.0.0" - } - }, - "deviceConfig": { - "default": { - "debug": true - } - }, - "module": { - "abilities": [ - { - "iconId": 16777218, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "action.system.home" - ] - } - ], - "descriptionId": 16777217, - "visible": true, - "labelId": 16777216, - "icon": "$media:icon", - "name": "ohos.acts.multimedia.video.videoencoder.MainAbility", - "description": "$string:mainability_description", - "label": "$string:entry_MainAbility", - "type": "page", - "homeAbility": true, - "launchType": "standard" - } - ], - "deviceType": [ - "default", - "default", - "tablet", - "tv", - "wearable" - ], - "reqPermissions": [ - { - "name" : "ohos.permission.GRANT_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.GRANT_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.REVOKE_SENSITIVE_PERMISSIONS", - "reason" : "use ohos.permission.REVOKE_SENSITIVE_PERMISSIONS" - }, - { - "name" : "ohos.permission.MEDIA_LOCATION", - "reason" : "use ohos.permission.MEDIA_LOCATION" - }, - { - "name" : "ohos.permission.READ_MEDIA", - "reason" : "use ohos.permission.READ_MEDIA" - }, - { - "name" : "ohos.permission.WRITE_MEDIA", - "reason" : "use ohos.permission.WRITE_MEDIA" - } - ], - "mainAbility": "ohos.acts.multimedia.video.videoencoder.MainAbility", - "distro": { - "moduleType": "entry", - "installationFree": false, - "deliveryWithInstall": true, - "moduleName": "entry" - }, - "package": "ohos.acts.multimedia.video.videoencoder", - "name": ".MyApplication", - "js": [ - { - "pages": [ - "pages/index/index" - ], - "name": "default", - "window": { - "designWidth": 720, - "autoDesignWidth": true - } - } - ] - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/app.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/app.js deleted file mode 100644 index 830070d19..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/app.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default { - onCreate() { - console.info('AceApplication onCreate'); - }, - onDestroy() { - console.info('AceApplication onDestroy'); - } -}; diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/en-US.json b/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/en-US.json deleted file mode 100644 index e63c70d97..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/en-US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "Hello", - "world": "World" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/zh-CN.json b/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/zh-CN.json deleted file mode 100644 index de6ee5748..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/i18n/zh-CN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "strings": { - "hello": "您好", - "world": "世界" - } -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.css b/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.css deleted file mode 100644 index c9195944a..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -.title { - font-size: 40px; - color: #000000; - opacity: 0.9; -} - -@media screen and (device-type: tablet) and (orientation: landscape) { - .title { - font-size: 100px; - } -} - -@media screen and (device-type: wearable) { - .title { - font-size: 28px; - color: #FFFFFF; - } -} - -@media screen and (device-type: tv) { - .container { - background-image: url("/common/images/Wallpaper.png"); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - } - - .title { - font-size: 100px; - color: #FFFFFF; - } -} - -@media screen and (device-type: phone) and (orientation: landscape) { - .title { - font-size: 60px; - } -} diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.hml b/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.hml deleted file mode 100644 index 8d0e2061b..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.hml +++ /dev/null @@ -1,20 +0,0 @@ - - -

- - {{ $t('strings.hello') }} {{ title }} - -
diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.js deleted file mode 100644 index 67f8b8567..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/default/pages/index/index.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Core, ExpectExtend} from 'deccjsunit/index' - -export default { - data: { - title: "" - }, - onInit() { - this.title = this.$t('strings.world'); - }, - onShow() { - console.info('onShow finish') - const core = Core.getInstance() - const expectExtend = new ExpectExtend({ - 'id': 'extend' - }) - core.addService('expect', expectExtend) - core.init() - const configService = core.getDefaultService('config') - this.timeout = 60000 - configService.setConfig(this) - require('../../../test/List.test') - core.execute() - }, - onReady() { - }, -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/List.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/List.test.js deleted file mode 100644 index f0fd606b9..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/List.test.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -require('./VideoEncoderHardwareFuncPromiseTest.test.js') diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderEnumTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderEnumTest.test.js deleted file mode 100644 index 92ba892ac..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderEnumTest.test.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('VideoEncoderEnum', function () { - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - }) - - afterEach(function() { - console.info('afterEach case'); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - - /* * - * @tc.number : SUB_MEDIA_VIDEO_ENCODER_ENUM_VideoEncodeBitrateMode_0100 - * @tc.name : 001.VideoEncodeBitrateMode - * @tc.desc : Test Enumerate VideoEncodeBitrateMode - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_DECODER_ENUM_VideoEncodeBitrateMode_0100', 0, async function (done) { - expect(media.VideoEncodeBitrateMode.CBR).assertEqual(0); - expect(media.VideoEncodeBitrateMode.VBR).assertEqual(1); - expect(media.VideoEncodeBitrateMode.CQ).assertEqual(2); - done(); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncCallbackTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncCallbackTest.test.js deleted file mode 100644 index 709959b5a..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncCallbackTest.test.js +++ /dev/null @@ -1,801 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; - -describe('videoHardwareEncoderFuncCallback', function () { - let videoEncodeProcessor; - let surfaceID = ''; - let outputQueue = []; - let videoDecodeProcessor = null; - let frameCountIn = 0; - let timestamp = 0; - let isCodecData = true; - let inputEosFlag = false; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - let fdRead; - let position = 0; - let DECinputCnt = 0; - let DECoutputCnt = 0; - let ENCoutputCnt = 0; - let outputCntDec = 0; - let outputCntEnc = 0; - let frameThreshold = 0.1; - let needSetEos = true; - let isInputEnd = false; - let outputEncEos = false; - let isFormatSame = true; - let pixelFormat = 0; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 2, - 'frame_rate': 60, - } - let mediaDescription2 = { - 'width': 320, - 'height': 240, - 'pixel_format': 2, - 'frame_rate': 60, - 'max_input_size': 150000, - } - let mime = 'video/avc'; - let srcPath = 'out_320_240_10s.h264' - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122]; - let lockFlag = false; - let needRelease = false; - let needStop = false; - let needFlush = false; - let needReset = false; - let needGetMediaDes = true; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - DECinputCnt = 0; - DECoutputCnt = 0; - ENCoutputCnt = 0; - frameCountIn = 0; - timestamp = 0; - isCodecData = true; - inputEosFlag = false; - position = 0; - outputCntDec = 0; - outputCntEnc = 0; - needSetEos = true; - isInputEnd = false; - outputEncEos = false; - lockFlag = false; - needRelease = false; - needStop = false; - needFlush = false; - needReset = false; - needGetMediaDes = true; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null){ - await videoEncodeProcessor.release().then(() => { - console.info("case release videoDecodeProcessor success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - if (videoDecodeProcessor != null){ - await videoDecodeProcessor.release().then(() => { - console.info("case release videoDecodeProcessor success"); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function getContent(buf, poi, len) { - console.info("case start get content"); - console.info("case start get content length is: " + len); - let lengthreal = -1; - try { - if (poi == -1) { - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - } else { - lengthreal = fileio.readSync(fdRead, buf, {length:len, position: poi}); - } - console.info('case lengthreal is :' + lengthreal); - } catch(e) { - console.info('case getContent error :' + e); - } - } - - async function getFdRead(pathName, done) { - await mediaTestBase.getFdRead(pathName, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - async function dequeueOutputs(done) { - while (outputQueue.length > 0 && !outputEncEos) { - let outputObject = outputQueue.shift(); - outputCntEnc += 1; - if (outputObject.flags == 1) { - if (outputCntEnc == 1) { - console.info('in case ENC ERROR, first output is EOS'); - expect().assertFail(); - } - outputEncEos = true; - console.info('in case ENC: output EOS'); - eventEmitter.emit('endOfEos', done); - } else { - console.info('in case ENC not last frame, continue'); - if (!lockFlag) { - videoEncodeProcessor.freeOutputBuffer(outputObject, (err) => { - if (typeof(err) == 'undefined') { - console.info('in case ENC release output success'); - ENCoutputCnt += 1; - console.info('in case ENC: ENCoutputCnt is ' + ENCoutputCnt); - } else { - console.info(`in case release output called,errMessage is ${err.message}`); - } - }); - } - } - } - } - - function setCallbackEnc(done) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('in case ENC outputBufferAvailable'); - if (needGetMediaDes) { - videoEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes = false; - }, failCallback).catch(failCatch); - } - console.info('in case ENC outBuffer.flags: ' + outBuffer.flags); - outputQueue.push(outBuffer); - dequeueOutputs(done); - }); - videoEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - function setCallbackDec() { - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case DEC: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case DEC: outputBufferAvailable outBuffer.flags: '+ outBuffer.flags); - outputCntDec += 1; - if (outBuffer.flags == 1) { - if (outputCntDec == 1) { - console.info('in case DEC ERROR, first output is EOS'); - expect().assertFail(); - } else { - await videoEncodeProcessor.notifyEndOfStream(); - } - } - if (outBuffer.flags == 0 && !lockFlag) { - await videoDecodeProcessor.renderOutputData(outBuffer).then(() => { - DECoutputCnt += 1; - console.info('in case DEC: DECoutputCnt is ' + DECoutputCnt); - }, failCallback).catch(failCatch); - } - }); - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case DEC: Output format changed: ' + format.toString()); v - }); - console.info('in case DEC: setCallback out'); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - if (inputEosFlag == false && isInputEnd == false) { - console.log('in case DEC: not see input EOS'); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, position, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - position = position + ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - if (needSetEos) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - isInputEnd = true; - } - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case DEC: queueInput success '); - DECinputCnt += 1; - console.info('in case DEC: DECinputCnt is ' + DECinputCnt); - }, failCallback).catch(failCatch); - } - } - - function resetReadParam() { - console.info('case read from start'); - position = 0; - inputEosFlag = false; - frameCountIn = 0; - isCodecData = true; - } - - function resetStateParam() { - console.info('case init state parameter'); - outputCntEnc = 0; - DECinputCnt = 0; - DECoutputCnt = 0; - ENCoutputCnt = 0; - outputEncEos = false; - needSetEos = true; - isInputEnd = false; - needRelease = false; - needStop = false; - needFlush = false; - needReset = false; - } - - eventEmitter.on('toCreateVideoEnc', (encFormat, decFormat, mediaDescriptionEnc, mediaDescriptionDec, done) => { - media.createVideoEncoderByMime(encFormat, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('in case ENC : create createVideoEncoderByMime success'); - videoEncodeProcessor = processor; - eventEmitter.emit('toCreateVideoDec', decFormat, mediaDescriptionEnc, mediaDescriptionDec, done); - } else { - console.info('case create createVideoEncoderByMime fail'); - expect().assertFail(); - done(); - } - }); - }); - eventEmitter.on('toConfigureEnc', (mediaDescriptionEnc, mediaDescriptionDec, done) => { - console.info('in case ENC: configure in'); - videoEncodeProcessor.configure(mediaDescriptionEnc, async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: configure success'); - setCallbackEnc(done); - eventEmitter.emit('toConfigureDec', mediaDescriptionDec, done); - }); - }); - eventEmitter.on('toGetInputSurface', (done) => { - videoEncodeProcessor.getInputSurface((err, inputSurface) => { - expect(err).assertUndefined(); - if (inputSurface != undefined) { - surfaceID = inputSurface; - console.info('in case ENC: getInputSurface success, surfaceID ' + surfaceID); - eventEmitter.emit('toSetOutputSurface'); - } else { - console.info('in case ENC: inputSurface is undefined'); - expect(inputSurface != undefined).assertTrue(); - done(); - } - }) - }); - eventEmitter.on('toPrepareEnc', () => { - videoEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case ENC: prepare success'); - eventEmitter.emit('toStartEnc'); - }); - }); - eventEmitter.on('toStartEnc', () => { - videoEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case ENC: start success'); - eventEmitter.emit('toPrepareDec'); - }); - }); - eventEmitter.on('toFlushEnc', () => { - lockFlag = true; - videoEncodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info('in case ENC: flush success'); - lockFlag = false; - }); - }); - eventEmitter.on('toStopEnc', () => { - videoEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info('in case ENC: stop success'); - }); - }); - eventEmitter.on('toResetEnc', () => { - videoEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info('in case ENC: reset success'); - }); - }); - eventEmitter.on('toReleaseEnc', () => { - videoEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info('in case ENC: release success'); - videoEncodeProcessor = null; - }); - }); - - eventEmitter.on('toCreateVideoDec', (decFormat, mediaDescriptionEnc, mediaDescriptionDec, done) => { - media.createVideoDecoderByMime(decFormat, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('in case DEC: create createVideoDecoderByMime success'); - videoDecodeProcessor = processor; - eventEmitter.emit('toConfigureEnc', mediaDescriptionEnc, mediaDescriptionDec, done); - } else { - console.info('case create createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }); - }) - eventEmitter.on('toConfigureDec', (mediaDescriptionDec, done) => { - console.info('in case DEC: configure in'); - videoDecodeProcessor.configure(mediaDescriptionDec, async(err) => { - expect(err).assertUndefined(); - console.info('in case DEC: configure success'); - setCallbackDec(done); - eventEmitter.emit('toGetInputSurface', done); - }); - }); - eventEmitter.on('toSetOutputSurface', () => { - videoDecodeProcessor.setOutputSurface(surfaceID, false, (err) => { - expect(err).assertUndefined(); - console.info('in case DEC: setOutputSurface success. surfaceID ' + surfaceID); - eventEmitter.emit('toPrepareEnc'); - }) - }); - eventEmitter.on('toPrepareDec', () => { - videoDecodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case DEC: prepare success'); - eventEmitter.emit('toStartDec'); - }); - }); - eventEmitter.on('toStartDec', () => { - videoDecodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case DEC: start success'); - }); - }); - async function toStartDec() { - await videoDecodeProcessor.start().then(() => { - console.info("in case DEC: start success"); - }, failCallback).catch(failCatch); - } - async function toStartEnc() { - await videoEncodeProcessor.start().then(() => { - console.info("in case ENC: start success"); - }, failCallback).catch(failCatch); - } - async function toFlushDec() { - lockFlag = true; - await videoDecodeProcessor.flush().then(() => { - console.info("in case DEC: flush success"); - lockFlag = false; - }, failCallback).catch(failCatch); - } - - async function toStopDec() { - lockFlag = true; - await videoDecodeProcessor.stop().then(() => { - console.info("in case DEC: stop success"); - lockFlag = false; - }, failCallback).catch(failCatch); - } - - async function toResetDec() { - await videoDecodeProcessor.reset().then(() => { - console.info("in case DEC: reset success"); - }, failCallback).catch(failCatch); - } - - async function toReleaseDec() { - await videoDecodeProcessor.release().then(() => { - console.info("case release videoDecodeProcessor success"); - videoDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - - function checkFormat(done) { - if (!isFormatSame) { - console.info('case decoder and encoder pixelformat is not the same'); - expect().assertFail(); - done(); - } - } - - eventEmitter.on('endOfEos', async(done) => { - expect(outputEncEos).assertTrue(); - expect(DECoutputCnt).assertClose(ES_FRAME_SIZE.length, frameThreshold); - expect(ENCoutputCnt).assertClose(ES_FRAME_SIZE.length, frameThreshold); - if (needRelease) { - videoEncodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: release success'); - videoEncodeProcessor = null; - await toReleaseDec(); - done(); - }); - } else if (needStop) { - eventEmitter.emit('stopAtEos'); - } else if (needFlush) { - eventEmitter.emit('flushAtEos'); - } else if (needReset) { - eventEmitter.emit('resetAtEos'); - } else { - eventEmitter.emit('releaseAtEos'); - } - }); - - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0100 - * @tc.name : 000.test video software encoder capbility - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0100', 0, async function (done) { - console.info("test video encoder capbility"); - let supportedEncForm = []; - let supportedDecForm = []; - await media.createVideoEncoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case ENC: createVideoEncoderByMime success'); - } else { - console.info('in case ENC: createVideoEncoderByMime fail'); - expect().assertFail(); - done(); - } - }) - await videoEncodeProcessor.getVideoEncoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - supportedEncForm = videoCaps.supportedFormats; - console.info('case supportedEncForm is ' + supportedEncForm); - console.info('case supportedEncForm.length is ' + supportedEncForm.length); - if (supportedEncForm.length == 0) { - isFormatSame = false; - } - }, failCallback).catch(failCatch); - await media.createVideoDecoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByMime success'); - } else { - console.info('in case : createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - await videoDecodeProcessor.getVideoDecoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - supportedDecForm = videoCaps.supportedFormats; - console.info('case supportedDecForm is ' + supportedDecForm); - console.info('case supportedDecForm.length is ' + supportedDecForm.length); - if (supportedDecForm.length == 0) { - isFormatSame = false; - } - }, failCallback).catch(failCatch); - let formatPoi = -1; - if (isFormatSame) { - for(var item of supportedEncForm) { - formatPoi = supportedDecForm.indexOf(item); - if (formatPoi != -1) { - pixelFormat = item; - console.info("case pixelFormat is " + pixelFormat); - break; - } - } - if (formatPoi == -1) { - isFormatSame = false; - } else { - mediaDescription.pixel_format = pixelFormat; - mediaDescription2.pixel_format = pixelFormat; - console.info("case mediaDescription is " + JSON.stringify(mediaDescription)); - console.info("case mediaDescription2 is " + JSON.stringify(mediaDescription2)); - } - } - await videoEncodeProcessor.release().then(() => { - console.info("case release videoEncodeProcessor success"); - videoEncodeProcessor = null; - }, failCallback).catch(failCatch); - await toReleaseDec(); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0200 - * @tc.name : 001.test release after last frame - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0200', 0, async function (done) { - checkFormat(done); - console.info("case test release after last frame"); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needRelease = true; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - }) - - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0300 - * @tc.name : 002.test stop at running state and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0300', 0, async function (done) { - checkFormat(done); - console.info("test stop at runnning state and restart"); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = false; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - await sleep(5000); - await toStopDec(); - await sleep(2000); - expect(outputEncEos).assertFalse(); - videoEncodeProcessor.stop(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: stop success'); - expect(DECoutputCnt).assertClose(ENCoutputCnt, frameThreshold); - await sleep(2000); - eventEmitter.emit('startEncAfterStopAtRunning'); - }); - eventEmitter.on('startEncAfterStopAtRunning', () => { - videoEncodeProcessor.start(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: start again after stop at running state success'); - resetReadParam(); - resetStateParam(); - needRelease = true; - eventEmitter.emit('toStartDec'); - }); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0400 - * @tc.name : 003.test stop at EOS and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0400', 0, async function (done) { - checkFormat(done); - console.info('case test stop at EOS and restart'); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needStop = true; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - eventEmitter.on('stopAtEos', () => { - videoEncodeProcessor.stop(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: stop success'); - await sleep(2000); - eventEmitter.emit('startEncAfterStopAtEos'); - }); - }); - eventEmitter.on('startEncAfterStopAtEos', () => { - videoEncodeProcessor.start(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: start again after stop at running state success'); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toFlushDec(); - await toStartDec(); - }); - }); - }) - - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0500 - * @tc.name : 004.test flush at running state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0500', 0, async function (done) { - checkFormat(done); - console.info('case test flush at running state'); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = false; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - await sleep(5000); - expect(outputEncEos).assertFalse(); - lockFlag = true; - videoEncodeProcessor.flush(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: flush at running success'); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toStartEnc(); - await toFlushDec(); - await toStartDec(); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0600 - * @tc.name : 005.test flush at eos state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0600', 0, async function (done) { - checkFormat(done); - console.info("case test flush at eos state"); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needFlush = true; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - eventEmitter.once('flushAtEos', async() => { - lockFlag = true; - videoEncodeProcessor.flush(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: flush at EOS success'); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toStartEnc(); - await toFlushDec(); - await toStartDec(); - }); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0700 - * @tc.name : 006.test reconfigure - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0700', 0, async function (done) { - checkFormat(done); - console.info("case test reconfigure"); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needReset = true; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - eventEmitter.once('resetAtEos', async() => { - videoEncodeProcessor.reset(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: reset success'); - await toResetDec(); - resetReadParam(); - resetStateParam(); - needRelease = true; - eventEmitter.emit('toConfigureEnc', mediaDescription, mediaDescription2, done); - }); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0800 - * @tc.name : 007.test recreate videoencoder - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_CALLBACK_0800', 0, async function (done) { - checkFormat(done); - console.info('case test recreate videoencoder'); - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - eventEmitter.once('releaseAtEos', async() => { - videoEncodeProcessor.release(async(err) => { - expect(err).assertUndefined(); - console.info('in case ENC: release success'); - videoEncodeProcessor = null; - await toReleaseDec(); - resetReadParam(); - resetStateParam(); - needRelease = true; - await fileio.close(fdRead); - await getFdRead(srcPath); - eventEmitter.emit('toCreateVideoEnc', mime, mime, mediaDescription, mediaDescription2, done); - }); - }); - }) -}) diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncPromiseTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncPromiseTest.test.js deleted file mode 100644 index 480601a84..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderHardwareFuncPromiseTest.test.js +++ /dev/null @@ -1,811 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import fileio from '@ohos.fileio' -import featureAbility from '@ohos.ability.featureAbility' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' -import * as mediaTestBase from '../../../../../MediaTestBase.js'; - -describe('videoHardwareEncoderFuncPromise', function () { - let videoEncodeProcessor; - let surfaceID = ''; - let outputQueue = []; - let videoDecodeProcessor = null; - let frameCountIn = 0; - let timestamp = 0; - let isCodecData = true; - let inputEosFlag = false; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - let ES_FRAME_SIZE = []; - let fdRead; - let position = 0; - let DECinputCnt = 0; - let DECoutputCnt = 0; - let ENCoutputCnt = 0; - let outputCntDec = 0; - let outputCntEnc = 0; - let frameThreshold = 0.1; - let needSetEos = true; - let isInputEnd = false; - let outputEncEos = false; - let pixelFormat = 0; - let isFormatSame = true; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 2, - 'frame_rate': 60, - } - let mediaDescription2 = { - 'track_type': 1, - 'width': 320, - 'height': 240, - 'pixel_format': 2, - 'frame_rate': 60, - 'max_input_size': 150000, - } - let mime = 'video/avc'; - let srcPath = 'out_320_240_10s.h264' - const H264_FRAME_SIZE_60FPS_320 = - [ 2106, 11465, 321, 72, 472, 68, 76, 79, 509, 90, 677, 88, 956, 99, 347, 77, 452, 681, 81, 1263, 94, 106, 97, - 998, 97, 797, 93, 1343, 150, 116, 117, 926, 1198, 128, 110, 78, 1582, 158, 135, 112, 1588, 165, 132, - 128, 1697, 168, 149, 117, 1938, 170, 141, 142, 1830, 106, 161, 122, 1623, 160, 154, 156, 1998, 230, - 177, 139, 1650, 186, 128, 134, 1214, 122, 1411, 120, 1184, 128, 1591, 195, 145, 105, 1587, 169, 140, - 118, 1952, 177, 150, 161, 1437, 159, 123, 1758, 180, 165, 144, 1936, 214, 191, 175, 2122, 180, 179, - 160, 1927, 161, 184, 119, 1973, 218, 210, 129, 1962, 196, 127, 154, 2308, 173, 127, 1572, 142, 122]; - let lockFlag = false; - let needRelease = false; - let needStop = false; - let needFlush = false; - let needReset = false; - - beforeAll(async function() { - console.info('beforeAll case 1'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - DECinputCnt = 0; - DECoutputCnt = 0; - ENCoutputCnt = 0; - frameCountIn = 0; - timestamp = 0; - isCodecData = true; - inputEosFlag = false; - position = 0; - outputCntDec = 0; - outputCntEnc = 0; - needSetEos = true; - isInputEnd = false; - outputEncEos = false; - needRelease = false; - needStop = false; - needFlush = false; - needReset = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null){ - await videoEncodeProcessor.release().then(() => { - console.info("case release videoDecodeProcessor success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - if (videoDecodeProcessor != null){ - await videoDecodeProcessor.release().then(() => { - console.info("case release videoDecodeProcessor success"); - }, failCallback).catch(failCatch); - videoDecodeProcessor = null; - } - await fileio.close(fdRead); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function getContent(buf, poi, len) { - console.info("case start get content"); - console.info("case start get content length is: " + len); - let lengthreal = -1; - try { - if (poi == -1) { - lengthreal = fileio.readSync(fdRead, buf, {length:len}); - } else { - lengthreal = fileio.readSync(fdRead, buf, {length:len, position: poi}); - } - console.info('case lengthreal is :' + lengthreal); - } catch(e) { - console.info('case getContent error :' + e); - } - } - - async function getFdRead(pathName, done) { - await mediaTestBase.getFdRead(pathName, done).then((fdNumber) => { - fdRead = fdNumber; - }) - } - - async function toCreateVideoEncoderByName(name, done) { - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case ENC: createVideoEncoderByName success'); - } else { - console.info('in case ENC: createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - } - - async function toCreateVideoEncoderByMime(mime, done) { - await media.createVideoEncoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case ENC: createVideoEncoderByMime success'); - } else { - console.info('in case ENC: createVideoEncoderByMime fail'); - expect().assertFail(); - done(); - } - }) - } - - async function toGetInputSurface() { - await videoEncodeProcessor.getInputSurface().then((inputSurface) => { - expect(inputSurface != undefined).assertTrue(); - console.info('in case ENC: getInputSurface success'); - surfaceID = inputSurface; - console.info('in case ENC: videoEncoder surfaceID is ' + surfaceID); - }, failCallback).catch(failCatch); - } - - async function toGetVideoEncoderCaps(width, height) { - await videoEncodeProcessor.getVideoEncoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - printVideoCaps(videoCaps, width, height); - }, failCallback).catch(failCatch); - } - - async function toConfigureEnc(mediaDescription, savepath) { - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("in case ENC: configure success"); - }, failCallback).catch(failCatch); - } - - async function toPrepareEnc() { - await videoEncodeProcessor.prepare().then(() => { - console.info("in case ENC: prepare success"); - }, failCallback).catch(failCatch); - } - - async function toStartEnc() { - await videoEncodeProcessor.start().then(() => { - console.info("in case ENC: start success"); - }, failCallback).catch(failCatch); - } - - async function toStopEnc() { - await videoEncodeProcessor.stop().then(() => { - console.info("in case ENC: stop success"); - }, failCallback).catch(failCatch); - } - - async function toFlushEnc() { - lockFlag = true; - await videoEncodeProcessor.flush().then(() => { - console.info("in case ENC: flush success"); - lockFlag = false; - }, failCallback).catch(failCatch); - } - - async function toResetEnc() { - await videoEncodeProcessor.reset().then(() => { - console.info("in case ENC: reset success"); - }, failCallback).catch(failCatch); - } - - async function toReleaseEnc() { - await videoEncodeProcessor.release().then(() => { - console.info("case release videoEncodeProcessor success"); - videoEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - - async function dequeueOutputs(done) { - while (outputQueue.length > 0) { - let outputObject = outputQueue.shift(); - outputCntEnc += 1; - if (outputObject.flags == 1) { - if (outputCntEnc == 1) { - console.info('in case ENC ERROR, first output is EOS'); - expect().assertFail(); - } - outputEncEos = true; - console.info('in case ENC: output EOS'); - eventEmitter.emit('endOfEos', done); - } else { - console.info('in case ENC not last frame, continue'); - if (!lockFlag) { - videoEncodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('in case ENC release output success'); - ENCoutputCnt += 1; - console.info('in case ENC: ENCoutputCnt is ' + ENCoutputCnt); - }); - } - } - } - } - - function setCallbackEnc(done) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('in case ENC outputBufferAvailable'); - console.info('in case ENC outBuffer.flags: ' + outBuffer.flags); - outputQueue.push(outBuffer); - dequeueOutputs(done); - }); - videoEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - async function toCreateVideoDecoderByName(name, done) { - await media.createVideoDecoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByName success'); - } else { - console.info('in case : createVideoDecoderByName fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - - async function toCreateVideoDecoderByMime(mime, done) { - await media.createVideoDecoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoDecodeProcessor = processor; - console.info('in case : createVideoDecoderByMime success'); - } else { - console.info('in case : createVideoDecoderByMime fail'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - - async function toConfigureDec(mediaDescription) { - await videoDecodeProcessor.configure(mediaDescription).then(() =>{ - console.info('in case DEC: configure success'); - }, failCallback).catch(failCatch); - } - - async function toSetOutputSurface(isDisplay) { - await videoDecodeProcessor.setOutputSurface(surfaceID, isDisplay).then(() => { - console.info('in case DEC: setOutputSurface success. surfaceID ' + surfaceID); - }, failCallback).catch(failCatch); - } - - async function toPrepareDec() { - await videoDecodeProcessor.prepare().then(() => { - console.info('in case DEC: prepare success'); - }, failCallback).catch(failCatch); - } - - async function toStartDec() { - await videoDecodeProcessor.start().then(() => { - console.info('in case DEC: start success'); - }, failCallback).catch(failCatch); - } - - async function toFlushDec() { - lockFlag = true; - await videoDecodeProcessor.flush().then(() => { - console.info("in case DEC: flush success"); - lockFlag = false; - }, failCallback).catch(failCatch); - } - - async function toStopDec() { - await videoDecodeProcessor.stop().then(() => { - console.info("in case DEC: stop success"); - }, failCallback).catch(failCatch); - } - - async function toResetDec() { - await videoDecodeProcessor.reset().then(() => { - console.info("in case DEC: reset success"); - }, failCallback).catch(failCatch); - } - - async function toReleaseDec() { - await videoDecodeProcessor.release().then(() => { - console.info("case release videoDecodeProcessor success"); - videoDecodeProcessor = null; - }, failCallback).catch(failCatch); - } - - function setCallbackDec() { - console.info('in case: setCallback in'); - videoDecodeProcessor.on('needInputData', async (inBuffer) => { - console.info('in case DEC: inputBufferAvailable inBuffer.index: '+ inBuffer.index); - enqueueInputs(inBuffer); - }); - videoDecodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case DEC: outputBufferAvailable outBuffer.flags: '+ outBuffer.flags); - outputCntDec += 1; - if (outBuffer.flags == 1) { - if (outputCntDec == 1) { - console.info('in case DEC ERROR, first output is EOS'); - expect().assertFail(); - } else { - await videoEncodeProcessor.notifyEndOfStream(); - } - } - if (outBuffer.flags == 0 && !lockFlag) { - await videoDecodeProcessor.renderOutputData(outBuffer).then(() => { - DECoutputCnt += 1; - console.info('in case DEC: DECoutputCnt is ' + DECoutputCnt); - }, failCallback).catch(failCatch); - } - }); - videoDecodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - videoDecodeProcessor.on('streamChanged',(format) => { - console.info('in case DEC: Output format changed: ' + format.toString()); v - }); - console.info('in case DEC: setCallback out'); - } - - /* push inputbuffers into codec */ - async function enqueueInputs(inputObject) { - if (inputEosFlag == false && isInputEnd == false) { - console.log('in case DEC: not see input EOS'); - if (frameCountIn < ES_FRAME_SIZE.length) { - getContent(inputObject.data, position, ES_FRAME_SIZE[frameCountIn]); - inputObject.timeMs = timestamp; - inputObject.offset = 0; - inputObject.length = ES_FRAME_SIZE[frameCountIn]; - position = position + ES_FRAME_SIZE[frameCountIn]; - console.info('in case: frameCountIn ' + frameCountIn); - frameCountIn++; - timestamp += 16.67; - } - if (isCodecData) { - inputObject.flags = 8; - isCodecData = false; - timestamp = 0; - } else if (frameCountIn >= ES_FRAME_SIZE.length - 1) { - if (needSetEos) { - inputObject.flags = 1; - inputEosFlag = true; - } else { - isInputEnd = true; - } - } else { - inputObject.flags = 4; - } - videoDecodeProcessor.pushInputData(inputObject).then(() => { - console.info('in case DEC: queueInput success '); - DECinputCnt += 1; - console.info('in case DEC: DECinputCnt is ' + DECinputCnt); - }, failCallback).catch(failCatch); - } - } - - function resetReadParam() { - console.info('case read from start'); - position = 0; - inputEosFlag = false; - frameCountIn = 0; - isCodecData = true; - } - - function resetStateParam() { - console.info('case init state parameter'); - outputCntEnc = 0; - DECinputCnt = 0; - DECoutputCnt = 0; - ENCoutputCnt = 0; - outputEncEos = false; - needSetEos = true; - isInputEnd = false; - needRelease = false; - needStop = false; - needFlush = false; - needReset = false; - } - - async function printVideoCaps(videoCaps, width, height) { - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - await videoCaps.getPreferredFrameRate(width, height).then((valueRange) => { - console.info("case getPreferredFrameRate valueRange success"); - if (typeof (valueRange) != 'undefined') { - console.info('getPreferredFrameRate.min: ' + valueRange.min); - console.info('getPreferredFrameRate.max: ' + valueRange.max); - } else { - console.info('case getPreferredFrameRate valueRange is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - await videoCaps.getSupportedFrameRate(width, height).then((valueRange) => { - console.info("case getSupportedFrameRate valueRange success"); - if (typeof (valueRange) != 'undefined') { - console.info('getSupportedFrameRate.min: ' + valueRange.min); - console.info('getSupportedFrameRate.max: ' + valueRange.max); - } else { - console.info('case getSupportedFrameRate valueRange is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - await videoCaps.isSizeSupported(width, height).then((trueORfalse) => { - console.info("case isSizeSupported valueRange for width:" + width + ", height: " + height); - if (typeof (trueORfalse) != 'undefined') { - console.info('videoCaps.isSizeSupported: ' + trueORfalse); - } else { - console.info('case isSizeSupported is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - } - - async function startEncProcess(codecFormat, savePath, mediaDescriptionEnc, done) { - await toCreateVideoEncoderByMime(codecFormat, done); - await toConfigureEnc(mediaDescriptionEnc, savePath); - setCallbackEnc(done); - await toGetInputSurface(); - await toPrepareEnc(); - await toStartEnc(); - } - - async function startDecProcess(codecFormat, readpath, mediaDescriptionDec, done) { - await toCreateVideoDecoderByMime(codecFormat, done); - await getFdRead(readpath, done); - await toConfigureDec(mediaDescriptionDec); - await toSetOutputSurface(false); - setCallbackDec(); - await toPrepareDec(); - await toStartDec(); - } - - function checkFormat(done) { - if (!isFormatSame) { - console.info('case decoder and encoder pixelformat is not the same'); - expect().assertFail(); - done(); - } - } - - eventEmitter.on('endOfEos', async(done) => { - expect(outputEncEos).assertTrue(); - expect(DECoutputCnt).assertClose(ES_FRAME_SIZE.length, frameThreshold); - expect(ENCoutputCnt).assertClose(ES_FRAME_SIZE.length, frameThreshold); - if (needRelease) { - await toReleaseEnc(); - await toReleaseDec(); - done(); - } else if (needStop) { - eventEmitter.emit('stopAtEos'); - } else if (needFlush) { - eventEmitter.emit('flushAtEos'); - } else if (needReset) { - eventEmitter.emit('resetAtEos'); - } else { - eventEmitter.emit('releaseAtEos'); - } - }); - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0100 - * @tc.name : 000.test video software encoder capbility - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0100', 0, async function (done) { - console.info("test video software encoder capbility"); - let supportedEncForm = []; - let supportedDecForm = []; - await toCreateVideoEncoderByMime(mime, done); - await videoEncodeProcessor.getVideoEncoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - supportedEncForm = videoCaps.supportedFormats; - if (supportedEncForm.length == 0) { - isFormatSame = false; - } - }, failCallback).catch(failCatch); - await toCreateVideoDecoderByMime(mime, done); - await videoDecodeProcessor.getVideoDecoderCaps().then((videoCaps) => { - console.info("case get getVideoDecoderCaps success"); - supportedDecForm = videoCaps.supportedFormats; - if (supportedDecForm.length == 0) { - isFormatSame = false; - } - }, failCallback).catch(failCatch); - let formatPoi = -1; - if(isFormatSame) { - for (var item of supportedEncForm) { - formatPoi = supportedDecForm.indexOf(item); - if(formatPoi != -1) { - pixelFormat = item; - console.info('case pixelFormat is ' + pixelFormat); - break; - } - } - if(formatPoi == -1) { - isFormatSame = false; - } else { - mediaDescription.pixel_format = pixelFormat; - mediaDescription2.pixel_format = pixelFormat; - } - } - await toReleaseEnc(); - await toReleaseDec(); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0200 - * @tc.name : 001.test release after last frame - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0200', 0, async function (done) { - checkFormat(done); - console.info("case test release after last frame"); - let savePath = 'video_hardware_encoder_function_0100.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needRelease = true; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0300 - * @tc.name : 002.test stop at running state and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0300', 0, async function (done) { - checkFormat(done); - console.info("test stop at runnning state and restart"); - let savePath = 'video_hardware_encoder_function_0200.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = false; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - await sleep(3000); - expect(outputEncEos).assertFalse(); - await toStopDec(); - await sleep(2000); - await toStopEnc(); - expect(DECoutputCnt).assertClose(ENCoutputCnt, frameThreshold); - await sleep(1000); - await toStartEnc(); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toStartDec(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0400 - * @tc.name : 003.test stop at EOS and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0400', 0, async function (done) { - checkFormat(done); - console.info('case test stop at EOS and restart'); - let savePath = 'video_hardware_encoder_function_0300.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needStop = true; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - eventEmitter.on('stopAtEos', async() => { - await toStopEnc(); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toStartEnc(); - await toFlushDec(); - await toStartDec(); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0500 - * @tc.name : 004.test flush at running state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0500', 0, async function (done) { - checkFormat(done); - console.info('case test flush at running state'); - let savePath = 'video_hardware_encoder_function_0400.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = false; - - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - await sleep(5000); - expect(outputEncEos).assertFalse(); - await toFlushEnc(); - await toStartEnc(); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toFlushDec(); - await toStartDec(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0600 - * @tc.name : 005.test flush at eos state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0600', 0, async function (done) { - checkFormat(done); - console.info("case test flush at eos state"); - let savePath = 'video_hardware_encoder_function_0500.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needFlush = true; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - eventEmitter.on('flushAtEos', async() => { - await toFlushEnc(); - await toStartEnc(); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toFlushDec(); - await toStartDec(); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0700 - * @tc.name : 006.test reconfigure - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0700', 0, async function (done) { - checkFormat(done); - console.info("case test reconfigure"); - let savePath = 'video_hardware_encoder_function_0600.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - needReset = true; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - eventEmitter.once('resetAtEos', async() => { - await toResetEnc(); - await toResetDec(); - await toConfigureEnc(mediaDescription, savePath); - setCallbackEnc(done); - await toGetInputSurface(); - await toPrepareEnc(); - await toStartEnc(); - resetReadParam(); - resetStateParam(); - needRelease = true; - await toConfigureDec(mediaDescription); - await toSetOutputSurface(false); - setCallbackDec(); - await toPrepareDec(); - await toStartDec(); - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0800 - * @tc.name : 007.test recreate videoencoder - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_FUNCTION_PROMISE_0800', 0, async function (done) { - checkFormat(done); - console.info('case test recreate videoencoder'); - let savePath = 'video_hardware_encoder_function_0700.es'; - ES_FRAME_SIZE = H264_FRAME_SIZE_60FPS_320; - isCodecData = true; - needSetEos = true; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - eventEmitter.once('releaseAtEos', async() => { - await toReleaseEnc(); - await toReleaseDec(); - await fileio.close(fdRead); - resetReadParam(); - resetStateParam(); - needRelease = true; - await startEncProcess(mime, savePath, mediaDescription, done); - await startDecProcess(mime, srcPath, mediaDescription2, done); - }); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderMultiInstancesTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderMultiInstancesTest.test.js deleted file mode 100644 index 42d936729..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderMultiInstancesTest.test.js +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import mediademo from '@ohos.multimedia.mediademo' -import fileio from '@ohos.fileio' -import abilityAccessCtrl from '@ohos.abilityAccessCtrl' -import bundle from '@ohos.bundle' -import featureAbility from '@ohos.ability.featureAbility' -import mediaLibrary from '@ohos.multimedia.mediaLibrary' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('videoEncoderSoftwareMultiInstances', function () { - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - const ROOT = '/data/app/el1/bundle/results/'; - const BASIC_PATH = 'video_multiinstances_'; - let videoEncodeProcessor; - let mediaTest; - let surfaceID = ''; - let outputQueue = []; - let outputCnt = 0; - let frameTotal = 100; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let sawOutputEOS = false; - let needGetMediaDes = false; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - const mediaLibraryTest = mediaLibrary.getMediaLibrary(context); - let fileKeyObj = mediaLibrary.FileKey; - - beforeAll(async function() { - console.info('beforeAll case 1'); - await applyPermission(); - console.info('beforeAll case after get permission'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - videoEncodeProcessor = null; - mediaTest = null; - surfaceID = ''; - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - await closeFdWrite(); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function resetParam() { - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function applyPermission() { - let appInfo = await bundle.getApplicationInfo('ohos.acts.multimedia.video.videoencoder', 0, 100); - let atManager = abilityAccessCtrl.createAtManager(); - if (atManager != null) { - let tokenID = appInfo.accessTokenId; - console.info('[permission] case accessTokenID is ' + tokenID); - let permissionName1 = 'ohos.permission.MEDIA_LOCATION'; - let permissionName2 = 'ohos.permission.READ_MEDIA'; - let permissionName3 = 'ohos.permission.WRITE_MEDIA'; - await atManager.grantUserGrantedPermission(tokenID, permissionName1, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - await atManager.grantUserGrantedPermission(tokenID, permissionName2, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - await atManager.grantUserGrantedPermission(tokenID, permissionName3, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - } else { - console.info('[permission] case apply permission failed, createAtManager failed'); - } - } - - async function getFdWrite(pathName) { - console.info('[mediaLibrary] case start getFdWrite'); - console.info('[mediaLibrary] case getFdWrite pathName is ' + pathName); - let mediaType = mediaLibrary.MediaType.VIDEO; - console.info('[mediaLibrary] case mediaType is ' + mediaType); - let publicPath = await mediaLibraryTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); - console.info('[mediaLibrary] case getFdWrite publicPath is ' + publicPath); - let dataUri = await mediaLibraryTest.createAsset(mediaType, pathName, publicPath); - if (dataUri != undefined) { - let args = dataUri.id.toString(); - let fetchOp = { - selections : fileKeyObj.ID + "=?", - selectionArgs : [args], - } - let fetchWriteFileResult = await mediaLibraryTest.getFileAssets(fetchOp); - console.info('[mediaLibrary] case getFdWrite getFileAssets() success'); - fileAsset = await fetchWriteFileResult.getAllObject(); - console.info('[mediaLibrary] case getFdWrite getAllObject() success'); - fdWrite = await fileAsset[0].open('Rw'); - console.info('[mediaLibrary] case getFdWrite fdWrite is ' + fdWrite); - } - } - - async function closeFdWrite() { - if (fileAsset != null) { - await fileAsset[0].close(fdWrite).then(() => { - console.info('[mediaLibrary] case close fdWrite success, fd is ' + fdWrite); - }).catch((err) => { - console.info('[mediaLibrary] case close fdWrite failed'); - }); - } else { - console.info('[mediaLibrary] case fileAsset is null'); - } - } - - function writeFile(buf, len) { - try{ - let res = fileio.write(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - async function dequeueOutputs(nextStep) { - while (outputQueue.length > 0) { - let outputObject = outputQueue.shift(); - outputCnt += 1; - if (outputObject.flags == 1) { - console.info("case last frame"); - mediaTest.closeStream(surfaceID); - await toRelease(); - nextStep(); - return; - } else { - console.info('not last frame, write data to file'); - writeFile(outputObject.data, outputObject.length); - console.info("write to file success"); - videoEncodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('release output success'); - }); - } - } - } - - function setCallback(path, nextStep) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - console.info('outBuffer.flags: ' + outBuffer.flags); - if (needGetMediaDes) { - videoEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes = false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - dequeueOutputs(nextStep); - }); - - videoEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - async function toCreateByMime(mime, done) { - await media.createVideoEncoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByMime success'); - } else { - console.info('in case : createVideoEncoderByMime fail'); - expect().assertFail(); - done(); - } - }) - } - - async function toCreateByName(name, done) { - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - } - - async function toGetVideoEncoderCaps() { - await videoEncodeProcessor.getVideoEncoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - console.info("print videoCaps: " + videoCaps) - }, failCallback).catch(failCatch); - } - - function toCreateStream() { - mediaTest = mediademo.createMediaTest(); - } - - function toSetStreamParam(width, height, framerate, frameTotal) { - console.info('case set stream parameter'); - mediaTest.setResolution(width, height); - mediaTest.setFrameRate(framerate); - mediaTest.setFrameCount(frameTotal); - } - - async function toGetInputSurface() { - await videoEncodeProcessor.getInputSurface().then((inputSurface) => { - expect(inputSurface != undefined).assertTrue(); - console.info('case getInputSurface success'); - surfaceID = inputSurface; - }, failCallback).catch(failCatch); - } - - function toStartStream() { - console.info('case start stream'); - mediaTest.startStream(surfaceID); - } - - function toStopStream() { - console.info('case stop stream'); - mediaTest.closeStream(surfaceID); - } - - async function toConfigure(mediaDescription) { - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - } - - async function toPrepare() { - await videoEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - } - - async function toStart() { - await videoEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - } - - async function toFlush() { - outputQueue = []; - await videoEncodeProcessor.flush().then(() => { - console.info("case flush success"); - }, failCallback).catch(failCatch); - } - - async function toStop() { - await videoEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - } - - async function toReset() { - await videoEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - } - - async function toRelease() { - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - } - - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_MULTIINSTANCE_0100 - * @tc.name : 001.create multiple encoders - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_MULTIINSTANCE_0100', 0, async function (done) { - console.info("case test multiple encoder instances"); - let savepath = BASIC_PATH + '0100.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - let array = new Array(); - - eventEmitter.once('nextStep', async () => { - for (let j = 1; j < 3; j++) { - await array[j].release().then(() => { - console.info("case release encoder " + j); - }, failCallback).catch(failCatch); - array[j] = null; - } - console.info('release encoders success'); - done(); - }); - async function runCase() { - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription); - await getFdWrite(savepath); - setCallback(savepath, function(){eventEmitter.emit('nextStep')}); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - } - for (let i = 1; i <= 3; i += 1) { - await media.createVideoEncoderByMime(mime).then((processor) => { - if (typeof(processor) != 'undefined') { - console.info("case create createVideoEncoder success: " + i); - if (i == 3) { - videoEncodeProcessor = processor; - runCase(); - } else { - array[i] = processor; - } - } else { - console.info("case create createVideoEncoder failed: " + i); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } - }) -}) - - \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncCallbackTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncCallbackTest.test.js deleted file mode 100644 index bbc2d4e61..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncCallbackTest.test.js +++ /dev/null @@ -1,638 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import mediademo from '@ohos.multimedia.mediademo' -import fileio from '@ohos.fileio' -import abilityAccessCtrl from '@ohos.abilityAccessCtrl' -import bundle from '@ohos.bundle' -import featureAbility from '@ohos.ability.featureAbility' -import mediaLibrary from '@ohos.multimedia.mediaLibrary' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('VideoEncoderSoftwareFuncCallbackTest', function () { - let videoEncodeProcessor = null; - let mediaTest; - let surfaceID = ''; - let frameCountOut = 0; - let outputQueue = []; - let frameTotal = 100; - let finalFrameId = 100; - let reStart = false; - let isStreamRunning = false; - let stopBuffer = false; - const events = require('events'); - const eventEmitter = new events.EventEmitter(); - const ROOT = '/data/app/el1/bundle/results/'; - const BASIC_PATH = ROOT + 'video_func_callback_'; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - const mediaLibraryTest = mediaLibrary.getMediaLibrary(context); - let fileKeyObj = mediaLibrary.FileKey; - - beforeAll(async function() { - console.info('beforeAll case 1'); - await applyPermission(); - console.info('beforeAll case after get permission'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - mediaTest = null; - surfaceID = ''; - frameCountOut = 0; - outputQueue = []; - frameTotal = 100; - finalFrameId = 100; - reStart = false; - isStreamRunning = false; - stopBuffer = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null) { - await videoEncodeProcessor.release().then(() => { - console.info('case videoEncodeProcessor release'); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - await closeFdWrite(); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - let failCallback = function(err) { - console.error(`in case error failCallback called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let failCatch = function(err) { - console.error(`in case error failCatch called,errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - async function applyPermission() { - let appInfo = await bundle.getApplicationInfo('ohos.acts.multimedia.video.videoencoder', 0, 100); - let atManager = abilityAccessCtrl.createAtManager(); - if (atManager != null) { - let tokenID = appInfo.accessTokenId; - console.info('[permission] case accessTokenID is ' + tokenID); - let permissionName1 = 'ohos.permission.MEDIA_LOCATION'; - let permissionName2 = 'ohos.permission.READ_MEDIA'; - let permissionName3 = 'ohos.permission.WRITE_MEDIA'; - await atManager.grantUserGrantedPermission(tokenID, permissionName1, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - await atManager.grantUserGrantedPermission(tokenID, permissionName2, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - await atManager.grantUserGrantedPermission(tokenID, permissionName3, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - } else { - console.info('[permission] case apply permission failed, createAtManager failed'); - } - } - - async function getFdWrite(pathName) { - console.info('[mediaLibrary] case start getFdWrite'); - console.info('[mediaLibrary] case getFdWrite pathName is ' + pathName); - let mediaType = mediaLibrary.MediaType.VIDEO; - console.info('[mediaLibrary] case mediaType is ' + mediaType); - let publicPath = await mediaLibraryTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); - console.info('[mediaLibrary] case getFdWrite publicPath is ' + publicPath); - let dataUri = await mediaLibraryTest.createAsset(mediaType, pathName, publicPath); - if (dataUri != undefined) { - let args = dataUri.id.toString(); - let fetchOp = { - selections : fileKeyObj.ID + "=?", - selectionArgs : [args], - } - let fetchWriteFileResult = await mediaLibraryTest.getFileAssets(fetchOp); - console.info('[mediaLibrary] case getFdWrite getFileAssets() success'); - fileAsset = await fetchWriteFileResult.getAllObject(); - console.info('[mediaLibrary] case getFdWrite getAllObject() success'); - fdWrite = await fileAsset[0].open('rw'); - console.info('[mediaLibrary] case getFdWrite fdWrite is ' + fdWrite); - } - } - - async function closeFdWrite() { - if (fileAsset != null) { - await fileAsset[0].close(fdWrite).then(() => { - console.info('[mediaLibrary] case close fdWrite success, fd is ' + fdWrite); - }).catch((err) => { - console.info('[mediaLibrary] case close fdWrite failed'); - }); - } else { - console.info('[mediaLibrary] case fileAsset is null'); - } - } - - function writeFile(buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - async function dequeueOutputs(nextStep) { - while (outputQueue.length > 0) { - let outputObject = outputQueue.shift(); - if (outputObject.flags == 1 || frameCountOut == frameTotal || frameCountOut == finalFrameId) { - nextStep(); - return; - } - frameCountOut++; - writeFile(outputObject.data, outputObject.length); - videoEncodeProcessor.freeOutputBuffer(outputObject, (err) => { - if (typeof(err) == 'undefined') { - console.log('in case release output count:' + frameCountOut); - } else { - console.info(`in case release output called,errMessage is ${err.message}`); - } - }); - } - } - function printDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info('video encoder key is ' + item); - console.info('video encoder value is ' + property); - } - } - function setCallback(nextStep) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - if (stopBuffer == false) { - outputQueue.push(outBuffer); - dequeueOutputs(nextStep); - } - }); - videoEncodeProcessor.on('error',(err) => { - console.info('in case error called, errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - if (typeof(format) != undefined) { - printDescription(format); - } - }); - } - function toCreateStream() { - mediaTest = mediademo.createMediaTest(); - } - function toSetStreamParam(width, height, framerate, frameTotal) { - mediaTest.setResolution(width, height); - mediaTest.setFrameRate(framerate); - mediaTest.setFrameCount(frameTotal); - } - - function toStartStream() { - if (isStreamRunning == false) { - console.info('in case : toStartStream'); - mediaTest.startStream(surfaceID); - isStreamRunning = true; - } - } - - function toStopStream() { - if (isStreamRunning == true) { - console.info('in case : toStopStream'); - mediaTest.closeStream(surfaceID); - isStreamRunning = false; - } - } - - eventEmitter.on('configure', (mediaDescription, decPath, nextStep, done) => { - console.info('in case : configure in'); - videoEncodeProcessor.configure(mediaDescription, async(err) => { - expect(err).assertUndefined(); - console.info('in case : configure success'); - await getFdWrite(decPath); - console.info('case getFdWrite success'); - setCallback(nextStep); - eventEmitter.emit('getVideoEncoderCaps', done); - }); - }); - eventEmitter.on('getVideoEncoderCaps', (done) => { - videoEncodeProcessor.getVideoEncoderCaps((err, videoCaps) => { - expect(err).assertUndefined(); - console.info("case get getVideoEncoderCaps success"); - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - eventEmitter.emit('getInputSurface', done); - }); - }); - eventEmitter.on('getInputSurface', (done) => { - videoEncodeProcessor.getInputSurface((err, inputSurface) => { - expect(err).assertUndefined(); - expect(inputSurface != undefined).assertTrue(); - surfaceID = inputSurface; - console.info('in case : getInputSurface success, surfaceID ' + surfaceID); - eventEmitter.emit('prepare', done); - }) - }); - eventEmitter.on('prepare', (done) => { - videoEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case : prepare success'); - toStartStream(); - eventEmitter.emit('start', done); - }); - }); - eventEmitter.on('start', (done) => { - toStartStream(); - videoEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case : start success'); - }); - stopBuffer = false; - }); - eventEmitter.on('stop', (done) => { - videoEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - toStopStream(); - console.info('in case : stop success'); - if (reStart == true) { - frameCountOut = 0; - outputQueue = []; - reStart = false; - eventEmitter.emit('start', done); - } else { - eventEmitter.emit('reset', done); - } - }); - stopBuffer = true; - }); - eventEmitter.on('flush', (done) => { - videoEncodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info('in case : flush success'); - eventEmitter.emit('reset', done); - }); - }); - eventEmitter.on('reset', (done) => { - videoEncodeProcessor.reset((err) => { - toStopStream(); - expect(err).assertUndefined(); - console.info('in case : reset success'); - eventEmitter.emit('release', done); - }); - }); - eventEmitter.on('release', (done) => { - videoEncodeProcessor.release((err) => { - toStopStream(); - expect(err).assertUndefined(); - console.info('in case : release success'); - videoEncodeProcessor = null; - done(); - }); - }); - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0100 - * @tc.name : 000.test stop after last frame and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0100', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_00_0100.es'; - let mime = 'video/mp4v-es'; - let mediaDescription = { - "codec_mime": 'video/mp4v-es', - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30, - } - media.getMediaCapability((err, mediaCaps) => { - expect(err).assertUndefined(); - console.info(`case getMediaCapability 1`); - mediaCaps.getVideoEncoderCaps((err, videoCapsArray) => { - expect(err).assertUndefined(); - console.info('getVideoEncoderCaps success'); - if (typeof (videoCapsArray) != 'undefined') { - console.info("case videoCapsArray" + videoCapsArray); - } else { - console.info("case videoCapsArray is not defined"); - expect().assertFail(); - done(); - } - }) - mediaCaps.findVideoEncoder(mediaDescription, (err, codecname) => { - expect(err).assertUndefined(); - console.info('findVideoEncoder success'); - if (typeof (codecname) != 'undefined') { - console.info("case codecname " + codecname); - } else { - console.info("case codecname is not defined"); - expect().assertFail(); - done(); - } - }) - }) - media.createVideoEncoderByMime(mime, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('stop', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0200 - * @tc.name : 000.test stop at running state and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0200', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_01_0100.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - finalFrameId = 50; - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('stop', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0300 - * @tc.name : 000.test stop at end of stream and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0300', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_01_0200.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - reStart = true; - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('stop', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0400 - * @tc.name : 000.test stop at running state and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0400', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_01_0300.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - finalFrameId = 50; - reStart = true; - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('stop', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0500 - * @tc.name : 000.test flush at running state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0500', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_01_0400.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - finalFrameId = 50; - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('flush', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0600 - * @tc.name : 000.test flush at end of stream - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0600', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_01_0500.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('flush', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0700 - * @tc.name : 000.test reconfigure - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0700', 0, async function (done) { - let decPath = 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_01_0600.es'; - let name= 'avenc_mpeg4'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - let decPath2 = 'SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_CALLBACK_0700_2.es'; - let mediaDescription2 = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30.00, - } - eventEmitter.on('reset_for_callback_01_0600', async(done) => { - videoEncodeProcessor.reset(async(err) => { - expect(err).assertUndefined(); - console.info('in case : reset_for_callback_01_0600 success'); - toStopStream(); - await closeFdWrite(); - surfaceID = ''; - frameCountOut = 0; - outputQueue = []; - isStreamRunning = false; - toSetStreamParam(mediaDescription2.width, mediaDescription2.height, - mediaDescription2.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription2, decPath2, - function(){eventEmitter.emit('stop', done);}, done); - }) - }) - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - console.info('case create createVideoEncoderByName success'); - videoEncodeProcessor = processor; - toCreateStream(); - toSetStreamParam(mediaDescription.width, mediaDescription.height, - mediaDescription.frame_rate, frameTotal); - eventEmitter.emit('configure', mediaDescription, decPath, - function(){eventEmitter.emit('reset_for_callback_01_0600', done);}, done); - } else { - console.info('case create createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }); - }) -}) diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncPromiseTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncPromiseTest.test.js deleted file mode 100644 index 095732453..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareFuncPromiseTest.test.js +++ /dev/null @@ -1,774 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import mediademo from '@ohos.multimedia.mediademo' -import fileio from '@ohos.fileio' -import abilityAccessCtrl from '@ohos.abilityAccessCtrl' -import bundle from '@ohos.bundle' -import featureAbility from '@ohos.ability.featureAbility' -import mediaLibrary from '@ohos.multimedia.mediaLibrary' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('videoSoftwareEncoderFuncPromise', function () { - const BASIC_PATH = 'videoencode_func_promise_'; - let videoEncodeProcessor; - let mediaTest; - let surfaceID = ''; - let outputQueue = []; - let outputCnt = 0; - let frameTotal = 100; - let stopAtEOS = false; - let resetAtEOS = false; - let flushAtEOS = false; - let sawOutputEOS = false; - let needGetMediaDes = false; - let fdWrite; - let fileAsset; - const context = featureAbility.getContext(); - const mediaLibraryTest = mediaLibrary.getMediaLibrary(context); - let fileKeyObj = mediaLibrary.FileKey; - - beforeAll(async function() { - console.info('beforeAll case 1'); - await applyPermission(); - console.info('beforeAll case after get permission'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - mediaTest = null; - surfaceID = ''; - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null){ - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - await closeFdWrite(); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - function resetParam() { - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - stopAtEOS = false; - resetAtEOS = false; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function applyPermission() { - let appInfo = await bundle.getApplicationInfo('ohos.acts.multimedia.video.videoencoder', 0, 100); - let atManager = abilityAccessCtrl.createAtManager(); - if (atManager != null) { - let tokenID = appInfo.accessTokenId; - console.info('[permission] case accessTokenID is ' + tokenID); - let permissionName1 = 'ohos.permission.MEDIA_LOCATION'; - let permissionName2 = 'ohos.permission.READ_MEDIA'; - let permissionName3 = 'ohos.permission.WRITE_MEDIA'; - await atManager.grantUserGrantedPermission(tokenID, permissionName1, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - await atManager.grantUserGrantedPermission(tokenID, permissionName2, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - await atManager.grantUserGrantedPermission(tokenID, permissionName3, 1).then((result) => { - console.info('[permission] case grantUserGrantedPermission success :' + result); - }).catch((err) => { - console.info('[permission] case grantUserGrantedPermission failed :' + err); - }); - } else { - console.info('[permission] case apply permission failed, createAtManager failed'); - } - } - - async function getFdWrite(pathName) { - console.info('[mediaLibrary] case start getFdWrite'); - console.info('[mediaLibrary] case getFdWrite pathName is ' + pathName); - let mediaType = mediaLibrary.MediaType.VIDEO; - console.info('[mediaLibrary] case mediaType is ' + mediaType); - let publicPath = await mediaLibraryTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO); - console.info('[mediaLibrary] case getFdWrite publicPath is ' + publicPath); - let dataUri = await mediaLibraryTest.createAsset(mediaType, pathName, publicPath); - if (dataUri != undefined) { - let args = dataUri.id.toString(); - let fetchOp = { - selections : fileKeyObj.ID + "=?", - selectionArgs : [args], - } - let fetchWriteFileResult = await mediaLibraryTest.getFileAssets(fetchOp); - console.info('[mediaLibrary] case getFdWrite getFileAssets() success'); - fileAsset = await fetchWriteFileResult.getAllObject(); - console.info('[mediaLibrary] case getFdWrite getAllObject() success'); - fdWrite = await fileAsset[0].open('rw'); - console.info('[mediaLibrary] case getFdWrite fdWrite is ' + fdWrite); - } - } - - async function closeFdWrite() { - if (fileAsset != null) { - await fileAsset[0].close(fdWrite).then(() => { - console.info('[mediaLibrary] case close fdWrite success, fd is ' + fdWrite); - }).catch((err) => { - console.info('[mediaLibrary] case close fdWrite failed'); - }); - } else { - console.info('[mediaLibrary] case fileAsset is null'); - } - } - - function writeFile(buf, len) { - try{ - let res = fileio.writeSync(fdWrite, buf, {length: len}); - console.info('case fileio.write buffer success'); - } catch(e) { - console.info('case fileio.write buffer error is ' + e); - } - } - - async function dequeueOutputs(done) { - while (outputQueue.length > 0) { - let outputObject = outputQueue.shift(); - outputCnt += 1; - if (outputObject.flags == 1) { - console.info("last frame, make choice"); - mediaTest.closeStream(surfaceID); - sawOutputEOS = true; - if (stopAtEOS) { - await toStop(); - } else if (resetAtEOS) { - await toReset(); - } else if (flushAtEOS) { - await toFlush(); - } else { - await toReset(); - await toRelease(); - done(); - } - } else { - console.info('not last frame, continue'); - writeFile(outputObject.data, outputObject.length); - videoEncodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('release output success'); - }); - } - } - } - - function setCallback(done) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - console.info('outBuffer.flags: ' + outBuffer.flags); - if (needGetMediaDes) { - videoEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes = false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - dequeueOutputs(done); - }); - - videoEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - async function toCreateByMime(mime, done) { - await media.createVideoEncoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByMime success'); - } else { - console.info('in case : createVideoEncoderByMime fail'); - expect().assertFail(); - done(); - } - }) - } - - async function toCreateByName(name, done) { - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - } - - async function toGetVideoEncoderCaps(width, height) { - await videoEncodeProcessor.getVideoEncoderCaps().then((videoCaps) => { - console.info("case get getVideoEncoderCaps success"); - printVideoCaps(videoCaps, width, height); - }, failCallback).catch(failCatch); - } - - async function printVideoCaps(videoCaps, width, height) { - console.info(`print videoCaps: - codecInfo.name ${videoCaps.codecInfo.name} - codecInfo.type ${videoCaps.codecInfo.type} - codecInfo.mimeType ${videoCaps.codecInfo.mimeType} - codecInfo.isHardwareAccelerated ${videoCaps.codecInfo.isHardwareAccelerated} - codecInfo.isSoftwareOnly ${videoCaps.codecInfo.isSoftwareOnly} - codecInfo.isVendor ${videoCaps.codecInfo.isVendor} - supportedBitrate [${videoCaps.supportedBitrate.min}, ${videoCaps.supportedBitrate.max}] - supportedFormats ${videoCaps.supportedFormats} - supportedHeightAlignment ${videoCaps.supportedHeightAlignment} - supportedWidthAlignment ${videoCaps.supportedWidthAlignment} - supportedWidth [${videoCaps.supportedWidth.min}, ${videoCaps.supportedWidth.max}] - supportedHeight [${videoCaps.supportedHeight.min}, ${videoCaps.supportedHeight.max}] - supportedProfiles ${videoCaps.supportedProfiles} - supportedLevels ${videoCaps.supportedLevels} - supportedBitrateMode ${videoCaps.supportedBitrateMode} - supportedQuality [${videoCaps.supportedQuality.min}, ${videoCaps.supportedQuality.max}] - supportedComplexity [${videoCaps.supportedComplexity.min}, ${videoCaps.supportedComplexity.max}] - `); - await videoCaps.getPreferredFrameRate(width, height).then((valueRange) => { - console.info("case getPreferredFrameRate valueRange success"); - if (typeof (valueRange) != 'undefined') { - console.info('getPreferredFrameRate.min: ' + valueRange.min); - console.info('getPreferredFrameRate.max: ' + valueRange.max); - } else { - console.info('case getPreferredFrameRate valueRange is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - await videoCaps.getSupportedFrameRate(width, height).then((valueRange) => { - console.info("case getSupportedFrameRate valueRange success"); - if (typeof (valueRange) != 'undefined') { - console.info('getSupportedFrameRate.min: ' + valueRange.min); - console.info('getSupportedFrameRate.max: ' + valueRange.max); - } else { - console.info('case getSupportedFrameRate valueRange is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - await videoCaps.isSizeSupported(width, height).then((trueORfalse) => { - console.info("case isSizeSupported valueRange for width:" + width + ", height: " + height); - if (typeof (trueORfalse) != 'undefined') { - console.info('videoCaps.isSizeSupported: ' + trueORfalse); - } else { - console.info('case isSizeSupported is not defined'); - expect().assertFail(); - } - }, failCallback).catch(failCatch); - } - - function toCreateStream() { - mediaTest = mediademo.createMediaTest(); - } - - function toSetStreamParam(width, height, framerate, frameTotal) { - console.info('case set stream parameter'); - mediaTest.setResolution(width, height); - mediaTest.setFrameRate(framerate); - mediaTest.setFrameCount(frameTotal); - } - - async function toGetInputSurface() { - await videoEncodeProcessor.getInputSurface().then((inputSurface) => { - expect(inputSurface != undefined).assertTrue(); - console.info('case getInputSurface success'); - surfaceID = inputSurface; - }, failCallback).catch(failCatch); - } - - function toStartStream() { - console.info('case start stream'); - mediaTest.startStream(surfaceID); - } - - function toStopStream() { - console.info('case stop stream'); - mediaTest.closeStream(surfaceID); - } - - async function toConfigure(mediaDescription, savepath) { - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - await getFdWrite(savepath); - console.info('case getFdWrite success'); - } - - async function toPrepare() { - await videoEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - } - - async function toStart() { - await videoEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - } - - async function toFlush() { - outputQueue = []; - await videoEncodeProcessor.flush().then(() => { - console.info("case flush success"); - }, failCallback).catch(failCatch); - } - - async function toStop() { - await videoEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - } - - async function toReset() { - resetParam(); - await videoEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - } - - async function toRelease() { - resetParam(); - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - videoEncodeProcessor = null; - }, failCallback).catch(failCatch); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0100 - * @tc.name : 000.test stop after last frame and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0100', 0, async function (done) { - console.info("case test stop after last frame"); - let savepath = BASIC_PATH + '0000.es'; - let name= 'avenc_mpeg4'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "codec_mime": 'video/mp4v-es', - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - await media.getMediaCapability().then((mediaCaps) => { - console.info('getMediaCapability success'); - if (typeof (mediaCaps) != 'undefined') { - mediaCaps.getVideoEncoderCaps().then((videoCapsArray) => { - console.info('getVideoEncoderCaps from media success'); - if (typeof (videoCapsArray) != 'undefined') { - let videoCaps = videoCapsArray[0]; - console.info('print first videoCaps from videoCapsArray'); - printVideoCaps(videoCaps, width, height); - } else { - console.info("case videoCapsArray is not defined"); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - mediaCaps.findVideoEncoder(mediaDescription).then((codecname) => { - console.info('findVideoEncoder success'); - if (typeof (codecname) != 'undefined') { - console.info("case codecname " + codecname); - } else { - console.info("case codecname is not defined"); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - } else { - console.info('mediaCaps is not defined'); - expect().assertFail(); - done(); - } - }, failCallback).catch(failCatch); - await toCreateByName(name, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0200 - * @tc.name : 001.test stop at runnning state and reset - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0200', 0, async function (done) { - console.info("case test stop at runnning state and reset"); - let savepath = BASIC_PATH + '0100.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(1000); - await toStop(); - toStopStream(); - await toReset(); - await toRelease(); - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0300 - * @tc.name : 002.test stop at end of stream and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0300', 0, async function (done) { - console.info("test stop at end of stream and restart"); - let savepath = BASIC_PATH + '0200.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - frameTotal = 10; - stopAtEOS = true; - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(5000); - resetParam(); - toSetStreamParam(width, height, framerate, frameTotal); - await toStart(); - toStartStream(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0400 - * @tc.name : 003.test stop at running state and restart - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0400', 0, async function (done) { - console.info("test stop at runnning state and restart"); - let savepath = BASIC_PATH + '0300.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - frameTotal = 1000; - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(500); - toStopStream(); - await toStop(); - resetParam(); - toSetStreamParam(width, height, framerate, frameTotal); - await toStart(); - toStartStream(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0500 - * @tc.name : 004.test flush at running state - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0500', 0, async function (done) { - console.info("case test flush at running state"); - let savepath = BASIC_PATH + '0400.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - frameTotal = 500; - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(500); - await toFlush(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0600 - * @tc.name : 005.test flush at end of stream - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level1 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0600', 0, async function (done) { - console.info("case test flush at end of stream"); - let savepath = BASIC_PATH + '0500.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - flushAtEOS = true; - frameTotal = 10; - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(5000); - resetParam(); - toSetStreamParam(width, height, framerate, frameTotal); - toStartStream(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0700 - * @tc.name : 006.test reconfigure - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0700', 0, async function (done) { - console.info("case test reconfigure"); - let savepath = BASIC_PATH + '0600.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - resetAtEOS = true; - frameTotal = 10; - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(5000); - resetParam(); - await closeFdWrite(); - width = 320; - height = 240; - framerate = 30; - let mediaDescription2 = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - let savepath2 = BASIC_PATH + '0601.es'; - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription2, savepath2); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0800 - * @tc.name : 007.test recreate videoencoder - * @tc.desc : basic encode function - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_FUNCTION_PROMISE_0800', 0, async function (done) { - console.info("case test recreate videoencoder"); - let savepath = BASIC_PATH + '0700.es'; - let mime = 'video/mp4v-es'; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - resetAtEOS = true; - frameTotal = 10; - await toCreateByMime(mime, done); - await toGetVideoEncoderCaps(width, height); - toCreateStream(); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription, savepath); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - await sleep(5000); - await toRelease(); - resetParam(); - await closeFdWrite(); - width = 320; - height = 240; - framerate = 30; - let mediaDescription2 = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - let savepath2 = BASIC_PATH + '0701.es'; - await toCreateByMime(mime, done); - toSetStreamParam(width, height, framerate, frameTotal); - await toConfigure(mediaDescription2, savepath2); - setCallback(done); - await toGetInputSurface(); - await toPrepare(); - toStartStream(); - await toStart(); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityCallbackTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityCallbackTest.test.js deleted file mode 100644 index b9bb1df4e..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityCallbackTest.test.js +++ /dev/null @@ -1,1551 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import mediademo from '@ohos.multimedia.mediademo' -import Fileio from '@ohos.fileio' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -const ENCODE_STEP = { - WAIT_FOR_EOS : 'encode:waitForEOS', - CONFIGURE : 'encode:configure', - GET_INPUTSURFACE : 'encode:getSurface', - PREPARE : 'encode:prepare', - START : 'encode:start', - FLUSH : 'encode:flush', - STOP : 'encode:stop', - RESET : 'encode:reset', - WAIT_FOR_ALL_OUTS : 'encode:waitForAllOuts', - ERROR : 'encode:error', - RELEASE : 'encode:release', -} -const STREAM_STEP = { - CREATE : 'stream:create', - PREPARE : 'stream:prepare', - SET_PARAM: 'stream:setParam', - SET_EOS_FRAME: 'stream:setEOSFrame', - START : 'stream:start', - STOP : 'stream:stop', -} -describe('VideoEncoderSoftwareReliCallbackTest', function () { - let videoEncodeProcessor = null; - let mediaTest = null; - let surfaceID = ''; - let frameCountOut = 0; - let outputQueue = []; - let frameTotal = 100; - let finalFrameId = 100; - let isStreamRunning = false; - let workdoneAtEOS = false; - let stopBuffer = false; - const ROOT = '/data/app/el1/bundle/results/'; - const BASIC_PATH = ROOT + 'video_reliability_callback_'; - let mediaDescription = { - 'width': 320, - 'height': 240, - 'pixel_format': 3, - 'frame_rate': 30, - } - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - mediaTest = null; - surfaceID = ''; - frameCountOut = 0; - outputQueue = []; - workdoneAtEOS = false; - frameTotal = 100; - finalFrameId = 100; - isStreamRunning = false; - stopBuffer = false; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null) { - await videoEncodeProcessor.release().then(() => { - console.info('in case : videoEncodeProcessor release success'); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - toStopStream(); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - let failCallback = function(err) { - console.error(`in case error failCallback called, errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - let failCatch = function(err) { - console.error(`in case error failCatch called,errMessage is ${err.message}`); - expect(err == undefined).assertTrue(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - function printError(err, expectFail) { - expect((err != undefined) == expectFail).assertTrue(); - if (expectFail == false && err != undefined) { - console.error('in case error failCatch called,err is ' + err); - console.error(`in case error failCatch called,errMessage is ${err.message}`); - } - } - - function writeFile(path, buf, len){ - try { - let writestream = Fileio.createStreamSync(path, 'ab+'); - let num = writestream.writeSync(buf, {length:len}); - writestream.flushSync(); - writestream.closeSync(); - } catch(e) { - console.error('in case error writeFile: ' + e); - } - } - - /* get outputbuffers from codec */ - async function dequeueOutputs(path, nextStep) { - console.log('outputQueue.length:' + outputQueue.length); - while (outputQueue.length > 0){ - let outputObject = outputQueue.shift(); - if (outputObject.flags == 1 || frameCountOut == frameTotal) { - if (workdoneAtEOS) { - doneWork(nextStep); - } - return; - } - frameCountOut++; - console.info('not last frame, continue'); - videoEncodeProcessor.freeOutputBuffer(outputObject, (err) => { - if (typeof(err) == 'undefined') { - console.debug('in case release output count:' + frameCountOut); - } else { - console.info(`in case release output called,errMessage is ${err.message}`); - } - }) - } - } - function printDescription(obj) { - for (let item in obj) { - let property = obj[item]; - console.info('video encoder key is ' + item); - console.info('video encoder value is ' + property); - } - } - function setCallback(path, nextStep) { - videoEncodeProcessor.on('newOutputData', async (outBuffer) => { - console.info('in case: outputBufferAvailable outBuffer.index: '+ outBuffer.index); - if (stopBuffer == false) { - outputQueue.push(outBuffer); - dequeueOutputs(path, nextStep); - } - }); - - videoEncodeProcessor.on('error',(err) => { - console.info('in case: error called,errName is' + err); - }); - - videoEncodeProcessor.on('streamChanged', (format) => { - if (typeof(format) != undefined) { - printDescription(format); - } - }); - } - function toCreateStream(mySteps, done) { - mediaTest = mediademo.createMediaTest(); - toNextStep(mySteps, done); - } - function toSetStreamParam(mySteps, done) { - mediaTest.setResolution(mediaDescription.width, mediaDescription.height); - mediaTest.setFrameRate(mediaDescription.frame_rate); - toNextStep(mySteps, done); - } - function toSetEOSFrame(mySteps, done) { - mediaTest.setFrameCount(frameTotal); - toNextStep(mySteps, done); - } - function toStartStream(mySteps, done) { - if (isStreamRunning == false) { - console.info('in case : toStartStream'); - mediaTest.startStream(surfaceID); - isStreamRunning = true; - } - toNextStep(mySteps, done); - } - - function toStopStream(mySteps, done) { - if (isStreamRunning == true) { - console.info('in case : toStopStream'); - mediaTest.closeStream(surfaceID); - isStreamRunning = false; - } - toNextStep(mySteps, done); - } - function toConfigure(mySteps, done, expectFail) { - videoEncodeProcessor.configure(mediaDescription, (err) => { - console.info(`case configure callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }) - } - function toGetInputSurface(mySteps, done, expectFail) { - videoEncodeProcessor.getInputSurface((err, inputSurface) => { - expect(err).assertUndefined(); - expect(inputSurface != undefined).assertTrue(); - printError(err, expectFail); - surfaceID = inputSurface; - console.info('in case : getInputSurface success, surfaceID ' + surfaceID); - toNextStep(mySteps, done); - }) - } - function toPrepare(mySteps, done, expectFail) { - videoEncodeProcessor.prepare((err) => { - console.info(`case prepare callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toStart(mySteps, done, expectFail) { - videoEncodeProcessor.start((err) => { - console.info(`case start callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - stopBuffer = false; - } - function toStop(mySteps, done, expectFail) { - videoEncodeProcessor.stop((err) => { - console.info(`case stop callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - stopBuffer = true; - } - function toFlush(mySteps, done, expectFail) { - videoEncodeProcessor.flush((err) => { - console.info(`case flush callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function toReset(mySteps, done, expectFail) { - videoEncodeProcessor.reset((err) => { - console.info(`case reset callback`); - printError(err, expectFail); - toNextStep(mySteps, done); - }); - } - function runCase(mySteps, nextCase, done) { - if (mySteps[0] == ENCODE_STEP.ERROR) { - mySteps.shift(); - nextCase(mySteps, done, true); - } else { - nextCase(mySteps, done, false); - } - } - function toNextStep(mySteps, done) { - console.info('case myStep[0]: ' + mySteps[0]); - if (mySteps[0] == ENCODE_STEP.RELEASE) { - if (videoEncodeProcessor != null){ - videoEncodeProcessor.release((err) => { - printError(err, false); - console.info('in case : videoEncodeProcessor release callback'); - videoEncodeProcessor = null; - console.info('case to done'); - done(); - }); - } - return; - } - switch (mySteps[0]) { - case ENCODE_STEP.CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - runCase(mySteps, toConfigure, done); - break; - case STREAM_STEP.CREATE: - mySteps.shift(); - console.info(`case to createStream`); - toCreateStream(mySteps, done); - break; - case STREAM_STEP.SET_PARAM: - mySteps.shift(); - console.info(`case to SetStreamParam`); - toSetStreamParam(mySteps, done); - break; - case STREAM_STEP.SET_EOS_FRAME: - mySteps.shift(); - console.info(`case to SetEOSFrame`); - toSetEOSFrame(mySteps, done); - break; - case STREAM_STEP.START: - mySteps.shift(); - console.info(`case to StartStream`); - toStartStream(mySteps, done); - break; - case STREAM_STEP.STOP: - mySteps.shift(); - console.info(`case to StoptStream`); - toStopStream(mySteps, done); - break; - case ENCODE_STEP.GET_INPUTSURFACE: - mySteps.shift(); - console.info(`case to setOutputSurface`); - runCase(mySteps, toGetInputSurface, done); - break; - case ENCODE_STEP.PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - runCase(mySteps, toPrepare, done); - break; - case ENCODE_STEP.START: - mySteps.shift(); - console.info(`case to start`); - runCase(mySteps, toStart, done); - break; - case ENCODE_STEP.FLUSH: - mySteps.shift(); - console.info(`case to flush`); - runCase(mySteps, toFlush, done); - break; - case ENCODE_STEP.STOP: - mySteps.shift(); - console.info(`case to stop`); - runCase(mySteps, toStop, done); - break; - case ENCODE_STEP.RESET: - mySteps.shift(); - console.info(`case to reset`); - runCase(mySteps, toReset, done); - break; - case ENCODE_STEP.WAIT_FOR_EOS: - mySteps.shift(); - setTimeout(() =>{ - toNextStep(mySteps, done); - }, 5000); // wait 5000 ms for eos - break; - case ENCODE_STEP.WAIT_FOR_ALL_OUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - default: - break; - } - } - - function toCreateVideoEncoderByMime(mime, path, mySteps, done) { - media.createVideoEncoderByMime(mime, (err, processor) => { - console.info(`case createVideoEncoderByMime callback`); - printError(err, false); - if (typeof(processor) != 'undefined') { - videoEncodeProcessor = processor; - setCallback(path, done); - toNextStep(mySteps, done); - } else { - done(); - } - }) - } - function toCreateVideoEncoderByName(name, path, mySteps, done) { - media.createVideoEncoderByName(name, (err, processor) => { - printError(err, false); - if (typeof(processor) != 'undefined') { - videoEncodeProcessor = processor; - setCallback(path, done); - toNextStep(mySteps, done); - } else { - done(); - } - }) - } - async function doneWork(nextStep) { - videoEncodeProcessor.stop((err) => { - printError(err, false); - console.info('case stop callback'); - mediaTest.closeStream(surfaceID); - videoEncodeProcessor.reset((err) => { - printError(err, false); - console.info('case reset callback'); - videoEncodeProcessor.release((err) => { - printError(err, false); - console.info('case release callback'); - videoEncodeProcessor = null; - nextStep(); - }) - }) - }) - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0100 - * @tc.name : 001.create -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.CONFIGURE, ENCODE_STEP.ERROR, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0300 - * @tc.name : 003.start -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.CONFIGURE, ENCODE_STEP.ERROR, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.CONFIGURE, ENCODE_STEP.ERROR, STREAM_STEP.STOP, - ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.CONFIGURE, ENCODE_STEP.ERROR, STREAM_STEP.STOP, - ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0600', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0600.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.CONFIGURE, ENCODE_STEP.ERROR, - STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0700', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0700.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.RESET, STREAM_STEP.STOP, ENCODE_STEP.CONFIGURE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0800', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0800.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.CONFIGURE, - ENCODE_STEP.ERROR, ENCODE_STEP.PREPARE, ENCODE_STEP.START, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability test - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0900', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_CALLBACK_0900.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.RESET, STREAM_STEP.STOP, ENCODE_STEP.CONFIGURE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.PREPARE, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.PREPARE, ENCODE_STEP.ERROR, ENCODE_STEP.START, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.PREPARE, ENCODE_STEP.ERROR, - ENCODE_STEP.RESET, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.PREPARE, - ENCODE_STEP.ERROR, ENCODE_STEP.RESET, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0600', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0600.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.PREPARE, - ENCODE_STEP.ERROR, ENCODE_STEP.RESET, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0700', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0700.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.PREPARE, - ENCODE_STEP.ERROR, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0800', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_CALLBACK_0800.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.PREPARE, - ENCODE_STEP.ERROR, ENCODE_STEP.RESET, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0100 - * @tc.name : 001.create -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.START, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0200 - * @tc.name : 002.configure -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.START, - ENCODE_STEP.ERROR, STREAM_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0400 - * @tc.name : 004.start -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.START, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0500 - * @tc.name : 005.flush -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, ENCODE_STEP.PREPARE, - ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.START, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0600 - * @tc.name : 006.stop -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0600', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0600.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.START, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0700', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0700.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.START, - ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0800 - * @tc.name : 008.reset -> start - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0800', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_CALLBACK_0800.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.START, - ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0100 - * @tc.name : 001.create -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.FLUSH, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, - STREAM_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.FLUSH, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0400 - * @tc.name : 004.start -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.FLUSH, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0600', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0600.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.STOP , ENCODE_STEP.FLUSH, - ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0700', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0700.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.FLUSH, - ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0800', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_CALLBACK_0800.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.FLUSH, - ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0100 - * @tc.name : 001.create -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.STOP, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, STREAM_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.STOP, ENCODE_STEP.ERROR, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0400 - * @tc.name : 004.start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.STOP, - ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0600', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0600.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.STOP, ENCODE_STEP.ERROR, - ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0700', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0700.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.STOP, - ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0800', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_CALLBACK_0800.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.STOP, ENCODE_STEP.ERROR, - ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0100 - * @tc.name : 001.create -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, - STREAM_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0400 - * @tc.name : 004.start -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.FLUSH, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0600', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0600.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0700', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0700.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0800', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_CALLBACK_0800.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.RESET, ENCODE_STEP.RESET, ENCODE_STEP.RELEASE); - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0100', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0100.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.FLUSH, - ENCODE_STEP.STOP, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0200', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0200.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.FLUSH, - ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0300', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0300.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.RESET, - ENCODE_STEP.CONFIGURE, STREAM_STEP.STOP, STREAM_STEP.SET_PARAM, STREAM_STEP.SET_EOS_FRAME, - STREAM_STEP.START, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0400', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0400.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.STOP, - ENCODE_STEP.START, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : test for state transition - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0500', 0, async function (done) { - let path = BASIC_PATH + 'SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_CALLBACK_0500.es'; - let mySteps = new Array(ENCODE_STEP.CONFIGURE, STREAM_STEP.CREATE, STREAM_STEP.SET_PARAM, - STREAM_STEP.SET_EOS_FRAME, ENCODE_STEP.GET_INPUTSURFACE, STREAM_STEP.START, - ENCODE_STEP.PREPARE, ENCODE_STEP.START, ENCODE_STEP.WAIT_FOR_EOS, ENCODE_STEP.STOP, - ENCODE_STEP.START, ENCODE_STEP.STOP, ENCODE_STEP.RELEASE); - frameTotal = 50; - toCreateVideoEncoderByName('avenc_mpeg4', path, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_RESET_CALLBACK_0100 - * @tc.name : 001. configure -> reset for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_RESET_CALLBACK_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let loopCnt = 0; - eventEmitter.on('configure', (mediaDescription) => { - videoEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('reset'); - }) - }); - eventEmitter.on('reset', () => { - videoEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info(`case reset 1`); - loopCnt += 1; - if (loopCnt < 50) { - console.info('case configure-reset current loop: ' + loopCnt); - eventEmitter.emit('configure', mediaDescription); - } else { - videoEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info('case release callback'); - videoEncodeProcessor = null; - done(); - }) - } - }) - }); - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - videoEncodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_STOP_CALLBACK_0100 - * @tc.name : 001. start -> stop for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_STOP_CALLBACK_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let loopCnt = 0; - eventEmitter.on('configure', (mediaDescription) => { - videoEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('getInputSurface'); - }) - }); - eventEmitter.on('getInputSurface', () => { - videoEncodeProcessor.getInputSurface((err, inputSurface) => { - expect(err).assertUndefined(); - expect(inputSurface != undefined).assertTrue(); - surfaceID = inputSurface; - console.info('in case : getInputSurface success, surfaceID ' + surfaceID); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - videoEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case : prepare success'); - eventEmitter.emit('start'); - }); - }); - eventEmitter.on('start', () => { - videoEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case : start success'); - eventEmitter.emit('stop'); - }); - }); - eventEmitter.on('stop', () => { - videoEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info(`case stop 1`); - loopCnt += 1; - if (loopCnt < 50) { - console.info('case start-stop current loop: ' + loopCnt); - eventEmitter.emit('start'); - } else { - videoEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info('case release callback'); - videoEncodeProcessor = null; - done(); - }) - } - }) - }); - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - videoEncodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CREATE_RELEASE_CALLBACK_0100 - * @tc.name : 001. create -> release for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CREATE_RELEASE_CALLBACK_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let loopCnt = 0; - eventEmitter.on('create', (name) => { - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - videoEncodeProcessor = processor; - eventEmitter.emit('release'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - }) - eventEmitter.on('release', () => { - videoEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info(`case release 1`); - videoEncodeProcessor = null; - loopCnt += 1; - if (loopCnt < 50) { - console.info('case create-release current loop: ' + loopCnt); - eventEmitter.emit('create', name); - } else { - done(); - } - }) - }) - eventEmitter.emit('create', name); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_TOTALLOOP_CALLBACK_0100 - * @tc.name : 001. total loop for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_TOTALLOOP_CALLBACK_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - let events = require('events'); - let eventEmitter = new events.EventEmitter(); - let loopCnt = 0; - eventEmitter.on('create', (name) => { - media.createVideoEncoderByName(name, (err, processor) => { - expect(err).assertUndefined(); - if (typeof(processor) != 'undefined') { - videoEncodeProcessor = processor; - eventEmitter.emit('configure', mediaDescription); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - }) - eventEmitter.on('configure', (mediaDescription) => { - videoEncodeProcessor.configure(mediaDescription, (err) => { - expect(err).assertUndefined(); - console.info(`case configure 1`); - eventEmitter.emit('getInputSurface'); - }) - }); - eventEmitter.on('getInputSurface', () => { - videoEncodeProcessor.getInputSurface((err, inputSurface) => { - expect(err).assertUndefined(); - expect(inputSurface != undefined).assertTrue(); - surfaceID = inputSurface; - console.info('in case : getInputSurface success, surfaceID ' + surfaceID); - eventEmitter.emit('prepare'); - }) - }); - eventEmitter.on('prepare', () => { - videoEncodeProcessor.prepare((err) => { - expect(err).assertUndefined(); - console.info('in case : prepare success'); - eventEmitter.emit('start'); - }); - }); - eventEmitter.on('start', () => { - videoEncodeProcessor.start((err) => { - expect(err).assertUndefined(); - console.info('in case : start success'); - eventEmitter.emit('flush'); - }); - }); - eventEmitter.on('flush', () => { - videoEncodeProcessor.flush((err) => { - expect(err).assertUndefined(); - console.info('in case : flush success'); - eventEmitter.emit('stop'); - }); - }); - eventEmitter.on('stop', () => { - videoEncodeProcessor.stop((err) => { - expect(err).assertUndefined(); - console.info('in case : stop success'); - eventEmitter.emit('reset'); - }); - }); - eventEmitter.on('reset', () => { - videoEncodeProcessor.reset((err) => { - expect(err).assertUndefined(); - console.info('in case : reset success'); - eventEmitter.emit('release'); - }); - }); - eventEmitter.on('release', () => { - videoEncodeProcessor.release((err) => { - expect(err).assertUndefined(); - console.info(`case release 1`); - videoEncodeProcessor = null; - loopCnt += 1; - if (loopCnt < 50) { - console.info('case create-release current loop: ' + loopCnt); - eventEmitter.emit('create', name); - } else { - done(); - } - }) - }) - eventEmitter.emit('create', name); - }) -}) - diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityPromiseTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityPromiseTest.test.js deleted file mode 100644 index 5b046fd9f..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoEncoderSoftwareReliabilityPromiseTest.test.js +++ /dev/null @@ -1,1523 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import mediademo from '@ohos.multimedia.mediademo' -import Fileio from '@ohos.fileio' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('videoEncoderReliabilityPromise', function () { - const ROOT = '/data/app/el1/bundle/results/'; - const BASIC_PATH = ROOT + 'video_reliability_promise_'; - let videoEncodeProcessor; - let mediaTest = mediademo.createMediaTest(); - let surfaceID = ''; - let outputQueue = []; - let outputCnt = 0; - let frameTotal = 100; - let frameCountOut = 0; - let flushAtEOS = false; - let sawOutputEOS = false; - let needGetMediaDes = false; - let workdoneAtEOS = false; - const END = 0; - const CONFIGURE = 1; - const GETSURFACE = 2; - const SETSTREAMPARAM = 3; - const PREPARE = 4; - const STARTSTREAM = 5; - const STOPSTREAM = 6; - const START = 7; - const FLUSH = 8; - const STOP = 9; - const RESET = 10; - const RELEASE = 11; - const HOLDON = 12; - const ERROR = 13; - const WAITFORALLOUTS = 14; - const JUDGE_EOS = 15; - const WAITTIME = 3000; - let width = 320; - let height = 240; - let framerate = 30; - let mediaDescription = { - "width": width, - "height": height, - "pixel_format": 3, - "frame_rate" : framerate, - } - let mime = 'video/mp4v-es'; - - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(async function() { - console.info('beforeEach case'); - await msleep(1000).then(() => { - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - surfaceID = ''; - outputQueue = []; - outputCnt = 0; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - workdoneAtEOS = false; - width = 320; - height = 240; - framerate = 30; - frameTotal = 100; - }) - - afterEach(async function() { - console.info('afterEach case'); - if (videoEncodeProcessor != null) { - await videoEncodeProcessor.release().then(() => { - console.info(`case release 1`); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - let failCallback = function(err) { - console.info('case callback err : ' + err); - expect(err).assertUndefined(); - } - - let failCallbackTrue = function(err, mySteps, done) { - console.info('case callback err : ' + err); - expect(err != undefined).assertTrue(); - nextStep(mySteps, done); - } - - let failCatch = function(err) { - console.info('case catch err : ' + err); - expect(err).assertUndefined(); - } - - function msleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - function resetParam() { - outputQueue = []; - outputCnt = 0; - frameTotal = 100; - flushAtEOS = false; - sawOutputEOS = false; - needGetMediaDes = false; - workdoneAtEOS = false; - } - - function writeFile(path, buf, len){ - try{ - let writestream = Fileio.createStreamSync(path, "ab+"); - let num = writestream.writeSync(buf, {length:len}); - writestream.flushSync(); - writestream.closeSync(); - } catch(e) { - console.info(e) - } - } - - function sleep(time) { - return new Promise((resolve) => setTimeout(resolve, time)); - } - - function wait(time) { - for(let t = Date.now(); Date.now() - t <= time;); - } - - async function nextStep(mySteps, done) { - console.info("case myStep[0]: " + mySteps[0]); - if (mySteps[0] == END) { - done(); - } - switch (mySteps[0]) { - case CONFIGURE: - mySteps.shift(); - console.info(`case to configure`); - await toConfigure(mySteps, done); - break; - case GETSURFACE: - mySteps.shift(); - console.info(`case to getInputSurface`); - await toGetInputSurface(); - nextStep(mySteps, done); - break; - case SETSTREAMPARAM: - mySteps.shift(); - toSetStreamParam(); - nextStep(mySteps, done); - break; - case PREPARE: - mySteps.shift(); - console.info(`case to prepare`); - await toPrepare(mySteps, done); - break; - case STARTSTREAM: - mySteps.shift(); - console.info(`case to start stream`); - toStartStream(); - nextStep(mySteps, done); - break; - case STOPSTREAM: - mySteps.shift(); - console.info(`case to stop stream`); - mediaTest.closeStream(surfaceID); - nextStep(mySteps, done); - break; - case START: - mySteps.shift(); - console.info(`case to start`); - await toStart(mySteps, done); - break; - case FLUSH: - mySteps.shift(); - console.info(`case to flush`); - await toFlush(mySteps, done); - break; - case STOP: - mySteps.shift(); - console.info(`case to stop`); - await toStop(mySteps, done); - break; - case RESET: - mySteps.shift(); - console.info(`case to reset`); - await toReset(); - nextStep(mySteps, done); - break; - case RELEASE: - mySteps.shift(); - console.info(`case to release`); - await toRelease(mySteps, done); - break; - case HOLDON: - mySteps.shift(); - setTimeout(() => { - nextStep(mySteps, done); - }, WAITTIME); - break; - case WAITFORALLOUTS: - mySteps.shift(); - console.info(`case wait for all outputs`); - break; - case JUDGE_EOS: - mySteps.shift(); - console.info(`case judge EOS state`); - expect(sawOutputEOS).assertTrue(); - nextStep(mySteps, done); - break; - default: - break; - } - } - async function dequeueOutputs(path, done) { - while (outputQueue.length > 0) { - let outputObject = outputQueue.shift(); - outputCnt += 1; - if (outputObject.flags == 1) { - console.info("saw output EOS"); - sawOutputEOS = true; - if (workdoneAtEOS) { - mediaTest.closeStream(surfaceID); - await toReset(); - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - done(); - } else { - console.info("sawOutputEOS = true;"); - } - } else { - console.info('not last frame, continue'); - videoEncodeProcessor.freeOutputBuffer(outputObject).then(() => { - console.info('release output success'); - frameCountOut++; - console.log('release output count:' + frameCountOut); - }) - } - } - } - - function setCallback(path, done) { - console.info('case callback'); - videoEncodeProcessor.on('newOutputData', async(outBuffer) => { - console.info('outputBufferAvailable'); - console.info('outBuffer.flags :' + outBuffer.flags); - if (needGetMediaDes) { - videoEncodeProcessor.getOutputMediaDescription().then((MediaDescription) => { - console.info("get OutputMediaDescription success"); - console.info('get outputMediaDescription : ' + MediaDescription); - needGetMediaDes = false; - }, failCallback).catch(failCatch); - } - outputQueue.push(outBuffer); - await dequeueOutputs(path, done); - }); - - videoEncodeProcessor.on('error',(err) => { - console.info('case error called,errName is' + err); - }); - videoEncodeProcessor.on('streamChanged',(format) => { - console.info('Output format changed: ' + format); - }); - } - - async function createVideoEncoder(savepath, mySteps, done) { - await media.createVideoEncoderByMime(mime).then((processor) => { - console.info(`case createVideoEncoder 1`); - videoEncodeProcessor = processor; - setCallback(savepath, done); - console.info("case start api test"); - nextStep(mySteps, done); - }, failCallback).catch(failCatch); - } - - async function toCreateByMime(mime, done) { - await media.createVideoEncoderByMime(mime).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByMime success'); - } else { - console.info('in case : createVideoEncoderByMime fail'); - expect().assertFail(); - done(); - } - }) - } - - function toSetStreamParam() { - mediaTest.setResolution(width, height); - mediaTest.setFrameRate(framerate); - mediaTest.setFrameCount(frameTotal); - } - - async function toGetInputSurface() { - await videoEncodeProcessor.getInputSurface().then((inputSurface) => { - expect(inputSurface != undefined).assertTrue(); - surfaceID = inputSurface; - }, failCallback).catch(failCatch); - } - - function toStartStream() { - mediaTest.isStart = 1; - mediaTest.startStream(surfaceID); - } - - async function toConfigure(mySteps, done) { - if (mySteps[0] == ERROR) { - mySteps.shift(); - console.info(`case to configure 2`); - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info(`case configure error 1`); - expect().assertFail(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - } else { - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - } - nextStep(mySteps, done); - } - - async function toPrepare(mySteps, done) { - if (mySteps[0] == ERROR) { - mySteps.shift(); - console.info(`case to prepare 2`); - await videoEncodeProcessor.prepare().then(() => { - console.info(`case prepare error 1`); - expect().assertFail(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - } else { - await videoEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - } - nextStep(mySteps, done); - } - - async function toStart(mySteps, done) { - if (mySteps[0] == ERROR) { - mySteps.shift(); - console.info(`case to start 2`); - await videoEncodeProcessor.start().then(() => { - console.info(`case start error 1`); - expect().assertFail(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - } else { - if (sawOutputEOS) { - resetParam(); - workdoneAtEOS = true; - } - await videoEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - } - nextStep(mySteps, done); - } - - async function toFlush(mySteps, done) { - if (mySteps[0] == ERROR) { - mySteps.shift(); - console.info(`case to flush 2`); - await videoEncodeProcessor.flush().then(() => { - console.info(`case flush error 1`); - expect().assertFail(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - } else { - await videoEncodeProcessor.flush().then(() => { - console.info("case flush success"); - }, failCallback).catch(failCatch); - if (flushAtEOS) { - mediaTest.closeStream(surfaceID); - resetParam(); - workdoneAtEOS = true; - } - } - nextStep(mySteps, done); - } - - async function toStop(mySteps, done) { - if (mySteps[0] == ERROR) { - mySteps.shift(); - console.info(`case to stop 2`); - await videoEncodeProcessor.stop().then(() => { - console.info(`case stop error 1`); - expect().assertFail(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - } else { - await videoEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - } - nextStep(mySteps, done); - } - - async function toReset() { - await videoEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - } - - async function toRelease(mySteps, done) { - if (mySteps[0] == ERROR) { - mySteps.shift(); - console.info(`case to relase 2`); - await videoEncodeProcessor.release().then(() => { - console.info(`case release error 1`); - expect().assertFail(); - }, (err) => {failCallbackTrue(err, mySteps, done)}).catch(failCatch); - videoEncodeProcessor = null; - } else { - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - if (mySteps[0] != RELEASE) { - videoEncodeProcessor = null; - } - } - nextStep(mySteps, done); - } - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0100 - * @tc.name : 001.create -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0100.es'; - let mySteps = new Array(CONFIGURE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0200 - * @tc.name : 002.prepare -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0200.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, CONFIGURE, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0300 - * @tc.name : 003.start -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, - CONFIGURE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0400 - * @tc.name : 004.flush -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, - CONFIGURE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0500 - * @tc.name : 005.stop -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP , - CONFIGURE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0600 - * @tc.name : 006.EOS -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, CONFIGURE, ERROR, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0700 - * @tc.name : 007.reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0700.es'; - let mySteps = new Array(RESET, CONFIGURE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0800 - * @tc.name : 008.configure -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0800.es'; - let mySteps = new Array(CONFIGURE, CONFIGURE, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0900 - * @tc.name : 009.configure -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_PROMISE_0900', 0, async function (done) { - let savepath = BASIC_PATH + 'configure_0900.es'; - let mySteps = new Array(CONFIGURE, RESET, CONFIGURE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0100 - * @tc.name : 001.create -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0100.es'; - let mySteps = new Array(PREPARE, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0200 - * @tc.name : 002.configure -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0200.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0300 - * @tc.name : 003.prepare -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, PREPARE, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0400 - * @tc.name : 004.start -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, PREPARE, ERROR, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0500 - * @tc.name : 005.flush -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, - PREPARE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0600 - * @tc.name : 006.stop -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, - PREPARE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0700 - * @tc.name : 007.EOS -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0700.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, PREPARE, ERROR, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0800 - * @tc.name : 008.reset -> prepare - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_PREPARE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'prepare_0800.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RESET, - PREPARE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0100 - * @tc.name : 001.create -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0100.es'; - let mySteps = new Array(START, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0200 - * @tc.name : 002.configure -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0200.es'; - let mySteps = new Array(CONFIGURE, START, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0300 - * @tc.name : 003.prepare -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, WAITFORALLOUTS); - workdoneAtEOS = true; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0400 - * @tc.name : 004.start -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, START, ERROR, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0500 - * @tc.name : 005.flush -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, - START, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0600 - * @tc.name : 006.stop -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, - START, WAITFORALLOUTS); - workdoneAtEOS = true; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0700 - * @tc.name : 007.EOS -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0700.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, START, ERROR, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0800 - * @tc.name : 008.reset -> start - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'start_0800.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RESET, - START, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0100 - * @tc.name : 001.create -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0100.es'; - let mySteps = new Array(FLUSH, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0200 - * @tc.name : 002.configure -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0200.es'; - let mySteps = new Array(CONFIGURE, FLUSH, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0300 - * @tc.name : 003.prepare -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, FLUSH, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0400 - * @tc.name : 004.start -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, FLUSH, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0500 - * @tc.name : 005.flush -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, FLUSH, - WAITFORALLOUTS); - workdoneAtEOS = true; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0600 - * @tc.name : 006.stop -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, - FLUSH, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0700 - * @tc.name : 007.EOS -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0700.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, FLUSH, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0800 - * @tc.name : 008.reset -> flush - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_FLUSH_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'flush_0800.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RESET, - FLUSH, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0100 - * @tc.name : 001.create -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0100.es'; - let mySteps = new Array(STOP, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0200 - * @tc.name : 002.configure -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0200.es'; - let mySteps = new Array(CONFIGURE, STOP, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0300 - * @tc.name : 003.prepare -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STOP, ERROR, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0400 - * @tc.name : 004.start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0500 - * @tc.name : 005.flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, STOP, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0600 - * @tc.name : 006.stop -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, STOP, ERROR, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0700 - * @tc.name : 007.EOS -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0700.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, JUDGE_EOS, - STOP, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0800 - * @tc.name : 008.reset -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_STOP_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'stop_0800.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RESET, - STOP, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0100 - * @tc.name : 001.create -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0100.es'; - let mySteps = new Array(RESET, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0200 - * @tc.name : 002.configure -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0200.es'; - let mySteps = new Array(CONFIGURE, RESET, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0300 - * @tc.name : 003.prepare -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, RESET, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0400 - * @tc.name : 004.start -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RESET, - STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0500 - * @tc.name : 005.flush -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, - RESET, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0600 - * @tc.name : 006.stop -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, - RESET, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0700 - * @tc.name : 007.EOS -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0700.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, RESET, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0800 - * @tc.name : 008.reset -> reset - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RESET_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'reset_0800.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RESET, - RESET, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0100 - * @tc.name : 001.create -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0100.es'; - let mySteps = new Array(RELEASE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0200 - * @tc.name : 002.configure -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0200.es'; - let mySteps = new Array(CONFIGURE, RELEASE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0300 - * @tc.name : 003.prepare -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, RELEASE, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0400 - * @tc.name : 004.start -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, - RELEASE, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0500 - * @tc.name : 005.flush -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, FLUSH, - RELEASE, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0600 - * @tc.name : 006.stop -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0600', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0600.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, STOP, - RELEASE, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0700 - * @tc.name : 007.EOS -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0700', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0700.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, RELEASE, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0800 - * @tc.name : 008.release -> release - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_RELEASE_PROMISE_0800', 0, async function (done) { - let savepath = BASIC_PATH + 'release_0800.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, STARTSTREAM, START, RELEASE, - RELEASE, ERROR, STOPSTREAM, END); - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0100 - * @tc.name : 001.EOS -> flush -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0100', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0100.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, FLUSH, STOP, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0200 - * @tc.name : 002.EOS -> flush -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0200', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0200.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, FLUSH, STARTSTREAM, WAITFORALLOUTS); - frameTotal = 2; - flushAtEOS = true; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0300 - * @tc.name : 003.EOS -> reset -> configure - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0300', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0300.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, RESET, CONFIGURE, STOPSTREAM, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0400 - * @tc.name : 004.EOS -> stop -> start -> EOS - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0400', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0400.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, STOPSTREAM, STOP, START, SETSTREAMPARAM, STARTSTREAM, WAITFORALLOUTS); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0500 - * @tc.name : 005.EOS -> stop -> start -> stop - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_EOS_PROMISE_0500', 0, async function (done) { - let savepath = BASIC_PATH + 'eos_0500.es'; - let mySteps = new Array(CONFIGURE, GETSURFACE, SETSTREAMPARAM, PREPARE, START, STARTSTREAM, HOLDON, - JUDGE_EOS, STOP, START, STOP, STOPSTREAM, RELEASE, END); - frameTotal = 2; - createVideoEncoder(savepath, mySteps, done); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_RESET_PROMISE_0100 - * @tc.name : 001. configure -> reset for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CONFIGURE_RESET_PROMISE_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - for (let j = 1; j < 51; j++) { - console.info('case configure-reset current loop: ' + j); - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - } - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_STOP_PROMISE_0100 - * @tc.name : 001. start -> stop for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_START_STOP_PROMISE_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - await toGetInputSurface(); - await videoEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - for (let j = 1; j < 51; j++) { - console.info('case start-stop current loop: ' + j); - await videoEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - } - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CREATE_RELEASE_PROMISE_0100 - * @tc.name : 001. create -> release for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_CREATE_RELEASE_PROMISE_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - for (let j = 1; j < 51; j++) { - console.info('case create-release current loop: ' + j); - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - done(); - }) - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_TOTALLOOP_PROMISE_0100 - * @tc.name : 001. total loop for 50 times - * @tc.desc : Reliability Test - * @tc.size : MediumTest - * @tc.type : Reliability - * @tc.level : Level2 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_SOFTWARE_ENCODER_API_TOTALLOOP_PROMISE_0100', 0, async function (done) { - let name = 'avenc_mpeg4'; - for (let j = 1; j < 51; j++) { - console.info('case create-release current loop: ' + j); - await media.createVideoEncoderByName(name).then((processor) => { - if (typeof (processor) != 'undefined') { - videoEncodeProcessor = processor; - console.info('in case : createVideoEncoderByName success'); - } else { - console.info('in case : createVideoEncoderByName fail'); - expect().assertFail(); - done(); - } - }) - await videoEncodeProcessor.configure(mediaDescription).then(() => { - console.info("case configure success"); - }, failCallback).catch(failCatch); - await toGetInputSurface(); - await videoEncodeProcessor.prepare().then(() => { - console.info("case prepare success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.start().then(() => { - console.info("case start success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.flush().then(() => { - console.info("case flush success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.stop().then(() => { - console.info("case stop success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.reset().then(() => { - console.info("case reset success"); - }, failCallback).catch(failCatch); - await videoEncodeProcessor.release().then(() => { - console.info("case release success"); - }, failCallback).catch(failCatch); - videoEncodeProcessor = null; - } - done(); - }) -}) diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoHardwareEncoderEnumTest.test.js b/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoHardwareEncoderEnumTest.test.js deleted file mode 100644 index b4033e53e..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/js/test/VideoHardwareEncoderEnumTest.test.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import media from '@ohos.multimedia.media' -import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' - -describe('VideoHardwareEncoderEnum', function () { - - beforeAll(function() { - console.info('beforeAll case'); - }) - - beforeEach(function() { - console.info('beforeEach case'); - }) - - afterEach(function() { - console.info('afterEach case'); - }) - - afterAll(function() { - console.info('afterAll case'); - }) - - - /* * - * @tc.number : SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_ENUM_MediaDescriptionKey_0100 - * @tc.name : 001.MediaDescriptionKey - * @tc.desc : Test Enumerate MediaDescriptionKey - * @tc.size : MediumTest - * @tc.type : Function test - * @tc.level : Level0 - */ - it('SUB_MULTIMEDIA_MEDIA_VIDEO_HARDWARE_ENCODER_ENUM_MediaDescriptionKey_0100', 0, async function (done) { - expect(media.MediaDescriptionKey.MD_KEY_SUSPEND_INPUT_SURFACE).assertEqual("suspend_input_surface"); - expect(media.MediaDescriptionKey.MD_KEY_VIDEO_ENCODE_BITRATE_MODE).assertEqual("video_encode_bitrate_mode"); - expect(media.MediaDescriptionKey.MD_KEY_PROFILE).assertEqual("codec_profile"); - expect(media.MediaDescriptionKey.MD_KEY_QUALITY).assertEqual("codec_quality"); - expect(media.MediaDescriptionKey.MD_KEY_CUSTOM).assertEqual("vendor.custom"); - expect(media.MediaDescriptionKey.MD_KEY_MAX_INPUT_SIZE).assertEqual("max_input_size"); - expect(media.MediaDescriptionKey.MD_KEY_MAX_ENCODER_FPS).assertEqual("max_encoder_fps"); - expect(media.MediaDescriptionKey.MD_KEY_WIDTH).assertEqual("width"); - expect(media.MediaDescriptionKey.MD_KEY_HEIGHT).assertEqual("height"); - expect(media.MediaDescriptionKey.MD_KEY_PIXEL_FORMAT).assertEqual("pixel_format"); - expect(media.MediaDescriptionKey.MD_KEY_FRAME_RATE).assertEqual("frame_rate"); - expect(media.MediaDescriptionKey.MD_KEY_CAPTURE_RATE).assertEqual("capture_rate"); - expect(media.MediaDescriptionKey.MD_KEY_I_FRAME_INTERVAL).assertEqual("i_frame_interval"); - expect(media.MediaDescriptionKey.MD_KEY_REQUEST_I_FRAME).assertEqual("req_i_frame"); - expect(media.MediaDescriptionKey.MD_KEY_REPEAT_FRAME_AFTER).assertEqual("repeat_frame_after"); - done(); - }) -}) \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/element/string.json b/multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/element/string.json deleted file mode 100644 index 0bae6bd40..000000000 --- a/multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/element/string.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "string": [ - { - "name": "entry_MainAbility", - "value": "entry_MainAbility" - }, - { - "name": "mainability_description", - "value": "JS_Empty Ability" - } - ] -} \ No newline at end of file diff --git a/multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/media/icon.png b/multimedia/media/media_js_standard/videoEncoder/src/main/resources/base/media/icon.png deleted file mode 100644 index ce307a8827bd75456441ceb57d530e4c8d45d36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6790 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