[Ffmpeg-cvslog] r5814 - in trunk/libavformat: avformat.h ogg2.c utils.c
reimar
subversion
Sun Jul 23 20:19:34 CEST 2006
Author: reimar
Date: Sun Jul 23 20:19:33 2006
New Revision: 5814
Modified:
trunk/libavformat/avformat.h
trunk/libavformat/ogg2.c
trunk/libavformat/utils.c
Log:
Try to find out correct start time to make seeking faster and add some
extra checks to make sure the seeking function will not hang forever.
Modified: trunk/libavformat/avformat.h
==============================================================================
--- trunk/libavformat/avformat.h (original)
+++ trunk/libavformat/avformat.h Sun Jul 23 20:19:33 2006
@@ -472,6 +472,7 @@
int av_add_index_entry(AVStream *st,
int64_t pos, int64_t timestamp, int size, int distance, int flags);
int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags);
+void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp);
/* media file output */
int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap);
Modified: trunk/libavformat/ogg2.c
==============================================================================
--- trunk/libavformat/ogg2.c (original)
+++ trunk/libavformat/ogg2.c Sun Jul 23 20:19:33 2006
@@ -201,7 +201,6 @@
return AVERROR_NOMEM;
av_set_pts_info(st, 64, 1, 1000000);
- st->start_time = 0;
return idx;
}
@@ -495,6 +494,16 @@
ogg->size = size;
ogg_restore (s, 0);
+ ogg_save (s);
+ while (ogg_read_page (s, &i)) {
+ if (i == idx && ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0)
+ break;
+ }
+ if (i == idx) {
+ s->streams[idx]->start_time = ogg_gptopts (s, idx, ogg->streams[idx].granule);
+ s->streams[idx]->duration -= s->streams[idx]->start_time;
+ }
+ ogg_restore (s, 0);
return 0;
}
@@ -572,12 +581,14 @@
ogg_t *ogg = s->priv_data;
ByteIOContext *bc = &s->pb;
uint64_t min = 0, max = ogg->size;
- uint64_t tmin = 0, tmax = st->duration;
+ uint64_t tmin = st->start_time, tmax = st->start_time + st->duration;
int64_t pts = AV_NOPTS_VALUE;
ogg_save (s);
- while (min <= max){
+ if ((uint64_t)target_ts < tmin || target_ts < 0)
+ target_ts = tmin;
+ while (min <= max && tmin < tmax){
uint64_t p = min + (max - min) * (target_ts - tmin) / (tmax - tmin);
int i = -1;
@@ -599,9 +610,25 @@
break;
if (pts > target_ts){
+ if (max == p && tmax == pts) {
+ // probably our tmin is wrong, causing us to always end up too late in the file
+ tmin = (target_ts + tmin + 1) / 2;
+ if (tmin == target_ts) {
+ url_fseek(bc, min, SEEK_SET);
+ break;
+ }
+ }
max = p;
tmax = pts;
}else{
+ if (min == p && tmin == pts) {
+ // probably our tmax is wrong, causing us to always end up too early in the file
+ tmax = (target_ts + tmax) / 2;
+ if (tmax == target_ts) {
+ url_fseek(bc, max, SEEK_SET);
+ break;
+ }
+ }
min = p;
tmin = pts;
}
@@ -615,7 +642,8 @@
pts = AV_NOPTS_VALUE;
}
- return pts;
+ av_update_cur_dts(s, st, pts);
+ return 0;
#if 0
//later...
Modified: trunk/libavformat/utils.c
==============================================================================
--- trunk/libavformat/utils.c (original)
+++ trunk/libavformat/utils.c Sun Jul 23 20:19:33 2006
@@ -1097,7 +1097,7 @@
* @param timestamp new dts expressed in time_base of param ref_st
* @param ref_st reference stream giving time_base of param timestamp
*/
-static void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
+void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){
int i;
for(i = 0; i < s->nb_streams; i++) {
More information about the ffmpeg-cvslog
mailing list