
/************************************************* 
 * Copyright (C), Xiongmai Information Technologies Co., Ltd. 2018-2019. All rights reserved. 
 * 文件名: maque_mmz.h
 * 作者@编号: XM R&D @02479
 * 版本: V1.00
 * 创建日期: 2019.04.04
 * 功能描述: 声明MMZ区内存申请和释放相关的接口。有些场合（比如，视频或图片编码）需要用到
 * 		大块内存，并且需要用到虚拟和物理一致的内存，因此预留了MMZ（Memory Management Zone）内
 *		存区，有效防止了编码对系统内存的影响。这些内存区跟Linux操作系统所用的OS Mem无关联，但
 *		可以通过内存映射方式使用。目前需要用到该套内存分配和释放接口模块有：YUV转Jpeg编码。
 *
 * 修改历史:  
 ** 1.日期: 2019.04.04
 ** 修改者: XM R&D @02479
 ** 修改内容: 首次创建 。
 ** 2.日期: 2019.04.04
 ** 修改者: XM R&D @02479
 ** 修改内容: 完成了基础版。
 *************************************************/


#ifndef MAQUE_MMZ_H
#define MAQUE_MMZ_H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct
{
	XM_U32 nMallocLen;		/* 需申请的内存块大小。由调用者传入。*/
	XM_VOID *pPhyAddr;  	/* 从MMZ(Memory Management Zone)分配的物理内存起始地址。底层返回。*/
	XM_VOID *pVirtAddr;		/* pPhyAddr通过内存映射所得的虚拟内存起始地址。底层返回。*/
	XM_HANDLE handleMem;	/* 内存分配handle，供库内部使用，外部调用者只需要把该handle按原值传入。底层返回。*/
	XM_U8 aReserved[8]; 	/* 保留。*/
} MaQueMmzMalloc_s;


/*
【功能描述】
	从预留的MMZ（Memory Management Zone）申请内存块。MMZ跟Linux操作系统所用的OS Mem无关联，但可以
	通过内存映射方式使用。本API从MMZ区申请一块内存，完成映射后，返回物理和虚拟内存地址。
【参数】
	  参数名称					描述
	pstMmzMalloc [in/out]	从MMZ区申请内存的参数。调用者给成员变量nMallocLen赋值，其它成员变量由底层赋值返回。
【返回值】
	XM_SUCCESS			成功。
	其它				失败，请参考错误码。
【注意】
	YUV转Jpeg编码中，YUV数据通过LibXmMaQue_JpegEnc_Yuv_encode()，传给底层编码器。存放YUV数据的Buffer就是
	通过本API申请所得，因此要注意pstMmzMalloc->nMallocLen的大小计算。它跟YUV帧真实宽高和像素格式有关。
	假如宽高分别为：nWidth和nHeight，像素格式为MAQUE_YUV_PIXEL_FORMAT_YVU_SP420，那么pstMmzMalloc->nMallocLen
	为：（nWidth * nHeight）* 3 / 2。注意：实际大于该值也是允许的，只不过多浪费内存。
*/
XM_S32 LibXmMaQue_MMZ_malloc(MaQueMmzMalloc_s *pstMmzMalloc);

/*
【功能描述】
	释放由前面LibXmMaQue_MMZ_malloc()申请的内存块。两者的参数相同。
【参数】
	  参数名称				描述
	pstMmzMalloc [in]	前面介绍的API：LibXmMaQue_MMZ_malloc()的返回同名结构体对象。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_MMZ_free(MaQueMmzMalloc_s *pstMmzMalloc);


#ifdef __cplusplus
}
#endif

#endif
