I'm too lazy to comment this
[platform/upstream/gstreamer.git] / examples / retag / transcode.c
1 /* 
2  * This example shows how to use interfaces and the tag subsystem.
3  * It takes an mp3 file as input, and makes an ogg file out of it. While doing
4  * this, it parses the filename and sets artist and title in the ogg file.
5  * It assumes the filename to be "<artist> - <title>.mp3"
6  * 
7  * Run the program as "transcode <mp3 file>"
8  *
9  * To run this program, you need to have the gst-plugins package (specifically
10  * the vorbis and mad plugins) installed.
11  */
12
13 /* main header */
14 #include <gst/gst.h>
15 /* and a header we need for the string manipulation */
16 #include <string.h>
17
18 int
19 main (int argc, char *argv[]) 
20 {
21   GstElement *bin, *filesrc, *decoder, *encoder, *filesink;
22   gchar *artist, *title, *ext, *filename;
23   
24   /* initialize GStreamer */
25   gst_init (&argc, &argv);
26
27   /* check that the argument is there */
28   if (argc != 2) {
29     g_print ("usage: %s <mp3 file>\n", argv[0]);
30     return 1;
31   }
32
33   /* parse the mp3 name */
34   artist = strrchr (argv[1], '/');
35   if (artist == NULL)
36     artist = argv[1];
37   artist = g_strdup (artist);
38   ext = strrchr (artist, '.');
39   if (ext) *ext = '\0';
40   title = strstr (artist, " - ");
41   if (title == NULL) {
42     g_print ("The format of the mp3 file is invalid.\n");
43     g_print ("It needs to be in the form of artist - title.mp3.\n");
44     return 1;
45   }
46   *title = '\0';
47   title += 3;
48   
49   
50   /* create a new bin to hold the elements */
51   bin = gst_pipeline_new ("pipeline");
52   g_assert (bin);
53
54   /* create a file reader */
55   filesrc = gst_element_factory_make ("filesrc", "disk_source");
56   g_assert (filesrc);
57
58   /* now it's time to get the decoder */
59   decoder = gst_element_factory_make ("mad", "decode");
60   if (!decoder) {
61     g_print ("could not find plugin \"mad\"");
62     return 1;
63   }
64
65   /* create the encoder */
66   encoder = gst_element_factory_make ("vorbisenc", "encoder");
67   if (!encoder) {
68     g_print ("cound not find plugin \"vorbisenc\"");
69     return 1;
70   }
71   
72   /* and a file writer */
73   filesink = gst_element_factory_make ("filesink", "filesink");
74   g_assert (filesink);
75
76   /* set the filenames */
77   filename = g_strdup_printf ("%s.ogg", argv[1]); /* easy solution */
78   g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
79   g_object_set (G_OBJECT (filesink), "location", filename, NULL);
80   g_free (filename);
81
82   /* make sure the tag setter uses our stuff 
83      (though that should already be default) */
84   gst_tag_setter_set_merge_mode (GST_TAG_SETTER (encoder), GST_TAG_MERGE_KEEP);
85   /* set the tagging information */
86   gst_tag_setter_add (GST_TAG_SETTER (encoder), GST_TAG_MERGE_REPLACE,
87                       GST_TAG_ARTIST, artist, 
88                       GST_TAG_TITLE, title, 
89                       NULL);
90
91   /* add objects to the main pipeline */
92   gst_bin_add_many (GST_BIN (bin), filesrc, decoder, encoder, filesink, NULL);
93
94   /* link the elements */
95   gst_element_link_many (filesrc, decoder, encoder, filesink, NULL);
96   
97   /* start playing */
98   gst_element_set_state (bin, GST_STATE_PLAYING);
99
100   while (gst_bin_iterate (GST_BIN (bin)));
101
102   /* stop the bin */
103   gst_element_set_state (bin, GST_STATE_NULL);
104
105   return 0;
106 }
107