From 38aaa2f8aa771bb122cd86f8b668d5398822af24 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 31 Dec 2011 12:00:14 +0000 Subject: [PATCH] New track mode modifier BURN_SCMS --- cdrskin/cdrskin_timestamp.h | 2 +- doc/cookbook.txt | 25 +++++++++++++++++++++---- libburn/libburn.h | 7 +++++++ libburn/write.c | 11 ++++++++--- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index a47bede..3e7fcdb 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2011.12.30.174416" +#define Cdrskin_timestamP "2011.12.31.120007" diff --git a/doc/cookbook.txt b/doc/cookbook.txt index 8f9952c..1b99636 100644 --- a/doc/cookbook.txt +++ b/doc/cookbook.txt @@ -228,6 +228,8 @@ sync. libburn uses the info provided by 52h READ TRACK INFORMATION. ------------------------------------------------------------------------------- Guided by reading libburn/* from http://icculus.org/burn backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/ +backed by reading scms.html from + http://www.barrel-of-monkeys.com/graphics/prod/dvdplayers/ and by experiments with drives NEC ND-4570A, LG GSA-4082B, LITE-ON LTR48125S, Optiarc BD RW BD-5300S, LG BDDVDRW GGC-H20L @@ -266,24 +268,39 @@ Each entry of the sheet is of 8 bytes size. Its fields are named CTL|ADR, TNO, INDEX, DATA FORM, SCMS, MIN, SEC, FRAME . (mmc5r03c.pdf 6.33) -CTL is 40h for data and 00h for audio. +CTL is comprised of four bits: + bit4 = Pre-emphasis (audio only) + bit5 = Digital copy permission: + 0 = prohibited (one-time copy is permitted if SCMS is 00h) + 1 = permitted (unlimited) + bit6 = Data track indicator (bit4 and bit7 shall be 0) + bit7 = 4-channel audio +Usually CTL is 40h for data and 00h for audio. (mmc5r03c.pdf 6.33.3.4) ADR is 01h for entries which define time points. It is 02h for media catalog entries and it is 03h for track ISRC entries. +The bits of CTL and ADR are combined in the CTL|ADR byte. + TNO is the track number (1 to 99). + INDEX is a subaddress within tracks. This recipe uses only INDEX 01h within tracks. (mmc5r03c.pdf 4.2.3.5.2) + DATA FORM is 00h for audio payload, 01h for audio pause, 10h for data, 41h for CD-TEXT in Lead-in. (mmc5r03c.pdf 6.33.3.11 CD-DA Data Form, 6.33.3.12 CD-ROM mode 1 Form) -SCMS is always 00h. + +SCMS value 80h in conjunction with bit5 of CTL is an indicator for exhausted +one-time-copy permission. If this permission is still intact, then SCMS is 00h. + MIN, SEC, FRAME give the MSF address where the described data entity starts. LBA = frames - 150, 75 frames = 1 sec , 60 sec = 1 min. This address must increase from entry to entry (or at least stay equal). -The first two entries describe the Media Catalog Number, a string of 13 -characters, also known with CD-TEXT as "UPC/EAN". + +The first two entries in a Cue Sheet describe the Media Catalog Number, +a string of 13 characters, also known with CD-TEXT as "UPC/EAN". (02h, catalog characters 1 to 7) (02h, catalog characters 8 to 13, 00h) These two entries shall be omitted if no catalog number is given. diff --git a/libburn/libburn.h b/libburn/libburn.h index 75232bb..3831df2 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -121,6 +121,13 @@ struct burn_write_opts; /** Input mode modifier - subcodes present raw 96 */ #define BURN_SUBCODE_R96 (1 << 12) +/* ts B11230 */ +/** Track mode modifier - Serial Copy Management System, SAO only + @since 1.2.0 +*/ +#define BURN_SCMS (1 << 13) + + /** Possible disc writing style/modes */ enum burn_write_types { diff --git a/libburn/write.c b/libburn/write.c index 02db517..2a283b8 100644 --- a/libburn/write.c +++ b/libburn/write.c @@ -452,7 +452,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o, { int i, m, s, f, form, pform, runtime = -150, ret, track_length; int leadin_form, leadin_start; - unsigned char ctladr; + unsigned char ctladr, scms; struct burn_drive *d; struct burn_toc_entry *e; struct cue_sheet *sheet; @@ -581,6 +581,10 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o, pform = form; for (i = 0; i < ntr; i++) { type_to_form(tar[i]->mode, &ctladr, &form); + if (tar[i]->mode & BURN_SCMS) + scms = 0x80; + else + scms = 0; if (tar[i]->isrc.has_isrc) { ret = add_isrc_cue(sheet, ctladr, i + 1, @@ -603,7 +607,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o, if (pform != form) { - ret = add_cue(sheet, ctladr | 1, i + 1, 0, form, 0, + ret = add_cue(sheet, ctladr | 1, i + 1, 0, form, scms, runtime); if (ret <= 0) goto failed; @@ -644,7 +648,8 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o, e[3 + i].adr = 1; e[3 + i].control = type_to_ctrl(tar[i]->mode); - ret = add_cue(sheet, ctladr | 1, i + 1, 1, form, 0, runtime); + ret = add_cue(sheet, ctladr | 1, i + 1, 1, form, scms, + runtime); if (ret <= 0) goto failed;