You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.1 KiB
50 lines
1.1 KiB
|
|
#include <ffplay_define.h>
|
|
#include "MediaClock.h"
|
|
|
|
MediaClock::MediaClock() {
|
|
m_speed = 1.0;
|
|
m_pause = false;
|
|
setClock(NAN);
|
|
}
|
|
|
|
void MediaClock::setClock(double pts) {
|
|
double time = (double) av_gettime_relative() / 1000000.0;
|
|
setClock(pts, time);
|
|
}
|
|
|
|
void MediaClock::setClock(double pts, double time) {
|
|
m_pts = pts;
|
|
m_last_update = time;
|
|
m_pts_drift = m_pts - time;
|
|
}
|
|
|
|
double MediaClock::getClock() const {
|
|
if (m_pause) {
|
|
return m_pts;
|
|
} else {
|
|
double time = (double) av_gettime_relative() / 1000000.0;
|
|
return m_pts_drift + time - (time - m_last_update) * (1.0 - m_speed);
|
|
}
|
|
}
|
|
|
|
void MediaClock::setSpeed(double speed) {
|
|
setClock(getClock());
|
|
m_speed = speed;
|
|
}
|
|
|
|
double MediaClock::getSpeed() const {
|
|
return m_speed;
|
|
}
|
|
|
|
void MediaClock::syncToSlave(MediaClock *slave) {
|
|
double clock = getClock();
|
|
double slave_clock = slave->getClock();
|
|
if (!isnan(slave_clock) && (isnan(clock) || fabs(clock - slave_clock) > AV_NOSYNC_THRESHOLD)) {
|
|
setClock(slave_clock);
|
|
}
|
|
}
|
|
|
|
MediaClock::~MediaClock() {
|
|
|
|
} |