return( piece_rtas );
}
last_recalc = mono_now;
DiskManager disk_manager = download_manager.getDiskManager();
progressiveStats stats = progressive_stats;
EnhancedDownloadManagerFile file = stats.getFile();
if ( disk_manager == null || stats == null || file.isComplete()){
deactivate( picker );
return( null );
}
long abs_provider_pos = stats.getCurrentProviderPosition( true );
long rel_provider_pos = stats.getCurrentProviderPosition( false );
long buffer_bytes = stats.getBufferBytes();
boolean buffering = getProgressivePlayETA() >= 0;
if ( buffering ){
long buffer_size = getContiguousAvailableBytes( file.getIndex(), rel_provider_pos, buffer_bytes );
if ( buffer_size == buffer_bytes ){
buffering = false;
}
}
if ( buffering != is_buffering ){
if ( buffering ){
log( "Switching to buffer mode" );
}else{
log( "Switching to RTA mode" );
}
is_buffering = buffering;
}
long piece_size = disk_manager.getPieceLength();
int start_piece = (int)( abs_provider_pos / piece_size );
int end_piece = file.getFile().getLastPieceNumber();
piece_rtas = new long[ picker.getNumberOfPieces()];
long now = SystemTime.getCurrentTime();
if ( is_buffering ){
for (int i=start_piece;i<=end_piece;i++){
// not bothered about times here but need to use large increments to ensure
// that pieces are picked in order even for slower peers
piece_rtas[i] = now+(i*60000);
}
long buffer_size = getContiguousAvailableBytes( file.getIndex(), rel_provider_pos, 0 );
if ( last_buffer_size != buffer_size ){
last_buffer_size = buffer_size;
last_buffer_size_time = now;
}else{
if ( now < last_buffer_size_time ){
last_buffer_size_time = now;
}else{
long stalled_for = now - last_buffer_size_time;
long dl_speed = progressive_stats.getDownloadBytesPerSecond();
if ( dl_speed > 0 ){
long block_time = (DiskManager.BLOCK_SIZE * 1000) / dl_speed;
if ( stalled_for > Math.max( 5000, 5*block_time )){
long target_rta = now + block_time;
int blocked_piece_index = (int)((abs_provider_pos + buffer_size ) / disk_manager.getPieceLength());
DiskManagerPiece[] pieces = disk_manager.getPieces();
if ( blocked_piece_index < pieces.length ){
if ( pieces[blocked_piece_index].isDone()){