MI HVP API
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
3.0 | 09/20/2022 | |
3.1 | 02/02/2023 | |
3.2 | 06/02/2023 |
1. MI HVP概述¶
1.1. 模块说明¶
HVP(Highspeed Video Processor)模块为高速视频处理器单元,它可以对视频信号进行格式转换、画面裁剪、变化尺寸、帧率控制等处理。
参考目前的硬件设计,“HDMI-RX”是HVP模块唯一的输入源。 HVP 输出 DISP 和 SCL 模块支持的视频格式,它使用 'MI_SYS' 的 'realtime' 模式来绑定其他模块。
HVP模块的应用场景用在HDMI接口的显示设备上,实时检测输入的视频信号并将其转换为DISP/SCL模块支持的格式。
1.2. 流程框图¶
HVP模块是基于Pipeline模式的一种MI模块,内部是由MI_SYS提供工作线程驱动。
HVP模块没有输入端口,当前设计仅支持1个通道以及1个输出端口,输出端口可以同时以Realtime的方式绑定SCL和DISP模块。
1.3. 工作模式¶
HVP内部有输入和输出2种Timing,根据不同的工作模式,会有不同的应用,HVP模块可根据应用场景的差异可配置三种不同的工作模式。
HVP内部会有一个FIFO用于暂存Timing Input进来的数据,FIFO的深度可调,以图像的张数为单位,每张的内存大小由DmaColor格式和图像大小决定的,用户不需要关心内存的总大小,只需要设定张数。
对应三种不同的视频处理流程框图如下所示:
-
Lock Out Mode
该模式下HVP内部的DMA写由Video Input Timing驱动,读由Video Output Timing驱动,由于写和读由两种不同的timing驱动且互相不影响,那么就可以实现了帧率转换的功能,该模式下后级模块必须为DISP模块,可选择并联一路输出到SCL模块。Output Timing与DISP的屏驱共享Clock,共享同一个Vsync。
-
Ratio Mode
Ratio Mode下HVP内部的DMA读和写的DMA只由Video Input Timing驱动,后级模块仅支持SCL,由于只有一个输入Timing驱动,因此不支持帧率转换功能。
-
FBL Mode
FBL全称是Framebufferless,即不会申请DMA所用的内存也不会打开HVP内部的DMA模块,输入的Video Timing直接驱动HVP的后级模块,后级模块仅支持SCL,同Ratio Mode一样不支持帧率转换,另外不支持Timing输入Interlace的信号。
1.4. 内部视频处理流程¶
HVP内部的信号处理分为2个阶段,第一阶段进行输入讯号到WDMA之间的图像处理,内部讯号通过WDMA写入DRAM,第二阶段通过RDMA读取DRAM储存的图像数据进行第二阶段的图像处理。
第一阶段图像处理流程(Video Processor Stage0):
-
格式转换(RGB444, YUV422, YUV444)
-
图像缩小
第二阶段图像处理流程(Video Processor Stage1)包括:
-
YUV格式转换(仅支持YUV422转YUV444)
-
图像放大和缩小
-
隔行转逐行信号
另外通过改变读写DMA的硬件属性,支持一定程度的图像处理
-
8bit to 6bit图像内存压缩
-
垂直镜像(Flip)
-
水平镜像(Mirror)
-
帧率转换(FRC)
为了方便理解,在MI_HVP中与第一阶段图像处理流程相关的用户设定定义为Src端,相关的设定定义为“Src Parameter”。与之对应的,DMA读写部分、第二阶段处理流程,合并在一起定义为Dst端,相关设定定义为“Dst Parameter”。
1.5. 内部延时¶
HVP处于FBL Mode时,内部数字信号的延时是由硬件电路逻辑决定的,延时可忽略不计,除此之外,当处于Ratio和Lock Out模式时,DMA Buf为1张时处于低延时模式(Game Mode),当DMA Buf大于1张时,延时为写DMA的Timing的一个周期时间,具体延时的时间参考procfs中的字段:"DmaRead","Sw React"。
1.6. Reset Event¶
当HVP接入输入信号后发生了信号不稳定的情况,输入Timing的HTotal、VTotal等参数超过了某一个阈值,那么就会触发HVP的自动消隐功能。消隐会把输出端显示的内容全部替换成某种颜色(一般为黑色),硬件能够保证自动消隐触发的实时性,因而可以保证当信号不稳定时只会发生闪屏而不会在屏幕上看到脏数据。当硬件的自动消隐产生后,会触发中断,HVP内部再把中断事件转发到用户层,命名为"Reset Event",在HVP的用户层会有一套API来接收和响应"Reset Event"。
自动消隐产生后会使能消隐功能触发中断,且在已经使能消隐的状态下不会重发。用户层需要有一个独立的后台用于侦听“Reset Event”,当输入信号重新恢复稳定后,需要用户做ClearEvent的动作。
后台处理流程中需要轮询检测信号是否稳定(参考API:MI_HVP_GetSourceSignalStatus)或是否发生变化(参考API:MI_HVP_GetSourceSignalTiming)。为了能够及时收到“Reset Event”,提供了API:MI_HVP_GetResetEventFd,以及:MI_HVP_CloseResetEventFd,用户可以通过前者拿到文件描述符,并通过系统调用 “select” 函数及时地响应“Reset Event” 的中断信号,当中断发生后通过API:MI_HVP_GetResetEvent获取到当前是否是 “ResetEvent”触发状态。
输入信号的变化检测有两种情况,其一是“ResetEvent” 触发,其二是通过前后2次轮询,检查到输入的ColorFormat、ColorDepth发生变化(通过HDMIRX提供的接口获取,这种变化不会触发“ResetEvent” ),用户层检测到变化,并且新的信号稳定后,通过HDMIRX模块提供的接口获取当前稳定Timing的ColorFormat/ColorDepth/enPixRepType等讯息,并通过调用API:MI_HVP_GetChannelParam、MI_HVP_SetChannelParam改变其SrcParam中所对应的设定,当一切设定改变完成后,调用API:MI_HVP_ClearResetEvent。
以上流程请参考流程图:
参考代码请看APIMI_HVP_GetResetEventFd中的举例。
1.7. 关键字说明¶
-
FRC
帧率控制
-
WDMA
DRAM存储器写单元
-
RDMA
DRAM存储器读单元
2. MI API 参考¶
API名 | 功能 |
---|---|
MI_HVP_CreateDevice | 初始化设备 |
MI_HVP_DestroyDevice | 去初始化设备 |
MI_HVP_GetSourceSignalStatus | 获取数据源信号稳定状态 |
MI_HVP_GetSourceSignalTiming | 获取数据源信号Timing |
MI_HVP_GetResetEventFd | 获取reset事件Fd |
MI_HVP_CloseResetEventFd | 关闭reset事件Fd |
MI_HVP_GetResetEvent | 获取reset事件 |
MI_HVP_ClearResetEvent | 清除reset中断标志 |
MI_HVP_CreateChannel | 初始化设备通道 |
MI_HVP_DestroyChannel | 去初始化设备通道 |
MI_HVP_StartChannel | 启动设备通道传输 |
MI_HVP_StopChannel | 停止设备通道传输 |
MI_HVP_SetChannelParam | 设置设备通道参数 |
MI_HVP_GetChannelParam | 获取设备通道参数 |
MI_HVP_SetVideoMute | 设置图像消隐 |
2.1. MI_HVP_CreateDevice¶
-
功能
初始化HVP设备,根据设备参数可以选择数据源。
-
语法
MI_S32 MI_HVP_CreateDevice(MI_HVP_DEV devId, const MI_HVP_DeviceAttr_t *pstDevAttr);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId HVP设备的device id 输入 MI_HVP_DeviceAttr_t pstDevAttr HVP的设备属性 输入 -
返回值
-
MI_SUCCESS:成功
-
MI_ERR_HVP_INVALID_DEVID:非法的设备id
-
MI_ERR_HVP_BUSY:设备已经创建,或者注册MI设备失败
-
MI_ERR_HVP_ILLEGAL_PARAM:非法的输入参数
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- HVP目前仅支持devId = 0。
- 目前仅支持E_MI_HVP_SRC_TYPE_HDMI。
-
举例
void CreateDestroyHvp(void) { MI_HVP_DeviceAttr_t stDevAttr; MI_HVP_DEV devId = 0; MI_S32 s32Ret = 0; memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t)); stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI; s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr); if (MI_SUCCESS != s32Ret) { return; } MI_HVP_DestroyDevice(devId); }
-
相关主题
2.2. MI_HVP_DestroyDevice¶
-
功能
反初始化HVP设备。
-
语法
MI_S32 MI_HVP_DestroyDevice(MI_HVP_DEV devId);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 调用前Device必须先创建,否正会报错。
- 在HVP设备上的通道已经创建的情况下去销毁HVP设备,则HVP的通道也会在内部销毁。
-
举例
参见MI_HVP_CreateDevice举例。
-
相关主题
2.3. MI_HVP_GetSourceSignalStatus¶
-
功能
获取数据源信号稳定状态。
-
语法
MI_S32 MI_HVP_GetSourceSignalStatus(MI_HVP_DEV devId, MI_HVP_SignalStatus_e *penSignalStatus);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_SignalStatus_e penSignalStatus 输入信号状态 输出 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 调用前Device必须先创建。
-
举例
void SampleHvp(void) { MI_HVP_DeviceAttr_t stDevAttr; MI_HVP_DEV devId = 0; MI_HVP_SignalStatus_e enSignalStatus; MI_HVP_SignalTiming_t stSrcTiming; MI_S32 s32Ret = 0; memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t)); stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI; s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr); if (MI_SUCCESS != s32Ret) { return; } s32Ret = MI_HVP_GetSourceSignalStatus(devId, &enSignalStatus); if (MI_SUCCESS != s32Ret) { return; } printf("SignalStatus:%d\n", enSignalStatus); memset(&stSrcTiming, 0x0, sizeof(MI_HVP_SignalTiming_t)); s32Ret = MI_HVP_GetSourceSignalTiming(devId, &stSrcTiming); if (MI_SUCCESS != s32Ret) { return; } printf("stSrcTiming.bInterlace:%d\n", stSrcTiming.bInterlace); printf("stSrcTiming.u16Fpsx100:%d\n", stSrcTiming.u16Fpsx100); printf("stSrcTiming.u16Height:%d\n", stSrcTiming.u16Height); printf("stSrcTiming.u16Width:%d\n", stSrcTiming.u16Width); MI_HVP_DestroyDevice(devId); }
-
相关主题
NA
2.4. MI_HVP_GetSourceSignalTiming¶
-
功能
获取数据源信号Timing。
-
语法
MI_S32 MI_HVP_GetSourceSignalTiming(MI_HVP_DEV devId, MI_HVP_SignalTiming_t *pstSrcTiming);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_SignalTiming_t pstSrcTiming 输入信号Timing 输出 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 调用前Device必须先创建。
- 若当前信号源不稳定,则返回的信号timing值都为0。
-
举例
-
相关主题
NA
2.5. MI_HVP_GetResetEventFd¶
-
功能
获取Reset Event的文件描述符,请参阅Reset Event。
-
语法
MI_S32 MI_HVP_GetResetEventFd(MI_HVP_DEV devId, MI_S32 *p32Fd);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_S32 p32Fd 指向Fd的指针 输出 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备必须已经创建。
-
举例
#define SIGNAL_MONITOR_COLOR_FORMAT_HDMI_2_HVP(__hvp, __hdmirx) \ do \ { \ switch (__hdmirx) \ { \ case E_MI_HDMIRX_PIXEL_FORMAT_RGB: \ __hvp = E_MI_HVP_COLOR_FORMAT_RGB444; \ break; \ case E_MI_HDMIRX_PIXEL_FORMAT_YUV444: \ __hvp = E_MI_HVP_COLOR_FORMAT_YUV444; \ break; \ case E_MI_HDMIRX_PIXEL_FORMAT_YUV422: \ __hvp = E_MI_HVP_COLOR_FORMAT_YUV422; \ break; \ case E_MI_HDMIRX_PIXEL_FORMAT_YUV420: \ __hvp = E_MI_HVP_COLOR_FORMAT_YUV420; \ break; \ default: \ __hvp = E_MI_HVP_COLOR_FORMAT_MAX; \ break; \ } \ } while(0) #define SIGNAL_MONITOR_COLOR_DEPTH_HDMI_2_HVP(__hvp, __hdmirx) \ do \ { \ switch (__hdmirx) \ { \ case E_MI_HDMIRX_PIXEL_BITWIDTH_8BIT: \ __hvp = E_MI_HVP_COLOR_DEPTH_8; \ break; \ case E_MI_HDMIRX_PIXEL_BITWIDTH_10BIT: \ __hvp = E_MI_HVP_COLOR_DEPTH_10; \ break; \ case E_MI_HDMIRX_PIXEL_BITWIDTH_12BIT: \ __hvp = E_MI_HVP_COLOR_DEPTH_12; \ break; \ default: \ __hvp = E_MI_HVP_COLOR_DEPTH_MAX; \ break; \ } \ } while(0) #define SIGNAL_MONITOR_PIXEX_REPETITIVE_HDMI_2_HVP(__hvp, __hdmirx) \ do \ { \ switch (__hdmirx) \ { \ case E_MI_HDMIRX_OVERSAMPLE_1X: \ __hvp = E_MI_HVP_PIX_REP_TYPE_1X; \ break; \ case E_MI_HDMIRX_OVERSAMPLE_2X: \ __hvp = E_MI_HVP_PIX_REP_TYPE_2X; \ break; \ case E_MI_HDMIRX_OVERSAMPLE_3X: \ __hvp = E_MI_HVP_PIX_REP_TYPE_3X; \ break; \ case E_MI_HDMIRX_OVERSAMPLE_4X: \ __hvp = E_MI_HVP_PIX_REP_TYPE_4X; \ break; \ default: \ __hvp = E_MI_HVP_PIX_REP_TYPE_MAX; \ break; \ } \ } while(0) #define SIGNAL_MONITOR_COLOR_RANGE_TYPE_HDMI_2_HVP(__hvp, __hdmirx) \ do \ { \ switch (__hdmirx) \ { \ case E_MI_HDMIRX_QUANTIZATION_DEFAULT: \ __hvp = E_MI_HVP_COLOR_RANGE_TYPE_FULL; \ break; \ case E_MI_HDMIRX_QUANTIZATION_LIMIT_RANGE: \ __hvp = E_MI_HVP_COLOR_RANGE_TYPE_LIMIT; \ break; \ case E_MI_HDMIRX_QUANTIZATION_FULL_RANGE: \ __hvp = E_MI_HVP_COLOR_RANGE_TYPE_FULL; \ break; \ default: \ __hvp = E_MI_HVP_COLOR_RANGE_TYPE_MAX; \ break; \ } \ } while (0) static int signal_monitor_sync_hdmi_paramter_2_hvp(const MI_HDMIRX_TimingInfo_t *pstTimingInfo) { MI_S32 ret = 0; MI_HVP_ChannelParam_t stChnParam; MI_HVP_DEV dev = 0; MI_HVP_CHN chn = 0; memset(&stChnParam, 0, sizeof(MI_HVP_ChannelParam_t)); ret = MI_HVP_GetChannelParam(dev, chn, &stChnParam); if (ret != MI_SUCCESS) { printf("Get HVP Param error! Dev %d Chn %d\n", dev, chn); return -1; } SIGNAL_MONITOR_PIXEX_REPETITIVE_HDMI_2_HVP(stChnParam.stChnSrcParam.enPixRepType, stTimingInfo.eOverSample); SIGNAL_MONITOR_COLOR_FORMAT_HDMI_2_HVP(stChnParam.stChnSrcParam.enInputColor, pstTimingInfo->ePixelFmt); SIGNAL_MONITOR_COLOR_DEPTH_HDMI_2_HVP(stChnParam.stChnSrcParam.enColorDepth, pstTimingInfo->eBitWidth); SIGNAL_MONITOR_COLOR_RANGE_TYPE_HDMI_2_HVP(stChnParam.stChnSrcParam.enColorRange, pstTimingInfo->eQuantRange); ret = MI_HVP_SetChannelParam(dev, chn, &stChnParam); if (ret != MI_SUCCESS) { printf("Set HVP param error! Dev %d Chn %d\n", dev, chn); return -1; } return 0; } static void signal_monitor_hdmi(void) { int select_ret = 0; MI_HVP_DEV dev = 0; MI_S32 ret = 0; MI_S32 s32Fd = -1; MI_BOOL bTrigger; fd_set read_fds; struct timeval tv; MI_HDMIRX_PortId_e port_id = E_MI_HDMIRX_PORT0; MI_HDMIRX_SigStatus_e cur_signal_status_hdmirx = E_MI_HDMIRX_SIG_NO_SIGNAL; MI_HVP_SignalStatus_e cur_signal_status = E_MI_HVP_SIGNAL_UNSTABLE; MI_HVP_SignalTiming_t cur_signal_timing = {0, 0, 0, 0}; MI_HDMIRX_TimingInfo_t cur_hdmirx_timing_info; static MI_HVP_SignalTiming_t last_signal_timing = {0, 0, 0, 0}; static MI_HDMIRX_TimingInfo_t last_hdmirx_timing_info; ret = MI_HVP_GetResetEventFd(dev, &s32Fd); if (ret != MI_SUCCESS) { printf("Get Reset fd Errr, Hvp Dev%d!\n", dev); return; } FD_ZERO(&read_fds); FD_SET(s32Fd, &read_fds); tv.tv_sec = 0; tv.tv_usec = 100 * 1000; select_ret = select(s32Fd + 1, &read_fds, NULL, NULL, &tv); if (select_ret < 0) { printf("Reset fd select error!!\n"); goto EXIT_FD; } ret = MI_HVP_GetResetEvent(dev, &bTrigger); if (ret != MI_SUCCESS) { printf("Get Reset cnt Errr, Hvp Dev%d!\n", dev); goto EXIT_FD; } ret = MI_HDMIRX_GetSignalStatus(port_id, &cur_signal_status_hdmirx); if (ret != MI_SUCCESS) { printf("Get hdmirx Signal Status Errr, port_id %d!\n", port_id); goto EXIT_RST_CNT; } ret = MI_HVP_GetSourceSignalStatus(dev, &cur_signal_status); if (ret != MI_SUCCESS) { printf("Get Signal Status Errr, Hvp Dev%d!\n", dev); goto EXIT_RST_CNT; } ret = MI_HVP_GetSourceSignalTiming(dev, &cur_signal_timing); if (ret != MI_SUCCESS) { printf("Get Signal Timing Errr, Hvp Dev%d!\n", dev); goto EXIT_RST_CNT; } ret = MI_HDMIRX_GetTimingInfo(port_id, &cur_hdmirx_timing_info); if (ret != MI_SUCCESS) { printf("Get Hdmirx Timing error!\n"); goto EXIT_RST_CNT; } if (cur_signal_timing.u16Width != last_signal_timing.u16Width || cur_signal_timing.u16Height!= last_signal_timing.u16Height || cur_signal_timing.bInterlace!= last_signal_timing.bInterlace || cur_hdmirx_timing_info.eOverSample != last_hdmirx_timing_info.eOverSample || cur_hdmirx_timing_info.ePixelFmt != last_hdmirx_timing_info.ePixelFmt || cur_hdmirx_timing_info.eBitWidth != last_hdmirx_timing_info.eBitWidth) { printf("Get Signal St W: %d H: %d, Fps: %d bInterlace: %d OverSample: %d HdmirxFmt: %d BitWidth: %d\n", cur_signal_timing.u16Width, cur_signal_timing.u16Height, cur_signal_timing.u16Fpsx100, (int)cur_signal_timing.bInterlace, cur_hdmirx_timing_info.eOverSample, cur_hdmirx_timing_info.ePixelFmt, cur_hdmirx_timing_info.eBitWidth); if (cur_signal_status_hdmirx == E_MI_HDMIRX_SIG_SUPPORT && cur_signal_status == E_MI_HVP_SIGNAL_STABLE) { printf("Signal stable.\n"); } else { printf("Signal unstable.\n"); } signal_monitor_sync_hdmi_paramter_2_hvp(&cur_hdmirx_timing_info); last_signal_timing = cur_signal_timing; last_hdmirx_timing_info = cur_hdmirx_timing_info; } EXIT_RST_CNT: if (bTrigger) { printf("Get reset event!!\n"); MI_HVP_ClearResetEvent(dev); } EXIT_FD: MI_HVP_CloseResetEventFd(dev, s32Fd); } static int is_exit = 0; int do_main(void) { while (!is_exit) { signal_monitor_hdmi(); } return 0; }
-
相关主题
2.6. MI_HVP_CloseResetEventFd¶
-
功能
关闭Reset Event的文件描述符,请参阅Reset Event。
-
语法
MI_S32 MI_HVP_CloseResetEventFd(MI_HVP_DEV devId, MI_S32 s32Fd);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_S32 s32Fd 文件描述符Fd 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备必须已经创建。
-
举例
-
相关主题
2.7. MI_HVP_GetResetEvent¶
-
功能
获取Reset Event的触发状态,若pbTrigger指向的值为TRUE,那么表示曾经有发生过硬件自动消隐中断,并且未使用接口MI_HVP_ClearResetEvent清除Reset Event。
请参阅Reset Event。
-
语法
MI_S32 MI_HVP_GetResetEvent(MI_HVP_DEV devId, MI_BOOL *pbTrigger);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_BOOL * pbTrigger 指向是否有reset中断的指针 输出 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备必须已经创建。
-
举例
-
相关主题
2.8. MI_HVP_ClearResetEvent¶
-
功能
清除Reset Event的中断标志,请参阅Reset Event。
-
语法
MI_S32 MI_HVP_ClearResetEvent(MI_HVP_DEV devId);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备必须已经创建。
- 若MI_HVP_GetResetEvent 返回的pbTrigger标志为TRUE,则在用户层没有使能消隐 MI_HVP_SetVideoMute 的情况下调用此接口会解除消隐。
-
举例
-
相关主题
2.9. MI_HVP_CreateChannel¶
-
功能
初始化设备通道。
-
语法
MI_S32 MI_HVP_CreateChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId, const MI_HVP_ChannelAttr_t *pstChnAttr);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 MI_HVP_ChannelAttr_t pstChnAttr 通道属性 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备必须已经创建。
- HVP目前仅支持chnId = 0,Chn不能重复创建,否则会报错。
- 通道属性设定中(MI_HVP_FrcMode_e)即工作模式的设定,请参考章节1.3的说明。
- 当工作模式处于“FBL模式”时需要使能(MI_HVP_FrcFblModeConfig_t)。
- 当工作模式处于“Ratio模式”和“Lock Out模式”时,需要使能DMA,并设定DMA读写的Buffer(PqBuf),对应的配置的参数类型是(MI_HVP_PqBufModeConfig_t)。
- "Lock Out"模式下,MI_HVP_PqBufModeConfig_t 中的参数u16BufMaxWidth、u16BufMaxHeight建议设定与显示的Timing宽高相等,若小于显示的Timing,则显示的Disp Window的宽高无法占满整个显示的区域。
- "Lock Out"模式下,若显示的Timing会动态改变(例如DISP BT656动态切输出Timing),且MI_HVP_PqBufModeConfig_t 中参数u16BufMaxWidth、u16BufMaxHeigh 的设定宽高为可能的最大Timing的大小,则无需再根据当前的Timing大小重新销毁创建HVP的通道,但需要通过接口MI_HVP_SetChannelParam去改变HVP的输出大小和Disp Window的大小。
- "Lock Out"模式下,Pq Buf的最小个数取决于输入和输出Timing Fps之比,逐行扫描输入时,PqBufMin=Alignment( InputFps / OutputFps) + 1。其中Alignment表示向上整数对齐,隔行扫描输入时,PqBufMin=Alignment( InputFps*2 / OutputFps ) + 1,如输入1080p24Fps输出1080p60Fps,则最小Pq Buf为 Aligment(24 / 60) + 1 =2。
- "Ratio"模式和"Lock Out"模式时,PqBuf设定为1,这种情况为低延迟模式,不支持隔行输入。
-
举例
void SampleHvp1(void) { MI_HVP_DeviceAttr_t stDevAttr; MI_HVP_DEV devId = 0; MI_HVP_CHN chnId = 0; MI_HVP_ChannelAttr_t stChnAttr; MI_HVP_ChannelParam_t stChnParam; MI_S32 s32Ret = 0; memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t)); stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI; s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr); if (MI_SUCCESS != s32Ret) { return; } memset(&stChnAttr, 0x0, sizeof(MI_HVP_ChannelAttr_t)) stChnAttr.enFrcMode = E_MI_HVP_FRC_MODE_LOCK_OUT; if (stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_RATIO || stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_LOCK_OUT) { stChnAttr.stPqBufModeConfig.eDmaColor = E_MI_HVP_COLOR_FORMAT_YUV444; stChnAttr.stPqBufModeConfig.u16BufMaxCount = 10; stChnAttr.stPqBufModeConfig.u16BufMaxWidth = 1920; stChnAttr.stPqBufModeConfig.u16BufMaxHeight = 1080; stChnAttr.stPqBufModeConfig.eBufCompressMode = E_MI_SYS_COMPRESS_MODE_NONE; stChnAttr.stPqBufModeConfig.eFieldType = E_MI_SYS_FIELDTYPE_NONE; } s32Ret = MI_HVP_CreateChannel(devId, chnId, &stChnAttr); if (MI_SUCCESS != s32Ret) { return; } memset(&stChnParam, 0x0, sizeof(MI_HVP_ChannelParam_t)); stChnParam.stChnSrcParam.enPixRepType = E_MI_HVP_PIX_REP_TYPE_1X; stChnParam.stChnSrcParam.enInputColor = E_MI_HVP_COLOR_FORMAT_RGB444; stChnParam.stChnSrcParam.enColorDepth = E_MI_HVP_COLOR_DEPTH_8; stChnParam.stChnSrcParam.enColorRange = E_MI_HVP_COLOR_RANGE_TYPE_FULL; stChnParam.stChnSrcParam.stCropWin.u16X = 0; stChnParam.stChnSrcParam.stCropWin.u16Y = 0; stChnParam.stChnSrcParam.stCropWin.u16Width = 1920; stChnParam.stChnSrcParam.stCropWin.u16Height = 1080; stChnParam.stChnDstParam.bFlip = 0; stChnParam.stChnDstParam.bMirror = 0; stChnParam.stChnDstParam.enColor = E_MI_HVP_COLOR_FORMAT_YUV444; stChnParam.stChnDstParam.u16Fpsx100 = 60; stChnParam.stChnDstParam.u16Width = 1920; stChnParam.stChnDstParam.u16Height = 1080; stChnParam.stChnDstParam.stDispWin.u16X = 0; stChnParam.stChnDstParam.stDispWin.u16Y = 0; stChnParam.stChnDstParam.stDispWin.u16Width = 1920; stChnParam.stChnDstParam.stDispWin.u16Height = 1080; stChnParam.stChnDstParam.stCropWin.u16X = 0; stChnParam.stChnDstParam.stCropWin.u16Y = 0; stChnParam.stChnDstParam.stCropWin.u16Width = 1920; stChnParam.stChnDstParam.stCropWin.u16Height = 1080; s32Ret = MI_HVP_SetChannelParam(devId, chnId, &stChnParam); if (MI_SUCCESS != s32Ret) { return; } memset(&stChnParam, 0x0, sizeof(MI_HVP_ChannelParam_t)); s32Ret = MI_HVP_GetChannelParam(devId, chnId, &stChnParam); if (MI_SUCCESS != s32Ret) { return; } printf("stChnParam.xxx=xxx\n"); s32Ret = MI_HVP_StartChannel(devId, chnId); if (MI_SUCCESS != s32Ret) { return; } /* To do things */ MI_HVP_StopChannel(devId, chnId); MI_HVP_DestroyChannel(devId, chnId); MI_HVP_DestroyDevice(devId); }
-
相关主题
2.10. MI_HVP_DestroyChannel¶
-
功能
去初始化设备通道。
-
语法
MI_S32 MI_HVP_DestroyChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备和通道必须已经创建。
-
举例
参见MI_HVP_CreateChannel举例。
-
相关主题
2.11. MI_HVP_StartChannel¶
-
功能
启动设备通道传输。
-
语法
MI_S32 MI_HVP_StartChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备和通道必须已经创建,Chn不能重复Start,否则会报错。
-
举例
参见MI_HVP_CreateChannel举例。
-
相关主题
2.12. MI_HVP_StopChannel¶
-
功能
停止设备通道传输。
-
语法
MI_S32 MI_HVP_StopChannel(MI_HVP_DEV devId, MI_HVP_CHN chnId);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备和通道必须已经创建,Chn不能重复Stop,否则会报错。
-
举例
参见MI_HVP_CreateChannel举例。
-
相关主题
2.13. MI_HVP_SetChannelParam¶
-
功能
设置设备通道参数。
-
语法
MI_S32 MI_HVP_SetChannelParam(MI_HVP_DEV devId, MI_HVP_CHN chnId, const MI_HVP_ChannelParam_t *pstChnParam);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 MI_HVP_ChannelParam_t pstChnParam 通道参数 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
-
设备和通道必须已经创建。
-
除第一次设定,建议先调用(MI_HVP_GetChannelParam)获取到通道参数信息后,再此基础上修改想要改变的值。
-
通道正在传输且信号稳定时,调用此接口必须保证已经设定了图像消隐,消隐相关接口(MI_HVP_SetVideoMute),否则有可能会看到通道参数改变造成的花屏现象。
-
通道设定完成后可以立即调用接口(MI_HVP_SetVideoMute)解消隐。
-
与Video裁剪放大相关的设定按照硬件处理的流水线顺序划分为SrcCrop->Scaling->DstCrop->DispWindow,其中包含(MI_HVP_SrcParam_t)中的stSrcCrop参数,(MI_HVP_DstParam_t)中的(u16Width,u16Heigh)、DstCrop参数、stDsipWin参数设定。
-
如果SrcCrop后的图像大于Scaling后的图像,则Scaling做Scaling down,反之则做Scaling Up。
-
下图为整个图像处理的流水线,分为只放大和只缩小两种:
-
还有一种情况上图未列出来,SrcCrop之后的图H和V方向可能一个做放大一个做缩小,那么在SrcCrop之后会先做一个方向做缩小后再进PqBuf Fifo,从Fifo中出来后在另外一个方向做放大。
-
上图中HVP经过Scaling后就会把图像送给SCL,DstCrop功能和DispWin显示功能只会作用于Disp显示的Timing上。
-
若工作模式为“FBL Mode”,则没有PqBuf Fifo。
-
设定MI_HVP_DstParam_t时,需要根据当前的工作模式遵循一定的规则:
FBL Mode:
DmaColor DstColor NA E_MI_HVP_COLOR_FORMAT_YUV444 参数 使用限制 bMirror 不支持 bFlip 不支持 enColorRange 支持 stDispWin 不支持 stCropWin 不支持 u16Width,u16Heigh 不能大于输入Timing的宽高,2 pixel对齐
Ratio Mode:
DmaColor DstColor E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV444 参数 使用限制 bMirror 支持 bFlip 不支持 enColorRange 支持 stDispWin 不支持 stCropWin 不支持 u16Width,u16Heigh 不能大于输入Timing的宽高和MI_HVP_PqBufModeConfig_t中的宽高,2 pixel对齐
Lock Out Mode (Output Disp Only):
DmaColor DstColor E_MI_HVP_COLOR_FORMAT_RGB444 E_MI_HVP_COLOR_FORMAT_RGB444 E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV444 参数 使用限制 bMirror 支持 bFlip 支持 enColorRange 支持 stDispWin 支持,2 pixel对齐 stCropWin 其中x,y位置只能设置(0,0),2 pixel对齐 u16Width,u16Heigh 不能大于输入Timing的宽高和MI_HVP_PqBufModeConfig_t中的宽高,2pixel对齐
Lock Out Mode (Output Disp And Scl):
DmaColor DstColor E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV444 E_MI_HVP_COLOR_FORMAT_YUV422 E_MI_HVP_COLOR_FORMAT_YUV444 参数 使用限制 bMirror 支持 bFlip 支持 enColorRange 支持 stDispWin 仅在DISP显示有效,2 pixel对齐 stCropWin 仅在DISP显示有效,其中x,y位置只能设置(0,0),2 pixel对齐 u16Width,u16Heigh 不能大于输入Timing的宽高和MI_HVP_PqBufModeConfig_t中的宽高,2 pixel对齐
-
-
举例
参见MI_HVP_CreateChannel举例。
-
相关主题
2.14. MI_HVP_GetChannelParam¶
-
功能
获取设备通道参数。
-
语法
MI_S32 MI_HVP_GetChannelParam(MI_HVP_DEV devId, MI_HVP_CHN chnId, MI_HVP_ChannelParam_t *pstChnParam);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 MI_HVP_ChannelParam_t pstChnParam 通道参数 输出 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备和通道必须已经创建。
-
举例
参见MI_HVP_CreateChannel举例。
-
相关主题
2.15. MI_HVP_SetVideoMute¶
-
功能
设置图像消隐。
-
语法
MI_S32 MI_HVP_SetVideoMute(MI_HVP_DEV devId, MI_HVP_CHN chnId, MI_BOOL bEnable, MI_U32 u32MuteColor);
-
形参
参数类型 参数名称 参数含义 输入/输出 MI_HVP_DEV devId 设备id 输入 MI_HVP_CHN chnId 通道id 输入 MI_BOOL bEnable 是否使能消隐 输入 MI_U32 u32MuteColor 设置消隐颜色,24位有效,格式为RGB888 输入 -
返回值
-
MI_SUCCESS:成功。
-
非MI_SUCCESS:失败,参照返回值。
-
-
依赖
-
头文件:mi_sys.h、mi_hvp.h
-
库文件:无
-
-
注意
- 设备和通道必须已经创建。
- 在软件调用接口后,真正使能消隐和去除消隐的时间点由底层驱动和硬件内部逻辑决定,它会根据当前的输入输出的Vsync Timing以及PqBuf内部的Fifo大小决定真正生效的时间点。
-
举例
void SampleHvp2(void) { MI_HVP_DeviceAttr_t stDevAttr; MI_HVP_DEV devId = 0; MI_HVP_CHN chnId = 0; MI_HVP_ChannelAttr_t stChnAttr; MI_U32 u32MuteColor = 0; MI_S32 s32Ret = 0; memset(&stDevAttr, 0, sizeof(MI_HVP_DeviceAttr_t)); stDevAttr.enSrcType = E_MI_HVP_SRC_TYPE_HDMI; s32Ret = MI_HVP_CreateDevice(devId, &stDevAttr); if (MI_SUCCESS != s32Ret) { return; } memset(&stChnAttr, 0x0, sizeof(MI_HVP_ChannelAttr_t)) stChnAttr.enFrcMode = E_MI_HVP_FRC_MODE_LOCK_OUT; if (stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_RATIO || stChnAttr.enFrcMode == E_MI_HVP_FRC_MODE_LOCK_OUT) { stChnAttr.stPqBufModeConfig.eDmaColor = E_MI_HVP_COLOR_FORMAT_YUV444; stChnAttr.stPqBufModeConfig.u16BufMaxCount = 10; stChnAttr.stPqBufModeConfig.u16BufMaxWidth = 1920; stChnAttr.stPqBufModeConfig.u16BufMaxHeight = 1080; stChnAttr.stPqBufModeConfig.eBufCompressMode = E_MI_SYS_COMPRESS_MODE_NONE; stChnAttr.stPqBufModeConfig.eFieldType = E_MI_SYS_FIELDTYPE_NONE; } s32Ret = MI_HVP_CreateChannel(devId, chnId, &stChnAttr); if (MI_SUCCESS != s32Ret) { return; } u32MuteColor = 0x0000FF; /* blue */ s32Ret = MI_HVP_SetVideoMute(devId, chnId, 1, u32MuteColor) if (MI_SUCCESS != s32Ret) { return; } MI_HVP_DestroyChannel(devId, chnId); MI_HVP_DestroyDevice(devId); }
-
相关主题
NA
3. MI HVP 数据类型¶
视频前处理相关数据类型、数据结构定义如下:
数据类型 | 定义 |
---|---|
MI_HVP_SourceType_e | HVP 输入信号源选择 |
MI_HVP_ColorType_e | HVP 色彩类型 |
MI_HVP_ColorDepth_e | HVP 色彩位深 |
MI_HVP_SignalStatus_e | HVP 输入信号稳定状态 |
MI_HVP_DeviceAttr_t | HVP 的设备属性 |
MI_HVP_SrcParam_t | HVP src参数配置结构体 |
MI_HVP_FrcMode_e | HVP FRC模式 |
MI_HVP_FrcFblModeConfig_t | HVP FRC FBL模式配置结构体 |
MI_HVP_PqBufModeConfig_t | HVP PQ Buffer配置结构体 |
MI_HVP_ChannelAttr_t | HVP 通道参数配置结构体 |
MI_HVP_DstParam_t | HVP dst参数配置结构体 |
MI_HVP_ChannelParam_t | HVP 通道参数配置结构体 |
MI_HVP_SignalTiming_t | HVP 信号Timing配置结构体 |
3.1. MI_HVP_SourceType_e¶
-
说明
HVP输入信号源。
-
定义
typedef enum { E_MI_HVP_SRC_TYPE_HDMI, E_MI_HVP_SRC_TYPE_DMA } MI_HVP_SourceType_e;
-
成员
成员名称 描述 E_MI_HVP_SRC_TYPE_HDMI 选择HVP的输入源为HDMI_RX E_MI_HVP_SRC_TYPE_DMA 选择HVP的输入源为DMA
3.2. MI_HVP_ColorFormat_e¶
-
说明
HVP 输入以及输出的色彩类型。
-
定义
typedef enum { E_MI_HVP_COLOR_FORMAT_RGB444, E_MI_HVP_COLOR_FORMAT_YUV444, E_MI_HVP_COLOR_FORMAT_YUV422, E_MI_HVP_COLOR_FORMAT_YUV420, E_MI_HVP_COLOR_FORMAT_MAX } MI_HVP_ColorFormat_e;
-
成员
成员名称 描述 E_MI_HVP_COLOR_FORMAT_RGB444 RGB4:4:4 E_MI_HVP_COLOR_FORMAT_YUV444 YUV4:4:4 E_MI_HVP_COLOR_FORMAT_YUV422 YUV4:2:2 E_MI_HVP_COLOR_FORMAT_YUV420 YUV4:2:0
3.3. MI_HVP_ColorDepth_e¶
-
说明
HVP 色彩位深。
-
定义
typedef enum { E_MI_HVP_COLOR_DEPTH_8, E_MI_HVP_COLOR_DEPTH_10, E_MI_HVP_COLOR_DEPTH_12, E_MI_HVP_COLOR_DEPTH_MAX } MI_HVP_ColorDepth_e;
-
成员
成员名称 描述 E_MI_HVP_COLOR_DEPTH_8 8bit E_MI_HVP_COLOR_DEPTH_10 10bit E_MI_HVP_COLOR_DEPTH_12 12bit
3.4. MI_HVP_SignalStatus_e¶
-
说明
HVP 输入信号稳定状态。
-
定义
typedef enum { E_MI_HVP_SIGNAL_STABLE, E_MI_HVP_SIGNAL_UNSTABLE } MI_HVP_SignalStatus_e;
-
成员
成员名称 描述 E_MI_HVP_SIGNAL_STABLE 信号稳定 E_MI_HVP_SIGNAL_UNSTABLE 信号不稳定
3.5. MI_HVP_DeviceAttr_t¶
-
说明
HVP的设备属性。
-
定义
typedef struct MI_HVP_DeviceParam_s { MI_HVP_SourceType_e enSrcType; } MI_HVP_DeviceAttr_t;
-
成员
成员类型 成员名称 描述 MI_HVP_SourceType_e enSrcType HVP输入信号源类型
3.6. MI_HVP_SrcParam_t¶
-
说明
HVP Src参数配置结构体。
-
定义
typedef struct MI_HVP_SourceParam_s { MI_HVP_PixelRepetitionType_e enPixRepType;; MI_HVP_ColorType_e enInputColor; MI_HVP_ColorDepth_e enColorDepth; MI_SYS_WindowRect_t stCropWin; MI_HVP_ColorRangeType_e enColorRange; } MI_HVP_SrcParam_t;
-
成员
成员类型 成员名称 描述 MI_HVP_PixelRepetitionType_e enPixRepType 像素点重复类型 MI_HVP_ColorFormat_e enInputColor 色彩类型 MI_HVP_ColorDepth_e enColorDepth 色彩位深 MI_SYS_WindowRect_t stCropWin 裁剪窗口配置结构体 MI_HVP_ColorRangeType_e enColorRange 色域类型
3.7. MI_HVP_FrcMode_e¶
-
说明
HVP FRC模式。
-
定义
typedef enum { E_MI_HVP_FRC_MODE_FBL, E_MI_HVP_FRC_MODE_RATIO, E_MI_HVP_FRC_MODE_LOCK_OUT } MI_HVP_FrcMode_e;
-
成员
成员名称 描述 E_MI_HVP_FRC_MODE_FBL FBL模式 E_MI_HVP_FRC_MODE_RATIO RATIO模式 E_MI_HVP_FRC_MODE_LOCK_OUT LOCK_OUT模式
3.8. MI_HVP_FrcFblModeConfig_t¶
-
说明
HVP FRC FBL模式配置。
-
定义
typedef struct MI_HVP_FrcFblModeConfig_s { MI_U32 u32Reserve; } MI_HVP_FrcFblModeConfig_t;
-
成员
成员类型 成员名称 描述 MI_U32 u32Reserve 保留
3.9. MI_HVP_PqBufModeConfig_t¶
-
说明
HVP PQ Buffer配置结构体。
-
定义
typedef struct MI_HVP_PqBufModeConfig_s { MI_HVP_ColorFormat_e eDmaColor; MI_U16 u16BufMaxCount; MI_U16 u16BufMaxWidth; MI_U16 u16BufMaxHeight; MI_SYS_CompressMode_e eBufCompressMode; MI_SYS_FieldType_e eFieldType; } MI_HVP_PqBufModeConfig_t;
-
成员
成员类型 成员名称 描述 MI_HVP_ColorFormat_e eDmaColor DMA支持的色彩格式 MI_U16 u16BufMaxCount PQ Buffer 最大值 MI_U16 u16BufMaxWidth PQ Buffer 宽上限 MI_U16 u16BufMaxHeight PQ Buffer 高上限 MI_SYS_CompressMode_e eBufCompressMode 定义压缩方式枚举类型 MI_SYS_FieldType_e eFieldType 逐行扫描类型
3.10. MI_HVP_ChannelAttr_t¶
-
说明
HVP 通道参数配置结构体。
-
定义
typedef struct MI_HVP_ChannelAttr_s { MI_HVP_FrcMode_e enFrcMode; union { MI_HVP_FrcFblModeConfig_t stFrcFblModeConfig; MI_HVP_PqBufModeConfig_t stPqBufModeConfig; }; } MI_HVP_ChannelAttr_t;
-
成员
成员类型 成员名称 描述 MI_HVP_FrcMode_e enFrcMode FRC模式 MI_HVP_FrcFblModeConfig_t stFrcFblModeConfig HVP FRC FBL模式配置结构体 MI_HVP_FrcFblModeConfig_t stPqBufModeConfig HVP PQ Buffer配置结构体
3.11. MI_HVP_DstParam_t¶
-
说明
HVP Dst参数配置结构体。
-
定义
typedef struct MI_HVP_DstParam_s { MI_HVP_ColorFormat_e enColor; MI_BOOL bMirror; MI_BOOL bFlip; MI_U16 u16Fpsx100; MI_U16 u16Width; MI_U16 u16Height; MI_SYS_WindowRect_t stDispWin; MI_SYS_WindowRect_t stCropWin; } MI_HVP_DstParam_t;
-
成员
成员类型 成员名称 描述 MI_HVP_ColorFormat_e enColor 色彩格式 MI_BOOL bMirror 是否镜像 MI_BOOL bFlip 是否翻转 MI_U16 u16Fpsx100 帧率 MI_U16 u16Width 宽 MI_U16 u16Height 高 MI_SYS_WindowRect_t stDispWin 显示窗口配置参数结构体 MI_SYS_WindowRect_t stCropWin 裁剪窗口配置参数结构体
3.12. MI_HVP_ChannelParam_t¶
-
说明
HVP 通道参数配置结构体。
-
定义
typedef struct MI_HVP_ChannelParam_s { MI_HVP_SrcParam_t stChnSrcParam; MI_HVP_DstParam_t stChnDstParam; } MI_HVP_ChannelParam_t;
-
成员
成员类型 成员名称 描述 MI_HVP_SrcParam_t stChnSrcParam HVP Src参数配置结构体 MI_HVP_DstParam_t stChnDstParam HVP Dst参数配置结构体
3.13. MI_HVP_SignalTiming_t¶
-
说明
HVP 信号Timing参数配置结构体。
-
定义
typedef struct MI_HVP_SignalTiming_s { MI_BOOL bInterlace; MI_U16 u16Fpsx100; MI_U16 u16Width; MI_U16 u16Height; } MI_HVP_SignalTiming_t;
-
成员
成员类型 成员名称 描述 MI_BOOL bInterlace 是否隔行扫描 MI_U16 u16Fpsx100 帧率 MI_U16 u16Width 宽 MI_U16 u16Height 高
3.14. MI_HVP_PixelRepetitionType_e¶
-
说明
HVP 像素重复类型。
-
定义
typedef enum { E_MI_HVP_PIX_REP_TYPE_1X, E_MI_HVP_PIX_REP_TYPE_2X, E_MI_HVP_PIX_REP_TYPE_3X, E_MI_HVP_PIX_REP_TYPE_4X, E_MI_HVP_PIX_REP_TYPE_MAX } MI_HVP_PixelRepetitionType_e;
-
成员
成员名称 描述 E_MI_HVP_PIX_REP_TYPE_1X 1倍 E_MI_HVP_PIX_REP_TYPE_2X 2倍 E_MI_HVP_PIX_REP_TYPE_3X 3倍 E_MI_HVP_PIX_REP_TYPE_4X 4倍
3.15. MI_HVP_ColorRangeType_e¶
-
说明
HVP色域类型
-
定义
typedef enum { E_MI_HVP_COLOR_RANGE_TYPE_FULL, E_MI_HVP_COLOR_RANGE_TYPE_LIMIT, E_MI_HVP_COLOR_RANGE_TYPE_MAX, } MI_HVP_ColorRangeType_e;
-
成员
成员名称 描述 E_MI_HVP_COLOR_RANGE_TYPE_FULL 默认 E_MI_HVP_COLOR_RANGE_TYPE_LIMIT 仅在yuv色域才会触发limit->full的转换
4. MI HVP返回值¶
MI_HVP API 返回值如下表所示。
错误码 | 宏定义 | 描述 |
---|---|---|
0xA0292001 | MI_ERR_HVP_INVALID_DEVID | 使用错误的设备id |
0xA0292002 | MI_ERR_HVP_INVALID_CHNID | 使用错误的通道id |
0xA0292003 | MI_ERR_HVP_ILLEGAL_PARAM | 使用错误的参数 |
0xA0292004 | MI_ERR_HVP_EXIST | 通道已经存在 |
0xA0292005 | MI_ERR_HVP_UNEXIST | 通道不存在 |
0xA0292006 | MI_ERR_HVP_NULL_PTR | 空指针 |
0xA0292007 | MI_ERR_HVP_NOT_CONFIG | 未配置 |
0xA0292008 | MI_ERR_HVP_NOT_SUPPORT | 不支持当前配置 |
0xA0292009 | MI_ERR_HVP_NOT_PERM | 不允许当前配置 |
0xA029200C | MI_ERR_HVP_NOMEM | 无系统内存 |
0xA029200D | MI_ERR_HVP_NOBUF | 无连续物理内存 |
0xA029200E | MI_ERR_HVP_BUF_EMPTY | 物理内存池为空 |
0xA029200F | MI_ERR_HVP_BUF_FULL | 物理内存池满 |
0xA0292010 | MI_ERR_HVP_NOTREADY | 设备当前不可用 |
0xA0292011 | MI_ERR_HVP_BADADDR | 错误的地址 |
0xA0292012 | MI_ERR_HVP_BUSY | 资源冲突 |
0xA0292013 | MI_ERR_HVP_CHN_NOT_STARTED | 通道未开始 |
0xA0292014 | MI_ERR_HVP_CHN_NOT_STOPPED | 通道未结束 |
0xA029201F | MI_ERR_HVP_UNDEFINED | 未知错误 |
5. PROCFS介绍¶
5.1. HVP cat¶
-
调试信息
# cat /proc/mi_modules/mi_hvp/mi_hvpX(其中X为HVP的设备id)
-
调试信息分析
记录当前HVP的使用状况以及device属性、channel属性、outputport属性,可以动态地获取到这些信息,方便调试和测试。
-
参数说明
参数 描述 device info IsrMask 中断掩码 AutoMuteIsrCnt 自动消隐中断次数 IrqCnt 输入或输出中断次数 IrqCnt/Ms 一段时间内的输入或输出中断次数 Ips 每秒的输入或输出中断次数 MaxIv/MinIv 一段时间内的输入或输出中断最大和最小间隔时间 InputType 输入数据源类型 InputId 输入数据源对应Id(保留) OutputType 输出类型 OutputId (用于指定gwin的mops0 or mops1) SignalSt 输入信号稳定状态 AutoMuteSt 是否使能AutoMute StrSt STR状态 FpllLockSt Fpll是否锁住 Htt 水平总长度。单位:像素 Vtt 垂直总长度。单位:行 HdeStart 水平有效开始。单位:像素 VdeStart 垂直有效开始。单位:行 HdeEnd 水平有效结束。单位:像素 VdeEnd 垂直有效结束。单位:行 HAct 水平有效长度。单位:像素 VAct 垂直有效长度。单位:行 bInterlace 隔行/逐行 Fpsx100 帧率乘以100 channel info Chn 通道id bStart 通道是否开始 MuteMask 消隐掩码 MuteColor 消隐颜色 FrcMode fbl/ratio/lock_out bEnableDmaBuf 是否使用DMA Buffer BufW DMA Buffer的宽 BufH DMA Buffer的高 BufCnt DMA Buffer数量 Fmt 色彩格式 CompressMd 压缩方式 DiType 逐行扫描类型 PqBufSize PqBuf总内存长度 PqBufAddr PqBuf内存起始地址 PqBufStride PqBuf跨度 PatGenEn 是否使能HVP内部Timing Gen pattern PatW Timing Gen pattern的宽 PatH Timing Gen pattern的高 PixRepType 重复像素点类型 SrcCropX Src端裁剪窗口的起始横坐标 SrcCropY Src端裁剪窗口的起始纵坐标 SrcCropW Src端裁剪窗口的宽度 SrcCropH Src端裁剪窗口的高度 SrcColor Src端色彩类型 SrcCR Src色域 SrcBpp Src端色彩位深 DstColor Dst端色彩类型 DstFps Dst端输出帧率 bMirror 是否镜像 bFilp 是否翻转 DstW Dst端画面的宽度 DstH Dst端画面的高度 DispX Disp窗口的起始横坐标 DispY Disp窗口的起始纵坐标 DispW Disp窗口的宽度 DispH Disp窗口的高度 DstCropX Dst端裁剪窗口的起始横坐标 DstCropY Dst端裁剪窗口的起始纵坐标 DstCropW Dst端裁剪窗口的宽度 DstCropH Dst端裁剪窗口的高度 Output Task Info DoneCnt 完成的Task次数 DoneCnt/Ms 一段时间内完成的Task次数 Fps 每秒完成的Task次数 MaxIv/MinIv 一段时间内完成的Task的最大和最小间隔时间 Hardware Timestamp DmaRead 输入帧同步时间戳 Sw React 输出帧同步时间戳 Diff Hvp内部延时
5.2. HVP echo¶
功能 | 获取当前HVP所支持的echo命令及其具体使用形式 |
---|---|
命令 | echo help > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | 无 |
举例 | echo help > /proc/mi_modules/mi_hvp/mi_hvp0 |
功能 | 设置HVP内部Timing Gen的参数 |
---|---|
命令 | echo genTiming [hsync_w] [hbp] [hact] [hst] [htt] [vsync_w] [vbp] [vact] [vst] [vtt] [interlaced] > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | [hsync_w] [hbp] [hact] [hst] [htt] [vsync_w] [vbp] [vact] [vst] [vtt] [interlaced] |
举例 | echo genTiming 44 148 1920 192 2200 5 36 1080 41 1125 0 > /proc/mi_modules/mi_hvp/mi_hvp0 |
功能 | 设置HVP内部Test Pattern的宽高及使能 |
---|---|
命令 | echo genPattern [bEn] (w) (h) > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | [bEn] 是否使能 (w) 宽 (h) 高,其中宽高是可选参数,不填的话默认等于src宽高 |
举例 | echo genPattern 1 1920 1080 > /proc/mi_modules/mi_hvp/mi_hvp0或者echo genPattern 1 > /proc/mi_modules/mi_hvp/mi_hvp0 |
功能 | 设置HVP输入Timing来源 |
---|---|
命令 | echo setSrcTiming [chn] [src_type] [id] > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | [chn] 通道id [src_type] hdmirx,display,timing_gen [id] 保留,输入0即可 |
举例 | echo setSrcTiming 0 timing_gen 0 > /proc/mi_modules/mi_hvp/mi_hvp0 |
功能 | 设置HVP自动消隐功能(AutoMute)是否使能 |
---|---|
命令 | echo setAutoMuteOnOff [bEn] > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | [bEn] 是否使能 |
举例 | echo setAutoMuteOnOff 1 > /proc/mi_modules/mi_hvp/mi_hvp0 |
功能 | 开启消隐功能 |
---|---|
命令 | echo setMute [chn] [bEn] [color rgb[23:0]] > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | [chn] 通道id [bEn] 是否使能 [color rgb[23:0]] 消隐颜色 |
举例 | echo setMute 0 1 0xff0000 > /proc/mi_modules/mi_hvp/mi_hvp0 |
功能 | 发送一个Action Task到内部的工作线程中,研发人员Debug用。 |
---|---|
命令 | echo applyTask [chnid] [dupCnt] [taskFrameFlags] [taskActFlags] > /proc/mi_modules/mi_hvp/mi_hvp0 |
参数说明 | [chnid] [dupCnt] [taskFrameFlags] [taskActFlags] |
举例 | echo applyTask [chnid] [dupCnt] [taskFrameFlags] [taskActFlags] > /proc/mi_modules/mi_hvp/mi_hvp0 |