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