Android多媒体Debug手册
1. 目的¶
本文主要主要介绍codec2模块相关的debug命令和方法,便于开发人员和测试人员能够更清晰便捷的调试codec2相关功能,以及快速定位问题原因。
2. 多媒体相关文件替换方法¶
-
挂载分区为可读写:adb root && adb remount && adb shell
-
Sstar extractor路径:/system_ext/lib(64)/extractors/libffmpegextractor.so,如果替换extractor,需要重起media.extractor,如下:
-
Sstar codec2相关文件路径:
/vendor/lib(64)/libcodec2_sstar_*.so
,/vendor/bin/hw/android.hardware.media.c2@1.2-service
,/vendor/bin/hw/vendor.sstar.hardware.media.softplayer-service
,如果替换codec2相关文件,需要重起media.c2相关进程,如下:
3. Dump数据前准备¶
为确保codec2 在dump目录有读写权限,以及确保当前dump的数据不和以前残留的dump数据混淆,所有dump命令执行前需做如下操作:
-
清空dump目录残留数据;
-
修改dump目录为可读可写权限。
4. 容器解封装Extractor¶
解封装是将app传入的片源数据进行解析得到码流(音频/视频流)数据,提供给codec2做解码处理。
4.1. 日志等级¶
功能 | 修改ffmpegextractor中ffmpeg lib的打印等级 |
---|---|
命令 | setprop debug.vendor.ffmpegextractor.ffmpeg.loglevel [value] |
参数说明 | 0: PANIC,8: FATAL,16: ERROR,24: WARNING, 32: INFO,40: VERBOSE,48: DEBUG,56: TRACE |
举例 | setprop debug.vendor.ffmpegextractor.ffmpeg.loglevel 24 //只打印WARNING及小于WARNING的Log |
应用场景 | 当ffmpeg lib解封装时出错,可修改loglevel,使其打印更详细的debug log |
4.2. dump解封装输出数据¶
如果碰到解码显示花屏,首先要判断在extractor解封装后的码流数据是否正确,使用如下方法dump输入的数据,然后使用电脑播放软件,如“PotPlayer”插入dump的码流,查看是否正常。如果不正常,说明在解封装时出现问题。
功能 | 打开/关闭 dump每个Track码流数据到 /storage(根据track index每个track后会生成一个es文件) |
---|---|
命令 | setprop debug.vendor.ffmpegextractor.es [0/1] |
参数说明 | 0:关闭(默认值), 1:打开 |
举例 | chmod -R 777 /storage rm /storage/ vendor.ffmpegextractor.dump.* setprop debug.vendor.ffmpegextractor.es 1 输出文件(目录:/ storage): vendor.ffmpegextractor.dump.track0.timexxx.es vendor.ffmpegextractor.dump.track1.timexxx.es |
应用场景 | 用于分析解封装完成后抛给上层的ES数据时 |
5. 软解Softplayer¶
该模块封装的是软件解码器,负责接收codec2送来的各类视频格式和音频格式码流,并做软解,再将软解后的帧数据返回给codec2。
5.1. 日志等级¶
功能 | 打开/关闭 ffmpeg相关debug log(level=TRACE)到logcat |
---|---|
命令 | setprop debug.vendor.softplayer.log [0/1] |
参数说明 | 0:关闭(默认值), 1:打开 |
举例 | setprop debug.vendor.softplayer.log 1 |
应用场景 | ffmpeg lib解码报错时需要查看更详细的log时 |
5.2. Dump解码输入数据¶
如果碰到解码显示花屏,也可先判断送入codec2 hal层解码的码流数据是否正确,使用如下方法dump输入的数据,然后使用电脑播放软件,如“PotPlayer”插入dump的码流,查看是否正常。如果不正常,说明在codec2层送入解码前的出现问题。需要确认码流是否正常。
视频:
功能 | 打开/关闭 dump从codec2收到的video es码流数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.softplayer.video.es [0/1] |
参数说明 | 0:关闭(默认值), 1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.softplayer.video.es 1 输出文件(目录:/data/vendor/codec): vendor.softplayer.dump.video.es |
应用场景 | 如解码失败,需分析ffmpeg软解输入的es数据时 |
音频:
功能 | 打开/关闭 dump从codec2收到的audio es码流数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.softplayer.audio.es [0/1] |
参数说明 | 0:关闭(默认值), 1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.softplayer.audio.es 1 输出文件(目录:/data/vendor/codec): vendor.softplayer.dump.audio.es |
应用场景 | 如解码失败,需分析ffmpeg软解输入的es数据时 |
5.3. dump解码输出数据¶
如果输入的码流正常,显示花屏,那么需要dump解码后的yuv或者pcm数据,在电脑上YUV查看工具与PCM播放工具进行确认是否异常。
视频:
功能 | 打开/关闭 dump ffmpeg解码输出video yuv数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.softplayer.image [0/½] |
参数说明 | 0:关闭(默认值) 1:dump 解码输出的yuv数据 2:dump解码输出数据yuv(不带stride) 3:dump 以上两种 |
举例 | 全部dump: rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.softplayer.image 3 分别输出文件(目录:/data/vendor/codec): dump_softplayer_output_1024_572_1024_i420.yuv dump_softplayer_output_no_stride_1024_572_1024_i420.yuv |
应用场景 | 如codec2拿到yuv数据有问题,需分析video软解输出的yuv数据时 |
音频:
功能 | 打开/关闭 dump ffmpeg解码输出audio数据(重采样前后两个文件)到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.softplayer.audio [0/1] |
参数说明 | 0:关闭(默认值),1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.softplayer.audio 1 分别输出文件(目录:/data/vendor/codec): 原始输出:dump_softplay_output_origin_channels[2]_samplerate[44100]_samples[20480].fltp S16重采样:dump_softplay_output_convert_channels[2]_samplerate[44100]_samples[20480].s16 |
应用场景 | Audio track播放声音异常,需分析audio软解输出的数据时 |
只需要将 dump_softplay_output_convert_channels[2]_samplerate[44100]_samples[20480].s16 数据放到电脑上音频分析工具,如:Audacity,播放分析各音频通道是否正常。文件命名意为:
channels[2]:当前音频为2通道。
samplerate[44100]:44100 采样率。
s16:16位小端数据。
6. CODEC2 HAL¶
该模块封装各类格式解码器,负责从MediaFramework接收数据送给software player或mi_vdec做解码。
6.1. 日志等级¶
功能 | 打开/关闭 C2Work queue和 workdone的相关信息debug log到logcat |
---|---|
命令 | setprop debug.vendor.codec2.log.workdone [0/1] |
参数说明 | 0:关闭(默认值),1:打开 |
举例 | setprop debug.vendor.codec2.log.workdone 1 |
应用场景 | 需查看一个C2Work在code2开始和结束信息是否对应,分析某一帧解码超时一直pending等问题 |
6.2. dump解码输入码流数据¶
功能 | 打开/关闭 dump codec2送给softplayer或者MI的es数据到 /data/vendor/codec(每个component只生成一个es文件) |
---|---|
命令 | setprop debug.vendor.codec2.es [0/1] |
参数说明 | 0:关闭(默认值),1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.codec2.es 1 输出文件(目录:/data/vendor/codec): dump.dev0.chn0.codec2.dec.video.component.es |
应用场景 | 软解或硬解失败,需分析 codec2 hal层的es数据时 |
6.3. dump解码后输出图像或PCM数据¶
视频:
功能 | 打开/关闭 dump Video解码后的yuv数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.codec2.image [0/½/4] |
参数说明 | 0:关闭(默认值) 1:dump带stride的yuv数据(queue mi_scl input prot前的yuv数据) 2:dump不带stride的yuv数据(queue mi_scl input prot前的yuv数据) 4:dump送显前的yuv数据(即回workDone前) 7:dump 以上三种 |
举例 | 全部dump: rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.codec2.image 7 分别输出文件(目录:/data/vendor/codec): dump_swcodec_input _1024_572_1024_nv12.yuv dump_swcodec_input_no_stride_1024_572_1024_nv12.yuv dump_output_before_workdone_1024_572_1024_nv12.yuv |
应用场景 | 1. 需分析mi scl输入数据 2. 需分析送显前codec2最终的yuv数据 3. 显示花屏时,定位是前端解码还是后端显示问题 |
音频:
功能 | 打开/关闭 dump audio解码后送AudioTrack前数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.codec2.audio.pcm [0/1] |
参数说明 | 0:关闭(默认值), 1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.codec2. audio.pcm 1 输出文件(目录:/data/vendor/codec): dump_output_before_workdone_pcm.s16 |
应用场景 | Audio track音频播放异常的时候定位是解码问题还是播放问题 |
6.4. dump编码输入数据¶
功能 | 打开/关闭 dump codec2送给mi venc编码的yuv数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.codec2.dump.yuv [0/1] |
参数说明 | 0:关闭(默认值),1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.codec2.dump.yuv 1 输出文件(目录:/data/vendor/codec): dump.dev0.chn0.index0.pts0.codec2.enc.1024x572x1024.yuv dump.dev0.chn0.index1.pts1.codec2.enc.1024x572x1024.yuv |
应用场景 | venc编码出错,需分析venc输入的yuv数据时 |
6.5. dump编码输出数据¶
功能 | 打开/关闭 dump mi venc编码输出的es数据到 /data/vendor/codec |
---|---|
命令 | setprop debug.vendor.codec2.dump.es [0/1] |
参数说明 | 0:关闭,1:打开 |
举例 | rm /data/vendor/codec -rf mkdir -p /data/vendor/codec chmod -R 777 /data/vendor/codec setprop debug.vendor.codec2.dump.es 1 输出文件(目录:/data/vendor/codec): dump.dev0.chn0.index0.pts0.codec2.enc.component.es dump.dev0.chn0.index1.pts2.codec2.enc.component.es |
应用场景 | 编码输出的es码流有问题,需分析编码输出的数据时 |
7. MI¶
MI处于kernel space, 对于codec2主要对接了mi_vdec、mi_jpd、mi_venc、mi_scl、mi_sys等。以下主要介绍相关模块的常用debug命令和方法。
备注:本章主要介绍MI几个常用的命令,MI其余的debug方法请参考:SDK模块API文档中PROCFS介绍。
7.1. MI_VDEC¶
码流编码格式为H264和H265时,codec2选择mi vdec做硬件解码器解码。
-
查看vdec dev0 proc信息:
cat /proc/mi_modules/mi_vdec/mi_vdec0
-
修改debug level
功能 修改mi vdec打印等级 命令 echo level > /proc/mi_modules/mi_vdec/debug_level 参数说明 Level:
0:MI_DBG_NONE
1:MI_DBG_ERR
2:MI_DBG_WRN
3:MI_DBG_API
4:MI_DBG_KMSG
5:MI_DBG_INFO
6:MI_DBG_DEBUG
7:MI_DBG_TRACE举例 echo 4 > /proc/mi_modules/mi_vdec/debug_level 应用场景 需要查看更详细的debug log时 -
dump输入数据
功能 将指定通道输入的bitstream数据存储到指定路径 命令 echo dumpbs [chn] [path] > /proc/mi_modules/mi_vdec/mi_vdec0 参数说明 chn:通道号 [0~63]
path:dump文件输出路径,输入off代表停止存储码流。举例 dump通道3的应用推送到bitstream buffer的码流数据到/data/vendor/codec目录下
rm /data/vendor/codec -rf
mkdir -p /data/vendor/codec
chmod -R 777 /data/vendor/codec
echo dumpbs 3 /data/vendor/codec > /proc/mi_modules/mi_vdec/mi_vdec0
输出文件(目录:/data/vendor/codec):
dev_0_chn_0_h265_dump_vdec.es应用场景 如解码失败,需分析应用下发的es数据时 功能 将指定通道的当前码流buffer的所有数据存储到指定路径。(整个码流buffer包含有效数据和无效数据,注意与前面dumpbs的区别) 命令 echo dumpbsb [chn] [path] > /proc/mi_modules/mi_vdec/mi_vdec0 参数说明 chn:通道号 [0~63]
path:dump文件输出路径。举例 dump通道3的整个码流buffer的数据到/data/vendor/codec目录下
rm /data/vendor/codec -rf
mkdir -p /data/vendor/codec
chmod -R 777 /data/vendor/codec
echo dumpbsb 3 /data/vendor/codec > /proc/mi_modules/mi_vdec/mi_vdec0
输出文件(目录:/data/vendor/codec):
dev_0_chn_0_dump_vdec_bitstream_buf.h265应用场景 如解码失败,需分析应用下发的es数据时 -
dump输出数据
功能 将指定通道解码后的输出数据帧存储指定路径 命令 echo dumpfb [chn] [path] [frmcnt] [bDumpAll] [bDetile] > /proc/mi_modules/mi_vdec/mi_vdec0 参数说明 chn:通道号 [0~63]
path:dump文件输出路径
Frmcnt:dump的帧数
bDumpAll: 0:只存储yuv buffer。 1:同时存储Y buffer,UV buffer和YUV buffer。
bDetile: 0:不对将要存储的YUV做detile(tilemode模式下存储tile格式数据)。 1:对将要存储的YUV做detile(tilemode模式下存储YUV格式数据)。举例 通道3,存储路径为/mnt/dump/,存储99帧,不单独保存Y buffer和UV buffer,不对将要存储的YUV做detile:
rm /data/vendor/codec -rf
mkdir -p /data/vendor/codec
chmod -R 777 /data/vendor/codec
echo dumpfb 3 /data/vendor/codec 99 0 0 > /proc/mi_modules/mi_vdec/mi_vdec0
输出文件(目录:/data/vendor/codec):
dump_dev00_chn00_h265_src_1024_576_dst_1024_576_1024_0.yuv
dump_dev00_chn00_h265_src_1024_576_dst_1024_576_1024_1.yuv应用场景 花屏时,定位是否在MI解码出现问题
7.2. MI_SCL¶
Video软解和硬解都会使用到mi scl。
查看scl dev3 proc信息:
cat /proc/mi_modules/mi_scl/mi_scl3
7.3. MI_JPD¶
码流编码格式为mjpeg时,codec2选择mi jpd做硬件解码器解码。
-
查看jpd dev0 proc信息:
cat /proc/mi_modules/mi_jpd/mi_jpd0
-
dump输入数据
功能 将指定通道的bitstream buffer存储到指定路径 命令 echo dumpsb [chn] [bEnable] [path] > /proc/mi_modules/mi_jpd/mi_jpd[dev] 参数说明 [chn]:通道号
[bEnable]:1:开启dump; 0:停止dump
[path]:保存文件的路径
[dev]:设备号举例 dump通道3的bitstream buffer到/data/vendor/codec目录下:
rm /data/vendor/codec -rf
mkdir -p /data/vendor/codec
chmod -R 777 /data/vendor/codec
echo dumpsb 3 1 /data/vendor/codec > /proc/mi_modules/mi_jpd/mi_jpd0
输出文件(目录:/data/vendor/codec):
chn0_bitstream_pts0.jpg chn0_bitstream_pts1.jpg应用场景 如解码失败,需分析应用下发的es数据时 -
dump输出数据
功能 将指定通道解码后的输出数据帧存储到指定路径 命令 echo dumpfb [chn] [bEnable] [path] > /proc/mi_modules/mi_jpd/mi_jpd[dev] 参数说明 [chn]:通道号
[bEnable]:1:开启dump; 0:停止dump
[path]:保存文件的路径
[dev]:设备号,参考表 5 1举例 dump 通道3的输出数据帧到/mnt目录下:
rm /data/vendor/codec -rf
mkdir -p /data/vendor/codec
chmod -R 777 /data/vendor/codec
echo dumpfb 3 1 /data/vendor/codec > /proc/mi_modules/mi_jpd/mi_jpd0
输出文件(目录:/data/vendor/codec):
output_res_1920x1080_format10_chn0_pts0.yuv
output_res_1920x1080_format10_chn0_pts1.yuv应用场景 花屏时,定位是否在MI解码出现问题
8. 其他¶
功能 | 打开/关闭强制HWC使用GPU合成所有图层 |
---|---|
命令 | setprop debug.vendor.hwc.force_gpu_composition [false/true] |
参数说明 | false:关闭,true:打开 |
举例 | setprop debug.vendor.hwc.force_gpu_composition true |
应用场景 | Debug hwc排除MOVP异常时 |