parent
							
								
									acc42e49d5
								
							
						
					
					
						commit
						b6feca2e8c
					
				| @ -0,0 +1,50 @@ | |||||||
|  | 
 | ||||||
|  | #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() { | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,45 @@ | |||||||
|  | 
 | ||||||
|  | #ifndef FFMPEGANDROID_MEDIACLOCK_H | ||||||
|  | #define FFMPEGANDROID_MEDIACLOCK_H | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | #include <libavutil/time.h> | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | class MediaClock { | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     bool m_pause; | ||||||
|  |     double m_pts; | ||||||
|  |     double m_speed; | ||||||
|  |     double m_pts_drift; | ||||||
|  |     double m_last_update; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     MediaClock(); | ||||||
|  | 
 | ||||||
|  |     void setClock(double pts); | ||||||
|  | 
 | ||||||
|  |     void setClock(double pts, double time); | ||||||
|  | 
 | ||||||
|  |     double getClock() const; | ||||||
|  | 
 | ||||||
|  |     void setSpeed(double speed); | ||||||
|  | 
 | ||||||
|  |     double getSpeed() const; | ||||||
|  | 
 | ||||||
|  |     void syncToSlave(MediaClock *slave); | ||||||
|  | 
 | ||||||
|  |     virtual ~MediaClock(); | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif //FFMPEGANDROID_MEDIACLOCK_H
 | ||||||
					Loading…
					
					
				
		Reference in new issue