From 6e454c38b0e67c9df68492bc7fb00c7f4c911abb Mon Sep 17 00:00:00 2001 From: Luca Abeni Date: Fri, 18 Jun 2004 03:03:32 +0000 Subject: [PATCH] A/V Synch in ffmpeg patch by (Luca Abeni ) Originally committed as revision 3233 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 16 +++++++++++----- libavformat/audio.c | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 4023ebf84b..3012aa826c 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -225,6 +225,7 @@ static int64_t audio_size = 0; static int64_t extra_size = 0; static int nb_frames_dup = 0; static int nb_frames_drop = 0; +static int input_sync; #define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass" @@ -1655,16 +1656,20 @@ static int av_encode(AVFormatContext **output_files, /* select the stream that we must read now by looking at the smallest output pts */ file_index = -1; - pts_min = 1e10; + pts_min = 1e100; for(i=0;ifile_index]; ist = ist_table[ost->source_index]; - if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO) - pts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate; - else - pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den; + if (input_sync == 0) { + if(ost->st->codec.codec_type == CODEC_TYPE_VIDEO) + pts = (double)ost->sync_opts * ost->st->codec.frame_rate_base / ost->st->codec.frame_rate; + else + pts = (double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den; + } else { + pts = (double)ist->pts; + } if (!file_table[ist->file_index].eof_reached && pts < pts_min) { pts_min = pts; @@ -3792,6 +3797,7 @@ int main(int argc, char **argv) } if (nb_input_files == 0) { + input_sync = 1; prepare_grab(); } diff --git a/libavformat/audio.c b/libavformat/audio.c index e3e5888e9b..5296333669 100644 --- a/libavformat/audio.c +++ b/libavformat/audio.c @@ -263,6 +263,7 @@ static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt) if (ret == -1 && (errno == EAGAIN || errno == EINTR)) { av_free_packet(pkt); pkt->size = 0; + pkt->pts = av_gettime() & ((1LL << 48) - 1); return 0; } if (!(ret == 0 || (ret == -1 && (errno == EAGAIN || errno == EINTR)))) {