100l (forgoten seeking functions)
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 11 Oct 2004 23:53:53 +0000 (23:53 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 11 Oct 2004 23:53:53 +0000 (23:53 +0000)
Originally committed as revision 3585 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avformat.h
libavformat/avidec.c
libavformat/ffm.c
libavformat/mov.c
libavformat/raw.c
libavformat/rtsp.c
libavformat/wav.c

index 997756b..239acf6 100644 (file)
@@ -441,7 +441,7 @@ int ff_wav_init(void);
 
 /* raw.c */
 int pcm_read_seek(AVFormatContext *s, 
-                  int stream_index, int64_t timestamp);
+                  int stream_index, int64_t timestamp, int flags);
 int raw_init(void);
 
 /* mp3.c */
index 156b255..774d55f 100644 (file)
@@ -649,7 +649,7 @@ static int locate_frame_in_index(AVIIndexEntry *entries,
     return m;
 }
 
-static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp)
+static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
 {
     AVIContext *avi = s->priv_data;
     AVStream *st;
index ce18d5f..2867d11 100644 (file)
@@ -627,7 +627,7 @@ static int64_t get_pts(AVFormatContext *s, offset_t pos)
 /* seek to a given time in the file. The file read pointer is
    positionned at or before pts. XXX: the following code is quite
    approximative */
-static int ffm_seek(AVFormatContext *s, int64_t wanted_pts)
+static int ffm_seek(AVFormatContext *s, int stream_index, int64_t wanted_pts, int flags)
 {
     FFMContext *ffm = s->priv_data;
     offset_t pos_min, pos_max, pos;
@@ -662,7 +662,7 @@ static int ffm_seek(AVFormatContext *s, int64_t wanted_pts)
             pos_min = pos + FFM_PACKET_SIZE;
         }
     }
-    pos = pos_min;
+    pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
     if (pos > 0)
         pos -= FFM_PACKET_SIZE;
  found:
index e82e2f1..b0f4b8b 100644 (file)
@@ -1846,7 +1846,7 @@ readchunk:
 /**
  * Seek method based on the one described in the Appendix C of QTFileFormat.pdf
  */
-static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp)
+static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
 {
     MOVContext* mov = (MOVContext *) s->priv_data;
     MOVStreamContext* sc;
index dadc495..23ba500 100644 (file)
@@ -126,7 +126,7 @@ static int raw_read_close(AVFormatContext *s)
 }
 
 int pcm_read_seek(AVFormatContext *s, 
-                  int stream_index, int64_t timestamp)
+                  int stream_index, int64_t timestamp, int flags)
 {
     AVStream *st;
     int block_align, byte_rate;
@@ -158,8 +158,11 @@ int pcm_read_seek(AVFormatContext *s,
         return -1;
 
     /* compute the position by aligning it to block_align */
-    pos = av_rescale(timestamp * byte_rate, st->time_base.num, st->time_base.den);
-    pos = (pos / block_align) * block_align;
+    pos = av_rescale_rnd(timestamp * byte_rate, 
+                         st->time_base.num, 
+                         st->time_base.den * (int64_t)block_align,
+                         (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
+    pos *= block_align;
 
     /* recompute exact position */
     st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
index 6037f90..af898ba 100644 (file)
@@ -1111,7 +1111,7 @@ static int rtsp_read_pause(AVFormatContext *s)
 }
 
 static int rtsp_read_seek(AVFormatContext *s, int stream_index, 
-                          int64_t timestamp)
+                          int64_t timestamp, int flags)
 {
     RTSPState *rt = s->priv_data;
     
index 841e153..0bc3c34 100644 (file)
@@ -344,7 +344,7 @@ static int wav_read_close(AVFormatContext *s)
 }
 
 static int wav_read_seek(AVFormatContext *s, 
-                         int stream_index, int64_t timestamp)
+                         int stream_index, int64_t timestamp, int flags)
 {
     AVStream *st;
 
@@ -359,7 +359,7 @@ static int wav_read_seek(AVFormatContext *s,
     default:
         break;
     }
-    return pcm_read_seek(s, stream_index, timestamp);
+    return pcm_read_seek(s, stream_index, timestamp, flags);
 }