OpenHarmony AVCodec模块分析(二):硬件编解码框架服务层调试方法

一、版本信息

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

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

img

三方应用通过调用视频编解码的Native API接口可以实现视频编解码功能,应用开发指导可以参考 https://gitee.com/openharmony/docs/blob/OpenHarmony-4.1-Release/zh-cn/application-dev/media/avcodec/video-decoding.md 和 https://gitee.com/openharmony/docs/blob/OpenHarmony-4.1-Release/zh-cn/application-dev/media/avcodec/video-encoding.md ;
视频编解码框架层通过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/hcodec/dump/ 目录下,首先需要手动创建该目录并设置权限。解码输入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

四、结尾

上一篇:OpenHarmony AVCodec模块分析(一):模块简述
下一篇:OpenHarmony AVCodec模块分析(三):Codec HDI适配(一)

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值