A/V Synch in ffmpeg patch by (Luca Abeni <lucabe72 at email dot it>)
authorLuca Abeni <lucabe72@email.it>
Fri, 18 Jun 2004 03:03:32 +0000 (03:03 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 18 Jun 2004 03:03:32 +0000 (03:03 +0000)
Originally committed as revision 3233 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c
libavformat/audio.c

index 4023ebf..3012aa8 100644 (file)
--- 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;i<nb_ostreams;i++) {
             double pts;
             ost = ost_table[i];
             os = output_files[ost->file_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();
     }
 
index e3e5888..5296333 100644 (file)
@@ -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)))) {