Android多媒体Debug手册


1. 目的

本文主要主要介绍codec2模块相关的debug命令和方法,便于开发人员和测试人员能够更清晰便捷的调试codec2相关功能,以及快速定位问题原因。

2. 多媒体相关文件替换方法

  1. 挂载分区为可读写:adb root && adb remount && adb shell

  2. Sstar extractor路径:/system_ext/lib(64)/extractors/libffmpegextractor.so,如果替换extractor,需要重起media.extractor,如下:

  3. 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命令执行前需做如下操作:

  1. 清空dump目录残留数据;

  2. 修改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做硬件解码器解码。

  1. 查看vdec dev0 proc信息:

    cat /proc/mi_modules/mi_vdec/mi_vdec0
    
  2. 修改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时
  3. 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数据时
  4. 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做硬件解码器解码。

  1. 查看jpd dev0 proc信息:

    cat /proc/mi_modules/mi_jpd/mi_jpd0
    
  2. 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数据时
  3. 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异常时