problem occured in pipeline creation stage of injecting source in to appsrc of playbin

Sujith reddy Sujithreddy6192 at gmail.com
Wed Jun 13 04:37:38 UTC 2018


hi All

/This is the code for injecting data in to appsrc .But here i am exiting
from the code due to below error snippet.here i am attaching the code can
you please suggest where i went wrong/


*(bufffer:14474): GLib-GObject-CRITICAL **: g_object_set: assertion
'G_IS_OBJECT (object)' failed

(bufffer:14474): GLib-GObject-CRITICAL **: g_object_set: assertion
'G_IS_OBJECT (object)' failed

(bufffer:14474): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(bufffer:14474): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion
'G_TYPE_CHECK_INSTANCE (instance)' failed

(bufffer:14474): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(bufffer:14474): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion
'G_TYPE_CHECK_INSTANCE (instance)' failed
*








/*
command to use 
gcc pipeline_buffer.c `pkg-config --cflags --libs glib-2.0 gstreamer-1.0
gstreamer-audio-1.0 gstreamer-app-1.0`
*/

   #include <gst/gst.h>
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    extern char *gst_get_song_buffer(char *uri, int content_id, int
*data_len,int *is_eos);
    extern void gst_song_buffer_read_done(char *uri, int content_id);
    /*GST_DEBUG_CATEGORY (appsrc_playbin_debug);
    #define GST_CAT_DEFAULT appsrc_playbin_debug
    
    /*
     * an example application of using appsrc in streaming push mode. We
simply push
     * buffers into appsrc. The size of the buffers we push can be any size
we
     * choose.
     *
     * This example is very close to how one would deal with a streaming
webserver
     * that does not support range requests or does not report the total
file size.
     *
     * Some optimisations are done so that we don't push too much data. We
connect
     * to the need-data and enough-data signals to start/stop sending
buffers.
     *
     * Appsrc in streaming mode (the default) does not support seeking so we
don't
     * have to handle any seek callbacks.
     *
     * Some formats are able to estimate the duration of the media file
based on the
     * file length (mp3, mpeg,..), others report an unknown length (ogg,..).
     */
    typedef struct _App App;
    
    struct _App
    {
      GstElement *playbin;
      GstElement *appsrc;
    
      GMainLoop *loop;
      guint sourceid;
    
      GMappedFile *file;
      guint8 *data;
      gsize length;
      guint64 offset;
	char uri[256];
	int content_id;

    };
    
    App s_app;
    
    
    
    /* This method is called by the idle GSource in the mainloop.we feed the
data and length coming from the
gst_get_song_buffer(app->uri,app->content_id,&data_len,&is_eos);
     * 
     * and it is feeded in to appsrc .we will get length and pointer to a
buffer from the apis which we have written .
     * (enough-data signal).
     */
    static gboolean
    read_data (App * app)
    {
		GstBuffer *buffer;
		GstFlowReturn ret;
		GstMapInfo map;
		char *ptr;
		int data_len,is_eos;
		printf("read_data\n");
		ptr=gst_get_song_buffer(app->uri,app->content_id,&data_len,&is_eos);

		printf("read_data data_len=%d,is_eos=%d",data_len,is_eos);

		if(data_len >0)
		{
			buffer = gst_buffer_new_and_alloc (data_len);
			gst_buffer_map (buffer, &map, GST_MAP_WRITE);
			memcpy(map.data,ptr,data_len);
			gst_buffer_unmap (buffer, &map);
			/* Push the buffer into the appsrc */
			g_signal_emit_by_name (app->appsrc, "push-buffer", buffer, &ret);
			/* Create a new empty buffer */
			gst_buffer_unref (buffer);
			gst_song_buffer_read_done(app->uri,app->content_id);

		}


		if(is_eos == 1)
		{
		   g_signal_emit_by_name (app->appsrc, "end-of-stream", &ret);
		   return FALSE;

		}
		if (ret != GST_FLOW_OK) {
		/* We got some error, stop sending data */
		gst_app_src_end_of_stream (app->appsrc);
		 return FALSE;
		}
		return TRUE;
   }
   
   /* This signal callback is called when appsrc needs data, we add an idle
handler
    * to the mainloop to start pushing data into the appsrc */
   static void
   start_feed (GstElement * playbin, guint size, App * app)
   {
     if (app->sourceid == 0) {
       GST_DEBUG ("start feeding");
       app->sourceid = g_idle_add ((GSourceFunc) read_data, app);
     }
   }
   
   /* This callback is called when appsrc has enough data and we can stop
sending.
    * We remove the idle handler from the mainloop */
   static void
   stop_feed (GstElement * playbin, App * app)
   {
     if (app->sourceid != 0) {
       GST_DEBUG ("stop feeding");
       g_source_remove (app->sourceid);
       app->sourceid = 0;
     }
   }
   
   /* this callback is called when playbin has constructed a source object
to read
    * from. Since we provided the appsrc:// uri to playbin, this will be the
    * appsrc that we must handle. We set up some signals to start and stop
pushing
    * data into appsrc */
   static void
   found_source (GObject * object, GObject * orig, GParamSpec * pspec, App *
app)
   {
     /* get a handle to the appsrc */
     //g_object_get (orig, pspec->name, &app->appsrc, NULL);
   
     //GST_DEBUG ("got appsrc %p", app->appsrc);
   
     /* we can set the length in appsrc. This allows some elements to
estimate the
      * total duration of the stream. It's a good idea to set the property
when you
      * can but it's not required. */
     g_object_set (app->appsrc, "size", (20*1024*1024), NULL);
   
     /* configure the appsrc, we will push data into the appsrc from the
     * mainloop. */
     g_object_set (app->appsrc,  "format", GST_FORMAT_TIME, NULL);
     g_signal_connect (app->appsrc, "need-data", G_CALLBACK (start_feed),
app);
     g_signal_connect (app->appsrc, "enough-data", G_CALLBACK (stop_feed),
app);
   }
   
   static gboolean
   bus_message (GstBus * bus, GstMessage * message, App * app)
   {
     GST_DEBUG ("got message %s",
         gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
   printf("busssss messsages=%s",gst_message_type_get_name (GST_MESSAGE_TYPE
(message)));
     switch (GST_MESSAGE_TYPE (message)) {
       case GST_MESSAGE_ERROR:
         g_error ("received error");
         g_main_loop_quit (app->loop);
         break;
       case GST_MESSAGE_EOS:
         g_main_loop_quit (app->loop);
         break;
       default:
         break;
     }
     return TRUE;
   }
   
   int
   gst_play()
   {
     App *app = &s_app;
     GError *error = NULL;
     GstBus *bus;
   
     gst_init (NULL, NULL);
    
strcpy(app->uri,"https://musicaudiohls-a.erosnow.com/hls/music/4/1050534/musicaudio/6695031/1050534_6695031_IPAD_ALL_multi.m3u8");
     app->content_id =6695031;
     
     
   app->loop = g_main_loop_new (NULL, TRUE);
   
     app->playbin = gst_element_factory_make ("playbin", NULL);
     g_assert (app->playbin);
   
     bus = gst_pipeline_get_bus (GST_PIPELINE (app->playbin));
   
     /* add watch for messages */
     gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
  
     /* set to read from appsrc */
     g_object_set (app->playbin, "uri", "appsrc://", NULL);
   
     /* get notification when the source is created so that we get a handle
to it
      * and can configure it */
     g_signal_connect (app->playbin, "deep-notify::source",
         (GCallback) found_source, app);
   
     /* go to playing and wait in a mainloop. */
     gst_element_set_state (app->playbin, GST_STATE_PLAYING);
   
   printf("playing\n");
   
   
     /* this mainloop is stopped when we receive an error or EOS */
     g_main_loop_run (app->loop);
   printf("stopping\n");
     GST_DEBUG ("stopping");
   
     gst_element_set_state (app->playbin, GST_STATE_NULL);
   
  
  
   
     gst_object_unref (bus);
     g_main_loop_unref (app->loop);
   
     return 0;


 }




--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list