Datetime 如何同步独立的自由运行硬件时间戳组件?

Datetime 如何同步独立的自由运行硬件时间戳组件?,datetime,time,video-capture,Datetime,Time,Video Capture,我正在使用一个来自中国视频压缩板的API,这个API有点“不友好”。在从驱动程序返回的每个视频帧缓冲区中,都有一个视频时间戳。但是,时间戳分为两个独立的自由运行组件: 1) 定义为的日期时间结构 struct DateTime { unsigned long second :6; // 0-59 unsigned long minute :6; // 0-59 unsigned long hour :5; // 0-23 unsi

我正在使用一个来自中国视频压缩板的API,这个API有点“不友好”。在从驱动程序返回的每个视频帧缓冲区中,都有一个视频时间戳。但是,时间戳分为两个独立的自由运行组件:

1) 定义为的日期时间结构

struct DateTime
{
    unsigned long second    :6;   // 0-59
    unsigned long minute    :6;   // 0-59
    unsigned long hour      :5;   // 0-23
    unsigned long day       :5;   // 1-31
    unsigned long month     :4;   // 1-12
    unsigned long year      :6;   // 2000-2063
};
2) 一种自由运行的16位(2字节)无符号毫秒计数器,可滚动

这两个时间戳之间没有同步。毫秒翻转与DateTime.second增量不对应。对毫秒计时器执行简单的模1000除法也不对应于DateTime.second增量


我需要想出一种方法,将这两种方法结合到一个统一的视频帧时间戳中,这个时间戳总是单调递增的。我希望保留驱动程序提供的原始时间戳,但是覆盖它们并附加我自己的时间戳也是一个选项。非常感谢您的任何建议

我想出了一个暂时可行的解决方案。只是为了完整起见,把它贴在这里。我的方法是保持16位无符号毫秒计数器(名为'm_timeStampOffset')的运行值,但仅在DateTime.second发生更改时更新:

// called at video frame rate
if (m_prevSecond != header.timeStamp.second)
{
    // save current value of 16bit millisec counter
    m_timeStampOffset = header.timeMs;
    m_prevSecond = header.timeStamp.second;
}
然后,稍后在客户端请求期间形成完整的视频帧时间戳时,找到当前header.timeMs和保存的m_timeStampOffset之间的差异,并将其用作真正的毫秒时间戳:

#define USHORT_DIFF(t0, t1)     (((t1) < (t0)) ? 0xFFFF - (t0) + (t1) : (t1) - (t0));
// returns the full timestamp
void get_full_timestamp(VIDEO_TIMESTAMP& ts)
{
    ts.year   = 2000 + header.timeStamp.year;
    ts.month  = header.timeStamp.month;
    ts.day    = header.timeStamp.day;
    ts.hour   = header.timeStamp.hour;
    ts.minute = header.timeStamp.minute;
    ts.second = header.timeStamp.second;

    ts.milliseconds = USHORT_DIFF(m_timeStampOffset, header.timeMs);
    ts.milliseconds %= 1000;
}
#定义USHORT_DIFF(t0,t1)(((t1)<(t0))?0xFFFF-(t0)+(t1):(t1)-(t0));
//返回完整的时间戳
无效获取完整时间戳(视频时间戳和ts)
{
ts.year=2000+header.timeStamp.year;
ts.month=header.timeStamp.month;
ts.day=header.timeStamp.day;
ts.hour=header.timeStamp.hour;
ts.minute=header.timeStamp.minute;
ts.second=header.timeStamp.second;
ts.millizes=USHORT\u DIFF(m\u timeStampOffset,header.timeMs);
ts.ms%=1000;
}