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 |
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 |
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: |
Free forum by Nabble | Edit this page |