X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Fgst-typefind.c;h=490aca85e5657692a8fd176418a534b335b295b2;hb=dac5966da6a0f53d0443dfa1ac239289028c415d;hp=fc0551ac4761109d3dd074ecf2baaf32cacce185;hpb=3235f1d4c09e9298b843f87dfa2849bd1ea00db8;p=platform%2Fupstream%2Fgstreamer.git diff --git a/tools/gst-typefind.c b/tools/gst-typefind.c index fc0551a..490aca8 100644 --- a/tools/gst-typefind.c +++ b/tools/gst-typefind.c @@ -1,77 +1,187 @@ +/* GStreamer + * Copyright (C) 2003 Thomas Vander Stichele + * 2003 Benjamin Otte + * 2005 Andy Wingo + * + * gst-typefind.c: Use GStreamer to find the type of a file + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + #ifdef HAVE_CONFIG_H # include "config.h" #endif #include -#include #include -#include - -/* - * find the type of a media file and display it's properties - **/ -gboolean FOUND = FALSE; -gchar *filename = NULL; - -void -gst_caps_print (const char *filename, GstCaps *caps) -{ - gchar *caps_str = gst_caps_to_string (caps); - g_print ("%s - %s\n", filename, caps_str); - g_free (caps_str); -} +#include "tools.h" -void -have_type_handler (GstElement *typefind, guint probability, GstCaps *caps, gpointer unused) +static void +have_type_handler (GstElement * typefind, guint probability, + const GstCaps * caps, GstCaps ** p_caps) { - gst_caps_print (filename, caps); - FOUND = TRUE; + if (p_caps) { + *p_caps = gst_caps_copy (caps); + } } -int -main (int argc, char *argv[]) +static void +typefind_file (const gchar * filename) { - guint i = 1; + GstStateChangeReturn sret; GstElement *pipeline; - GstElement *source, *typefind; + GstElement *source; + GstElement *typefind; + GstElement *fakesink; + GstState state; + GstCaps *caps = NULL; + GDir *dir; - setlocale (LC_ALL, ""); + if ((dir = g_dir_open (filename, 0, NULL))) { + const gchar *entry; - gst_init (&argc, &argv); + while ((entry = g_dir_read_name (dir))) { + gchar *path; - if (argc < 2) { - g_print ("Please give a filename to typefind\n\n"); - return 1; + path = g_strconcat (filename, G_DIR_SEPARATOR_S, entry, NULL); + typefind_file (path); + g_free (path); + } + + g_dir_close (dir); + return; } - - pipeline = gst_pipeline_new (NULL); + + pipeline = gst_pipeline_new ("pipeline"); + source = gst_element_factory_make ("filesrc", "source"); g_assert (GST_IS_ELEMENT (source)); typefind = gst_element_factory_make ("typefind", "typefind"); g_assert (GST_IS_ELEMENT (typefind)); - gst_bin_add_many (GST_BIN (pipeline), source, typefind, NULL); - gst_element_link (source, typefind); - g_signal_connect (G_OBJECT (typefind), "have-type", - G_CALLBACK (have_type_handler), NULL); - - while (i < argc) { - FOUND = FALSE; - gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); - filename = argv[i]; - g_object_set (source, "location", filename, NULL); - /* set to play */ - gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); - - while (!FOUND) { - if (!gst_bin_iterate (GST_BIN (pipeline))) - break; + fakesink = gst_element_factory_make ("fakesink", "fakesink"); + g_assert (GST_IS_ELEMENT (typefind)); + + gst_bin_add_many (GST_BIN (pipeline), source, typefind, fakesink, NULL); + gst_element_link_many (source, typefind, fakesink, NULL); + + g_signal_connect (G_OBJECT (typefind), "have-type", + G_CALLBACK (have_type_handler), &caps); + + g_object_set (source, "location", filename, NULL); + + GST_DEBUG ("Starting typefinding for %s", filename); + + /* typefind will only commit to PAUSED if it actually finds a type; + * otherwise the state change fails */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); + + /* wait until state change either completes or fails */ + sret = gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL, -1); + + switch (sret) { + case GST_STATE_CHANGE_FAILURE:{ + GstMessage *msg; + GstBus *bus; + GError *err = NULL; + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); + gst_object_unref (bus); + + if (msg) { + gst_message_parse_error (msg, &err, NULL); + g_printerr ("%s - FAILED: %s\n", filename, err->message); + g_clear_error (&err); + gst_message_unref (msg); + } else { + g_printerr ("%s - FAILED: unknown error\n", filename); + } + break; } - if (!FOUND) { - g_print ("%s - No type found\n", argv[i]); + case GST_STATE_CHANGE_SUCCESS:{ + if (caps) { + gchar *caps_str; + + caps_str = gst_caps_to_string (caps); + g_print ("%s - %s\n", filename, caps_str); + g_free (caps_str); + gst_caps_unref (caps); + } else { + g_print ("%s - %s\n", filename, "No type found"); + } + break; } - i++; + default: + g_assert_not_reached (); + } + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); +} + +int +main (int argc, char *argv[]) +{ + gchar **filenames = NULL; + guint num, i; + GError *err = NULL; + GOptionContext *ctx; + GOptionEntry options[] = { + GST_TOOLS_GOPTION_VERSION, + {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}, + {NULL} + }; + + setlocale (LC_ALL, ""); + +#ifdef ENABLE_NLS + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); +#endif + + g_set_prgname ("gst-typefind-" GST_API_VERSION); + + ctx = g_option_context_new ("FILES"); + g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", GST_STR_NULL (err->message)); + g_clear_error (&err); + g_option_context_free (ctx); + exit (1); + } + g_option_context_free (ctx); + + gst_tools_print_version (); + + if (filenames == NULL || *filenames == NULL) { + g_print ("Please give one or more filenames to %s\n\n", g_get_prgname ()); + return 1; + } + + num = g_strv_length (filenames); + + for (i = 0; i < num; ++i) { + typefind_file (filenames[i]); } - g_object_unref (pipeline); + + g_strfreev (filenames); + return 0; }