#include GstElement *pipeline, *source, *parser, *decoder, *conv, *sink, *tee, *encoder, *fsink, *scale; 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"); gst_pad_link (pad, sinkpad); gst_object_unref (sinkpad); g_print("video pad linked\n"); } } 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 (decoder, conv)) g_print("decoder->conv failed\n"); if(!gst_element_link(conv, scale)) g_print("conv->scale failed\n"); caps1 = gst_caps_new_simple("video/x-raw-rgb", "width", G_TYPE_INT, 176, "height", G_TYPE_INT, 144, NULL); if(!gst_element_link_filtered(scale, sink, caps1)) g_print("scale->sink failed\n"); g_signal_connect (parser, "pad-added", G_CALLBACK (new_pad), NULL); gst_element_set_state (pipeline, GST_STATE_PLAYING); g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (GST_OBJECT (pipeline)); return 0; }