#include GstElement *pipeline, *source, *parser, *decoder, *conv, *sink, *tee, *encoder, *fsink; static void new_pad (GstElement *element, GstPad *pad, gpointer data) { GstPad *sinkpad; gchar* name; name = gst_pad_get_name(pad); if(!strncmp(name, "video", 5)) { sinkpad = gst_element_get_pad (decoder, "sink"); if(gst_pad_link (pad, sinkpad) != GST_FLOW_OK) g_print("parser->decoder failed\n"); gst_object_unref (sinkpad); g_print("video pad linked\n"); } } GstCaps* caps1; GstElement* scale; int main (int argc, char *argv[]) { GMainLoop *loop; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); pipeline = gst_pipeline_new ("player"); source = gst_element_factory_make ("filesrc", "file-source"); parser = gst_element_factory_make ("mpegdemux", "mpegdemuxer"); decoder = gst_element_factory_make ("mpeg2dec", "decoder"); conv = gst_element_factory_make ("ffmpegcolorspace", "converter"); scale = gst_element_factory_make ("videoscale", "vscale"); sink = gst_element_factory_make ("xvimagesink", "output"); g_object_set (G_OBJECT (source), "location", argv[1], NULL); gst_bin_add_many (GST_BIN (pipeline), source, parser, decoder, conv, scale, sink, NULL); if(!gst_element_link (source, parser)) g_print("source->parser failed\n"); if(!gst_element_link_many(decoder, conv, scale, sink, NULL)) g_print("linkesh failed\n"); g_signal_connect (parser, "pad-added", G_CALLBACK (new_pad), NULL); gst_element_set_state (pipeline, GST_STATE_PLAYING); sleep(10); gst_element_set_state(pipeline, GST_STATE_PAUSED); gst_element_unlink(scale, sink); sleep(5); caps1 = gst_caps_new_simple("video/x-raw-yuv", "width", G_TYPE_INT, 176, "height", G_TYPE_INT, 144, NULL); if(!gst_element_link_filtered(scale, sink, caps1)) g_print("failed linking scale->sink"); else g_print("linked scale->sink\n"); gst_element_set_state(pipeline, GST_STATE_PLAYING); sleep(100); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (GST_OBJECT (pipeline)); return 0; }