WhyCan Forum(哇酷开发者社区)

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn

您尚未登录。

#1 2020-10-06 22:57:31

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

使用gstreamer的插件openmax调用cedar硬解码

前置要求:
基于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 感谢挖坑网 感谢晕哥

离线

#2 2020-10-06 23:36:52

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

对比一下硬解和软解的命令
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)

离线

#3 2020-10-06 23:46:07

达克罗德
会员
注册时间: 2018-04-10
累计积分: 958

Re: 使用gstreamer的插件openmax调用cedar硬解码

666,太厉害了!
如果要解码后和UI的layer合成叠加思路是怎么样的呢?

离线

#4 2020-10-06 23:56:31

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

硬解码输出帧格式
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认为的帧格式

这两处应该是很大关系的

离线

#5 2020-10-07 00:00:13

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

达克罗德 说:

666,太厉害了!
如果要解码后和UI的layer合成叠加思路是怎么样的呢?

这个之前在荔枝派linux群听人说过 要在坑卓里扒出de 有了de后可以分层输出图像 会出4个fb设备对应不同的层 而且fb设备除了可以显示rgb外 还可以直接显示yuv 还有硬件放缩 透明度 等功能

离线

#6 2020-10-07 01:17:22

aodzip
会员
注册时间: 2019-10-15
累计积分: 124

Re: 使用gstreamer的插件openmax调用cedar硬解码

图层叠加直接用libdrm就可以

离线

#7 2020-10-07 08:07:03

哇酷小二
管理员
注册时间: 2020-04-22
累计积分: 1,820

Re: 使用gstreamer的插件openmax调用cedar硬解码


感谢楼主爆炸性分享,帮楼主补发一个解码播放现场的视频。

离线

#8 2020-10-07 09:35:11

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

aodzip 说:

图层叠加直接用libdrm就可以

f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改

离线

#9 2020-10-07 09:42:58

湘楚浪子
会员
注册时间: 2019-12-22
累计积分: 34

Re: 使用gstreamer的插件openmax调用cedar硬解码

逸俊晨晖 说:
aodzip 说:

图层叠加直接用libdrm就可以

f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改

真是太6了,方便发一个固件吗?刚好有吃灰的荔枝派,我也试一试

离线

#10 2020-10-07 14:11:33

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

镜像和使用方法
gst-omx硬解码镜像.zip

离线

#11 2020-10-07 15:23:22

九重天
会员
注册时间: 2020-10-06
累计积分: 29

Re: 使用gstreamer的插件openmax调用cedar硬解码

逸俊晨晖 说:

镜像和使用方法
gst-omx硬解码镜像.zip

亲测可用,感谢楼主,让我慢慢消化再请教。

离线

#12 2020-10-07 18:56:29

gediz
会员
注册时间: 2019-11-06
累计积分: 1

Re: 使用gstreamer的插件openmax调用cedar硬解码

谢谢楼主.

离线

#13 2020-10-07 21:01:05

wlcccccc
会员
注册时间: 2019-12-06
累计积分: 49

Re: 使用gstreamer的插件openmax调用cedar硬解码

谢谢楼主

离线

#14 2020-10-07 21:35:36

god
会员
注册时间: 2019-10-04
累计积分: 10

Re: 使用gstreamer的插件openmax调用cedar硬解码

超级赞,全志的坑被一群牛人都快填满了!

离线

#15 2020-10-08 17:15:48

netwp
会员
注册时间: 2018-08-19
累计积分: 24

Re: 使用gstreamer的插件openmax调用cedar硬解码

佩服楼主,填了个大坑

离线

#16 2020-10-09 18:00:02

jkl
会员
注册时间: 2019-11-18
累计积分: 135

Re: 使用gstreamer的插件openmax调用cedar硬解码

厉害了,收藏收藏,之后有时间再来弄

离线

#17 2020-10-09 23:08:38

达克罗德
会员
注册时间: 2018-04-10
累计积分: 958

Re: 使用gstreamer的插件openmax调用cedar硬解码

逸俊晨晖 说:
aodzip 说:

图层叠加直接用libdrm就可以

f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改

drm支持硬件叠加?以前玩过简单的drm,还不知道有这个功能

离线

#18 2020-10-09 23:48:12

微凉VeiLiang
会员
注册时间: 2018-10-28
累计积分: 361
个人网站

Re: 使用gstreamer的插件openmax调用cedar硬解码

厉害了,感谢分享。先mark

离线

#19 2020-10-10 09:59:03

tianjjff
会员
注册时间: 2018-12-24
累计积分: 93

Re: 使用gstreamer的插件openmax调用cedar硬解码

太666了,点赞!!!

离线

#20 2020-10-10 10:18:20

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

