1. 概述
本文将利用LMH0341所采集到的实际数据,对照SMPTE 292M和SMPTE 274M标准协议,对数据进行解析,以加深对于BT1120数据格式的理解。
2. 图像的基本格式
根据协议,图像数据基本格式如下:

注:EAV = End of Active Video EIV = End of Inactive Video
SAV = Startof Active Video SIV = Start of Inactive Video
其中区域1,3,5为行消隐区,区域2,6为空白行,区域4为有效的图像数据
每一行数据以EAV/EIV为消隐区的开始 ,以SAV/SIV为数据区的开始,EAV/EIV和SAV/SIV的格式如下图

LN0和LN1用于指示行数,YCR0和YCR1是CRC校验值,XYZ用于指示这一行所代表的数据。EAV/EIV,SAV/SIV分别对应不同XYZ数据,具体可以参考下表:

LMH0341输出数据采用Interleaved data stream格式,如下图所示

3. 同步头分析
对照以上数据的基本格式,对于1080p/25Hz视频,同步头分别为:
EAV:0xFFFFF 0x00000 0x00000 0x9D274
SAV: 0xFFFFF 0x00000 0x00000 0x80200
EIV: 0xFFFFF 0x00000 0x00000 0xB62D8
SIV: 0xFFFFF 0x00000 0x00000 0xAB2AC
4.行列数分析
根据SMPTE 274M协议,对于1080p/25Hz视频,行列数规定如下:

1080p/25Hz视频单帧图像的总列数为2640列,行数为1125行;其中有效的列数为1920列,行数为1080行;
从第1行到第41行,第1122行到1125行为消隐行,无有效图像数据;从第42行到1121行包含有效的图像数据;
对于每一行中各部分的word(1word = 20bits)数如下表
| EAV | LN | CRC | 消隐区 | SAV | 图像数据 |
|---|---|---|---|---|---|
| 4 | 2 | 2 | 708 | 4 | 1920 |
本文所采用的数据:
https://download.youkuaiyun.com/download/Cesaroy/87240373?spm=1001.2014.3001.5503
https://download.youkuaiyun.com/download/Cesaroy/87315970?spm=1001.2014.3001.5503
从data21的数据来看:EIV(0xFFFFF 0x00000 0x00000 0xB62D8)到EAV(0xFFFFF 0x00000 0x00000 0x9D274)共有2640个数据,验证了单帧图像共有2640列。
data21中是连续的两行数据,刚好位于行消隐和行有效的交界处,由上面分析,EIV应该是第41行,而EAV应该是第42行。
data21中第一组EIV中的行数为:0xA92A4,0x80200,解析出来行数为41,第二组EAV中的行数为:0xAA2A8,0x80200,解析出来行数为42。
data31中同样是连续的两行数据,刚好位于行有效和行消隐的交界处,由上面分析,EAV应该是第1121行,而EIV应该是第1122行。
data31中第一组EAV中的行数为:0x61184,0x88220,解析出来行数为1121,第二组EIV中的行数为:0x62188,0x88220,解析出来行数为1122。
data32中同样是连续两行数据,前一帧图像最后一行EIV和下一帧图像第一行EIV,由上面分析,第一组EIV应该是第1125行,第二组EIV应该是第1行。
data32中第一组EIV中的行数为:0x65194,0x88220,解析出来行数为1125,第二组EIV中的行数为:0x81204,0x80200,解析出来行数为1。
5. 校验分析
根据SMPTE 292M协议,进行CRC校验数据包括:图像数据+EAV+LN;CRC校验使用的公式为 C R C ( X ) = X 18 + X 5 + X 4 + 1 CRC\left( X \right) =X^{18}+X^5+X^4+1 CRC(X)=X18+X5+X4+1。数据所含的两个CRC校验分别对应Y数据校验和U/V数据校验。
CRC校验可以利用CRC-GEN小工具生成,CRC-GEN可以自动生成VHDL或者Verilog代码。
CRC-GEN小工具地址:https://download.youkuaiyun.com/download/Cesaroy/87315972
SMPTE 292M协议是从高位开始生成,而CRC-GEN是从低位生成,所以在程序里面需要对高低位进行互换。利用CRC-GEN生成代码并转化为C代码如下
// data: 图像数据 + EAV + LN, length:1920 + 4 + 2 = 1926
uint32_t crc18_cal2(uint16_t *data, uint16_t length)
{
uint32_t i;
uint32_t crc = 0;
uint32_t lfsr_q_u32 = 0x00000000;
uint8_t lfsr_q[18] = {0};
uint8_t lfsr_c[18] = {0};
uint8_t data_in[10] = {0};
for (i = 0; i < 18; i++) {
lfsr_q[i] = (lfsr_q_u32 >> i) & 0x1;
}
while (length--) {
for (i = 0; i < 10; i++) { // 高低位互换
data_in[i] = ((*data) >> (9 - i)) & 0x1;
}
data++;
lfsr_c[0] = lfsr_q[8] ^ data_in[0];
lfsr_c[1] = lfsr_q[9] ^ data_in[1];
lfsr_c[2] = lfsr_q[10] ^ data_in[2];
lfsr_c[3] = lfsr_q[11] ^ data_in[3];
lfsr_c[4] = lfsr_q[8] ^ lfsr_q[12] ^ data_in[0] ^ data_in[4];
lfsr_c[5] = lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[13] ^ data_in[0] ^ data_in[1] ^ data_in[5];
lfsr_c[6] = lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[14] ^ data_in[1] ^ data_in[2] ^ data_in[6];
lfsr_c[7] = lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[15] ^ data_in[2] ^ data_in[3] ^ data_in[7];
lfsr_c[8] = lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[16] ^ data_in[3] ^ data_in[4] ^ data_in[8];
lfsr_c[9] = lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[17] ^ data_in[4] ^ data_in[5] ^ data_in[9];
lfsr_c[10] = lfsr_q[0] ^ lfsr_q[13] ^ lfsr_q[14] ^ data_in[5] ^ data_in[6];
lfsr_c[11] = lfsr_q[1] ^ lfsr_q[14] ^ lfsr_q[15] ^ data_in[6] ^ data_in[7];
lfsr_c[12] = lfsr_q[2] ^ lfsr_q[15] ^ lfsr_q[16] ^ data_in[7] ^ data_in[8];
lfsr_c[13] = lfsr_q[3] ^ lfsr_q[16] ^ lfsr_q[17] ^ data_in[8] ^ data_in[9];
lfsr_c[14] = lfsr_q[4] ^ lfsr_q[17] ^ data_in[9];
lfsr_c[15] = lfsr_q[5];
lfsr_c[16] = lfsr_q[6];
lfsr_c[17] = lfsr_q[7];
for (i = 0; i < 18; i++) {
lfsr_q[i] = lfsr_c[i];
}
}
crc = 0;
for (i = 0; i < 18; i++) { // 高低位互换
crc |= ((lfsr_q[17 - i] << i) & (0x1 << i));
}
return crc;
}
对于data31中的数据,Y分量计算出来的CRC为0x6de4,解码出来的CRC校验数据也是0x6de4。
6. 结束
本文旨在利用实际采集的数据反向理解BT1120数据格式。如有错误,欢迎指正。
本文深入解析BT1120数据格式,通过SMPTE标准协议分析图像的基本格式、同步头、行列数以及校验。针对1080p/25Hz视频,详细阐述了数据结构,包括EAV、SAV、EIV和SIV,并提供了实际数据验证。同时,介绍了CRC校验的实现和应用。
8740





