New option -check_media
This commit is contained in:
@ -6569,16 +6569,17 @@ int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag)
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @return <=0 error, 1= done, 2= aborted due to limit
|
||||
/* @param flag bit0= this is a follow-up session (i.e. on CD: TAO)
|
||||
@return <=0 error, 1= done, 2= aborted due to limit
|
||||
*/
|
||||
int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
struct CheckmediajoB *job,
|
||||
int from_lba, int block_count,
|
||||
int read_chunk, int min_block_size, int flag)
|
||||
int from_lba, int block_count, int read_chunk,
|
||||
int flag)
|
||||
{
|
||||
int i, j, ret, total_count= 0, sectors= -1, sector_size= -1, skip_reading;
|
||||
int prev_quality= -1, quality= -1, retry= 0, profile_no, is_cd;
|
||||
int start_sec, end_sec, first_value;
|
||||
int start_sec, end_sec, first_value, fret;
|
||||
char profile_name[80];
|
||||
int start_lba= 0;
|
||||
struct burn_drive *drive;
|
||||
@ -6586,9 +6587,12 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
char data[64*1024], sfe[5*SfileadrL];
|
||||
off_t data_count, to_read;
|
||||
double pre_read_time, post_read_time, time_diff, total_time_diff= 0;
|
||||
double last_abort_file_time= 0;
|
||||
struct stat stbuf;
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to check media readability", 0);
|
||||
"on attempt to check media readability",
|
||||
!!job->use_outdev);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
ret= burn_disc_get_profile(drive, &profile_no, profile_name);
|
||||
@ -6603,13 +6607,29 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
|
||||
if(job->retry > 0)
|
||||
retry= 1;
|
||||
else if(job-retry == 0 && is_cd)
|
||||
else if(job->retry == 0 && is_cd)
|
||||
retry= 1;
|
||||
|
||||
start_lba= from_lba;
|
||||
to_read= read_chunk;
|
||||
post_read_time= Sfile_microtime(0);
|
||||
for(i= 0; i < block_count; i+= to_read) {
|
||||
skip_reading= 0;
|
||||
|
||||
if(job->abort_file_path[0]) {
|
||||
if(post_read_time - last_abort_file_time >= 0.1) {
|
||||
if(stat(job->abort_file_path, &stbuf) != -1) {
|
||||
if(stbuf.st_mtime >= xorriso->start_time) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-check_media: Found fresh abort_file=%s",
|
||||
job->abort_file_path);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
goto abort_check;
|
||||
}
|
||||
}
|
||||
last_abort_file_time= post_read_time;
|
||||
}
|
||||
}
|
||||
if(job->item_limit > 0 &&
|
||||
Spotlist_count(spotlist, 0) + 2 >= job->item_limit) {
|
||||
sprintf(xorriso->info_text, "-check_media: Reached item_limit=%d",
|
||||
@ -6636,6 +6656,7 @@ abort_check:;
|
||||
ret= 2;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
to_read= read_chunk;
|
||||
if(i + to_read > block_count)
|
||||
to_read= block_count - i;
|
||||
@ -6645,20 +6666,22 @@ abort_check:;
|
||||
*/
|
||||
if(to_read > 2)
|
||||
to_read-= 2;
|
||||
else if(to_read > 1)
|
||||
to_read--;
|
||||
else if(to_read > 1) {
|
||||
if(flag & 1) {
|
||||
quality= Xorriso_read_quality_tao_enD;
|
||||
skip_reading= 1;
|
||||
} else
|
||||
to_read--;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NIX
|
||||
/* >>> this is not yet suitable for min_block_size */
|
||||
#endif
|
||||
|
||||
if(sector_size == read_chunk && from_lba % read_chunk == 0) {
|
||||
if(Sectorbitmap_is_set(job->sector_map, (i + from_lba) / read_chunk, 0)) {
|
||||
if(sector_size == read_chunk && from_lba % read_chunk == 0
|
||||
&& !skip_reading) {
|
||||
if(Sectorbitmap_is_set(job->sector_map, (i + from_lba) / sector_size, 0)){
|
||||
quality= Xorriso_read_quality_valiD;
|
||||
skip_reading= 1;
|
||||
}
|
||||
} else if(sector_size > 0) {
|
||||
} else if(sector_size > 0 && !skip_reading) {
|
||||
start_sec= (i + from_lba) / sector_size;
|
||||
end_sec= (i + to_read + from_lba) / sector_size;
|
||||
first_value= Sectorbitmap_is_set(job->sector_map, start_sec, 0);
|
||||
@ -6684,32 +6707,29 @@ abort_check:;
|
||||
total_count++;
|
||||
if(ret <= 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
|
||||
if(data_count > 0 && retry) {
|
||||
if(prev_quality >= 0) {
|
||||
ret= Spotlist_add_item(spotlist, start_lba,
|
||||
i + from_lba - start_lba, prev_quality, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(data_count / 2048 < to_read) {
|
||||
if(data_count > 0 && retry) {
|
||||
if(prev_quality >= 0) {
|
||||
ret= Spotlist_add_item(spotlist, start_lba,
|
||||
i + from_lba - start_lba, prev_quality, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
ret= Spotlist_add_item(spotlist, i + from_lba, data_count / 2048,
|
||||
Xorriso_read_quality_partiaL, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
start_lba= i + from_lba + data_count / 2048;
|
||||
prev_quality= Xorriso_read_quality_unreadablE;
|
||||
}
|
||||
ret= Spotlist_add_item(spotlist, i + from_lba, data_count / 2048,
|
||||
Xorriso_read_quality_partiaL, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
start_lba= i + from_lba + data_count / 2048;
|
||||
prev_quality= Xorriso_read_quality_unreadablE;
|
||||
}
|
||||
quality= Xorriso_read_quality_unreadablE;
|
||||
|
||||
#ifdef NIX
|
||||
if(read_chunk > min_block_size) {
|
||||
|
||||
/* >>> evaluate min blocks */;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
quality= Xorriso_read_quality_unreadablE;
|
||||
if(retry)
|
||||
to_read= data_count / 2048 + 1;
|
||||
} else
|
||||
quality= Xorriso_read_quality_partiaL;
|
||||
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
|
||||
if(fret<0)
|
||||
goto ex;
|
||||
} else {
|
||||
quality= Xorriso_read_quality_gooD;
|
||||
|
||||
@ -6775,7 +6795,7 @@ ex:
|
||||
int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
struct CheckmediajoB *job, int flag)
|
||||
{
|
||||
int media_blocks= 0, read_chunk= 16, ret, mode, min_block_size, start_lba= 0;
|
||||
int media_blocks= 0, read_chunk= 16, ret, mode, start_lba= 0;
|
||||
int blocks, os_errno, i, j, last_track_end= -1, track_blocks, track_lba;
|
||||
int num_sessions, num_tracks, declare_untested= 0, sector_size, count;
|
||||
int lba, quality;
|
||||
@ -6791,17 +6811,16 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
*spotlist= NULL;
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to check media readability", 0);
|
||||
"on attempt to check media readability",
|
||||
!!job->use_outdev);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
|
||||
/* >>> determine media type dependent blocking factor:
|
||||
2 kB for CD and disk , 32 kB for DVD, 64 kB for BD
|
||||
eventually adjust min_block_size and read_chunk
|
||||
32 kB for CD (with 2kB retry) iand DVD, 64 kB for BD
|
||||
eventually adjust read_chunk
|
||||
*/;
|
||||
/* <<< */
|
||||
min_block_size= read_chunk;
|
||||
|
||||
ret= Spotlist_new(spotlist, 0);
|
||||
if(ret <= 0)
|
||||
@ -6841,7 +6860,7 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
blocks= job->max_lba - start_lba;
|
||||
xorriso->pacifier_total= blocks;
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks,
|
||||
read_chunk, min_block_size, 0);
|
||||
read_chunk, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
|
||||
@ -6867,6 +6886,7 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
Xorriso_read_quality_off_tracK, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
xorriso->pacifier_count+= track_lba - last_track_end;
|
||||
}
|
||||
last_track_end= track_lba + track_blocks;
|
||||
|
||||
@ -6882,9 +6902,8 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
} else {
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job,
|
||||
track_lba, track_blocks,
|
||||
read_chunk, min_block_size, 0);
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, track_lba,
|
||||
track_blocks, read_chunk, i > 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(ret == 2)
|
||||
@ -6909,7 +6928,7 @@ no_content_visible:;
|
||||
goto no_content_visible;
|
||||
xorriso->pacifier_total= blocks;
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks,
|
||||
read_chunk, min_block_size, 0);
|
||||
read_chunk, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
} else if(mode == 2) {
|
||||
|
Reference in New Issue
Block a user