diff --git a/debian/control b/debian/control index 003aa5c7..c2e1f6ad 100644 --- a/debian/control +++ b/debian/control @@ -9,7 +9,8 @@ Build-Depends: debhelper (>= 12), gettext, libbz2-dev, libcam-dev [kfreebsd-any], - libgtk2.0-dev, + libgtk-3-dev, + libglib2.0-dev, libpng-dev, pkg-config, debhelper-compat (= 12) diff --git a/src/dvdisaster.c b/src/dvdisaster.c index 50bc8a0a..68007c98 100644 --- a/src/dvdisaster.c +++ b/src/dvdisaster.c @@ -95,6 +95,7 @@ typedef enum MODIFIER_IGNORE_ISO_SIZE, MODIFIER_IGNORE_RS03_HEADER, MODIFIER_INTERNAL_REREADS, + MODIFIER_MEDIUM_SIZE, MODIFIER_NO_BDR_DEFECT_MANAGEMENT, MODIFIER_NO_PROGRESS, MODIFIER_OLD_DS_MARKER, @@ -254,6 +255,7 @@ int main(int argc, char *argv[]) {"jump", 1, 0, 'j'}, {"marked-image", 1, 0, MODE_MARKED_IMAGE }, {"medium-info", 0, 0, MODE_MEDIUM_INFO }, + {"medium-size", 1, 0, MODIFIER_MEDIUM_SIZE }, {"merge-images", 1, 0, MODE_MERGE_IMAGES }, {"method", 2, 0, 'm' }, {"no-bdr-defect-management", 0, 0, MODIFIER_NO_BDR_DEFECT_MANAGEMENT }, @@ -542,6 +544,42 @@ int main(int argc, char *argv[]) } } break; + case MODIFIER_MEDIUM_SIZE: + if(optarg) + { if(!strcasecmp(optarg, "CD")) + Closure->mediumSize = CDR_SIZE; + else if(!strcasecmp(optarg, "DVD")) + Closure->mediumSize = DVD_SL_SIZE; + else if(!strcasecmp(optarg, "DVD9")) + Closure->mediumSize = DVD_DL_SIZE; + else if(!strcasecmp(optarg, "BD")) + Closure->mediumSize = BD_SL_SIZE; + else if(!strcasecmp(optarg, "BD2")) + Closure->mediumSize = BD_DL_SIZE; + else if(!strcasecmp(optarg, "BDXL3")) + Closure->mediumSize = BDXL_TL_SIZE; + else if(!strcasecmp(optarg, "BDXL4")) + Closure->mediumSize = BDXL_QL_SIZE; + else if(!strcasecmp(optarg, "BDNODM")) + Closure->mediumSize = BD_SL_SIZE_NODM; + else if(!strcasecmp(optarg, "BD2NODM")) + Closure->mediumSize = BD_DL_SIZE_NODM; + else if(!strcasecmp(optarg, "BDXL3NODM")) + Closure->mediumSize = BDXL_TL_SIZE_NODM; + else if(!strcasecmp(optarg, "BDXL4NODM")) + Closure->mediumSize = BDXL_QL_SIZE_NODM; + else + { gint64 val = (gint64)atoll(optarg); + if(val >= GF_FIELDMAX) + Closure->mediumSize = val; + else + Stop(_("Invalid medium size '%s'.\n" + "Valid values: CD, DVD, DVD9, BD, BD2, BDXL3, BDXL4,\n" + "BDNODM, BD2NODM, BDXL3NODM, BDXL4NODM, or a sector count >= %d"), + optarg, GF_FIELDMAX); + } + } + break; case MODIFIER_NO_BDR_DEFECT_MANAGEMENT: Closure->noBdrDefectManagement = TRUE; break; @@ -1006,6 +1044,10 @@ int main(int argc, char *argv[]) PrintCLI(_(" --ignore-iso-size - ignore image size from ISO/UDF data (dangerous - see man page!)\n")); PrintCLI(_(" --internal-rereads n - drive may attempt n rereads before reporting an error\n")); PrintCLI(_(" --medium-info - print info about medium in drive\n")); + PrintCLI(_(" --medium-size x - set target medium size for RS03 augmented images\n" + " CD, DVD, DVD9, BD, BD2, BDXL3, BDXL4,\n" + " BDNODM, BD2NODM, BDXL3NODM, BDXL4NODM,\n" + " or a raw sector count\n")); PrintCLI(_(" --no-bdr-defect-management - use bigger RS03 images for BD-R (see man page!)\n")); PrintCLI(_(" --no-progress - do not print progress information\n")); PrintCLI(_(" --old-ds-marker - mark missing sectors compatible with dvdisaster <= 0.70\n")); diff --git a/src/dvdisaster.h b/src/dvdisaster.h index 7d3a102e..dd71f0e9 100644 --- a/src/dvdisaster.h +++ b/src/dvdisaster.h @@ -633,10 +633,10 @@ enum /* Modes for AddSectorToCrcBuffer */ -#define CRCBUF_UPDATE_CRC 1<<0 -#define CRCBUF_UPDATE_MD5 1<<1 -#define CRCBUF_UPDATE_ALL 3 -#define CRCBUF_UPDATE_CRC_AFTER_DATA 1<<2 +#define CRCBUF_UPDATE_CRC (1<<0) +#define CRCBUF_UPDATE_MD5 (1<<1) +#define CRCBUF_UPDATE_ALL (CRCBUF_UPDATE_CRC | CRCBUF_UPDATE_MD5) +#define CRCBUF_UPDATE_CRC_AFTER_DATA (1<<2) /* Modes for CtcBufValid */ diff --git a/src/rs03-common.c b/src/rs03-common.c index f5bc3dd8..9d7d30ea 100644 --- a/src/rs03-common.c +++ b/src/rs03-common.c @@ -376,6 +376,21 @@ gint64 RS03SectorIndex(RS03Layout *lay, gint64 layer, gint64 n) *** Calculation of the image layout ***/ +static const char* medium_name(gint64 capacity) +{ if(capacity == CDR_SIZE) return "CD"; + if(capacity == DVD_SL_SIZE) return "DVD"; + if(capacity == DVD_DL_SIZE) return "DVD9"; + if(capacity == BD_SL_SIZE) return "BD"; + if(capacity == BD_DL_SIZE) return "BD2"; + if(capacity == BDXL_TL_SIZE) return "BDXL3"; + if(capacity == BDXL_QL_SIZE) return "BDXL4"; + if(capacity == BD_SL_SIZE_NODM) return "BDNODM"; + if(capacity == BD_DL_SIZE_NODM) return "BD2NODM"; + if(capacity == BDXL_TL_SIZE_NODM) return "BDXL3NODM"; + if(capacity == BDXL_QL_SIZE_NODM) return "BDXL4NODM"; + return NULL; +} + static int get_roots(gint64 data_sectors, gint64 medium_capacity) { gint64 sectors_per_layer = medium_capacity/GF_FIELDMAX; int ndata = (data_sectors + 2 +sectors_per_layer - 1) / sectors_per_layer; @@ -484,6 +499,9 @@ RS03Layout *CalcRS03Layout(Image *image, int target) default: if(!Closure->redundancy || !strcmp(Closure->redundancy, "normal")) n_roots = 32; else if(!strcmp(Closure->redundancy, "high")) n_roots = 64; + /* Medium size aliases (e.g. -n BD) set Closure->mediumSize but + are not valid redundancy specs — use default redundancy */ + else if(Closure->mediumSize) n_roots = 32; else Stop(_("Invalid redundancy specification '%s'.\n" "Valid formats: normal, high, %%, r, m"), Closure->redundancy); @@ -569,6 +587,19 @@ RS03Layout *CalcRS03Layout(Image *image, int target) lay->mediumCapacity = BDXL_QL_SIZE_NODM; else lay->mediumCapacity = BDXL_QL_SIZE; + + /* Inform user about auto-detected medium and how to override */ + { const char *name = medium_name(lay->mediumCapacity); + if(name) + Verbose("Auto-selected medium: %s (%" PRId64 " sectors).\n" + " Use --medium-size to override " + "(e.g., --medium-size BD for Blu-ray 25GB).\n", + name, lay->mediumCapacity); + else + Verbose("Auto-selected medium: %" PRId64 " sectors.\n" + " Use --medium-size to override.\n", + lay->mediumCapacity); + } } }