SDK中内存分配这块比较隐晦,AllocFrames是CreateAllocator后一个很重要的函数。本文就重点介绍该函数中所做的一些操作。先介绍其中比较重要的几个成员结构。
typedef struct {
union {
mfxU32 AllocId; // 分配的ID
mfxU32 reserved[1];
};
mfxU32 reserved3[3];
mfxFrameInfo Info; // 分配帧的属性
mfxU16 Type; // 分配的内存类型,详见ExtMemFrameType
mfxU16 NumFrameMin; // 分配帧数的最小值
mfxU16 NumFrameSuggested; // 分配的建议值
mfxU16 reserved2;
} mfxFrameAllocRequest;
该结构描述了初始化编解码器vpp时的多帧分配参数。分配帧数的建议值。应用程序可自由分配额外的帧。不过,无论怎样,最小帧数必须至少是NumFrameMin,否则会返回错误。
ExtMemFrameType枚举指定了帧的存储类型,关于视频内存表面跟详细的信息,参阅硬件加速部分。该枚举列表如下(去除了部分保留成员和dx成员,linux下开发的),
enum {
MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = 0x0010, // 帧在图像存储中,属于解码渲染目标
MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = 0x0020, // 图像存储,vpp
MFX_MEMTYPE_SYSTEM_MEMORY = 0x0040, // 系统存储
MFX_MEMTYPE_FROM_ENCODE = 0x0100, // 编码函数的分配请求
MFX_MEMTYPE_FROM_DECODE = 0x0200, // 解码函数的分配请求
MFX_MEMTYPE_FROM_VPPIN = 0x0400, // vpp输入帧的分配请求
MFX_MEMTYPE_FROM_VPPOUT = 0x0800, // vpp输出帧的分配请求
MFX_MEMTYPE_FROM_ENC = 0x2000,
MFX_MEMTYPE_FROM_PAK = 0x4000,
MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, // 内部帧的分配请求
NFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, // I/O帧的分配请求
MFX_MEMTYPE_OPAQUE_FRAME = 0x0004, // opaque帧的分配请求
MFX_MEMTYPE_EXPORT_FRAME = 0x0008, // 应用程序请求帧句柄导出到相关的对象.linux帧句柄可被认为是导出到DRM Prime FD,DRM FLink 或 DRM FrameBuffer句柄.导出类型和导出过程具体取决于外部帧分配器的实现.
MFX_MEMTYPE_SHARED_RESOURCE = MFX_MEMTYPE_EXPORT_FRAME,
};