IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> HDMI设计9--Video Mixer IP -> 正文阅读

[网络协议]HDMI设计9--Video Mixer IP

Reference:https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/v_mix/v5_2/pg243-v-mix.pdf

对于图层叠加的需求,可以选择使用xilinx的OSD和Mixer IP,但是,Xilinx的vivado工具在2020后便不再支持OSD IP而是支持Mixer IP了。而且需要大家注意的时,Video Mixer IP这里有个坑,在我使用Mixer IP的过程中,发现,如果使用vivado 2020那么Mixer IP工具是无法找到Instance的,使用vivado 2020工具就需要使用Linux版本的。当然,另一种方法是使用版本低一点软件工具,比如vivado 2017。

1, 序

????????Video Mixer这个IP用于alpha融合和多视频或图层融合。支持17个图层的融合(一个主图层和16个叠加图层),以及一个可选择的Logo图层。图层输入接口可以选择memory map或者axi4-stream两种接口。该IP可以通过AXI4-Lite接口访问相应寄存器实现帧大小控制,背景颜色,图层位置。一组中断状态寄存器用于控制器(processor)监控处理状态。

1.1?支持的功能

????????(1) 支持像素级上17个图层和一个Logo图层的alpha-blending.

????????(2)?可选择的logo图层:使用片上BRAM存储.

????????(3)?图层数据访问接口可以是memory mapped AXI4接口或者AXI4-Stream接口

????????(4)?背景颜色支持可配置

????????(5)?叠加图层位置和大小支持可配置

????????(6)?支持1x, 2x, 4x的上采样放缩 -- 通过重复像素行实现

????????(7)?可选择的IP内实现颜色空间转换(color space conversion)和色度重采样(chroma re-sampling)

????????(8)?支持的颜色空间有RGB, YUV444, YUV422, YUV420

????????(9)?对于AXI4-Stream接口,支持传输的颜色深度(color depth/color component)是8,10,12和16 bits;对于Memory mapped AXI4接口,支持传输的颜色深度是8,10 bits

????????(10)?Supports semi-planar memory formats next to packed memory formats(这里我也不是很理解)

????????(11)?支持从64x64到8192x4320的空间分辨率

????????(12)?对于所有支持的device families,支持8K30fps

????????(13)?支持可编程配置的CSC coefficients以支持various calorimetry like BT601,BT709和BT2020.

注意:

????????(1)?除了Master layer外,其他的图层可以是memory mapped AXI4接口获得也可以是AXI4-Stream接口获得,Master layer只能是AXI4-Stream接口。

????????(2)?在Mixer IP中,每个图层在Z轴上的顺序是固定的。

????????(3)?Mixer IP的使用是不收费的,但是需要申请相应license的支持,该license可免费获得。

2. 产品规格说明(Product Specification)

2.1 性能(Performance) -- 最大时钟频率(Maximum Frequencies)

????????(1)?Virtex-7 and Virtex UltraScale devices with -2 speed grade or higher:300MHz

????????(2)?Kintex-7 and Kintex UltraScale devices with -2 speed grade or higher:300MHz

????????(3)?Artix-7 devices with -2 speed grade or higher: 150MHz

????????(4)?UltraScale+ devices with -1 speed grade or higher:300MHz

????????(5)?Versal ACAP devices with -1 speed grade or higher:300MHz

????????关于Throughput和Resource Utilization,根据具体的设置可以很容易计算出来。

2.2?端口描述(Port Descriptions)

?????????如上图所示为Video Mixer的例化接口图。从图可知,Video Mixer的接口类型可以分成5种。

????????(1)?用于IP内寄存器读写访问的AXI4-Lite控制接口(s_axi_CTRL)

????????(2)?用于视频流数据输入的AXI4-Stream接口(s_axis_video, s_axis_video1,etc.)

????????(3)?用于叠加后视频流数据输出的AXI4-Stream接口(m_axis_video)

????????(4)?用于从内存获取视频流数据输入的Memory mapped AXI4接口(m_axi_mm_video4,m_axi_mm_video5,etc.)

