系统包含两个部分,1)FPGA采集卡端,配置输出视频格式为BT656; 2)DM8168端,配置输入格式为BT656。

1、bt656格式简介:
BT656为YUV422格式的视频数据定义了并行或串行接口,分辨率为720*486或720*576。BT656并行接口使用8bit或10bit的复合YUV数据和27MHz的时钟,不需使用传统的视频时序信号(HSYNC,VSYNC和BLANK),将时序代码嵌入到视频流中,可以减少芯片接口的引脚数量。这里采用的是720*576的8bit格式,时序如图1所示。

图1 时序
表1:SAV EAV插入值

2、DM8168端代码:


#include <stdbool.h>
#include <signal.h>#include "osa.h"
#include "ti_vsys.h"
#include "ti_vcap.h"
#include "ti_vdis.h"
#include "mcfw/src_linux/mcfw_api/usecases/multich_common.h"#define NUM_CAPTURE_DEVICES    1static void mcfw_chain_init(UInt32 scaleWidth, UInt32 scaleHeight);
static void mcfw_chain_deinit();/* signal handle for ctrl + c */
volatile bool g_quit = false;
static void sig_handle(int signo)
{printf("recived quit signal\n");g_quit = true;
}int main(int argc, char **argv)
{if (argc != 3) {printf("Usage: %s <scale width> <scale height>\n", argv[0]);exit(1);}UInt32 scaleWidth  = atoi(argv[1]);UInt32 scaleHeight = atoi(argv[2]);signal(SIGINT, sig_handle);/* init System, Capture and Display Module */VSYS_PARAMS_S prms_sys;VCAP_PARAMS_S prms_vcap;VDIS_PARAMS_S prms_vdis;Vsys_params_init(&prms_sys);Vcap_params_init(&prms_vcap);Vdis_params_init(&prms_vdis);prms_vdis.enableConfigExtVideoEncoder = FALSE;Vsys_init(&prms_sys);Vcap_init(&prms_vcap);Vdis_init(&prms_vdis);Vsys_configureDisplay(); // configure display/* construct capture and display chain */mcfw_chain_init(scaleWidth, scaleHeight); /* make chain start working */Vdis_start();Vcap_start();/* wait ctrl + c */while (! g_quit) { printf("Display frames... CTRL+C\n"); sleep(1);} /* stop working and deinit */Vcap_stop();Vdis_stop();mcfw_chain_deinit();Vsys_deConfigureDisplay();Vcap_exit();Vdis_exit();Vsys_exit();return 0;
}static void mcfw_chain_init(UInt32 scaleWidth, UInt32 scaleHeight)
{UInt32 i;System_linkControl( SYSTEM_LINK_ID_M3VPSS, SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES, NULL, 0, TRUE);/* chain: CAPTURE -> DEI -> DISPLAY */gVcapModuleContext.captureId    = SYSTEM_LINK_ID_CAPTURE;gVcapModuleContext.deiId[0]     = SYSTEM_LINK_ID_DEI_0;gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; /* capture link init */CaptureLink_CreateParams    prm_capture;CaptureLink_CreateParams_Init(&prm_capture);prm_capture.outQueParams[0].nextLink = gVcapModuleContext.deiId[0];prm_capture.numVipInst               = 1;prm_capture.tilerEnable              = FALSE;prm_capture.numBufsPerCh             = 8;prm_capture.maxBlindAreasPerCh       = 4;prm_capture.isPalMode = Vcap_isPalMode();prm_capture.doCropInCapture     = FALSE;prm_capture.enableSdCrop        = FALSE;/* capture instance init */CaptureLink_VipInstParams  *prm_cap_inst = &prm_capture.vipInst[0];prm_cap_inst->vipInstId          = (SYSTEM_CAPTURE_INST_VIP0_PORTA + 0 ) % SYSTEM_CAPTURE_INST_MAX;prm_cap_inst->inDataFormat       = SYSTEM_DF_YUV422P;prm_cap_inst->numOutput          = 1;prm_cap_inst->standard          = SYSTEM_STD_576I;  prm_cap_inst->videoIfMode       = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;prm_cap_inst->videoCaptureMode = DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;/* capture out init */CaptureLink_OutParams *prm_cap_out = &prm_cap_inst->outParams[0];prm_cap_out->dataFormat          = SYSTEM_DF_YUV422I_YUYV;prm_cap_out->scEnable            = FALSE;prm_cap_out->scOutWidth          = 720;prm_cap_out->scOutHeight         = 576;prm_cap_out->outQueId            = 0;/* De-Interleave link init */DeiLink_CreateParams        prm_dei;MULTICH_INIT_STRUCT(DeiLink_CreateParams, prm_dei);prm_dei.inQueParams.prevLinkId = gVcapModuleContext.captureId;prm_dei.inQueParams.prevLinkQueId = 0;// Set the scale parameters.prm_dei.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].scaleMode = DEI_SCALE_MODE_ABSOLUTE;prm_dei.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].absoluteResolution.outWidth  = scaleWidth;prm_dei.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0].absoluteResolution.outHeight = scaleHeight;for (i=1; i < DEI_LINK_MAX_CH; i++)prm_dei.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][i] = prm_dei.outScaleFactor[DEI_LINK_OUT_QUE_DEI_SC][0];prm_dei.enableOut[DEI_LINK_OUT_QUE_DEI_SC]              = TRUE; prm_dei.outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink  = gVdisModuleContext.displayId[0];prm_dei.comprEnable                                     = FALSE;prm_dei.setVipScYuv422Format                            = FALSE;prm_dei.enableDeiForceBypass = TRUE;/* Display link init */DisplayLink_CreateParams    prm_dis;MULTICH_INIT_STRUCT(DisplayLink_CreateParams, prm_dis);prm_dis.inQueParams[0].prevLinkId    = gVcapModuleContext.deiId[0];prm_dis.inQueParams[0].prevLinkQueId = DEI_LINK_OUT_QUE_DEI_SC;prm_dis.displayRes                   = VSYS_STD_1080P_60;/* create link */System_linkCreate(gVcapModuleContext.captureId, &prm_capture, sizeof(prm_capture));System_linkCreate(gVcapModuleContext.deiId[0], &prm_dei, sizeof(prm_dei));System_linkCreate(gVdisModuleContext.displayId[0], &prm_dis, sizeof(prm_dis));/* setting frames from which channel should be display */DisplayLink_SwitchChannelParams prm_switch_ch;prm_switch_ch.activeChId = 0;System_linkControl(gVdisModuleContext.displayId[0], DISPLAY_LINK_CMD_SWITCH_CH, &prm_switch_ch, sizeof(prm_switch_ch), TRUE);
}static void mcfw_chain_deinit()
{System_linkDelete(gVcapModuleContext.captureId);System_linkDelete(gVcapModuleContext.deiId[0]);System_linkDelete(gVdisModuleContext.displayId[0]);
}

