how to import a live buffer into gstreamer?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

how to import a live buffer into gstreamer?

Nathan
Greetings,

I am trying to streaming a compressed video into networks.

The data coming from non-gst h264encoder and I donot want to change my existing codes a lot.

So I just keep memcpying compressed data from the output of encode and load them into fakesrc and create a thread in my codes to run the gst-pipeline.

So far, I have not successfully done it.

Anyone can suggest any easier approach?

If I just want to keep feeding data into sink pad of a gst-pipeline, which kind of elements is more suitable to do achieve this?

 

I try to use gstpushsrc, however didnot find any useful example.

 

Regards,

 

Jun
Reply | Threaded
Open this post in threaded view
|

Re: how to import a live buffer into gstreamer?

Thiago Santos
On Tue, 2011-11-29 at 13:00 -0800, Nathan wrote:

> Greetings,
>
> I am trying to streaming a compressed video into networks.
>
> The data coming from non-gst h264encoder and I donot want to change my
> existing codes a lot.
>
> So I just keep memcpying compressed data from the output of encode and load
> them into fakesrc and create a thread in my codes to run the gst-pipeline.
>
> So far, I have not successfully done it.

What error do you get?

>
> Anyone can suggest any easier approach?
>
> If I just want to keep feeding data into sink pad of a gst-pipeline, which
> kind of elements is more suitable to do achieve this?
>
>  
>
> I try to use gstpushsrc, however didnot find any useful example.

Take a look at appsrc, from gst-plugins-base:
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsrc.html

You put the appsrc as a source of your pipeline and link your remaining
elements as usual, set the pipeline to playing and feed appsrc with your
data inside GstBuffers.

>
>  
>
> Regards,
>
>  
>
> Jun
>
> --
> View this message in context: http://gstreamer-devel.966125.n4.nabble.com/how-to-import-a-live-buffer-into-gstreamer-tp4120766p4120766.html
> Sent from the GStreamer-devel mailing list archive at Nabble.com.
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

--
Thiago


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: how to import a live buffer into gstreamer?

Nathan
Hi Thiago

Thanks for your quick reply very much. I really appreciated that.

video_h264encodingthread{
Frame_count i;
Byte*  encbuffer; // will be copied into gst_thread

//bunch of codes, then the encbuffer will have a frame of compressed video data;
// which will be copied into gst_thread gst buffer;
gst_omxbuf=memcpy(encbuffer, sizeof(encbuffer) );
}

I just create a new thread name gst_thread, which will create a fakesrc and then link to filesink (later will use this fakesrc to do some complex gst applications)
the data in gst_omxbuf will be copied into fakesrc.
Is any problem with the structure of my codes?

I donot really understand the buffer management of gst-fakesrc or gst-appsrc;
like the data is keeping copying into gst_omxbuf in the h264encodingthread , how the callback function of fakesrc in gst_thread can match the speed of that. Sould I create a heap so that in one end the data is writing into the heap and in the other end fakesrc keep reading data from heap?

My codes seems working okay, i didnot get any errors when running it. however, when i check the file written by filesink, there are all zero.

Could you please give me any advice, or any comments on this problem?

Is any other better way to achieve my goal?

Thanks a lot,


Jun

========================================

void fill_src_buffer(GstElement *fakesrc, GstBuffer *gstbuf, GstPad *pad, int i)
{
  GstCaps *caps;

  GST_BUFFER_MALLOCDATA(gstbuf)=GST_BUFFER_DATA(gstbuf)=gst_omxbuf;
  GST_BUFFER_SIZE(gstbuf)=GST_BUFFER_SIZE(gst_omxbuf);
  caps = gst_caps_new_simple ("video/x-h264", NULL);
  memcpy (GST_BUFFER_DATA (gstbuf), gst_omxbuf, GST_BUFFER_SIZE(gst_omxbuf));
  gst_buffer_set_caps (gstbuf, caps);
  g_print ("buffer caps setting done\n");
  gst_caps_unref (caps);
}

