Toybrick

楼主: jefferyzhang

RK3399Pro入门教程(6)硬件编解码器MPP库的使用

 

zhouzhouzlove

高级会员

积分
551
11#
发表于 2019-8-23 17:43:08 | 显示全部楼层
本帖最后由 zhouzhouzlove 于 2019-8-23 19:40 编辑

大神,我安装mpp的步骤是这样的,请看下是是否正确:
1、瑞芯微github下载mpp,
2、修改mpp/build/linux/aarch64/arm.linux.cross.cmake,修改了gcc和g++还有armv8-a这三条。修改完后,执行同目录下的make-Makefiles.bash,然后make ,sudo make install。
        SET(CMAKE_SYSTEM_NAME Linux)
        SET(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc")
        #SET(CMAKE_C_COMPILER "arm-linux-gnueabi-gcc")
        SET(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")
        #SET(CMAKE_CXX_COMPILER "arm-linux-gnueabi-g++")
        SET(CMAKE_SYSTEM_PROCESSOR "armv8-a")
        #SET(CMAKE_SYSTEM_PROCESSOR "armv7-a_hardfp")
配置时有警告:
CMake Warning:
  Manually-specified variables were not used by the project:

    RKPLATFORM
3、默认的安装路径是/usr/local/,修改/etc/profile,添加环境变量,并且执行sudo ldconfig使之生效
        LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
        export LD_LIBRARY_PATH

        export PATH =$PATH:/usr/local/bin

        C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/rockchip
        export C_INCLUDE_PATH

        CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/rockchip
        export CPLUS_INCLUDE_PATH
4、执行mpi_dec_test程序,提示信息正常,当下载了h264文件进行测试时,sudo mpi_dec_test -t 7 -i ~/128x128.264 -n 10
输出如下:
mpi_dec_test: cmd parse result:
mpi_dec_test: input  file name: /home/perfxlab/128x128.264
mpi_dec_test: output file name:
mpi_dec_test: config file name:
mpi_dec_test: width      :    0
mpi_dec_test: height     :    0
mpi_dec_test: type       : 7
mpi_dec_test: debug flag : 0
mpi_dec_test: max frames : 10
mpi_dec_test: mpi_dec_test start
mpi_dec_test: input file size 174416
mpi_dec_test: mpi_dec_test decoder test start w 0 h 0 type 7
mpi: mpp version: Without VCS info
mpp_rt: NOT found ion allocator
mpp_rt: found drm allocator
h264d_dpb: dpb_size error.
mpi_dec_test: decode_get_frame get info changed found
mpi_dec_test: decoder require buffer w:h [128:128] stride [128:128] buf_size 32768
mpi_dec_test: decode_get_frame get frame 1
mpi_dec_test: decode_get_frame get frame 2
mpi_dec_test: decode_get_frame get frame 3
mpi_dec_test: decode_get_frame get frame 4
mpi_dec_test: decode_get_frame get frame 5
mpi_dec_test: decode_get_frame get frame 6
mpi_dec_test: decode_get_frame get frame 7
mpi_dec_test: decode_get_frame get frame 8
mpi_dec_test: decode_get_frame get frame 9
mpi_dec_test: decode_get_frame get frame 10
mpi_dec_test: reach max frame number 10
mpi_dec_test: test success max memory 0.16 MB





请问,这个mpp库的安装有问题吗?rochip-ffmpeg的安装过程有没有详细教程?


回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
12#
发表于 2019-8-26 09:13:42 | 显示全部楼层
jefferyzhang 发表于 2019-8-25 17:37
看过去编译是没问题的,都能正常跑了。
没有要改源码的话可以用我们dnf安装即可。 ...

在上面的解码的时候log里,有一个报错:

h264d_dpb: dpb_size error.


这在mpp开发参考(0.3版).pdf里的截图中是没有的。
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
13#
发表于 2019-8-28 17:59:34 | 显示全部楼层
mpi_dec_test
这个程序如果指定了输出文件,文件的类型是什么?我看好像不能指定输出类型。
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
14#
发表于 2019-8-29 10:51:27 | 显示全部楼层
jefferyzhang 发表于 2019-8-29 08:16
默认是NV12,可以设置输出rgb我记得。具体看下help,我也记不清楚了。

斑竹辛苦了,这个属性,是否就是制定了默认的输出类型?
我看了代码,是输入命令-f后面的参数。但是这个参数非必须,那么默认值就是MPP_FMT_BUTT,但是这个格式没有理解具体含义,不像yuv和rgb那样容易理解。还希望能指导一下。


另外,解码时,分了两种情况,分别使用decode_simple和decode_advanced两种流程,选择依据是 cmd->simple = (cmd->type != MPP_VIDEO_CodingMJPEG) ? (1) : (0);
意为如果输入文件的类型-t 的参数是MPP_VIDEO_CodingMJPEG,编号为4,那么simple=0,调用decode_advanced进行解码;
如果输入文件的类型不是MPP_VIDEO_CodingMJPEG,如h264文件为-t 7,那么simple=1,调用decode_simple进行解码。
我没有理解为什么要分两种情况,是否可以简单指导一下?

貌似这个帖子就我最笨,问的问题也比较low,给斑竹增加了工作量,深感抱歉,但是也是无奈之举。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
15#
发表于 2019-8-29 10:55:46 | 显示全部楼层
kiwi 发表于 2019-8-23 14:10
建议别捣鼓ffmpeg了,他们也只是对接了api,据说是有bug的,也不会提供ffmpeg的支持,用mpp是最好的,官 ...

大佬好,我看了mpi_dec_test的源码,好像确实是没有解析rtsp协议得到h264裸流数据包的功能。
你看这样想行不行,利用ffmpeg的接口进行解协议,从rtsp的网址得到得到avpacket,即从网络流中得到h264的数据包。
然后再把这个avpacket送给mpp。

但是问题就是怎么给,是把这两个库的packet结构体进行比较,然后对应的赋值吗?比如都有pts成员。

可否简单的提点我一下怎么喂数据。。。。。。。。
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
16#
发表于 2019-8-29 13:57:27 | 显示全部楼层
jefferyzhang 发表于 2019-8-29 12:41
mpp_dec_test一直就在讲怎么喂数据,h264数据放package喂进去就可以了,并不复杂。
整个mpp库接口都是仿 ...

我错了,大佬,,,,,,,多谢回复,正在看。
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
17#
发表于 2019-8-31 09:57:27 | 显示全部楼层
本帖最后由 zhouzhouzlove 于 2019-8-31 16:51 编辑

楼主大神,是的,没错,我又来了。。。。。。。。
是这样的,我运行mpi_dec_test时,运行的时候,cpu占用率是处于比较高的水平的,cpu5已经达到了70%。

当运行mpi_dec_multi_test时,程序报错,当然,这可能是维护未更新的问题,但是从cpu占用率来看,三个cpu的占用率加起来也是达到了70%。
mpi: mpp version: 3d35398 author: Johnson Ding [jpege]: Fix jpeg encoder stride problem



得到的文件时yuv420sp格式,用yuv播放器确实可以看到一幅幅的画面。
这是正常的吗?按理说,mpp肯定是调用了硬件解码,应该比较少才对,感觉怎么着也得降到10%吧。。。。。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
18#
发表于 2019-9-5 14:18:12 | 显示全部楼层
本帖最后由 zhouzhouzlove 于 2019-9-5 14:47 编辑
kiwi 发表于 2019-9-4 21:06
这样做是可以的,看看MPP文档中的MppPacket的用法,就直接把packet喂进去就行 ...

我目前这样做了,目前情况如下:

我是在mpi_dec_test的基础上做的修改,增加了ffmpeg的功能,添加了ffmpeg头文件和库后,可以编译并运行,并且将解码后的yuv数据写成了文件,用yuv播放器可以看到一帧帧的图像,正常。

由于我是使用了mpp库的编译流程,所以,在想着把流程简化出来,使用安装好的mpp动态库和头文件来编译程序。
卡在了一个地方,

        buf = mpp_malloc(char, packet_size);                                 //这一步失败,我不知道怎么引用头文件和库,才能调用到这个函数。
        //buf = malloc(packet_size);
        ret = mpp_packet_init(&packet, buf, packet_size);                        //第一步,初始化MPP的packet

在库目录下grep,发现没有这个函数,但是有它调用的mpp_osal_malloc
做了实验,如果直接换成malloc。那么解码的时候会报错——也不是报错,就是会一卡一卡的,导致数据丢失。yuv文件会不连续。

求大佬和楼主给指导一下,我尝试了将 mpp_malloc的函数实现直接写到程序里,但是这样会引入更多的函数和宏,感觉不太现实,我想知道怎么解决这个问题。
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
19#
发表于 2019-9-5 14:21:42 | 显示全部楼层
本帖最后由 zhouzhouzlove 于 2019-9-5 14:31 编辑
jefferyzhang 发表于 2019-9-1 00:37
正不正常放到项目里看。
你这里一帧一个print,cpu低于10%都不可能,还不限帧率,你这里应该解码都有好几 ...

大佬,我现在基本上流程走通了,就只剩下一个问题:
如何使用mpp的动态库和头文件编译程序,之前是直接将程序添加到mpp的编译工程里的。
在直接将ffmpeg的packet中的data和datasize给到mpp时,运行时报错如下:但是经过检查解码的yuv文件,图像并无问题。
mpp_packet: Assertion p->data <= p->pos failed at mpp_packet_set_pos:196
mpp_packet: Assertion p->size >= p->length failed at mpp_packet_set_pos:197


发现mpp_log和mpp_err,msleep(已通过将宏定义直接引入解决)、 mpp_malloc()无法使用。报错未定义的引用。
前面的log可以用其他办法实现,但是最后的一个 mpp_malloc()却没有通过引入函数实现来解决,请问可否指导一下?
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
551
20#
发表于 2019-9-5 15:45:09 | 显示全部楼层
jefferyzhang 发表于 2019-9-5 15:26
看不懂你在说什么。。。。

抱歉,我的描述有问题:
是这样的,一开始我不太熟悉怎么使用mpp,所以就直接在mpp库自带的mpi_dec_test.c上修改,然后直接编译mpp库,那么这个测试程序也会被相应的编译。

我在里面,去掉读h264文件的操作,增加了ffmpeg读取rtsp流的操作,将ffmpeg解出来的h264数据直接喂给了mpp解码器。

然后编译mpp库,得到了这个新的mpi_dec_test程序,经过测试,可以从rtsp流解码到yuv数据。

现在是想着,不套用mpp库的编译流程,而是自己写个单独的程序,来调用安装好的mpp头文件和so库,结果发现有一个函数,在mpp库中没有存在,即mpp_malloc,如果没有这个函数,那么mpp_packet_init也不能正确执行,所以想问下,这个函数我需要怎么调用到,不知道我说明白了没有,。。。。。。


        buf = mpp_malloc(char, packet_size);                                 //这一步失败,我不知道怎么引用头文件和库,才能调用到这个函数。
        //buf = malloc(packet_size);
        ret = mpp_packet_init(&packet, buf, packet_size);                        //第一步,初始化MPP的packet
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表