一、版本信息

OpenHarmony-4.0-Release(不同版本调试方法可能略有不同)

二、视频硬件编解码架构图

img

三方应用通过调用视频编解码的Native API接口可以实现视频编解码功能,应用开发指导可以参考 视频解码开发指导视频编码开发指导
视频编解码框架层通过IPC调到视频编解码服务层,服务层位于系统进程av_codec_service,服务层视频硬件编解码通过CODEC HDI(HardWare Device Interface)驱动框架调用到OMX视频硬件编解码驱动最终实现视频数据的编解码处理。

三、视频硬件编解码服务层调试方法

1、源码路径

/foundation/multimedia/av_codec/services/engine/codec/video/hcodec/

2、系统属性

param set hcodec.debug true  

控制hcodec视频编解码框架层内部详细信息的日志打印,如状态改变、事件上报、统计编解码数据处理耗时等。默认为false。

param set hcodec.dump 0

控制dump输入输出数据。默认为0,不dump数据;属性值为1 (只dump视频编解码输入数据);属性值为2(只dump视频编解码输出数据) ;属性值为3(dump输入和输出数据)
dump数据的文件保存在 /data/misc/hcodecdump/ 目录下,首先需要手动创建该目录并设置权限。解码输入数据dump文件格式:组件创建系统时间_组件名称_Input.bin,所有的es数据保存在同一个文件中。解码输出文件格式:组件创建系统时间_组件名称_Output_width_height_xxx_fmt_xxx.yuv

hilog -b D;hilog -p off

系统可能默认不打印debug等级日志,部分日志private信息可能不会打印。设置上面命令可以看到更详细的日志信息。

3、判断是否走AVCodec视频编解码通路

1、AVCodec模块日志的domain是C02bac,可在日志中过滤C02bac 判断是否走到AVCodec模块;
2、可以在日志中过滤关键字CreateCodecBy 判断是否创建编解码组件走AVCodec视频编解码通路

hilog | grep CreateCodecBy
I C02bac/CodecFactory: {CreateCodecByName():85} Create Codec OH.Media.Codec.Decoder.Video.AVC successful    // 系统AVC软解组件
I C02bac/CodecFactory: {CreateCodecByName():85} Create Codec 硬件组件名称 successful

如果是视频硬件编解码组件创建成功还会有如下打印

I C02bac/HCODEC: [0][硬件组件名称][Uninitialized][hcodec_state.cpp][]OnAllocateComponent 181] create omx node successful

4、视频硬件解码服务层buffer轮转日志打印

(1)运行前需要设置param set hcodec.debug true 属性
(2)OH_AVCodecOnNeedInputData
解码服务层通知应用有一个可用的输入buffer,inBufId为输入buffer索引号

D C02bac/HCODEC: [0][硬件组件名称][Running][hcodec.cpp][ChangeOwner 506] inBufId = 1, after hold xxx ms, us -> user

(3)OH_VideoDecorder_PushInputData
应用注入一帧es数据
-inBufId:输入buffer索引号,与OH_AVCodecOnNeedInputData回调的参数一致
-pst:该帧es数据对应的pts
-flag:设置1,则说明应用送流结束(EOS)

D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 503] inBufId = 1, after hold xxx ms, us -> omx, len = xxx, flags = 0x0, pts = xxx
D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 503] inBufId = 2, after hold xxx ms, us -> omx, len = xxx, flags = 0x1, pts = xxx //送流EOS标志

(4)OH_AVCodecOnNewOutputData
通知应用有一个已经解码完成的输出buffer,outBufId为输出buffer索引号

D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 506] outBufId = 6, after hold xxx ms, us -> user

(5)OH_VideoDecorder_RenderOutputData/OH_VideoDecorder_FreeOutputData
RenderOutputData:应用将一个输出buffer送显
FreeOutputData:应用将一个输出buffer释放给框架层,不送显

D C02bac/HCODEC: [0][硬解组件名称][Running][hdecoder.cpp][OnRenderOutputBuffer 506] outBufId = 5
D C02bac/HCODEC: [0][硬解组件名称][Running][hdecoder.cpp][OnReleaseOutputBuffer 947] outBufId = 6

5、视频硬件解码通路各环节耗时统计分析

(1) D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 506] inBufId = 1, after hold 4.3 ms, user -> us
(2) D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 503] inBufId = 1, after hold 0.3 ms, us -> omx, len = xxx, flags = 0x20, pts = xxx
(3) D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 503] outBufId = 4, after hold 31.6 ms, omx -> us, len = xxx, flags = 0x10, pts = xxx
(4) D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 506] outBufId = 4, after hold 0.3 ms, us -> user
(5) D C02bac/HCODEC: [0][硬解组件名称][Running][hcodec.cpp][ChangeOwner 506] outBufId = 4, after hold 0.7 ms, user -> us

(1)从应用收到输入buffer1可用的回调到应用送输入buffer耗时4.3ms
(2)从服务层收到输入buffer1到送给OMX解码(EmptyThisBuffer)成功耗时0.3ms
(3)从OMX收到该帧es数据(EmptyThisBuffer)到解码出帧(FillBufferDone)的耗时31.6ms
(4)从OMX解码出帧到应用收到该输出buffer可用的耗时0.3ms
(5)应用同步耗时(应用从收到输出buffer可用的回调到调用RenderOutputData送显)处理0.7ms

四、更新

1、OpenHarmony-v4.1-release

(1)AVCodec硬件编解码模块hilog的domain 修改为C02b32,tag为“HCODEC”
(2)dump 输入输出数据的系统属性值发生变化
dump输入输出数据方法:

mkdir /data/misc/hcodecdump;chmod 777 /data/misc/hcodecdump/
param set hcodec.dump 11      // dump解码输入和输出数据
属性值含义
1只dump解码输出数据
10只dump解码输入数据
100只dump编码输出数据
1000只dump编码输入数据
11dump解码输入和输出数据
1100dump编码输入和输出数据

代码中新的dump mode值定义

enum DumpMode : unsigned long {
    DUMP_NONE = 0,
    DUMP_ENCODER_INPUT = 0b1000,
    DUMP_ENCODER_OUTPUT = 0b0100,
    DUMP_DECODER_INPUT = 0b0010,
    DUMP_DECODER_OUTPUT = 0b0001,
};

根据dump mode值定义属性值(二进制)可任意组合

五、备注

本篇文章的调试方法是根据OpenHarmony-4.0-Release版本整理的,后续4.1和5.0版本的代码架构和日志打印都发生了变化,不再适用于后续版本调试。

上一篇:OpenHarmony AVCodec模块分析(一):模块简述

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