All pastes #826857 Raw Edit

Untitled

public text v1 · immutable
#826857 ·published 2007-12-21 13:49 UTC
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;
}