【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试

news2024/10/6 8:39:15

1. 背景

接下来进行正式的VTS测试。本章节还是以Media模块相关进行介绍。
VTS主要测的是内核和HAL层,media的hal层是以openMax(即将废弃,今日2023.12) 和 Codec2 (后续主流) 接口为主。
这里我们只看Codec2的要求,CDD里也只要求了这个。

2. 参考文档

  • 供应商测试套件 (VTS) 和基础架构 | Android 开源项目 | Android Open Source Project

3. 测试步骤

3.1 VTS测试包获取

3.1.1 自行编译

谷歌官网没有提供测试包,需要自行编译

. build/envsetup.sh
lunch aosp_arm64-userdebug
make vts -j32

生成的文件在: \out\host\linux-x86\vts
在这里插入图片描述
把zip包拷贝到 X86宿主机上,解压即可使用。
(如果是windows主机的话,要改下 vts-tradefed 里的环境识别,具体改法参照第2章节)

3.2 VTS测试包文件结构

  • 初次解压的android-vts.zip包中只有testcases 和 tools 两个文件夹,其他文件夹都是后续运行生成的
  • 解压后的android-vts文件夹名称不能修改,但可以放在别的文件夹路径下运行。
android-vts
	| ---- jdk : 包含一些运行所需要的软件
	| ---- logs :每次测试抓取的日志文件
			| ---- latest : 一个快捷方式,指向最新结果
			| ---- 2023.11.17_22.46.43
			| ---- 2023.11.17_22.10.44
			| ---- ……
	| ---- results : 每次测试生成的结果报告,有时间戳可以分辨
			| ---- latest : 一个快捷方式,指向最新结果
			| ---- 2023.11.17_22.46.43
			| ---- 2023.11.17_22.10.44
			| ---- ……
	| ---- subplans:生成的测试计划
	| ---- testcases:测试用例,每个文件夹对应VTS里的一个module
			| ---- android.hardware.tests.msgq@1.0-service-test
					| ---- arm
					| ---- arm64
			| ---- ApkVerityTest
			| ---- ……
			| ---- VtsHalMediaC2V1_0TargetVideoDecTest
					| ---- VtsHalMediaC2V1_0TargetVideoDecTest.config:功能模块的配置文件
					| ---- arm
					| ---- arm64 : 64位系统的测试进程
			| ---- VtsHalMediaC2V1_0TargetVideoEncTest
	| ---- tools:测试工具,一些jar,以及VTS的测试入口 
			| ---- vts-tradefed : 测试入口
			| ---- ……

3.3 测试命令

优先敲 vts-tradefed 进入concoles之后,再执行命令

cd tools
./vts-tradefed
XXXXX

如果这样运行有异常(windows HOST 有时候运行有问题),也可以直接1条命令运行,

cd tools
./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalMediaC2V1_0TargetVideoDecTest --disable-reboot --skip-device-info --skip-all-system-status-check --skip-preconditions

3.3.1 常见命令

  • 直接运行, 跑 VtsHalMediaC2V1_0TargetVideoDecTest 模块
./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalMediaC2V1_0TargetVideoDecTest --disable-reboot 
  • 建立测试subplan
./vts-tradefed l r    查看刚才测试结果的session号,注意是小写字母L不是数字1, l r 意思是 list results
./vts-tradefed add subplan  --session 158 --name VtsHalMediaC2V1_0TargetVideoDecTest_20230915-10 --result-type  not_executed
./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalMediaC2V1_0TargetVideoDecTest --disable-reboot  -o --subplan VtsHalMediaC2V1_0TargetVideoDecTest_20230915-10

3.3.2 一些常见的option:

  • –abi arm64-v8a :只测试arm64 的case, FPGA android 固件只支持64位。 如果在参考平台(Inception 平板)
  • –disable-reboot:防止Android系统重启.FPGA 版本Android 不支持reboot 功能,需要在运行XTS 测试时
  • –skip-device-info --skip-all-system-status-check --skip-preconditions:跳过检测 ,FPGA 版本Android 系统检测较慢
    如果运行完整的vts测试,需要加上以下参数 跳过fastboot 测试 **–exclude-filter FastbootGetvarUserspaceTest --exclude-filter FastbootVerifyUserspaceTest

