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

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.mzph.cn/news/209482.shtml

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

相关文章

MongoDB的插入文档、更新文档语句

本文主要介绍MongoDB的插入文档、更新文档语句。 目录 MongoDB插入文档MongoDB更新文档 MongoDB插入文档 在MongoDB中&#xff0c;可以通过使用insertOne或insertMany方法向集合中插入文档。 insertOne方法可以插入一个文档&#xff0c;例如&#xff1a; db.collection.inse…

Android 等待view 加载布局完成 (包括动态生成View)

前言 在实际开发中&#xff0c;有很多组件需要 根据数据&#xff0c;动态生成&#xff0c;或者 追加 / 减少 子view&#xff0c;由于View布局需要时间&#xff0c;此时想要获取父View的最新宽高值&#xff0c;要么手动测量&#xff0c;要么等待布局完成后再获取&#xff1b; …

scikit-learn实现线性回归

要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归&#xff0c;然后再有监督学习中找到线性模型 scikit-learn实现简单的线性回归 公式&#xff1a; L2范数是指向量中每个元素的平…

Java+Swing: 主界面的窗体 整理8

主界面的写法跟之前登录界面的窗体写法大致相同&#xff0c;在主界面中主要是窗体的大小的设置 package com.student_view;import com.utils.DimensionUtil; import sun.applet.Main;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author&#xff1a;xie…

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

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

【人工智能Ⅰ】实验7:K-means聚类实验

实验7 K-means聚类实验 一、实验目的 学习K-means算法基本原理&#xff0c;实现Iris数据聚类。 二、实验内容 应用K-means算法对iris数据集进行聚类。 三、实验结果及分析 0&#xff1a;输出数据集的基本信息 参考代码在main函数中首先打印了数据、特征名字、目标值、目标…

【上海大学数字逻辑实验报告】四、组合电路(三)

一、 实验目的 掌握多路选择器74LS151的原理。掌握译码器74LS138的原理。学会在Quartus II上使用多路选择74LS151设计电路。学会在Quartus II上使用译码器74LS138设计电路。 二、 实验原理 多路选择器又称数据选择器或多路开关&#xff0c;它是一种多路输入单路输出的组合逻…

HHDESK右键管理简介

在HHDESK管理文件&#xff0c;除了基本的打开、删除、复制、粘贴、重命名外&#xff0c;还有多种便捷编辑方式。 可以分别以下列模式打开文档&#xff1a; 文本模式即是以文本编辑器打开文档。 1 二进制模式 可进行二进制编辑。 2 JSON模式 可对JSON文件进行直观的解析…

机器学习中的特征工程

1 特征工程概述 特征工程是机器学习中的一个关键步骤&#xff0c;在机器学习领域中占有非常重要的地位&#xff0c;是机器学习中不可或缺的一部分&#xff0c;下图展示了一个常规的机器学习流程&#xff1a; 特征工程涉及从原始数据中提取、选择和转换特征&#xff0c;以改善模…

“轻松管理文件,一键导出表格,让您的归档工作井井有条“

在忙碌的工作中&#xff0c;我们经常会被大量的文件和数据所困扰。如何有效地管理和整理这些资料&#xff0c;成为了一个让人头疼的问题。今天&#xff0c;我们向您介绍一款强大的文件管理工具——一键导出表格&#xff0c;帮助您轻松解决这个问题。 第一步&#xff0c;首先我们…

区块链实验室(30) - 区块链期刊:Distributed Ledger Technologies: Research and Practice

区块链涉及多学科及技术&#xff0c;众多期刊接收区块链文章。Distributed Ledger Technologies: Research and Practice是ACM出版集团的一本期刊。 Distributed Ledger Technologies: Research and Practice创刊历史很短&#xff0c;始于2022年&#xff0c;出版期数也不多。 载…

Leetcode 剑指 Offer II 056. 两数之和 IV - 输入二叉搜索树

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉…

Java 使用oshi获取当前服务器状态cpu、内存、存储等核心信息

文章目录 简介相关资料maven依赖oshi-官方示例获取CUP信息代码获取内存信息获取磁盘信息 简介 OSHI 是基于 JNA 的&#xff08;本地&#xff09;操作系统和硬件信息库。它不需要安装任何其他额外的本地库&#xff0c;旨在提供一种跨平台的实现来检索系统信息&#xff0c;例如操…

[ROS2] --- action

1 action介绍 ROS通信机制也会被常常用到——那就是动作。从这个名字上就可以很好理解这个概念的含义&#xff0c;这种通信机制的目的就是便于对机器人某一完整行为的流程进行管理。 1.1 客户端/服务器模型 动作和服务类似&#xff0c;使用的也是客户端和服务器模型&#xf…

数据结构中处理散列冲突的四种方法

1 开放定址法 1.1 定义 开放定址法就是一旦发生了冲突&#xff0c;就去寻找下一个空的散列地址 1.2 要求 只要散列表足够大 空的散列地址总能找到&#xff0c;并将记录存入 1.3 线性探测法 使用该公式用于解决冲突的开放定址法称为线性探测法 对于线性探测法&#xff0c…

通过kubeadm方式安装k8s

虚拟机最少是 2 core&#xff0c;master内存最小3G&#xff0c;node内存最小2G. 要求的Docker版本是18.03&#xff0c;如果不是安装的docker ce&#xff0c;版本是过旧的&#xff0c;可以选择删除后重新安装&#xff1b; 也可以重新创建一个虚拟机执行以下命令。 简单方法&am…

线性代数基础【1】行列式

第一节 行列式的基本概念和性质 一、基本概念 ①逆序 1,2和2,1是一对逆序 ②逆序数 1,2,3,5,4的逆序数为1;1,3,2,5,4逆序数为4; ③行列式 ④余子数和代数余子数 行列式挖掉一个数(例如aij),将原行列式去掉i行j列的行列式M,则M为余子数,代数余子数记为Aij,如果(ij)为偶数…

云LIS实验室信息管理系统源码——实验室信息管理解决方案

云LIS&#xff08;Cloud Laboratory Information System&#xff09;是一种为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;其主要功能是协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0c;通过…

高通CRM的v4l2驱动模型

概述下crm中v4l2框架的初始化创建流程&#xff1a; 对于CRM主设备的v4l2框架创建过程&#xff1a; 1、分配和初始化v4l2 device对象 2、分配和初始化media device对象&#xff0c;然后将v4l2 device中mdev绑定到media device上 3、分配和初始化video device对象&#xff0c…

Python:核心知识点整理大全9-笔记

目录 ​编辑 5.2.4 比较数字 5.2.5 检查多个条件 1. 使用and检查多个条件 2. 使用or检查多个条件 5.2.6 检查特定值是否包含在列表中 5.2.7 检查特定值是否不包含在列表中 banned_users.py 5.2.8 布尔表达式 5.3 if 语句 5.3.1 简单的 if 语句 5.3.2 if-else 语句 …