]> granicus.if.org Git - handbrake/commitdiff
LinGui: Reorgainize Summary pane
authorJohn Stebbins <jstebbins.hb@gmail.com>
Tue, 12 Sep 2017 19:43:11 +0000 (12:43 -0700)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Mon, 6 Nov 2017 16:19:49 +0000 (08:19 -0800)
Synching up with https://github.com/HandBrake/HandBrake/issues/833

14 files changed:
gtk/src/audiohandler.c
gtk/src/callbacks.c
gtk/src/callbacks.h
gtk/src/ghb.m4
gtk/src/hb-backend.c
gtk/src/hb-backend.h
gtk/src/makedeps.py
gtk/src/preview.c
gtk/src/queuehandler.c
gtk/src/subtitlehandler.c
gtk/src/subtitlehandler.h
gtk/src/videohandler.c
libhb/avfilter.c
libhb/hb_dict.c

index 0a3a01833d9558390518013d17050e05cca96200..f6def5149d005d95115181142aae88d5bd048339 100644 (file)
@@ -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)
index 89aa9740cc7d87bf50de47106b01226f5764fc8c..649e7d227d7b103ae2a4025e8cbec8805b4f7cfc 100644 (file)
@@ -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);
 
@@ -1848,6 +1817,320 @@ static void update_meta(GhbValue *settings, const char *name, const char *val)
         ghb_dict_set_string(metadata, name, 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)
 {
@@ -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;
@@ -2127,33 +2413,12 @@ 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;
index 729f89974e7af33b75b3f58b5934f6c6eafbbf1e..7e0b1b886b0b9d80baa817efcda308349eacbca4 100644 (file)
@@ -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_
 
index 75ca74e445aaa9fdc96964a51c54bf6bdc8abb48..adf68c13694ad92c0ee8f068309615ae92c3335e 100644 (file)
@@ -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">&lt;b&gt;Source:&lt;/b&gt;</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">&lt;b&gt;Source:&lt;/b&gt;</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">&lt;b&gt;Destination&lt;/b&gt;</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">&lt;b&gt;Source Picture Parameters&lt;/b&gt;</property>
-                                    <property name="use_markup">True</property>
-                                  </object>
-                                </child>
+                                <property name="label" translatable="yes">&lt;b&gt;Format:&lt;/b&gt;</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">&lt;b&gt;Cropping&lt;/b&gt;</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="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="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="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">2</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="Mp4iPodCompatible">
+                                <property name="label" translatable="yes">iPod 5G Support</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">&lt;b&gt;Scaling&lt;/b&gt;</property>
-                                    <property name="use_markup">True</property>
-                                  </object>
-                                </child>
+                                <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="expand">False</property>
-                                <property name="fill">True</property>
-                                <property name="padding">2</property>
-                                <property name="position">2</property>
+                                <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">&lt;b&gt;Tracks:&lt;/b&gt;</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">&lt;b&gt;Filters:&lt;/b&gt;</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>
@@ -7187,6 +6826,74 @@ This file may be reloaded at a later time to edit your jobs and re-encode.</prop
             <property name="position">2</property>
           </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">&lt;b&gt;Destination:&lt;/b&gt;</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>
@@ -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>
index 7332f9770c11b38c926da29cd0e6f11fee02526a..fb8f0320566997fad27d98e59d8621b0636b0dde 100644 (file)
@@ -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
index 450989a06143284be98e285f31df502602bf0cbf..d3c1410b5dc4dc473caa75cadceb800cb06eec55 100644 (file)
@@ -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);
index 5ff09304e2522640fe0e2c14b0584ee876e6aea9..e2ed0c226f6759e92a92562cfbff3188df356b6a 100644 (file)
@@ -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),
index 81f278e9bd53ebdaaa6888583515cc3787616222..9dcf81c4f09cb84228b1fc33328ed892ee8ac238 100644 (file)
@@ -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
index a708598fa6c1f7d4807fb0d5c9f1ddd39fe5d98f..c8fdd00fc12d36f001afee371f07655dd9b57216 100644 (file)
@@ -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;
index 580562fce4d766daa2e3d9268acbd21a3742b7e8..66ca478c1ac73a553a0061a052ce278bdb109d42 100644 (file)
@@ -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);
index 9ce7e9baf944bd02a0db13350417920060a49b4a..d29d781e9f051dba8297a4461a29a9d4bc2ae5e6 100644 (file)
@@ -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_
index 7e23f120b54ee298ceaee764644671d4808de01f..0219e22cf145445c49c71901b88230f7b14e5c71 100644 (file)
@@ -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);
+}
index cc39a1a157b1827d6a60b94216a749ffe8b0338f..c37950815ac3d0e2e970b7745ca94171396f2328 100644 (file)
@@ -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,
index 22c88f2a97edf3bf24274e65f7bb162339f8ae59..09b3855a8ecba5501dac226bdcd2ced7af539095 100644 (file)
@@ -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;