4. 测试结果说明

4.1 结果result

测试结果位于\android-vts\results\对应时间戳子文件夹下。
打开 test_result.html 文件。

请添加图片描述
请添加图片描述

整个测试结果显示我分为4个区。
区域1, Summary,整体记录这次测试的一些信息
区域2,测试结果,记录一共跑了哪些模块,通过多少,失败多少,Assumption Failure多少,忽略多少,是否完成了整个测试。
这里介绍下 Assumption Failure, 和 Done。
Assumption Failure 是指这个case,VTS判断就是应该失败的,比如设备不是TV类的,没有TV相关的系统进程,但是VTS跑了TV类的模块测试,这些就都是 Assumption Failure。所以这类case不计入失败率的。
Done 标志 这个模块的测试有没有完成(可能中间检测到一些系统级别的异常,比如设备断开,响应超时等等,导致这个模块里的case没有测试完)。
区域3,失败case,这里会单独把所有的失败用例列出来,并抓取失败时的报错信息进行显示(比区域4的details更详细一点)
区域4,所有case,模块里的所有case测试结果都在这里有显示,包含所有的成功和失败。

4.2 日志log

测试日志位于android-vts\log\对应时间戳子文件夹下。

5. 测试用例说明

5.1 VTS 用例介绍

VTS的case用例类型分为好几种

  • Gtest:绝大多数都是Gtest,C++编写,也是谷歌强烈建议的方式
  • Linux内核测试
  • Junit
  • python3
    具体的区别可以参见谷歌文档:
    请添加图片描述

5.2 VTS media 相关模块

media 中 VTS 相关的模块有
VtsHalMediaC2V1_0TargetComponentTest
VtsHalMediaC2V1_0TargetMasterTest
VtsHalMediaC2V1_0TargetVideoDecTest
VtsHalMediaC2V1_0TargetVideoEncTest
VtsHalMediaOmxV1_0TargetComponentTest
VtsHalMediaOmxV1_0TargetStoreTest
VtsHalMediaOmxV1_0TargetVideoDecTest
VtsHalMediaOmxV1_0TargetVideoEncTest
vts_mediaCodecs_validate_test
vts_mediaProfiles_validate_test

看名字能看出来,前面4个都是codec2接口的测试,后面4个是OpenMax接口的测试。
这里我们主要关注codec2接口相关的验证。

5.3 VTS测试流程

先看一下 tools文件夹下的 vts-tradefed,这是整个测试的入口。
VTS也是基于谷歌的 Trade Federation 测试框架进行的。
vts-tradefed文件比较简单,自己丢到文心一言里按行分析一下,就可以得到具体的结果。
前面就是check一些环境变量和行为之类的,没什么好说的。
重点关注最下面的2句话

