diff --git a/closure.c b/closure.c index 569c854..969e68f 100644 --- a/closure.c +++ b/closure.c @@ -242,6 +242,7 @@ void ReadDotfile() if(!strcmp(symbol, "bd-size1")) { Closure->bdSize1 = Closure->savedBDSize1 = atoll(value); continue; } if(!strcmp(symbol, "bd-size2")) { Closure->bdSize2 = Closure->savedBDSize2 = atoll(value); continue; } if(!strcmp(symbol, "bd-size3")) { Closure->bdSize3 = Closure->savedBDSize3 = atoll(value); continue; } + if(!strcmp(symbol, "bd-size4")) { Closure->bdSize4 = Closure->savedBDSize4 = atoll(value); continue; } if(!strcmp(symbol, "cache-size")) { Closure->cacheMiB = atoi(value); continue; } if(!strcmp(symbol, "cd-size")) { Closure->cdSize = Closure->savedCDSize = atoll(value); continue; } if(!strcmp(symbol, "codec-threads")) { Closure->codecThreads = atoi(value); continue; } @@ -353,6 +354,7 @@ static void update_dotfile() g_fprintf(dotfile, "bd-size1: %lld\n", (long long int)Closure->bdSize1); g_fprintf(dotfile, "bd-size2: %lld\n", (long long int)Closure->bdSize2); g_fprintf(dotfile, "bd-size3: %lld\n", (long long int)Closure->bdSize3); + g_fprintf(dotfile, "bd-size4: %lld\n", (long long int)Closure->bdSize4); g_fprintf(dotfile, "cache-size: %d\n", Closure->cacheMiB); g_fprintf(dotfile, "cd-size: %lld\n", (long long int)Closure->cdSize); g_fprintf(dotfile, "codec-threads: %d\n", Closure->codecThreads); @@ -510,6 +512,7 @@ void InitClosure() Closure->bdSize1 = Closure->savedBDSize1 = BD_SL_SIZE; Closure->bdSize2 = Closure->savedBDSize2 = BD_DL_SIZE; Closure->bdSize3 = Closure->savedBDSize3 = BDXL_TL_SIZE; + Closure->bdSize4 = Closure->savedBDSize4 = BDXL_QL_SIZE; #ifndef CLI Closure->logString = g_string_sized_new(1024); diff --git a/dvdisaster.c b/dvdisaster.c index f30a09f..541a6a1 100644 --- a/dvdisaster.c +++ b/dvdisaster.c @@ -326,6 +326,8 @@ int main(int argc, char *argv[]) Closure->mediumSize = BD_DL_SIZE; else if(!strcmp(optarg, "BDXL3") || !strcmp(optarg, "bdxl3")) Closure->mediumSize = BDXL_TL_SIZE; + else if(!strcmp(optarg, "BDXL4") || !strcmp(optarg, "bdxl4")) + Closure->mediumSize = BDXL_QL_SIZE; else { int len = strlen(optarg); if(strchr("0123456789", optarg[len-1])) diff --git a/dvdisaster.h b/dvdisaster.h index e276505..af09b98 100644 --- a/dvdisaster.h +++ b/dvdisaster.h @@ -109,6 +109,7 @@ #define BD_SL_SIZE 12219392 #define BD_DL_SIZE 23652352 #define BDXL_TL_SIZE 47305728 +#define BDXL_QL_SIZE (128001769472/2048) /* Maximum accepted media sizes (in 2K sectors) */ @@ -167,12 +168,14 @@ typedef struct _GlobalClosure gint64 bdSize1; /* Maximum 1-layer bd size (for augmented images) */ gint64 bdSize2; /* Maximum 2-layer bd size (for augmented images) */ gint64 bdSize3; /* Maximum 3-layer bdxl size (for augmented images) */ + gint64 bdSize4; /* Maximum 4-layer bdxl size (for augmented images) */ gint64 savedCDSize; /* Undo values for above */ gint64 savedDVDSize1; gint64 savedDVDSize2; gint64 savedBDSize1; gint64 savedBDSize2; gint64 savedBDSize3; + gint64 savedBDSize4; gint64 mediumSize; /* Maximum medium size (for augmented images) */ int cacheMiB; /* Cache setting for the parity codec, in megabytes */ int prefetchSectors; /* Prefetch setting per encoder thread */ diff --git a/rs02-common.c b/rs02-common.c index 9926bc2..f4ce1c1 100644 --- a/rs02-common.c +++ b/rs02-common.c @@ -420,7 +420,9 @@ RS02Layout *CalcRS02Layout(Image *image) lay->mediumCapacity = Closure->bdSize1; /* Single layered BD */ else if(image->sectorSize < Closure->bdSize2) lay->mediumCapacity = Closure->bdSize2; /* Double layered BD */ - else lay->mediumCapacity = Closure->bdSize3; /* Triple layered BDXL */ + else if(image->sectorSize < Closure->bdSize3) + lay->mediumCapacity = Closure->bdSize3; /* Triple layered BDXL */ + else lay->mediumCapacity = Closure->bdSize4; /* Quadruple layered BDXL */ } lay->dataSectors = image->sectorSize; diff --git a/rs02-includes.h b/rs02-includes.h index 4faf30c..e36a82d 100644 --- a/rs02-includes.h +++ b/rs02-includes.h @@ -85,12 +85,12 @@ typedef struct /*** Widgets in the Preferences window */ GtkWidget *radio1A, *radio1B, *radio2A, *radio2B; - GtkWidget *cdButtonA, *dvdButton1A, *dvdButton2A, *bdButton1A, *bdButton2A, *bdButton3A; - GtkWidget *cdButtonB, *dvdButton1B, *dvdButton2B, *bdButton1B, *bdButton2B, *bdButton3B; - GtkWidget *cdUndoButtonA, *dvdUndoButton1A, *dvdUndoButton2A, *bdUndoButton1A, *bdUndoButton2A, *bdUndoButton3A; - GtkWidget *cdUndoButtonB, *dvdUndoButton1B, *dvdUndoButton2B, *bdUndoButton1B, *bdUndoButton2B, *bdUndoButton3B; - GtkWidget *cdEntryA, *dvdEntry1A, *dvdEntry2A, *bdEntry1A, *bdEntry2A, *bdEntry3A, *otherEntryA; - GtkWidget *cdEntryB, *dvdEntry1B, *dvdEntry2B, *bdEntry1B, *bdEntry2B, *bdEntry3B, *otherEntryB; + GtkWidget *cdButtonA, *dvdButton1A, *dvdButton2A, *bdButton1A, *bdButton2A, *bdButton3A, *bdButton4A; + GtkWidget *cdButtonB, *dvdButton1B, *dvdButton2B, *bdButton1B, *bdButton2B, *bdButton3B, *bdButton4B; + GtkWidget *cdUndoButtonA, *dvdUndoButton1A, *dvdUndoButton2A, *bdUndoButton1A, *bdUndoButton2A, *bdUndoButton3A, *bdUndoButton4A; + GtkWidget *cdUndoButtonB, *dvdUndoButton1B, *dvdUndoButton2B, *bdUndoButton1B, *bdUndoButton2B, *bdUndoButton3B, *bdUndoButton4B; + GtkWidget *cdEntryA, *dvdEntry1A, *dvdEntry2A, *bdEntry1A, *bdEntry2A, *bdEntry3A, *bdEntry4A, *otherEntryA; + GtkWidget *cdEntryB, *dvdEntry1B, *dvdEntry2B, *bdEntry1B, *bdEntry2B, *bdEntry3B, *bdEntry4B, *otherEntryB; GtkWidget *cacheScaleA, *cacheScaleB; LabelWithOnlineHelp *cacheLwoh; diff --git a/rs02-window.c b/rs02-window.c index e9bbb5b..d937074 100644 --- a/rs02-window.c +++ b/rs02-window.c @@ -417,6 +417,7 @@ static void toggle_cb(GtkWidget *widget, gpointer data) gtk_widget_set_sensitive(wl->bdEntry1A, TRUE); gtk_widget_set_sensitive(wl->bdEntry2A, TRUE); gtk_widget_set_sensitive(wl->bdEntry3A, TRUE); + gtk_widget_set_sensitive(wl->bdEntry4A, TRUE); gtk_widget_set_sensitive(wl->cdButtonA, TRUE); gtk_widget_set_sensitive(wl->dvdButton1A, TRUE); gtk_widget_set_sensitive(wl->dvdButton2A, TRUE); @@ -445,6 +446,7 @@ static void toggle_cb(GtkWidget *widget, gpointer data) gtk_widget_set_sensitive(wl->bdEntry1B, TRUE); gtk_widget_set_sensitive(wl->bdEntry2B, TRUE); gtk_widget_set_sensitive(wl->bdEntry3B, TRUE); + gtk_widget_set_sensitive(wl->bdEntry4B, TRUE); gtk_widget_set_sensitive(wl->cdButtonB, TRUE); gtk_widget_set_sensitive(wl->dvdButton1B, TRUE); gtk_widget_set_sensitive(wl->dvdButton2B, TRUE); @@ -474,6 +476,7 @@ static void toggle_cb(GtkWidget *widget, gpointer data) gtk_widget_set_sensitive(wl->bdEntry1A, FALSE); gtk_widget_set_sensitive(wl->bdEntry2A, FALSE); gtk_widget_set_sensitive(wl->bdEntry3A, FALSE); + gtk_widget_set_sensitive(wl->bdEntry4A, FALSE); gtk_widget_set_sensitive(wl->cdButtonA, FALSE); gtk_widget_set_sensitive(wl->dvdButton1A, FALSE); gtk_widget_set_sensitive(wl->dvdButton2A, FALSE); @@ -503,6 +506,7 @@ static void toggle_cb(GtkWidget *widget, gpointer data) gtk_widget_set_sensitive(wl->bdEntry1B, FALSE); gtk_widget_set_sensitive(wl->bdEntry2B, FALSE); gtk_widget_set_sensitive(wl->bdEntry3B, FALSE); + gtk_widget_set_sensitive(wl->bdEntry4B, FALSE); gtk_widget_set_sensitive(wl->cdButtonB, FALSE); gtk_widget_set_sensitive(wl->dvdButton1B, FALSE); gtk_widget_set_sensitive(wl->dvdButton2B, FALSE); @@ -602,6 +606,17 @@ static void query_cb(GtkWidget *widget, gpointer data) gtk_entry_set_text(GTK_ENTRY(wl->bdEntry3A), value); gtk_entry_set_text(GTK_ENTRY(wl->bdEntry3B), value); } + + if(widget == wl->bdButton4A || widget == wl->bdButton4B) + { gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4A), value); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4B), value); + } + + if(widget == wl->bdUndoButton4A || widget == wl->bdUndoButton4B ) + { g_snprintf(value, 40, "%lld", (long long int)Closure->savedBDSize4); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4A), value); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4B), value); + } } /* @@ -665,6 +680,15 @@ static void entry_tracker_cb(GtkWidget *widget, gpointer data) gtk_entry_set_text(GTK_ENTRY(wl->bdEntry3A), text); } + if(widget == wl->bdEntry4A) + { const char *text = gtk_entry_get_text(GTK_ENTRY(wl->bdEntry4A)); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4B), text); + } + if(widget == wl->bdEntry4B) + { const char *text = gtk_entry_get_text(GTK_ENTRY(wl->bdEntry4B)); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4A), text); + } + if(widget == wl->otherEntryA) { const char *text = gtk_entry_get_text(GTK_ENTRY(wl->otherEntryA)); gtk_entry_set_text(GTK_ENTRY(wl->otherEntryB), text); @@ -716,6 +740,8 @@ void ReadRS02Preferences(Method *method) Closure->bdSize2 = value > 0 ? value : 0; value = atoll(gtk_entry_get_text(GTK_ENTRY(wl->bdEntry3A))); Closure->bdSize3 = value > 0 ? value : 0; + value = atoll(gtk_entry_get_text(GTK_ENTRY(wl->bdEntry4A))); + Closure->bdSize4 = value > 0 ? value : 0; if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wl->radio1A))) { Closure->mediumSize = 0; @@ -1153,6 +1179,67 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent) "may be a few sectors smaller than specified for " "technical reasons.")); + + + /* BDXL four layer capacity table row */ + + lwoh = CreateLabelWithOnlineHelp(_("BDXL 4 layers:"), _("BDXL 4 layers:")); + RegisterPreferencesHelpWindow(lwoh); + + gtk_misc_set_alignment(GTK_MISC(lwoh->linkLabel), 0.0, 0.0); + gtk_table_attach(GTK_TABLE(table), lwoh->linkBox, 0, 1, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5); + + wl->bdEntry4A = gtk_entry_new(); + gtk_entry_set_width_chars(GTK_ENTRY(wl->bdEntry4A), 9); + g_signal_connect(G_OBJECT(wl->bdEntry4A), "activate", G_CALLBACK(entry_tracker_cb), wl); + gtk_table_attach(GTK_TABLE(table), wl->bdEntry4A, 1, 2, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5); + + wl->bdButton4A = gtk_button_new_with_label(_utf("query medium")); + g_signal_connect(G_OBJECT(wl->bdButton4A), "clicked", G_CALLBACK(query_cb), wl); + gtk_table_attach(GTK_TABLE(table), wl->bdButton4A, 2, 3, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5); + + icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR); + wl->bdUndoButton4A = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(wl->bdUndoButton4A), icon); + g_signal_connect(G_OBJECT(wl->bdUndoButton4A), "clicked", G_CALLBACK(query_cb), wl); + gtk_table_attach(GTK_TABLE(table), wl->bdUndoButton4A, 3, 4, 7, 8, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 5, 5); + + hbox = gtk_hbox_new(FALSE, 4); + + gtk_box_pack_start(GTK_BOX(hbox), lwoh->normalLabel, FALSE, FALSE, 0); + + wl->bdEntry4B = gtk_entry_new(); + gtk_entry_set_width_chars(GTK_ENTRY(wl->bdEntry4B), 9); + g_signal_connect(G_OBJECT(wl->bdEntry4B), "activate", G_CALLBACK(entry_tracker_cb), wl); + gtk_box_pack_start(GTK_BOX(hbox), wl->bdEntry4B, FALSE, FALSE, 0); + + wl->bdButton4B = gtk_button_new_with_label(_utf("query medium")); + g_signal_connect(G_OBJECT(wl->bdButton4B), "clicked", G_CALLBACK(query_cb), wl); + gtk_box_pack_start(GTK_BOX(hbox), wl->bdButton4B, FALSE, FALSE, 0); + + icon = gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_SMALL_TOOLBAR); + wl->bdUndoButton4B = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(wl->bdUndoButton4B), icon); + g_signal_connect(G_OBJECT(wl->bdUndoButton4B), "clicked", G_CALLBACK(query_cb), wl); + gtk_box_pack_start(GTK_BOX(hbox), wl->bdUndoButton4B, FALSE, FALSE, 0); + + AddHelpWidget(lwoh, hbox); + + AddHelpParagraph(lwoh, _("Four layered BDXL medium size\n\n" + "This is the maximum capacity assumed for four layered BDXL media. " + "Images exceeding the smaller media sizes but smaller " + "than this value will be augmented with error correction information " + "so that they will fit on the specified BD.\n\n" + "You can enter the medium size in sectors of 2K each, " + "or press the \"query medium\" button to use the size " + "of a blank medium currently inserted in the selected drive.\n" + "Use the arrow button to revert to the last saved value.\n\n" + "Please note that augmented images will at most triple " + "in size as the highest possible redundancy is 200%%.\n" + "Even if this limit is not reached the augmented image " + "may be a few sectors smaller than specified for " + "technical reasons.")); + /* Fill in values from the closure */ g_snprintf(value, 40, "%lld", (long long int)Closure->cdSize); @@ -1173,6 +1260,9 @@ void CreateRS02PrefsPage(Method *method, GtkWidget *parent) g_snprintf(value, 40, "%lld", (long long int)Closure->bdSize3); gtk_entry_set_text(GTK_ENTRY(wl->bdEntry3A), value); gtk_entry_set_text(GTK_ENTRY(wl->bdEntry3B), value); + g_snprintf(value, 40, "%lld", (long long int)Closure->bdSize4); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4A), value); + gtk_entry_set_text(GTK_ENTRY(wl->bdEntry4B), value); /* custom value selection */ diff --git a/rs03-common.c b/rs03-common.c index 488d368..75270a7 100644 --- a/rs03-common.c +++ b/rs03-common.c @@ -536,7 +536,9 @@ RS03Layout *CalcRS03Layout(Image *image, int target) lay->mediumCapacity = BD_SL_SIZE; /* Single layered BD */ else if(get_roots(dataSectors, BD_DL_SIZE) >= 8) lay->mediumCapacity = BD_DL_SIZE; /* Double layered BD */ - else lay->mediumCapacity = BDXL_TL_SIZE; + else if(get_roots(dataSectors, BDXL_TL_SIZE) >= 8) + lay->mediumCapacity = BDXL_TL_SIZE; /* Triple layered BDXL */ + else lay->mediumCapacity = BDXL_QL_SIZE; } } diff --git a/rs03-recognize.c b/rs03-recognize.c index dab8c2f..274e6b6 100644 --- a/rs03-recognize.c +++ b/rs03-recognize.c @@ -419,7 +419,8 @@ int RS03RecognizeImage(Image *image) else if(image_sectors < DVD_DL_SIZE) layer_size = DVD_DL_SIZE/GF_FIELDMAX; else if(image_sectors < BD_SL_SIZE) layer_size = BD_SL_SIZE/GF_FIELDMAX; else if(image_sectors < BD_DL_SIZE) layer_size = BD_DL_SIZE/GF_FIELDMAX; - else layer_size = BDXL_TL_SIZE/GF_FIELDMAX; + else if(image_sectors < BDXL_TL_SIZE) layer_size = BDXL_TL_SIZE/GF_FIELDMAX; + else layer_size = BDXL_QL_SIZE/GF_FIELDMAX; } Verbose(".. trying layer size %lld\n", layer_size);