前置要求:
基于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)
离线
666,太厉害了!
如果要解码后和UI的layer合成叠加思路是怎么样的呢?
离线
硬解码输出帧格式
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就可以
离线
感谢楼主爆炸性分享,帮楼主补发一个解码播放现场的视频。
离线
图层叠加直接用libdrm就可以
f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改
离线
aodzip 说:图层叠加直接用libdrm就可以
f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改
真是太6了,方便发一个固件吗?刚好有吃灰的荔枝派,我也试一试
离线
镜像和使用方法
gst-omx硬解码镜像.zip
离线
镜像和使用方法
gst-omx硬解码镜像.zip
亲测可用,感谢楼主,让我慢慢消化再请教。
离线
超级赞,全志的坑被一群牛人都快填满了!
离线
aodzip 说:图层叠加直接用libdrm就可以
f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改
drm支持硬件叠加?以前玩过简单的drm,还不知道有这个功能
离线
逸俊晨晖 说:aodzip 说:图层叠加直接用libdrm就可以
f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改drm支持硬件叠加?以前玩过简单的drm,还不知道有这个功能
可以硬件叠加层 还能硬件层混色 直接操作libdrm就行
目前发现f1c100s主线操作libdrm混色时 背景层透明度一定要为满 不然背景层前景层都不显示 也就是说libdrm还是有一定的问题
v3s主线操作libdrm就直接不能显示
离线
请教下v3s或者f1c100s上 有没有h264硬件编码的能力?
离线
请教下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这个选项,跟这个有关系吗
离线
好东西,F1C100s看规格书只有JPG编码而已
离线
我用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编码而已
你这找资料能力和阅读能力要提升
离线
能调用了,但是报了一堆貌似内存不足的警告,根据aodzip的教程增加了那两个内存,开启swap分区还是不行,估计f1c100s内存太小了吧
离线
能调用了,但是报了一堆貌似内存不足的警告,根据aodzip的教程增加了那两个内存,开启swap分区还是不行,估计f1c100s内存太小了吧
那可以用widora的tiny200开发板,64M ddr
离线
luoguojian6 说:好东西,F1C100s看规格书只有JPG编码而已
你这找资料能力和阅读能力要提升
还能编码其它视频格式吗?不就MJPEG和JPEG而已吗?
•H.264 1280x720@30fps decoding
•MPEG1/2/4 1280x720@30fps decoding
•MJPEG 1280x720@30fps encoding
•JPEG encode size up to 8192x8192
离线
arm9搞出视频720p编解码的爆破方案,海思Hi2518,3516的替代品!
离线
前置要求:
基于aodzip的cedar:
.....
楼主,请问下,添加case OMX_COLOR_FormatYVU420Planar:的时候,重新编译提示OMX_COLOR_FormatYVU420Planar没有定义,要怎么操作?
离线
我直接在sysroot目录里OMX_IVCommon.h增加了这个OMX_COLOR_FormatYVU420Planar,可以编译通过了,不知道这样行不行
离线
我直接在sysroot目录里OMX_IVCommon.h增加了这个OMX_COLOR_FormatYVU420Planar,可以编译通过了,不知道这样行不行
这个东西是定义在全志提供的omx接口里的 你看看你的buildroot是不是没正确添加libcedar
离线
不要引用整个一楼 帖子拉长了不好阅读
离线
不要引用整个一楼 帖子拉长了不好阅读
好的;
那样搞运行一半就卡住了,估计得make clean重头来
离线
逸俊晨晖 说:前置要求:
基于aodzip的cedar:
.....楼主,请问下,添加case OMX_COLOR_FormatYVU420Planar:的时候,重新编译提示OMX_COLOR_FormatYVU420Planar没有定义,要怎么操作?
缺少定义的你解决了吗 怎么解决的 我这也遇到了相同的问题 亲赐教吗 谢谢
离线
tianjjff 说:我直接在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编译生成的吗
离线
# 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 没有就说明前置贴没配好 就是帖子顶部那个链接
离线
对比一下硬解和软解的命令
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 不然是无法解码的
硬解比软件多用了个gstreamer元件 h264parse
root@abc-ThinkPad-X200:/home/abc# gst-launch-1.0 filesrc location=/home/abc/stream_chn0.h264 ! avdec_h264 ! ximagesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Caught SIGSEGV
#0 0xb7748cb0 in ?? ()
Spinning. Please run 'gdb gst-launch-1.0 7599' to continue debugging, Ctrl-C to quit, or Ctrl-\ to dump core.
离线
tried but without success
gst-launch-1.0 filesrc location=/storage/bad_apple.mp4 ! qtdemux ! h264parse !
omxh264dec ! autovideoconvert ! fbdevsink
Setting pipeline to PAUSED ...
debug : cedarc <AwOmxComponentInit:26>:OMXCORE: aw_omx_component_init 133b30
debug : omx_vdec <__AwOmxVdecInit:1059>:++++++++++++++++++++++omx begin++++++++++++++++++
debug : omx_vdec <__AwOmxVdecInit:1060>:name = OMX.allwinner.video.decoder.avc
debug : omx_vdec_aw <OmxDecoderCreate:924>:kay: ** 0.
debug : cedarc <CdcMessageQueueCreate:47>:nMessageSize = 20
debug : cedarc <AwOmxComponentSetCallbacks:309>:OMXCORE: aw_omx_component_set_callbacks 133b30, b66d3500 , f00c0
debug : omx_vdec <__AwOmxVdecSetCallbacks:1812>:===== vdec set callbacks
Pipeline is PREROLLING ...
debug : omx_vdec <AwOmxVdecPortSetDefinitioin:190>:port:<<<<<<<<in,nBufferCountActual = 2, mBufferCntActual = 2
debug : omx_vdec <AwOmxVdecPortSetDefinitioin:190>:port:<<<<<<<<in,nBufferCountActual = 2, mBufferCntActual = 2
error : omx_vdec <AwOmxVdecPortGetFormat:288>:erro: pParamData->nIndex > m_sPortFormatType.nIndex
**
ERROR:gstomxvideodec.c:2120:gst_omx_video_dec_negotiate: assertion failed: (l != NULL)
Bail out! ERROR:gstomxvideodec.c:2120:gst_omx_video_dec_negotiate: assertion failed: (l != NULL)
Aborted
#
linux 5.2.1 (also 5.4.35 mentioned by aodzip)
libcedarc & gst-omx-1.16.2
on v3s
最近编辑记录 avb (2020-11-23 02:47:34)
离线
# gst-launch-1.0 filesrc location=bad_apple.mp4 ! qtdemux ! h264parse ! omxh264d
ec ! autovideoconvert ! fbdevsink
Setting pipeline to PAUSED ...
OMX-Cannot open OpenMAX registry file /root/.omxregister
OMX-A Component loader constructor fails. Exiting
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0: Could not initialize supporting library.
Additional debug info:
../gst-libs/gst/video/gstvideodecoder.c(2517): gst_video_decoder_change_state (): /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0:
Failed to open decoder
Setting pipeline to NULL ...
Freeing pipeline ...
#
linux 5.4.77
libcedarc & gst-omx-1.16.2
on widora-r3
始终都无法走到下一步,按照步骤做不下去了
离线
40楼
看gstreamer相关资料
41楼
gst-omx认不出全志在openmax自己定义的颜色空间
看一楼的openmax接口修改部分
一种可能是没按照我说的添加颜色空间 另一种可能是添加了 但是buildroot编译标记没清理好导致改的没编译
42楼
gst对omx注册失败
看一楼的gst-omx注册部分
离线
40楼
看gstreamer相关资料41楼
gst-omx认不出全志在openmax自己定义的颜色空间
看一楼的openmax接口修改部分
一种可能是没按照我说的添加颜色空间 另一种可能是添加了 但是buildroot编译标记没清理好导致改的没编译42楼
gst对omx注册失败
看一楼的gst-omx注册部分
你在説我踩DE的坑吗?我已经完全填好了,只是还没有共享上来。F1C那个不能半透的BUG,在V3s上也有,我已经填好
离线
对比一下硬解和软解的命令
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 不然是无法解码的
我这里使用软解提示我没有avdec_h264现在没有播放成功是
离线
膜拜大佬,可以愉快地使用编解码库了
离线
# gst-launch-1.0 filesrc location=/testfile/bad_apple.mp4 ! qtdemux ! h264parse
! omxh264dec ! autovideoconvert ! fbdevsink
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:
../gst-libs/gst/video/gstvideodecoder.c(2517): gst_video_decoder_change_state (): /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0:
Failed to open decoder
Setting pipeline to NULL ...
Freeing pipeline ...
在Widora mangopi R3的板子上基于aodzip大佬的buildroot修改,配置文件来自gst-omx.zip无修改依然无法使用
离线
镜像和使用方法
gst-omx硬解码镜像.zip
大神,可否帮忙生成一个f1v100s+800*480的镜像,感激不尽啊……
离线
谢谢大佬分享,在荔枝派zero上移植成功
离线
# gst-launch-1.0 filesrc location=/testfile/bad_apple.mp4 ! qtdemux ! h264parse
! omxh264dec ! autovideoconvert ! fbdevsink
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:
../gst-libs/gst/video/gstvideodecoder.c(2517): gst_video_decoder_change_state (): /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0:
Failed to open decoder
Setting pipeline to NULL ...
Freeing pipeline ...在Widora mangopi R3的板子上基于aodzip大佬的buildroot修改,配置文件来自gst-omx.zip无修改依然无法使用
# gst-launch-1.0 filesrc location=97.mp4 ! qtdemux ! h264parse ! omxh264dec ! au
tovideoconvert ! fbdevsink
Setting pipeline to PAUSED ...
OMX-Cannot open OpenMAX registry file //.omxregister
OMX-A Component loader constructor fails. Exiting
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0: Could not initialize supporting library.
Additional debug info:
../gst-libs/gst/video/gstvideodecoder.c(2517): gst_video_decoder_change_state (): /GstPipeline:pipeline0/GstOMXH264Dec-omxh264dec:omxh264dec-omxh264dec0:
Failed to open decoder
Setting pipeline to NULL ...
Freeing pipeline ...
#
#
我的 widora tiny200 r3 也是一样的问题, 都是64M DRAM, 肯定不是内存不够的原因,这是为什么呢?
软件也是可以跑的, 只是很慢很慢。
离线
逸俊晨晖 说:镜像和使用方法
gst-omx硬解码镜像.zip大神,可否帮忙生成一个f1v100s+800*480的镜像,感激不尽啊……
我的荔枝派视频解码时候, cpu占用率100%, 这样正常吗?
离线
标记
离线
用歪朵拉的老法师们 看这个帖子
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是哪个版本的?2017.08是没有gst1-plugins-bayer2rgb-neon这个选项的。
buildroot-2019.08 没有的话去掉看看行不行
离线