unexpected result when writing to GstBuffer

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

unexpected result when writing to GstBuffer

longkas
Hello,
I'm writing a simple test of appsrc, the appsrc generates 1x1 BGRA pixels
with framerate 1/1:

----------------------------------------
        GstCaps *srcCaps;
        srcCaps = gst_caps_new_simple("video/x-raw",
                                        "width", G_TYPE_INT, 1,
                                        "height", G_TYPE_INT, 1,
                                      "format", G_TYPE_STRING, "BGRA",
                                      "framerate", GST_TYPE_FRACTION, 1, 1,
                                        NULL);
        gst_app_src_set_caps(appSrc, srcCaps);
----------------------------------------

the need_data callback will push a red color pixel when be invoked, but it
displays pink instead of red color on the screen:

----------------------------------------
void  cb_need_data(GstAppSrc *src, guint length, gpointer user_data) {
    GstBuffer *buffer;
    guint8 data[] = {0, 0, 255, 255}; //red color in BGRA
    buffer = gst_buffer_new_and_alloc(4); // 4 bytes for 1x1 pixel
    gst_buffer_insert_memory(buffer,  0,
gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, &data[0], 4, 0, 4, NULL,
NULL));
    //set time and duration
    ...
}
----------------------------------------

if I write buffer one by one, I do get the red color as expected

----------------------------------------
        for(int i=0; i < 4; i++) {
            gst_buffer_memset(buffer, i, data[i], 1);
        }
----------------------------------------

need advice how to use gst_memory_new_wrapped, thanks






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

Re: unexpected result when writing to GstBuffer

Michael Gruner
Hi

On one hand, “guint8 data[]” is allocated in the stack, so it is local to the current function. Contents may change as soon as the function ends. That would explain why the copy works. Try allocating it on the heap.

On the other hand, I believe “get_buffer_new_and_alloc” is deprecated. You may take a look at “gst_buffer_new_allocate”, or if you want to wrap a pointer “gst_buffer_new_wrapped” and “gst_buffer_new_wrapped_full”. There is no need to allocate a memory if you are inserting a wrapped memory later.

https://developer.gnome.org/gstreamer/stable/gstreamer-GstBuffer.html#gst-buffer-new-wrapped-full

Michael
www.ridgerun.com


> On Apr 18, 2019, at 12:32 AM, longkas <[hidden email]> wrote:
>
> Hello,
> I'm writing a simple test of appsrc, the appsrc generates 1x1 BGRA pixels
> with framerate 1/1:
>
> ----------------------------------------
>        GstCaps *srcCaps;
>        srcCaps = gst_caps_new_simple("video/x-raw",
>                                        "width", G_TYPE_INT, 1,
>                                        "height", G_TYPE_INT, 1,
>                                      "format", G_TYPE_STRING, "BGRA",
>                                      "framerate", GST_TYPE_FRACTION, 1, 1,
>                                        NULL);
>        gst_app_src_set_caps(appSrc, srcCaps);
> ----------------------------------------
>
> the need_data callback will push a red color pixel when be invoked, but it
> displays pink instead of red color on the screen:
>
> ----------------------------------------
> void  cb_need_data(GstAppSrc *src, guint length, gpointer user_data) {
>    GstBuffer *buffer;
>    guint8 data[] = {0, 0, 255, 255}; //red color in BGRA
>    buffer = gst_buffer_new_and_alloc(4); // 4 bytes for 1x1 pixel
>    gst_buffer_insert_memory(buffer,  0,
> gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, &data[0], 4, 0, 4, NULL,
> NULL));
>    //set time and duration
>    ...
> }
> ----------------------------------------
>
> if I write buffer one by one, I do get the red color as expected
>
> ----------------------------------------
>        for(int i=0; i < 4; i++) {
>            gst_buffer_memset(buffer, i, data[i], 1);
>        }
> ----------------------------------------
>
> need advice how to use gst_memory_new_wrapped, thanks
>
>
>
>
>
>
> --
> Sent from: http://gstreamer-devel.966125.n4.nabble.com/
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

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

Re: unexpected result when writing to GstBuffer

longkas
Thank you for the reply, that helps a lot for me.

BR



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel