Convert pipeline to C code to play .mov video

Raheeb raheeb.muzaffar at yahoo.com
Tue Mar 10 08:00:47 PDT 2015


Hi I am trying to convert the following pipeline to C code. There is no
error but I am unable to play the video through my code. The below pipeline
plays the video but the my code does not. Can someone correct me with the
code. Here is my pipeline

gst-launch-1.0 filesrc location=/path/a.mov ! qtdemux ! avdec_h264 ! xvimagesink

Here is my code

static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) {

GMainLoop *loop = (GMainLoop *) data;

switch (GST_MESSAGE_TYPE (msg)) {

case GST_MESSAGE_EOS:

g_print ("End of stream\n");

g_main_loop_quit (loop);

break;

case GST_MESSAGE_ERROR: {

gchar *debug;

GError *error;

gst_message_parse_error (msg, &error, &debug);

g_free (debug);

g_printerr ("Error: %s\n", error->message);

g_error_free (error);

g_main_loop_quit (loop);

break;

}

default: break; }

return TRUE; }

int main (int argc, char *argv[])

{

GMainLoop *loop;

GstElement *pipeline, *source, *demuxer, *decoder, *xvsink;

GstBus *bus;

guint bus_watch_id;

gst_init (&argc, &argv);

loop = g_main_loop_new (NULL, FALSE);

/* Check input arguments */

if (argc != 2) {

g_printerr ("Usage: %s \n", argv[0]);

return -1;

}

/* Create gstreamer elements */ pipeline = gst_pipeline_new ("video-send");

source = gst_element_factory_make ("filesrc", "file-source");

g_assert (source);

demuxer = gst_element_factory_make ("qtdemux", "demuxer");

g_assert (demuxer);

decoder = gst_element_factory_make ("avdec_h264", "decoder");

g_assert (decoder);

xvsink = gst_element_factory_make ("xvimagesink", "video-output");

g_assert (xvsink);

g_object_set (G_OBJECT (source), "location", argv[1], NULL);

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));

bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);

gst_object_unref (bus);

gst_bin_add_many (GST_BIN (pipeline), source, demuxer, decoder, xvsink, NULL);

if(!gst_element_link (source, demuxer))

{

g_printerr ("Here is the problem 1.\n");

}

if(!gst_element_link_many (decoder, xvsink, NULL))

{

g_printerr ("Here is the problem too.\n");

}

g_print ("Now playing: %s\n", argv[1]);

gst_element_set_state (pipeline, GST_STATE_PLAYING);

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

g_main_loop_run (loop);

/* Out of the main loop*/

g_print ("Returned, stopping playback\n");

gst_element_set_state (pipeline, GST_STATE_NULL);

g_print ("Deleting pipeline\n");

gst_object_unref (GST_OBJECT (pipeline));

g_source_remove (bus_watch_id);

g_main_loop_unref (loop);

return 0;

}




More information about the gstreamer-devel mailing list