项目

一般

简介

MPP

  1. 内存类型查看
    ls /dev/dma_heap/
    cma  cma-uncached  system  system-dma32  system-uncached  system-uncached-dma32
    
    ls /dev/dri/
    card0  card1  renderD128  renderD129
    
  2. 内存类型使用优先级
    MPP_BUFFER_TYPE_DMA_HEAP > MPP_BUFFER_TYPE_DRM > MPP_BUFFER_TYPE_ION
    
  3. 内存类型
    | 类型 | 主要用途/场景 | 平台/接口 | 现状/趋势 |
    |---------------------------|------------------------------|-------------------|-------------------|
    | 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。
    这一切对上层应用是透明的,保证了兼容性。
    
    
  4. 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 ...