
清空记录
历史记录
取消
清空记录
历史记录

硬解/硬编失败:MPP错误码与日志
MPP(external/mpp/)是VPU的用户态库,核心是RK_MPI接口(external/mpp/inc/rk_mpi.h),解码在mpp/codec/dec、编码在mpp/codec/enc。MPP返回的错误码定义在external/mpp/inc/mpp_err.h:
MPP 支持运行时日志/调试开关(mpp_dec_debug.h/mpp_enc_debug.h里定义了可开关的调试位),通过环境变量打开能看编解码内部流程。遇到"硬解失败"先看返回的错误码落在哪类,再回查参数/码流/buffer。
先用MPP官方自带mpi工具跑一遍硬编硬解,确认VPU通路本身通不通(触觉智能RK3576开发板+Debian Bookworm实测:-t 7表示H.264,-n控制帧数,退出码0即成功):
# H.264 硬编:-t 7 表示 H.264,-n 30 编码 30 帧后退出,产物 /tmp/t.h264adb shell mpi_enc_test -w 1280 -h 720 -t 7 -n 30 -o /tmp/t.h264# H.264 硬解:解 200 帧,退出码 0 表示硬解成功adb shell "mpi_dec_test -t 7 -n 200 -i /tmp/t.h264; echo $?"
失败时先看返回码落在哪一类,其中MPP_ERR_TIMEOUT优先查dmesg里VPU是否超时复位——RK3576实测在解码任务异常时内核会自动复位硬件并打日志,这是超时类错误最直接的证据:
adb shell dmesg | grep -iE "mpp_rkvdec|rkvdec|vpu"# RK3576 实测输出(硬解任务超时 → 内核自动复位 VPU):# mpp_rkvdec2 27b00100.rkvdec: session 6 task 8321 irq_status 0xf0000002 timeout 0 abort 0# mpp_rkvdec2 27b00100.rkvdec: resetting...# mpp_rkvdec2 27b00100.rkvdec: reset done
想看编解码内部流程,用环境变量打开MPP调试位(mpp_debug / mpp_dec_debug / mpp_enc_debug,bitmask取值见osal/inc/mpp_debug.h,如0x4=MPP_DBG_INFO、0x400=MPP_DBG_DUMP_OUT)。注意:是否有输出取决于编译时是否开启对应调试宏,release预编译包可能无输出,此时以错误码+dmesg为准:
adb shell "mpp_dec_debug=0x404 mpi_dec_test -t 7 -n 30 -i /tmp/t.h264"adb shell "mpp_enc_debug=0x404 mpi_enc_test -w 1280 -h 720 -t 7 -n 30 -o /tmp/t.h264"
GStreamer管道排障:elements与协商
RK的GStreamer插件在external/gstreamer-rockchip/gst/:gstmppvideodec.c(mppvideodec)、gstmppjpegdec.c、gstmpph264enc.c、gstmpph265enc.c、gstmppvp8enc.c、gstkmssrc.c、ximagesink.c等。
管道调试通用手段:GST_DEBUG分级打开看内部,gst-inspect-1.0 mppvideodec看元素能力,gst-launch-1.0 --gst-debug-level=2定位哪一环协商失败。
板上排查(adb直连):先确认插件有没有注册、元素能力是什么,再跑一条硬解管道看是否真的走mpp——实测日志出现gstmppdec / "RGA enabled即走硬件:
# 1) 插件是否注册 / 元素能力(HEVC、AVC、VP8、VP9 硬解)adb shell gst-inspect-1.0 mppvideodec# 2) 硬解管道验证:fakesink 只解码不渲染adb shell GST_DEBUG=2 gst-launch-1.0 filesrc location=/tmp/t.h264 ! h264parse ! mppvideodec ! fakesink# 实测关键日志(走 mpp 硬解 + RGA 格式转换):# WARN mpp gstmpp.c:121:gst_mpp_use_rga: RGA enabled# WARN mppdec gstmppdec.c:625:gst_mpp_dec_get_frame: MPP is not able to generate pts
协商失败(报not negotiated / can't link)时,把GST_DEBUG开到2并grep关键字,定位是哪一环caps对不上:
adb shell GST_DEBUG=2 gst-launch-1.0 filesrc location=/tmp/t.h264 ! h264parse ! mppvideodec ! fakesink 2>&1 | grep -iE "not negotiated|can.t link|ERROR"
零拷贝/dmabuf:为什么反而卡
零拷贝是指数据在MPP buffer、显示、GPU之间用dmabuf传递,不做CPU拷贝,省内存与带宽(官方见Linux_DMABUF_CN.pdf、MPP的buffer接口 mpp_buffer.h)。
"零拷贝反而卡"通常是这几类情况:
buffer类型没对上
fd生命周期/同步问题
走错路径
排查零拷贝问题先确认"到底走没走零拷贝"(看内存类型、看是否还有memcpy),再看fd/同步。GStreamer侧gstmppallocator.c / gstkmsallocator.c就是RK的dmabuf分配器实现。
板上排查(adb直连):先看元素输出的caps里有没有memory:DMABuf——RK3576实测mppvideodec输出支持video/x-raw(memory:DMABuf)且带arm-afbc: 1(AFBC帧缓冲压缩,进一步省带宽),说明零拷贝路径已具备:
# 确认元素是否支持 dmabuf 输出(RK3576 实测支持)adb shell gst-inspect-1.0 mppvideodec | grep -E "DMABuf|arm-afbc"# 实测输出:# video/x-raw(memory:DMABuf)# arm-afbc: 1 ← AFBC 帧缓冲压缩,进一步省带宽# 管道中强制 dmabuf 输出:下游若只认普通内存,GStreamer 会自动拷贝(性能掉点就在这里)adb shell gst-launch-1.0 filesrc location=/tmp/t.h264 ! h264parse ! mppvideodec ! "video/x-raw(memory:DMABuf)" ! fakesink
多媒体排障按层走:硬解/硬编失败先看MPP错误码(mpp_err.h)再查参数/码流/buffer→GStreamer管道跑不起来用GST_DEBUG定位协商 → 零拷贝异常确认是否真走了 dmabuf。每层都有可查的日志与接口。
RK3576板端实测记录
以下环境触觉智能Purple Pi OH2(RK3576开发板)+Debian Bookworm(内核 6.1.99,arm64)上通过adb直连执行,本文三层结论均得到验证;每一条都可在你的板上直接复制运行:
docs/cn/Common/MPP/Rockchip_Developer_Guide_MPP_CN.pdfdocs/cn/Linux/Multimedia/Rockchip_User_Guide_Linux_Gstreamer_CN.pdfRockchip_User_Guide_Linux_Rockit_CN.pdfdocs/cn/Common/MEMORY/Rockchip_Developer_Guide_Linux_DMABUF_CN.pdf。
external/mpp/(mpi.cpp、mpp/codec/{dec,enc}、inc/{rk_mpi.h, rk_mpi_cmd.h, mpp_buffer.h, mpp_frame.h, mpp_packet.h, mpp_task.h, mpp_err.h, mpp_log.h})external/gstreamer-rockchip/gst/(gstmppvideodec.c、gstmppjpegdec.c、gstmpph264enc.c、gstmpph265enc.c、gstmppvp8enc.c、gstkmssrc.c、gstmppallocator.c、gstkmsallocator.c)Purple Pi OH2开发板,是触觉智能RK3576核心板SOM7609系列配套的评估开发板,搭载4核A72+4核A53+M0多核异构处理器,主频2.2GHz,集成6Tops算力 NPU,轻松应对AI推理、边缘计算与轻量级AI端侧学习。配套完善SDK、丰富资料与Demo,有助于项目前期快速开发验证。
触觉智能SOM7609系列核心板尺寸仅仅40.5×40.5mm,专为空间受限场景打造。基于RK3576/RK3576J SoC,集成高性能GPU与VPU,支持4K视频编解码与多屏异显;提供PCIe、USB3.2、双路千兆以太网、MIPI-DSI/CSI、eDP、CAN、SPI、I2C等丰富接口,灵活扩展。支持Linux、Android、开源鸿蒙OpenHarmony等丰富系统,配套硬件设计指南、源码与技术支持,助力产品快速落地。
