@ -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 ;
AVStream * st ;
for ( i = 0 ; i < ic - > nb_streams ; i + + ) {
st = ic - > streams [ i ] ;
if ( st - > start_time ! = AV_NOPTS_VALUE & &
st - > duration ! = AV_NOPTS_VALUE )
if ( st - > duration ! = AV_NOPTS_VALUE )
return 1 ;
}
return 0 ;
@ -1390,11 +1389,13 @@ static int av_has_timings(AVFormatContext *ic)
static void av_update_stream_timings ( AVFormatContext * ic )
{
int64_t start_time , start_time1 , end_time , end_time1 ;
int64_t duration , duration1 ;
int i ;
AVStream * st ;
start_time = INT64_MAX ;
end_time = INT64_MIN ;
duration = INT64_MIN ;
for ( i = 0 ; i < ic - > nb_streams ; i + + ) {
st = ic - > streams [ i ] ;
if ( st - > start_time ! = AV_NOPTS_VALUE ) {
@ -1408,19 +1409,27 @@ static void av_update_stream_timings(AVFormatContext *ic)
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 ) {
ic - > start_time = start_time ;
if ( end_time ! = INT64_MIN ) {
ic - > duration = end_time - start_time ;
if ( ic - > file_size > 0 ) {
/* compute the bit rate */
ic - > bit_rate = ( double ) ic - > file_size * 8.0 * AV_TIME_BASE /
( double ) ic - > duration ;
}
if ( end_time - start_time > duration )
duration = end_time - start_time ;
}
}
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 )
@ -1587,7 +1596,7 @@ static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset)
file_size & & ! ic - > pb . is_streamed ) {
/* get accurate estimate from the PTSes */
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
the components */
fill_all_stream_timings ( ic ) ;