达克罗德 说:
逸俊晨晖 说:
aodzip 说:

图层叠加直接用libdrm就可以

f1c100s的drm是可以直接用的
v3s的不能 驱动有问题 要去改

drm支持硬件叠加?以前玩过简单的drm,还不知道有这个功能

可以硬件叠加层 还能硬件层混色 直接操作libdrm就行
目前发现f1c100s主线操作libdrm混色时 背景层透明度一定要为满 不然背景层前景层都不显示 也就是说libdrm还是有一定的问题
v3s主线操作libdrm就直接不能显示

离线

#21 2020-10-12 10:00:56

zhuyang220
会员
注册时间: 2020-05-25
累计积分: 1

Re: 使用gstreamer的插件openmax调用cedar硬解码

请教下v3s或者f1c100s上 有没有h264硬件编码的能力?

离线

#22 2020-10-12 22:36:11

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

zhuyang220 说:

请教下v3s或者f1c100s上 有没有h264硬件编码的能力?

有的

离线

#23 2020-10-14 20:08:34

f1c100_
会员
注册时间: 2020-09-22
累计积分: 20

Re: 使用gstreamer的插件openmax调用cedar硬解码

我用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这个选项,跟这个有关系吗

离线

#24 2020-10-15 16:38:29

luoguojian6
会员
注册时间: 2019-12-13
累计积分: 2

Re: 使用gstreamer的插件openmax调用cedar硬解码

好东西,F1C100s看规格书只有JPG编码而已

离线

#25 2020-10-15 23:12:09

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

f1c100_ 说:

我用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注册失败的问题 把我发文件里的那个注册文件替换你原来的文件

离线

#26 2020-10-15 23:14:34

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

luoguojian6 说:

好东西,F1C100s看规格书只有JPG编码而已

你这找资料能力和阅读能力要提升

离线

#27 2020-10-16 02:07:57

f1c100_
会员
注册时间: 2020-09-22
累计积分: 20

Re: 使用gstreamer的插件openmax调用cedar硬解码

能调用了,但是报了一堆貌似内存不足的警告,根据aodzip的教程增加了那两个内存,开启swap分区还是不行,估计f1c100s内存太小了吧

离线

#28 2020-10-16 06:28:12

孤星泪
会员
注册时间: 2020-03-18
累计积分: 144

Re: 使用gstreamer的插件openmax调用cedar硬解码

f1c100_ 说:

能调用了,但是报了一堆貌似内存不足的警告,根据aodzip的教程增加了那两个内存,开启swap分区还是不行,估计f1c100s内存太小了吧

那可以用widora的tiny200开发板,64M ddr

离线

#29 2020-10-16 20:05:47

luoguojian6
会员
注册时间: 2019-12-13
累计积分: 2

Re: 使用gstreamer的插件openmax调用cedar硬解码

逸俊晨晖 说:
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

离线

#30 2020-10-16 21:36:50

whyabc666
会员
注册时间: 2019-12-12
累计积分: 135

Re: 使用gstreamer的插件openmax调用cedar硬解码

arm9搞出视频720p编解码的爆破方案,海思Hi2518,3516的替代品!

离线

#31 昨天 11:50:30

tianjjff
会员
注册时间: 2018-12-24
累计积分: 93

Re: 使用gstreamer的插件openmax调用cedar硬解码

逸俊晨晖 说:

前置要求:
基于aodzip的cedar:
.....

楼主,请问下,添加case OMX_COLOR_FormatYVU420Planar:的时候,重新编译提示OMX_COLOR_FormatYVU420Planar没有定义,要怎么操作?

离线

#32 昨天 17:24:59

tianjjff
会员
注册时间: 2018-12-24
累计积分: 93

Re: 使用gstreamer的插件openmax调用cedar硬解码

我直接在sysroot目录里OMX_IVCommon.h增加了这个OMX_COLOR_FormatYVU420Planar,可以编译通过了,不知道这样行不行

离线

#33 今天 00:30:41

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

tianjjff 说:

我直接在sysroot目录里OMX_IVCommon.h增加了这个OMX_COLOR_FormatYVU420Planar,可以编译通过了,不知道这样行不行

这个东西是定义在全志提供的omx接口里的 你看看你的buildroot是不是没正确添加libcedar

离线

#34 今天 00:36:20

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 105

Re: 使用gstreamer的插件openmax调用cedar硬解码

不要引用整个一楼 帖子拉长了不好阅读

离线

#35 今天 09:57:08

tianjjff
会员
注册时间: 2018-12-24
累计积分: 93

Re: 使用gstreamer的插件openmax调用cedar硬解码

逸俊晨晖 说:

不要引用整个一楼 帖子拉长了不好阅读

好的;
那样搞运行一半就卡住了,估计得make clean重头来

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB