rv1126 mpp部署 + test 执行失败问题

1.1 mpp 环境部署

​ 首先在我们自己的sdk中 ~/rv1126_linux_240110/external/mpp 将改目录拷贝到需要的目录下,下来我们将修改cmake 相关编译脚本

cd mpp/build/linux/arm/ ; vi make-Makefiles.bash

修改交叉编译工具路径 MPP_TOOLCHAIN=

#!/bin/bash
# Run this from within a bash shell set +e MPP_PWD=`pwd`
MPP_TOP=${MPP_PWD}/../../.. # toolchain detection
check_cmd(){
"$@" >> /dev/null 2>&1
}
check_system_arm_linux_gcc(){
check_cmd arm-linux-gcc -v
} check_system_arm_linux_gcc
if [ $? -eq 127 ];then
# MPP_TOOLCHAIN=${MPP_TOP}/../prebuilts/toolschain/usr/bin
MPP_TOOLCHAIN=/home/alientek/work/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
export PATH=$PATH:${MPP_TOOLCHAIN}
fi # generate Makefile
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=./arm.linux.cross.cmake \
-DHAVE_DRM=ON \
-G "Unix Makefiles" \
${MPP_TOP}

在同一个目录下 打开 arm.linux.cross.cmake

  1
2 cmake_minimum_required( VERSION 2.6.3 )
3
4 SET(CMAKE_SYSTEM_NAME Linux)
5 #SET(CMAKE_C_COMPILER "arm-linux-gnueabi-gcc")
6 #SET(CMAKE_CXX_COMPILER "arm-linux-gnueabi-g++")
7 #SET(CMAKE_SYSTEM_PROCESSOR "armv7-a")
8 #SET(CMAKE_SYSTEM_PROCESSOR "armv7-a_hardfp")
9
10 SET(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc")
11 SET(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")
12 SET(CMAKE_SYSTEM_PROCESSOR "armv7-a_hardfp")
13
14 add_definitions(-fPIC)
15 add_definitions(-DARMLINUX)
16 #add_definitions(-Dlinux)
17 add_definitions(-D__gun_linux__)

接下来 操作 make;export DESTDIR=./install;make install;

在这个install 目录下所有生成的库就在这里面。

.

└── usr

└── local

├── bin

│ ├── mpi_dec_mt_test

│ ├── mpi_dec_multi_test

│ ├── mpi_dec_nt_test

│ ├── mpi_dec_test

│ ├── mpi_enc_mt_test

│ ├── mpi_enc_test

│ ├── mpi_rc2_test

│ ├── mpp_info_test

│ └── vpu_api_test

├── include

│ └── rockchip

│ ├── mpp_buffer.h

│ ├── mpp_compat.h

│ ├── mpp_err.h

│ ├── mpp_frame.h

│ ├── mpp_log_def.h

│ ├── mpp_log.h

│ ├── mpp_meta.h

│ ├── mpp_packet.h

│ ├── mpp_rc_api.h

│ ├── mpp_rc_defs.h

│ ├── mpp_task.h

│ ├── rk_hdr_meta_com.h

│ ├── rk_mpi_cmd.h

│ ├── rk_mpi.h

│ ├── rk_type.h

│ ├── rk_vdec_cfg.h

│ ├── rk_vdec_cmd.h

│ ├── rk_venc_cfg.h

│ ├── rk_venc_cmd.h

│ ├── rk_venc_rc.h

│ ├── rk_venc_ref.h

│ ├── vpu_api.h

│ └── vpu.h

└── lib

├── librockchip_mpp.so -> librockchip_mpp.so.1

├── librockchip_mpp.so.0

├── librockchip_mpp.so.1 -> librockchip_mpp.so.0

├── librockchip_vpu.so -> librockchip_vpu.so.1

├── librockchip_mpp.so.0

├── librockchip_vpu.so.1 -> librockchip_vpu.so.0

└── pkgconfig

├── rockchip_mpp.pc

└── rockchip_vpu.pc

1.2 编译demo mpi_enc_test

arm-linux-gnueabihf-gcc mpi_enc_test.c -o mpi_enc_test -I ../inc/ -I ../osal/inc/ -I ../utils/ -L ../build/linux/arm/install/usr/local/lib/ -lrockchip_mpp -lrockchip_vpu -lpthread -L ../build/linux/arm/utils/ -lutils

这里都是相对路径 读者可以直接复制的。

接下来我们将其推入板子里执行一下。

2.2 mpi_enc_test 执行不通过问题

如果在执行的时候出现 undefined symbol._mpp_log_l 错误 直接把 librockchip_mpp.so.0 librockchip_mpp.so.0 放在开发板上的/oem/usr/lib/ 文件里

./mpi_enc_test 加上一些参数 执行起来。

好好好 逗我开心是吧

mpp_rt: NOT FOUND drm allocator
mpp_serivce: mpp_service_cmd_send i octl MPP_IOC_CFG_V1 failed ret -1 errno 112 Cannot allocate memory

这是什么错误 看了一下博客 说是drm 无法申请内存 原因是找不到/dev/dri/card0

看一下系统日志

[    0.000000] OF: fdt: Reserved memory: failed to reserve memory for node 'drm-logo@00000000': base 0x00000000, size 0 MiB
[ 0.199884] rockchip-drm display-subsystem: Linked as a consumer to ffb00000.vop
[ 0.201754] rockchip-drm display-subsystem: devfreq is not set
[ 0.202337] rockchip-drm display-subsystem: bound ffb00000.vop (ops 0xb0940e80)
[ 0.202374] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 0.202395] [drm] No driver support for vblank timestamp query.
[ 0.202537] rockchip-drm display-subsystem: failed to parse loader memory
[ 0.202835] rockchip-drm display-subsystem: master bind failed: -22
[ 0.202913] rockchip-drm: probe of display-subsystem failed with error -22

那就追一下 drm驱动吧。

主要问题就是 倒数第二句 也是drm probe 的时候失败了

static int rockchip_drm_bind(struct device *dev)
追到这个函数
-->rockchip_drm_fbdev_init 死在这里面了
看一下这个函数实现
1 F f rockchip_drm_fbdev_init /home/alientek/work/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
int rockchip_drm_fbdev_init(struct drm_device *dev)
2 F f rockchip_drm_fbdev_init /home/alientek/work/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.h
static inline int rockchip_drm_fbdev_init(struct drm_device *dev) 大概追了一下 实现这个函数有两个地方 一个内敛函数直接就是return 0; 另一个就不一样了, 因为我编译了 rockchip_drm_fbdev.c 导致在设备树中没有匹配上 所以在 fbdev_init 失败了 因为硬件根本没有 所以没有添加相关节点。 下面还有个函数 drm_dev_register 他就是注册 card0设备的 make menuconfig 关掉这个编译符号

来吧 执行

[root@ATK-DLRV1126:/userdata]# mpi_enc_test -i 200frames_count.yuv  -o 1.h264 -w
640 -h 480
mpp[934]: mpi_enc_utils: cmd parse result:
mpp[934]: mpi_enc_utils: input file name: 200frames_count.yuv
mpp[934]: mpi_enc_utils: output file name: 1.h264
mpp[934]: mpi_enc_utils: width : 640
mpp[934]: mpi_enc_utils: height : 480
mpp[934]: mpi_enc_utils: format : 0
mpp[934]: mpi_enc_utils: type : 7
mpp[934]: mpi_enc_test: mpi_enc_test start
mpp[934]: mpp_rt: NOT found ion allocator
mpp[934]: mpp_rt: found drm allocator
mpp[934]: mpp_info: mpp version: unknown mpp version for missing VCS info
mpp[934]: mpi_enc_test: 0x34120 mpi_enc_test encoder test start w 640 h 480 type 7
mpp[934]: mpp_enc: MPP_ENC_SET_RC_CFG bps 1152000 [72000 : 1224000] fps [30:30] gop 60
mpp[934]: h264e_api_v2: MPP_ENC_SET_PREP_CFG w:h [640:480] stride [640:480]
mpp[934]: mpp_enc: send header for set cfg change input/format
mpp[934]: mpp_enc: mode vbr bps [72000:1152000:1224000] fps fix [30/1] -> fix [30/1] gop i [60] v [0]
mpp[934]: mpi_enc_test: 0x34120 encoded frame 0 size 501 qp 22
..............................................................................
mpp[934]: mpi_enc_test: 0x34120 encoded frame 197 size 2077 qp 10
mpp[934]: mpi_enc_test: 0x34120 encoded frame 198 size 1633 qp 10
mpp[934]: mpi_enc_test: 0x34120 encoded frame 199 size 3780 qp 11
mpp[934]: mpi_enc_test: 0x34120 found last frame. feof 1
mpp[934]: mpi_enc_test: 0x34120 encoded frame 200 size 0
mpp[934]: mpi_enc_test: 0x34120 found last packet
mpp[934]: mpi_enc_test: 0x34120 mpi_enc_test success total frame 201 bps 381785

就这么多 希望大家调试不会err fail 只有success 常伴

rv1126 mpp部署加解决问题的更多相关文章

  1. 03.将MPP部署到开发板上

    转载侵删 在一般的嵌入式开发中,只要将uboot,kernel,rootfs下载到开发板上,就可以进行程序开发了.但是海思又进一步的把一些常用视频编解码算法等封装到MPP平台中,进一步简化了工程师的开 ...

  2. arcgis api for javascript本地部署加载地图

    最近开始学习arcgis api for javascript,发现一头雾水,决定记录下自己的学习过程. 一.下载arcgis api for js 4.2的library和jdk,具体安装包可以去官 ...

  3. Intellij Idea自动加载改动文件和自动自动热部署加载

    1:准备原料 我的Intellij Idea的版本是15. 之后tomcat自动加载修,你只需要在浏览器刷新一下页面即可. ************************************** ...

  4. UEditor-JSP版部署说明

    昨天项目中需要在UEditor用到图片上传功能,于是昨天中午便开始做这一块的整合,一不小心就弄到了现在, 坑还挺多的,比如一开始一直报ActionEnter cannot be resolved to ...

  5. 基于Docker一键部署大规模Hadoop集群及设计思路

    一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...

  6. Idea集成SpringBoot实现两种热部署方式(亲测有效)

    即将介绍的两种热部署方式: 1.SpringLoaded 2.DevTools 区别: SpringLoader:SpringLoader 在部署项目时使用的是热部署的方式. DevTools:Dev ...

  7. springboot热部署设置

    springboot提供了热部署,所谓热部署就是当你修改了文件代码,不用重新去启动服务器,而你只要重新build一下当前项目就可以重新编译了.而这就是热部署. 其实springboot热部署就是通过一 ...

  8. Web前端开发推荐阅读书籍

    前言 前端工程师在中国兴起也就5年左右,以前公司里没有专门前端工程师的这个职位,很多前端方面的任务都是由全栈工程师来完成,有的基础一点的后台或者设计的帮助分担一些.但是随着互联网的快速发展,特别是所谓 ...

  9. 【Java】-NO.20.Exam.1.Java.1.001- 【1z0-807】- OCEA

    1.0.0 Summary Tittle:[Java]-NO.20.Exam.1.Java.1.001-[1z0-807] Style:EBook Series:Java Since:2017-10- ...

  10. Java调优

    Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...

随机推荐

  1. 优雅地使用pt-archiver进行数据归档(转)

    一.引言 最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本. 那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现 ...

  2. Java并发编程实例--2.获取和设置线程信息

    常用线程属性 ID: 每个线程的唯一标识: Name: 线程名称: Priority: 线程优先级,从1-10,数字越大优先级越高:不推荐改变线程优先级: Status: 线程状态,包含6种状态:ne ...

  3. mongodb(2022)

    了解 文档数据库MongoDB用于记录文档结构的数据,如JSON.XML结构的数据.一条文档就是一条记录(含数据和数据结构),一条记录里可以包含若干个键值对.键值对由键和值两部分组成,键又叫做字段.键 ...

  4. 迭代器,map,filter,reduce,sorted函数---day12

    1.迭代器 迭代器能被next调用,并不断返回下一个值的对象,叫作迭代器(迭代器是对象) 概念:迭代器指的是迭代取值的工具,迭代是一个重复的过程每次重复都是基于上一次的结果而继续单纯的重复不是迭代. ...

  5. mysql-数据类型,类型约束,联合唯一约束,表与表之间的关系,存储引擎---day36

    # ### char varchar(补充) char 字符长度 255个 varchar 字符长度 21845个 # ### part1 数据类型 -时间 date YYYY-MM-DD 年月日(结 ...

  6. JAVA对象的生命周期(二)-对象的创建

    目录 对象创建的几种方式 类加载检查. 内存分配 初始化零值 设置对象头 执行init方法 对象创建的几种方式 new clone newInstance 反序列化 String s = " ...

  7. 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常

    问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...

  8. 【Azure 云服务】如果云服务证书过期会有什么影响,证书时间应该如何查看

    问题描述 如果云服务证书过期会有什么影响,证书时间应该如何查看 问题答案 在云服务中,有两种证书:服务证书 和 管理证书 什么是服务证书? 通过浏览器访问云服务中的服务(Web Role)时候所使用的 ...

  9. 【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题

    问题描述 参考官方文档,通过CS Code创建JavaScription Function,在本地远行时候出现: Value cannot be null. (Parameter 'provider' ...

  10. C#多线程(7):手动线程通知

    目录 区别与示例 ManualResetEvent 类 ManualResetEventSlim 区别与示例 AutoResetEvent 和 ManualResetEvent 十分相似.两者之间的区 ...