diff options
-rw-r--r-- | gtk/src/audiohandler.c | 97 | ||||
-rw-r--r-- | gtk/src/callbacks.c | 483 | ||||
-rw-r--r-- | gtk/src/callbacks.h | 1 | ||||
-rw-r--r-- | gtk/src/ghb.m4 | 977 | ||||
-rw-r--r-- | gtk/src/hb-backend.c | 21 | ||||
-rw-r--r-- | gtk/src/hb-backend.h | 1 | ||||
-rw-r--r-- | gtk/src/makedeps.py | 2 | ||||
-rw-r--r-- | gtk/src/preview.c | 19 | ||||
-rw-r--r-- | gtk/src/queuehandler.c | 47 | ||||
-rw-r--r-- | gtk/src/subtitlehandler.c | 16 | ||||
-rw-r--r-- | gtk/src/subtitlehandler.h | 2 | ||||
-rw-r--r-- | gtk/src/videohandler.c | 33 | ||||
-rw-r--r-- | libhb/avfilter.c | 6 | ||||
-rw-r--r-- | libhb/hb_dict.c | 2 |
14 files changed, 882 insertions, 825 deletions
diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c index 0a3a01833..f6def5149 100644 --- a/gtk/src/audiohandler.c +++ b/gtk/src/audiohandler.c @@ -895,31 +895,58 @@ ghb_audio_list_refresh_all(signal_user_data_t *ud) { ghb_sanitize_audio_tracks(ud); audio_refresh_list_ui(ud); + ghb_update_summary_info(ud); } -G_MODULE_EXPORT void -audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +void +audio_update_setting( + GhbValue *val, + const char *name, + signal_user_data_t *ud) { - static gint prev_acodec = 0; - gint acodec; GhbValue *asettings; - ghb_widget_to_setting(ud->settings, widget); + if (block_updates) + { + ghb_value_free(&val); + return; + } + asettings = audio_get_selected_settings(ud, NULL); - if (!block_updates && asettings != NULL) + if (asettings != NULL) { - ghb_dict_set(asettings, "Encoder", ghb_widget_value(widget)); - audio_deps(ud, asettings, widget); + if (val != NULL) + ghb_dict_set(asettings, name, val); + else + ghb_dict_remove(asettings, name); + audio_deps(ud, asettings, NULL); + ghb_update_summary_info(ud); ghb_audio_list_refresh_selected(ud); ghb_live_reset(ud); } + else + { + ghb_value_free(&val); + } +} + +G_MODULE_EXPORT void +audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +{ + static gint prev_acodec = 0; + gint acodec; + + ghb_widget_to_setting(ud->settings, widget); + audio_update_setting(ghb_widget_value(widget), "Encoder", ud); acodec = ghb_settings_audio_encoder_codec(ud->settings, "AudioEncoder"); float low, high, gran, defval; int dir; + GhbValue *asettings; hb_audio_quality_get_limits(acodec, &low, &high, &gran, &dir); defval = hb_audio_quality_get_default(acodec); + asettings = audio_get_selected_settings(ud, NULL); if (asettings != NULL && ghb_audio_quality_enabled(asettings)) { gdouble quality = ghb_dict_get_double(asettings, "Quality"); @@ -1000,56 +1027,11 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) G_MODULE_EXPORT void audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - GhbValue *asettings; - g_debug("audio_track_changed_cb ()"); ghb_widget_to_setting(ud->settings, widget); - if (block_updates) - { - return; - } - - asettings = audio_get_selected_settings(ud, NULL); - if (asettings != NULL) - { - GhbValue *val = ghb_widget_value(widget); - ghb_dict_set(asettings, "Track", ghb_value_xform(val, GHB_INT)); - ghb_value_free(&val); - audio_deps(ud, asettings, widget); - ghb_audio_list_refresh_selected(ud); - ghb_live_reset(ud); - } -} - -void -audio_update_setting( - GhbValue *val, - const char *name, - signal_user_data_t *ud) -{ - GhbValue *asettings; - - if (block_updates) - { - ghb_value_free(&val); - return; - } - - asettings = audio_get_selected_settings(ud, NULL); - if (asettings != NULL) - { - if (val != NULL) - ghb_dict_set(asettings, name, val); - else - ghb_dict_remove(asettings, name); - audio_deps(ud, asettings, NULL); - ghb_audio_list_refresh_selected(ud); - ghb_live_reset(ud); - } - else - { - ghb_value_free(&val); - } + GhbValue *val = ghb_widget_value(widget); + audio_update_setting(ghb_value_xform(val, GHB_INT), "Track", ud); + ghb_value_free(&val); } G_MODULE_EXPORT void @@ -1399,6 +1381,7 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) audio_update_dialog_widgets(ud, asettings); } audio_refresh_list_ui(ud); + ghb_update_summary_info(ud); } else { @@ -1442,6 +1425,7 @@ audio_add_all_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) } while (asettings != NULL); } audio_refresh_list_ui(ud); + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -1555,6 +1539,7 @@ audio_reset_clicked_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_sanitize_audio_tracks(ud); audio_update_dialog_widgets(ud, audio_get_selected_settings(ud, NULL)); audio_refresh_list_ui(ud); + ghb_update_summary_info(ud); } static GtkWidget *find_widget_recurse(GtkWidget *widget, const gchar *name) diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c index 89aa9740c..649e7d227 100644 --- a/gtk/src/callbacks.c +++ b/gtk/src/callbacks.c @@ -1239,15 +1239,33 @@ ghb_load_post_settings(signal_user_data_t * ud) static void show_scan_progress(signal_user_data_t *ud) { - GtkProgressBar *progress; - GtkLabel *label; + GtkWidget * source_info; + GtkProgressBar * progress; + GtkLabel * label; progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "scan_prog")); - gtk_progress_bar_set_fraction (progress, 0); + gtk_progress_bar_set_fraction(progress, 0); gtk_widget_show(GTK_WIDGET(progress)); label = GTK_LABEL(GHB_WIDGET(ud->builder, "volume_label")); gtk_label_set_text( label, _("Scanning ...") ); + + source_info = GHB_WIDGET(ud->builder, "SourceInfoBox"); + gtk_widget_hide(source_info); +} + +static void +hide_scan_progress(signal_user_data_t *ud) +{ + GtkWidget * source_info; + GtkProgressBar * progress; + + progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "scan_prog")); + gtk_progress_bar_set_fraction(progress, 1.0); + gtk_widget_hide(GTK_WIDGET(progress)); + + source_info = GHB_WIDGET(ud->builder, "SourceInfoBox"); + gtk_widget_show(source_info); } static void @@ -1707,38 +1725,6 @@ get_rate_string(gint rate_num, gint rate_den) static void update_aspect_info(signal_user_data_t *ud) { - GtkWidget *widget; - gchar *text; - - text = ghb_dict_get_bool(ud->settings, "PictureAutoCrop") ? _("On") : _("Off"); - widget = GHB_WIDGET(ud->builder, "crop_auto"); - gtk_label_set_text(GTK_LABEL(widget), text); - text = ghb_dict_get_bool(ud->settings, "autoscale") ? _("On") : _("Off"); - widget = GHB_WIDGET(ud->builder, "scale_auto"); - gtk_label_set_text(GTK_LABEL(widget), text); - switch (ghb_settings_combo_int(ud->settings, "PicturePAR")) - { - case HB_ANAMORPHIC_NONE: - text = _("Off"); - break; - case HB_ANAMORPHIC_STRICT: - text = _("Strict"); - break; - case HB_ANAMORPHIC_LOOSE: - text = _("Loose"); - break; - case HB_ANAMORPHIC_CUSTOM: - text = _("Custom"); - break; - case HB_ANAMORPHIC_AUTO: - text = _("Automatic"); - break; - default: - text = _("Unknown"); - break; - } - widget = GHB_WIDGET(ud->builder, "scale_anamorphic"); - gtk_label_set_text(GTK_LABEL(widget), text); } static void @@ -1760,41 +1746,30 @@ update_crop_info(signal_user_data_t *ud) crop[3] = ghb_dict_get_int(ud->settings, "PictureRightCrop"); width = title->geometry.width - crop[2] - crop[3]; height = title->geometry.height - crop[0] - crop[1]; - widget = GHB_WIDGET(ud->builder, "crop_dimensions"); text = g_strdup_printf ("%d x %d", width, height); - gtk_label_set_text(GTK_LABEL(widget), text); widget = GHB_WIDGET(ud->builder, "crop_dimensions2"); gtk_label_set_text(GTK_LABEL(widget), text); g_free(text); } - widget = GHB_WIDGET (ud->builder, "crop_values"); - text = g_strdup_printf ("%d:%d:%d:%d", crop[0], crop[1], crop[2], crop[3]); - gtk_label_set_text (GTK_LABEL(widget), text); - g_free(text); } static void update_scale_info(signal_user_data_t *ud) { - GtkWidget *widget; - gchar *text; - - gint width = ghb_dict_get_int(ud->settings, "scale_width"); - gint height = ghb_dict_get_int(ud->settings, "scale_height"); - widget = GHB_WIDGET(ud->builder, "scale_dimensions"); - text = g_strdup_printf("%d x %d", width, height); - gtk_label_set_text(GTK_LABEL(widget), text); - g_free(text); } void ghb_update_title_info(signal_user_data_t *ud) { - GtkWidget *widget; - gchar *text; - - int title_id, titleindex; - const hb_title_t * title; + GtkWidget * widget; + gchar * text; + gchar * aspect; + gchar * rate; + int title_id, titleindex; + int audio_count, subtitle_count; + const hb_title_t * title; + const hb_geometry_t * geo; + gint aspect_n, aspect_d; title_id = ghb_dict_get_int(ud->settings, "title"); title = ghb_lookup_title(title_id, &titleindex); @@ -1803,33 +1778,27 @@ ghb_update_title_info(signal_user_data_t *ud) update_title_duration(ud); - widget = GHB_WIDGET (ud->builder, "source_video_codec"); - if ( title->video_codec_name ) - gtk_label_set_text (GTK_LABEL(widget), title->video_codec_name); - else - gtk_label_set_text (GTK_LABEL(widget), _("Unknown")); - - widget = GHB_WIDGET (ud->builder, "source_dimensions"); - text = g_strdup_printf ("%d x %d", title->geometry.width, title->geometry.height); - gtk_label_set_text (GTK_LABEL(widget), text); - g_free(text); - - widget = GHB_WIDGET (ud->builder, "source_aspect"); - gint aspect_n, aspect_d; - hb_reduce(&aspect_n, &aspect_d, - title->geometry.width * title->geometry.par.num, - title->geometry.height * title->geometry.par.den); - text = get_aspect_string(aspect_n, aspect_d); - gtk_label_set_text (GTK_LABEL(widget), text); - g_free(text); - - widget = GHB_WIDGET (ud->builder, "source_frame_rate"); - text = (gchar*)get_rate_string(title->vrate.num, title->vrate.den); - gtk_label_set_text (GTK_LABEL(widget), text); - g_free(text); - - //widget = GHB_WIDGET (ud->builder, "source_interlaced"); - //gtk_label_set_text (GTK_LABEL(widget), title->interlaced ? "Yes" : "No"); + geo = &title->geometry; + hb_reduce(&aspect_n, &aspect_d, geo->width * geo->par.num, + geo->height * geo->par.den); + aspect = get_aspect_string(aspect_n, aspect_d); + rate = get_rate_string(title->vrate.num, title->vrate.den); + audio_count = hb_list_count(title->list_audio); + subtitle_count = hb_list_count(title->list_subtitle); + + text = g_strdup_printf( + "%dx%d (%dx%d), %s, %s FPS, %d Audio Track%s, %d Subtitle Track%s", + geo->width, geo->height, + geo->width * geo->par.num / geo->par.den, geo->height, + aspect, rate, + audio_count, audio_count == 1 ? "" : "s", + subtitle_count, subtitle_count == 1 ? "" : "s"); + + widget = GHB_WIDGET(ud->builder, "source_info_label"); + gtk_label_set_text(GTK_LABEL(widget), text); + free(text); + free(aspect); + free(rate); ghb_update_display_aspect_label(ud); @@ -1849,6 +1818,320 @@ static void update_meta(GhbValue *settings, const char *name, const char *val) } void +ghb_update_summary_info(signal_user_data_t *ud) +{ + GString * str; + char * text; + int title_id; + GtkWidget * widget; + GhbValue * titleDict; + + title_id = ghb_dict_get_int(ud->settings, "title"); + titleDict = ghb_get_title_dict(title_id); + if (titleDict == NULL) + { + // No title, clear summary + widget = GHB_WIDGET(ud->builder, "tracks_summary"); + gtk_label_set_text(GTK_LABEL(widget), ""); + widget = GHB_WIDGET(ud->builder, "filters_summary"); + gtk_label_set_text(GTK_LABEL(widget), ""); + widget = GHB_WIDGET(ud->builder, "dimensions_summary"); + gtk_label_set_text(GTK_LABEL(widget), "--"); + widget = GHB_WIDGET(ud->builder, "aspect_summary"); + gtk_label_set_text(GTK_LABEL(widget), "--"); + widget = GHB_WIDGET(ud->builder, "preview_button_image"); + gtk_image_set_from_icon_name(GTK_IMAGE(widget), "hb-icon", 128); + return; + } + + // Video Track + const hb_encoder_t * video_encoder; + const hb_rate_t * fps; + hb_rational_t vrate; + char * rate_str; + + str = g_string_new(""); + video_encoder = ghb_settings_video_encoder(ud->settings, "VideoEncoder"); + fps = ghb_settings_video_framerate(ud->settings, "VideoFramerate"); + if (fps->rate == 0) + { + hb_dict_extract_rational(&vrate, titleDict, "FrameRate"); + } + else + { + vrate.num = 27000000; + vrate.den = fps->rate; + } + rate_str = get_rate_string(vrate.num, vrate.den); + g_string_append_printf(str, "%s, %s FPS", video_encoder->name, rate_str); + if (ghb_dict_get_bool(ud->settings, "VideoFramerateCFR")) + { + g_string_append_printf(str, " CFR"); + } + else if (ghb_dict_get_bool(ud->settings, "VideoFrameratePFR")) + { + g_string_append_printf(str, " PFR"); + } + else if (ghb_dict_get_bool(ud->settings, "VideoFramerateVFR")) + { + g_string_append_printf(str, " VFR"); + } + + // Audio Tracks (show at most 3 tracks) + GhbValue * audioList; + GhbValue * sourceAudioList; + int ii, count, show; + + sourceAudioList = ghb_dict_get(titleDict, "AudioList"); + audioList = ghb_get_job_audio_list(ud->settings); + show = count = ghb_array_len(audioList); + if (count > 3) + { + show = 2; + } + for (ii = 0; ii < show; ii++) + { + GhbValue * asettings, * asource; + const hb_mixdown_t * audio_mix; + const hb_encoder_t * audio_encoder; + const char * lang; + int track; + + asettings = ghb_array_get(audioList, ii); + track = ghb_dict_get_int(asettings, "Track"); + asource = ghb_array_get(sourceAudioList, track); + lang = ghb_dict_get_string(asource, "Language"); + audio_encoder = ghb_settings_audio_encoder(asettings, "Encoder"); + if (audio_encoder->codec & HB_ACODEC_PASS_FLAG) + { + g_string_append_printf(str, "\n%s, %s", lang, audio_encoder->name); + } + else + { + audio_mix = ghb_settings_mixdown(asettings, "Mixdown"); + g_string_append_printf(str, "\n%s, %s, %s", lang, + audio_encoder->name, audio_mix->name); + } + } + if (show < count) + { + g_string_append_printf(str, "\n+ %d more audio track%s", count - show, + count - show > 1 ? "s" : ""); + } + + // Subtitle Tracks (show at most 3 tracks) + GhbValue * subtitleDict; + GhbValue * searchDict; + GhbValue * subtitleList; + GhbValue * sourceSubtitleList; + gboolean search; + + sourceSubtitleList = ghb_dict_get(titleDict, "SubtitleList"); + subtitleDict = ghb_get_job_subtitle_settings(ud->settings); + subtitleList = ghb_dict_get(subtitleDict, "SubtitleList"); + searchDict = ghb_dict_get(subtitleDict, "Search"); + search = ghb_dict_get_bool(searchDict, "Enable"); + show = count = ghb_array_len(subtitleList) + search; + if (count > 3) + { + show = 2; + } + if (search) + { + gboolean force, burn, def; + + force = ghb_dict_get_bool(searchDict, "Forced"); + burn = ghb_dict_get_bool(searchDict, "Burn"); + def = ghb_dict_get_bool(searchDict, "Default"); + + g_string_append_printf(str, "\nForeign Audio Scan"); + if (force) + { + g_string_append_printf(str, ", Forced Only"); + } + if (burn) + { + g_string_append_printf(str, ", Burned"); + } + else if (def) + { + g_string_append_printf(str, ", Default"); + } + show--; + count--; + } + for (ii = 0; ii < show; ii++) + { + GhbValue * subsettings, * subsource; + int track; + char * desc; + gboolean force, burn, def; + + subsettings = ghb_array_get(subtitleList, ii); + track = ghb_dict_get_int(subsettings, "Track"); + subsource = ghb_array_get(sourceSubtitleList, track); + desc = ghb_subtitle_short_description(subsource, subsettings); + force = ghb_dict_get_bool(subsettings, "Forced"); + burn = ghb_dict_get_bool(subsettings, "Burn"); + def = ghb_dict_get_bool(subsettings, "Default"); + + g_string_append_printf(str, "\n%s", desc); + if (force) + { + g_string_append_printf(str, ", Forced Only"); + } + if (burn) + { + g_string_append_printf(str, ", Burned"); + } + else if (def) + { + g_string_append_printf(str, ", Default"); + } + } + if (show < count) + { + g_string_append_printf(str, "\n+ %d more subtitle track%s", + count - show, + count - show > 1 ? "s" : ""); + } + + if (ghb_dict_get_bool(ud->settings, "ChapterMarkers")) + { + g_string_append_printf(str, "\nChapter Markers"); + } + + text = g_string_free(str, FALSE); + widget = GHB_WIDGET(ud->builder, "tracks_summary"); + gtk_label_set_text(GTK_LABEL(widget), text); + g_free(text); + + // Filters + gboolean detel, comb_detect, deint, decomb, deblock, nlmeans, denoise; + gboolean unsharp, lapsharp, rot, gray; + const char * sval; + int ival; + + sval = ghb_dict_get_string(ud->settings, "PictureDetelecine"); + detel = sval != NULL && !!strcasecmp(sval, "off"); + sval = ghb_dict_get_string(ud->settings, "PictureCombDetectPreset"); + comb_detect = sval != NULL && !!strcasecmp(sval, "off"); + sval = ghb_dict_get_string(ud->settings, "PictureDeinterlaceFilter"); + deint = sval != NULL && !strcasecmp(sval, "deinterlace"); + decomb = sval != NULL && !strcasecmp(sval, "decomb"); + ival = ghb_dict_get_int(ud->settings, "PictureDeblock"); + deblock = ival >= 5; + sval = ghb_dict_get_string(ud->settings, "PictureDenoiseFilter"); + nlmeans = sval != NULL && !strcasecmp(sval, "nlmeans"); + denoise = sval != NULL && !strcasecmp(sval, "hqdn3d"); + sval = ghb_dict_get_string(ud->settings, "PictureSharpenFilter"); + unsharp = sval != NULL && !strcasecmp(sval, "unsharp"); + lapsharp = sval != NULL && !strcasecmp(sval, "lapsharp"); + sval = ghb_dict_get_string(ud->settings, "PictureRotate"); + rot = sval != NULL && !!strcasecmp(sval, "disable=1"); + gray = ghb_dict_get_bool(ud->settings, "VideoGrayScale"); + + str = g_string_new(""); + sval = ""; + if (detel) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_DETELECINE); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (comb_detect) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_COMB_DETECT); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (deint) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_DEINTERLACE); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (decomb) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_DECOMB); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (deblock) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_DEBLOCK); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (nlmeans) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_NLMEANS); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (denoise) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_DENOISE); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (unsharp) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_UNSHARP); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (lapsharp) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_LAPSHARP); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (rot) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_ROTATE); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + if (gray) + { + hb_filter_object_t * filter = hb_filter_get(HB_FILTER_GRAYSCALE); + g_string_append_printf(str, "%s%s", sval, filter->name); + sval = ", "; + } + + text = g_string_free(str, FALSE); + widget = GHB_WIDGET(ud->builder, "filters_summary"); + gtk_label_set_text(GTK_LABEL(widget), text); + g_free(text); + + int width, height, display_width, display_height, par_width, par_height; + char * display_aspect; + + width = ghb_dict_get_int(ud->settings, "scale_width"); + height = ghb_dict_get_int(ud->settings, "scale_height"); + display_width = ghb_dict_get_int(ud->settings, "PictureDisplayWidth"); + display_height = ghb_dict_get_int(ud->settings, "PictureDisplayHeight"); + par_width = ghb_dict_get_int(ud->settings, "PicturePARWidth"); + par_height = ghb_dict_get_int(ud->settings, "PicturePARHeight"); + + text = g_strdup_printf("%dx%d storage, %dx%d display", + width, height, display_width, display_height); + widget = GHB_WIDGET(ud->builder, "dimensions_summary"); + gtk_label_set_text(GTK_LABEL(widget), text); + g_free(text); + + display_aspect = ghb_get_display_aspect_string(display_width, + display_height); + text = g_strdup_printf("%d:%d PAR, %s DAR", + par_width, par_height, display_aspect); + widget = GHB_WIDGET(ud->builder, "aspect_summary"); + gtk_label_set_text(GTK_LABEL(widget), text); + g_free(text); + g_free(display_aspect); +} + +void set_title_settings(signal_user_data_t *ud, GhbValue *settings) { int title_id, titleindex; @@ -1977,12 +2260,14 @@ set_title_settings(signal_user_data_t *ud, GhbValue *settings) g_free(dest); ghb_dict_set_int(settings, "preview_frame", 2); + ghb_update_summary_info(ud); } void ghb_set_current_title_settings(signal_user_data_t *ud) { set_title_settings(ud, ud->settings); + ghb_update_summary_info(ud); } static void @@ -2023,6 +2308,7 @@ load_all_titles(signal_user_data_t *ud, int titleindex) ghb_value_free(&ud->settings_array); ud->settings_array = settings_array; ud->settings = ghb_array_get(ud->settings_array, titleindex); + ghb_update_summary_info(ud); } static gboolean update_preview = FALSE; @@ -2128,32 +2414,11 @@ ptop_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } G_MODULE_EXPORT void -framerate_changed_cb(GtkWidget *widget, signal_user_data_t *ud) -{ - ghb_widget_to_setting(ud->settings, widget); - - if (ghb_settings_video_framerate_rate(ud->settings, "VideoFramerate") != 0) - { - if (!ghb_dict_get_bool(ud->settings, "VideoFrameratePFR")) - { - ghb_ui_update(ud, "VideoFramerateCFR", ghb_boolean_value(TRUE)); - } - } - if (ghb_settings_video_framerate_rate(ud->settings, "VideoFramerate") == 0 && - ghb_dict_get_bool(ud->settings, "VideoFrameratePFR")) - { - ghb_ui_update(ud, "VideoFramerateVFR", ghb_boolean_value(TRUE)); - } - ghb_check_dependency(ud, widget, NULL); - ghb_clear_presets_selection(ud); - ghb_live_reset(ud); -} - -G_MODULE_EXPORT void setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); ghb_check_dependency(ud, widget, NULL); + ghb_update_summary_info(ud); ghb_clear_presets_selection(ud); ghb_live_reset(ud); } @@ -2178,6 +2443,7 @@ comb_detect_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_string_value("decomb")); } } + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -2198,6 +2464,7 @@ deint_filter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_ui_update(ud, "PictureCombDetectPreset", ghb_string_value("off")); } + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -2210,6 +2477,7 @@ denoise_filter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_update_ui_combo_box(ud, "PictureDenoisePreset", NULL, FALSE); ghb_ui_update(ud, "PictureDenoisePreset", ghb_dict_get(ud->settings, "PictureDenoisePreset")); + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -2224,6 +2492,7 @@ sharpen_filter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_ui_update(ud, "PictureSharpenPreset", ghb_dict_get(ud->settings, "PictureSharpenPreset")); ghb_ui_update(ud, "PictureSharpenTune", ghb_string_value("none")); + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -2345,6 +2614,7 @@ chapter_markers_changed_cb(GtkWidget *widget, signal_user_data_t *ud) end = ghb_dict_get_int(ud->settings, "end_point"); markers &= (end > start); ghb_dict_set_bool(dest, "ChapterMarkers", markers); + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -3365,7 +3635,6 @@ ghb_backend_events(signal_user_data_t *ud) else if (status.scan.state & GHB_STATE_SCANDONE) { const gchar *source; - GtkProgressBar *scan_prog; GtkLabel *label; GtkWidget *widget; @@ -3383,9 +3652,7 @@ ghb_backend_events(signal_user_data_t *ud) source = ghb_dict_get_string(ud->globals, "scan_source"); update_source_label(ud, source); - scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog")); - gtk_progress_bar_set_fraction (scan_prog, 1.0); - gtk_widget_hide(GTK_WIDGET(scan_prog)); + hide_scan_progress(ud); int title_id, titleindex; const hb_title_t *title; diff --git a/gtk/src/callbacks.h b/gtk/src/callbacks.h index 729f89974..7e0b1b886 100644 --- a/gtk/src/callbacks.h +++ b/gtk/src/callbacks.h @@ -89,6 +89,7 @@ void ghb_show_container_options(signal_user_data_t *ud); void ghb_scale_configure(signal_user_data_t *ud, char *name, double val, double min, double max, double step, double page, int digits, gboolean inverted); +void ghb_update_summary_info(signal_user_data_t *ud); #endif // _CALLBACKS_H_ diff --git a/gtk/src/ghb.m4 b/gtk/src/ghb.m4 index 75ca74e44..adf68c136 100644 --- a/gtk/src/ghb.m4 +++ b/gtk/src/ghb.m4 @@ -79,7 +79,7 @@ You can choose any of the subtitles recognized in your source file. In addition, there is a special track option -"Foreign Audio Search". This option will add +"Foreign Audio Scan". This option will add an extra pass to the encode that searches for subtitles that may correspond to a foreign language scene. This option is best used in @@ -1077,47 +1077,75 @@ Activity</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="spacing">6</property> <property name="margin-start">6</property> <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes"><b>Source:</b></property> - <property name="use_markup">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="volume_label"> + <object class="GtkBox" id="SourceInfoBox"> + <property name="orientation">horizontal</property> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="spacing">6</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="halign">start</property> - <property name="label" translatable="yes">None</property> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Source:</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="volume_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="halign">start</property> + <property name="ellipsize">middle</property> + <property name="margin-end">12</property> + <property name="label" translatable="yes">None</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="source_info_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="halign">end</property> + <property name="label" translatable="yes"></property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> </object> <packing> <property name="expand">True</property> <property name="fill">True</property> - <property name="position">1</property> + <property name="position">0</property> </packing> </child> <child> <object class="GtkProgressBar" id="scan_prog"> - <property name="width_request">400</property> <property name="height_request">10</property> <property name="can_focus">False</property> <property name="valign">center</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> </object> @@ -1368,214 +1396,6 @@ This is often the feature title of a DVD.</property> <property name="position">1</property> </packing> </child> - <child> - <object class="GtkLabel" id="label9"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes"><b>Destination</b></property> - <property name="halign">GTK_ALIGN_START</property> - <property name="use_markup">True</property> - <property name="margin-start">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkBox" id="hbox67"> - <property name="orientation">horizontal</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">6</property> - <property name="margin-start">6</property> - <child> - <object class="GtkGrid" id="table4"> - <property name="row-spacing">2</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="margin-bottom">6</property> - <child> - <object class="GtkLabel" id="label18"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">end</property> - <property name="label" translatable="yes">File:</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <object class="GtkEntry" id="dest_file"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Destination filename for your encode.</property> - <property name="width_chars">40</property> - <property name="primary_icon_activatable">False</property> - <property name="secondary_icon_activatable">False</property> - <accelerator key="d" signal="grab-focus" modifiers="GDK_MOD1_MASK"/> - <signal name="changed" handler="dest_file_changed_cb" swapped="no"/> - <signal name="grab-focus" handler="destination_grab_cb" after="yes" swapped="no"/> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkFileChooserButton" id="dest_dir"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes">Destination directory for your encode.</property> - <property name="action">select-folder</property> - <property name="local_only">False</property> - <property name="title" translatable="yes">Destination Directory</property> - <signal name="selection-changed" handler="dest_dir_set_cb" swapped="no"/> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkGrid" id="container_box"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="column_spacing">4</property> - <property name="row-spacing">2</property> - <child> - <object class="GtkBox" id="hbox3"> - <property name="orientation">horizontal</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">4</property> - <child> - <object class="GtkLabel" id="label45"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Format:</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="FileFormat"> - <property name="visible">True</property> - <property name="valign">GTK_ALIGN_CENTER</property> - <property name="can_focus">False</property> - <property name="tooltip_text" translatable="yes">Format to mux encoded tracks to.</property> - <signal name="changed" handler="container_changed_cb" swapped="no"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="Mp4HttpOptimize"> - <property name="label" translatable="yes">Web Optimized</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Optimize the layout of the MP4 file for progressive download. -This allows a player to initiate playback before downloading the entire file.</property> - <property name="halign">start</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="AlignAVStart"> - <property name="label" translatable="yes">Align A/V Start</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Aligns the initial timestamps of all audio and video streams by -inserting blank frames or dropping frames. May improve audio/video -sync for broken players that do not honor MP4 edit lists.</property> - <property name="halign">start</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="Mp4iPodCompatible"> - <property name="label" translatable="yes">iPod 5G Support</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Add iPod Atom needed by some older iPods.</property> - <property name="halign">start</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">3</property> - </packing> - </child> </object> <packing> <property name="expand">False</property> @@ -1649,6 +1469,7 @@ sync for broken players that do not honor MP4 edit lists.</property> <property name="transition-duration">400</property> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="margin-top">12</property> <child> <object class="GtkBox" id="settings_tab"> <property name="orientation">vertical</property> @@ -1685,412 +1506,199 @@ sync for broken players that do not honor MP4 edit lists.</property> <object class="GtkBox" id="summary_tab"> <property name="orientation">horizontal</property> <property name="visible">True</property> + <property name="expand">True</property> + <property name="margin-top">12</property> <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="spacing">3</property> <child> - <object class="GtkBox" id="picture_summary"> - <property name="orientation">vertical</property> + <object class="GtkGrid" id="summary_table"> <property name="visible">True</property> + <property name="vexpand">True</property> + <property name="hexpand">False</property> <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="spacing">0</property> - <property name="margin-top">10</property> - <property name="margin-start">0</property> + <property name="margin-end">32</property> + <property name="row-spacing">2</property> + <property name="column-spacing">6</property> <child> - <object class="GtkFrame" id="frame5"> + <object class="GtkLabel" id="format_summary_label"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkGrid" id="table11"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="row_homogeneous">True</property> - <property name="column_homogeneous">True</property> - <property name="margin-top">6</property> - <property name="margin-bottom">2</property> - <property name="margin-start">12</property> - <child> - <object class="GtkLabel" id="labela5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Source Codec:</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="source_video_codec"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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">--</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label23"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Dimensions:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="source_dimensions"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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">--</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label42"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Aspect: </property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="source_aspect"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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">--</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label43"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Frame Rate:</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="source_frame_rate"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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">--</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label44"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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"><b>Source Picture Parameters</b></property> - <property name="use_markup">True</property> - </object> - </child> + <property name="label" translatable="yes"><b>Format:</b></property> + <property name="xalign">0</property> + <property name="hexpand">False</property> + <property name="use_markup">True</property> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="padding">2</property> - <property name="position">0</property> + <property name="top_attach">0</property> + <property name="left_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> </packing> </child> <child> - <object class="GtkFrame" id="Cropping1"> + <object class="GtkComboBox" id="FileFormat"> <property name="visible">True</property> + <property name="hexpand">False</property> + <property name="halign">start</property> <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Format to mux encoded tracks to.</property> + <signal name="changed" handler="container_changed_cb" swapped="no"/> + </object> + <packing> + <property name="top_attach">0</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="Mp4HttpOptimize"> + <property name="label" translatable="yes">Web Optimized</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkGrid" id="table12"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="row_homogeneous">True</property> - <property name="column_homogeneous">True</property> - <property name="margin-top">6</property> - <property name="margin-bottom">2</property> - <property name="margin-start">12</property> - <property name="margin-end">2</property> - <child> - <object class="GtkLabel" id="label13"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Autocrop:</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="crop_auto"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">On</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label12"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Crop:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="crop_values"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">--</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label76"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Crop Dimensions:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="crop_dimensions"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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">--</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label16"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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"><b>Cropping</b></property> - <property name="use_markup">True</property> - </object> - </child> + <property name="tooltip_text" translatable="yes">Optimize the layout of the MP4 file for progressive download. +This allows a player to initiate playback before downloading the entire file.</property> + <property name="halign">start</property> + <property name="hexpand">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="padding">2</property> - <property name="position">1</property> + <property name="top_attach">1</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> </packing> </child> <child> - <object class="GtkFrame" id="frame16"> + <object class="GtkCheckButton" id="AlignAVStart"> + <property name="label" translatable="yes">Align A/V Start</property> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkGrid" id="table13"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="row_homogeneous">True</property> - <property name="column_homogeneous">True</property> - <property name="margin-top">6</property> - <property name="margin-bottom">2</property> - <property name="margin-start">12</property> - <property name="margin-end">2</property> - <child> - <object class="GtkLabel" id="label14"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Scale Dimensions:</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="scale_dimensions"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">--</property> - </object> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label15"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Optimal for Source:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="scale_auto"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">On</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label17"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Anamorphic:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="left_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="scale_anamorphic"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">On</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="left_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label19"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <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"><b>Scaling</b></property> - <property name="use_markup">True</property> - </object> - </child> + <property name="tooltip_text" translatable="yes">Aligns the initial timestamps of all audio and video streams by +inserting blank frames or dropping frames. May improve audio/video +sync for broken players that do not honor MP4 edit lists.</property> + <property name="halign">start</property> + <property name="hexpand">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="padding">2</property> - <property name="position">2</property> + <property name="top_attach">2</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="Mp4iPodCompatible"> + <property name="label" translatable="yes">iPod 5G Support</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="tooltip_text" translatable="yes">Add iPod Atom needed by some older iPods.</property> + <property name="halign">start</property> + <property name="hexpand">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> + </object> + <packing> + <property name="top_attach">3</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="tracks_summary_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Tracks:</b></property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="hexpand">False</property> + <property name="margin-top">12</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="left_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="tracks_summary"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="width-chars">30</property> + <property name="max-width-chars">50</property> + <property name="halign">start</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="hexpand">False</property> + <property name="wrap">True</property> + <property name="margin-top">12</property> + <property name="label" translatable="yes"></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="filters_summary_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Filters:</b></property> + <property name="use_markup">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="hexpand">False</property> + <property name="margin-top">12</property> + </object> + <packing> + <property name="top_attach">12</property> + <property name="left_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="filters_summary"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="width-chars">30</property> + <property name="max-width-chars">50</property> + <property name="halign">start</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="hexpand">False</property> + <property name="wrap">True</property> + <property name="margin-top">12</property> + <property name="label" translatable="yes"></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="top_attach">12</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">4</property> </packing> </child> </object> <packing> - <property name="expand">True</property> - <property name="fill">True</property> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">0</property> </packing> </child> @@ -2099,53 +1707,52 @@ sync for broken players that do not honor MP4 edit lists.</property> <property name="orientation">vertical</property> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="valign">center</property> + <property name="expand">True</property> <property name="margin-top">12</property> <property name="margin-end">0</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> <object class="GtkImage" id="preview_button_image"> - <property name="width_request">448</property> - <property name="height_request">200</property> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="valign">end</property> <property name="margin-bottom">4</property> <property name="margin-start">4</property> <property name="margin-end">4</property> + <property name="expand">True</property> <property name="pixel_size">128</property> <property name="icon_name">hb-icon</property> <signal name="size-allocate" handler="preview_button_size_allocate_cb" swapped="no"/> </object> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkBox" id="picture_summary2"> - <property name="orientation">horizontal</property> + <object class="GtkGrid" id="dimensions_summary_table"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="spacing">4</property> <property name="halign">center</property> <property name="valign">start</property> + <property name="column-spacing">6</property> <child> - <object class="GtkLabel" id="label10"> + <object class="GtkLabel" id="dimensions_summary_label"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Presentation Dimensions:</property> - <property name="justify">right</property> + <property name="label" translatable="yes">Dimensions:</property> + <property name="halign">start</property> + <property name="xalign">0</property> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> + <property name="top_attach">0</property> + <property name="left_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> </packing> </child> <child> - <object class="GtkLabel" id="preview_dims"> + <object class="GtkLabel" id="dimensions_summary"> <property name="width_request">85</property> <property name="visible">True</property> <property name="can_focus">False</property> @@ -2154,16 +1761,48 @@ sync for broken players that do not honor MP4 edit lists.</property> <property name="label" translatable="yes">--</property> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> + <property name="top_attach">0</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="aspect_summary_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Aspect Ratio:</property> + <property name="halign">start</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="left_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="aspect_summary"> + <property name="width_request">85</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="valign">start</property> + <property name="label" translatable="yes">--</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> </object> @@ -3647,7 +3286,7 @@ a variable framerate, 'Same as source' will preserve it.</property> <property name="tooltip_text" translatable="yes">Enables constant framerate output.</property> <property name="halign">start</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> + <signal name="toggled" handler="framerate_mode_changed_cb" swapped="no"/> </object> <packing> <property name="top_attach">2</property> @@ -3670,7 +3309,7 @@ VFR is not compatible with some players.</property> <property name="halign">start</property> <property name="draw_indicator">True</property> <property name="group">VideoFramerateCFR</property> - <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> + <signal name="toggled" handler="framerate_mode_changed_cb" swapped="no"/> </object> <packing> <property name="top_attach">3</property> @@ -3692,7 +3331,7 @@ VFR is not compatible with some players.</property> <property name="halign">start</property> <property name="draw_indicator">True</property> <property name="group">VideoFramerateCFR</property> - <signal name="toggled" handler="setting_widget_changed_cb" swapped="no"/> + <signal name="toggled" handler="framerate_mode_changed_cb" swapped="no"/> </object> <packing> <property name="top_attach">3</property> @@ -5180,7 +4819,7 @@ filter_output([ <property name="sensitive">True</property> <property name="can_focus">True</property> <property name="is_important">True</property> - <property name="label" translatable="yes">Foreign Audio Search</property> + <property name="label" translatable="yes">Foreign Audio Scan</property> <property name="icon_name">list-add</property> <property name="tooltip_text" translatable="yes">Add an extra pass to the encode which searches for subtitle candidates that provide subtitles for @@ -5465,12 +5104,12 @@ filter_output([ </child> <child> <object class="GtkCheckButton" id="SubtitleAddForeignAudioSearch"> - <property name="label" translatable="yes">Add Foreign Audio Search Pass</property> + <property name="label" translatable="yes">Add Foreign Audio Scan Pass</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Add "Foreign Audio Search" when the default audio track is your preferred language. + <property name="tooltip_text" translatable="yes">Add "Foreign Audio Scan" when the default audio track is your preferred language. This search pass finds short sequences of foreign audio and provides subtitles for them. This option requires a language to be set in the Selected Languages list.</property> @@ -7188,6 +6827,74 @@ This file may be reloaded at a later time to edit your jobs and re-encode.</prop </packing> </child> <child> + <object class="GtkGrid" id="table4"> + <property name="row-spacing">2</property> + <property name="column-spacing">2</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin-top">12</property> + <property name="margin-start">6</property> + <property name="margin-end">6</property> + <child> + <object class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">end</property> + <property name="margin-end">6</property> + <property name="use_markup">True</property> + <property name="label" translatable="yes"><b>Destination:</b></property> + </object> + <packing> + <property name="top_attach">0</property> + <property name="left_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="dest_file"> + <property name="hexpand">True</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Destination filename for your encode.</property> + <property name="primary_icon_activatable">False</property> + <property name="secondary_icon_activatable">False</property> + <accelerator key="d" signal="grab-focus" modifiers="GDK_MOD1_MASK"/> + <signal name="changed" handler="dest_file_changed_cb" swapped="no"/> + <signal name="grab-focus" handler="destination_grab_cb" after="yes" swapped="no"/> + </object> + <packing> + <property name="top_attach">0</property> + <property name="left_attach">1</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkFileChooserButton" id="dest_dir"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Destination directory for your encode.</property> + <property name="action">select-folder</property> + <property name="local_only">False</property> + <property name="title" translatable="yes">Destination Directory</property> + <signal name="selection-changed" handler="dest_dir_set_cb" swapped="no"/> + </object> + <packing> + <property name="top_attach">0</property> + <property name="left_attach">2</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> <object class="GtkBox" id="hbox46"> <property name="orientation">horizontal</property> <property name="visible">True</property> @@ -7230,7 +6937,7 @@ This file may be reloaded at a later time to edit your jobs and re-encode.</prop <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">3</property> + <property name="position">4</property> </packing> </child> <child> @@ -7245,7 +6952,7 @@ This file may be reloaded at a later time to edit your jobs and re-encode.</prop <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">4</property> + <property name="position">5</property> </packing> </child> </object> diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c index 7332f9770..fb8f03205 100644 --- a/gtk/src/hb-backend.c +++ b/gtk/src/hb-backend.c @@ -3688,14 +3688,12 @@ ghb_set_scale_settings(GhbValue *settings, gint mode) ghb_dict_set_int(par, "Den", resultGeo.par.den); } -void -ghb_update_display_aspect_label(signal_user_data_t *ud) +char * +ghb_get_display_aspect_string(int disp_width, int disp_height) { - gint disp_width, disp_height, dar_width, dar_height; + gint dar_width, dar_height; gchar *str; - disp_width = ghb_dict_get_int(ud->settings, "PictureDisplayWidth"); - disp_height = ghb_dict_get_int(ud->settings, "PictureDisplayHeight"); hb_reduce(&dar_width, &dar_height, disp_width, disp_height); gint iaspect = dar_width * 9 / dar_height; if (dar_width > 2 * dar_height) @@ -3714,6 +3712,18 @@ ghb_update_display_aspect_label(signal_user_data_t *ud) { str = g_strdup_printf("%d : %d", dar_width, dar_height); } + return str; +} + +void +ghb_update_display_aspect_label(signal_user_data_t *ud) +{ + gint disp_width, disp_height; + gchar *str; + + disp_width = ghb_dict_get_int(ud->settings, "PictureDisplayWidth"); + disp_height = ghb_dict_get_int(ud->settings, "PictureDisplayHeight"); + str = ghb_get_display_aspect_string(disp_width, disp_height); ghb_ui_update(ud, "display_aspect", ghb_string_value(str)); g_free(str); } @@ -3725,6 +3735,7 @@ ghb_set_scale(signal_user_data_t *ud, gint mode) ud->scale_busy = TRUE; ghb_set_scale_settings(ud->settings, mode); + ghb_update_summary_info(ud); ghb_picture_settings_deps(ud); // Step needs to be at least 2 because odd widths cause scaler crash diff --git a/gtk/src/hb-backend.h b/gtk/src/hb-backend.h index 450989a06..d3c1410b5 100644 --- a/gtk/src/hb-backend.h +++ b/gtk/src/hb-backend.h @@ -225,6 +225,7 @@ const hb_rate_t* ghb_settings_audio_bitrate( const char* ghb_audio_bitrate_get_short_name(int rate); hb_audio_config_t* ghb_get_audio_info(const hb_title_t *title, gint track); hb_subtitle_t* ghb_get_subtitle_info(const hb_title_t *title, gint track); +char * ghb_get_display_aspect_string(int disp_width, int disp_height); hb_handle_t* ghb_scan_handle(void); hb_handle_t* ghb_queue_handle(void); diff --git a/gtk/src/makedeps.py b/gtk/src/makedeps.py index 5ff09304e..e2ed0c226 100644 --- a/gtk/src/makedeps.py +++ b/gtk/src/makedeps.py @@ -10,8 +10,6 @@ dep_map = ( DepEntry("title", "queue_add_menu", "none", True, False), DepEntry("title", "queue_add_multiple_menu", "none", True, False), DepEntry("title", "preview_frame", "none", True, False), - DepEntry("title", "picture_summary", "none", True, False), - DepEntry("title", "picture_summary2", "none", True, False), DepEntry("title", "chapters_tab", "none", True, False), DepEntry("title", "start_point", "none", True, False), DepEntry("title", "end_point", "none", True, False), diff --git a/gtk/src/preview.c b/gtk/src/preview.c index 81f278e9b..9dcf81c4f 100644 --- a/gtk/src/preview.c +++ b/gtk/src/preview.c @@ -841,11 +841,11 @@ static void set_mini_preview_image(signal_user_data_t *ud, GdkPixbuf * pix) preview_height = gdk_pixbuf_get_height(pix); // Scale and display the mini-preview - height = MIN(ud->preview->button_height, 200); + height = MIN(ud->preview->button_height - 32, preview_height); width = preview_width * height / preview_height; - if (width > 400) + if (width > ud->preview->button_width - 32) { - width = 400; + width = MIN(ud->preview->button_width - 32, preview_width); height = preview_height * width / preview_width; } if ((height >= 16) && (width >= 16)) @@ -876,7 +876,7 @@ GdkPixbuf * do_preview_scaling(signal_user_data_t *ud, GdkPixbuf *pix) preview_width = gdk_pixbuf_get_width(pix); preview_height = gdk_pixbuf_get_height(pix); - if (ud->preview->render_width < 0 || ud->preview->render_height < 0) + if (ud->preview->render_width <= 0 || ud->preview->render_height <= 0) { // resize preview window to fit preview preview_set_render_size(ud, preview_width, preview_height); @@ -936,7 +936,11 @@ init_preview_image(signal_user_data_t *ud) title_id = ghb_dict_get_int(ud->settings, "title"); title = ghb_lookup_title(title_id, &titleindex); - if (title == NULL) return; + if (title == NULL) + { + g_object_unref(ud->preview->pix); + ud->preview->pix = NULL; + } widget = GHB_WIDGET (ud->builder, "preview_frame"); ud->preview->frame = ghb_widget_int(widget) - 1; if (ud->preview->encoded[ud->preview->frame]) @@ -970,11 +974,6 @@ init_preview_image(signal_user_data_t *ud) pix_width = gdk_pixbuf_get_width(ud->preview->pix); pix_height = gdk_pixbuf_get_height(ud->preview->pix); preview_set_size(ud, pix_width, pix_height); - - gchar *text = g_strdup_printf("%d x %d", width, height); - widget = GHB_WIDGET(ud->builder, "preview_dims"); - gtk_label_set_text(GTK_LABEL(widget), text); - g_free(text); } void diff --git a/gtk/src/queuehandler.c b/gtk/src/queuehandler.c index a708598fa..c8fdd00fc 100644 --- a/gtk/src/queuehandler.c +++ b/gtk/src/queuehandler.c @@ -78,6 +78,47 @@ queue_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t } } +char * +ghb_subtitle_short_description(const GhbValue *subsource, + const GhbValue *subsettings) +{ + GhbValue *srt; + char *desc = NULL; + + srt = ghb_dict_get(subsettings, "SRT"); + if (srt != NULL) + { + const gchar *code; + const gchar *lang; + const iso639_lang_t *iso; + + lang = ghb_dict_get_string(srt, "Language"); + code = ghb_dict_get_string(srt, "Codeset"); + + iso = lang_lookup(lang); + if (iso != NULL) + { + if (iso->native_name != NULL) + lang = iso->native_name; + else + lang = iso->eng_name; + } + + desc = g_strdup_printf("%s (%s)(SRT)", lang, code); + } + else if (subsource == NULL) + { + desc = g_strdup(_("Foreign Audio Scan")); + } + else + { + const char * lang = ghb_dict_get_string(subsource, "Language"); + desc = g_strdup_printf("%s", lang); + } + + return desc; +} + static char * subtitle_get_track_description(const GhbValue *subsource, const GhbValue *subsettings) @@ -120,15 +161,13 @@ subtitle_get_track_description(const GhbValue *subsource, } else if (subsource == NULL) { - desc = g_strdup(_("Foreign Audio Search")); + desc = g_strdup(_("Foreign Audio Scan")); } else { int track = ghb_dict_get_int(subsettings, "Track"); - int source = ghb_dict_get_int(subsource, "Source"); const char * lang = ghb_dict_get_string(subsource, "Language"); - desc = g_strdup_printf("%d - %s (%s)", track + 1, - lang, hb_subsource_name(source)); + desc = g_strdup_printf("%d - %s", track + 1, lang); } return desc; diff --git a/gtk/src/subtitlehandler.c b/gtk/src/subtitlehandler.c index 580562fce..66ca478c1 100644 --- a/gtk/src/subtitlehandler.c +++ b/gtk/src/subtitlehandler.c @@ -379,7 +379,7 @@ subtitle_get_track_description(GhbValue *settings, GhbValue *subsettings) track = ghb_dict_get_int(subsettings, "Track"); if (val == NULL || track < 0) { - desc = g_strdup(_("Foreign Audio Search")); + desc = g_strdup(_("Foreign Audio Scan")); } else { @@ -717,8 +717,13 @@ subtitle_update_setting(GhbValue *val, const char *name, signal_user_data_t *ud) { ghb_dict_set(subsettings, name, val); subtitle_list_refresh_selected(ud, subsettings); + ghb_update_summary_info(ud); ghb_live_reset(ud); } + else + { + ghb_value_free(&val); + } return subsettings; } @@ -818,6 +823,7 @@ subtitle_srt_radio_toggled_cb(GtkWidget *widget, signal_user_data_t *ud) } subtitle_update_dialog_widgets(ud, subsettings); subtitle_list_refresh_selected(ud, subsettings); + ghb_update_summary_info(ud); ghb_live_reset(ud); } } @@ -857,6 +863,7 @@ srt_setting_update(GhbValue *val, const char *name, signal_user_data_t *ud) { ghb_dict_set(srt, name, val); subtitle_list_refresh_selected(ud, subsettings); + ghb_update_summary_info(ud); ghb_live_reset(ud); } else @@ -1094,6 +1101,7 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { ghb_value_free(&backup); } + ghb_update_summary_info(ud); } } @@ -1150,6 +1158,7 @@ subtitle_add_fas_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) ghb_value_free(&backup); } + ghb_update_summary_info(ud); } G_MODULE_EXPORT void @@ -1184,6 +1193,7 @@ subtitle_add_all_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) FALSE, FALSE, FALSE, &one_burned); } subtitle_refresh_list_ui(ud); + ghb_update_summary_info(ud); ghb_live_reset(ud); } @@ -1191,6 +1201,7 @@ G_MODULE_EXPORT void subtitle_reset_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { ghb_set_pref_subtitle(ud); + ghb_update_summary_info(ud); } // When the container changes, it may be necessary to burn additional @@ -1533,6 +1544,7 @@ subtitle_edit_clicked_cb(GtkWidget *widget, gchar *path, signal_user_data_t *ud) { ghb_value_free(&backup); } + ghb_update_summary_info(ud); } } @@ -1585,6 +1597,7 @@ subtitle_remove_clicked_cb(GtkWidget *widget, gchar *path, signal_user_data_t *u // Enable FAS button GtkWidget *w = GHB_WIDGET(ud->builder, "subtitle_add_fas"); gtk_widget_set_sensitive(w, 1); + ghb_update_summary_info(ud); return; } row--; @@ -1604,6 +1617,7 @@ subtitle_remove_clicked_cb(GtkWidget *widget, gchar *path, signal_user_data_t *u // Remove the selected item gtk_tree_store_remove(GTK_TREE_STORE(tm), &ti); + ghb_update_summary_info(ud); ghb_live_reset(ud); } gtk_tree_path_free(tp); diff --git a/gtk/src/subtitlehandler.h b/gtk/src/subtitlehandler.h index 9ce7e9baf..d29d781e9 100644 --- a/gtk/src/subtitlehandler.h +++ b/gtk/src/subtitlehandler.h @@ -38,5 +38,7 @@ void ghb_subtitle_set_pref_lang(GhbValue *settings); void ghb_clear_subtitle_selection(GtkBuilder *builder); GhbValue *ghb_get_subtitle_list(GhbValue *settings); GhbValue *ghb_get_subtitle_settings(GhbValue *settings); +char * ghb_subtitle_short_description(const GhbValue *subsource, + const GhbValue *subsettings); #endif // _SUBTITLEHANDLER_H_ diff --git a/gtk/src/videohandler.c b/gtk/src/videohandler.c index 7e23f120b..0219e22cf 100644 --- a/gtk/src/videohandler.c +++ b/gtk/src/videohandler.c @@ -71,6 +71,7 @@ vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_widget_to_setting(ud->settings, widget); ghb_check_dependency(ud, widget, NULL); ghb_show_container_options(ud); + ghb_update_summary_info(ud); ghb_clear_presets_selection(ud); ghb_live_reset(ud); @@ -330,3 +331,35 @@ format_video_preset_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) return g_strdup_printf(" %-12s", "ERROR"); } +G_MODULE_EXPORT void +framerate_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +{ + ghb_widget_to_setting(ud->settings, widget); + ghb_update_summary_info(ud); + + if (ghb_settings_video_framerate_rate(ud->settings, "VideoFramerate") != 0) + { + if (!ghb_dict_get_bool(ud->settings, "VideoFrameratePFR")) + { + ghb_ui_update(ud, "VideoFramerateCFR", ghb_boolean_value(TRUE)); + } + } + if (ghb_settings_video_framerate_rate(ud->settings, "VideoFramerate") == 0 && + ghb_dict_get_bool(ud->settings, "VideoFrameratePFR")) + { + ghb_ui_update(ud, "VideoFramerateVFR", ghb_boolean_value(TRUE)); + } + ghb_check_dependency(ud, widget, NULL); + ghb_clear_presets_selection(ud); + ghb_live_reset(ud); +} + +G_MODULE_EXPORT void +framerate_mode_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +{ + ghb_widget_to_setting(ud->settings, widget); + ghb_update_summary_info(ud); + ghb_check_dependency(ud, widget, NULL); + ghb_clear_presets_selection(ud); + ghb_live_reset(ud); +} diff --git a/libhb/avfilter.c b/libhb/avfilter.c index cc39a1a15..c37950815 100644 --- a/libhb/avfilter.c +++ b/libhb/avfilter.c @@ -66,7 +66,7 @@ hb_filter_object_t hb_filter_pad = { .id = HB_FILTER_PAD, .enforce_order = 1, - .name = "pad", + .name = "Pad", .settings = NULL, .init = null_init, .work = null_work, @@ -82,7 +82,7 @@ hb_filter_object_t hb_filter_rotate = { .id = HB_FILTER_ROTATE, .enforce_order = 1, - .name = "rotate", + .name = "Rotate", .settings = NULL, .init = null_init, .work = null_work, @@ -98,7 +98,7 @@ hb_filter_object_t hb_filter_deinterlace = { .id = HB_FILTER_DEINTERLACE, .enforce_order = 1, - .name = "deinterlace", + .name = "Deinterlace", .settings = NULL, .init = null_init, .work = null_work, diff --git a/libhb/hb_dict.c b/libhb/hb_dict.c index 22c88f2a9..09b3855a8 100644 --- a/libhb/hb_dict.c +++ b/libhb/hb_dict.c @@ -606,7 +606,7 @@ int hb_dict_extract_rational(hb_rational_t *dst, const hb_dict_t * dict, { return 0; } - hb_value_t * den_val = hb_dict_get(val, "Num"); + hb_value_t * den_val = hb_dict_get(val, "Den"); if (den_val == NULL) { return 0; |