UVC摄像头设备实现
+ -

UVC摄像头视频数据流

2022-03-09 1675 10

设备和主机之间的流式视频数据通过视频流接口的流式端点进行。通过以特定速率连续传输视频采样来流化视频。视频采样是指特定格式的解码器能够在一次传输中接受和解释的视频数据的编码块。

UVC示例中,视频数据采用压缩4:2:2 YUV格式(YUY2),视频样本对应于480x320像素的单个视频帧。每个视频样本被分成多个类定义的有效负载传输。有效载荷传输由类定义的有效载荷头和视频有效载荷数据组成。有效载荷格式如下所示:

对于同步端点,每个(微)帧将包含一个有效载荷传输。示例代码中的等时端点的最大分组大小为1024字节,因此排除有效负载报头长度,可在单个有效负载传输中为视频数据提供1012字节。

对于演示,视频数据在设备中生成,方法是用红色、绿色和蓝色值(YUV格式)填充缓冲区,如下代码所示。

  1. /* Fill video buffers with different color data */
  2. for(int i = 0; i < (PAYLOAD_SIZE/4); i++) {
  3. /* Set RED color */
  4. gVideoBuffer[0][i] = 0x7010D010;
  5. /* Set GREEN color */
  6. gVideoBuffer[2][i] = 0x00000000;
  7. /* Set BLUE color */
  8. gVideoBuffer[1][i] = 0xDC206020;
  9. }

这些缓冲区一起用于创建视频帧。VideoEndpointsHandler()中的以下代码显示了单个帧的传输

  1. /* Transmits single frame */
  2. while(expectedPixels > 0)
  3. {
  4. if(expectedPixels < (PAYLOAD_SIZE - PAYLOAD_HEADER_LENGTH)) {
  5. /* Payload transfer */
  6. result = XUD_SetBuffer(episo_in, (gVideoBuffer[index], unsigned char[]), expectedPixels+
  7. ,! PAYLOAD_HEADER_LENGTH);
  8. } else {
  9. /* Payload transfer */
  10. result = XUD_SetBuffer(episo_in, (gVideoBuffer[index], unsigned char[]), 1024);
  11. }
  12. / * Note down the SOF counts */
  13. sofCounts++;
  14. expectedPixels -= ((PAYLOAD_SIZE)- PAYLOAD_HEADER_LENGTH);
  15. if(expectedPixels <= (MAX_FRAME_SIZE - split)) {
  16. index = (index + 1) % 3;
  17. split += (MAX_FRAME_SIZE / 6);
  18. }
  19. }

上面的代码显示,“gVideoBuffer[]”保存有效负载数据,并持续发送到主机,直到每帧的预期像素数结束。以下有效负载代码填充了这些有效负载缓冲区。

  1. /* Fill the buffers with payload header */
  2. for(int i=0; i<3; i++)
  3. {
  4. /* Make the Payload header */
  5. (gVideoBuffer[i], unsigned char[])[0] = PAYLOAD_HEADER_LENGTH;
  6. (gVideoBuffer[i], unsigned char[])[1] = frame;
  7. /* Set dwPresentationTime */
  8. (gVideoBuffer[i], unsigned short[])[1] = pts;
  9. (gVideoBuffer[i], unsigned short[])[2] = pts>>16;
  10. /* Set scrSourceClock */
  11. (gVideoBuffer[i], unsigned short[])[3] = pts;
  12. (gVideoBuffer[i], unsigned short[])[4] = pts>>16;
  13. (gVideoBuffer[i], unsigned short[])[5] = (sofCounts>>3) & 2047;
  14. }

在上面的代码中,“pts”是表示时间戳,它是从xCORE设备中以100MHz的频率运行的计时器获得的。“pts”和帧开始计数器(USB SOF计数)用于到达源时钟参考字段。

负载数据头格式如下:
负载数据头

显示效果如下:
显示效果

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

UVC摄像头视频数据流
设备和主机之间的流式视频数据通过视频流接口的流式端点进行。通过以特定速率连续传输视频采样来流化视频。视频采样是指特定格式的解码器能够在一次传输中接受和解释的视频数据的编码块。在UVC示例中,视频数据采用压缩4:2:2 YUV格式(YUY2),视频样本对应于480x320像素的单个视频帧。每个视频样......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!