h264 streaming - byte buffer a source

thegoodgiant giorgioscibilia at gmail.com
Fri Jul 26 06:15:19 PDT 2013


Hi all, 
I am new here and also new to GStreamer so, sorry for the probablty-stupid
question:

I am developing a C application under linux that receives an h.264 stream
(from a device over local wifi) and should play it. There's a method called
every time there is new data available (in the form of an uint8_t pointer).
This should be my data source, but I have some issues: my compiles and runs
with no errors, but I see no video :)

I had a look at  this manual
<http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-data-spoof.html>  
and googled in order  to be a bit confident with the environment/APIs.
As a first step I realized (copy/pasted from various internet pages and
adjusted to my use case) a sw that plays a video file in the exact format I
need (It uses playbin).

Now I am trying without success to make the same exact thing, but changing
the source. 
Inside my code I have a method that is called every time new data is ready
to be visualized, it's something like:

void data_available(uint8_t *inPtr, size_t size){
   play_data(inPtr, size)
}


I have implemented two more methods: "init_stream()" that should init the
pipeline and "play_data(void* inPtr, size_t len)" that shuld push new data.
I'm trying to use appsrc in push mode, so what I do is initializing the
pipeline (init_stream called in the main loop) and then simply pushing new
data every time they are available (play_data is called inside
data_available).

Below you can find my current init_stream and play_data implementation. Can
you please tell me what am I doing wrong?

int init_stream()
{
  GstBus *bus;

  gst_init (NULL, NULL);
  fprintf(stderr, "gst_init done\n");

  /* create a mainloop to get messages */
    app->loop = g_main_loop_new (NULL, TRUE);
    fprintf(stderr, "app loop initialized\n");


    app->pipeline = gst_parse_launch("appsrc name=mysource ! h264parse !
mfw_vpudecoder ! mfw_v4lsin", NULL);

    app->appsrc = gst_bin_get_by_name (GST_BIN(app->pipeline), "mysource");
      gst_app_src_set_stream_type(app->appsrc, GST_APP_STREAM_TYPE_STREAM);

//      gst_app_src_set_emit_signals(app->appsrc, TRUE);
      fprintf(stderr, "Pipeline and appsrc initialized\n");


    	/* Create Bus from pipeline */
        bus = gst_pipeline_get_bus(app->pipeline);
         fprintf(stderr, "bus created\n");

         /* add watch for messages */
         gst_bus_add_watch (bus, (GstBusFunc) bus_message, app);
        gst_object_unref(bus);
        fprintf(stderr, "bus_add_watch done\n");


        GstCaps* video_caps = gst_caps_new_simple ("video/x-h264",
                                         "width", G_TYPE_INT, 800,
                                         "height", G_TYPE_INT, 480,
                                         "framerate", GST_TYPE_FRACTION, 25,
                                         1, NULL);

     gst_app_src_set_caps(GST_APP_SRC(app->appsrc), video_caps);

  /* go to playing and wait in a mainloop. */
  gst_element_set_state ((GstElement*) app->pipeline, GST_STATE_PLAYING);
  fprintf(stderr, "gst_element_set_state play\n");

  /* this mainloop is stopped when we receive an error or EOS */
  g_main_loop_run (app->loop);
  fprintf(stderr, "g_main_loop_run called\n");

  gst_element_set_state ((GstElement*) app->pipeline, GST_STATE_NULL);

  fprintf(stderr, "gst_element_set_state GST_STATE_NULL\n");

  /* free the file */
//  g_mapped_file_unref (app->file);

  gst_object_unref (bus);
  g_main_loop_unref (app->loop);

  return 0;
}

void play_data(void *inBuf ,  size_t len) {

	static gboolean white = FALSE;
	static GstClockTime timestamp = 0;
	GstBuffer *buffer;
	guint size;
	GstFlowReturn ret_;
	size = len;

	buffer =  gst_buffer_new();
	GST_BUFFER_MALLOCDATA(buffer) = GST_BUFFER_DATA(buffer) = inBuf;
	GST_BUFFER_SIZE(buffer) = len;


	GstCaps* caps = gst_caps_new_simple ("video/x-h264",
		                                         "width", G_TYPE_INT, 800,
		                                         "height", G_TYPE_INT, 480,
		                                         "framerate", GST_TYPE_FRACTION,
25,
		   1,
		                            NULL);

	 gst_buffer_set_caps(buffer, caps);


	GST_BUFFER_TIMESTAMP (buffer) = timestamp;

	GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND,
2);

	timestamp += GST_BUFFER_DURATION (buffer);

	g_signal_emit_by_name (app->appsrc, "push-buffer", buffer, &ret_);

	if (ret_ != GST_FLOW_OK) {

	/* something wrong, stop pushing */

	g_main_loop_quit (app->loop);

	}





--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/h264-streaming-byte-buffer-a-source-tp4661283.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list