OSDN Git Service

patch to allow higher bitrates with faac
[handbrake-jp/handbrake-jp-git.git] / gtk / src / preview.c
index 7968678..4ed717b 100644 (file)
@@ -62,6 +62,7 @@ struct preview_s
        gint encode_frame;
        gint live_id;
        gchar *current;
+       gint live_enabled;
 };
 
 #if defined(_ENABLE_GST)
@@ -82,6 +83,9 @@ ghb_screen_par(signal_user_data_t *ud, gint *par_n, gint *par_d)
        GObjectClass *klass;
        GParamSpec *pspec;
 
+       if (!ud->preview->live_enabled)
+               goto fail;
+
        g_value_init(&disp_par, GST_TYPE_FRACTION);
        gst_value_set_fraction(&disp_par, 1, 1);
        g_object_get(ud->preview->play, "video-sink", &xover, NULL);
@@ -142,6 +146,8 @@ ghb_par_scale(signal_user_data_t *ud, gint *width, gint *height, gint par_n, gin
 void
 ghb_preview_init(signal_user_data_t *ud)
 {
+       GtkWidget *widget;
+
        ud->preview = g_malloc0(sizeof(preview_t));
        ud->preview->view = GHB_WIDGET(ud->builder, "preview_image");
        gtk_widget_realize(ud->preview->view);
@@ -151,17 +157,23 @@ ghb_preview_init(signal_user_data_t *ud)
        ud->preview->pause = TRUE;
        ud->preview->encode_frame = -1;
        ud->preview->live_id = -1;
-
+       widget = GHB_WIDGET (ud->builder, "preview_button_image");
+       gtk_widget_get_size_request(widget, &ud->preview->button_width, &ud->preview->button_height);
+       
 #if defined(_ENABLE_GST)
        GstBus *bus;
        GstElement *xover;
 
+#if !defined(_WIN32)
        ud->preview->xid = GDK_DRAWABLE_XID(ud->preview->view->window);
+#else
+       ud->preview->xid = GDK_WINDOW_HWND(ud->preview->view->window);
+#endif
        ud->preview->play = gst_element_factory_make("playbin", "play");
        //xover = gst_element_factory_make("xvimagesink", "xover");
        //xover = gst_element_factory_make("ximagesink", "xover");
        xover = gst_element_factory_make("gconfvideosink", "xover");
-       if (xover == NULL)
+       if (ud->preview->play == NULL || xover == NULL)
        {
                GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
                gtk_widget_hide (widget);
@@ -169,18 +181,21 @@ ghb_preview_init(signal_user_data_t *ud)
                gtk_widget_hide (widget);
                return;
        }
+       else
+       {
 
-       g_object_set(G_OBJECT(ud->preview->play), "video-sink", xover, NULL);
-       g_object_set(ud->preview->play, "subtitle-font-desc", 
-                               "sans bold 20", NULL);
-       //g_object_set(G_OBJECT(xover), "force-aspect-ratio", TRUE, NULL);
+               g_object_set(G_OBJECT(ud->preview->play), "video-sink", xover, NULL);
+               g_object_set(ud->preview->play, "subtitle-font-desc", 
+                                       "sans bold 20", NULL);
 
-       bus = gst_pipeline_get_bus(GST_PIPELINE(ud->preview->play));
-       gst_bus_add_watch(bus, live_preview_cb, ud);
-       gst_bus_set_sync_handler(bus, create_window, ud->preview);
-       gst_object_unref(bus);
+               bus = gst_pipeline_get_bus(GST_PIPELINE(ud->preview->play));
+               gst_bus_add_watch(bus, live_preview_cb, ud);
+               gst_bus_set_sync_handler(bus, create_window, ud->preview);
+               gst_object_unref(bus);
+               ud->preview->live_enabled = 1;
+       }
 #else
-       GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
+       widget = GHB_WIDGET(ud->builder, "live_preview_box");
        gtk_widget_hide (widget);
        widget = GHB_WIDGET(ud->builder, "live_preview_duration_box");
        gtk_widget_hide (widget);
@@ -209,8 +224,13 @@ create_window(GstBus *bus, GstMessage *msg, gpointer data)
        {
                if (!gst_structure_has_name(msg->structure, "prepare-xwindow-id"))
                        return GST_BUS_PASS;
+#if !defined(_WIN32)
                gst_x_overlay_set_xwindow_id(
                        GST_X_OVERLAY(GST_MESSAGE_SRC(msg)), preview->xid);
+#else
+               gst_directdraw_sink_set_window_id(
+                       GST_X_OVERLAY(GST_MESSAGE_SRC(msg)), preview->xid);
+#endif
                gst_message_unref(msg);
                return GST_BUS_DROP;
        } break;
@@ -432,6 +452,9 @@ live_preview_start(signal_user_data_t *ud)
        GtkImage *img;
        gchar *uri;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image"));
        if (!ud->preview->encoded[ud->preview->frame])
        {
@@ -455,6 +478,9 @@ live_preview_pause(signal_user_data_t *ud)
 {
        GtkImage *img;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image"));
        gtk_image_set_from_stock(img, "gtk-media-play", GTK_ICON_SIZE_BUTTON);
        gst_element_set_state(ud->preview->play, GST_STATE_PAUSED);
@@ -468,6 +494,9 @@ live_preview_stop(signal_user_data_t *ud)
        GtkImage *img;
        GtkRange *progress;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image"));
        gtk_image_set_from_stock(img, "gtk-media-play", GTK_ICON_SIZE_BUTTON);
 #if defined(_ENABLE_GST)
@@ -504,8 +533,6 @@ ghb_live_reset(signal_user_data_t *ud)
                ghb_set_preview_image(ud);
 }
 
-extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]);
-
 G_MODULE_EXPORT void
 live_preview_start_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
@@ -592,6 +619,9 @@ ghb_live_preview_progress(signal_user_data_t *ud)
        GstFormat fmt = GST_FORMAT_TIME;
        gint64 len = -1, pos = -1;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        if (ud->preview->state != PREVIEW_STATE_LIVE || ud->preview->seek_lock)
                return;
 
@@ -641,6 +671,9 @@ live_preview_seek_cb(GtkWidget *widget, signal_user_data_t *ud)
        gdouble dval;
        gint64 pos;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        if (ud->preview->progress_lock)
                return;
 
@@ -744,6 +777,9 @@ delayed_expose_cb(signal_user_data_t *ud)
        GstElement *vsink;
        GstXOverlay *xover;
 
+       if (!ud->preview->live_enabled)
+               return FALSE;
+
        g_object_get(ud->preview->play, "video-sink", &vsink, NULL);
        if (vsink == NULL)
                return FALSE;
@@ -767,7 +803,7 @@ preview_expose_cb(
        signal_user_data_t *ud)
 {
 #if defined(_ENABLE_GST)
-       if (ud->preview->state == PREVIEW_STATE_LIVE)
+       if (ud->preview->live_enabled && ud->preview->state == PREVIEW_STATE_LIVE)
        {
                if (GST_STATE(ud->preview->play) >= GST_STATE_PAUSED)
                {
@@ -864,7 +900,7 @@ preview_button_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        ghb_widget_to_setting (ud->settings, xwidget);
        ghb_preview_set_visible(ud);
        ghb_check_dependency(ud, xwidget, NULL);
-       const gchar *name = gtk_widget_get_name(xwidget);
+       const gchar *name = ghb_get_setting_key(xwidget);
        ghb_pref_save(ud->settings, name);
 }
 
@@ -921,7 +957,7 @@ fullscreen_clicked_cb(GtkWidget *toggle, signal_user_data_t *ud)
        g_debug("fullscreen_clicked_cb()");
        ghb_widget_to_setting (ud->settings, toggle);
        ghb_check_dependency(ud, toggle, NULL);
-       const gchar *name = gtk_widget_get_name(toggle);
+       const gchar *name = ghb_get_setting_key(toggle);
        ghb_pref_save(ud->settings, name);
 
        window = GTK_WINDOW(GHB_WIDGET (ud->builder, "preview_window"));
@@ -1017,7 +1053,7 @@ preview_duration_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_live_reset(ud);
        ghb_widget_to_setting (ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 }