Evaluating readability of media
This commit is contained in:
@ -6557,3 +6557,188 @@ int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag)
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
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 i, ret, total_count= 0;
|
||||
int prev_quality= -1, quality= -1;
|
||||
int start_lba= 0;
|
||||
struct burn_drive *drive;
|
||||
struct burn_drive_info *dinfo;
|
||||
char data[64*1024];
|
||||
off_t data_count, to_read;
|
||||
double pre_read_time, post_read_time, time_diff, total_time_diff= 0;
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to check media readability", 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
start_lba= from_lba;
|
||||
for(i= 0; i < block_count; i+= read_chunk) {
|
||||
if(job->item_limit > 0 &&
|
||||
Spotlist_count(spotlist, 0) + 2 >= job->item_limit) {
|
||||
sprintf(xorriso->info_text, "-check_media: Reached item_limit=%d",
|
||||
job->item_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
goto abort_check;
|
||||
}
|
||||
pre_read_time= Sfile_microtime(0);
|
||||
if(job->time_limit > 0
|
||||
&& job->start_time + job->time_limit < pre_read_time) {
|
||||
sprintf(xorriso->info_text, "-check_media: Reached time_limit=%d",
|
||||
job->time_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
abort_check:;
|
||||
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, block_count - 1,
|
||||
Xorriso_read_quality_untesteD, 0);
|
||||
if(ret > 0)
|
||||
ret= 2;
|
||||
goto ex;
|
||||
}
|
||||
to_read= read_chunk;
|
||||
if(i + to_read > block_count)
|
||||
to_read= block_count - i;
|
||||
ret= burn_read_data(drive, ((off_t) (i + from_lba)) * (off_t) 2048, data,
|
||||
to_read * (off_t) 2048, &data_count, 4);
|
||||
post_read_time= Sfile_microtime(0);
|
||||
time_diff= post_read_time - pre_read_time;
|
||||
total_time_diff+= time_diff;
|
||||
total_count++;
|
||||
if(ret <= 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
quality= Xorriso_read_quality_unreadablE;
|
||||
if(read_chunk > min_block_size) {
|
||||
|
||||
/* >>> evaluate min blocks */;
|
||||
|
||||
}
|
||||
} else {
|
||||
quality= Xorriso_read_quality_gooD;
|
||||
|
||||
/* >>> find better threshold than 1.0 */
|
||||
|
||||
if(time_diff > 1.0 && i > 0)
|
||||
quality= Xorriso_read_quality_sloW;
|
||||
}
|
||||
if(quality != prev_quality) {
|
||||
if(prev_quality >= 0) {
|
||||
ret= Spotlist_add_item(spotlist, start_lba, i + from_lba - start_lba,
|
||||
prev_quality, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
start_lba= i + from_lba;
|
||||
prev_quality= quality;
|
||||
}
|
||||
xorriso->pacifier_count+= to_read;
|
||||
if(post_read_time - xorriso->last_update_time >= xorriso->pacifier_interval)
|
||||
Xorriso_pacifier_callback(xorriso, "sectors examined",
|
||||
xorriso->pacifier_count, xorriso->pacifier_total, "", 0);
|
||||
}
|
||||
if(prev_quality >= 0) {
|
||||
ret= Spotlist_add_item(spotlist, start_lba,
|
||||
block_count + from_lba - start_lba, prev_quality, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* <<< for calibration of quality */
|
||||
if(total_count > 0) {
|
||||
sprintf(xorriso->info_text, "Xorriso_check_interval: %.1f s / %d = %f",
|
||||
total_time_diff, total_count, total_time_diff / total_count);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
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 blocks;
|
||||
struct burn_drive *drive;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct isoburn_toc_disc *isoburn_disc= NULL;
|
||||
|
||||
*spotlist= NULL;
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to check media readability", 0);
|
||||
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
|
||||
*/;
|
||||
/* <<< */
|
||||
min_block_size= read_chunk;
|
||||
|
||||
ret= Spotlist_new(spotlist, 0);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
Xorriso_pacifier_reset(xorriso, 0);
|
||||
job->start_time= time(NULL);
|
||||
mode= job->mode;
|
||||
if(job->min_lba >= 0)
|
||||
start_lba= job->min_lba;
|
||||
if(job->max_lba >= 0) {
|
||||
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);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
|
||||
} else if(mode == 0) {
|
||||
|
||||
/* >>> track by track */;
|
||||
|
||||
} else if(mode == 1) {
|
||||
isoburn_disc= isoburn_toc_drive_get_disc(drive);
|
||||
if(isoburn_disc == NULL) {
|
||||
no_content_visible:;
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text, "No content detected on media");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
blocks= media_blocks= isoburn_toc_disc_get_sectors(isoburn_disc);
|
||||
if(start_lba >= 0)
|
||||
blocks-= start_lba;
|
||||
if(media_blocks <= 0)
|
||||
goto no_content_visible;
|
||||
xorriso->pacifier_total= blocks;
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks,
|
||||
read_chunk, min_block_size, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
} else if(mode == 2) {
|
||||
|
||||
/* >>> single sweep over libburn media capacity */;
|
||||
|
||||
}
|
||||
|
||||
Xorriso_pacifier_callback(xorriso, "sectors examined",
|
||||
xorriso->pacifier_count, xorriso->pacifier_total, "", 1);
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret < 0)
|
||||
Spotlist_destroy(spotlist, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
Reference in New Issue
Block a user