[gst-devel] Dynamic and requested pads with transcoding
Angelo Difino
angelo.difino at gmail.com
Tue Sep 11 19:47:52 CEST 2007
Hi all,
I'm troubling with transcoding an audiovideo content. I really have
some problems with dynamic pada (created by mux) when used with
requested pada (created by demux)...
I've tried to create a complete chain with avi mux and avi demux.
The content simply holds raw audio and video.
IMP: if no demux is used (if audiotestsrc and videotestsrc are used),
no problems are reached!
If anybody know where i can find an example that show how to use
dynamic and requested pad together, i'll be really greatful :)
Best regards,
Angelo
#include <gst/gst.h>
GstElement *pipeline;
GstElement *mux;
static void
cb_new_pad (GstElement *element,
GstPad *pad,
gpointer data)
{
gchar *name;
gboolean rit;
GstPad *pad_to_request;
name = gst_pad_get_name (pad);
g_print ("A new pad %s was created\n", name);
//set pause before link new pads
gst_element_set_state (pipeline, GST_STATE_PAUSED);
//DIRTY: request pad from mux that has "same name" of the demux
pad_to_request = gst_element_get_request_pad (mux, name);
name = gst_pad_get_name (pad_to_request);
g_print ("A new pad %s was requested\n", name);
rit = gst_pad_link (pad, pad_to_request);
g_print ("Rit %d \n", rit);
//set play after link new pads
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_free (name);
}
static void
event_loop (GstElement * pipe)
{
GstBus *bus;
GstMessage *message = NULL;
bus = gst_element_get_bus (GST_ELEMENT (pipe));
while (TRUE) {
message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
g_assert (message != NULL);
switch (message->type) {
case GST_MESSAGE_EOS:
gst_message_unref (message);
return;
case GST_MESSAGE_WARNING:
case GST_MESSAGE_ERROR:{
GError *gerror;
gchar *debug;
gst_message_parse_error (message, &gerror, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
gst_message_unref (message);
g_error_free (gerror);
g_free (debug);
return;
}
default:
gst_message_unref (message);
break;
}
}
}
gint main (gint argc, gchar * argv[])
{
GstElement *filesrc, *demux;
GstElement *filesink;
gboolean rit;
gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("pipeline");
//setting src file: AVI file
filesrc= gst_element_factory_make ("filesrc", "filesrc");
g_object_set (G_OBJECT (filesrc), "location", "orig.avi", NULL);
//setting mux/demux
demux= gst_element_factory_make ("avidemux", "avidemux");
mux = gst_element_factory_make ("avimux", "avimux");
//setting dest file: AVI file
filesink= gst_element_factory_make ("filesink", "filesink");
g_object_set (G_OBJECT (filesink), "location", "test.avi", NULL);
//add to pipeline
gst_bin_add_many (GST_BIN (pipeline), filesrc, demux, mux, filesink, NULL);
rit=gst_element_link_pads (filesrc, "src", demux, "sink");
g_print ("Rit %d \n", rit);
rit=gst_element_link_pads (mux, "src", filesink, "sink");
g_print ("Rit %d \n", rit);
g_signal_connect (demux, "pad-added", G_CALLBACK (cb_new_pad), NULL);
/* start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
/* Run event loop listening for bus messages until EOS or ERROR */
event_loop (pipeline);
/* stop the bin */
gst_element_set_state (pipeline, GST_STATE_NULL);
return (0);
}
More information about the gstreamer-devel
mailing list