void gst_pipelinetask()
{
 // omit bunch of variables statements


  fakesrc =gst_element_factory_make("fakesrc", "fakesrc");
  printf ("  fakesrc  Init completed \n ");

  filesink =gst_element_factory_make("filesink", "filesink");
  printf ("  filesink  Init completed \n ");
  g_object_set(filesink, "location", "gst.data", NULL );

  g_object_set (fakesrc, "num-buffers", 4,
                         "sizemax", sizeof(gst_omxbuf),
              "sizetype",2,
                         "filltype",2,
             "is-live",TRUE,
             "can-activate-pull",FALSE,
                         "signal-handoffs", TRUE, NULL);



  g_signal_connect(fakesrc, "handoff", G_CALLBACK (fill_src_buffer), 0);


    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
    gst_bus_add_watch (bus, bus_call, loop);
    gst_object_unref (bus);
    printf (" Buss completed \n ");
    gst_bin_add_many(GST_BIN(pipeline),fakesrc,filesink,NULL);

      if (!gst_element_link(fakesrc,filesink)) {
    g_print ("Failed to link elements! \n");
    return -1;
    }
     printf (" Buss link completed \n ");



    ret=gst_element_set_state(pipeline, GST_STATE_PLAYING);  
    g_print("Gst-Pipeline is Runningttttttt.........\n");

    if (ret == GST_STATE_CHANGE_FAILURE) {
        GstMessage *msg;
    g_print ("Failed to start up pipeline! \n");
/* check if there is an error message with details on the bus */
    msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
    if (msg) {
    GError *err = NULL;
    gst_message_parse_error (msg, &err, NULL);
    g_print ("ERROR: %s\n", err->message);
    g_error_free (err);
    gst_message_unref (msg);
    }
    return -1;
}

    g_main_loop_run(loop);
  
    /* Out of the main loop, clean up nicely */
    g_print("Returned, stopping playback\n");
    gst_element_set_state(pipeline, GST_STATE_NULL);
  
    g_print("Deleting pipeline\n");
    gst_object_unref(GST_OBJECT(pipeline));
  
   return 0;

}





On Tue, Nov 29, 2011 at 10:37 PM, Thiago Sousa Santos-2 [via GStreamer-devel] <[hidden email]> wrote:
On Tue, 2011-11-29 at 13:00 -0800, Nathan wrote:

> Greetings,
>
> I am trying to streaming a compressed video into networks.
>
> The data coming from non-gst h264encoder and I donot want to change my
> existing codes a lot.
>
> So I just keep memcpying compressed data from the output of encode and load
> them into fakesrc and create a thread in my codes to run the gst-pipeline.
>
> So far, I have not successfully done it.
What error do you get?

>
> Anyone can suggest any easier approach?
>
> If I just want to keep feeding data into sink pad of a gst-pipeline, which
> kind of elements is more suitable to do achieve this?
>
>  
>
> I try to use gstpushsrc, however didnot find any useful example.

Take a look at appsrc, from gst-plugins-base:
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsrc.html

You put the appsrc as a source of your pipeline and link your remaining
elements as usual, set the pipeline to playing and feed appsrc with your
data inside GstBuffers.

>
>  
>
> Regards,
>
>  
>
> Jun
>
> --
> View this message in context: http://gstreamer-devel.966125.n4.nabble.com/how-to-import-a-live-buffer-into-gstreamer-tp4120766p4120766.html
> Sent from the GStreamer-devel mailing list archive at Nabble.com.
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

--
Thiago


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



If you reply to this email, your message will be added to the discussion below:
http://gstreamer-devel.966125.n4.nabble.com/how-to-import-a-live-buffer-into-gstreamer-tp4120766p4121779.html
To unsubscribe from how to import a live buffer into gstreamer?, click here.
NAML