Toybrick

楼主: jefferyzhang

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

 

jefferyzhang

版主

积分
13606
 楼主| 发表于 2019-9-1 00:37:50 | 显示全部楼层
zhouzhouzlove 发表于 2019-8-31 09:57
楼主大神,是的,没错,我又来了。。。。。。。。
是这样的,我运行mpi_dec_test时,运行的时候,cpu占用率 ...

正不正常放到项目里看。
你这里一帧一个print,cpu低于10%都不可能,还不限帧率,你这里应该解码都有好几百fps了,怎么可能cpu在10%以内。
回复

使用道具 举报

15992605143

中级会员

积分
303
发表于 2019-9-3 00:40:24 | 显示全部楼层
兼容MPP的ffmpeg解码出来的帧格式是:AV_PIX_FMT_DRM_PRIME,我尝试使用libswscale库转成RGB24,
结果该库不认识这个格式,报错退出了。请问AV_PIX_FMT_DRM_PRIME这是什么格式,怎样才能转换成RGB24?
回复

使用道具 举报

jefferyzhang

版主

积分
13606
 楼主| 发表于 2019-9-3 08:02:33 | 显示全部楼层
15992605143 发表于 2019-9-3 00:40
兼容MPP的ffmpeg解码出来的帧格式是:AV_PIX_FMT_DRM_PRIME,我尝试使用libswscale库转成RGB24,
结果该库 ...

我不是很懂ffmpeg,我从mpp角度说下。
一般来说H.264压缩的是YUV编码,解压出来的一般来说就是YUV NV12格式的帧。
回复

使用道具 举报

kiwi

中级会员

积分
418
QQ
发表于 2019-9-4 21:03:09 | 显示全部楼层
15992605143 发表于 2019-9-3 00:40
兼容MPP的ffmpeg解码出来的帧格式是:AV_PIX_FMT_DRM_PRIME,我尝试使用libswscale库转成RGB24,
结果该库 ...

没听过FFmpeg有这个色彩空间格式,你应该是搞错了
回复

使用道具 举报

kiwi

中级会员

积分
418
QQ
发表于 2019-9-4 21:06:58 | 显示全部楼层
zhouzhouzlove 发表于 2019-8-29 10:55
大佬好,我看了mpi_dec_test的源码,好像确实是没有解析rtsp协议得到h264裸流数据包的功能。
你看这样想 ...

这样做是可以的,看看MPP文档中的MppPacket的用法,就直接把packet喂进去就行
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
615
发表于 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

高级会员

积分
615
发表于 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()却没有通过引入函数实现来解决,请问可否指导一下?
回复

使用道具 举报

jefferyzhang

版主

积分
13606
 楼主| 发表于 2019-9-5 15:26:48 | 显示全部楼层
zhouzhouzlove 发表于 2019-9-5 14:21
大佬,我现在基本上流程走通了,就只剩下一个问题:
如何使用mpp的动态库和头文件编译程序,之前是直接将 ...

看不懂你在说什么。。。。
回复

使用道具 举报

zhouzhouzlove

高级会员

积分
615
发表于 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
回复

使用道具 举报

jefferyzhang

版主

积分
13606
 楼主| 发表于 2019-9-5 18:06:57 | 显示全部楼层
zhouzhouzlove 发表于 2019-9-5 15:45
抱歉,我的描述有问题:
是这样的,一开始我不太熟悉怎么使用mpp,所以就直接在mpp库自带的mpi_dec_test. ...

我没用过这个接口,为啥会用这个接口分配buffer?
demo里有这么用的么?
回复

使用道具 举报

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

本版积分规则

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


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