重点注意cap模块的参数配置。

2、FPGA采集卡端代码:RGB888 to BT656

module bt656 (output [7: 0] oData,output [10:0] oRow,output [10:0] oCol,input [7: 0] iY,input [7: 0] iCb,input [7: 0] iCr,input iRST_N,input iCLK_27);reg [10:0] col_n;
reg [10:0] row_n;
reg [7:0] sdata;
reg [7:0] ssdata;
reg [9:0] y1,cb1,cr1;
assign oData = sdata;parameter ROW_MAX = 624;
parameter COL_MAX = 1727;reg [7: 0] mY;
reg [7: 0] mCb;
reg [7: 0] mCr;assign oRow = (row_n >= 335) ? row_n - 335: ( row_n >= 22 ? row_n - 22: 0);
assign oCol = (col_n >  287) ? ((col_n - 288) >> 1): 0;always@(posedge iCLK_27)
begin                                                       y1 = (66*iY + 129*iCb + 25*iCr+4096)>>8;  mY <= (y1[9:8]==2'b00) ? y1[7:0] : (y1[9]==0) ? 8'b11101011 : y1[9:2];
end
//================================================================
always@(posedge iCLK_27)
begin  cb1 = (112*iCr-38*iY - 75*iCb+32768)>>8; mCb <= (cb1[9:8]==2'b00) ? cb1[7:0] : (cb1[9]==0) ? 8'b11110000 : cb1[9:2];
end
//================================================================
always@(posedge iCLK_27)
begin                                                        cr1 = (112*iY - 94*iCb - 18*iCr+32768)>>8 ; mCr <= (cr1[9:8]==2'b00) ? cr1[7:0] : (cr1[9]==0) ? 8'b11110000 : cr1[9:2];
end   `endif// Create ROW AND COL
always @ (posedge iCLK_27 or negedge iRST_N )
beginif (!iRST_N) begin     col_n <= 0; //285;row_n <= 0; //ROW_MAX;      endelse beginif (col_n == COL_MAX) begin    col_n <= 0;row_n <= (row_n == ROW_MAX) ? 0: (row_n + 1);endelse begincol_n <= col_n + 1;endend
endalways @ (posedge iCLK_27 or negedge iRST_N )
beginif (!iRST_N) begin         sdata <= 8'h80;ssdata <= 8'h80;endelse begin      // FF0000if (col_n == 0 || col_n == 284)sdata <= 8'hFF;else if (col_n == 1 || col_n == 2 || col_n == 285 || col_n == 286)sdata <= 8'h00;                  // EAVelse if (col_n == 3) beginif ( ((row_n >= 0) && (row_n < 22)) || (row_n == 310) || (row_n == 311))sdata <= 8'hB6;else if ((row_n >= 22) && (row_n < 310))sdata <= 8'h9D;else if ( ((row_n >= 312) && (row_n < 335)) || (row_n == 623) || (row_n == 624))sdata <= 8'hF1;elsesdata <= 8'hDA;end   // BLACKINGelse if ((col_n > 3) &&(col_n < 284) ) beginsdata <= col_n[0]? 8'h10: 8'h80;    end// SAV       else if (col_n == 287) beginif ( ((row_n >= 0) && (row_n < 22)) || (row_n == 310) || (row_n == 311))sdata <= 8'hAB;else if ((row_n >= 22) && (row_n < 310))sdata <= 8'h80;else if ( ((row_n >= 312) && (row_n < 335)) || (row_n == 623) || (row_n == 624))sdata <= 8'hEC;elsesdata <= 8'hC7;end// DATAelse beginif (((row_n >= 22) && (row_n < 310)) || ((row_n >= 335) && (row_n < 623)) ) begincase (col_n[1: 0])2'b00: sdata <= mCb;2'b01: sdata <= mY;2'b10: sdata <= mCr;               2'b11: sdata <= mY;default: sdata <= 8'h80;endcase    endelse begincase (col_n[1: 0])2'b00: sdata <= 8'h80;2'b01: sdata <= 8'h10;2'b10: sdata <= 8'h80;              2'b11: sdata <= 8'h10;default: sdata <= 8'h80;endcase endendend
endendmodule

步骤:

  1. 编写FPGA代码;
  2. 修改DM8168采集代码;

编写最基本的采集显示代码,软件环境(DVRRDK开发环境),链路为

cap -> dei -> dis ,该链路主要对采集视频进行缩放操作。

执行的指令如下:

# target : ./init

# target : ./load

# target : ./cap_scale_dis.out 1920 1080

Bt656最终测试波形图

DM8168 - BT656格式视频采集相关推荐

  1. 使用OPENNI2来对Kinect2.0进行.ONI格式视频采集

    基于前两篇博客的基础上,可以对Kinect2.0进行ONI格式的视频采集了. 采集程序如下 Status CCaptrueThread::gr_init_kinect(CString videoPat ...

  2. 入门视频采集与处理(BT656简介) 转

    凡是做模拟信号采集的,很少不涉及BT.656标准的,因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号,那么,BT.656到底是何种格式呢?       本文将主要介绍 标准的 8bit ...

  3. 入门视频采集与处理(BT656简介)

    凡是做模拟信号采集的,很少不涉及BT.656标准的,因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号,那么,BT.656到底是何种格式呢? 本文将主要介绍 标准的 8bit BT656( ...

  4. m3u8解析_浅谈m3u8格式视频文件采集

    在对某在线视频网站抓包分析时,发现该站点采用m3u8格式进行视频文件传输. 通过m3u8的response可以看到,m3u8格式文件由很多段ts文件组成.那么什么是m3u8,什么是ts呢? M3U8是 ...

  5. FFMPEG采集摄像头图像SDL渲染+MP4格式视频编码

    FFMPEG采集摄像头图像SDL渲染+MP4格式视频编码 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音 ...

  6. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  7. V4L2编程 视频采集

    V4L2编程 以前做的智能家居的项目用的是Linux2.6.13的核,使用的中星微的摄像头,移植了spcaview进行图像的获取,后来用了2.6.29的核,发现以前移植的spcaview不能用了,后来 ...

  8. 入门视频采集与处理(学会分析YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

  9. 嵌入式LINUX环境下视频采集知识

    Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口,配合适当的视频采集设备和相应的 ...

最新文章

  1. rwkj 1422搜索(素数环)
  2. AWS如何迁移实例到另一个区?
  3. 力扣1025.除数博弈
  4. 华为应用锁退出立即锁_华为P40系列三大安全锁,教你锁住你的隐私 - 企业资讯...
  5. [Ext JS6]Sencha Cmd
  6. Raid Level,该如何为Oracle存储选择才好?
  7. 在WPF里面实现以鼠标位置为中心缩放移动图片
  8. 文库/豆丁网等免账号,积分下载器
  9. 层次分析法(AHP)及源代码实现
  10. 当前的安全设置不允许从该位置下载文件
  11. 把一个人的特点写具体作文_五年级把一个人的特点写具体作文500字5篇
  12. 我上传的CSDN资源无法使用的处理方法
  13. mysqli_fetch_assoc()和mysqli_fetch_array()的区别与用法
  14. laravel5.4新特性
  15. PC端-中文转拼音后续问题
  16. 我的大学(学习-上)
  17. 【小5聊】小程序之体验版本wx.chooseImage选择图片上传可以,而线上正式版本选择图片一闪而过的原因
  18. I am a MCAD.
  19. c加加中print是什么意思_钻石净度中的vs什么意思?
  20. 用Javascript实现随机验证码

热门文章

  1. MOOC - 数据库系统概论(基础篇)- 第二次考试
  2. python 3教程:基于python3实现倒叙字符串
  3. (解决 fatal error C1083: 无法打开包括文件:“xxxxxxxxx.h”: No such file or directory)VS和Eclipse添加新文件/文件夹路径步骤
  4. OFD转PDF(免费、不限次数、极速、安全)
  5. 正态分布检验:检验序列数据是否符合正态分布
  6. Tuxera NTFS21Mac苹果电脑读取硬盘磁盘软件
  7. js实现点击按钮图片自动切换_☆往事随風☆的博客
  8. 2018校招笔试题——网易编程题跳石板
  9. 建站百科|手把手教你如何申请网站空间
  10. 大疆文档(8)-Android教程-模拟器App