Dynamic-Pipeline ( Vidoetestsrc element works but Filesink element fails )
Ashish Kumar Mishra
ashish.kmishra at dexceldesigns.com
Wed Nov 25 02:04:43 PST 2015
Hi All ,
*Test_Pipeline :- Videtestsrc -> Q1 -> AVIMUX -> Q2 -> FILESINK. *
1) When i change the properties of VIDEOTEST src element in dynamic pipeline
[ dynamic_filesink = 0] i am able to get proper file
i.e i can verify that the test pattern of created file changes .
2) /When i change the properties of FILESINK ( i.e location ) element in
dynamic pipeline
[ dynamic_filesink = 1 ] i am able to get NEW_FILES with some data on
it.
But only the first file is in playable state other files fails to play
and gives
message/* "......COULD NOT DETERMINE TYPE OF STREAM ....... " *
*Could group members please provide inputs as to what is causing this
problem . *
#include <gst/gst.h>
GstElement *pipeline,
*src,
*q1,
*q2,
*filesink,
*mux;
GMainLoop *loop,
*mainloop;
GstPad *temppad,
*muxsrcpad;
GstBus *bus;
GError *err = NULL;
gchar *sinkname;
char buffer[128];
unsigned int attempt=0;
unsigned int timer_count=0;
*unsigned int dynamic_filesink= 0; // 0 for videotestsrc , 1 for filesink*
static GstPadProbeReturn pad_probe_cb (GstPad * pad, GstPadProbeInfo * info,
gpointer user_data)
{
g_print("\t [ APP-BLOCK ]: PAD_BROBE [ START ] ===================\n");
// Remove the probe first
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
if ( dynamic_filesink == 0 ) {
// Changing the TEST-SRC PATTERN
timer_count = timer_count +1;
g_object_set (G_OBJECT(src), "pattern",timer_count, NULL);
}else {
// Changing the FILESINK
gst_element_set_state (filesink, GST_STATE_NULL);
attempt = attempt+1;
sprintf( buffer, "test_%d.avi" , attempt);
g_object_set(G_OBJECT (filesink),"location", buffer, NULL);
gst_element_set_state (filesink , GST_STATE_PLAYING);
}
g_print("\t [ APP-BLOCK ]: PAD_BROBE [ STOP ] ===================\n");
return GST_PAD_PROBE_OK;
} // End brace of pad_probe_cb
static gboolean timeout_cb (gpointer user_data)
{
g_print("\t [ APP-TIMER ]: IN-TIMER [ BEFORE-BLOCKING ] =========\n");
timer_count=timer_count+1;
gst_pad_add_probe (muxsrcpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
pad_probe_cb, user_data, NULL);
if ( timer_count == 10 ){
return FALSE;
}
return TRUE;
} // End brace of "timeout_cb"
static gboolean bus_cb (GstBus * bus, GstMessage * msg, gpointer user_data)
{
GMainLoop *loop = user_data;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_ERROR:{
GError *err = NULL;
gchar *dbg;
gst_message_parse_error (msg, &err, &dbg);
gst_object_default_error (msg->src, err, dbg);
g_error_free (err);
g_free (dbg);
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_STATE_CHANGED: {
GstState old_state, new_state;
gst_message_parse_state_changed (msg, &old_state, &new_state, NULL);
g_print ("[ APP - MESSAGE ]: Element %s changed state from %s to
%s.\n",
GST_OBJECT_NAME (msg->src),
gst_element_state_get_name (old_state),
gst_element_state_get_name (new_state));
break;
}
default:
break;
}
return TRUE;
}//End brace of SWITCH condition
int main (int argc, char **argv)
{
gst_init (&argc, &argv);
if ( dynamic_filesink == 0 ) {
g_print("\n\t [APP-DEBUG ]: ------- DYNAMIC VIDEO-PATTERN ----------
\n");
}else{
g_print("\n\t [APP-DEBUG ]: ------- DYNAMIC FILE-SINK file's -------
\n");
}
// 0 - Creating the PIPELINE
pipeline = gst_pipeline_new ("pipeline");
// 1 - Creating the SRC
src = gst_element_factory_make ("videotestsrc", NULL);
g_object_set (G_OBJECT(src), "is-live", TRUE, NULL);
g_object_set (G_OBJECT(src), "pattern",18, NULL);
// 2 - Creating the QUEUE
q1 = gst_element_factory_make ("queue", NULL);
q2 = gst_element_factory_make ("queue", NULL);
// 3 - Creating the MUX
mux = gst_element_factory_make("avimux",NULL);
// 4 - Creating the FILESINK
filesink = gst_element_factory_make ("filesink", NULL);
attempt = attempt+1;
sprintf( buffer, "test_%d.avi" , attempt);
g_print("\n\t [APP]: Created new file of %s \n",buffer);
g_object_set(G_OBJECT(filesink),"location", buffer, NULL);
// 7 - Adding all the elements in to BIN
gst_bin_add_many (GST_BIN (pipeline), src, q1,mux, q2,filesink, NULL);
// 8 - Linking all static pad
if (!gst_element_link_many (src, q1, NULL )) {
g_print ("[APP]: Failed to link STATIC_1 Pad's of elements");
return -3;
}
if (!gst_element_link_many (mux,q2,filesink, NULL)) {
g_print ("[APP]: Failed to link STATIC_2 Pad's of elements");
return -3;
}
// 9 - Linking DYNAMIC PAD
temppad = gst_element_get_request_pad (mux, "video_%u");
sinkname = gst_pad_get_name (temppad);
g_print ("\t [APP]: A new pad %s was created\n\n", sinkname);
if (!gst_element_link_many (q1, mux,NULL )) {
g_print ("[APP]: Failed to link DYNAMIC Pad's of elements");
return -3;
}
g_free (sinkname);
gst_object_unref (GST_OBJECT (temppad));
// 10 - Getting the blocking PAD
muxsrcpad = gst_element_get_static_pad (mux,"src");
// 11 - Starting the PIPELINE
if (gst_element_set_state (pipeline,GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
g_error ("[APP]: Failed to go into PLAYING state");
return -4;
}
mainloop = g_main_loop_new (NULL, FALSE);
gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_cb, mainloop);
g_timeout_add_seconds (7, timeout_cb, mainloop);
g_main_loop_run (mainloop);
// 10 - Stopping the PIPELINE
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}
--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Dynamic-Pipeline-Vidoetestsrc-element-works-but-Filesink-element-fails-tp4674638.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.
More information about the gstreamer-devel
mailing list