d_container_opts
};
+static options_map_t d_detel_opts[] =
+{
+ {"None", "none", 0, ""},
+ {"Custom", "custom", 1, ""},
+ {"Default","default",2, NULL},
+};
+combo_opts_t detel_opts =
+{
+ sizeof(d_detel_opts)/sizeof(options_map_t),
+ d_detel_opts
+};
+
+static options_map_t d_decomb_opts[] =
+{
+ {"None", "none", 0, ""},
+ {"Custom", "custom", 1, ""},
+ {"Default","default",2, NULL},
+};
+combo_opts_t decomb_opts =
+{
+ sizeof(d_decomb_opts)/sizeof(options_map_t),
+ d_decomb_opts
+};
+
static options_map_t d_deint_opts[] =
{
{"None", "none", 0, ""},
- {"Fast", "fast", 1, "-1:-1:-1:0:1"},
- {"Slow", "slow", 2, "2:-1:-1:0:1"},
- {"Slower", "slower", 3, "0:-1:-1:0:1"},
+ {"Custom", "custom", 1, ""},
+ {"Fast", "fast", 2, "-1:-1:-1:0:1"},
+ {"Slow", "slow", 3, "2:-1:-1:0:1"},
+ {"Slower", "slower", 4, "0:-1:-1:0:1"},
};
combo_opts_t deint_opts =
{
static options_map_t d_denoise_opts[] =
{
{"None", "none", 0, ""},
- {"Weak", "weak", 1, "2:1:2:3"},
- {"Medium", "medium", 2, "3:2:2:3"},
- {"Strong", "strong", 3, "7:7:5:5"},
+ {"Custom", "custom", 1, ""},
+ {"Weak", "weak", 2, "2:1:2:3"},
+ {"Medium", "medium", 3, "3:2:2:3"},
+ {"Strong", "strong", 4, "7:7:5:5"},
};
combo_opts_t denoise_opts =
{
{"LoggingLevel", &logging_opts},
{"FileFormat", &container_opts},
{"PictureDeinterlace", &deint_opts},
- {"tweak_PictureDeinterlace", &deint_opts},
+ {"PictureDecomb", &decomb_opts},
+ {"PictureDetelecine", &detel_opts},
{"PictureDenoise", &denoise_opts},
- {"tweak_PictureDenoise", &denoise_opts},
{"VideoEncoder", &vcodec_opts},
{"AudioEncoder", &acodec_opts},
{"x264_direct", &direct_opts},
gint titleindex,
const gchar *lang,
gint acodec,
- gint index)
+ GHashTable *track_indices)
{
hb_list_t * list;
hb_title_t * title;
gint ii;
gint count = 0;
gint track = -1;
- gint match = 0;
+ gint max_chan = 0;
+ gboolean *used;
g_debug("find_audio_track ()\n");
if (h_scan == NULL) return -1;
count = hb_list_count( title->list_audio );
}
if (count > 10) count = 10;
+ used = g_hash_table_lookup(track_indices, &acodec);
+ if (used == NULL)
+ {
+ used = g_malloc0(count * sizeof(gboolean));
+ g_hash_table_insert(track_indices, &acodec, used);
+ }
+ // Try to fine an item that matches the preferred language and
+ // the passthru codec type
if (acodec == HB_ACODEC_AC3 || acodec == HB_ACODEC_DCA)
{
for (ii = 0; ii < count; ii++)
{
+ gint channels;
+
+ if (used[ii])
+ continue;
+
audio = (hb_audio_config_t*)hb_list_audio_config_item(
title->list_audio, ii );
+ channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+ audio->in.channel_layout);
+ // Find a track that is not visually impaired or dirctor's
+ // commentary, and has the highest channel count.
if ((audio->in.codec == acodec) &&
+ (audio->lang.type < 2) &&
((strcmp(lang, audio->lang.iso639_2) == 0) ||
(strcmp(lang, "und") == 0)))
{
- if (index == match)
+ if (channels > max_chan)
{
track = ii;
- break;
+ max_chan = channels;
}
- match++;
}
}
}
- if (track > -1) return track;
- match = 0;
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Try to fine an item that matches the preferred language
for (ii = 0; ii < count; ii++)
{
- audio = (hb_audio_config_t*)hb_list_audio_config_item( title->list_audio, ii );
- if ((strcmp(lang, audio->lang.iso639_2) == 0) ||
- (strcmp(lang, "und") == 0))
+ if (used[ii])
+ continue;
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ // Find a track that is not visually impaired or dirctor's commentary
+ if ((audio->lang.type < 2) &&
+ ((strcmp(lang, audio->lang.iso639_2) == 0) ||
+ (strcmp(lang, "und") == 0)))
+ {
+ track = ii;
+ break;
+ }
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Try to fine an item that does not match the preferred language and
+ // matches the passthru codec type
+ if (acodec == HB_ACODEC_AC3 || acodec == HB_ACODEC_DCA)
+ {
+ for (ii = 0; ii < count; ii++)
{
- if (index == match)
+ gint channels;
+
+ if (used[ii])
+ continue;
+
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+ audio->in.channel_layout);
+ // Find a track that is not visually impaired or dirctor's
+ // commentary, and has the highest channel count.
+ if ((audio->in.codec == acodec) &&
+ (audio->lang.type < 2))
{
- track = ii;
- break;
+ if (channels > max_chan)
+ {
+ track = ii;
+ max_chan = channels;
+ }
}
- match++;
}
}
- if (track > -1) return track;
- if (index < count)
- track = index;
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Try to fine an item that does not match the preferred language
+ for (ii = 0; ii < count; ii++)
+ {
+ if (used[ii])
+ continue;
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ // Find a track that is not visually impaired or dirctor's commentary
+ if (audio->lang.type < 2)
+ {
+ track = ii;
+ break;
+ }
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ return track;
+ }
+ // Last ditch, anything goes
+ for (ii = 0; ii < count; ii++)
+ {
+ audio = (hb_audio_config_t*)hb_list_audio_config_item(
+ title->list_audio, ii );
+ if (!used[ii])
+ {
+ track = ii;
+ break;
+ }
+ }
+ if (track > -1)
+ {
+ used[track] = TRUE;
+ }
return track;
}
generic_opts_set(builder, "LoggingLevel", &logging_opts);
generic_opts_set(builder, "FileFormat", &container_opts);
generic_opts_set(builder, "PictureDeinterlace", &deint_opts);
- generic_opts_set(builder, "tweak_PictureDeinterlace", &deint_opts);
+ generic_opts_set(builder, "PictureDetelecine", &detel_opts);
+ generic_opts_set(builder, "PictureDecomb", &decomb_opts);
generic_opts_set(builder, "PictureDenoise", &denoise_opts);
- generic_opts_set(builder, "tweak_PictureDenoise", &denoise_opts);
generic_opts_set(builder, "VideoEncoder", &vcodec_opts);
generic_opts_set(builder, "AudioEncoder", &acodec_opts);
generic_opts_set(builder, "x264_direct", &direct_opts);
keep_width = FALSE;
keep_height = FALSE;
}
- if (anamorphic || keep_aspect)
+ if (keep_aspect)
{
keep_height = FALSE;
}
if (anamorphic)
{
- if (round_dims)
- {
- job->modulus = 0;
- }
- else
- {
- // The scaler crashes if the dimensions are not divisible by 2
- // Align mod 2. And so does something in x264_encoder_headers()
- job->modulus = 2;
- }
+ job->anamorphic.mode = autoscale ? 2 : 3;
+ // The scaler crashes if the dimensions are not divisible by 2
+ // Align mod 2. And so does something in x264_encoder_headers()
+ job->anamorphic.modulus = round_dims ? 16 : 2;
job->width = width;
+ job->height = height;
if (max_height)
job->maxHeight = max_height;
job->crop[0] = crop[0]; job->crop[1] = crop[1];
}
else
{
+ job->anamorphic.mode = 0;
if (keep_aspect)
{
gdouble par;
job->crop[2] = ghb_settings_get_int(settings, "PictureLeftCrop");
job->crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
- gboolean anamorphic, round_dimensions;
+ gboolean anamorphic, round_dimensions, autoscale;
+ autoscale = ghb_settings_get_boolean(settings, "autoscale");
anamorphic = ghb_settings_get_boolean(settings, "anamorphic");
round_dimensions = ghb_settings_get_boolean(settings, "ModDimensions");
- if (round_dimensions && anamorphic)
- {
- job->modulus = 16;
- job->pixel_ratio = 2;
- }
- else if (anamorphic)
+ if (anamorphic)
{
- job->modulus = 2;
- job->pixel_ratio = 2;
+ job->anamorphic.modulus = round_dimensions ? 16 : 2;
+ job->anamorphic.mode = autoscale ? 2 : 3;
}
else
{
- job->modulus = 2;
- job->pixel_ratio = 0;
+ job->anamorphic.modulus = 2;
+ job->anamorphic.mode = 0;
}
job->width = ghb_settings_get_int(settings, "scale_width");
job->height = ghb_settings_get_int(settings, "scale_height");
gint deint = ghb_settings_combo_int(settings, "PictureDeinterlace");
- gboolean decomb = ghb_settings_get_boolean(settings, "PictureDecomb");
+ gint decomb = ghb_settings_combo_int(settings, "PictureDecomb");
job->deinterlace = (!decomb && deint == 0) ? 0 : 1;
}
gboolean
ghb_validate_filters(signal_user_data_t *ud)
{
- gboolean tweaks;
gchar *str;
gint index;
gchar *message;
- gboolean enabled;
- tweaks = ghb_settings_get_boolean(ud->settings, "allow_tweaks");
- if (tweaks)
+ // deinte 4
+ index = ghb_settings_combo_int(ud->settings, "PictureDeinterlace");
+ if (index == 1)
{
- // detele 6
- str = ghb_settings_get_string(ud->settings, "tweak_PictureDetelecine");
- enabled = ghb_settings_get_boolean(ud->settings, "PictureDetelecine");
- if (enabled && !ghb_validate_filter_string(str, 6))
+ str = ghb_settings_get_string(ud->settings, "PictureDeinterlaceCustom");
+ if (!ghb_validate_filter_string(str, 4))
{
message = g_strdup_printf(
- "Invalid Detelecine Settings:\n\n%s\n",
+ "Invalid Deinterlace Settings:\n\n%s\n",
str);
ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(str);
g_free(message);
+ g_free(str);
return FALSE;
}
g_free(str);
- // decomb 7
- str = ghb_settings_get_string(ud->settings, "tweak_PictureDecomb");
- enabled = ghb_settings_get_boolean(ud->settings, "PictureDecomb");
- if (enabled && !ghb_validate_filter_string(str, 7))
+ }
+ // detel
+ index = ghb_settings_combo_int(ud->settings, "PictureDetelecine");
+ if (index == 1)
+ {
+ str = ghb_settings_get_string(ud->settings, "PictureDetelecineCustom");
+ if (!ghb_validate_filter_string(str, 6))
{
message = g_strdup_printf(
- "Invalid Decomb Settings:\n\n%s\n",
+ "Invalid Detelecine Settings:\n\n%s\n",
str);
ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(str);
g_free(message);
+ g_free(str);
return FALSE;
}
g_free(str);
- // deinte 4
- index = ghb_lookup_combo_int("tweak_PictureDeinterlace",
- ghb_settings_get_value(ud->settings, "tweak_PictureDeinterlace"));
- if (index < 0)
+ }
+ // decomb 4
+ index = ghb_settings_combo_int(ud->settings, "PictureDecomb");
+ if (index == 1)
+ {
+ str = ghb_settings_get_string(ud->settings, "PictureDecombCustom");
+ if (!ghb_validate_filter_string(str, 7))
{
- str = ghb_settings_get_string(ud->settings, "tweak_PictureDeinterlace");
- if (!ghb_validate_filter_string(str, 4))
- {
- message = g_strdup_printf(
- "Invalid Deinterlace Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(message);
- g_free(str);
- return FALSE;
- }
+ message = g_strdup_printf(
+ "Invalid Decomb Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+ g_free(message);
g_free(str);
+ return FALSE;
}
- // denois 4
- index = ghb_lookup_combo_int("tweak_PictureDenoise",
- ghb_settings_get_value(ud->settings, "tweak_PictureDenoise"));
- if (index < 0)
+ g_free(str);
+ }
+ // denois 4
+ index = ghb_settings_combo_int(ud->settings, "PictureDenoise");
+ if (index == 1)
+ {
+ str = ghb_settings_get_string(ud->settings, "PictureDenoiseCustom");
+ if (!ghb_validate_filter_string(str, 4))
{
- str = ghb_settings_get_string(ud->settings, "tweak_PictureDenoise");
- if (!ghb_validate_filter_string(str, 4))
- {
- message = g_strdup_printf(
- "Invalid Denoise Settings:\n\n%s\n",
- str);
- ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
- g_free(str);
- g_free(message);
- return FALSE;
- }
+ message = g_strdup_printf(
+ "Invalid Denoise Settings:\n\n%s\n",
+ str);
+ ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
g_free(str);
+ g_free(message);
+ return FALSE;
}
+ g_free(str);
}
return TRUE;
}
job->crop[3] = ghb_settings_get_int(js, "PictureRightCrop");
- gboolean decomb = ghb_settings_get_boolean(js, "PictureDecomb");
- gint deint = ghb_settings_combo_int(js,
- tweaks ? "tweak_PictureDeinterlace":"PictureDeinterlace");
+ gint decomb = ghb_settings_combo_int(js, "PictureDecomb");
+ gint deint = ghb_settings_combo_int(js, "PictureDeinterlace");
if (!decomb)
job->deinterlace = (deint != 0) ? 1 : 0;
else
job->deinterlace = 0;
job->grayscale = ghb_settings_get_boolean(js, "VideoGrayScale");
+ gboolean autoscale = ghb_settings_get_boolean(js, "autoscale");
gboolean anamorphic = ghb_settings_get_boolean(js, "anamorphic");
gboolean round_dimensions = ghb_settings_get_boolean(js, "ModDimensions");
- if (round_dimensions && anamorphic)
- {
- job->pixel_ratio = 2;
- job->modulus = 16;
- }
- else if (anamorphic)
+ if (anamorphic)
{
- // Huh! I thought I wanted to use pixel_ratio 1 for this case, but
- // when its 1, libhb discards the width and height and uses original
- // title dims - crop. Thats not what I want.
- // Also, x264 requires things to divisible by 2.
- job->pixel_ratio = 2;
- job->modulus = 2;
+ job->anamorphic.mode = autoscale ? 2 : 3;
+ // Also, x264 requires things to be divisible by 2.
+ job->anamorphic.modulus = round_dimensions ? 16 : 2;
}
else
{
- job->pixel_ratio = 0;
- job->modulus = 2;
+ job->anamorphic.mode = 0;
+ job->anamorphic.modulus = 2;
}
/* Add selected filters */
job->filters = hb_list_init();
gint vrate = ghb_settings_combo_int(js, "VideoFramerate");
- if( vrate == 0 && ghb_settings_get_boolean(js, "PictureDetelecine" ) )
+ if( vrate == 0 && ghb_settings_combo_int(js, "PictureDetelecine" ) )
job->vfr = 1;
else
job->vfr = 0;
- if( ghb_settings_get_boolean(js, "PictureDetelecine" ) )
+ gint detel = ghb_settings_combo_int(js, "PictureDetelecine");
+ if ( detel )
{
- hb_filter_detelecine.settings = NULL;
- if (tweaks)
+ if (detel != 1)
{
- detel_str = ghb_settings_get_string(js, "tweak_PictureDetelecine");
- if (detel_str && detel_str[0])
- {
- hb_filter_detelecine.settings = detel_str;
- }
+ if (detel_opts.map[detel].svalue != NULL)
+ detel_str = g_strdup(detel_opts.map[detel].svalue);
}
+ else
+ detel_str = ghb_settings_get_string(js, "PictureDetelecineCustom");
+ hb_filter_detelecine.settings = detel_str;
hb_list_add( job->filters, &hb_filter_detelecine );
}
- if( decomb )
+ if ( decomb )
{
- // Use default settings
- hb_filter_decomb.settings = NULL;
- if (tweaks)
+ if (decomb != 1)
{
- decomb_str = ghb_settings_get_string(js, "tweak_PictureDecomb");
- if (decomb_str && decomb_str[0])
- {
- hb_filter_decomb.settings = (gchar*)decomb_str;
- }
+ if (decomb_opts.map[decomb].svalue != NULL)
+ decomb_str = g_strdup(decomb_opts.map[decomb].svalue);
}
+ else
+ decomb_str = ghb_settings_get_string(js, "PictureDecombCustom");
+ hb_filter_decomb.settings = decomb_str;
hb_list_add( job->filters, &hb_filter_decomb );
}
if( job->deinterlace )
{
- if (deint > 0)
- deint_str = g_strdup(deint_opts.map[deint].svalue);
+ if (deint != 1)
+ {
+ if (deint_opts.map[deint].svalue != NULL)
+ deint_str = g_strdup(deint_opts.map[deint].svalue);
+ }
else
- deint_str = ghb_settings_get_string(js,
- tweaks ? "tweak_PictureDeinterlace" : "PictureDeinterlace");
+ deint_str = ghb_settings_get_string(js, "PictureDeinterlaceCustom");
hb_filter_deinterlace.settings = deint_str;
hb_list_add( job->filters, &hb_filter_deinterlace );
}
hb_filter_deblock.settings = deblock_str;
hb_list_add( job->filters, &hb_filter_deblock );
}
- gint denoise = ghb_settings_combo_int(js,
- tweaks ? "tweak_PictureDenoise" : "PictureDenoise");
- if( denoise != 0 )
+ gint denoise = ghb_settings_combo_int(js, "PictureDenoise");
+ if( denoise )
{
- if (denoise > 0)
- denoise_str = g_strdup(denoise_opts.map[denoise].svalue);
+ if (denoise != 1)
+ {
+ if (denoise_opts.map[denoise].svalue != NULL)
+ denoise_str = g_strdup(denoise_opts.map[denoise].svalue);
+ }
else
- denoise_str = (gchar*)ghb_settings_get_string(
- js, tweaks ? "tweak_PictureDenoise" : "PictureDenoise");
+ denoise_str = ghb_settings_get_string(js, "PictureDenoiseCustom");
hb_filter_denoise.settings = denoise_str;
hb_list_add( job->filters, &hb_filter_denoise );
}