前置要求:
基于aodzip的cedar:
https://whycan.com/t_4219.html
完成以上操作后 要保证能在/dev目录下找到cedar_dev和ion
基本思路:
aodzip已经搞出了libcedar和openmax
全志的硬编解码库(即libcedarc\library\arm-linux-gnueabihf里面的库)可以操作设备/dev/cedar_dev
libcedar可以操作全志硬编解码库和设备/dev/ion
openmax是对libcedar的操作封装 用于作为ffmpeg和gstreamer的编解码器插件
全志已经对openmax操作libcedar做好了适配 我们可以用支持openmax插件的音视频编解码器进行硬件编解码
aodzip原贴里有人提到过可以使用gstreamer1.0进行验证 本贴就是通过gstreamer1.0的插件openmax调用cedar进行H264解码
注意:openmax可以作为ffmpeg的编码器插件 不能直接作为ffmpeg的解码器插件 有个例外 树莓派可用使用openmax作为ffmpeg的解码器插件 这个是特殊接口
gstremer适配:
buildroot:
因为全志的硬编解码库默认是用glibc编译的 所以要确定buildroot使用的c库是glibc
打开buildroot菜单
make menuconfig
检查
Toolchain->C library (glibc)
添加openmax组件
Target packages->Audio and video applications->bellagio
添加gstreamer组件
Target packages->Audio and video applications->gstreamer 1.x
同目录下
enable command-line parser
enable tracing subsystem
enable gst-debug trace support
enable plugin registry
install gst-launch & gst-inspect
添加gstreamer插件
同目录下
gst1-plugins-base
videotestsrc
videoconvert
videorate
gst1-plugins-bayer2rgb-neon
gst1-plugins-good
avi (*.avi video)
videofilter
gst1-plugins-bad
autoconvert
videoparsers
videosignal
fbdev 对fb设备操作的支持 选择后才能输出在fb上
fdk-aac
gst1-libav 这个是ffmpeg的解码库 可以做个软解对比
gst-omx 这个是openmax的插件接口
选择好后保存编译
make
openmax接口修改:
此时编译好后gstreamer的openmax插件接口是不可以正常使用的
使用全志的openmax插件解码器进行解码时会出现gstreamer协商错误
这是因为全志在openmax插件上新定义了颜色空间 而gstreamer的openmax接口不知道 所以我们要让gstreamer的openmax接口知道
(在文件libcedarc\openmax\include\OMX_IVCommon.h中的OMX_COLOR_FORMATTYPE枚举型下可以看到全志扩展了两个类型)
(在文件libcedarc\openmax\vdec\inc\omx_vdec_config.h的宏定义#define COLOR_FORMAT_DEFAULT OMX_COLOR_FormatYVU420Planar 可以知道解码默认输出YVU420即YV12)
在gstreamer的openmax接口添加全志的颜色空间定义:
进入目录
cd output/build/gst-omx-1.16.0/
修改文件
vim omx/gstomxvideo.c
在函数gst_omx_video_get_format_from_omx的switch下添加case
case OMX_COLOR_FormatYVU420Planar:
format = GST_VIDEO_FORMAT_YV12;
break;
保存退出
:wq
在当前目录下删掉buildroot对于gst-omx的编译构建标记
rm .stamp_built .stamp_configured .stamp_target_installed .stamp_staging_installed
回到buildroot目录下
cd ../../../
再次编译
make
此时 带gstream和openmax的文件系统构建完成
开机进行硬解码验证
gst-omx注册:
gstreamer使用openmax前要先进行注册
先备份一下注册文件
cp /etc/xdg/gstomx.conf /etc/xdg/gstomx.conf.bck
修改gst-omx插件注册文件
vi /etc/xdg/gstomx.conf
(注意使用vi时不要用方向键 不然可能会乱码 用hjkl键移动光标)
可以发现有两个omxh264dec 对这两个项 添加或者替换以下键值对
core-name=/usr/lib/libOmxCore.so
component-name=OMX.allwinner.video.decoder.avc
hacks=no-component-role;no-disable-outport
(最后这个no-disable-outport一定要加 不然无法解码)
此时注册gst-omx成功
最后一步!!!!!!
以下命令验证
使用gstreamer的插件openmax调用cedar硬解码
gst-launch-1.0 filesrc location=bad_apple.mp4 ! qtdemux ! h264parse ! omxh264dec ! autovideoconvert ! fbdevsink
命令简析
filesrc location= 要解码的文件
qtdemux 解容器 输出视频流
h264parse 流格式转换
omxh264dec 输入视频流 输出帧
autovideoconvert 帧格式转换
fbdevsink 显示在fb
使用ffmpeg的h264解码器进行软解 对比效果
gst-launch-1.0 filesrc location=bad_apple.mp4 ! qtdemux ! avdec_h264 ! autovideoconvert ! fbdevsink
验证平台:
硬件 荔枝派zero
linux 主线内核5.2荔枝派官方的
启动方式 TF卡
h264文件 bad_apple.mp4
其余的硬件编解码器可以用同样的方式使用
f1c100s也可以这样使用
至此 硬解码连接通用音视频解码器的最后一公里已经完成了 主要的多媒体功能已经步入正轨 标志着v3s和f1c100s可以摆脱方案商的奇怪sdk 使用主流的开发框架进行开发
最后感谢前人的努力 感谢aodzip 感谢挖坑网 感谢晕哥
离线
对比一下硬解和软解的命令
gst-launch-1.0 filesrc location=bad_apple.mp4 ! qtdemux ! h264parse ! omxh264dec ! autovideoconvert ! fbdevsink
gst-launch-1.0 filesrc location=bad_apple.mp4 ! qtdemux ! avdec_h264 ! autovideoconvert ! fbdevsink
硬解比软件多用了个gstreamer元件 h264parse
这是因为avdec_h264的sink(输入)视频流格式可以是avc和byte-stream 而omxh264dec的sink只能是byte-stream
而qtdemux的src(输出)的视频流格式是avc 所以 要用元件 h264parse 将avc转化为byte-stream 给omxh264dec 不然是无法解码的
最近编辑记录 逸俊晨晖 (2020-10-06 23:37:08)
离线
硬解码输出帧格式
omxh264dec解出来的帧为yvu420(YV12)然后经过元件 autovideoconvert 转换为BGR格式给fbdev显示
那能不能直接让解码器直接输出BGR格式呢?全志硬解码api上是支持的
但是openmax修改输出格式还没试验成功 目前发现
1.在文件libcedarc\openmax\vdec\src\omx_vdec_aw_decoder_linux.c中
结构体成员eOutputPixelFormat被直接赋值帧格式常量 可能直接修改这个常量就可以输出其他格式
2.然后在文件libcedarc\openmax\vdec\inc\omx_vdec_config.h
的宏定义#define COLOR_FORMAT_DEFAULT OMX_COLOR_FormatYVU420Planar 修改后可以改变默认的omx认为的帧格式
这两处应该是很大关系的
离线
666,太厉害了!
如果要解码后和UI的layer合成叠加思路是怎么样的呢?
这个之前在荔枝派linux群听人说过 要在坑卓里扒出de 有了de后可以分层输出图像 会出4个fb设备对应不同的层 而且fb设备除了可以显示rgb外 还可以直接显示yuv 还有硬件放缩 透明度 等功能
离线
图层叠加直接用libdrm就可以
f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改
离线
镜像和使用方法
gst-omx硬解码镜像.zip
离线
逸俊晨晖 说:aodzip 说:图层叠加直接用libdrm就可以
f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改drm支持硬件叠加?以前玩过简单的drm,还不知道有这个功能
可以硬件叠加层 还能硬件层混色 直接操作libdrm就行
目前发现f1c100s主线操作libdrm混色时 背景层透明度一定要为满 不然背景层前景层都不显示 也就是说libdrm还是有一定的问题
v3s主线操作libdrm就直接不能显示
离线
请教下v3s或者f1c100s上 有没有h264硬件编码的能力?
有的
离线
我用f1c100s试了下出现这个错误:
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0: Could not initialize supporting library.
Additional debug info:
gstvideodecoder.c(2530): gst_video_decoder_change_state (): /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0:
Failed to open decoder
Setting pipeline to NULL ...
Freeing pipeline我在builroot没有看到gst1-plugins-bayer2rgb-neon这个选项,跟这个有关系吗
你这个是gst-omx注册失败的问题 把我发文件里的那个注册文件替换你原来的文件
离线
好东西,F1C100s看规格书只有JPG编码而已
你这找资料能力和阅读能力要提升
离线
我直接在sysroot目录里OMX_IVCommon.h增加了这个OMX_COLOR_FormatYVU420Planar,可以编译通过了,不知道这样行不行
这个东西是定义在全志提供的omx接口里的 你看看你的buildroot是不是没正确添加libcedar
离线
不要引用整个一楼 帖子拉长了不好阅读
离线
# gst-launch-1.0 filesrc location=bad_apple.mp4 ! qtdemux ! h264parse ! omxh264d
ec ! autovideoconvert ! fbdevsink
WARNING: erroneous pipeline: no element "omxh264dec"报错 no element "omxh264dec" 无法播放视频 软解是可以播放的
查看/usr/lib目录并没有/usr/lib/libOmxCore.so这个文件 请问这个文件是如何生成的 是buildroot编译生成的吗
libcedarc\openmax\omxcore\Makefile.am说明此路径产生libOmxCore.so 没有就说明前置贴没配好 就是帖子顶部那个链接
离线
40楼
看gstreamer相关资料
41楼
gst-omx认不出全志在openmax自己定义的颜色空间
看一楼的openmax接口修改部分
一种可能是没按照我说的添加颜色空间 另一种可能是添加了 但是buildroot编译标记没清理好导致改的没编译
42楼
gst对omx注册失败
看一楼的gst-omx注册部分
离线
用歪朵拉的老法师们 看这个帖子
https://whycan.com/t_5824.html
离线
yuanhao0230 说:逸俊晨晖 说:镜像和使用方法
gst-omx硬解码镜像.zip大神,可否帮忙生成一个f1v100s+800*480的镜像,感激不尽啊……
https://whycan.com/files/members/3078/2020-12-19_105626.png
我的荔枝派视频解码时候, cpu占用率100%, 这样正常吗?
硬解出来的YV12要经过软件转换成RGB再显示在屏幕上 估计是这里占了CPU 把DE用起来就会占这么多了
离线
大佬你好,请问你用的buildroot是哪个版本的?2017.08是没有gst1-plugins-bayer2rgb-neon这个选项的。
buildroot-2019.08 没有的话去掉看看行不行
离线