MPP¶
- 内存类型查看
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 ...