Problem using Appsrc as a source to stream a computer generated video buffer
Ashwini Sharma
ak.ashwini at gmail.com
Fri Nov 25 02:48:40 PST 2011
Hi,
I think using following lines
raw_buffer = g_malloc0 (640*480*3);
memset((void *)raw_buffer, 0xff, (640*480*3));
buffer = gst_app_buffer_new (raw_buffer, (640*480*3), g_free,
raw_buffer);
instead of
// pb = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 640, 480);
// gdk_pixbuf_fill(pb, 0xffffffff);
// GST_BUFFER_DATA (buffer) = gdk_pixbuf_get_pixels(pb);
may help you.
raw buffer is of type gpointer.
--Ashwini
On Fri, Nov 25, 2011 at 1:27 PM, Chinnapong Angsuchotmetee <
achinapong at gmail.com> wrote:
> Dear all,
>
> I try to create a basic video application whose generate a raw frame
> buffer, encoded it via x264enc and stream it via AutovideoSink. I
> stucked on the error as followed:
>
>
> (a.out:11729): GStreamer-CRITICAL **: gst_buffer_create_sub: assertion
> `buffer->mini_object.refcount > 0' failed
>
> (a.out:11729): GStreamer-CRITICAL **: gst_mini_object_unref: assertion
> `mini_object->refcount > 0' failed
> Segmentation fault
>
>
> I have no idea what to do to solve this error, Some suggestion on
> google recommend me to set the caps property of the appsrc source.
> However, I already did that and the assertion is still remained.
> Sourcecode is attached below. Any suggestion or explanation would be
> highly appreciated.
>
> Best regards,
>
> Chinnapong
>
>
> Here are the sourcecode:
>
>
> #include <gst/gst.h>
> #include <gst/app/gstappsrc.h>
> #include <gdk-pixbuf/gdk-pixbuf.h>
>
>
> GstElement *pipeline, *source, *decoder, *video_sink;
> GstCaps * caps;
>
> static gboolean bus_call(GstBus * bus,
> GstMessage * msg,
> gpointer data)
> {
> GMainLoop *loop = (GMainLoop *) data;
> switch (GST_MESSAGE_TYPE (msg))
> {
> case GST_MESSAGE_EOS:
> g_print("End-of-stream\n");
> g_main_loop_quit(loop);
> break;
> case GST_MESSAGE_ERROR:
> {
> gchar * debug;
> GError *err;
>
> gst_message_parse_error (msg, &err, &debug);
> g_free (debug);
>
> g_print("Error: %s\n", err->message);
> g_main_loop_quit(loop);
> break;
> }
> default:
> break;
> return TRUE;
> }
> }
>
>
> static void feed( GstElement* object,
> guint arg0,
> gpointer src )
> {
>
> GstBuffer *buffer;
> GdkPixbuf *pb;
> GstFlowReturn ret;
> gboolean ok = TRUE;
> buffer = gst_buffer_new();
> pb = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 640, 480);
> gdk_pixbuf_fill(pb, 0xffffffff);
>
> GST_BUFFER_DATA (buffer) = gdk_pixbuf_get_pixels(pb);
> GST_BUFFER_SIZE (buffer) = 640*480*3*sizeof(guchar);
>
> GST_DEBUG ("feed buffer");
> g_signal_emit_by_name (src, "push-buffer", buffer, &ret);
>
>
> if (ret != GST_FLOW_OK) {
> GST_DEBUG ("some error");
> }
>
> gst_buffer_unref (buffer);
>
>
> }
>
> static void new_pad( GstElement * element,
> GstPad * pad,
> gpointer data )
> {
> GstPad *sinkpad = NULL;
> GstElement *decoder = (GstElement *) data;
> sinkpad = gst_element_get_static_pad(decoder,"vsink");
> gst_pad_link(pad,sinkpad);
> gst_object_unref (sinkpad);
> }
>
> int main(int argc, char * argv[])
> {
> GMainLoop * loop;
> GstBus * bus;
>
> gst_init(&argc, &argv);
> loop = g_main_loop_new(NULL, FALSE);
>
>
> pipeline = gst_pipeline_new("test-push-buffer");
> source = gst_element_factory_make("appsrc","source");
> decoder = gst_element_factory_make("x264enc","decoder");
> caps = gst_caps_new_simple ("video/x-raw-rgb",
> "bpp",G_TYPE_INT,24,
> "depth",G_TYPE_INT,24,
> "width", G_TYPE_INT, 640,
> "height", G_TYPE_INT, 480,
> NULL);
>
> video_sink = gst_element_factory_make("autovideosink","vsink");
> if(!pipeline || !source || ! video_sink || ! decoder)
> {
> g_print("Element creation Error\n");
> return -1;
> }
>
> gst_app_src_set_caps((GstAppSrc*)source, caps);
> g_signal_connect (source, "need-data", G_CALLBACK (feed), source);
>
> g_object_set(G_OBJECT(source), "caps", caps, NULL);
> bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
> gst_bus_add_watch (bus, bus_call, loop);
> gst_object_unref (bus);
>
>
> gst_bin_add_many(GST_BIN (pipeline), source, decoder, video_sink,
> NULL);
> gst_element_link_many (source, decoder, video_sink);
>
>
> g_signal_connect (decoder, "pad-added", G_CALLBACK(new_pad), NULL);
>
> g_print("Setting to Playing\n");
> gst_element_set_state(pipeline, GST_STATE_PLAYING);
> g_print("Running\n");
> g_main_loop_run(loop);
>
>
> g_print("Stop playback\n");
> gst_element_set_state(pipeline, GST_STATE_NULL);
> g_print("Delete Pipeline\n");
> gst_object_unref (GST_OBJECT (pipeline));
>
> return 0;
>
>
> }
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111125/1f457093/attachment-0001.htm>
More information about the gstreamer-devel
mailing list