From a81a1daaf404ed118b2df2658bb5b692e037a6cb Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 6 Sep 2009 11:20:18 +0000 Subject: [PATCH] Avoided to read third sixpack of manufacturer bytes with DVD-R media --- libburn/trunk/cdrskin/cdrskin_timestamp.h | 2 +- libburn/trunk/doc/mediainfo.txt | 5 ++- libburn/trunk/libburn/mmc.c | 44 ++++++++++++++++------- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index 564905b5..9218638d 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.09.06.092654" +#define Cdrskin_timestamP "2009.09.06.112121" diff --git a/libburn/trunk/doc/mediainfo.txt b/libburn/trunk/doc/mediainfo.txt index 65979e8e..cbb5846d 100644 --- a/libburn/trunk/doc/mediainfo.txt +++ b/libburn/trunk/doc/mediainfo.txt @@ -57,7 +57,9 @@ type specific information if the drive supports the particular Format Code. With DVD+ and BD there is a 8 character Manufacturer ID, a 3 character Media Id and a single character Media Revision. -With DVD-R and DVD-RW there is a Manufacturer ID of up to 18 characters. +With DVD-R, ECMA-279 promises a Manufacturer ID of up to 18 characters. +With DVD-RW, ECMA-338 gives up the meaning of the last six-pack. +Both, DVD-RW RITEKW01 and DVD-R RITEKF1 bear unprintable characters there. With DVD-ROM and DVD-RAM there seem to be no such ids. @@ -143,6 +145,7 @@ Format code 0Eh "Pre-recorded Information in Lead-in" ECMA-338 (DVD-RW) says the same in: 29.3.3.1.1 Format1 RMD Field0 Table 24 - Copy of Pre-pit Information + Manufacturer ID at bytes 17 to 22, 25 to 30, but not at 33 6.23.3.2.14 Format Code 0Eh: Pre-recorded Information in Lead-in Table 423 shows 4 byte header: MSB,LSB of Disc Structure Data Length diff --git a/libburn/trunk/libburn/mmc.c b/libburn/trunk/libburn/mmc.c index 5f2fb287..c646ea53 100644 --- a/libburn/trunk/libburn/mmc.c +++ b/libburn/trunk/libburn/mmc.c @@ -3939,6 +3939,10 @@ int mmc_read_disc_structure(struct burn_drive *d, } /* ts A90903 */ +/* + @param flag bit0= set bit1 in flag for burn_util_make_printable_word + and do not append media revision +*/ static int mmc_set_product_id(char *reply, int manuf_idx, int type_idx, int rev_idx, char **product_id, char **media_code1, char **media_code2, int flag) @@ -3952,15 +3956,20 @@ static int mmc_set_product_id(char *reply, *media_code1 == NULL || *media_code2 == NULL) return -1; sprintf(*media_code1, "%.8s", reply + manuf_idx); - ret = burn_util_make_printable_word(media_code1, 1); + ret = burn_util_make_printable_word(media_code1, + 1 | ((flag & 1) << 1)); if (ret <= 0) return -1; - sprintf(*media_code2, "%.3sxxxx", reply + type_idx); - ret = burn_util_make_printable_word(media_code2, 1); + sprintf(*media_code2, "%.3s%s", reply + type_idx, + (flag & 1) ? "" : "xxxx"); + ret = burn_util_make_printable_word(media_code2, + 1 | ((flag & 1) << 1)); if (ret <= 0) return -1; - sprintf(*media_code2 + strlen(*media_code2) - 4, "/%d", - (int) ((unsigned char *) reply)[rev_idx]); + if (!(flag & 1)) { + sprintf(*media_code2 + strlen(*media_code2) - 4, "/%d", + (int) ((unsigned char *) reply)[rev_idx]); + } sprintf(*product_id, "%s/%s", *media_code1, *media_code2); return 1; } @@ -3970,6 +3979,9 @@ static int mmc_set_product_id(char *reply, /* MMC backend of API call burn_get_media_product_id() See also doc/mediainfo.txt @param flag Bitfield for control purposes + bit0= do not escape " _/" (not suitable for + burn_guess_manufacturer()) + */ int mmc_get_media_product_id(struct burn_drive *d, char **product_id, char **media_code1, char **media_code2, @@ -4018,8 +4030,11 @@ int mmc_get_media_product_id(struct burn_drive *d, &reply_len, 0); if (ret <= 0) goto ex; - if (reply[16] != 3 || reply[24] != 4 || - (reply_len > 38 && reply[32] != 5)) { + /* ECMA-279 for DVD-R promises a third sixpack in field 5, + but ECMA-338 for DVD-RW defines a different meaning. + DVD-R and DVD-RW bear unprintable characters in there. + */ + if (reply[16] != 3 || reply[24] != 4) { ret = 0; goto ex; } @@ -4031,15 +4046,15 @@ int mmc_get_media_product_id(struct burn_drive *d, } memcpy(*media_code1, reply + 17, 6); memcpy(*media_code1 + 6, reply + 25, 6); - if (reply_len > 38) - memcpy(*media_code1 + 12, reply + 33, 6); + /* Clean out 0 bytes */ wpt = *media_code1; for (i = 0; i < 18; i++) if ((*media_code1)[i]) *(wpt++) = (*media_code1)[i]; *wpt = 0; - ret = burn_util_make_printable_word(media_code1, 1); + ret = burn_util_make_printable_word(media_code1, + 1 | ((flag & 1) << 1)); if (ret <= 0) goto ex; *product_id = strdup(*media_code1); @@ -4071,7 +4086,8 @@ int mmc_get_media_product_id(struct burn_drive *d, } else { /* Dig out manufacturer, media type and revision */ ret = mmc_set_product_id(reply, 19, 27, 28, - product_id, media_code1, media_code2, 0); + product_id, media_code1, media_code2, + flag & 1); if (ret <= 0) goto ex; } @@ -4088,7 +4104,8 @@ int mmc_get_media_product_id(struct burn_drive *d, } /* Dig out manufacturer, media type and revision */ ret = mmc_set_product_id(reply, 100, 106, 111, - product_id, media_code1, media_code2, 0); + product_id, media_code1, media_code2, + flag & 1); if (ret <= 0) goto ex; @@ -4119,7 +4136,8 @@ int mmc_get_media_product_id(struct burn_drive *d, /* DVD+ with no format 11h */ /* Get manufacturer and media type from bytes 19 and 27 */ ret = mmc_set_product_id(reply, 19, 27, 28, product_id, - media_code1, media_code2, 0); + media_code1, media_code2, + flag & 1); if (*product_id == NULL) { ret = 0; goto ex;