@ -171,7 +171,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
if ( last_pos = = pos | | pos = = base - 8 )
avi - > non_interleaved = 1 ;
if ( last_pos ! = pos )
av_add_index_entry ( st , pos , ast - > cum_len / FFMAX ( 1 , ast - > sample_size ) , len , 0 , key ? AVINDEX_KEYFRAME : 0 ) ;
av_add_index_entry ( st , pos , ast - > cum_len , len , 0 , key ? AVINDEX_KEYFRAME : 0 ) ;
if ( ast - > sample_size )
ast - > cum_len + = len ;
@ -222,7 +222,7 @@ static void clean_index(AVFormatContext *s){
ts = st - > index_entries [ 0 ] . timestamp ;
for ( j = 0 ; j < size ; j + = max ) {
av_add_index_entry ( st , pos + j , ts + j / ast - > sample_size , FFMIN ( max , size - j ) , 0 , AVINDEX_KEYFRAME ) ;
av_add_index_entry ( st , pos + j , ts + j , FFMIN ( max , size - j ) , 0 , AVINDEX_KEYFRAME ) ;
}
}
}
@ -684,14 +684,11 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
if ( ! st - > nb_index_entries )
continue ;
if ( ast - > sample_size )
ts / = ast - > sample_size ;
last_ts = st - > index_entries [ st - > nb_index_entries - 1 ] . timestamp ;
if ( ! ast - > remaining & & ts > last_ts )
continue ;
ts = av_rescale_q ( ts , st - > time_base , AV_TIME_BASE_Q ) ;
ts = av_rescale_q ( ts , st - > time_base , ( AVRational ) { FFMAX ( 1 , ast - > sample_size ) , AV_TIME_BASE } ) ;
// av_log(s, AV_LOG_DEBUG, "%"PRId64" %d/%d %"PRId64"\n", ts, st->time_base.num, st->time_base.den, ast->frame_offset);
if ( ts < best_ts ) {
@ -704,14 +701,13 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
return - 1 ;
best_ast = best_st - > priv_data ;
best_ts = av_rescale_q ( best_ts , AV_TIME_BASE_Q , best_st - > time_base ) ;
best_ts = av_rescale_q ( best_ts , ( AVRational ) { FFMAX ( 1 , best_ast - > sample_size ) , AV_TIME_BASE } , best_st - > time_base ) ;
if ( best_ast - > remaining )
i = av_index_search_timestamp ( best_st , best_ts , AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWARD ) ;
else {
i = av_index_search_timestamp ( best_st , best_ts , AVSEEK_FLAG_ANY ) ;
if ( i > = 0 )
best_ast - > frame_offset = best_st - > index_entries [ i ] . timestamp
* FFMAX ( 1 , best_ast - > sample_size ) ;
best_ast - > frame_offset = best_st - > index_entries [ i ] . timestamp ;
}
// av_log(s, AV_LOG_DEBUG, "%d\n", i);
@ -781,7 +777,7 @@ resync:
int index ;
assert ( st - > index_entries ) ;
index = av_index_search_timestamp ( st , pkt - > dts , 0 ) ;
index = av_index_search_timestamp ( st , ast - > frame_offset , 0 ) ;
e = & st - > index_entries [ index ] ;
if ( index > = 0 & & e - > timestamp = = ast - > frame_offset ) {
@ -912,7 +908,7 @@ resync:
{
uint64_t pos = url_ftell ( pb ) - 8 ;
if ( ! st - > index_entries | | ! st - > nb_index_entries | | st - > index_entries [ st - > nb_index_entries - 1 ] . pos < pos ) {
av_add_index_entry ( st , pos , ast - > frame_offset / FFMAX ( 1 , ast - > sample_size ) , size , 0 , AVINDEX_KEYFRAME ) ;
av_add_index_entry ( st , pos , ast - > frame_offset , size , 0 , AVINDEX_KEYFRAME ) ;
}
}
goto resync ;
@ -969,7 +965,7 @@ static int avi_read_idx1(AVFormatContext *s, int size)
if ( last_pos = = pos )
avi - > non_interleaved = 1 ;
else
av_add_index_entry ( st , pos , ast - > cum_len / FFMAX ( 1 , ast - > sample_size ) , len , 0 , ( flags & AVIIF_INDEX ) ? AVINDEX_KEYFRAME : 0 ) ;
av_add_index_entry ( st , pos , ast - > cum_len , len , 0 , ( flags & AVIIF_INDEX ) ? AVINDEX_KEYFRAME : 0 ) ;
if ( ast - > sample_size )
ast - > cum_len + = len ;
else
@ -1062,6 +1058,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
AVStream * st ;
int i , index ;
int64_t pos ;
AVIStream * ast ;
if ( ! avi - > index_loaded ) {
/* we only load the index on demand */
@ -1071,13 +1068,14 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
assert ( stream_index > = 0 ) ;
st = s - > streams [ stream_index ] ;
index = av_index_search_timestamp ( st , timestamp , flags ) ;
ast = st - > priv_data ;
index = av_index_search_timestamp ( st , timestamp * FFMAX ( ast - > sample_size , 1 ) , flags ) ;
if ( index < 0 )
return - 1 ;
/* find the position */
pos = st - > index_entries [ index ] . pos ;
timestamp = st - > index_entries [ index ] . timestamp ;
timestamp = st - > index_entries [ index ] . timestamp / FFMAX ( ast - > sample_size , 1 ) ;
// av_log(s, AV_LOG_DEBUG, "XX %"PRId64" %d %"PRId64"\n", timestamp, index, st->index_entries[index].timestamp);
@ -1110,7 +1108,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
assert ( ( int64_t ) st2 - > time_base . num * ast2 - > rate = = ( int64_t ) st2 - > time_base . den * ast2 - > scale ) ;
index = av_index_search_timestamp (
st2 ,
av_rescale_q ( timestamp , st - > time_base , st2 - > time_base ) ,
av_rescale_q ( timestamp , st - > time_base , st2 - > time_base ) * FFMAX ( ast2 - > sample_size , 1 ) ,
flags | AVSEEK_FLAG_BACKWARD ) ;
if ( index < 0 )
index = 0 ;
@ -1125,8 +1123,6 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
// av_log(s, AV_LOG_DEBUG, "%"PRId64" %d %"PRId64"\n", timestamp, index, st2->index_entries[index].timestamp);
/* extract the current frame number */
ast2 - > frame_offset = st2 - > index_entries [ index ] . timestamp ;
if ( ast2 - > sample_size )
ast2 - > frame_offset * = ast2 - > sample_size ;
}
/* do the seek */