提交 08bb39da 编写于 作者: L ling990

videoEncoder Signed-off-by: ling990 <liling96@huawei.com>

Signed-off-by: Nling990 <liling96@huawei.com>
上级 71051406
# 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("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"
}
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"
}
{
"description": "Configuration for videoPlayer Tests",
"driver": {
"type": "JSUnitTest",
"test-timeout": "2000000",
"package": "ohos.acts.multimedia.video.videoencoder",
"shell-timeout": "60000"
},
"kits": [
{
"type": "PushKit",
"pre-push": [
],
"push": [
]
},
{
"type": "ShellKit",
"run-command": [
"rm -R /data/media/results",
"chmod 777 -R /data/media",
"chmod 777 /data/media/*",
"mkdir /data/media/results",
"setenforce 0"
],
"teardown-command":[
"setenforce 1"
]
},
{
"test-file-name": [
"ActsVideoEncoderJsTest.hap"
],
"type": "AppInstallKit",
"cleanup-apps": true
}
]
}
{
"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": [
"phone",
"tablet",
"tv",
"wearable"
],
"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
/*
* 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');
}
};
{
"strings": {
"hello": "Hello",
"world": "World"
}
}
\ No newline at end of file
{
"strings": {
"hello": "您好",
"world": "世界"
}
}
\ No newline at end of file
.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;
}
}
<div class="container">
<text class="title">
{{ $t('strings.hello') }} {{ title }}
</text>
</div>
/*
* 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 = 60000
configService.setConfig(this)
require('../../../test/List.test')
core.execute()
},
onReady() {
},
}
\ No newline at end of file
/*
* 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('./VideoEncoderFuncPromiseTest.test.js')
require('./VideoEncoderReliabilityPromiseTest.test.js')
require('./VideoEncoderMultiInstancesTest.test.js')
/*
* 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 mediademo from '@ohos.multimedia.mediademo'
import Fileio from '@ohos.fileio'
import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index'
describe('videoEncoderSoftwareMultiInstances', function () {
const events = require('events');
const eventEmitter = new events.EventEmitter();
const BASIC_PATH = '/data/media/results/videoencode_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;
beforeAll(function() {
console.info('beforeAll case');
})
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");
videoEncodeProcessor = 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();
}
function resetParam() {
outputQueue = [];
outputCnt = 0;
frameTotal = 100;
stopAtEOS = false;
resetAtEOS = false;
flushAtEOS = false;
sawOutputEOS = false;
needGetMediaDes = 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 dequeueOutputs(path, nextStep) {
while (outputQueue.length > 0) {
let outputObject = outputQueue.shift();
outputCnt += 1;
if (outputObject.flags == 1) {
console.info("case last frame");
mediaTest.closeStream(surfaceID);
toRelease();
nextStep();
return;
} else {
console.info('not last frame, write data to file');
writeFile(path, outputObject.data, outputObject.length);
console.info("write to file success");
videoEncodeProcessor.releaseOutput(outputObject).then(() => {
console.info('release output success');
});
}
}
}
function setCallback(path, nextStep) {
console.info('case callback');
videoEncodeProcessor.on('outputBufferAvailable', 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(path, nextStep);
});
videoEncodeProcessor.on('error',(err) => {
console.info('case error called,errName is' + err);
});
videoEncodeProcessor.on('outputFormatChanged',(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((surface) => {
expect(surface != undefined).assertTrue();
console.info('case getInputSurface success');
surfaceID = surface;
}, 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");
videoEncodeProcessor = null;
}, failCallback).catch(failCatch);
}
/* *
* @tc.number : SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_MULTIINSTANCE_0100
* @tc.name : 001.create 16 encoder
* @tc.desc : basic encode function
* @tc.size : MediumTest
* @tc.type : Function test
* @tc.level : Level2
*/
it('SUB_MEDIA_VIDEO_SOFTWARE_ENCODER_MULTIINSTANCE_0100', 0, async function (done) {
console.info("case test multiple encoder instances");
let savepath = BASIC_PATH + '0100.txt';
let mime = 'video/mp4v-es';
let width = 720;
let height = 480;
let framerate = 60;
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 < 16; j++) {
await array[j].release().then(() => {
console.info("case release encoder " + j);
array[j] = null;
}, failCallback).catch(failCatch);
}
console.info('release 16 encoders success');
done();
});
async function runCase() {
toCreateStream();
toSetStreamParam(width, height, framerate, frameTotal);
await toConfigure(mediaDescription);
setCallback(savepath, function(){eventEmitter.emit('nextStep')});
await toGetInputSurface();
await toPrepare();
toStartStream();
await toStart();
}
for (let i = 1; i <= 16; i += 1) {
await media.createVideoEncoderByMime(mime).then((processor) => {
if (typeof(processor) != 'undefined') {
console.info("case create createVideoEncoder success: " + i);
if (i == 16) {
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
{
"string": [
{
"name": "entry_MainAbility",
"value": "entry_MainAbility"
},
{
"name": "mainability_description",
"value": "JS_Empty Ability"
}
]
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册