static gboolean impl_activate (IdolPlugin *plugin, IdolObject *idol, GError **error) { IdolScreensaverPlugin *pi = IDOL_SCREENSAVER_PLUGIN (plugin); MateConfClient *gc; pi->bvw = BACON_VIDEO_WIDGET (idol_get_video_widget (idol)); gc = mateconf_client_get_default (); mateconf_client_add_dir (gc, MATECONF_PREFIX, MATECONF_CLIENT_PRELOAD_ONELEVEL, NULL); pi->handler_id_mateconf = mateconf_client_notify_add (gc, MATECONF_PREFIX"/lock_screensaver_on_audio", (MateConfClientNotifyFunc) lock_screensaver_on_audio_changed_cb, plugin, NULL, NULL); g_object_unref (gc); pi->handler_id_playing = g_signal_connect (G_OBJECT (idol), "notify::playing", G_CALLBACK (property_notify_cb), pi); pi->handler_id_metadata = g_signal_connect (G_OBJECT (pi->bvw), "got-metadata", G_CALLBACK (got_metadata_cb), pi); pi->idol = g_object_ref (idol); /* Force setting the current status */ idol_screensaver_update_from_state (idol, pi); return TRUE; }
static gboolean impl_activate (TotemPlugin *plugin, TotemObject *totem, GError **error) { TotemYouTubePlugin *self = TOTEM_YOUTUBE_PLUGIN (plugin); GtkWindow *main_window; GtkBuilder *builder; guint i; self->totem = g_object_ref (totem); self->bvw = BACON_VIDEO_WIDGET (totem_get_video_widget (totem)); /* Set up the interface */ main_window = totem_get_main_window (totem); builder = totem_plugin_load_interface (plugin, "youtube.ui", TRUE, main_window, self); g_object_unref (main_window); self->search_entry = GTK_ENTRY (gtk_builder_get_object (builder, "yt_search_entry")); self->search_button = GTK_BUTTON (gtk_builder_get_object (builder, "yt_search_button")); self->notebook = GTK_NOTEBOOK (gtk_builder_get_object (builder, "yt_notebook")); /* Set up the tree view pages */ for (i = 0; i < NUM_TREE_VIEWS; i++) set_up_tree_view (self, builder, i); self->current_tree_view = SEARCH_TREE_VIEW; self->vbox = GTK_WIDGET (gtk_builder_get_object (builder, "yt_vbox")); gtk_widget_show_all (self->vbox); /* Add the sidebar page */ totem_add_sidebar_page (totem, "youtube", _("YouTube"), self->vbox); g_object_unref (builder); return TRUE; }
static void idol_screensaver_update_from_state (IdolObject *idol, IdolScreensaverPlugin *pi) { gboolean lock_screensaver_on_audio, can_get_frames; BaconVideoWidget *bvw; MateConfClient *gc; bvw = BACON_VIDEO_WIDGET (idol_get_video_widget ((Idol *)(idol))); gc = mateconf_client_get_default (); lock_screensaver_on_audio = mateconf_client_get_bool (gc, MATECONF_PREFIX"/lock_screensaver_on_audio", NULL); can_get_frames = bacon_video_widget_can_get_frames (bvw, NULL); if (idol_is_playing (idol) != FALSE && can_get_frames) idol_scrsaver_disable (pi->scr); else if (idol_is_playing (idol) != FALSE && !lock_screensaver_on_audio) idol_scrsaver_disable (pi->scr); else idol_scrsaver_enable (pi->scr); g_object_unref (gc); }
static void xplayer_screensaver_update_from_state (XplayerObject *xplayer, XplayerScreensaverPlugin *pi) { gboolean lock_screensaver_on_audio, has_video_frames; BaconVideoWidget *bvw; bvw = BACON_VIDEO_WIDGET (xplayer_get_video_widget ((Xplayer *)(xplayer))); lock_screensaver_on_audio = g_settings_get_boolean (pi->priv->settings, "lock-screensaver-on-audio"); has_video_frames = has_video (bvw); if ((xplayer_is_playing (xplayer) != FALSE && has_video_frames) || (xplayer_is_playing (xplayer) != FALSE && !lock_screensaver_on_audio)) { if (pi->priv->inhibit_cookie == 0) { GtkWindow *window; window = xplayer_get_main_window (xplayer); pi->priv->inhibit_cookie = gtk_application_inhibit (GTK_APPLICATION (xplayer), window, GTK_APPLICATION_INHIBIT_IDLE, _("Playing a movie")); g_object_unref (window); } } else { if (pi->priv->inhibit_cookie != 0) { gtk_application_uninhibit (GTK_APPLICATION (pi->priv->xplayer), pi->priv->inhibit_cookie); pi->priv->inhibit_cookie = 0; } } }
static void impl_activate (PeasActivatable *plugin) { XplayerScreensaverPlugin *pi = XPLAYER_SCREENSAVER_PLUGIN (plugin); XplayerObject *xplayer; xplayer = g_object_get_data (G_OBJECT (plugin), "object"); pi->priv->bvw = BACON_VIDEO_WIDGET (xplayer_get_video_widget (xplayer)); pi->priv->settings = g_settings_new (XPLAYER_GSETTINGS_SCHEMA); g_signal_connect (pi->priv->settings, "changed::lock-screensaver-on-audio", (GCallback) lock_screensaver_on_audio_changed_cb, plugin); pi->priv->handler_id_playing = g_signal_connect (G_OBJECT (xplayer), "notify::playing", G_CALLBACK (property_notify_cb), pi); pi->priv->handler_id_metadata = g_signal_connect (G_OBJECT (pi->priv->bvw), "got-metadata", G_CALLBACK (got_metadata_cb), pi); pi->priv->xplayer = g_object_ref (xplayer); /* Force setting the current status */ xplayer_screensaver_update_from_state (xplayer, pi); }
void connection_combobox_changed (GtkComboBox *combobox, Idol *idol) { int i; i = gtk_combo_box_get_active (combobox); bacon_video_widget_set_connection_speed (BACON_VIDEO_WIDGET (idol->bvw), i); }
void checkbutton1_toggled_cb (GtkToggleButton *togglebutton, Idol *idol) { gboolean value; value = gtk_toggle_button_get_active (togglebutton); mateconf_client_set_bool (idol->gc, MATECONF_PREFIX"/auto_resize", value, NULL); bacon_video_widget_set_auto_resize (BACON_VIDEO_WIDGET (idol->bvw), value); }
static void totem_prefs_set_show_visuals (Totem *totem, gboolean value) { GtkWidget *item; g_settings_set_boolean (totem->settings, "show-visualizations", value); item = PWID ("tpw_visuals_type_label"); gtk_widget_set_sensitive (item, value); item = PWID ("tpw_visuals_type_combobox"); gtk_widget_set_sensitive (item, value); item = PWID ("tpw_visuals_size_label"); gtk_widget_set_sensitive (item, value); item = PWID ("tpw_visuals_size_combobox"); gtk_widget_set_sensitive (item, value); bacon_video_widget_set_show_visualizations (BACON_VIDEO_WIDGET (totem->bvw), value); }
static void impl_activate (PeasActivatable *plugin) { XplayerOntopPlugin *pi = XPLAYER_ONTOP_PLUGIN (plugin); pi->priv->xplayer = g_object_get_data (G_OBJECT (plugin), "object"); pi->priv->window = xplayer_get_main_window (pi->priv->xplayer); pi->priv->bvw = BACON_VIDEO_WIDGET (xplayer_get_video_widget (pi->priv->xplayer)); pi->priv->handler_id = g_signal_connect (G_OBJECT (pi->priv->xplayer), "notify::playing", G_CALLBACK (property_notify_cb), pi); pi->priv->handler_id_metadata = g_signal_connect (G_OBJECT (pi->priv->bvw), "got-metadata", G_CALLBACK (got_metadata_cb), pi); update_from_state (pi->priv); }
static void idol_prefs_set_show_visuals (Idol *idol, gboolean value) { GtkWidget *item; mateconf_client_set_bool (idol->gc, MATECONF_PREFIX"/show_vfx", value, NULL); item = GTK_WIDGET (gtk_builder_get_object (idol->xml, "tpw_visuals_type_label")); gtk_widget_set_sensitive (item, value); item = GTK_WIDGET (gtk_builder_get_object (idol->xml, "tpw_visuals_type_combobox")); gtk_widget_set_sensitive (item, value); item = GTK_WIDGET (gtk_builder_get_object (idol->xml, "tpw_visuals_size_label")); gtk_widget_set_sensitive (item, value); item = GTK_WIDGET (gtk_builder_get_object (idol->xml, "tpw_visuals_size_combobox")); gtk_widget_set_sensitive (item, value); bacon_video_widget_set_show_visuals (BACON_VIDEO_WIDGET (idol->bvw), value); }
static gboolean impl_activate (IdolPlugin *plugin, IdolObject *idol, GError **error) { IdolOntopPlugin *pi = IDOL_ONTOP_PLUGIN (plugin); pi->priv->window = idol_get_main_window (idol); pi->priv->bvw = BACON_VIDEO_WIDGET (idol_get_video_widget (idol)); pi->priv->idol = idol; pi->priv->handler_id = g_signal_connect (G_OBJECT (idol), "notify::playing", G_CALLBACK (property_notify_cb), pi); pi->priv->handler_id_metadata = g_signal_connect (G_OBJECT (pi->priv->bvw), "got-metadata", G_CALLBACK (got_metadata_cb), pi); update_from_state (pi->priv); return TRUE; }
static gboolean impl_activate (TotemPlugin *plugin, TotemObject *totem, GError **error) { TotemOntopPlugin *pi = TOTEM_ONTOP_PLUGIN (plugin); pi->priv->window = totem_get_main_window (totem); pi->priv->bvw = BACON_VIDEO_WIDGET (totem_get_video_widget (totem)); pi->priv->totem = totem; pi->priv->handler_id = g_signal_connect (G_OBJECT (totem), "notify::playing", G_CALLBACK (property_notify_cb), pi); pi->priv->handler_id_metadata = g_signal_connect (G_OBJECT (pi->priv->bvw), "got-metadata", G_CALLBACK (got_metadata_cb), pi); update_from_state (pi->priv); return TRUE; }
void idol_setup_preferences (Idol *idol) { GtkWidget *menu, *content_area; gboolean show_visuals, auto_resize, is_local, no_deinterlace, lock_screensaver_on_audio, auto_chapters; int connection_speed; guint i, hidden; char *visual, *font, *encoding; GList *list, *l; BvwAudioOutType audio_out; MateConfValue *value; GObject *item; static struct { const char *name; BvwVideoProperty prop; const char *label; } props[4] = { { "tpw_contrast_scale", BVW_VIDEO_CONTRAST, "tpw_contrast_label" }, { "tpw_saturation_scale", BVW_VIDEO_SATURATION, "tpw_saturation_label" }, { "tpw_bright_scale", BVW_VIDEO_BRIGHTNESS, "tpw_brightness_label" }, { "tpw_hue_scale", BVW_VIDEO_HUE, "tpw_hue_label" } }; g_return_if_fail (idol->gc != NULL); is_local = idol_display_is_local (); mateconf_client_add_dir (idol->gc, MATECONF_PREFIX, MATECONF_CLIENT_PRELOAD_ONELEVEL, NULL); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/auto_resize", (MateConfClientNotifyFunc) auto_resize_changed_cb, idol, NULL, NULL); mateconf_client_add_dir (idol->gc, "/desktop/mate/lockdown", MATECONF_CLIENT_PRELOAD_ONELEVEL, NULL); /* Work-around builder dialogue not parenting properly for * On top windows */ item = gtk_builder_get_object (idol->xml, "tpw_notebook"); idol->prefs = gtk_dialog_new_with_buttons (_("Preferences"), GTK_WINDOW (idol->win), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL); gtk_container_set_border_width (GTK_CONTAINER (idol->prefs), 5); content_area = gtk_dialog_get_content_area (GTK_DIALOG (idol->prefs)); gtk_box_set_spacing (GTK_BOX (content_area), 2); gtk_widget_reparent (GTK_WIDGET (item), content_area); gtk_widget_show_all (content_area); item = gtk_builder_get_object (idol->xml, "idol_preferences_window"); gtk_widget_destroy (GTK_WIDGET (item)); g_signal_connect (G_OBJECT (idol->prefs), "response", G_CALLBACK (gtk_widget_hide), NULL); g_signal_connect (G_OBJECT (idol->prefs), "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); g_signal_connect (idol->prefs, "destroy", G_CALLBACK (gtk_widget_destroyed), &idol->prefs); /* Remember position */ idol->remember_position = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/remember_position", NULL); item = gtk_builder_get_object (idol->xml, "tpw_remember_position_checkbutton"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), idol->remember_position); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/remember_position", (MateConfClientNotifyFunc) remember_position_changed_cb, idol, NULL, NULL); /* Auto-resize */ auto_resize = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/auto_resize", NULL); item = gtk_builder_get_object (idol->xml, "tpw_display_checkbutton"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), auto_resize); bacon_video_widget_set_auto_resize (BACON_VIDEO_WIDGET (idol->bvw), auto_resize); /* Screensaver audio locking */ lock_screensaver_on_audio = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/lock_screensaver_on_audio", NULL); if (lock_screensaver_on_audio != FALSE) item = gtk_builder_get_object (idol->xml, "tpw_audio_toggle_button"); else item = gtk_builder_get_object (idol->xml, "tpw_video_toggle_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/lock_screensaver_on_audio", (MateConfClientNotifyFunc) lock_screensaver_on_audio_changed_cb, idol, NULL, NULL); /* Disable deinterlacing */ item = gtk_builder_get_object (idol->xml, "tpw_no_deinterlace_checkbutton"); no_deinterlace = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/disable_deinterlacing", NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), no_deinterlace); bacon_video_widget_set_deinterlacing (idol->bvw, !no_deinterlace); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/disable_deinterlacing", (MateConfClientNotifyFunc) no_deinterlace_changed_cb, idol, NULL, NULL); /* Connection Speed */ connection_speed = bacon_video_widget_get_connection_speed (idol->bvw); item = gtk_builder_get_object (idol->xml, "tpw_speed_combobox"); gtk_combo_box_set_active (GTK_COMBO_BOX (item), connection_speed); /* Enable visuals */ item = gtk_builder_get_object (idol->xml, "tpw_visuals_checkbutton"); show_visuals = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/show_vfx", NULL); if (is_local == FALSE && show_visuals != FALSE) show_visuals = ask_show_visuals (idol); g_signal_handlers_disconnect_by_func (item, checkbutton2_toggled_cb, idol); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), show_visuals); idol_prefs_set_show_visuals (idol, show_visuals); g_signal_connect (item, "toggled", G_CALLBACK (checkbutton2_toggled_cb), idol); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/show_vfx", (MateConfClientNotifyFunc) show_vfx_changed_cb, idol, NULL, NULL); /* Auto-load subtitles */ item = gtk_builder_get_object (idol->xml, "tpw_auto_subtitles_checkbutton"); idol->autoload_subs = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/autoload_subtitles", NULL); g_signal_handlers_disconnect_by_func (item, checkbutton3_toggled_cb, idol); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), idol->autoload_subs); g_signal_connect (item, "toggled", G_CALLBACK (checkbutton3_toggled_cb), idol); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/autoload_subtitles", (MateConfClientNotifyFunc) autoload_subtitles_changed_cb, idol, NULL, NULL); /* Auto-load external chapters */ item = gtk_builder_get_object (idol->xml, "tpw_auto_chapters_checkbutton"); auto_chapters = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/autoload_chapters", NULL); g_signal_handlers_disconnect_by_func (item, auto_chapters_toggled_cb, idol); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), auto_chapters); g_signal_connect (item, "toggled", G_CALLBACK (auto_chapters_toggled_cb), idol); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/autoload_chapters", (MateConfClientNotifyFunc) autoload_chapters_changed_cb, idol, NULL, NULL); /* Visuals list */ list = bacon_video_widget_get_visuals_list (idol->bvw); menu = gtk_menu_new (); gtk_widget_show (menu); visual = mateconf_client_get_string (idol->gc, MATECONF_PREFIX"/visual", NULL); if (visual == NULL || strcmp (visual, "") == 0) { g_free (visual); visual = g_strdup ("goom"); } item = gtk_builder_get_object (idol->xml, "tpw_visuals_type_combobox"); i = 0; for (l = list; l != NULL; l = l->next) { const char *name = l->data; gtk_combo_box_append_text (GTK_COMBO_BOX (item), name); if (strcmp (name, visual) == 0) gtk_combo_box_set_active (GTK_COMBO_BOX (item), i); i++; } g_free (visual); /* Visualisation quality */ i = mateconf_client_get_int (idol->gc, MATECONF_PREFIX"/visual_quality", NULL); bacon_video_widget_set_visuals_quality (idol->bvw, i); item = gtk_builder_get_object (idol->xml, "tpw_visuals_size_combobox"); gtk_combo_box_set_active (GTK_COMBO_BOX (item), i); /* Brightness and all */ hidden = 0; for (i = 0; i < G_N_ELEMENTS (props); i++) { int prop_value; item = gtk_builder_get_object (idol->xml, props[i].name); prop_value = bacon_video_widget_get_video_property (idol->bvw, props[i].prop); if (prop_value >= 0) gtk_range_set_value (GTK_RANGE (item), (gdouble) prop_value); else { gtk_range_set_value (GTK_RANGE (item), (gdouble) 65535/2); gtk_widget_hide (GTK_WIDGET (item)); item = gtk_builder_get_object (idol->xml, props[i].label); gtk_widget_hide (GTK_WIDGET (item)); hidden++; } } if (hidden == G_N_ELEMENTS (props)) { item = gtk_builder_get_object (idol->xml, "tpw_bright_contr_vbox"); gtk_widget_hide (GTK_WIDGET (item)); } /* Sound output type */ item = gtk_builder_get_object (idol->xml, "tpw_sound_output_combobox"); audio_out = bacon_video_widget_get_audio_out_type (idol->bvw); gtk_combo_box_set_active (GTK_COMBO_BOX (item), audio_out); /* Subtitle font selection */ item = gtk_builder_get_object (idol->xml, "font_sel_button"); gtk_font_button_set_title (GTK_FONT_BUTTON (item), _("Select Subtitle Font")); font = mateconf_client_get_string (idol->gc, MATECONF_PREFIX"/subtitle_font", NULL); if (font && strcmp (font, "") != 0) { gtk_font_button_set_font_name (GTK_FONT_BUTTON (item), font); bacon_video_widget_set_subtitle_font (idol->bvw, font); } g_free (font); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/subtitle_font", (MateConfClientNotifyFunc) font_changed_cb, idol, NULL, NULL); /* Subtitle encoding selection */ item = gtk_builder_get_object (idol->xml, "subtitle_encoding_combo"); idol_subtitle_encoding_init (GTK_COMBO_BOX (item)); value = mateconf_client_get_without_default (idol->gc, MATECONF_PREFIX"/subtitle_encoding", NULL); /* Make sure the default is UTF-8 */ if (value != NULL) { if (mateconf_value_get_string (value) == NULL) { encoding = g_strdup ("UTF-8"); } else { encoding = g_strdup (mateconf_value_get_string (value)); if (encoding[0] == '\0') { g_free (encoding); encoding = g_strdup ("UTF-8"); } } mateconf_value_free (value); } else { encoding = g_strdup ("UTF-8"); } idol_subtitle_encoding_set (GTK_COMBO_BOX(item), encoding); if (encoding && strcasecmp (encoding, "") != 0) { bacon_video_widget_set_subtitle_encoding (idol->bvw, encoding); } g_free (encoding); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/subtitle_encoding", (MateConfClientNotifyFunc) encoding_changed_cb, idol, NULL, NULL); /* Disable keyboard shortcuts */ idol->disable_kbd_shortcuts = mateconf_client_get_bool (idol->gc, MATECONF_PREFIX"/disable_keyboard_shortcuts", NULL); mateconf_client_notify_add (idol->gc, MATECONF_PREFIX"/disable_keyboard_shortcuts", (MateConfClientNotifyFunc) disable_kbd_shortcuts_changed_cb, idol, NULL, NULL); }
int main (int argc, char **argv) { GOptionGroup *options; GOptionContext *context; GtkWidget *widget; BaconVideoWidget *bvw; GError *error = NULL; const char *path; bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); g_thread_init (NULL); gdk_threads_init (); g_set_application_name (_("Audio Preview")); gtk_window_set_default_icon_name ("idol"); g_setenv("PULSE_PROP_media.role", "music", TRUE); context = g_option_context_new ("Plays audio passed on the standard input or the filename passed on the command-line"); options = bacon_video_widget_get_option_group (); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_add_group (context, options); g_type_init (); if (g_option_context_parse (context, &argc, &argv, &error) == FALSE) { g_print ("couldn't parse command-line options: %s\n", error->message); g_error_free (error); return 1; } if (g_fatal_warnings) { GLogLevelFlags fatal_mask; fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; g_log_set_always_fatal (fatal_mask); } if (show_mimetype == TRUE) { print_mimetypes (); return 0; } if (filenames != NULL && g_strv_length (filenames) != 1) { char *help; help = g_option_context_get_help (context, FALSE, NULL); g_print ("%s", help); g_free (help); return 1; } path = filenames ? filenames[0] : "fd://0"; widget = bacon_video_widget_new (-1, -1, BVW_USE_TYPE_AUDIO, &error); if (widget == NULL) { g_print ("error creating the video widget: %s\n", error->message); g_error_free (error); return 1; } bvw = BACON_VIDEO_WIDGET (widget); idol_resources_monitor_start (NULL, -1); if (bacon_video_widget_open (bvw, path, NULL, &error) == FALSE) { g_print ("Can't open %s: %s\n", path, error->message); return 1; } if (bacon_video_widget_play (bvw, &error) == FALSE) { g_print ("Can't play %s: %s\n", path, error->message); return 1; } gtk_main (); return 0; }
static void update_properties_from_bvw (BaconVideoWidgetProperties *props, GtkWidget *widget) { GValue value = { 0, }; gboolean has_video, has_audio; BaconVideoWidget *bvw; g_return_if_fail (BACON_IS_VIDEO_WIDGET_PROPERTIES (props)); g_return_if_fail (BACON_IS_VIDEO_WIDGET (widget)); bvw = BACON_VIDEO_WIDGET (widget); /* General */ UPDATE_FROM_STRING (BVW_INFO_TITLE, "title"); UPDATE_FROM_STRING (BVW_INFO_ARTIST, "artist"); UPDATE_FROM_STRING (BVW_INFO_ALBUM, "album"); UPDATE_FROM_STRING (BVW_INFO_YEAR, "year"); UPDATE_FROM_STRING (BVW_INFO_COMMENT, "comment"); UPDATE_FROM_STRING (BVW_INFO_CONTAINER, "container"); bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw), BVW_INFO_DURATION, &value); bacon_video_widget_properties_set_duration (props, g_value_get_int (&value) * 1000); g_value_unset (&value); /* Types */ bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw), BVW_INFO_HAS_VIDEO, &value); has_video = g_value_get_boolean (&value); g_value_unset (&value); bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw), BVW_INFO_HAS_AUDIO, &value); has_audio = g_value_get_boolean (&value); g_value_unset (&value); bacon_video_widget_properties_set_has_type (props, has_video, has_audio); /* Video */ if (has_video != FALSE) { UPDATE_FROM_INT2 (BVW_INFO_DIMENSION_X, BVW_INFO_DIMENSION_Y, "dimensions", N_("%d x %d")); UPDATE_FROM_STRING (BVW_INFO_VIDEO_CODEC, "vcodec"); UPDATE_FROM_INT (BVW_INFO_VIDEO_BITRATE, "video_bitrate", N_("%d kbps"), C_("Stream bit rate", "N/A")); bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw), BVW_INFO_FPS, &value); bacon_video_widget_properties_set_framerate (props, g_value_get_int (&value)); g_value_unset (&value); } /* Audio */ if (has_audio != FALSE) { UPDATE_FROM_INT (BVW_INFO_AUDIO_BITRATE, "audio_bitrate", N_("%d kbps"), C_("Stream bit rate", "N/A")); UPDATE_FROM_STRING (BVW_INFO_AUDIO_CODEC, "acodec"); UPDATE_FROM_INT (BVW_INFO_AUDIO_SAMPLE_RATE, "samplerate", N_("%d Hz"), C_("Sample rate", "N/A")); UPDATE_FROM_STRING (BVW_INFO_AUDIO_CHANNELS, "channels"); } #undef UPDATE_FROM_STRING #undef UPDATE_FROM_INT #undef UPDATE_FROM_INT2 }
int main (int argc, char *argv[]) { GOptionGroup *options; GOptionContext *context; GError *err = NULL; BaconVideoWidget *bvw; GdkPixbuf *pixbuf; const char *input, *output; callback_data data; g_thread_init (NULL); context = g_option_context_new ("Thumbnail movies"); options = bacon_video_widget_get_option_group (); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_add_group (context, options); #ifndef THUMB_DEBUG g_type_init (); #else g_option_context_add_group (context, gtk_get_option_group (TRUE)); #endif if (g_option_context_parse (context, &argc, &argv, &err) == FALSE) { g_print ("couldn't parse command-line options: %s\n", err->message); g_error_free (err); return 1; } #ifdef G_OS_UNIX if (time_limit != FALSE) { errno = 0; if (nice (20) != 20 && errno != 0) g_warning ("Couldn't change nice value of process."); } #endif if (print_progress) { fcntl (fileno (stdout), F_SETFL, O_NONBLOCK); setbuf (stdout, NULL); } if (g_fatal_warnings) { GLogLevelFlags fatal_mask; fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; g_log_set_always_fatal (fatal_mask); } if (raw_output == FALSE && output_size == -1) output_size = DEFAULT_OUTPUT_SIZE; if (filenames == NULL || g_strv_length (filenames) != 2 || (second_index != -1 && gallery != -1) || (print_progress == TRUE && verbose == TRUE)) { char *help; help = g_option_context_get_help (context, FALSE, NULL); g_print ("%s", help); g_free (help); return 1; } input = filenames[0]; output = filenames[1]; PROGRESS_DEBUG("Initialised libraries, about to create video widget"); PRINT_PROGRESS (2.0); bvw = BACON_VIDEO_WIDGET (bacon_video_widget_new (-1, -1, BVW_USE_TYPE_CAPTURE, &err)); if (err != NULL) { g_print ("totem-video-thumbnailer couldn't create the video " "widget.\nReason: %s.\n", err->message); g_error_free (err); exit (1); } data.input = input; data.output = output; g_signal_connect (G_OBJECT (bvw), "got-metadata", G_CALLBACK (on_got_metadata_event), &data); PROGRESS_DEBUG("Video widget created"); PRINT_PROGRESS (6.0); if (time_limit != FALSE) totem_resources_monitor_start (input, 0); PROGRESS_DEBUG("About to open video file"); if (bacon_video_widget_open (bvw, input, NULL, &err) == FALSE) { g_print ("totem-video-thumbnailer couldn't open file '%s'\n" "Reason: %s.\n", input, err->message); g_error_free (err); exit (1); } PROGRESS_DEBUG("Opened video file: '%s'", input); PRINT_PROGRESS (10.0); if (gallery == -1) { /* If the user has told us to use a frame at a specific second * into the video, just use that frame no matter how boring it * is */ if (second_index != -1) pixbuf = capture_frame_at_time (bvw, input, output, second_index); else pixbuf = capture_interesting_frame (bvw, input, output); PRINT_PROGRESS (90.0); } else { /* We're producing a gallery of screenshots from throughout the file */ pixbuf = create_gallery (bvw, input, output); } /* Cleanup */ bacon_video_widget_close (bvw); totem_resources_monitor_stop (); gtk_widget_destroy (GTK_WIDGET (bvw)); PRINT_PROGRESS (92.0); if (pixbuf == NULL) { g_print ("totem-video-thumbnailer couldn't get a picture from " "'%s'\n", input); exit (1); } PROGRESS_DEBUG("Saving captured screenshot"); save_pixbuf (pixbuf, output, input, output_size, FALSE); g_object_unref (pixbuf); PRINT_PROGRESS (100.0); return 0; }