static GdkPixbuf * capture_interesting_frame (BaconVideoWidget *bvw, const char *input, const char *output) { GdkPixbuf* pixbuf; guint current; GError *err = NULL; const double frame_locations[] = { 1.0 / 3.0, 2.0 / 3.0, 0.1, 0.9, 0.5 }; /* Test at multiple points in the file to see if we can get an * interesting frame */ for (current = 0; current < G_N_ELEMENTS(frame_locations); current++) { PROGRESS_DEBUG("About to seek to %f", frame_locations[current]); if (bacon_video_widget_seek (bvw, frame_locations[current], NULL) == FALSE) { PROGRESS_DEBUG("Couldn't seek to %f", frame_locations[current]); bacon_video_widget_play (bvw, NULL); } if (bacon_video_widget_can_get_frames (bvw, &err) == FALSE) { g_print ("totem-video-thumbnailer: '%s' isn't thumbnailable\n" "Reason: %s\n", input, err ? err->message : "programming error"); bacon_video_widget_close (bvw); gtk_widget_destroy (GTK_WIDGET (bvw)); g_error_free (err); exit (1); } /* Pull the frame, if it's interesting we bail early */ PROGRESS_DEBUG("About to get frame for iter %d", current); pixbuf = bacon_video_widget_get_current_frame (bvw); if (pixbuf != NULL && is_image_interesting (pixbuf) != FALSE) { PROGRESS_DEBUG("Frame for iter %d is interesting", current); break; } /* If we get to the end of this loop, we'll end up using * the last image we pulled */ if (current + 1 < G_N_ELEMENTS(frame_locations)) { if (pixbuf != NULL) { g_object_unref (pixbuf); pixbuf = NULL; } } PROGRESS_DEBUG("Frame for iter %d was not interesting", current); } return pixbuf; }
static void on_plugin_installation_done (GstInstallPluginsReturn res, gpointer user_data) { TotemCodecInstallContext *ctx = (TotemCodecInstallContext *) user_data; gchar **p; GST_INFO ("res = %d (%s)", res, gst_install_plugins_return_get_name (res)); switch (res) { /* treat partial success the same as success; in the worst case we'll * just do another round and get NOT_FOUND as result that time */ case GST_INSTALL_PLUGINS_PARTIAL_SUCCESS: case GST_INSTALL_PLUGINS_SUCCESS: { /* blacklist installed plugins too, so that we don't get * into endless installer loops in case of inconsistencies */ for (p = ctx->details; p != NULL && *p != NULL; ++p) bacon_video_widget_gst_codec_install_blacklist_plugin (*p); bacon_video_widget_stop (ctx->bvw); g_message ("Missing plugins installed. Updating plugin registry ..."); /* force GStreamer to re-read its plugin registry */ if (gst_update_registry ()) { g_message ("Plugin registry updated, trying again."); bacon_video_widget_play (ctx->bvw, NULL); } else { g_warning ("GStreamer registry update failed"); /* FIXME: should we show an error message here? */ } } break; case GST_INSTALL_PLUGINS_NOT_FOUND: { g_message ("No installation candidate for missing plugins found."); /* NOT_FOUND should only be returned if not a single one of the * requested plugins was found; if we managed to play something * anyway, we should just continue playing what we have and * blacklist the requested plugins for this session; if we * could not play anything we should blacklist them as well, * so the install wizard isn't called again for nothing */ for (p = ctx->details; p != NULL && *p != NULL; ++p) bacon_video_widget_gst_codec_install_blacklist_plugin (*p); if (ctx->playing) { bacon_video_widget_play (ctx->bvw, NULL); } else { /* wizard has not shown error, do stop/play again, * so that an error message gets shown */ bacon_video_widget_stop (ctx->bvw); bacon_video_widget_play (ctx->bvw, NULL); } } break; case GST_INSTALL_PLUGINS_USER_ABORT: { /* blacklist on user abort, so we show an error next time (or * just play what we can) instead of calling the installer */ for (p = ctx->details; p != NULL && *p != NULL; ++p) bacon_video_widget_gst_codec_install_blacklist_plugin (*p); if (ctx->playing) { bacon_video_widget_play (ctx->bvw, NULL); } else { /* if we couldn't play anything, do stop/play again, * so that an error message gets shown */ bacon_video_widget_stop (ctx->bvw); bacon_video_widget_play (ctx->bvw, NULL); } } break; case GST_INSTALL_PLUGINS_INVALID: case GST_INSTALL_PLUGINS_ERROR: case GST_INSTALL_PLUGINS_CRASHED: default: { g_message ("Missing plugin installation failed: %s", gst_install_plugins_return_get_name (res)); if (ctx->playing) bacon_video_widget_play (ctx->bvw, NULL); else bacon_video_widget_stop (ctx->bvw); break; } case GST_INSTALL_PLUGINS_STARTED_OK: case GST_INSTALL_PLUGINS_INTERNAL_FAILURE: case GST_INSTALL_PLUGINS_HELPER_MISSING: case GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS: { g_assert_not_reached (); break; } } bacon_video_widget_gst_codec_install_context_free (ctx); }
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; }