diff --git a/ffmpeg.c b/ffmpeg.c index 25cfba6f68..9defc3cf3b 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -163,6 +163,7 @@ typedef struct AVOutputStream { /* input pts and corresponding output pts for A/V sync */ double sync_ipts; + double sync_ipts_offset; INT64 sync_opts; /* video only */ AVPicture pict_tmp; /* temporary image for resizing */ @@ -541,12 +542,24 @@ static void do_video_out(AVFormatContext *s, double vdelta; if (ost->sync_ipts != AV_NOPTS_VALUE) { - vdelta = (double)(ost->st->pts.val) * s->pts_num / s->pts_den - ost->sync_ipts; - if (vdelta < -AV_DELAY_MAX) - nb_frames = 2; - else if (vdelta > AV_DELAY_MAX) - nb_frames = 0; - //printf("vdelta=%f\n", vdelta); + vdelta = (double)(ost->st->pts.val) * s->pts_num / s->pts_den - (ost->sync_ipts - ost->sync_ipts_offset); + if (vdelta < 100 && vdelta > -100) { + if (vdelta < -AV_DELAY_MAX) + nb_frames = 2; + else if (vdelta > AV_DELAY_MAX) + nb_frames = 0; + } else { + ost->sync_ipts_offset -= vdelta; + } + +#if 0 + { + static char *action[] = { "drop frame", "copy frame", "dup frame" }; + printf("Input PTS %12.6f, output PTS %12.6f: %s\n", + (double) ost->sync_ipts, (double) ost->st->pts.val * s->pts_num / s->pts_den, + action[nb_frames]); + } +#endif } } if (nb_frames <= 0)