????????(5)?一些其它的通用控制信号--时钟信号(ap_clk),同步高复位信号(ap_rst_n),中断控制信号(interrupt)

注意:

????????(1)?接口形式的变化(数据位宽,接口个数,接口类型)由IDE设置中的The number of layers 和layer type(streaming or memory based)等决定。

????????(2)?在Video Mixer IP中只有一个时钟域,就是ap_clk。

2.3?寄存器空间(Register Space)

????????在Video Mixer中有一些特定的寄存器组,通过这些寄存器可以动态的控制该IP的工作模式。所有的寄存器的初始化的值为0.

2.3.1?顶层寄存器组(Top-Level Registers)

????????(1)?Control (0x0000) Register

????????该寄存器用于控制Video Mixer的操作。例如:启动,停止,flush挂起的AXI传输事务,以及设置运行模式为auto_restart模式等。

????????(2)?Global Interrupt Enable (0x0004) Register

????????该寄存器用于控制全部中断的使能。

????????(3)?IP Interrupt Enable (0x0008) Register

????????该寄存器用于控制中断使能选择,其中的两个中断源,ap_done在帧数据处理完成后产生中断信号;ap_ready在core准备好开始处理下一帧数据时产生中断信号。

????????(4)?IP Interrupt Status (0x000C) Register

????????该寄存器显示中断类型,当中断发生时,该寄存器中相应标志位被设置,通过读该寄存器可以直到中断源类型。

????????(5)?Width (0x0010) Register

????????该寄存器用于设置图层的有效像素宽大小(active pixels).支持的值的范围是从64到在IDE中设置的Maximum Number of Columns字段值的大小。注意,width的值需要乘以在IDE中设置的Samples per Clock的倍数。

????????(6)?Height (0x0018) Register

????????与Width Register相同,不一样的是该寄存器针对的是图层的有效高大小。

????????(7)?Background_Y_R (0x0028) Register

????????背景图层的红色R通道值或者Y的值。

????????(8)?Background_U_G(0x0030) Register

????????背景图层的绿色G通道值或者U的值。

????????(9)?Background_V_B(0x0038) Register

????????背景图层的蓝色B通道值或者V的值。

????????(10)?Layer Enable (0x0040) Register

????????该寄存器中的每一位对应了一层图像的使能。其中Bit[0]是master图层,即s_axis_video输入图层,这是最下面的图层,当master图层未使能时,其他图层将叠加在背景色图层上输出。

2.3.2 CSC Coefficient Registers(我没有用到,不是很熟悉)

2.3.3 图层寄存器组(Layer Registers)

?

?????????如上图所示,除了master图层和Logo图层外,其他的每个图层都独自具有如上所示的配置寄存器组。它除了基地址不一样外,偏移地址都相同,因此,在SDK软件访问配置时可以直接通过基址加Offset的形式访问。

