我正在使用来自中国视频压缩板的API,这种压缩板有些不友好'在从驱动程序返回的每个视频帧缓冲区中,都有一个视频时间戳。但是,时间戳分为两个独立的自由运行组件:
1)DateTime结构定义为
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增量。
我需要想出一种方法将这两者组合成一个统一的视频帧时间戳,这个时间戳总是单调增加。我想保留驱动程序提供的原始时间戳,但是覆盖它们并附加我自己的时间戳也是一种选择。非常感谢任何建议!
答案 0 :(得分:0)
我想出了一个目前似乎有用的解决方案。只需将其发布在此处即可完成。我的方法是保持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;
}