Commit 1418c4e9 authored by benoit's avatar benoit

Make sure that if a stream has a duration but the container doesn't

then the container duration is set from the stream duration.

patch by Neil Brown: [ neilb suse de]
original thread: [FFmpeg-devel] [patch 3/3] Make timing calculations
less dependant on start_time being defined.
date: 08/16/2007 08:27 AM



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@10408 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 308ebca2
...@@ -1364,19 +1364,18 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int f ...@@ -1364,19 +1364,18 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int f
/*******************************************************/ /*******************************************************/
/** /**
* Returns TRUE if the stream has accurate timings in any stream. * Returns TRUE if the stream has accurate duration in any stream.
* *
* @return TRUE if the stream has accurate timings for at least one component. * @return TRUE if the stream has accurate duration for at least one component.
*/ */
static int av_has_timings(AVFormatContext *ic) static int av_has_duration(AVFormatContext *ic)
{ {
int i; int i;
AVStream *st; AVStream *st;
for(i = 0;i < ic->nb_streams; i++) { for(i = 0;i < ic->nb_streams; i++) {
st = ic->streams[i]; st = ic->streams[i];
if (st->start_time != AV_NOPTS_VALUE && if (st->duration != AV_NOPTS_VALUE)
st->duration != AV_NOPTS_VALUE)
return 1; return 1;
} }
return 0; return 0;
...@@ -1390,11 +1389,13 @@ static int av_has_timings(AVFormatContext *ic) ...@@ -1390,11 +1389,13 @@ static int av_has_timings(AVFormatContext *ic)
static void av_update_stream_timings(AVFormatContext *ic) static void av_update_stream_timings(AVFormatContext *ic)
{ {
int64_t start_time, start_time1, end_time, end_time1; int64_t start_time, start_time1, end_time, end_time1;
int64_t duration, duration1;
int i; int i;
AVStream *st; AVStream *st;
start_time = INT64_MAX; start_time = INT64_MAX;
end_time = INT64_MIN; end_time = INT64_MIN;
duration = INT64_MIN;
for(i = 0;i < ic->nb_streams; i++) { for(i = 0;i < ic->nb_streams; i++) {
st = ic->streams[i]; st = ic->streams[i];
if (st->start_time != AV_NOPTS_VALUE) { if (st->start_time != AV_NOPTS_VALUE) {
...@@ -1408,19 +1409,27 @@ static void av_update_stream_timings(AVFormatContext *ic) ...@@ -1408,19 +1409,27 @@ static void av_update_stream_timings(AVFormatContext *ic)
end_time = end_time1; end_time = end_time1;
} }
} }
if (st->duration != AV_NOPTS_VALUE) {
duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
if (duration1 > duration)
duration = duration1;
}
} }
if (start_time != INT64_MAX) { if (start_time != INT64_MAX) {
ic->start_time = start_time; ic->start_time = start_time;
if (end_time != INT64_MIN) { if (end_time != INT64_MIN) {
ic->duration = end_time - start_time; if (end_time - start_time > duration)
if (ic->file_size > 0) { duration = end_time - start_time;
/* compute the bit rate */ }
ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE / }
(double)ic->duration; if (duration != INT64_MIN) {
} ic->duration = duration;
if (ic->file_size > 0) {
/* compute the bit rate */
ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE /
(double)ic->duration;
} }
} }
} }
static void fill_all_stream_timings(AVFormatContext *ic) static void fill_all_stream_timings(AVFormatContext *ic)
...@@ -1587,7 +1596,7 @@ static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset) ...@@ -1587,7 +1596,7 @@ static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
file_size && !ic->pb.is_streamed) { file_size && !ic->pb.is_streamed) {
/* get accurate estimate from the PTSes */ /* get accurate estimate from the PTSes */
av_estimate_timings_from_pts(ic, old_offset); av_estimate_timings_from_pts(ic, old_offset);
} else if (av_has_timings(ic)) { } else if (av_has_duration(ic)) {
/* at least one components has timings - we use them for all /* at least one components has timings - we use them for all
the components */ the components */
fill_all_stream_timings(ic); fill_all_stream_timings(ic);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment