e1ed9c9881e5bb05f5126f3dece4742b92f3e17d
[platform/upstream/gstreamer.git] / test / mpeg2parse2.c
1
2 #include <gnome.h>
3 #include <gst/gst.h>
4
5 GstElement *parse2, *queue;
6 GtkWidget *appwindow;
7
8 void eof(GstElement *src) {
9   g_print("have eos, quitting\n");
10   exit(0);
11 }
12
13 gboolean idle_func(gpointer data) {
14   gst_bin_iterate(GST_BIN(data));
15   return TRUE;
16 }
17
18 void mpeg2parse_newpad(GstElement *parser,GstPad *pad, GstElement *pipeline) {
19
20   g_print("***** a new pad %s was created\n", gst_pad_get_name(pad));
21   gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_PAUSED);
22
23   if (strncmp(gst_pad_get_name(pad), "video_", 6) == 0) {
24
25     gst_pad_connect(pad, gst_element_get_pad(queue,"sink"));
26   }
27   gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_PLAYING);
28 }
29
30 int main(int argc,char *argv[]) {
31   GstPipeline *pipeline;
32   GstElement *src, *parse;
33   GstElement *decode, *show, *thread;
34
35   g_print("have %d args\n",argc);
36
37   g_thread_init(NULL);
38   gtk_init(&argc,&argv);
39   gst_init(&argc,&argv);
40   gnome_init("MPEG2 Video player","0.0.1",argc,argv);
41   //gst_plugin_load("mpeg1parse");
42
43   pipeline = GST_PIPELINE(gst_pipeline_new("pipeline"));
44   g_return_val_if_fail(pipeline != NULL, -1);
45   thread = GST_ELEMENT(gst_thread_new("thread"));
46   g_return_val_if_fail(thread != NULL, -1);
47
48   if (strstr(argv[1],"video_ts")) {
49     src = gst_elementfactory_make("dvdsrc","src");
50     g_print("using DVD source\n");
51   } else
52     src = gst_elementfactory_make("disksrc","src");
53
54   g_return_val_if_fail(src != NULL, -1);
55   gtk_object_set(GTK_OBJECT(src),"location",argv[1],NULL);
56   if (argc >= 3) {
57     gtk_object_set(GTK_OBJECT(src),"bytesperread",atoi(argv[2]),NULL);
58     g_print("block size is %d\n",atoi(argv[2]));
59   }
60   g_print("should be using file '%s'\n",argv[1]);
61
62   parse = gst_elementfactory_make("mpeg2parse","parse");
63   //parse = gst_elementfactory_make("mpeg1parse","parse");
64   g_return_val_if_fail(parse != NULL, -1);
65
66   queue = gst_elementfactory_make("queue","queue");
67   g_return_if_fail(queue != NULL);
68   
69   /****
70    *  you can substitute mpeg2play with you own player here
71    *  optionally you can remove the pares2 element. make
72    *  sure to remove the pad connections too and don't add the
73    *  mp2videoparse element to the bin.
74    **/
75   //parse2 = gst_elementfactory_make("mp2videoparse","parse");
76   //g_return_if_fail(parse2 != NULL);
77   decode = gst_elementfactory_make("mpeg2dec","decode_video");
78   g_return_if_fail(decode != NULL);
79
80   show = gst_elementfactory_make("videosink","show");
81   //gtk_object_set(GTK_OBJECT(show),"xv_enabled",FALSE,NULL);
82   g_return_if_fail(show != NULL);
83
84   appwindow = gnome_app_new("MPEG player","MPEG player");
85   gnome_app_set_contents(GNOME_APP(appwindow),
86                 gst_util_get_widget_arg(GTK_OBJECT(show),"widget"));
87   gtk_widget_show_all(appwindow);
88
89   gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(src));
90   gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(parse));
91   gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(queue));
92
93   //gst_bin_add(GST_BIN(thread),GST_ELEMENT(parse2));
94   gst_bin_add(GST_BIN(thread),GST_ELEMENT(decode));
95   gst_bin_add(GST_BIN(thread),GST_ELEMENT(show));
96
97   gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(thread));
98
99   gtk_signal_connect(GTK_OBJECT(parse),"new_pad",mpeg2parse_newpad, pipeline);
100
101   gtk_signal_connect(GTK_OBJECT(src),"eos",GTK_SIGNAL_FUNC(eof),NULL);
102
103   gst_pad_connect(gst_element_get_pad(src,"src"),
104                   gst_element_get_pad(parse,"sink"));
105
106   gst_pad_connect(gst_element_get_pad(queue,"src"),
107   //                gst_element_get_pad(parse2,"sink"));
108   //gst_pad_connect(gst_element_get_pad(parse2,"src"),
109                   gst_element_get_pad(decode,"sink"));
110   gst_pad_connect(gst_element_get_pad(decode,"src"),
111                   gst_element_get_pad(show,"sink"));
112
113   g_print("setting to PLAYING state\n");
114   gst_element_set_state(GST_ELEMENT(pipeline),GST_STATE_PLAYING);
115
116   gtk_idle_add(idle_func,pipeline);
117
118   gdk_threads_enter();
119   gtk_main();
120   gdk_threads_leave();
121
122   return 0;
123 }