diff options
-rw-r--r-- | gtk/src/callbacks.c | 34 | ||||
-rw-r--r-- | gtk/src/ghb.ui | 2 | ||||
-rw-r--r-- | gtk/src/hb-backend.c | 102 | ||||
-rw-r--r-- | gtk/src/hb-backend.h | 2 |
4 files changed, 125 insertions, 15 deletions
diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c index b5646d3c6..78b393b6e 100644 --- a/gtk/src/callbacks.c +++ b/gtk/src/callbacks.c @@ -824,6 +824,16 @@ container_changed_cb(GtkWidget *widget, signal_user_data_t *ud) check_depencency(ud, widget); update_acodec_combo(ud); clear_presets_selection(ud); + if (ghb_ac3_in_audio_list (ud->audio_settings)) + { + const gchar *container; + + container = ghb_settings_get_string(ud->settings, "container"); + if (strcmp(container, "mp4") == 0) + { + ghb_ui_update(ud, "container", "m4v"); + } + } } static gchar* @@ -1168,6 +1178,16 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_widget_to_setting(asettings, widget); audio_list_refresh_selected(ud); } + if (ghb_ac3_in_audio_list (ud->audio_settings)) + { + const gchar *container; + + container = ghb_settings_get_string(ud->settings, "container"); + if (strcmp(container, "mp4") == 0) + { + ghb_ui_update(ud, "container", "m4v"); + } + } } static void audio_list_refresh_selected(signal_user_data_t *ud); @@ -1221,6 +1241,15 @@ setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } void +http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +{ + ghb_widget_to_setting(ud->settings, widget); + check_depencency(ud, widget); + clear_presets_selection(ud); + ghb_grey_combo_options (ud->builder); +} + +void vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint vqmin, vqmax; @@ -2362,6 +2391,11 @@ validate_settings(signal_user_data_t *ud) { return FALSE; } + // Validate container settings + if (!ghb_validate_container(ud)) + { + return FALSE; + } audio_list_refresh(ud); return TRUE; } diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui index cafbd0829..fc540c50c 100644 --- a/gtk/src/ghb.ui +++ b/gtk/src/ghb.ui @@ -825,7 +825,7 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes">HTTP Optimized MP4</property> <property name="draw_indicator">True</property> - <signal handler="setting_widget_changed_cb" name="toggled"/> + <signal handler="http_opt_changed_cb" name="toggled"/> </object> <packing> <property name="expand">False</property> diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c index b2958b07a..4707660a9 100644 --- a/gtk/src/hb-backend.c +++ b/gtk/src/hb-backend.c @@ -39,7 +39,6 @@ typedef struct gint ivalue; gdouble dvalue; const gchar *svalue; - gboolean sensitive; } options_map_t; typedef struct @@ -630,6 +629,7 @@ ghb_grey_combo_options(GtkBuilder *builder) { GtkWidget *widget; gint container, track, titleindex, acodec; + gboolean httpopt; hb_audio_config_t *audio = NULL; widget = GHB_WIDGET (builder, "title"); @@ -637,6 +637,10 @@ ghb_grey_combo_options(GtkBuilder *builder) widget = GHB_WIDGET (builder, "audio_track"); track = ghb_widget_int(widget); audio = get_hb_audio(titleindex, track); + widget = GHB_WIDGET (builder, "container"); + container = ghb_widget_int(widget); + widget = GHB_WIDGET (builder, "http_optimize_mp4"); + httpopt = ghb_widget_int(widget); grey_combo_box_item(builder, "audio_codec", HB_ACODEC_FAAC, FALSE); grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_FAAC, FALSE); @@ -647,16 +651,28 @@ ghb_grey_combo_options(GtkBuilder *builder) grey_combo_box_item(builder, "audio_codec", HB_ACODEC_VORBIS, FALSE); grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_VORBIS, FALSE); grey_combo_box_item(builder, "pref_audio_codec2", HB_ACODEC_VORBIS, FALSE); - if (audio && audio->in.codec != HB_ACODEC_AC3) + + gboolean allow_ac3 = TRUE; + allow_ac3 = + !(container == HB_MUX_MP4 && httpopt) && + (container != HB_MUX_OGM); + + if (allow_ac3) { - grey_combo_box_item(builder, "audio_codec", HB_ACODEC_AC3, TRUE); + grey_combo_box_item(builder, "audio_codec", HB_ACODEC_AC3, FALSE); + grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_AC3, FALSE); + grey_combo_box_item(builder, "pref_audio_codec2", HB_ACODEC_AC3, FALSE); } else { - grey_combo_box_item(builder, "audio_codec", HB_ACODEC_AC3, FALSE); + grey_combo_box_item(builder, "audio_codec", HB_ACODEC_AC3, TRUE); + grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_AC3, TRUE); + grey_combo_box_item(builder, "pref_audio_codec2", HB_ACODEC_AC3, TRUE); + } + if (audio && audio->in.codec != HB_ACODEC_AC3) + { + grey_combo_box_item(builder, "audio_codec", HB_ACODEC_AC3, TRUE); } - grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_AC3, FALSE); - grey_combo_box_item(builder, "pref_audio_codec2", HB_ACODEC_AC3, FALSE); grey_combo_box_item(builder, "video_codec", HB_VCODEC_THEORA, FALSE); widget = GHB_WIDGET (builder, "audio_codec"); @@ -665,8 +681,6 @@ ghb_grey_combo_options(GtkBuilder *builder) { grey_combo_box_item(builder, "audio_mix", 0, TRUE); } - widget = GHB_WIDGET (builder, "container"); - container = ghb_widget_int(widget); if (container == HB_MUX_MP4) { grey_combo_box_item(builder, "audio_codec", HB_ACODEC_LAME, TRUE); @@ -692,9 +706,6 @@ ghb_grey_combo_options(GtkBuilder *builder) grey_combo_box_item(builder, "audio_codec", HB_ACODEC_FAAC, TRUE); grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_FAAC, TRUE); grey_combo_box_item(builder, "pref_audio_codec2", HB_ACODEC_FAAC, TRUE); - grey_combo_box_item(builder, "audio_codec", HB_ACODEC_AC3, TRUE); - grey_combo_box_item(builder, "pref_audio_codec1", HB_ACODEC_AC3, TRUE); - grey_combo_box_item(builder, "pref_audio_codec2", HB_ACODEC_AC3, TRUE); } gboolean allow_mono = TRUE; @@ -1603,6 +1614,26 @@ ghb_get_chapters(gint titleindex) } gboolean +ghb_ac3_in_audio_list(GSList *audio_list) +{ + GSList *link; + + link = audio_list; + while (link != NULL) + { + GHashTable *asettings; + gint acodec; + + asettings = (GHashTable*)link->data; + acodec = ghb_settings_get_int(asettings, "audio_codec"); + if (acodec == HB_ACODEC_AC3) + return TRUE; + link = link->next; + } + return FALSE; +} + +gboolean ghb_set_passthru_rate_opts(GtkBuilder *builder, gint bitrate) { gboolean changed = FALSE; @@ -2084,7 +2115,7 @@ ghb_set_scale(signal_user_data_t *ud, gint mode) } static void -set_job_picture_settings(hb_job_t *job, GHashTable *settings) +set_preview_job_settings(hb_job_t *job, GHashTable *settings) { job->crop[0] = ghb_settings_get_int(settings, "crop_top"); job->crop[1] = ghb_settings_get_int(settings, "crop_bottom"); @@ -2111,7 +2142,8 @@ set_job_picture_settings(hb_job_t *job, GHashTable *settings) job->width = ghb_settings_get_int(settings, "scale_width"); job->height = ghb_settings_get_int(settings, "scale_height"); gint deint = ghb_settings_get_int(settings, "deinterlace"); - job->deinterlace = (deint == 0) ? 0 : 1; + gboolean decomb = ghb_settings_get_bool(settings, "decomb"); + job->deinterlace = (!decomb && deint == 0) ? 0 : 1; } gint @@ -2214,6 +2246,48 @@ ghb_validate_video(signal_user_data_t *ud) } gboolean +ghb_validate_container(signal_user_data_t *ud) +{ + gint container; + gchar *message; + + container = ghb_settings_get_bool(ud->settings, "container"); + if (container == HB_MUX_MP4) + { + gboolean httpopt; + httpopt = ghb_settings_get_bool(ud->settings, "http_optimize_mp4"); + if (httpopt && ghb_ac3_in_audio_list(ud->audio_settings)) + { + message = g_strdup_printf( + "AC3 audio in HTTP optimized MP4 is not supported.\n\n" + "You should choose a different audio codec.\n" + "If you continue, FAAC will be chosen for you."); + if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, "Cancel", "Continue")) + { + g_free(message); + return FALSE; + } + g_free(message); + GSList *link = ud->audio_settings; + while (link != NULL) + { + GHashTable *asettings; + asettings = (GHashTable*)link->data; + gint acodec = ghb_settings_get_int(asettings, "audio_codec"); + if (acodec == HB_ACODEC_AC3) + { + setting_value_t *value; + value = get_acodec_value(HB_ACODEC_FAAC); + ghb_settings_set(asettings, "audio_codec", value); + } + link = link->next; + } + } + } + return TRUE; +} + +gboolean ghb_validate_audio(signal_user_data_t *ud) { hb_list_t * list; @@ -2946,7 +3020,7 @@ ghb_get_preview_image(gint titleindex, gint index, GHashTable *settings, gboolea title = hb_list_item( list, titleindex ); if (title == NULL) return NULL; if (title->job == NULL) return NULL; - set_job_picture_settings(title->job, settings); + set_preview_job_settings(title->job, settings); // hb_get_preview can't handle sizes that are larger than the original title // dimensions diff --git a/gtk/src/hb-backend.h b/gtk/src/hb-backend.h index d03589191..486c7b29d 100644 --- a/gtk/src/hb-backend.h +++ b/gtk/src/hb-backend.h @@ -92,6 +92,7 @@ gboolean ghb_get_title_info(ghb_title_info_t *tinfo, gint titleindex); void ghb_set_scale(signal_user_data_t *ud, gint mode); gchar ** ghb_get_chapters(gint titleindex); gint ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix); +gboolean ghb_ac3_in_audio_list(GSList *audio_list); gboolean ghb_audio_is_passthru(gint acodec); gint ghb_get_default_acodec(); gboolean ghb_get_audio_info(ghb_audio_info_t *ainfo, gint titleindex, gint audioindex); @@ -107,6 +108,7 @@ gint ghb_calculate_target_bitrate(GHashTable *settings, gint titleindex); gchar* ghb_dvd_volname(const gchar *device); gint ghb_guess_bitrate(GHashTable *settings); +gboolean ghb_validate_container(signal_user_data_t *ud); gboolean ghb_validate_vquality(GHashTable *settings); gboolean ghb_validate_audio(signal_user_data_t *ud); gboolean ghb_validate_video(signal_user_data_t *ud); |