libburnia.pykix.org Optical Media Rotisserie Recipes as of February 2007 Content: - TAO Multi-Session CD Cookbook (CD-R, CD-RW) - SAO CD Cookbook (CD-R, CD-RW, pure audio or pure data only) - Overwriteable DVD Cookbook (DVD-RAM, DVD+RW, DVD-RW) - Sequential DVD-R[W] Cookbook - >>> DVD+R Cookbook (emerging, totally untested yet) ------------------------------------------------------------------------------- TAO Multi-Session CD Cookbook ------------------------------------------------------------------------------- Guided by reading mmc-r10a.pdf , O.8 "Write a Track" from http://www.t10.org/ftp/t10/drafts/mmc/ backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/ by reading spc3r23.pdf from http://www.t10.org/ftp/t10/drafts/spc3/ by reading libburn/* from http://icculus.org/burn and by experiments with drives NEC ND-4570A, LG GSA-4082B, LITE-ON LTR48125S which used in part code from http://icculus.org/burn. For libburnia.pykix.org by Thomas Schmitt ------------------------------------------------------------------------------- Media type can be recognized by Current Profile from 46h GET CONFIGURATION. (mmc5r03c.pdf 6.6.2.1) CD-R 0009h CD-RW 000ah The following topics are covered in this text: - About blank, appendable and finalized CD media - Writing a session to CD in TAO mode - Obtaining CD multi-session info for extending ISO-9660 filesystems - Obtaining a Table Of Content from CD ------------------------------------------------------------------------------- About blank, appendable and finalized CD media : CD media have to be blank or appendable in order to be writeable in TAO mode. The according status may be inquired by 51h READ DISC INFORMATION requesting Data Type 000b Standard Disc Information, where reply value Disc Status indicates: 00b blank 01b appendable 10b finalized 11b others (unsuitable for this recipe) (mmc5r03c.pdf 6.22.3.1.4) CD-RW which are finalized or appendable may be blanked by command A1h BLANK with blanking types 000b "Blank the disc" or 001b "Minimally blank the disc". The Start Address/Track Number will be ignored so it may well be 0. Because the operation is long running it is advised to set the Immed bit and to watch the progress by commands 00h TEST UNIT READY and 03h REQUEST SENSE with DESC bit set to 0 for fixed format reply. It is done when 00h succeeds and 03h reports 0 in PROGRESS INDICATION (byte 1+2 in Table 22 = byte 16+17 SENSE KEY SPECIFIC in table 26). (mmc5r03c.pdf 6.2 BLANK) (spc3r23.pdf 4.5.2.4.4 table 22, 4.5.3 table 26, 6.27 REQUEST SENSE, 6.33 TEST UNIT READY) ------------------------------------------------------------------------------- Writing a session to CD in TAO mode : The writing method for blank or appendable media is the same. A new session will get created automatically by the first track when it is written. If the media is blank then the new session will be the first and only one in the table of content. If the media is appendable then a new session will be appended to the existing sessions. In any case the new track will be the first one in the new session. Speed may be set by BBh SET CD SPEED parameter Drive Write Speed. Note that kbytes/sec means 1000 bytes/sec and not 1024/sec. Rotational control should be set to 00b. 1x CD speed is 176.4 kbytes/sec. Speed is usually set to the next lower possible value by the drive. So it is helpful to add a few kbytes/sec just in case the drive has rounding problems. (mmc5r03c.pdf 6.37) Before writing can occur, a Write Parameters mode page 05h has to be composed and transmitted via 55h MODE SELECT. Mode page 05h describes several burn parameters: BUFE Buffer Underrun protection 0=off, 1=on Test Write -dummy mode for writing 0=off, 1=on Write Type Packet/TAO/SAO/RAW 01h = TAO Multi-session Wether to keep appendable 00b = finalize 11b = keep appendable Track Mode Describes frame type 4 for data , 0 for audio Data Block Type Layout of payload blocks 8 for 2048 byte data blocks 0 for 2352 byte audio blocks Audio Pause Length 150 = 2 seconds Any other parameters may be set to 0. Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header as of SPC-3 table 240. This 8-byte header may be filled with zeros. (mmc5r03c.pdf 7.5.4 The Mode Page, 4.2.3.4 Table 17 CONTROL = Track Mode) (spc3r23.pdf 6.8 MODE SELECT, 7.4.3 Mode parameter header formats) Writing has to begin at the address returned by 52h READ TRACK INFORMATION with Address/Number Type set to 01b and Logical Block Address/Track/Session Number set to FFh. The Next Writeable Address as of table 500 is the number to start writing with. (mmc5r03c.pdf 6.27 ) Writing is performed by one or more 2Ah WRITE transactions with the Logical Block Address counted up from the initial number in sync with the number of blocks written. I.e the Transfer Length of the previous 2Ah WRITE has to be added to the Logical Block Address for the next 2Ah WRITE. Only full blocks can be written. (mmc5r03c.pdf, 6.44) When writing is done, it is mandatory to force the drive's buffer to media by 35h SYNCHRONIZE CACHE. (mmc5r03c.pdf, 6.41) A track must at least contain 300 payload blocks: 4 seconds of audio or 600 KiB of data. (mmc5r03c.pdf 6.3.3.1.2) The track has to be closed by 5Bh CLOSE TRACK SESSION Close Function 001b. Older MMC specifies a valid Logical Track Number FFh to depict the open track. MMC-5 is quite silent about this. FFh works for my drives. (mmc5r03c.pdf 6.3.3.1.2) After that, a new track may be written beginning with sending the mode page 05h again. It is not tested wether 05h can be omitted if Track Mode and Data Block Type are the same as with the previous track. The new track will be added to the session which was opened by the first track. After the last track of a session, 5Bh CLOSE TRACK SESSION Close Function 010b with Logical Track Number 0 closes the session. It depends on the Multi-Session value in mode page 05h wether the disc is finalized or stays appendable. (mmc5r03c.pdf 6.3.3.1.3) ------------------------------------------------------------------------------- Obtaining CD multi-session info for extending ISO-9660 filesystems : Program mkisofs expects two numbers with its option -C which describe the situation on an appendable CD which already contains a ISO-9660 filesystem in the first track of the last session. The first number is the Logical Block Address of that track containing the existing ISO-9660 filesystem image. This number is needed for mkisofs option -M to connect to the existing image. The new image will refer to files in the previously existing image. mkisofs option -M needs read access to the CD or a blockwise copy of it on hard disk. The number is gained by 43h READ TOC/PMA/ATIP. (mmc5r03c.pdf 6.26) Untested is Format 0001b which in table 478 promises quick access via Start Address Of First Track In Last Session. (mmc5r03c.pdf 6.26.2.5 table 478, 6.26.3.3.1) libburn gets the number from its Table Of Content model which is obtained by 43h READ TOC/PMA/ATIP, Format 0010b. See below. The second number is an exact prediction of the Logical Block Address of the new track which will contain the newly generated ISO-9660 image. Even without mkisofs option -M this second number is still needed to make the inner block address pointers of the image match the Logical Block Addresses on CD. For that one may inquire 52h READ TRACK INFORMATION with Address/Number Type set to 01b and Logical Block Address/Track/Session Number set to FFh. The Next Writeable Address as of table 500 is the number to use. (mmc5r03c.pdf 6.27 ) ------------------------------------------------------------------------------- Obtaining a Table Of Content from CD : The structure of a CD is comprised of sessions. Each session contains one or more tracks and is followed by a lead-out. A track has an address and a length. Table of content information is gained by 43h READ TOC/PMA/ATIP, Format 0010b. (mmc5r03c.pdf 6.26.2.5 table 478) The number of sessions is given by Last Complete Session Number. The number of TOC Track descriptors is: (TOC Data Length - 2)/11 . Each TOC Track Descriptor contains a Session Number. If POINT is >= 1 and <= 99 (63h) then the descriptor is about the track of which POINT tells the number. The start address of this track can be read from PMIN, PSEC, PFRAME where it is encoded in MSF format: blocks = frames - 150, 75 frames = 1 sec , 60 sec = 1 min. The length of the track is given by MIN,SEC,FRAME in the same format. If POINT = A0h then the descriptor tells in PMIN the first track number of its session. POINT = A1h tells in PMIN the last track number of its session. POINT = A2h describes in PMIN, PSEC, PFRAME the lead-out of a session, i.e the first address after the session's end. (Next writeable address typically is lead-out + 11400 after the first session, lead-out + 6900 after further sessions.) POINT = B0h tells in MIN,SEC,FRAME this next writeable address or FFh,FFh,FFh for finalized disc. (mmc5r03c.pdf 6.26.3.4 table 489, 4.2.3.7 Mode-1 Q, Mode-5 Q) In libburn the address of the first track in the last session is obtained from the last session's POINT = A0h and from the track descriptor with the POINT value matching the PMIN value of the A0h descriptor. Untested is wether POINT = B0h and 52h READ TRACK INFORMATION are always in sync. libburn uses the info provided by 52h READ TRACK INFORMATION. ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- SAO CD Cookbook ------------------------------------------------------------------------------- Guided by reading libburn/* from http://icculus.org/burn backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/ and by experiments with drives NEC ND-4570A, LG GSA-4082B, LITE-ON LTR48125S which used in part code from http://icculus.org/burn. For libburnia.pykix.org by Thomas Schmitt ------------------------------------------------------------------------------- Recognition of media type and state (blank, appendable, finalized) is as described in the TAO Multi-Session CD Cookbook. See there. The MMC specs do not give much hint about the combination of SAO and multi-session. My drives refused not only on a few experiments which i did in libburn but also failed with cdrecord -sao on an appendable CD. So for now only blank CD seem to be suitable for SAO writing. Different from TAO mode, the whole session layout is announced to the drive by sending a Cue Sheet. This implies that the sizes of the tracks have to be known in advance, which is a heavy drawback when dealing with track data sources like stdin, named pipes or sockets. Nevertheless, SAO seems to be best writing mode for audio purposes, as our audio expert Lorenzo Taylor found out. A SAO session in libburn may either consist entirely of audio tracks or entirely of data tracks. For mixed sessions, only TAO is usable yet. - Composing a SAO CD Cue Sheet (either audio or data, but not mixed) - Writing the prepared SAO CD session - What is known about mixed mode sessions ------------------------------------------------------------------------------- Composing a Cue Sheet (either audio or data, but not mixed) : The Cue Sheet will get submitted to the drive by 5Dh SEND CUE SHEET. 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. (mmc5r03c.pdf 6.33.3.4) ADR is always 01h. 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 , 10h for data. (01h for audio pause is not used in libburn). (mmc5r03c.pdf 6.33.3.11 CD-DA Data Form, 6.33.3.12 CD-ROM mode 1 Form) SCMS is always 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 entry describes the Lead-in. Its content is (CTL|ADR ,00h,00h,01h,00h,00h,00h,00h) With the CTL|ADR for the first track: 41h for data, 01h for audio. The LBA for the first write is negative: -150. This corresponds to MSF address 00h:00h:00h. All addresses are to be given in MSF format. The first information track on disc is preceded by a pause encoding of 2 sec: (CTL|ADR,01h,00h, DATA FORM ,00h,00h,00h,00h) with DATA FORM = 00h for audio and 10h for data. By those 2 seconds the MSF address increases to 00h:02h:00h = LBA 0. Each track is represented by an entry (CTL|ADR, TNO ,01h,DATA FORM,00h, MIN , SEC , FRAME) TNO gives the track number. MIN, SEC, FRAME give the MSF address which becomes the start address of the track. The MSF address is then increased by the size of the track (to be used with next track or with lead-out). A track must at least contain 300 payload blocks: 4 seconds of audio or 600 KiB of data. (mmc5r03c.pdf 6.33.3.6) At the end of the session there is a lead-out entry (CTL|ADR,AAh,01h,01h,00h,MIN,SEC,FRAME) marking the end of the last track. (With libburn CTL is as of the last track.) ------------------------------------------------------------------------------- Writing the prepared session : Speed may be set by BBh SET CD SPEED parameter Drive Write Speed. Note that kbytes/sec means 1000 bytes/sec and not 1024/sec. Rotational control should be set to 00b. 1x CD speed is 176.4 kbytes/sec. Speed is usually set to the next lower possible value by the drive. So it is helpful to add a few kbytes/sec just in case the drive has rounding problems. (mmc5r03c.pdf 6.37) A Write Parameters mode page 05h has to be composed and transmitted via 55h MODE SELECT. This page describes the following parameters: BUFE Buffer Underrun protection 0=off, 1=on Test Write -dummy mode for writing 0=off, 1=on Write Type Packet/TAO/SAO/RAW 02h = SAO Multi-session Wether to keep appendable 00b = finalize 11b = keep appendable Track Mode Describes frame type 0 (is ignored) Data Block Type Layout of payload blocks 0 (is ignored) Audio Pause Length 150 = 2 seconds (ignored ?) Any other parameters may be set to 0. Mode page data as of MMC-5 table 644 are preceded by a Mode Parameter Header as of SPC-3 table 240. This 8-byte header may be filled with zeros. (mmc5r03c.pdf 7.5.4 The Mode Page, 4.2.3.4 Table 17 CONTROL = Track Mode) (spc3r23.pdf 6.8 MODE SELECT, 7.4.3 Mode parameter header formats) The Cue Sheet is submitted to the drive by 5Dh SEND CUE SHEET. Cue Sheet Size is 8 times the number of entries. (mmc5r03c.pdf 6.33) Writing is performed by multiple 2Ah WRITE transactions with the Logical Block Address counted up from the initial number in sync with the number of blocks written. I.e the Transfer Length of the previous 2Ah WRITE has to be added to the Logical Block Address for the next 2Ah WRITE. Only full blocks can be written. (mmc5r03c.pdf, 6.44) Writing begins at LBA -150 which is to be transmitted as 4-byte, Big-endian, two's-complement. E.g: -150 = FFh FFh FFh 6Ah. This is the natural form found with about any 32-bit processor, so only the endianness has to be taken into respect when converting a 32-bit integer into a LBA for command 2Ah WRITE. At first the mandatory pause preceding the first track has to be written as 150 blocks of the matching sector size: 2048 for data, 2352 for audio. By this, the LBA increases from -150 to 0. Next the tracks' payload is sent. For each track exactly the number of blocks has to be transmitted as is announced in the Cue Sheet by the difference of the track's own start address and the start address of the next entry in the Cue Sheet. After each write the LBA for the next write has to be increased by the number of blocks transmitted. Just like with TAO writing. There is no separator between the tracks of a pure mode SAO session. (If the session was mixed mode, there would be extended Pre-gaps and Post-gaps between data mode tracks and audio mode tracks.) (libburn sends its own buffer to the drive at the end of each track but does not sync the drive's chache. It is unclear wether this separation of tracks on the level of 2Ah WRITE is necessary with a pure mode session. It does not harm in any case and would probably be unavoidable if audio and data tracks were mixed.) When writing of all tracks is done, it is mandatory to force the drive's buffer to media by 35h SYNCHRONIZE CACHE. (mmc5r03c.pdf, 6.41) No further finalization is necessary. (I.e. no 5Bh CLOSE TRACK SESSION.) ---------------------------------------------------------------------------- What is known about mixed mode sessions : For now, SAO sessions with a mix of data and audio are not supported in libburn. Here are the reasons why. Obviously the code of http://icculus.org/burn is incomplete in this aspect. In mmc5r03c.pdf comparison of table 555 and 6.33.3.18 seems self-contradicting. (The second Pre-gap in table 555 does not match any of the criteria of 6.33.3.18. Also, there is no Post-gap shown in table 555 although 6.33.3.19 would prescribe some.) If a data track follows an audio track then the data track gets a preceding extended Pre-gap: (CTL|ADR, TNO ,01h,DATA FORM,00h, MIN , SEC , FRAME) with TNO already the number of the data track. The MSF address is to be increased by 3 seconds. The first second of the extended Pre-gap needs to be written in the audio track's mode and the other 2 seconds are to be written in the data track's mode. (libburn compares DATA FORM rather than burn_track.mode . Wrong ?) (libburn currently does only 2 seconds and the second part of Pre-gap. There is an issue with burn_track.pregap1 about this. Seems libburn mistakes the pause preceding track 1 for a part 2 of an extended Pre-gap.) If a data track is followed by an audio track then it gets a Post-gap of at least two seconds. No example of Post-gap is given for Cue Sheet. Maybe it is to be added to the track, or maybe it gets an own Cue Sheet entry ... who knows ? (libburn contains write code for pregap1, pregap2 and postgap. But only pregap2 ever gets activated. Once hackingly for the first 2 second pause, once incompletely for a change of DATA FORM.) Seems nobody ever tested this. Libburnia simply knows no use case where the correctness of Pre-gap and Post-gap would become evident. ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Overwriteable DVD Cookbook ------------------------------------------------------------------------------- Inspired by Andy Polyakov's http://fy.chalmers.se/~appro/linux/DVD+RW/tools , backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/ and by experiments with drives NEC ND-4570A and LG GSA-4082B. For libburnia.pykix.org by Thomas Schmitt ------------------------------------------------------------------------------- Media type can be recognized by Current Profile from 46h GET CONFIGURATION. (mmc5r03c.pdf 6.6.2.1) DVD-RAM 0012h DVD-RW Restricted Overwrite 0013h DVD-RW Sequential Recording 0014h (i.e. unformatted) DVD+RW 001Ah A short compilation of the write model: - Overwriting in general The recipes described here are depending on formatting state: - DVD-RAM, fully formatted DVD+RW or DVD-RW - Unformatted DVD+RW - Partly formatted DVD+RW - Unformatted DVD-RW - Partly formatted DVD-RW - Intermediate state DVD-RW ------------------------------------------------------------------------------- Overwriting in general : Depending on media type, some kind of formatting has to have happened before data can be written. Formatting may happen separately from writing or simultaneously. See the particular recipes below. No Write Parameters mode page 05h is to be sent. Speed can be influenced by B6h SET STREAMING , speed capabilities can be inquired by ACh GET PERFORMANCE. It is advised to set only speeds and sizes which are returned by ACh. (mmc5r03c.pdf 6.39 SET STREAMING, 6.8 GET PERFORMANCE) Optimal performance is promised without any speed setting. But my experiments showed that SET STREAMING values persist after media change. In the formatted area of the media, coarse random access is possible. For DVD-RAM and DVD+RW write addresses and data size need to be aligned to 2 KiB. For DVD-RW alignment has to be 32 KiB. Within these limitations the write address is at the discretion of the sending program. Just use 2Ah WRITE to send data. (mmc5r03c.pdf, 6.44) When writing is done, it is mandatory to force the drive's buffer to media by 35h SYNCHRONIZE CACHE. (mmc5r03c.pdf, 6.41) The size of the formatted area can be inquired by 23h READ FORMAT CAPACITIES. The Number Of Blocks value in the Current/Maximum Capacity Descriptor gives this size in 2 KiB blocks. But this is true only if Descriptor Type is 10b ("Formatted Media"). (mmc5r03c.pdf, 6.24.3.2.1, 6.24.3.2.3) Not yet formatted areas may be completely forbidden or they may be allowed for sequential writing (DVD-RW Intermediate state) or they may be allowed for random access only after the necessary waiting time for formatting to reach the desired address (DVD+RW with background formatting active). Already written areas can be overwritten without special precaution. Blanking a DVD-RW actually destroys its formatting. Most of the concepts usually expressed in Write Parameters mode page 05h do not apply to the recipes here: Test-Write, Buffer Underrun protection, Multi-session, Write Type, Block Type, Track Mode, ... There are hints for multi-session formats with DVD-RW but both of my drives do not offer "Add Session" Format Types 12h or 14h. (mmc5r03c.pdf 6.5.4.2.7 , 6.5.4.2.9) Caution: Drive and media compatibility seems still to be quite an adventure. If you experience problems, especially problems with readability, then try different drives and media brands. Failure does not necessarily mean that the software did anything wrong. ------------------------------------------------------------------------------- DVD-RAM, fully formatted DVD+RW or DVD-RW : Full format is the natural state of DVD-RAM. DVD+RW reaches this state if Background Formatting is allowed to finish without being stopped by 5Bh CLOSE TRACK SESSION. (mmc5r03c.pdf, 6.5 FORMAT UNIT, 6.5.4.2.14 Format Type = 26h) The formatting state of a DVD+RW may be inquired by 51h READ DISC INFORMATION requesting Data Type 000b "Standard Disc Information". In the reply, BG Format 3 indicates fully formatted media. (mmc5r03c.pdf 6.22.3.1.13) DVD-RW reaches this state either by Format Type 00h (or 10h) with maximum size given as Number Of Blocks, or by writing sequentially until the disc is completely full into an intermediate session opened by format 15h resp. 13h. (mmc5r03c.pdf, 6.5 FORMAT UNIT, 6.5.4.2.1, 6.5.4.2.10, 6.5.4.2.8) A fully formatted DVD-RW can be recognized by 23h READ FORMAT CAPACITIES. The Descriptor Type of the Current/Maximum Capacity Descriptor is 10b ("Formatted Media") and 0 blocks are offered with Format Types 13h or 11h. (mmc5r03c.pdf, 6.24.3.2.1, 6.24.3.3) See also discussion of unformatted or partially formatted DVD-RW below. In fully formatted state there is no need for any formatting before writing nor for any finalizing other than forcing the drive's buffer to media by 35h SYNCHRONIZE CACHE (which is mandatory for writing, anyway). (mmc5r03c.pdf, 6.41) (It seems to do no harm to send to DVD+RW or DVD-RW a 5Bh CLOSE TRACK SESSION with Close Function 010b despite there is no session open in this scenario.) ------------------------------------------------------------------------------- Unformatted DVD+RW This is the state of previously unused DVD+RW media. The formatting state of a DVD+RW may be inquired by 51h READ DISC INFORMATION requiring Data Type 000b "Standard Disc Information". In the reply, BG Format 0 indicates unformatted media (or unsuitable media). (mmc5r03c.pdf 6.22.3.1.13) Formatting has to be started by command 04h FORMAT UNIT, Format Type 26h. Different from other format types, 26h allows to send a fantasy size of 0xffffffff blocks and does not require the caller to know the exact maximum size offered with that format. (mmc5r03c.pdf, 6.5 FORMAT UNIT, 6.5.4.2.14 Format Type = 26h) As its name suggests, one has not to wait for background formatting to end but may very soon start writing as on formatted media. Random access to yet unformatted areas can last long, though. If backup formatting has been started at the beginning of the session, then it may get stopped after the final cache sync by 5Bh CLOSE TRACK SESSION with Close Function 010b. (mmc5r03c.pdf 6.3.3.6) Formatting of DVD+RW is called "de-icing" because unformatted areas offer no hold for random access addressing and are thus slippery like ice. One can also see a color change from shiny unformatted to more dull formatted media. ------------------------------------------------------------------------------- Partly formatted DVD+RW : This state is achieved by stopping background formatting before the media was completely formmatted. The formatting state of a DVD+RW is obtained by 51h READ DISC INFORMATION requiring Data Type 000b "Standard Disc Information". In the reply, BG Format 1 indicates partly formatted media. (mmc5r03c.pdf 6.22.3.1.13) If the data of the session surely fit into the formatted area, then it would be unnecessary to restart background formatting. But in order to make the DVD+RW surely accept its maximum number of bytes, formatting may be restarted by command 04h FORMAT UNIT, Format Type 26h, with the Restart bit set and Number of Blocks set to 0xffffffff. (mmc5r03c.pdf, 6.5 FORMAT UNIT, 6.5.4.2.14 Format Type = 26h) From then on, the same rules apply as for previously unformatted DVD+RW. ------------------------------------------------------------------------------- Unformatted DVD-RW (media profile is 0014h) : This state is present with previously unused media. It is also present with media blanked by programs cdrecord, wodim or dvd+rw-format and with media which were sequentially written from blank state. Profile transition from formatted 0013h to unformatted 0014h is done by A1h BLANK. (mmc5r03c.pdf, 6.2) Experiments on my drives indicate that only Blanking Type 000b "Blank the disc" achieves neat media. Media blanked via type 001b offer no feature 0021h and stall cdrecord or libburn already when those media get examined. growisofs can burn them - but only via DAO (feature 002Fh which prescribes Write Type 2). (mmc5r03c.pdf 5.3.11, 5.3.25) For becoming overwriteable such media need to be treated by command 04h FORMAT UNIT. (mmc5r03c.pdf, 6.5) The Format Type has to be chosen from the list replied by 23h READ FORMAT CAPACITIES. Suitable are Format Types 00h, 10h, 15h. (mmc5r03c.pdf 6.24) Format Types 00h and 10h provide a writeable area of a size given by Number of Blocks. Type 00h seems to be the most traditional and complete one. It needs no closing of a session at the end of writing. The Number Of Blocks may be at most the value reported by 23h READ FORMAT CAPACITIES in the entry for the desired format type. Full format is achieved by sending exactly the reported value. (mmc5r03c.pdf, 6.5.4.2.1 Format Type = 00h, 6.5.4.2.5 Format Type = 10h) Format Type 15h provides a writeable area of given size too, but this area can be expanded by sequential writing and afterwards marked as overwriteable by closing the session. It is even allowed to format with size 0 and to leave the size claim entirely to a sequential write process beginning at LBA 0. (mmc5r03c.pdf, 6.5.4.2.10 Format Type = 15h) When writing is done and cache is synced, one should send 5Bh CLOSE TRACK SESSION with Close Function 010b in order to bring the session out of Intermediate state. (mmc5r03c.pdf 6.3.3.2.3) If not written up to the last 32 KiB block, the DVD-RW is only partly formatted after that. ------------------------------------------------------------------------------- Partly formatted DVD-RW (media profile is 0013h) : This state is achieved by formatting a DVD-RW with a number of blocks which is less than offered for the Format Type by the drive's reply to 23h READ FORMAT CAPACITIES. If the media was most recently formatted by Format Types 015h or 013h then it must have got written some bytes and afterwards treated by 5Bh CLOSE TRACK SESSION, 010b in order to be partly formatted. (mmc5r03c.pdf 6.3.3.2.3 CLOSE TRACK SESSION 010b, 6.24 READ FORMAT CAPACITIES) Elsewise the media is in Intermediate state. See below. A partly formatted DVD-RW can be recognized by 23h READ FORMAT CAPACITIES. The Descriptor Type of the Current/Maximum Capacity Descriptor is 10b ("Formatted Media") and the Number Of Blocks with formats 00h, 10h or 15h is larger than the currently formatted size, resp. more than 0 blocks are offered with Format Types 13h or 11h. (mmc5r03c.pdf, 6.24.3.2.1, 6.24.3.3) If the data of the session surely fit into the formatted area, then it would be unnecessary to do any further formatting. But in order to make the DVD-RW surely accept its maximum number of bytes, partial formatting may be expanded by command 04h FORMAT UNIT, Format Type 13h, which is supposed to be offered by the drive in this state. This brings the session again into Intermediate state and thus allows expansion by sequential writing. As with Format Type 15h it is ok to set Number Of Blocks to 0, so that no fixed size formatting work is done and writing can begin soon after. (mmc5r03c.pdf, 6.5.4.2.8 Format Type = 13h) When writing is done and cache is synced, one should send 5Bh CLOSE TRACK SESSION with Close Function 010b in order to bring the session out of Intermediate state. (mmc5r03c.pdf 6.3.3.2.3) If not written up to the last 32 KiB block, the DVD-RW is only partly formatted after that. Format Type 13h has been tested only with expanding sessions formatted by 15h. Nevertheless it is offered with sessions from 00h and 10h, too. According to the specs, Format Type 11h would expand a session by a fixed size. This has not been tested yet because it is less appealing than 13h. (mmc5r03c.pdf, 6.5.4.2.6 Format Type = 11h) ------------------------------------------------------------------------------- Intermediate state DVD-RW (media profile is 0013h) : This state is achieved by formatting a DVD-RW with Format Type 15h or 13h without subsequentially writing data and sending 5Bh CLOSE TRACK SESSION with Close Function 010b. Such media behave very unpleasing with my DVD-ROM drive under Linux 2.4 ide-cd. One should therefore better avoid to release media in this state. This state can be recognized by 23h READ FORMAT CAPACITIES. The Descriptor Type of the Current/Maximum Capacity Descriptor is 11b ("Unknown Capacity") and no formats 13h or 11h are offered. (mmc5r03c.pdf, 6.24.3.2.1, 6.24.3.3) One may treat such media as if Format Type 15h or 13h had been freshly applied. I.e. sequential writing from LBA 0. After cache sync bring the session out of Intermediate state by 5Bh CLOSE TRACK SESSION with Close Function 010b. (mmc5r03c.pdf 6.3.3.2.3) ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Sequential DVD-R[W] Cookbook ------------------------------------------------------------------------------- Inspired by Andy Polyakov's http://fy.chalmers.se/~appro/linux/DVD+RW/tools , backed by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/ and by experiments with drives NEC ND-4570A and LG GSA-4082B. For libburnia.pykix.org by Thomas Schmitt ------------------------------------------------------------------------------- Media type can be recognized by Current Profile from 46h GET CONFIGURATION. (mmc5r03c.pdf 6.6.2.1) DVD-R 0011h DVD-RW Restricted Overwrite 0013h DVD-RW Sequential Recording 0014h (DVD-R/DL Sequential Recording 0015h untested, might be single-session only) There are two approaches for writing to sequential DVD-R[W]: DAO and Incremental. Not all media and drives offer Incremental which allows multi-session as with CD media and does not demand a predicted track size. DAO seems to be the older method. It allows only one single session and track and it demands an exactly predicted track size. - About overwriteable, blank, appendable and finalized DVD-R[W] media - Incremental writing - DAO writing - Obtaining DVD-R[W] multi-session info for extending ISO-9660 filesystems - Obtaining a Table Of Content from DVD-R[W] - Hearsay about DVD-R/DL (Dual Layer) ------------------------------------------------------------------------------- About overwriteable, blank, appendable and finalized DVD-R[W] media : DVD-RW can be either in formatted state Restricted Overwrite or in unformatted state Sequential Recording. Sequential media can be either blank, appendable or finalized. Only blank and appendable media are sequentially writeable. For overwriteable DVD-RW see the Overwriteable DVD Cookbook. Overwriteable DVD-RW can be detected by their profile number 0013h in contrast to profile number 0014h for sequential DVD-RW. The status of sequential media can be inquired like with CD by 51h READ DISC INFORMATION requesting Data Type 000b Standard Disc Information, where reply value Disc Status indicates: 00b blank 01b appendable 10b finalized 11b others (unsuitable for this recipe) (mmc5r03c.pdf 6.22.3.1.4) Finalized, appendable or overwriteable DVD-RW can be brought into blank sequential state by command A1h BLANK with blanking type 000b "Blank the disc". See TAO Multi-Session CD Cookbook for details about blanking. After minimal blanking (type 001b) DVD-RW my two drives do not offer the Incremental Streaming feature 0021h the media any more. Full blanking (000b) brings back this feature. (mmc5r03c.pdf 6.2) ------------------------------------------------------------------------------- Incremental writing : Incremental writing allows to produce multi-session DVDs. It is indicated by feature 0021h being marked current in the reply of 46h GET CONFIGURATION. growisofs inquires 0021h by setting Starting Feature Number to 0x21 and Allocation Length to 16 in order to get only this one. The feature descriptor begins at byte 8 of the reply. Its availability is indicated by the Current Bit. libburn obtains the full feature list for this and other info. (mmc5r03c.pdf 5.2.2. Feature Descriptor format, 5.3.11 Feature 0021h, 6.2 46h GET CONFIGURATION, ) In mode page 05h this method is selected by Write Type 00h. Speed can be influenced by B6h SET STREAMING , speed capabilities can be inquired by ACh GET PERFORMANCE. It is advised to set only speeds and sizes which are returned by ACh. (mmc5r03c.pdf 6.39 SET STREAMING, 6.8 GET PERFORMANCE) growisofs fetches a mode page 05h template by MODE SENSE and inserts its own parameters. It sets Multi-session to 11b, unless dvd_compat is nonzero. libburn composes its mode page 05h from zero and allows control of Multi-Session by the application. BUFE Buffer Underrun protection 0=off, 1=on LS_V Link size valid 1=true Test Write -dummy mode for writing 0=off, 1=on Write Type Packet/TAO/SAO/RAW 00h = Incremental (Packet) Multi-session Wether to keep appendable 00b = finalize 11b = keep appendable Track Mode Describes frame type 5 [*1] Data Block Type Layout of payload blocks 8 [*2] Link Size ??? 16 [*3] FP Fixed Packet Size Bit 1 Packet Size 16 [*4] (mmc5r03c.pdf 7.5.4 The Mode Page, 4.2.3.4 Table 17 CONTROL = Track Mode) (spc3r23.pdf 6.8 MODE SELECT, 7.4.3 Mode parameter header formats) [*1:] growisofs takes the Track Mode from 52h READ TRACK INFORMATION, Address/Number Type 1, Track 1, Track Information Block byte 5 & 0xf. (mmc5r03.pdf 6.27) The specs predict that this will be Track Mode 4 (6.27.3.8) and also state that default is 5 (7.5.4.12). 4 means: uninterrupted, do not copy. 5 means increment, do not copy. [*2:] 8 means: 2048 byte data blocks. growisofs sets this value if Data Mode from above 52h READ TRACK INFORMATION is 1 or Fh, which is predicted by the specs to be always true. (mmc5r03.pdf 6.27.3.10) [*3:] growisofs (transport.hxx) sets Link Size to 16 for profiles 0011h and 0014h. libburn now records the first link size from feature 0021h in its burn_drive structure. If another link size item is 16, then 16 is used. [*4:] growisofs takes Packet Size from 52h. Specs predict it will be 16 (= 32 kB). (mmc5r03.pdf 7.5.4.16) The writing process is much like in "Writing a session to CD in TAO mode" : Next Writeable Address is fetched from the reply of 52h READ TRACK INFORMATION. libburn writes full 32 kB buffers via 2Ah WRITE. (mmc5r03c.pdf, 6.27 READ TRACK INFORMATION, 6.44 WRITE) When writing is done, it is mandatory to force the drive's buffer to media by 35h SYNCHRONIZE CACHE. (mmc5r03c.pdf, 6.41) The track has to be closed by 5Bh CLOSE TRACK SESSION Close Function 001b. growisofs uses the logical track number for that and not FFh like libburn does with TAO CD. So libburn obtains the Last Track Number in Last Session from the reply of 51h READ DISC INFORMATION requesting Data Type 000b "Standard Disc Information". (mmc5r03c.pdf 6.3.3.2.2 CLOSE TRACK, 6.22.3.1.) Multiple tracks are permissible in a single session. After all of them have been written, 5Bh CLOSE TRACK SESSION Close Function 010b with Logical Track Number 0 closes the session. It depends on the Multi-Session value in mode page 05h wether the disc is finalized or stays appendable. (mmc5r03c.pdf 6.3.3.2.3) ------------------------------------------------------------------------------- DAO writing : DAO is the mode described by feature 002Fh. This feature also gives information about capabilities for Burnfree (BUF), Test Write and DVD-RW. (mmc5r03c.pdf 5.3.25) Experiments with growisofs showed that the track size needs to be predicted and may not be exceeded during the write process. (growisofs ran into SCSI errors with piped non-ISO-9660 images and with piped ISO-9660 which have trailing data.) Speed can be influenced by B6h SET STREAMING , speed capabilities can be inquired by ACh GET PERFORMANCE. It is advised to set only speeds and sizes which are returned by ACh. (mmc5r03c.pdf 6.39 SET STREAMING, 6.8 GET PERFORMANCE) The mode page 05h to be sent : BUFE Buffer Underrun protection 0=off, 1=on LS_V Link size valid 0=false [*3] Test Write -dummy mode for writing 0=off, 1=on Write Type Packet/TAO/SAO/RAW 02h = DAO (same code as SAO) Multi-session Wether to keep appendable 00b = finalize Track Mode Describes frame type 5 [*1] Data Block Type Layout of payload blocks 8 [*2] Link Size ??? 0 [*3] FP Fixed Packet Size Bit 0 [*3] Packet Size 0 [*3] (mmc5r03c.pdf 7.5.4 The Mode Page, 4.2.3.4 Table 17 CONTROL = Track Mode) (spc3r23.pdf 6.8 MODE SELECT, 7.4.3 Mode parameter header formats) [*1:] growisofs takes the Track Mode from 52h READ TRACK INFORMATION, Address/Number Type 1, Track 1, Track Information Block byte 5 & 0xf. (mmc5r03.pdf 6.27) [*2:] 8 means: 2048 byte data blocks. growisofs sets this value if Data Mode from above 52h READ TRACK INFORMATION is 1 or Fh, which is predicted by the specs to be always true. (If not: growisofs aborts.) (mmc5r03.pdf 6.27.3.10) [*3:] Link Size, Packet Size and their companions only apply to Write Type 00h. The session layout must be described by 53h RESERVE TRACK, RMZ=ARSV=0. Reservation size should better already be aligned to 32 KiB. It has not been tested yet, what happens if not enough data get written. (mmc5r03c.pdf 6.31) Next Writeable Address is fetched from the reply of 52h READ TRACK INFORMATION. The reply is supposed to be 0. libburn writes full 32 kB buffers via 2Ah WRITE. (mmc5r03c.pdf, 6.27 READ TRACK INFORMATION, 6.44 WRITE) If the track source delivers less than the announced size then libburn pads up by zeros. When writing is done, it is mandatory to force the drive's buffer to media by 35h SYNCHRONIZE CACHE. (mmc5r03c.pdf, 6.41) No further finalization is necessary. (I.e. no 5Bh CLOSE TRACK SESSION.) ------------------------------------------------------------------------------- Obtaining DVD-R[W] multi-session info for extending ISO-9660 filesystems : Like with CD it is necessary to obtain the two numbers for mkisofs option -C in order to prepare a ISO-9660 filesystem image which by its inner pointers matches the block addresses of the future location on media. These are the start address of the first track in the last complete session and the predicted start address of the track which will host the new image. See TAO Multi-Session CD Cookbook for some more info about mkisofs aspects. The first number may be gained by 43h READ TOC/PMA/ATIP Format 0001b which in table 478 promises quick access via Start Address Of First Track In Last Session. (mmc5r03c.pdf 6.26.2.5 table 478, 6.26.3.3.1) Regrettably the MMC-5 specs still define a useless reply for non-CD media which obviously stems from MMC-3 times when no multi-session was possible with non-CD. (mmc5r03c.pdf 6.26.3.3.3) Both my drives do give a useful reply with the correct number for appendable DVD-RW. But not being backed by the specs this method appears unappealing . Another approach would be a formatted Table of Content, obtained by 43h READ TOC/PMA/ATIP Format 0000b. The specs do not totally outrule that this returns useful data with non-CD but they define a crippled TOC for multi-session. (mmc5r03c.pdf 6.26.3.2.4) My LG drive returns a more detailed TOC, my NEC drive stays with the rather suboptimal specs. So one would get different TOCs on different drives. Nevertheless, the MMC-5 compliant TOC would return the desired number in the Track Start address of the track with the highest number before AAh. Most stable seems the approach to obtain the desired number from the reply of 52h READ TRACK INFORMATION, Address/Number Type 01b. The field Logical Block Address/Track/Session has to bear the track number of the first track in the last complete session. To determine this number one has to determine the number of the last session and the number of the last track from 51h READ DISC INFORMATION and to iterate over the tracknumber by 52h READ TRACK INFORMATION until the first track with the desired session number appears and reveils its start address. (mmc5r03c.pdf 6.22 51h DISC, 6.27 52h TRACK) This method is very near to fabricating an own TOC. So libburn does this when inspecting the media. If the first number for -C is needed, libburn inquires its TOC model for the address of the first track in the last complete session. See below for a detailed description of TOC fabrication. The second -C number is the exact prediction of future track start address. It is gained like with CD by 52h READ TRACK INFORMATION Type 01b. Different from CD one may not use track number FFh but has to use the Last Track in Last Session from 51h READ DISC INFORMATION. (mmc5r03c.pdf 6.22 51h DISC, 6.27 52h TRACK) ------------------------------------------------------------------------------- Obtaining a Table Of Content from DVD-R[W] : The raw TOC entries from 43h READ TOC/PMA/ATIP Format 0010b as described with CD media are not available with non-CD. There is a Format 0000b "Formatted TOC" but this is with non-CD a fictional information much at the discretion of the drive. Two drives with the same disc may well return different Formatted TOC. They are supposed to be consistent only about the last complete session and even there the MMC-5 specification 6.26.3.2.5 seems to prescribe a structure which does not match the true structure of incremental writing to sequential DVD-R[W]. (mmc5r03c.pdf 6.26.3.2) So i prefer not to use this method of getting a TOC. The alternative is to produce an own TOC from information gained by 51h READ DISC INFORMATION and by 52h READ TRACK INFORMATION which reveil a CD-like structure of sessions and 1:n related tracks. 51h READ DISC INFORMATION Data Type 000b, fields Number of Sessions (Least Significant Byte) and Number of Sessions (Most Significant Byte) give the number of sessions. The last complete session number of an appendable disc is one less because there is an incomplete session at its end. libburn only records complete sessions in its TOC model. libburn uses Last Track in Last Session as a hint for the range of track numbers. (mmc5r03c.pdf 6.22) Next step is to iterate from 1 up to the last track number and to obtain the according track info by 52h READ TRACK INFORMATION. Each track tells its Session Number (LSB at byte 2, MSB at 33), its Logical Track Start Address, its Logical Track Size, and much more which is not needed for a fake CD TOC. One may analyze the track info more finely but for this special purpose it is enough to discard the tracks which do not belong to complete sessions. (mmc5r03c.pdf 6.27) At the end of each session libburn inserts fake leadout entries into its TOC model. Their start address is computed from the start and size of the last track of the session. ------------------------------------------------------------------------------- Hearsay about DVD-R/DL (Dual Layer) : DVD-R/DL can assume profile 0015h DVD-R Dual Layer Sequential which is supposed to behave like DVD-R or 0016h DVD-R Dual Layer Jump which has no counterpart with DVD-R. A half-sentence in mmc5r03c.pdf 6.3.3.3.3 might indicate that closing a session by 5Bh CLOSE TRACK SESSION Close Function 010b overrides the multi-session bits in mode page 05h. growisofs applies this function in case of not DAO, though. A comment in growisofs_mmc.cpp states: "// DVD-R DL Seq has no notion of multi-session". I am not reading this from the specs - but not explicitely the contrary either. For now libburn will close the session but there is a macro prepared in libburn/write.c Libburn_dvd_r_dl_multi_no_close_sessioN which will suppress close session if multi-session is demanded. ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- INCOMPLETE, YET TOTALLY UNTESTED DVD+R Cookbook ------------------------------------------------------------------------------- Inspired by reading mmc5r03c.pdf from http://www.t10.org/ftp/t10/drafts/mmc5/ backed by Andy Polyakov's http://fy.chalmers.se/~appro/linux/DVD+RW/tools , For libburnia.pykix.org by Thomas Schmitt ------------------------------------------------------------------------------- Media type can be recognized by Current Profile from 46h GET CONFIGURATION. (mmc5r03c.pdf 6.6.2.1) DVD+R 001bh DVD+R/DL 002bh - About empty, appendable and finalized DVD+R - Writing a Pseudo Session to DVD+R - >>> Obtaining multi-session info for extending ISO-9660 filesystems - >>> Obtaining a Table Of Content from CD - >>> Hearsay about DVD+R/DL (Dual Layer) : ------------------------------------------------------------------------------- About blank, appendable and finalized DVD+R : In the beginning a DVD+R holds an empty session and the Incomplete Fragment. From these one may spawn reserved fragments or one may write directly to the incomplete fragment. As soon as this is done the empty session becomes the open session which finally needs to get closed. By closing fragments and session a new empty session with empty Incomplete Fragment gets spawned. So the disc stays appendable. A DVD+R may hold 153 closed sessions with a single track each. The open session may hold up to 15 open fragments. But on closure of the session those fragments together form a single logical track. So one will usually only use a single fragment for sequential writing. (mmc5r03c.pdf 4.3.6.2) The disc may get finalized by another close command so that no more data can be written. (mmc5r03c.pdf 6.3.3.4.4) ------------------------------------------------------------------------------- Writing a Pseudo Session to DVD+R : Session writing has to be pseudo because only one logical track per session can be distinguished. So actually there have to be written multiple sessions to mark multiple tracks. The pseudo session cannot get marked on disc and thus the tracks of a pseudo session cannot be grouped accordingly in a TOC. Speed can be influenced by B6h SET STREAMING , speed capabilities can be inquired by ACh GET PERFORMANCE. It is advised to set only speeds and sizes which are returned by ACh. (mmc5r03c.pdf 6.39 SET STREAMING, 6.8 GET PERFORMANCE) No mode page 05h is to be sent. growisofs sends a page but the specs clearly state that one shall not do. (mmc5r03c.pdf 7.5.3) It is optional wether a track size is reserved in advance or not. Eventually this is done by 53h RESERVE TRACK, RMZ=ARSV=0. Reservation size should better already be aligned to 32 KiB. (mmc5r03c.pdf 6.31) The specs promise to pad up the track if not enough data get written. (mmc5r03c.pdf 6.3.3.4.2) Next Writeable Address is fetched from the reply of 52h READ TRACK INFORMATION with track number FFh. (mmc5r03c.pdf 6.27) Since the fixely set write type is 16-block packet, full 32 kB buffers have to be transmitted via 2Ah WRITE. (mmc5r03c.pdf 4.3.6.2.2) When writing is done, it is mandatory to force the drive's buffer to media by 35h SYNCHRONIZE CACHE. (mmc5r03c.pdf 6.41) The written fragment (i.e. track-to-be) has to be closed by 5Bh CLOSE TRACK SESSION Close Function 001b. (mmc5r03c.pdf 6.3.3.4.2) libburn obtains the necessary logical track number from Last Track Number in Last Session from the reply of 51h READ DISC INFORMATION requesting Data Type 000b. (mmc5r03c.pdf 6.22) After each track 5Bh CLOSE TRACK SESSION Close Function 010b with Logical Track Number 0 closes the DVD+R session but keeps the media appendable. (mmc5r03c.pdf 6.3.3.4.3) Eventually 5Bh CLOSE TRACK SESSION Close Function 101b is used to finalize the media with minimal radius. After that the disc is not appendable any more ! (mmc5r03c.pdf 6.3.3.4.4) ------------------------------------------------------------------------------- Hearsay about DVD+R/DL (Dual Layer) : >>> -------------------------------------------------------------------------------