summaryrefslogtreecommitdiff
path: root/libavformat/utils.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2009-12-13 22:56:59 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-12-13 22:56:59 +0000
commitcc20679a41d52ffdd6dfef1ee381321c7a85a658 (patch)
tree2243e197828e13eea8ec5dda5200fa98d0eee9b3 /libavformat/utils.c
parent35164ffe502cd781b0bc76a049c6e9d26e1bf93e (diff)
Try to simplify av_estimate_timings_from_pts() like in ffmbc.
Note if this breaks for some file, report it please! Originally committed as revision 20844 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r--libavformat/utils.c43
1 files changed, 10 insertions, 33 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index da35ad7ad2..4b4cf870f8 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1758,7 +1758,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
AVPacket pkt1, *pkt = &pkt1;
AVStream *st;
int read_size, i, ret;
- int64_t end_time;
+ int64_t end_time, start_time[MAX_STREAMS];
int64_t filesize, offset, duration;
ic->cur_st = NULL;
@@ -1768,6 +1768,13 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
for(i=0;i<ic->nb_streams;i++) {
st = ic->streams[i];
+ if(st->start_time != AV_NOPTS_VALUE){
+ start_time[i]= st->start_time;
+ }else if(st->first_dts != AV_NOPTS_VALUE){
+ start_time[i]= st->first_dts;
+ }else
+ av_log(st->codec, AV_LOG_WARNING, "start time is not set in av_estimate_timings_from_pts\n");
+
if (st->parser) {
av_parser_close(st->parser);
st->parser= NULL;
@@ -1775,36 +1782,6 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
}
}
- /* we read the first packets to get the first PTS (not fully
- accurate, but it is enough now) */
- url_fseek(ic->pb, 0, SEEK_SET);
- read_size = 0;
- for(;;) {
- if (read_size >= DURATION_MAX_READ_SIZE)
- break;
- /* if all info is available, we can stop */
- for(i = 0;i < ic->nb_streams; i++) {
- st = ic->streams[i];
- if (st->start_time == AV_NOPTS_VALUE)
- break;
- }
- if (i == ic->nb_streams)
- break;
-
- do{
- ret = av_read_packet(ic, pkt);
- }while(ret == AVERROR(EAGAIN));
- if (ret != 0)
- break;
- read_size += pkt->size;
- st = ic->streams[pkt->stream_index];
- if (pkt->pts != AV_NOPTS_VALUE) {
- if (st->start_time == AV_NOPTS_VALUE)
- st->start_time = pkt->pts;
- }
- av_free_packet(pkt);
- }
-
/* estimate the end time (duration) */
/* XXX: may need to support wrapping */
filesize = ic->file_size;
@@ -1826,9 +1803,9 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
read_size += pkt->size;
st = ic->streams[pkt->stream_index];
if (pkt->pts != AV_NOPTS_VALUE &&
- st->start_time != AV_NOPTS_VALUE) {
+ start_time[pkt->stream_index] != AV_NOPTS_VALUE) {
end_time = pkt->pts;
- duration = end_time - st->start_time;
+ duration = end_time - start_time[pkt->stream_index];
if (duration > 0) {
if (st->duration == AV_NOPTS_VALUE ||
st->duration < duration)