@ -295,9 +295,10 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample)
uint8_t * buf ;
int buf_size ; /* todo should be a long? */
int index ;
int64_t cur time ;
int64_t orig_cur time;
int64_t chosen time ;
int64_t sample time;
int64_t graphtime ;
int use_sample_time = 1 ;
const char * devtypename = ( devtype = = VideoDevice ) ? " video " : " audio " ;
IReferenceClock * clock = pin - > filter - > clock ;
int64_t dummy ;
@ -313,24 +314,27 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample)
s = priv_data ;
ctx = s - > priv_data ;
IMediaSample_GetTime ( sample , & orig_curtime , & dummy ) ;
orig_curtime + = pin - > filter - > start_time ;
IMediaSample_GetTime ( sample , & sampletime , & dummy ) ;
IReferenceClock_GetTime ( clock , & graphtime ) ;
if ( devtype = = VideoDevice & & ! ctx - > use_video_device_timestamps ) {
/* PTS from video devices is unreliable. */
IReferenceClock_GetTime ( clock , & curtime ) ;
chosentime = graphtime ;
use_sample_time = 0 ;
} else {
IMediaSample_GetTime ( sample , & curtime , & dummy ) ;
if ( curtime > 400000000000000000LL ) {
if ( sampletime > 400000000000000000LL ) {
/* initial frames sometimes start < 0 (shown as a very large number here,
like 437650244077016960 which FFmpeg doesn ' t like .
like 437650244077016960 which FFmpeg doesn ' t like ) .
TODO figure out math . For now just drop them . */
av_log ( NULL , AV_LOG_DEBUG ,
" dshow dropping initial (or ending) frame with odd PTS too high % " PRId64 " \n " , cur time) ;
" dshow dropping initial (or ending) frame with odd PTS too high % " PRId64 " \n " , sample time) ;
return S_OK ;
}
curtime + = pin - > filter - > start_ time ;
chosentime = sample time ;
}
// media sample time is relative to graph start time
sampletime + = pin - > filter - > start_time ;
if ( use_sample_time )
chosentime + = pin - > filter - > start_time ;
buf_size = IMediaSample_GetActualDataLength ( sample ) ;
IMediaSample_GetPointer ( sample , & buf ) ;
@ -338,8 +342,8 @@ long ff_dshow_meminputpin_Receive(DShowMemInputPin *this, IMediaSample *sample)
av_log ( NULL , AV_LOG_VERBOSE , " dshow passing through packet of type %s size %8d "
" timestamp % " PRId64 " orig timestamp % " PRId64 " graph timestamp % " PRId64 " diff % " PRId64 " %s \n " ,
devtypename , buf_size , curtime , orig_cur time , graphtime , graphtime - orig_cur time, ctx - > device_name [ devtype ] ) ;
pin - > filter - > callback ( priv_data , index , buf , buf_size , cur time , devtype ) ;
devtypename , buf_size , chosentime , sample time , graphtime , graphtime - sample time, ctx - > device_name [ devtype ] ) ;
pin - > filter - > callback ( priv_data , index , buf , buf_size , chosen time , devtype ) ;
return S_OK ;
}