ref: a555639dd2e252a09a57d64a8e52ec46ed27dfa6
parent: 9ac7cd2816233abcfa49636b2bad7c3e471eef6f
author: syureyi <[email protected]>
date: Mon Jul 21 11:31:43 EDT 2014
check in the code for do codec performance testing on mobile
--- /dev/null
+++ b/autotest/performaceTest/android/run_AutoTest_android.sh
@@ -1,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 files /dev/null b/autotest/performaceTest/ios/fruitstrap differ
binary files /dev/null b/autotest/performaceTest/ios/iFileTransfer differ
--- /dev/null
+++ b/autotest/performaceTest/ios/run_AutoTest_ios.sh
@@ -1,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 {} \;
--- /dev/null
+++ b/autotest/performaceTest/ios/uiascript.js
@@ -1,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);
--- /dev/null
+++ b/autotest/performaceTest/parsePerfData.sh
@@ -1,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
--- /dev/null
+++ b/autotest/performaceTest/run_perfTest.sh
@@ -1,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
+
+
--- a/codec/build/android/dec/src/com/wels/dec/WelsDecTest.java
+++ b/codec/build/android/dec/src/com/wels/dec/WelsDecTest.java
@@ -3,6 +3,7 @@
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 @@
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,8 +82,43 @@
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
public void onStart()
{
@@ -89,6 +125,16 @@
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) {
--- a/codec/build/android/enc/jni/myjni.cpp
+++ b/codec/build/android/enc/jni/myjni.cpp
@@ -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 *****************/
--- a/codec/build/android/enc/src/com/wels/enc/WelsEncTest.java
+++ b/codec/build/android/enc/src/com/wels/enc/WelsEncTest.java
@@ -3,6 +3,7 @@
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 @@
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 @@
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 @@
Log.e(TAG, e.getMessage());
}
mCfgFiles.clear();
- tv.setText( "Decoder is completed!" );
+ tv.setText( "Encoder is completed!" );
}
break;
}
@@ -80,15 +81,82 @@
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 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 @@
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());
}
}
--- a/codec/build/iOS/dec/demo/demo.xcodeproj/project.pbxproj
+++ b/codec/build/iOS/dec/demo/demo.xcodeproj/project.pbxproj
@@ -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>"; };
--- a/codec/build/iOS/dec/demo/demo/main.m
+++ b/codec/build/iOS/dec/demo/demo/main.m
@@ -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]));
}
--- a/codec/build/iOS/enc/encDemo/encDemo/main.m
+++ b/codec/build/iOS/enc/encDemo/encDemo/main.m
@@ -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]));
}