我想为我的 UVC 设备实现 PTS 和 SRC 值,但在知道如何获取这些值时遇到了一些困难。 我遇到了一个讨论这些值的 话题 ,但我对 pts 和 SRC 的 STC 值如何使用 cyu3pgettime 和 0.1us 时间戳( 在本KBA中解释) 感到困惑。 根据规范,PTS 和 STC 都依赖 dwclockFrequency 作为单位,所以这让我觉得 PTS 和 STC 的值使用相同的源时钟。 这是正确的吗? 如果不是,如果我的时钟设置为 403.2MHz 和 100MHz GPIF,PTS 和 STC 应该使用哪个时钟? 我是否将 dwclockFrequency 设置为 403.2MHz?
我的理解是,当收到 CY_U3P_DMA_CB_PROD_EVENT 事件时,PTS 和 STC 都是在新帧开始时拍摄的。 由于它们都具有相同的单元,因此它们都来自同一个时钟源。 它们也是恒定的。 这是正确的吗?
我知道 SRC 在一些重要性更高的位中包含帧计数器,但这似乎相当简单,因为它只计算通过 FX3 的完整帧数。 关于计数器,我唯一的问题是我的计数器的位如何与 SRC 字段的 42-32 位对齐?
计数器的位如何与SRC字段的42-32位对齐?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
关注
引自免费微信小程序:皆我百晓生
在实现UVC设备的PTS和SRC值时,首先我们需要明确几个关键概念:
- PTS (Presentation Time Stamp):表示视频数据应该显示的时间戳。
- STC (System Time Code):系统时间码,用于同步不同设备的时间。
- SRC (Stream Relative Counter):流相对计数器,包含了帧计数器信息。
对于你的问题,让我们一步步解决:
1. 时钟频率
根据你的描述,你的系统有两套时钟:403.2MHz和100MHz GPIF。你需要确认哪个时钟作为dwclockFrequency的基础。通常情况下,PTS和STC使用的时钟应该是与视频数据传输相关的最高速度的时钟。如果你的视频数据是通过100MHz的GPIF接口传输,那么100MHz可能是合适的时钟选择。但具体取决于你的硬件设计和实际需求。
uint64_t dwclockFrequency = 100000000; // Assuming 100 MHz clock frequency
2. PTS和STC的计算
PTS和STC都是基于这个选定的时钟频率来计算的。你提到的0.1us时间戳可能是指每两个连续帧之间的时间间隔。这样,你可以计算出每个帧对应的时钟周期数。
double timestamp_per_frame = 0.1e-6; // 0.1 microsecond per frame int cycles_per_frame = dwclockFrequency * timestamp_per_frame;
3. 计数器与SRC的对齐
为了确保计数器的正确对齐,你需要知道FX3内部有多少位用来存储SRC。假设FX3的SRC有48位,其中前32位是时间戳,后16位是帧计数器。你需要将计数器的值转换成二进制,并填充到SRC的相应位置。
// 假设你有一个名为frameCounter的变量,它记录了完整的帧数 uint32_t frameCounter; // 将帧计数器扩展到16位,因为FX3的帧计数器是16位 uint32_t extendedFrameCounter = frameCounter << 16; // Shift left by 16 bits to make room for time stamp // 现在,你需要将时间戳转换成二进制,然后组合到SRC中 uint64_t currentTimestampInCycles = ... // Calculate the current timestamp in cycles based on your logic uint64_t srcValue = currentTimestampInCycles | extendedFrameCounter;
在这个例子中,
currentTimestampInCycles
是当前帧的时钟周期数,extendedFrameCounter
是帧计数器的16位扩展。然后,我们将这两个值按位或操作(|
),以便将它们组合在一起形成完整的SRC值。4. 事件处理
当接收到CY_U3P_DMA_CB_PROD_EVENT事件时,你应该更新PTS、STC和SRC。注意,这里的时间戳可能需要考虑到从上一帧到当前帧的时间差,而不是仅仅计算每帧的固定间隔。
注意事项
请根据你的实际硬件配置和软件库调整上述代码。此外,确保你的计数器不会溢出。如果帧计数器超过16位,你可能需要定期重置它,或者使用更复杂的方法来处理溢出情况。
如果你有更多的疑问或者需要进一步的帮助,请随时告诉我。我会根据你的反馈提供更多的指导。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
- ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
- ¥30 NIRfast软件使用指导
- ¥20 matlab仿真问题,求功率谱密度
- ¥15 求micropython modbus-RTU 从机的代码或库?
- ¥15 django5安装失败
- ¥15 Java与Hbase相关问题
- ¥15 后缀 crn 游戏文件提取资源
- ¥20 bash代码推送不上去 git fetch origin master #失败了
- ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开