Blank sequential DVD-RW, deformat overwriteable DVD-RW

This commit is contained in:
Thomas Schmitt 2007-01-31 12:59:51 +00:00
parent 0665eeecff
commit 163509011c
4 changed files with 111 additions and 87 deletions

View File

@ -96,7 +96,19 @@ the archivers afio and star. Not suitable seems GNU tar.
.br
CD-R can be initially written only once and eventually extended until they
get closed (or are spoiled because they are overly full). After that they are
read-only.
read-only. Closing is done automatically unless option
.B -multi
is given which keeps the media appendable.
.br
There are two write modes,
.B -tao
and
.B -sao .
.br
-tao allows to use track source of unpredictable length (like stdin) and allows
to write further sessions to appendable media. -sao produces audio sessions
with seamless tracks but needs predicted track sizes and cannot append sessions
to media.
.br
CD-RW media can be blanked to make them re-usable for another
round of overwriting. Usually
@ -106,9 +118,9 @@ Blanking damages the previous content but does not
make it completely unreadable. It is no effective privacy precaution.
Multiple cycles of blanking and overwriting with random numbers might be.
.PP
.B Recordable DVD Media:
.B Overwriteable DVD Media:
.br
Currently only types DVD+RW, DVD-RW and DVD-RAM can be burned via cdrskin.
Currently only types DVD+RW, DVD-RW and DVD-RAM can be overwritten via cdrskin.
.br
DVD+RW and DVD-RAM media get treated as blank media regardless wether they
hold data or not. They need no special initial formatting.
@ -118,12 +130,44 @@ Speed is counted in DVD units (i.e. 1x = 1,385,000 bytes/second). Currently
there is no difference between -sao and -tao. If ever, then -tao will be the
mode which preserves the current behavior.
.br
DVD-RW need to be formatted to state "Restricted Overwrite". Then they behave
much like DVD+RW. This formatting can be done by option
DVD-RW are sold in state "Sequential Recording". To become suitable for the
Overwriteable DVD recoding model they need to get formatted to state
"Restricted Overwrite". Then they behave much like DVD+RW. This formatting
can be done by option
.B blank=format_overwrite
It is necessary for unused media, for media written or blanked by cdrecord,
for media which have been written unformatted by growisofs or blanked by
dvd+rw-format -blank. If in doubt, just give it a try.
.br
Several programs like dvd+rw-format, cdrecord, wodim, or cdrskin option
blank=deformat_sequential can bring a DVD-RW out of overwriteable state so
that it has to be formatted again. If in doubt, just give it a try.
.PP
.B Sequentially Recordable DVD Media:
.br
---------------
.br
Note: The support for sequentially recordable media is still emerging.
.br
DVD-R have not been tested yet. If no Incremental Streaming feature (21h)
is offered, then the media is regarded as unsuitable without further
explanation. (One can torture DVD-RW to make them offer only DAO (2Fh)).
Only single-track sessions have been tested yet. Multi-session works but
-toc and -msinfo are not implemented yet.
.br
---------------
.br
Currently only DVD-RW (and most probably DVD-R) can be used for the Sequential
recording model. DVD-RW must be in state "Sequential Recording". The media must
be either blank or appendable. Newly purchased DVD-RW media are in this state.
Used DVD-RW get into blank sequential state by option
.B blank=deformat_sequential .
.br
Incremental Streaming is the default write mode if it is offered by the media.
It resembles much TAO writing with CD, as it allows track sources of
unpredicted length and to keep media appendable by option
.B -multi .
Only restriction towards CD-RW is the lack of support for -audio tracks.
.br
(The other write mode, DAO, is not implemented yet. It will allow no -multi and
only a single track.)
.PP
.B Drive preparation and addressing:
.br
@ -194,14 +238,15 @@ help
Print this list of blanking types.
.TP
all
Blank an entire CD.
Blank an entire CD-RW or an unformatted DVD-RW.
.TP
fast
Minimally blank an entire CD.
Minimally blank an entire CD-RW or an unformatted DVD-RW.
.TP
format_overwrite
Format a DVD-RW to "Restricted Overwrite". The user should bring some patience.
(Note: format_overwrite* are not original cdrecord options.)
.br
(Note: blank=format_overwrite* are not original cdrecord options.)
.TP
format_overwrite_quickest
Like format_overwrite without creating a 128 MB trailblazer session.
@ -215,8 +260,16 @@ rather than just 128 MB.
Most traditional formatting is attempted. No data get written.
Much patience is required.
.br
This option treats already formatted media even if not option -force is given.
.br
For DVD+RW this is the only supported explicit formatting type. It provides
complete "de-icing" so no reader slips on unwritten data areas.
.TP
deformat_sequential
Like blank=all but with the additional ability to blank overwriteable DVD-RW.
This will destroy their formatting and make them sequentially recordable.
.br
(Note: blank=deformat_sequential is not an original cdrecord option.)
.RE
.TP
.BI \-checkdrive
@ -591,13 +644,13 @@ cdrskin dev=ATA:1,0,0 -atip
.br
cdrskin dev=/dev/hdc -toc
.SS
.B Make used CD-RW writable again:
.B Make used CD-RW or used unformatted DVD-RW writable again:
.br
cdrskin -v dev=/dev/sg1 blank=all -eject
.br
cdrskin -v dev=/dev/dvd blank=fast -eject
.SS
.B Format DVD-RW before first use with cdrskin:
.B Format DVD-RW to avoid need for blanking before re-use:
.br
cdrskin -v dev=/dev/sr0 blank=format_overwrite
.SS

