rendered paste body#include <gst/gst.h>
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;
}