check in the code for do codec performance testing on mobile

This commit is contained in:
syureyi 2014-07-21 15:31:43 +08:00
parent 9ac7cd2816
commit a555639dd2
13 changed files with 906 additions and 7 deletions

View File

@ -0,0 +1,138 @@
#!/bin/bash
AUTO_TEST_ANDROID_PATH=`pwd`
AUTO_TEST_SRC_PATH="../../../"
AUTO_TEST_RES_PATH="${AUTO_TEST_ANDROID_PATH}/report"
mkdir -p ${AUTO_TEST_RES_PATH}
#Prepare android build enviroment
echo please set the enviroment variable as:
echo export ANDROID_HOME="path of android sdk"
echo export ANDROID_NDK_HOME="path of android ndk"
ANDROID_SDK_PATH=${ANDROID_HOME}
ANDROID_NDK_PATH=${ANDROID_NDK_HOME}
ANDROID_MAKE_PARAMS="OS=android NDKROOT=${ANDROID_NDK_PATH} TARGET=android-19"
if [ "#${ANDROID_SDK_PATH}" = "#" ]
then
echo Please set ANDROID_HOME with the path of Android SDK
exit 1
fi
if [ "#${ANDROID_NDK_PATH}" = "#" ]
then
echo Please set ANDROID_NDK_HOME with the path of Android NDK
exit 1
fi
#make build
cd ${AUTO_TEST_SRC_PATH}
find ./ -name *.o -exec rm -f {} \;
find ./ -name *.d -exec rm -f {} \;
make $ANDROID_MAKE_PARAMS
if [ $? -ne 0 ]
then
echo Build error,check with the trace of make
exit 1
fi
ENCDEC=$1
#find apk
if [ ${ENCDEC} = "enc" ]
then
echo Start to find enc apk
apk_name=`find ./ -name WelsEncTest-debug.apk`
if [ "#${apk_name}" = "#" ]
then
echo Fail to find encoder APK.
exit 1
fi
else
echo Start to find dec apk
apk_name=`find ./ -name WelsDecTest-debug.apk`
if [ "#${apk_name}" = "#" ]
then
echo Fail to find decoder APK.
exit 1
fi
fi
#prepare devices
ADB=${ANDROID_SDK_PATH}/platform-tools/adb
#get devices
devices=`$ADB devices | awk -F" " '/\tdevice/{print $1}'`
if [ "#$devices" = "#" ];then
echo "Have not any android devices."
exit 1
fi
#run apk
run_apk() {
local apk=$1;
local rand=` date +%s`
if [[ "${apk}" =~ "WelsDecTest-debug.apk" ]]
then
apk_id="com.wels.dec"
apk_main="com.wels.dec/.WelsDecTest"
test_path="/sdcard/welsdec"
log_grep_params="welsdec"
test_res=${AUTO_TEST_ANDROID_PATH}/../DecoderPerfTestRes
report_file=${AUTO_TEST_RES_PATH}/decPerf_${rand}
fi
if [[ "${apk}" =~ "WelsEncTest-debug.apk" ]]
then
apk_id="com.wels.enc"
apk_main="com.wels.enc/.WelsEncTest"
test_path="/sdcard/welsenc"
log_grep_params="welsenc"
test_res=${AUTO_TEST_ANDROID_PATH}/../EncoderPerfTestRes
report_file=${AUTO_TEST_RES_PATH}/encPerf_${rand}
fi
for dev in $devices; do
dev_info_file=${AUTO_TEST_RES_PATH}/${dev}.log
$ADB -s $dev uninstall ${apk_id}
$ADB -s $dev install -r ${apk}
#TODO: output more info about android device such as name,cpu,memory,and also power comsumption.
echo `$ADB -s $dev shell cat /system/build.prop |grep ro.product.model | awk -F"=" '{print $2}'`>${dev_info_file}
#push resources
$ADB -s $dev push ${test_res} ${test_path}
#before start logcat,kill logcat
pid=`$ADB -s $dev shell ps | grep logcat | awk '{print $2;}'`
[ "#$pid" != "#" ] && $ADB -s $dev shell kill $pid >/dev/null
$ADB -s $dev logcat -c
$ADB -s $dev logcat |grep ${log_grep_params} >${report_file}_${dev}.log &
$ADB -s $dev shell am start -n ${apk_main}
# check whetehr the app is finished every 2 sec
for (( ; ; )); do
$ADB -s $dev shell ps | grep ${apk_id}
if [ $? -ne 0 ]; then
sleep 2
$ADB -s $dev shell ps | grep ${apk_id}
[ $? -ne 0 ] && break
fi
sleep 2
done
# kill logcat
pid=`$ADB -s $dev shell ps | grep logcat | awk '{print $2;}'`
[ "#$pid" != "#" ] && $ADB -s $dev shell kill $pid >/dev/null
#delete the res
$ADB -s $dev shell rm -rf ${test_path}
done
}
for apk in ${apk_name};do
run_apk $apk;
if [ $? -ne 0 ]
then
echo There is something wrong happened when run ${apk_name}
exit 1
else
echo Finished $ENCDEC performance test on android
echo The test result is at ./android/report/xxx.log
echo xxxxxxxxxxxxxxxAndroid $ENCDEC Endxxxxxxxxxxxxxxxx
fi
done

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,147 @@
#!/bin/bash
##############################################################
#Build ios test ref app
#set the default configuration
CODEC_TEST_IOS_ARCH="armv7 armv7s arm64"
CODEC_TEST_IOS_PLATFORM="iphoneos"
CODEC_TEST_IOS_DEBUG_RELEASE="Release"
CODEC_TEST_IOS_REPORT_SUBFOLDER="release"
buildXcodeProject()
{
xcodebuild ARCHS="${CODEC_TEST_IOS_ARCH}" VALID_ARCHS="${CODEC_TEST_IOS_ARCH}" ONLY_ACTIVE_ARCH=YES -project $1 -target $2 -configuration $3 -sdk ${CODEC_TEST_IOS_PLATFORM} clean build
if [ $? -eq 0 ]; then
echo "build $1 $3 successfully"
else
echo "build $1 $3 fail"
exit 1
fi
}
iosPerformanceTest()
{
if [ $# -gt 2 ]; then
echo "Please use command $0 [enc/dec] [release/debug]"
exit 1
fi
for PARAM in $*; do
if [ "enc" = "${PARAM}" ]; then
CODEC_TEST_XCODE_PROJECT_NAME="${AUTO_TEST_SRC_PATH}/codec/build/iOS/enc/encDemo/encDemo.xcodeproj"
CODEC_TEST_IOS_PROJECT_NAME="encDemo"
CODEC_TEST_IOS_PROJECT_PATH="${AUTO_TEST_SRC_PATH}/codec/build/iOS/enc/encDemo/build"
CODEC_TEST_IOS_APP=${CODEC_TEST_IOS_PROJECT_PATH}/${CODEC_TEST_IOS_DEBUG_RELEASE}-iphoneos/${CODEC_TEST_IOS_PROJECT_NAME}.app
CODEC_TEST_IOS_APP_ID="cisco.encDemo"
CODEC_TEST_RES=${AUTO_TEST_IOS_PATH}/../EncoderPerfTestRes
CODEC_TEST_LOG="encPerf"
elif [ "dec" = "${PARAM}" ]; then
CODEC_TEST_XCODE_PROJECT_NAME="${AUTO_TEST_SRC_PATH}/codec/build/iOS/dec/demo/demo.xcodeproj/"
CODEC_TEST_IOS_PROJECT_NAME="demo"
CODEC_TEST_IOS_PROJECT_PATH="${AUTO_TEST_SRC_PATH}/codec/build/iOS/dec/demo/build"
CODEC_TEST_IOS_APP=${CODEC_TEST_IOS_PROJECT_PATH}/${CODEC_TEST_IOS_DEBUG_RELEASE}-iphoneos/${CODEC_TEST_IOS_PROJECT_NAME}.app
CODEC_TEST_IOS_APP_ID="hf.cisco.demo"
CODEC_TEST_RES=${AUTO_TEST_IOS_PATH}/../DecoderPerfTestRes
CODEC_TEST_LOG="decPerf"
elif [ "release" = "${PARAM}" ]; then
CODEC_TEST_IOS_DEBUG_RELEASE="Release"
CODEC_TEST_IOS_REPORT_SUBFOLDER="release"
elif [ "debug" = "${PARAM}" ]; then
CODEC_TEST_IOS_DEBUG_RELEASE="Debug"
CODEC_TEST_IOS_REPORT_SUBFOLDER="debug"
else
echo parameters are illegal!!!, please have a check.
exit 1
fi
done
echo "Codec test will run on ${CODEC_TEST_IOS_PLATFORM} with ${CODEC_TEST_IOS_DEBUG_RELEASE}"
buildXcodeProject ${CODEC_TEST_XCODE_PROJECT_NAME} ${CODEC_TEST_IOS_PROJECT_NAME} ${CODEC_TEST_IOS_DEBUG_RELEASE} ${CODEC_TEST_IOS_PLATFORM}
##############run on ios devices#########################
# for real device
if [ ! -d ${CODEC_TEST_IOS_APP} ] ; then
echo "${CODEC_TEST_IOS_APP} is not found"
exit 1
else
echo "Find app ${CODEC_TEST_IOS_APP}"
fi
#ensure instruments not runing
echo "Try to kill the runing instruments"
pids_str=`ps x -o pid,command | grep -v grep | grep "instruments" | awk '{printf "%s,", $1}'`
instruments_pids="${pids_str//,/ }"
for pid in ${instruments_pids}; do
echo "Found instruments ${pid}. Killing..."
kill -9 ${pid} && wait ${pid} &> /dev/null
done
DEVICES=`system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p' | grep "Serial Number:" | awk -F ": " '{print $2}'`
if [ "${DEVICES}#" == "#" ]
then
echo "Can not find any connected device! please check device is connected to MAC!"
exit 1
else
rand=`date +%s`
for DEVICE_ID in ${DEVICES}
do
echo "Try to run on device:${DEVICE_ID}"
#uninstall the application from device to remove the last result
./fruitstrap uninstall --bundle ${CODEC_TEST_IOS_APP_ID} --id ${DEVICE_ID}
if [ $? -ne 0 ]; then
echo uninstall application: ${CODEC_TEST_IOS_APP} from device: ${DEVICE_ID} is failed!
fi
#install the application
./fruitstrap install --bundle ${CODEC_TEST_IOS_APP} --id ${DEVICE_ID}
if [ $? -ne 0 ]; then
echo install application: ${CODEC_TEST_IOS_APP} to device: ${DEVICE_ID} is failed!
exit 1
fi
./iFileTransfer -o copy -id ${DEVICE_ID} -app ${CODEC_TEST_IOS_APP_ID} -from ${CODEC_TEST_RES}
instruments -w ${DEVICE_ID} -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate ${CODEC_TEST_IOS_APP} -e UIASCRIPT ./uiascript.js -e UIARRESULTPATH /tmp/
#copy to report folder
./iFileTransfer -o download -id ${DEVICE_ID} -app ${CODEC_TEST_IOS_APP_ID} -from /Documents/${CODEC_TEST_LOG}.log -to ${CODEC_TEST_IOS_REPORT_PATH}/${CODEC_TEST_LOG}_${DEVICE_ID}_${rand}.log
if [ $? -ne 0 ]; then
echo "download file: ${CODEC_TEST_LOG}.log from ${CODEC_TEST_IOS_APP_ID} is failed!"
exit 1
fi
done
fi
}
AUTO_TEST_IOS_PATH=`pwd`
AUTO_TEST_SRC_PATH="../../.."
CODEC_TEST_IOS_REPORT_PATH="${AUTO_TEST_IOS_PATH}/report"
if [ ! -d ${CODEC_TEST_IOS_REPORT_PATH} ]
then
mkdir -p ${CODEC_TEST_IOS_REPORT_PATH}
fi
ENCDEC=$1
#start to get encoder/decoder performance data,default run the xcode with release
iosPerformanceTest $ENCDEC release
if [ $? -ne 0 ]; then
echo "Running $ENCDEC demo to get encoder performance is failed!"
exit 1
else
echo Finished $ENCDEC performance test on ios devices
echo the test result is generated at ./ios/report/xx.loGbash parsePerfData.sh
echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxIOS $ENCDEC Endxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fi
#TODO:according to the trace of instruments to do some analysis
find .\ -name *.trace -exec rm -rf {} \;

View File

@ -0,0 +1,19 @@
UIATarget.onAlert = function onAlert(alert){
UIALogger.logMessage("In Alert!");
title = alert.name();
if (title && title.indexOf("Microphone") !== -1) {
UIALogger.logMessage("Alert with title '" + title + "' encountered!");
var buttons = alert.buttons();
var buttonCount = buttons.length;
if (buttonCount > 0) {
var acceptButton = buttons[buttonCount - 1];
acceptButton.tap(); // last button is accept
}
return true; //forbid the default cancel processing
}
return false; //using the default cancel processing
}
var target = UIATarget.localTarget();
target.delay(6000);

View File

@ -0,0 +1,111 @@
#!/bin/bash
#usage runGetPerformanceInfo ${PerformanceLogFile}
runGetPerformanceInfo_openh264()
{
if [ ! $# -eq 2 ]
then
echo "not enough parameters!"
echo "usage: ${0} [android/ios] ${PerformanceLogFile}"
return 1
fi
local PerformanceLogFile=$2
local FileName=""
local Width=""
local Height=""
local Frames=""
local FPS=""
local EncodeTime=""
if [ $1 = "android" ]
then seperatorNum=3
else
seperatorNum=2
fi
while read line
do
if [[ $line =~ "enc yuv file" ]]
then
FileName=`echo $line | awk 'BEGIN {FS="enc yuv file"} {print $2}'`
FileName=`echo $FileName | awk 'BEGIN {FS=":"} {print $2}'`
fi
if [[ $line =~ "Width" ]]
then
Width=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
fi
if [[ $line =~ "Height" ]]
then
Height=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
fi
if [[ $line =~ "Frames" ]]
then
Frames=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
fi
if [[ $line =~ "FPS" ]]
then
FPS=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
FPS=`echo $FPS | awk 'BEGIN {FS="fps"} {print $1}'`
echo "${FileName},"${Width}x${Height}",${Frames},${FPS}"
fi
if [[ $line =~ "encode time" ]]
then
EncodeTime=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
fi
if [[ $line =~ "height" ]]
then
Height=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
fi
if [[ $line =~ "H264 source file name" ]]
then
FileName=`echo $line | awk 'BEGIN {FS=":"} {print $'${seperatorNum}'}'`
if [ $1 = "ios" ]
then
FileName=`echo $FileName | awk -F"DecoderPerfTestRes" '{print $2}'`
FileName=`echo $FileName | awk -F"/" '{print $2}'`
else
FileName=`echo $FileName | awk -F"/" '{print $4}'`
fi
fi
done <${PerformanceLogFile}
}
AUTO_TEST_RESULT_PATH="./TestResultCSV/"
parseLogToCSV()
{
if [ $# -ne 1 ]
then echo "Please input $0 [android/ios]"
fi
if [ $* = "android" ]
then
Result_log_path="./android/report/"
suffix=android
dos2unix ${Result_log_path}*.*
else
Result_log_path="./ios/report/"
suffix=ios
fi
Result_log=`ls ${Result_log_path}`
for log in ${Result_log}
do
PerformFile=`echo $log |awk -F"." '{print $1}'`
PerformFile=${PerformFile}_${suffix}.csv
#inital perfermance file
echo "$log,,,">>${AUTO_TEST_RESULT_PATH}${PerformFile}
echo "YUV,Resolution,Encodedframes,FPS">>${AUTO_TEST_RESULT_PATH}${PerformFile}
runGetPerformanceInfo_openh264 ${suffix} ${Result_log_path}${log}>>${AUTO_TEST_RESULT_PATH}${PerformFile}
done
}
parseLogToCSV android
parseLogToCSV ios

View File

@ -0,0 +1,123 @@
#!bin/bash
IOS=1
ANDROID=1
ENC=1
DEC=1
AUTO_TEST_PATH=`pwd`
#Judge to run the test on which kind of mobile
if [ $# -eq 0 ];then
echo Default testing will run on android and ios devices meanwhile
else
for params in $*; do
if [ $params = "ios" ];then
echo Running the test just on ios devices
ANDROID=0
elif [ $params = "android" ];then
echo Running the test just on android devices
IOS=0
elif [ $params = "enc" ];then
echo Running the encoder performance test
DEC=0
elif [ $params = "dec" ];then
echo Running the decoder performance test
ENC=0
else
echo parameters are illegal!!!, ${0} [ios/android] [enc/dec].
exit 1
fi
done
fi
#Prepare encoder resources
if [ ${ENC} = "1" ]
then
if [ ! -d ./EncoderPerTestRes ]
then
mkdir -p ./EncoderPerfTestRes
fi
if [ "#`ls ./EncoderPerfTestRes`" = "#" ]
then
echo put yuv and cfg file into ./EncoderPerfTest folder as
echo case_720p
echo case_720p/welsenc.cfg
echo case_720p/layer2.cfg
echo case_720p/yuv
echo case_720p/yuv/xxx1.yuv
echo case_720p/yuv/xxx2.yuv
echo case_360p
echo case_360p/welsenc.cfg
echo ......
else
#Run the encoder performance test
if [ ${IOS} = "1" ]
then
echo xxxxxxxxxxxxxxxxIOS ENC Startxxxxxxxxxxxxxxxxxx
echo Run the Encoder performance test on ios devices
cd ./ios
bash run_AutoTest_ios.sh enc
cd ${AUTO_TEST_PATH}
fi
if [ ${ANDROID} = "1" ]
then
echo xxxxxxxxxxxxxxAndroid ENC Startxxxxxxxxxxxxxxxxxxxx
echo Run the Encoder performance test on android devices
cd ./android
bash run_AutoTest_android.sh enc
cd ${AUTO_TEST_PATH}
fi
fi
fi
#Prepare decoder resources
if [ ${DEC} = "1" ]
then
if [ ! -d ./DecoderPerfTestRes ]
then
mkdir -p ./DecoderPerfTestRes
fi
if [ "#`ls ./DecoderPerfTestRes`" = "#" ]
then
echo put decoded bitstreams into such folder as
echo xxx1.264
echo xxx2.264
echo ........
else
#Run the decoder performance test
if [ ${IOS} = "1" ]
then
echo xxxxxxxxxxxxxxxxIOS DEC Startxxxxxxxxxxxxxxxxxx
echo Run the Decoder performance test on ios devices
cd ./ios
bash run_AutoTest_ios.sh dec
cd ${AUTO_TEST_PATH}
fi
if [ ${ANDROID} = "1" ]
then
echo xxxxxxxxxxxxxxAndroid DEC Startxxxxxxxxxxxxxxxxxxxx
echo Run the Decoder performance test on android devices
cd ./android
bash run_AutoTest_android.sh dec
cd ${AUTO_TEST_PATH}
fi
fi
fi
#TODO:NOW just generate csv file to display performance data
cd ${AUTO_TEST_PATH}
if [[ "#`ls ./ios/report`" == "#" || "#`ls ./android/report`" == "#" ]]
then
echo There is nothing result log generated at ios or android devices
else
echo Start to generate test result csv file
#Test result
mkdir -p ./TestResultCSV
bash parsePerfData.sh
echo The csv file locate ./TestResultCSV/xxx.csv
fi

View File

@ -3,6 +3,7 @@ package com.wels.dec;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Process;
import android.util.Log;
import android.view.KeyEvent;
@ -19,7 +20,7 @@ public class WelsDecTest extends Activity {
private OnClickListener OnClickEvent;
private Button mBtnLoad, mBtnStartSW;
final String mStreamPath = "/sdcard/wels-seq/";
final String mStreamPath = "/sdcard/welsdec/";
Vector<String> mStreamFiles = new Vector<String>();
@Override
@ -81,6 +82,41 @@ public class WelsDecTest extends Activity {
mBtnStartSW.setOnClickListener(OnClickEvent);
System.out.println("Done!");
//if you want to run the demo manually, just comment following 2 lines
runAutoDec();
}
public void runAutoDec()
{
Thread thread = new Thread() {
public void run()
{
Log.i(TAG,"decoder performance test begin");
File bitstreams = new File(mStreamPath);
String[] list = bitstreams.list();
if(list==null || list.length==0)
{
Log.i(TAG,"have not find any coder resourse");
finish();
}
for(int i=0;i<list.length;i++)
{
String inFile=list[i];
inFile = mStreamPath + inFile;
String outFile=inFile +".yuv";
DoDecoderTest(inFile, outFile);
}
Log.i(TAG,"decoder performance test finish");
finish();
}
};
thread.start();
}
@Override
@ -89,6 +125,16 @@ public class WelsDecTest extends Activity {
Log.i("WSE_DEC","welsdecdemo onStart");
super.onStart();
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.i(TAG,"OnDestroy");
Process.killProcess(Process.myPid());
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

View File

@ -8,6 +8,25 @@
extern "C" int EncMain (int argc, char* argv[]);
extern "C"
JNIEXPORT void JNICALL Java_com_wels_enc_WelsEncTest_DoEncoderAutoTest
(JNIEnv* env, jobject thiz, jstring jsIncfgName, jstring jsInlayerName, jstring jsInyuvName, jstring jsOutbitName) {
/**************** Add the native codes/API *****************/
const char* argv[]={
(char*)("encConsole.exe"),
(char*) ((*env).GetStringUTFChars (jsIncfgName, NULL)),
(char*)("-org"),
(char*) ((*env).GetStringUTFChars (jsInyuvName, NULL)),
(char*)("-bf"),
(char*) ((*env).GetStringUTFChars (jsOutbitName, NULL)),
(char*)("-numl"),
(char*)("1"),
(char*) ((*env).GetStringUTFChars (jsInlayerName, NULL))
};
LOGI ("Start to run JNI module!+++");
EncMain(sizeof(argv)/sizeof(argv[0]),(char**)&argv[0]);
LOGI ("End to run JNI module!+++");
}
JNIEXPORT void JNICALL Java_com_wels_enc_WelsEncTest_DoEncoderTest
(JNIEnv* env, jobject thiz, jstring jsFileNameIn) {
/**************** Add the native codes/API *****************/

View File

@ -3,6 +3,7 @@ package com.wels.enc;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Process;
import android.util.Log;
import android.view.KeyEvent;
@ -19,7 +20,7 @@ public class WelsEncTest extends Activity {
private OnClickListener OnClickEvent;
private Button mBtnLoad, mBtnStartSW;
final String mStreamPath = "/sdcard/wels-seq/";
final String mStreamPath = "/sdcard/welsenc/";
Vector<String> mCfgFiles = new Vector<String>();
@Override
@ -58,7 +59,7 @@ public class WelsEncTest extends Activity {
break;
case R.id.buttonSW:
{
System.out.println("decode sequence number = " + mCfgFiles.size());
System.out.println("encode sequence number = " + mCfgFiles.size());
Log.i(TAG,"after click");
try {
for (int k=0; k < mCfgFiles.size(); k++) {
@ -69,7 +70,7 @@ public class WelsEncTest extends Activity {
Log.e(TAG, e.getMessage());
}
mCfgFiles.clear();
tv.setText( "Decoder is completed!" );
tv.setText( "Encoder is completed!" );
}
break;
}
@ -80,15 +81,82 @@ public class WelsEncTest extends Activity {
mBtnStartSW.setOnClickListener(OnClickEvent);
System.out.println("Done!");
//run the test automatically,if you not want to autotest, just comment this line
runAutoEnc();
}
public void runAutoEnc()
{
Thread thread = new Thread() {
public void run()
{
Log.i(TAG,"encoder performance test begin");
String inYuvfile=null,outBitfile=null,inOrgfile=null,inLayerfile = null;
File encCase = new File(mStreamPath);
String[] caseNum = encCase.list();
if(caseNum==null || caseNum.length==0)
{
Log.i(TAG,"have not find any encoder resourse");
finish();
}
for(int i=0;i<caseNum.length;i++)
{
String[] yuvName = null;
File yuvPath = null;
File encCaseNo = new File(mStreamPath + caseNum[i]);
String[] encFile = encCaseNo.list();
for(int k=0;k<encFile.length;k++)
{
if(encFile[k].compareToIgnoreCase("welsenc.cfg") == 0)
inOrgfile = encCaseNo + File.separator+encFile[k];
else if(encFile[k].compareToIgnoreCase("layer2.cfg") == 0)
inLayerfile = encCaseNo + File.separator+encFile[k];
else if(encFile[k].compareToIgnoreCase("yuv") == 0)
{
yuvPath = new File(encCaseNo + File.separator+encFile[k]);
yuvName = yuvPath.list();
}
}
for(int m=0; m<yuvName.length;m++)
{
inYuvfile = yuvPath +File.separator+yuvName[m];
outBitfile = inYuvfile +".264";
Log.i(TAG,"enc yuv file:" + yuvName[m]);
DoEncoderAutoTest(inOrgfile,inLayerfile,inYuvfile,outBitfile);
}
}
Log.i(TAG,"encoder performance test finish");
finish();
}
};
thread.start();
}
@Override
public void onStart()
{
Log.i(TAG,"welsdecdemo onStart");
Log.i(TAG,"welsencdemo onStart");
super.onStart();
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.i(TAG,"OnDestroy");
Process.killProcess(Process.myPid());
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
@ -101,6 +169,7 @@ public class WelsEncTest extends Activity {
}
public native void DoEncoderTest(String cfgFileName);
public native void DoEncoderAutoTest(String cfgFileName,String layerFileName,String yuvFileName,String outBitsName);
private static final String TAG = "welsenc";
static {
try {
@ -110,7 +179,7 @@ public class WelsEncTest extends Activity {
Log.v(TAG, "Load libwelsencdemo.so successful");
}
catch(Exception e) {
Log.e(TAG, "Failed to load welsdec"+e.getMessage());
Log.e(TAG, "Failed to load welsenc"+e.getMessage());
}
}

View File

@ -53,7 +53,7 @@
F0E6634D1810EFA5000C888E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
F0E663511810EFA5000C888E /* demo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "demo-Info.plist"; sourceTree = "<group>"; };
F0E663531810EFA5000C888E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
F0E663551810EFA5000C888E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
F0E663551810EFA5000C888E /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = main.m; sourceTree = "<group>"; };
F0E663581810EFA5000C888E /* DEMOAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DEMOAppDelegate.h; sourceTree = "<group>"; };
F0E663591810EFA5000C888E /* DEMOAppDelegate.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp.preprocessed; path = DEMOAppDelegate.m; sourceTree = "<group>"; };
F0E6635B1810EFA5000C888E /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };

View File

@ -34,8 +34,95 @@
#import "DEMOAppDelegate.h"
extern int DecMain(int argc, char * argv[]);
//redirect NSLog and stdout to logfile
void redirectLogToDocumentFile()
{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *document = [path objectAtIndex:0];
NSString *fileName = [NSString stringWithFormat:@"decPerf.log"];
NSString *logPath = [document stringByAppendingPathComponent:fileName];
NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager removeItemAtPath:logPath error:nil];
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
//run auto test to get encoder performance
int AutoTestDec()
{
NSString* document= [[NSString alloc] init];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if([paths count] == 0)
{
NSLog(@"could not find document path");
return 2;
}
document = [paths objectAtIndex:0];
NSString* decFilePath =[document stringByAppendingString:@"/DecoderPerfTestRes"];
NSFileManager* manage=[NSFileManager defaultManager];
NSString* outYuvPath=[decFilePath stringByAppendingString:@"/yuv"];
[manage removeItemAtPath:outYuvPath error:nil];
[manage createDirectoryAtPath:outYuvPath withIntermediateDirectories:YES attributes:nil error: nil];
NSArray* bitstreams=[manage subpathsAtPath:decFilePath];
if(bitstreams == nil)
{
NSLog(@"could not find any bitstream under decoderperfpath");
return 1;
}
redirectLogToDocumentFile(); //output to console, just comment this line
for (int caseNO=0; caseNO<[bitstreams count]; caseNO++)
{
NSString* caseName = [bitstreams objectAtIndex:caseNO];
if ([caseName isEqual: @"yuv"]) {
break;
}
NSString* bitstream = [decFilePath stringByAppendingString:@"/"];
bitstream = [bitstream stringByAppendingString:caseName];
NSString* yuvFileName = [caseName stringByAppendingString:@".yuv"];
NSString* tmpyuvFileName = [outYuvPath stringByAppendingString:@"/"];
yuvFileName = [tmpyuvFileName stringByAppendingString:yuvFileName];
[manage createFileAtPath:yuvFileName contents:nil attributes:nil];
const char* argvv[]={
"decConsole.exe",
[bitstream UTF8String],
[yuvFileName UTF8String]
};
DecMain(sizeof(argvv)/sizeof(argvv[0]), (char**)&argvv[0]);
fflush(stdout);// flush the content of stdout instantly
}
return 0;
}
int main(int argc, char *argv[])
{
//***For auto testing of decoder performance, call auto test here, if you not want to do auto test, you can comment it manualy
if(AutoTestDec() == 0)
NSLog(@"Auto testing running sucessfully");
else
NSLog(@"Auto testing running failed");
abort();
//********
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([DEMOAppDelegate class]));
}

View File

@ -35,8 +35,148 @@
#import "AppDelegate.h"
extern int EncMain(int argc, char **argv);
//redirect NSLog and stdout to logfile
void redirectLogToDocumentFile()
{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *document = [path objectAtIndex:0];
NSString *fileName = [NSString stringWithFormat:@"encPerf.log"];
NSString *logPath = [document stringByAppendingPathComponent:fileName];
NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager removeItemAtPath:logPath error:nil];
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
//to judge whether the path is needed case path
bool IsOneDeptDir(NSString* path)
{
BOOL isDir = NO;
BOOL isOneDeptDir = NO;
NSFileManager* fileManager=[NSFileManager defaultManager];
NSArray* dirPathArray=[fileManager subpathsAtPath:path];
if([dirPathArray count]==0 || dirPathArray == nil)
isOneDeptDir = NO;
else
{
for (NSString* dirPath in dirPathArray){
NSString* tmpPath = [path stringByAppendingString:@"/"];
tmpPath = [tmpPath stringByAppendingString:dirPath];
[fileManager fileExistsAtPath:tmpPath isDirectory:&isDir];
if (isDir) {
isOneDeptDir = YES;
break;
}
}
}
return isOneDeptDir;
}
//run auto test to get encoder performance
int AutoTestEnc()
{
NSString* document= [[NSString alloc] init];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if([paths count] == 0)
{
NSLog(@"could not find document path");
return 2;
}
document = [paths objectAtIndex:0];
NSString* encFilePath =[document stringByAppendingString:@"/EncoderPerfTestRes"];
NSFileManager* manage=[NSFileManager defaultManager];
NSArray* cases=[manage subpathsAtPath:encFilePath];
if(cases == nil)
{
NSLog(@"could not find any test case under encoderperftest");
return 1;
}
redirectLogToDocumentFile();
NSMutableArray *dirArray = [[NSMutableArray alloc] init];
for (NSString *casePath in cases) {
NSString *path = [encFilePath stringByAppendingPathComponent:casePath];
if(IsOneDeptDir(path))
{
[dirArray addObject:casePath];
}
}
for (int caseNO=0; caseNO<[dirArray count]; caseNO++)
{
NSString* caseName = [dirArray objectAtIndex:caseNO];
NSString* caseFilePath = [encFilePath stringByAppendingString:@"/"];
caseFilePath = [caseFilePath stringByAppendingString:caseName];
[manage changeCurrentDirectoryPath:[caseFilePath stringByExpandingTildeInPath]];
NSString* welscfg = [caseFilePath stringByAppendingString:@"/welsenc.cfg"];
NSString* layercfg = [caseFilePath stringByAppendingString:@"/layer2.cfg"];
NSString* yuvFilePath = [caseFilePath stringByAppendingString:@"/yuv"];
NSString* bitFilePath = [caseFilePath stringByAppendingString:@"/bit"];
[manage removeItemAtPath:bitFilePath error:nil];
[manage createDirectoryAtPath:bitFilePath withIntermediateDirectories:YES attributes:nil error:nil];
NSArray* files=[manage subpathsAtPath:yuvFilePath];
[manage changeCurrentDirectoryPath:[bitFilePath stringByExpandingTildeInPath]];
for(int i=0;i<[files count];i++)
{
NSString* yuvFileName = [files objectAtIndex:i];
NSString* bitFileName = [yuvFileName stringByAppendingString:@".264"];
NSString* bitFileNamePath = [bitFilePath stringByAppendingString:@"/"];
bitFileName = [bitFileNamePath stringByAppendingString:bitFileName];
[manage createFileAtPath:bitFileName contents:nil attributes:nil];
[manage changeCurrentDirectoryPath:[yuvFilePath stringByExpandingTildeInPath]];
const char* argvv[]={
"dummy",
[welscfg UTF8String],
"-org",
[yuvFileName UTF8String],
"-bf",
[bitFileName UTF8String],
"-numl",
"1",
[layercfg UTF8String]
};
NSLog(@"WELS_INFO: enc config file: %@", welscfg);
NSLog(@"WELS_INFO: enc yuv file: %@", yuvFileName);
EncMain(sizeof(argvv)/sizeof(argvv[0]), (char**)&argvv[0]);
fflush(stdout);// flush the content of stdout instantly
}
}
return 0;
}
int main(int argc, char * argv[])
{
//***For auto testing of encoder performance, call auto test here, if you not want to do auto test, you can comment it manualy
if(AutoTestEnc() == 0)
NSLog(@"Auto testing running sucessfully");
else
NSLog(@"Auto testing running failed");
abort();
//************************
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}