????????(1)?Layer Alpha (0x0#00) Register

????????该寄存器能否配置需要在IDE中配置该core时,通过Enable Global Alpha字段来使能。该值的范围是0-256,0表示该图层全透明,256表示该图层全显示方式叠加。

????????(2)?Layer Start X (0x0#08) Register

????????该寄存器表示图层左上角的X坐标值,该值需乘以IDE中Sample per Clock字段的值。

????????(3)?Layer Start Y (0x0#10) Register

????????该寄存器表示图层左上角的Y坐标值,该值需乘以IDE中Sample per Clock字段的值。

????????(4)?Layer Width (0x0#18) Register

????????该寄存器表示图层的有效像素宽大小。值的范围是64到IDE中设置的Maximum Number of Columns的值。如果使能了Scaling,那么值的范围是64到IDE中设置的Layer Line Buffer Width字段的值。该值需要乘以IDE中设置的Samples Per Clock字段的值。

????????(5)?Layer Stride (0x0#20) Register

????????该寄存器在图层为streaming layer时没有使用。如果是memory layer,该值决定了在内存中,图层的一行数据起始地址到下一行数据起始地址的以字节为单位的差值。

????????(6)?Layer Height (0x0#28) Register

????????该寄存器与Layer Width Register相似,不同的是,该寄存器表示图层的有效像素的高大小。

? ? ? ? (7)?Layer Scale Factor (0x0#30) Register

????????该寄存器的值表示图层的缩放因子值,0表示不缩放,1表示放大2倍,2表示放大4倍

????????(8)?Layer Buffer Plane 1 (0x0#40) and Layer Plane 2 Buffer (0x0*4C) Registers

????????当layer是memory layer时,Layer Buffer Plane 1寄存器表示帧缓存的地址,相应的Layer Buffer?Plane 2寄存器也表示帧缓存的地址,双缓存模式。当layer是streaming layer时,当寄存器设置无效。

2.3.4 Logo图层寄存器组(Logo Layer Registers)

?????????如图所示,LOGO图层具有其他图层类似功能的寄存器,除了以下不同的寄存器:

????????(1)?Logo Color Key Min R, Min G, Min B, Max R, Max G, Max B

?????????(2)?Logo Red/Green/Blue/Alpha Buffer Register

????????这些寄存器存储的是Logo图层的各种颜色通道的在BRAM中的起始地址值(start address)

3 Video Mixer的结构

?????????如图所示,Video Mixer IP可以选择实现重采样和颜色空间转换等。

4 软件配置方式

????????在Video Mixer IP中有两种模式,一种是Auto Restart Mode(Default),该模式在我理解中是用于一直让Video Mixer自动叠加视频流数据而不需要在叠加完成后,通知CPU做处理,当禁止中断时,使用该模式:XVMix_InterruptDisable()。与之相对的就是Interrupt Mode,即当完成图层叠加后,产生中断,通知CPU,调用相应的回调函数做处理。这里,做视频流图层叠加因此,我采用的是Auto Restart Mode,即不使能Mixer的中断。

4.1 配置Master Layer

????????首先,配置Master Layer,这里需要留意的是,Mixer以Master Layer图层大小为最底层图层,其它图层的移位缩放后的大小即坐标必须在Master Layer中。当然,在不开启Master Layer图层时,叠加的最底层图层为背景图层(Background_R,Background_G,Background_B)

	/* Define parameter and structures */
	int Status;
	XVidC_VideoStream VidStream;
	XV_Mix_l2 *MixerPtr = &mix;
	XVidC_ColorFormat Cfmt;
	XVidC_VideoTiming const *TimingPtr;
	XVidC_VideoMode TestModes = XVIDC_VM_720_60_P;

	/* 1, Initialize Mixer IRQ */
    /* Hook up interrupt service routine */
    /* Status |= XScuGic_Connect(IntcPtr,
                            XPAR_FABRIC_V_MIX_0_INTERRUPT_INTR,
                            (XInterruptHandler)XVMix_InterruptHandler,
                            (void *)&mix);
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                               (Xil_ExceptionHandler) XScuGic_InterruptHandler,
                               IntcPtr);   */

    /* Enable the interrupt vector at the interrupt controller */
    /* XScuGic_Enable(IntcPtr, XPAR_FABRIC_V_MIX_0_INTERRUPT_INTR);*/

	/* 2, Mixer driver Init */
    Status  = XVMix_Initialize(&mix, XPAR_V_MIX_0_DEVICE_ID);
    if(Status != XST_SUCCESS) {
        xil_printf("ERROR:: Mixer device not found\r\n");
        //return(XST_FAILURE);
    }

    /* 3, Setup a default stream */
    XVMix_GetLayerColorFormat(&mix, XVMIX_LAYER_MASTER, &Cfmt);
    VidStream.PixPerClk     = 1;
    VidStream.ColorFormatId = Cfmt;
    VidStream.ColorDepth    = 8;

    /* 4, VidStream configurations */
    VidStream.VmId = TestModes;
    TimingPtr = XVidC_GetTimingInfo(VidStream.VmId);
    VidStream.Timing = *TimingPtr;
    VidStream.FrameRate = XVidC_GetFrameRate(VidStream.VmId);

    /* 5, Config Mixer based on VidStream */
    /* Setup default config after reset */
    XVMix_LayerDisable(MixerPtr, XVMIX_LAYER_MASTER);
    XVMix_SetVidStream(MixerPtr, &VidStream);

    //XVMix_SetBackgndColor(MixerPtr, XVMIX_BKGND_BLUE, StreamPtr->ColorDepth);

    XVMix_LayerEnable(MixerPtr, XVMIX_LAYER_MASTER);
    XVMix_InterruptDisable(MixerPtr);
    XVMix_Start(MixerPtr);

4.2 OSD子图层的配置

    /* 7, Enable OSD Layer */
     int layerIndex = XVMIX_LAYER_1;
     XVidC_VideoWindow Win;

     u32 Stride;

     /* 7.1 Set OSD Window */
     /* X,Y,W,H */
     //Win = {0,420,320,280};
     Win.StartX=0;
     Win.StartY=420;
     Win.Width=300;
     Win.Height=280;
     XVMix_GetLayerColorFormat(MixerPtr, layerIndex, &Cfmt);
     Stride = ((Cfmt == XVIDC_CSF_YCRCB_422) ? 2: 3); //BytesPerPixel
     Stride *= Win.Width;
     Status = XVMix_SetLayerWindow(MixerPtr, layerIndex, &Win, Stride);
     if(Status != XST_SUCCESS) {
         xil_printf("<ERROR:: Command Failed>\r\n");
     } else {
         xil_printf("Done\r\n");
     }

     /* 7.2 Set OSD Alpha */
     xil_printf("   Set Layer Alpha to %d: ", 200);
     if(XVMix_IsAlphaEnabled(MixerPtr, layerIndex)) {
       Status = XVMix_SetLayerAlpha(MixerPtr, layerIndex, 200);
       if(Status != XST_SUCCESS) {
         xil_printf("<ERROR:: Command Failed>\r\n");

       } else {
         xil_printf("Done\r\n");
       }
     } else {
         xil_printf("(Disabled in HW)\r\n");
     }

     /* 7.3 Set OSD Scale */
     if(XVMix_IsScalingEnabled(MixerPtr, layerIndex)) {
       Status = XVMix_SetLayerScaleFactor(MixerPtr,
                                          layerIndex,
                                          XVMIX_SCALE_FACTOR_1X);
       if(Status != XST_SUCCESS) {
         xil_printf("<ERROR:: Command Failed>\r\n");

       } else {
         xil_printf("Done\r\n");
       }
     } else {
         xil_printf("(Disabled in HW)\r\n");
     }

     /* 7.4 Enable OSD layer */
     Status = XVMix_LayerEnable(MixerPtr, layerIndex);
     if(Status != XST_SUCCESS) {
         xil_printf("<ERROR:: Command Failed>\r\n");

     } else {
         xil_printf("Done\r\n");
     }

    /* 7.5 Move OSD layer */
     Status = XVMix_MoveLayerWindow(MixerPtr,
                                    layerIndex,
                                    (0),
                                    (0));
     if(Status != XST_SUCCESS) {
       xil_printf("<ERROR:: Command Failed>\r\n");

     } else {
       xil_printf("Done\r\n");
     }
     /* 7.6 Set OSD Scale */
     if(XVMix_IsScalingEnabled(MixerPtr, layerIndex)) {
       Status = XVMix_SetLayerScaleFactor(MixerPtr,
                                          layerIndex,
                                          XVMIX_SCALE_FACTOR_2X);
       if(Status != XST_SUCCESS) {
         xil_printf("<ERROR:: Command Failed>\r\n");

       } else {
         xil_printf("Done\r\n");
       }
     } else {
         xil_printf("(Disabled in HW)\r\n");
     }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:58:43  更:2022-03-22 21:00:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:32:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码