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