VTS_TESTCASES=${VTS_ROOT}/android-vts/testcases/
VTS_TESTCASES=${VTS_TESTCASES} ${JAVA_BINARY} $RDBG_FLAG -Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -cp ${JAR_PATH} -DVTS_ROOT=${VTS_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@"

就是使用java虚拟机启动 com.android.compatibility.common.tradefed.command.CompatibilityConsole, 把所有入参都传过去。($@)

com.android.compatibility.common.tradefed.command.CompatibilityConsole 进程通常在运行 CTS 测试时启动。它提供了一个控制台界面,用于显示测试结果、日志和其他相关信息。开发者可以使用这个界面来监视和调试 CTS 测试的执行过程,以确保他们的应用程序在各种 Android 设备上都能够正常运行。这个进程通常只在运行 CTS 测试时出现,并且只会在特定情况下启动。在常规使用 Android 设备时,这个进程通常不会运行。

以 VtsHalMediaC2V1_0TargetVideoDecTest 测试为例,
使用的测试资源是 \android-vts\testcases\VtsHalMediaC2V1_0TargetVideoDecTest\
请添加图片描述

可以看到有2个文件夹,arm 和 arm64 ,分别针对32位和64位系统。
VtsHalMediaC2V1_0TargetVideoDecTest.config 是测试使用的资源,包括媒体资源(码流文件,视频文件),测试进程 vts_media_c2_v1_0_video_dec_test。

请添加图片描述

可以看出,文件除了 视频文件(.vp9/.vp8/.m2v……)之外,还有 .info 和 .md5 两类。
看了下,info里应该放的是每一帧的时间戳,.md5放的是文件的校验码
去代码看一下。
每个case里依赖的文件对应关系。
请添加图片描述

然后在getFileNames中,根据index可以对应拿到每个case的 inputFile(输入文件),infoFile(时间戳文件),CheckSumFile(校验文件)

请添加图片描述

然后mChksumFile在DecodeTest中会用到。
if (!mChksumFile.compare(sResourceDir)) mMd5Enable = false; 说明这个case在gCompToFiles数组中没有对应的md5文件,因此不进行Md5检测。
请添加图片描述

把md5这个文件按二进制读取到mRefMd5这块内存中
然后在这里
void compareMd5Chksm(std::unique_ptr<C2Work>& work)中,分YUV平面去计算独立的md5,然后进行memcpy
原理是啥??
为什么解码结果可以按bit来compare,不同的解码器,参数会不会不一样?

VtsHalMediaC2V1_0TargetVideoDecTest.config 记录的是 需要push的文件,push的位置,测试的用例option。

在这里插入图片描述

测试进程会解析这个config文件,进行case配置。
基本可以看出流程是:
先cleanup测试环境,
然后adb push 测试用例 vts_media_c2_v1_0_video_dec_test 到 /data/local/tmp/vts_media_c2_v1_0_video_dec_test
在这里插入图片描述

然后把一堆依赖的资源文件 push进去 /data/local/tmp/media/
最后运行
vts_media_c2_v1_0_video_dec_test -P /data/local/tmp/media/
在这里插入图片描述

那究竟 VtsHalMediaC2V1_0TargetVideoDecTest 这个进程做了什么呢,
这就需要去framework代码里看一下了。
VtsHalMediaC2V1_0TargetVideoDecTest 位于 frameworks/av/media/codec2/hal/hidl/1.0/vts/functional/video/
在这里插入图片描述
打开 frameworks/av/media/codec2/hal/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoDecTest.cpp 文件,
在线代码链接
可以发现有很多 TEST_P 开头的函数,这都是GTEST框架,
比如

TEST_P(Codec2VideoDecHidlTest, validateCompName)
TEST_P(Codec2VideoDecHidlTest, configureTunnel)
TEST_P(Codec2VideoDecDecodeTest, DecodeTest)
TEST_P(Codec2VideoDecHidlTest, AdaptiveDecodeTest)
TEST_P(Codec2VideoDecHidlTest, ThumbnailTest)
TEST_P(Codec2VideoDecHidlTest, EOSTest) 
TEST_P(Codec2VideoDecHidlTest, FlushTest)
TEST_P(Codec2VideoDecHidlTest, DecodeTestEmptyBuffersInserted)
TEST_P(Codec2VideoDecCsdInputTests, CSDFlushTest)

这些对应的就是 测试结果中的一个个部分,
截了个图,能看到,
TEST_P(Codec2VideoDecHidlTest, validateCompName) 对应就有很多 PerInstance/Codec2VideoDecHidlTest#validateCompName/software_c2_XXXX 的 测试用例,
整体来说,
每个TEST_P的入口上都有很多测试。
测试会去遍历所有的解码用的C2 component进行测试。

在这里插入图片描述

5.4 VtsHalMediaC2V1_0TargetVideoDecTest

主要模块

Media的codec2在vts这边主要就是Dec和Enc两个模块,其中,
VtsHalMediaC2V1_0TargetVideoDecTest 主要包含了以下几个模块:

  • PerInstance/Codec2VideoDecHidlTest#validateCompName:验证注册的有效解码器名字是否合规(包含软解和硬解)
  • PerInstance/Codec2VideoDecHidlTest#configureTunnel:验证Tunnel配置是否正常,验证bufferQ相关。确保数据能正确传输,对应代码
  • PerInstance/Codec2VideoDecHidlTest.AdaptiveDecodeTest: 自适应测试,不同比特率不同分辨率不同帧率,对应代码
  • PerInstance/Codec2VideoDecHidlTest.ThumbnailTest:多个流发送,对应代码
  • PerInstance/Codec2VideoDecHidlTest.EOSTest:直接发EOS来测试?
  • PerInstance/Codec2VideoDecHidlTest.FlushTest
  • PerInstance/Codec2VideoDecHidlTest.DecodeTestEmptyBuffersInserted: 插入空的一帧,测丢帧等等
  • StreamIndexAndEOS/Codec2VideoDecDecodeTest.DecodeTest:解码测试
  • CsdInputs/Codec2VideoDecCsdInputTests.CSDFlushTest:EOS01,结束符 SPS PPS

我们也可以通过 gtest_list_tests 查支持的测试用例
./vts_media_c2_v1_0_video_dec_test --gtest_list_tests

在这里插入图片描述

依赖的资源

不需要单独提供资源包,VTS这两个模块需要的资源包都在VTS的包里了,会自动push到/data/local/tmp下去运行。

5.5 VtsHalMediaC2V1_0TargetVideoEncTest

主要模块

  • PerInstance/Codec2VideoEncHidlTest/validateCompName
  • PerInstance/Codec2VideoEncHidlTest/EOSTest
  • PerInstance/Codec2VideoEncHidlTest/FlushTest
  • InvalidBufferTest
  • AdaptiveBitrateTest
  • EncodeTestwithEOS/Codec2VideoEncEncodeTest/EncodeTest
  • NonStdSizes/Codec2VideoEncResolutionTest/ResolutionTest

Case命名原则

看result的时候,发现大量的case命名为 XXXXX_数字A_数字B_数字C_数字D 的格式
比如
在这里插入图片描述

那这些数字是代表什么意思的呢?
看VtsHalMediaC2V1_0TargetVideoEncTest.cpp的main。
在这里插入图片描述

从0(000)~7(111)进行循环,生成 000, 001,010,011,100,101,110,111 共8种参数配置,连上原有的参数0和参数1,凑成5个参数进行测试。
后面在resolution测试中插入了一些固定的参数测试,
在这里插入图片描述

对应结果中的这些测试用例
在这里插入图片描述

在模块中每个组件测试中,
会拿到这些参数,进行单独测试使用。
比如EncodeTest,参数2就是代表发不发EOS,参数3代表第一帧是不是空帧,参数4代表有没有B帧等等。
在这里插入图片描述

5.6 单用例调试方法

在vts出问题进行程序调试的时候,我们需要运行指定用例。

  • TF测试套件
    如果使用tf测试套件,

  • 手动执行单个case
    从调试方便的角度,还是直接运行GTEST用例更方便。
    如果使用手动运行Gtest,可以使用GTEST支持的filter来指定,如我想跑:
    可以运行
    ./vts_media_c2_v1_0_video_dec_test --gtest_filter=*.validateCompName/default_c2_mtk_av1_decoder_0
    注意的是,如果缺少一些库,
    需要自己export路径,比如
    export LD_LIBRARY_PATH=/apex/com.android.art/lib64/:/vendor/lib64:/system/lib64;等等

5.7 一些常见报错

环境问题

  • Wrong java version.
    在这里插入图片描述

A:TF框架依赖的安卓版本不对。按照使用的CTS测试包中建议,重新安装对应的JDK模拟器版本即可。我这边,安卓13用的11,安卓14用的17。

  • 外部存储无法mounted
    在这里插入图片描述
    查看/sdcard路径挂载了没有

  • 运行vts-tradefed 无法进入
    在这里插入图片描述

有时候windows上运行有问题,可以直接跑命令

./vts-tradefed run commandAndExit vts --abi arm64-v8a --module VtsHalGraphicsMapperV4_0TargetTest --disable-reboot --skip-device-info --skip-all-system-status-check --skip-preconditions

运行问题

  • vts程序挂死、卡住,无法打印帮助信息等?
    A:基本上都是因为没有启动c2服务器进程,手动启动c2服务进程后,vts进程可以恢复正常;

  • went over its timeout for outputing a response
    在这里插入图片描述

怀疑是这里的超时参数设置的太小,因为FPGA上case运行的非常慢,导致获取结果超时。
在这里插入图片描述

在线代码:NativeDeviceStateMonitor | Android Open Source Project

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《师兄啊师兄》第二季来了!它凭什么成为修仙流里第一档?

沉寂大半年&#xff0c;修仙喜剧动画《师兄啊师兄》第二季终于“千呼万唤始出来”&#xff0c;即将在12月14日上线。作为优酷动漫本年度的当家之作&#xff0c;这部可谓是热度口碑双丰收&#xff0c;截至第一季收官&#xff0c;相关话题在短视频平台的累计播放量更是高达43亿&a…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strcat的模拟实现 &#x1f680;前言 …

OpenCV基础篇

OpenCV基础篇 一、图像、视频读取二、cv::Mat()数据类型三、绘图功能四、鼠标响应事件五、图像像素读写六、图像像素运算七、颜色空间转换八、图像几何变换九、图像滤波十、图像二值化十一、图像梯度十二、Canny边缘检测十三、图像形态学十四、图像直方图十五、霍夫变换十六、分…

jsp使用 分页专用工具

分页器&#xff0c;根据过来的参数计算当着页应当从哪一条记录开始显示&#xff0c;并且显示到哪。 PageUtils [pageSize5, currIndex1, totalCount166, totalPage34, startPosition0] PageUtils [pageSize5, currIndex5, totalCount166, totalPage34, startPosition20] PageUt…

MongoDB的删除文档、查询文档语句

本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库&#xff0c;它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…

vscode创建python虚拟环境

一、创建虚拟环境 python -m venv vsvenv 二、激活虚拟环境 cd .\myvenv\Scripts.\Activate.ps1 如果出现下图所示&#xff1a; 1、使用管理员运行PowerShell 2、输入命令&#xff1a;Get-ExecutionPolicy 3、输入命令&#xff1a;Set-ExecutionPolicy RemoteSigned&…

react-photo-view 的介绍、安装、使用。

目录 基本介绍 安装 使用 基本介绍 react-photo-view 是一个基于 React 的图片查看器组件&#xff0c;用于在网页上展示和浏览图片。该组件提供了用户友好的界面和交互&#xff0c;可以轻松地在应用程序中集成并使用。 支持触摸手势&#xff0c;拖动/平移/物理效果滑动…

【数据结构第 6 章 ① 】- 图的定义和基本术语

目录 一、图的定义 二、图的基本术语 图是一种比线性表和树更为复杂的数据结构。在线性表中&#xff0c;数据元素之间仅有线性关系&#xff0c;每个数据元素只有一个直接前驱和一个直接后继&#xff1b;在树形结构中&#xff0c;数据元素之间有着明显的层次关系&#xff0c;并…

学生备考使用台灯到底好不好?公认好用的护眼台灯推荐

在现代生活中&#xff0c;许多学生的学习压力越来越大&#xff0c;面临的近视几率也越来越大&#xff0c;特别是初中生&#xff0c;眼睛发育还未完全&#xff0c;使用不恰当的灯光也会对眼睛造成损害&#xff0c;特别是护眼台灯。虽然护眼台灯在功能上能够提供充足、柔和的光线…

网络互连与常用设备

网络互连是为了将两个以上具有独立自治能力、同构或异构的计算机网络连接起来&#xff0c;实现数据流通&#xff0c;扩大资源共享的范围&#xff0c;或者容纳更多的用户。网络互连包括局域网与局域网的互连、局域网与广域网的互连、广域网与广域网的互连&#xff0c;这可以扩大…

线性回归算法-实战-房价预测

线性回归算法-实战-房价预测 本次使用线性回归的算法和knn算法进行对比 加载并处理数据对数据进行归一化处理数据拆分knn模型对象创建和训练线性回归建模和训练 加载并且处理数据 import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsRegresso…

kennard-stone算法实现样本集划分(ks算法)

目录 一、 Kennard-Stone算法原理&#xff08;KS算法&#xff09; 二、Kennard-Stone算法作用 三、代码 四、对选出来的train样本使用T-SNE算法进行绘制 五、参考链接 一、 Kennard-Stone算法原理&#xff08;KS算法&#xff09; KS算法原理&#xff1a;把所有的样本都看…

UE4 .ini文件使用

在需要给配置文件的类中加上config标签&#xff0c;当然变量也要加 在项目的Config下&#xff0c;新建一个Default类的UCLASS中config等于的名字&#xff0c;这里结合上面截图就是DefaultTest 在下面写入 [/Script/项目名/类名] 然后写变量以及对应的值即可

机器学习-SVM(支持向量机)

推荐课程&#xff1a;【机器学习实战】第5期 支持向量机 |数据分析|机器学习|算法|菊安酱_哔哩哔哩_bilibili 赞美菊神ヾ ( ゜ⅴ゜)&#xff89; 一、什么是支持向量机&#xff1f; 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一类按监督学习&#xff0…

python学习——对大疆御3E拍摄照片赋予坐标系并旋转

对大疆御3E拍摄照片赋予坐标系并旋转 问题描述 进行植被覆盖度验证时&#xff0c;需采集验证点的植被覆盖情况&#xff0c;但无人机拍摄的照片缺少坐标系&#xff0c;无法进行对比验证。 解决方案 赋予照片坐标系 在gdal中对影像赋予坐标系主要参数为仿射六参数&#xff1…

深度解析TCP协议:特点、应用场景及市面上常见软件案例

目录 引言 TCP的特点 TCP的应用场景 市面上使用TCP的软件案例 引言 TCP&#xff08;Transmission Control Protocol&#xff09;是计算机网络中一种基于连接的、可靠的传输层协议。它具有一系列独特的特点&#xff0c;适用于广泛的应用场景。本文将深入研究TCP的特点、应用…

VSCode SSH登录服务器 提示XHR failed

设置->搜索“代理” 把图中的√去掉 重启 即可

全面覆盖,无所不包:C++ 编程必备指南 | 开源日报 No.99

fffaraz/awesome-cpp Stars: 51.0k License: MIT 这个项目是一个精心策划的 C(或者 C) 框架、库、资源和其他有趣东西的列表。它收集了各种标准库&#xff0c;如 STL 容器和算法&#xff1b;不同领域的框架&#xff0c;比如人工智能、异步事件循环等&#xff1b;以及一系列功…

【Linux】cat 命令使用

cat 命令 cat&#xff08;英文全拼&#xff1a;concatenate&#xff09;命令用于连接文件并打印到标准输出设备上。 可以使用cat连接多个文件、创建新文件、将内容附加到现有文件、查看文件内容以及重定向终端或文件中的输出。 cat可用于在不同选项的帮助下格式化文件的输出…

应用商店ASO优化提升APP排名的6大策略

ASO优化基操你了解多少&#xff1f; ASO优化对于APP推广运营来说是必不可少的一个方法。在当今竞争激烈的应用程序市场中&#xff0c;ASO&#xff08;App Store Optimization&#xff09;优化已成为提升APP排名和曝光度的关键因素。 一、ASO优化的重要性 ASO优化有助于提高AP…