feat: add support for BDXL QL (128GB)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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]))
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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, _("<b>Four layered BDXL medium size</b>\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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user