changeset 1755:41160bae24b5 libavformat

Fix audio corruption when cutting. Patch by Wolfram Gloger, wmglo dent dot med dot uni-muenchen dot de.
author takis
date Mon, 05 Feb 2007 02:08:57 +0000
parents 1f7a6dc01100
children 5d72afc6c8aa
files utils.c
diffstat 1 files changed, 10 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/utils.c	Sun Feb 04 17:05:44 2007 +0000
+++ b/utils.c	Mon Feb 05 02:08:57 2007 +0000
@@ -1558,7 +1558,7 @@
 #define DURATION_MAX_READ_SIZE 250000
 
 /* only usable for MPEG-PS streams */
-static void av_estimate_timings_from_pts(AVFormatContext *ic)
+static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset)
 {
     AVPacket pkt1, *pkt = &pkt1;
     AVStream *st;
@@ -1650,10 +1650,10 @@
 
     fill_all_stream_timings(ic);
 
-    url_fseek(&ic->pb, 0, SEEK_SET);
+    url_fseek(&ic->pb, old_offset, SEEK_SET);
 }
 
-static void av_estimate_timings(AVFormatContext *ic)
+static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
 {
     int64_t file_size;
 
@@ -1671,7 +1671,7 @@
          !strcmp(ic->iformat->name, "mpegts")) &&
         file_size && !ic->pb.is_streamed) {
         /* get accurate estimate from the PTSes */
-        av_estimate_timings_from_pts(ic);
+        av_estimate_timings_from_pts(ic, old_offset);
     } else if (av_has_timings(ic)) {
         /* at least one components has timings - we use them for all
            the components */
@@ -1765,10 +1765,12 @@
 }
 
 /**
- * Read the beginning of a media file to get stream information. This
+ * Read packets of a media file to get stream information. This
  * is useful for file formats with no headers such as MPEG. This
- * function also compute the real frame rate in case of mpeg2 repeat
+ * function also computes the real frame rate in case of mpeg2 repeat
  * frame mode.
+ * The logical file position is not changed by this function;
+ * examined packets may be buffered for later processing.
  *
  * @param ic media file handle
  * @return >=0 if OK. AVERROR_xxx if error.
@@ -1783,6 +1785,7 @@
     int64_t last_dts[MAX_STREAMS];
     int duration_count[MAX_STREAMS]={0};
     double duration_error[MAX_STREAMS][MAX_STD_TIMEBASES]={{0}}; //FIXME malloc()?
+    offset_t old_offset = url_ftell(&ic->pb);
 
     for(i=0;i<ic->nb_streams;i++) {
         st = ic->streams[i];
@@ -1989,7 +1992,7 @@
         }
     }
 
-    av_estimate_timings(ic);
+    av_estimate_timings(ic, old_offset);
 #if 0
     /* correct DTS for b frame streams with no timestamps */
     for(i=0;i<ic->nb_streams;i++) {