- 内存类型查看
ls /dev/dma_heap/
cma cma-uncached system system-dma32 system-uncached system-uncached-dma32
ls /dev/dri/
card0 card1 renderD128 renderD129
- 内存类型使用优先级
MPP_BUFFER_TYPE_DMA_HEAP > MPP_BUFFER_TYPE_DRM > MPP_BUFFER_TYPE_ION
- 内存类型
| 类型 | 主要用途/场景 | 平台/接口 | 现状/趋势 |
|---------------------------|------------------------------|-------------------|-------------------|
| MPP_BUFFER_TYPE_ION | 跨设备/进程共享内存 | Android/Linux ION | 逐步被淘汰 |
| MPP_BUFFER_TYPE_DRM | 显存/帧缓冲区管理 | Linux DRM | 显示/图形相关 |
| MPP_BUFFER_TYPE_DMA_HEAP| 通用高效 DMA 缓冲区分配 | Linux DMA-HEAP | 新推荐,替代 ION |
DMA-HEAP 是新一代的推荐方式,适合所有需要高效 DMA 访问的场景。
ION 主要用于老的 Android/Linux 平台,逐步被 DMA-HEAP 替代。
DRM 主要用于和显示/图形硬件相关的内存分配。
MPP(Media Process Platform) 框架在实现时,会根据实际平台和内核支持的内存分配机制自动适配。
当你传入 MPP_BUFFER_TYPE_ION,如果系统没有 /dev/ion,MPP 内部会自动 fallback(降级)到 DMA-HEAP 或其他可用的分配方式。
在 osal/mpp_runtime.cpp 的 MppRuntimeService 构造函数中:
allocator_valid[MPP_BUFFER_TYPE_ION] = !access("/dev/ion", F_OK | R_OK | W_OK);
allocator_valid[MPP_BUFFER_TYPE_DRM] = !access("/dev/dri/card0", F_OK | R_OK | W_OK);
allocator_valid[MPP_BUFFER_TYPE_DMA_HEAP] = !access("/dev/dma_heap", F_OK | R_OK | W_OK);
这里会检测 /dev/ion、/dev/dri/card0、/dev/dma_heap 是否存在,并记录每种分配器是否可用。
在 osal/linux/os_allocator.c(Linux 平台):
MPP_RET os_allocator_get(os_allocator *api, MppBufferType type)
{
...
case MPP_BUFFER_TYPE_ION : {
*api = (mpp_rt_allcator_is_valid(MPP_BUFFER_TYPE_ION)) ? allocator_ion :
(mpp_rt_allcator_is_valid(MPP_BUFFER_TYPE_DMA_HEAP)) ? allocator_dma_heap :
#if HAVE_DRM
(mpp_rt_allcator_is_valid(MPP_BUFFER_TYPE_DRM)) ? allocator_drm :
#endif
allocator_std;
} break;
...
}
当你请求 MPP_BUFFER_TYPE_ION 时,优先用 ION,如果不可用(即 /dev/ion 不存在),就自动用 DMA-HEAP,再不行用 DRM,最后才用普通内存。
你传入 MPP_BUFFER_TYPE_ION。
MPP 内部通过 os_allocator_get 判断 ION 是否可用。
如果不可用(如新平台没有 /dev/ion),就自动用 DMA-HEAP。
这一切对上层应用是透明的,保证了兼容性。
- mpp_rt_dbg打印使能
源码读取:mpp_env_get_u32("mpp_rt_debug", &mpp_rt_debug, 0);
mpp_rt_debug=1 ./mpi_dec_test ...
export mpp_rt_debug=1
./mpi_dec_test ...
- mpp_debug打印使能
export mpp_debug=0xffffffff
- mpptask高级接口
task 这个目前只支持 jpeg 这种带 buffer 的 packet 输入
- 手动设置pts/des
# 解码前
mpp_packet_set_pts(packet, 123);
mpp_packet_set_dts(packet, 567);
# 解码后
RK_S64 frame_pts = mpp_frame_get_pts(frame);
RK_S64 frame_dts = mpp_frame_get_dts(frame);
# 如果不生效,在mpp_init后设置使能
RK_U32 sort_pts = 1;
mpi->control(ctx, MPP_DEC_SET_PRESENT_TIME_ORDER, &sort_pts);