Gstreamer 增加probe 功能

来源:互联网 发布:csol控制台优化流畅 编辑:程序博客网 时间:2024/05/22 15:04

#include <gst/gst.h>

 

static gboolean

cb_have_data (GstPad    *pad,

      GstBuffer *buffer,

      gpointer   u_data)

{

  gint x, y;

  guint16 *data = (guint16 *) GST_BUFFER_DATA (buffer), t;

 

  /* invert data */

  for (y = 0; y < 288; y++) {

    for (x = 0; x < 384 / 2; x++) {

      t = data[384 - 1 - x];

      data[384 - 1 - x] = data[x];

      data[x] = t;

    }

    data += 384;

  }

 

  return TRUE;

}

 

gint

main (gint   argc,

      gchar *argv[])

{

  GMainLoop *loop;

  GstElement *pipeline, *src, *sink, *filter, *csp;

  GstCaps *filtercaps;

  GstPad *pad;

 

  /* init GStreamer */

  gst_init (&argc, &argv);

  loop = g_main_loop_new (NULL, FALSE);

 

  /* build */

  pipeline = gst_pipeline_new ("my-pipeline");

  src = gst_element_factory_make ("videotestsrc", "src");

  if (src == NULL)

    g_error ("Could not create 'videotestsrc' element");

 

  filter = gst_element_factory_make ("capsfilter", "filter");

  g_assert (filter != NULL); /* should always exist */

 

  csp = gst_element_factory_make ("ffmpegcolorspace", "csp");

  if (csp == NULL)

    g_error ("Could not create 'ffmpegcolorspace' element");

 

  sink = gst_element_factory_make ("xvimagesink", "sink");

  if (sink == NULL) {

    sink = gst_element_factory_make ("ximagesink", "sink");

    if (sink == NULL)

      g_error ("Could not create neither 'xvimagesink' nor 'ximagesink' element");

  }

 

  gst_bin_add_many (GST_BIN (pipeline), src, filter, csp, sink, NULL);

  gst_element_link_many (src, filter, csp, sink, NULL);

  filtercaps = gst_caps_new_simple ("video/x-raw-rgb",

   "width", G_TYPE_INT, 384,

   "height", G_TYPE_INT, 288,

   "framerate", GST_TYPE_FRACTION, 25, 1,

   "bpp", G_TYPE_INT, 16,

   "depth", G_TYPE_INT, 16,

   "endianness", G_TYPE_INT, G_BYTE_ORDER,

   NULL);

  g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);

  gst_caps_unref (filtercaps);

 

  pad = gst_element_get_pad (src, "src");

  gst_pad_add_buffer_probe (pad, G_CALLBACK (cb_have_data), NULL);

  gst_object_unref (pad);

 

  /* run */

  gst_element_set_state (pipeline, GST_STATE_PLAYING);

 

  /* wait until it's up and running or failed */

  if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) {

    g_error ("Failed to Go into PLAYING state");

  }

 

  g_print ("Running ...\n");

  g_main_loop_run (loop);

 

  /* exit */

  gst_element_set_state (pipeline, GST_STATE_NULL);

  gst_object_unref (pipeline);

 

  return 0;

}