From 4bf0732aa457ae0e292fcea8dabab640140144ca Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 28 Feb 2008 12:32:34 +0000 Subject: [PATCH] Made support for DVD+R DL official, enabled untested support for BD-RE --- libburn/trunk/cdrskin/cdrskin.1 | 24 +++++++++++------------ libburn/trunk/cdrskin/cdrskin_timestamp.h | 2 +- libburn/trunk/libburn/libburn.h | 9 +++++---- libburn/trunk/libburn/mmc.c | 20 ++++++++++--------- libburn/trunk/libburn/spc.c | 2 +- libburn/trunk/libburn/write.c | 16 +++++++++------ 6 files changed, 40 insertions(+), 33 deletions(-) diff --git a/libburn/trunk/cdrskin/cdrskin.1 b/libburn/trunk/cdrskin/cdrskin.1 index 588d717c..c41097a7 100644 --- a/libburn/trunk/cdrskin/cdrskin.1 +++ b/libburn/trunk/cdrskin/cdrskin.1 @@ -16,8 +16,8 @@ .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME -cdrskin \- burns preformatted data to CD-R[W], DVD-R[W], DVD+R[W], DVD-RAM -via libburn. +cdrskin \- burns preformatted data to CD-R[W], DVD-R[W], DVD+R[W], DVD+R/DL, +DVD-RAM via libburn. .SH SYNOPSIS .B cdrskin .RI [ options | track_source_addresses ] @@ -44,7 +44,7 @@ or in Session at Once mode for seamless tracks. .br Multi session on CD (follow-up sessions in TAO only) .br -or on DVD-R[W] (in Incremental mode) or on DVD+R. +or on DVD-R[W] (in Incremental mode) or on DVD+R[/DL]. .br Single session on DVD-RW or DVD-R (Disk-at-once). .br @@ -163,7 +163,7 @@ Multiple cycles of blanking and overwriting with random numbers might be. .SS .B Sequentially Recordable DVD Media: .br -Currently DVD-RW, DVD-R and DVD+R can be used for the Sequential recording +Currently DVD-RW, DVD-R and DVD+R[/DL] can be used for the Sequential recording model. .br DVD-RW must be in state "Sequential Recording". @@ -198,9 +198,9 @@ unpredicted length and to keep media appendable by option The only restriction towards CD-R[W] is the lack of support for -audio tracks. Multiple tracks per session are permissible. .br -The write modes for DVD+R resemble those with DVD-R except that with DVD+R +The write modes for DVD+R[/DL] resemble those with DVD-R except that with +R each track gets wrapped in an own session. There is no -dummy writing with -DVD+R. +DVD+R[/DL]. .br Quite deliberately write mode -sao insists in the tradition of a predicted track size and blank media, whereas -tao writes the tracks open ended and @@ -598,7 +598,7 @@ One should use it only if inavoidable. .TP .BI \-sao Write CD in Session At Once mode, a sequential DVD-R[W] in Disc-at-once -(DAO) mode, or a DVD+R. +(DAO) mode, or a DVD+R[/DL]. .br With CD this mode is able to put several audio tracks on media without producing audible gaps between them. @@ -606,8 +606,8 @@ producing audible gaps between them. With DVD-R[W] this mode can only write a single track. No -multi is allowed with DVD-R[W] -sao. .br --sao is permissible with overwriteable DVD and with DVD+R but actually only -imposes restrictions without providing known advantages. +-sao is permissible with overwriteable DVD and with DVD+R[/DL] but actually +only imposes restrictions without providing known advantages. .br -sao can only be used for tracks of fixely predicted size. This implies that track arguments which depict stdin or named pipes need to be preceeded by @@ -647,7 +647,7 @@ suffix ".wav". .TP .BI \-tao Write CD in Track At Once (TAO) mode, sequential DVD-R[W] in Incremental -Streaming mode, or DVD+R without traditional -sao restrictions. +Streaming mode, or DVD+R[/DL] without traditional -sao restrictions. This mode also applies pro-forma to overwriteable DVD media. .br Mode -tao can be used with track sources of unpredictable size, like standard @@ -951,7 +951,7 @@ tested. Currently this applies to : .br Profile 0015h , DVD-R/DL Sequential (will not allow -multi). .br -Profile 002Bh , DVD+R/DL. +Profile 0043h , BD-RE. .br If you really test such media, then please report the outcome on libburn-hackers@pykix.org @@ -1131,7 +1131,7 @@ cdrskin -v dev=0,1,0 fs=32m speed=8 \\ .br -tao padsize=300k - .SS -.B Write multi-session to the same CD, DVD-R[W] or DVD+R: +.B Write multi-session to the same CD, DVD-R[W] or DVD+R[/DL]: .br cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 1.iso .br diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index 9d5d9718..fae06783 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2008.02.22.213726" +#define Cdrskin_timestamP "2008.02.28.123152" diff --git a/libburn/trunk/libburn/libburn.h b/libburn/trunk/libburn/libburn.h index 5c65ff3b..1862b4ee 100644 --- a/libburn/trunk/libburn/libburn.h +++ b/libburn/trunk/libburn/libburn.h @@ -730,7 +730,7 @@ void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy); /** Allows the use of media types which are implemented in libburn but not yet tested. The list of those untested profiles is subject to change. Currently it contains: 0x15 "DVD-R/DL sequential recording", - 0x2b "DVD+R/DL" + 0x43 "BD-RE" If you really test such media, then please report the outcome on libburn-hackers@pykix.org If ever then this call should be done soon after burn_initialize() before @@ -1093,10 +1093,11 @@ off_t burn_disc_available_space(struct burn_drive *d, 0x09 "CD-R", 0x0a "CD-RW", 0x11 "DVD-R sequential recording", 0x12 "DVD-RAM", 0x13 "DVD-RW restricted overwrite", 0x14 "DVD-RW sequential recording", - 0x1a "DVD+RW", 0x1b "DVD+R". + 0x1a "DVD+RW", 0x1b "DVD+R" + 0x2b "DVD+R/DL" If enabled by burn_allow_untested_profiles() it also writes to profiles - 0x15 "DVD-R/DL sequential recording", 0x2b "DVD+R/DL". - Writeable stdio-drives return this profile + 0x15 "DVD-R/DL sequential recording", 0x43 "BD-RE". + Writeable stdio-drives return this profile: 0xffff "stdio file" @param d The drive where the media is inserted. @param pno Profile Number as of mmc5r03c.pdf, table 89 diff --git a/libburn/trunk/libburn/mmc.c b/libburn/trunk/libburn/mmc.c index df7baca6..931c6c2c 100644 --- a/libburn/trunk/libburn/mmc.c +++ b/libburn/trunk/libburn/mmc.c @@ -306,8 +306,9 @@ int mmc_read_track_info(struct burn_drive *d, int trackno, struct buffer *buf, c.opcode[1] = 1; if(trackno<=0) { if (d->current_profile == 0x1a || d->current_profile == 0x13 || - d->current_profile == 0x12 ) - /* DVD+RW , DVD-RW restricted overwrite , DVD-RAM */ + d->current_profile == 0x12 || d->current_profile == 0x43) + /* DVD+RW , DVD-RW restricted overwrite , DVD-RAM + BD-RE */ trackno = 1; else if (d->current_profile == 0x10 || d->current_profile == 0x11 || @@ -349,7 +350,7 @@ int mmc_get_nwa(struct burn_drive *d, int trackno, int *lba, int *nwa) *nwa = mmc_four_char_to_int(data + 12); num = mmc_four_char_to_int(data + 16); if (d->current_profile == 0x1a || d->current_profile == 0x13 || - d->current_profile == 0x12) { + d->current_profile == 0x12 || d->current_profile == 0x43) { /* overwriteable */ *lba = *nwa = num = 0; } else if (!(data[7]&1)) { @@ -1490,7 +1491,7 @@ static int mmc_read_disc_info_al(struct burn_drive *d, int *alloc_len) ts A70112 : same for DVD-RAM */ if (d->current_profile == 0x1a || d->current_profile == 0x13 || - d->current_profile == 0x12) + d->current_profile == 0x12 || d->current_profile == 0x43) d->status = BURN_DISC_BLANK; if (d->status == BURN_DISC_BLANK) { @@ -2104,7 +2105,8 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len) d->current_is_supported_profile = 1; #endif #ifdef Libburn_support_dvd_raM - if (cp == 0x12) + if (cp == 0x12 || (cp == 0x43 && burn_support_untested_profiles)) + /* DVD-RAM , BD-RE */ d->current_is_supported_profile = 1; #endif #ifdef Libburn_support_dvd_r_seQ @@ -2114,8 +2116,7 @@ static int mmc_get_configuration_al(struct burn_drive *d, int *alloc_len) d->current_is_supported_profile = 1; #endif #ifdef Libburn_support_dvd_plus_R - if (cp == 0x1b || (cp == 0x2b && burn_support_untested_profiles)) - /* DVD+R , DVD+R/DL */ + if (cp == 0x1b || cp == 0x2b) /* DVD+R , DVD+R/DL */ d->current_is_supported_profile = 1; #endif @@ -3004,8 +3005,9 @@ int mmc_compose_mode_page_5(struct burn_drive *d, pd[13] = 16; } else if (d->current_profile == 0x1a || d->current_profile == 0x1b || - d->current_profile == 0x2b || d->current_profile == 0x12) { - /* not with DVD+R[W][/DL] or DVD-RAM */; + d->current_profile == 0x2b || d->current_profile == 0x12 || + d->current_profile == 0x43) { + /* not with DVD+R[W][/DL] or DVD-RAM or BD-RE */; return 0; } else { /* Traditional setup for CD */ diff --git a/libburn/trunk/libburn/spc.c b/libburn/trunk/libburn/spc.c index 107abacb..45e949ea 100644 --- a/libburn/trunk/libburn/spc.c +++ b/libburn/trunk/libburn/spc.c @@ -580,7 +580,7 @@ void spc_sense_write_params(struct burn_drive *d) /* ts A70212 : try to setup d->media_capacity_remaining */ if (d->current_profile == 0x1a || d->current_profile == 0x13 || - d->current_profile == 0x12) + d->current_profile == 0x12 || d->current_profile == 0x43) d->read_format_capacities(d, -1); else if (d->status == BURN_DISC_BLANK || (d->current_is_cd_profile && d->status == BURN_DISC_APPENDABLE)) { diff --git a/libburn/trunk/libburn/write.c b/libburn/trunk/libburn/write.c index e6715fdb..f2f8df91 100644 --- a/libburn/trunk/libburn/write.c +++ b/libburn/trunk/libburn/write.c @@ -967,8 +967,9 @@ int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc, if (d->status == BURN_DISC_UNSUITABLE) goto unsuitable_profile; if (d->drive_role == 2 || - d->current_profile == 0x1a || d->current_profile == 0x12) { - /* DVD+RW , DVD-RAM , emulated drive on stdio file */ + d->current_profile == 0x1a || d->current_profile == 0x12 || + d->current_profile == 0x43) { + /* DVD+RW , DVD-RAM , BD-RE, emulated drive on stdio file */ if (o->start_byte >= 0 && (o->start_byte % 2048)) strcat(reasons, "write start address not properly aligned to 2048, "); @@ -1370,8 +1371,8 @@ int burn_dvd_write_session(struct burn_write_opts *o, ret = burn_disc_close_session_dvd_minus_r(o, s); if (ret <= 0) return 0; - } else if (d->current_profile == 0x12) { - /* DVD-RAM */ + } else if (d->current_profile == 0x12 || d->current_profile == 0x43) { + /* DVD-RAM , BD-RE */ /* ??? any finalization needed ? */; } else if (d->current_profile == 0x13) { /* DVD-RW restricted overwrite */ @@ -1522,8 +1523,9 @@ int burn_dvd_write_sync(struct burn_write_opts *o, d->needs_close_session = 0; - if (d->current_profile == 0x1a || d->current_profile == 0x12) { - /* DVD+RW , DVD-RAM */ + if (d->current_profile == 0x1a || d->current_profile == 0x12 || + d->current_profile == 0x43) { + /* DVD+RW , DVD-RAM , BD-RE */ ret = 1; if (d->current_profile == 0x1a) ret = burn_disc_setup_dvd_plus_rw(o, disc); @@ -2191,6 +2193,8 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address, alignment = 32 * 1024; if (d->current_profile == 0x1a) /* DVD+RW */ alignment = 2 * 1024; + if (d->current_profile == 0x43) /* BD-RE */ + alignment = 2 * 1024; if (alignment == 0) { sprintf(msg, "Write start address not supported"); libdax_msgs_submit(libdax_messenger, d->global_index,