summaryrefslogtreecommitdiff
path: root/src/rmd_timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rmd_timer.c')
-rw-r--r--src/rmd_timer.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/rmd_timer.c b/src/rmd_timer.c
index a523166..dd7b26c 100644
--- a/src/rmd_timer.c
+++ b/src/rmd_timer.c
@@ -51,8 +51,7 @@ static void sync_streams(ProgData *pdata, unsigned int *frame_step, struct times
int avd;
pthread_mutex_lock(&pdata->avd_mutex);
- avd = pdata->avd;
- pthread_mutex_unlock(&pdata->avd_mutex);
+ avd = pdata->avd + pdata->frametime;
/* There are two knobs available for keeping the video synchronized with the audio:
* 1. frame_step; how many frames to encode from this frame (aka dropping frames if > 1)
@@ -72,6 +71,7 @@ static void sync_streams(ProgData *pdata, unsigned int *frame_step, struct times
if (frames_behind > 0) {
/* more than a whole frame behind, drop frames to catch up */
*frame_step += frames_behind;
+ avd += frames_behind * pdata->frametime;
} else {
/* less than a whole frame behind, just sleep less */
*delay = us_to_timespec(pdata->frametime + avd);
@@ -82,6 +82,9 @@ static void sync_streams(ProgData *pdata, unsigned int *frame_step, struct times
*delay = us_to_timespec(pdata->frametime + avd);
}
+ pdata->avd = avd;
+ pthread_mutex_unlock(&pdata->avd_mutex);
+
#if 0
printf("avd: %i frame_step: %u delay: %lu,%lu\n",
avd, *frame_step, (*delay).tv_sec, (*delay).tv_nsec);
© All Rights Reserved