View File

@ -7,7 +7,7 @@ A cdrecord compatible command line interface for libburn.
This project is neither directed against original cdrecord nor does it exploit
any source code of said program. It rather tries to be an alternative method
to burn CD which is not based on the same code as cdrecord.
to burn CD or DVD, which is not based on the same code as cdrecord.
See also : http://scdbackup.sourceforge.net/cdrskin_eng.html
Interested users of cdrecord are encouraged to contribute further option
@ -33,47 +33,9 @@ The implementation of an option would probably consist of
See option blank= for an example.
------------------------------------------------------------------------------
About compliance with *strong urge* of API towards burn_drive_scan_and_grab()
For a more comprehensive example of the advised way to behave with libburn
see test/libburner.c .
cdrskin was the initiator of the whitelist functionality within libburn.
Now it has problems to obviously comply with the new API best practice
presciptions literally. Therefore this explanation:
On start it restricts the library to a single drive if it already knows the
persistent address by option dev= . This is done with a combination of
burn_drive_add_whitelist() and burn_drive_scan(). Not compliant to the
literal strong urge but in fact exactly fulfilling the reason for that
urge in the API: any scanned drive might be opened exclusively after
burn_drive_scan(). It is kernel dependent wether this behavior is on, off
or switchable. The sysdamin will want it on - but only for one drive.
So with dev=... cdrskin complies to the spirit of the strong urge.
Without dev=... it has to leave out the whitelist in order to enable bus
scanning and implicit drive address 0. A tradition of 9 months shall not
be broken. So burns without dev= will stay possible - but harmless only
on single drive systems.
Burns without dev= resp. with dev=number are harmless on multi-drive systems.
This is because Cdrskin_grab_drive() either drops the unwanted drives or
it enforces a restart of the library with the desired drive's persistent
address. This restart then really uses the strongly urged function
burn_drive_scan_and_grab().
Thus, cdrskin complies with the new spirit of API by closing down libburn
or by dropping unused drives as soon as the persistent drive address is
known and the drive is to be used with a long running operation. To my
knowlege all long running operations in cdrskin need a grabbed drive.
This spaghetti approach seems necessary to keep small the impact of new API
urge on cdrskin's stability. cdrskin suffers from having donated the body
parts which have been transplanted to libburn in order to create
burn_drive_scan_and_grab() . The desired sysadmin friendlyness was already
achieved by most cdrskin runs. The remaining problem situations should now
be defused by releasing any short time grabbed flocks of drives during the
restart of libburn.
For a more comprehensive example of the advised way to write an application
of libburn see test/libburner.c .
------------------------------------------------------------------------------
This program is currently copyright Thomas Schmitt only.
@ -2388,7 +2350,7 @@ struct CdrskiN {
bit8 = write zeros after formatting
bit9 = insist in size 0
bit10= format to maximum available size
2=format_sequential (unimplemented yet)
2=deformat_sequential (blank_fast might matter)
*/
double blank_format_size; /* to be used with burn_disc_format() */
@ -3900,10 +3862,10 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
int ret,loop_counter= 0,hint_force= 0,do_format= 0, profile_number= -1;
int wrote_well= 1;
double start_time;
char *verb= "blank", *presperf="blanking", *fmt_text= "format_...";
char *verb= "blank", *presperf="blanking", *fmt_text= "...";
char profile_name[80];
static char fmtp[][40]= {
"format_default", "format_overwrite", "format_sequential"};
"format_default", "format_overwrite", "deformat_sequential"};
static int fmtp_max= 2;
start_time= Sfile_microtime(0); /* will be refreshed later */
@ -3921,7 +3883,7 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
if(skin->verbosity>=Cdrskin_verbose_progresS)
Cdrskin_report_disc_status(skin,s,0);
do_format= skin->blank_format_type & 0xff;
if(do_format) {
if(do_format == 1) {
verb= "format";
presperf= "formatting";
}
@ -3938,29 +3900,28 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
}
#endif /* Cdrskin_libburn_has_pretend_fulL */
if(do_format) {
if(do_format)
if(do_format>=0 && do_format<=fmtp_max)
fmt_text= fmtp[do_format];
if(do_format!=1) {
/* >>> other formats to come. At least _sequential */;
if(do_format==2) {
/* Forceful blanking to Sequential Recording for DVD-R[W] and CD-RW */
fprintf(stderr,
"cdrskin: SORRY : only blank=%s is implemented yet\n",fmtp[1]);
return(0);
} else if(profile_number == 0x14) { /* DVD-RW sequential */
if(do_format!=1)
if(!(profile_number == 0x14 || profile_number == 0x13 ||
profile_number == 0x11 || profile_number == 0x0a))
goto unsupported_format_type;
} else if(profile_number == 0x13) { /* DVD-RW restricted overwrite */
if(do_format==1 && skin->force_is_set) {
/* ok */;
} else if(do_format!=1) {
unsupported_format_type:;
if(s==BURN_DISC_UNSUITABLE)
fprintf(stderr,
"cdrskin: SORRY : blank=%s : unsupported format and/or media type\n",
"cdrskin: NOTE : blank=%s accepted not yet suitable media\n",
fmt_text);
return(0);
} else {
} else if (do_format==1) {
/* Formatting to become overwriteable for DVD-RW and DVD+RW */
if(profile_number == 0x14) { /* DVD-RW sequential */
/* ok */;
} else if(profile_number == 0x13) { /* DVD-RW restricted overwrite */
if(!(skin->force_is_set || ((skin->blank_format_type>>8)&4))) {
fprintf(stderr,
"cdrskin: NOTE : blank=format_... : media is already formatted\n");
fprintf(stderr,
@ -3968,15 +3929,11 @@ unsupported_format_type:;
return(2);
}
} else if(profile_number == 0x1a) { /* DVD+RW */
if(do_format!=1)
goto unsupported_format_type;
if(!((skin->blank_format_type>>8)&4)) {
fprintf(stderr,
"cdrskin: NOTE : blank=format_... : DVD+RW do not need this\n");
fprintf(stderr,
"cdrskin: HINT : For de-icing use option blank=format_overwrite_full");
fprintf(stderr,
"cdrskin: HINT : If you really want to re-format, add option -force\n");
return(2);
}
} else {
@ -3989,7 +3946,8 @@ unsupported_format_type:;
"cdrskin: NOTE : blank=%s accepted not yet suitable media\n",
fmt_text);
} else { /* do_format */
} else if(do_format==0) {
/* Classical blanking of erasable media */
if(s!=BURN_DISC_FULL &&
(s!=BURN_DISC_APPENDABLE || skin->no_blank_appendable)) {
@ -4015,7 +3973,13 @@ unsupported_format_type:;
return(0);
}
} /* ! do_format */
} else {
unsupported_format_type:;
fprintf(stderr,
"cdrskin: SORRY : blank=%s is unsupported with media type %s\n",
fmt_text, profile_name);
return(0);
}
if(skin->dummy_mode) {
fprintf(stderr,
@ -4027,11 +3991,11 @@ unsupported_format_type:;
Cdrskin_adjust_speed(skin,0);
#ifndef Cdrskin_extra_leaN
Cdrskin_wait_before_action(skin,1+(!!do_format));
Cdrskin_wait_before_action(skin,1+(do_format==1));
#endif /* ! Cdrskin_extra_leaN */
skin->drive_is_busy= 1;
if(do_format==0) {
if(do_format==0 || do_format==2) {
burn_disc_erase(drive,skin->blank_fast);
#ifdef Cdrskin_libburn_has_burn_disc_formaT
@ -4074,7 +4038,7 @@ blanking_done:;
fprintf(stderr,
"\rcdrskin: %s done \n",
presperf);
printf("%s time: %.3fs\n",(do_format?"Formatting":"Blanking"),
printf("%s time: %.3fs\n",(do_format==1?"Formatting":"Blanking"),
Sfile_microtime(0)-start_time);
}
fflush(stdout);
@ -5159,9 +5123,10 @@ set_blank:;
skin->do_blank= 1;
skin->blank_format_type= 1;
skin->blank_format_size= 0;
} else if(strcmp(cpt,"format_sequential")==0) {/* >>> not yet supported */
} else if(strcmp(cpt,"deformat_sequential")==0) {
skin->do_blank= 1;
skin->blank_format_type= 2;
skin->blank_fast= 0;
} else if(strcmp(cpt,"help")==0) {
/* is handled in Cdrpreskin_setup() */;
continue;

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2007.01.30.220220"
#define Cdrskin_timestamP "2007.01.31.130100"

View File

@ -235,9 +235,11 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
/* ts A70103 moved up from burn_disc_erase_sync() */
/* ts A60825 : allow on parole to blank appendable CDs */
/* ts A70131 : allow blanking of overwriteable DVD-RW (profile 0x13) */
if ( ! (drive->status == BURN_DISC_FULL ||
(drive->status == BURN_DISC_APPENDABLE &&
! libburn_back_hack_42) ) ) {
! libburn_back_hack_42) ||
drive->current_profile == 0x13 ) ) {
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020130,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
@ -246,6 +248,10 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
return;
}
/* ts A70131 : i get awful results with fast blanking DVD-RW */
if (drive->current_profile == 0x13 || drive->current_profile == 0x14)
fast = 0;
o.drive = drive;
o.fast = fast;
add_worker(drive, (WorkerFunc) erase_worker_func, &o);