How to get cropmeta from buffer?

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

How to get cropmeta from buffer?

fthfth
Hello all,

I am new in GStreamer and image processing. Sorry for stupid questions.
I want to send an image with metadata so initially I have used videocropmeta. I am not able to retrive the meta, it always returns null. If you help me, I would be appreciated.

server:

void need_buf (GstAppSrc *appsrc,
        guint       unused_size,
        gpointer    user_data)
{
    g_print("need buffer\n");
    static GstClockTime timestamp = 0;

    GstBuffer *buffer;
    GstFlowReturn ret;
    guint size,height,width,channels;
    IplImage* img;
    guchar *data1;
    GstMapInfo map;

    img=cvLoadImage("/home/.../Downloads/Image1.jpg",1);
    height    = img->height;
    width     = img->width;
    channels  = img->nChannels;
    data1      = (guchar *)img->imageData;
    size = height*width*channels;
    buffer = gst_buffer_new_allocate (NULL, size, NULL);

    gst_buffer_map (buffer, &map, GST_MAP_WRITE);
    memcpy( (guchar *)map.data,data1 , gst_buffer_get_size( buffer ) );
    //gst_buffer_memset (buffer, 0, white ? 0xff : 0x0, size);
    GST_BUFFER_PTS (buffer) = timestamp;
    GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 2);

    timestamp += GST_BUFFER_DURATION (buffer);

    GstVideoCropMeta *meta;
    /* buffer points to a video frame, add some cropping metadata */
    meta = gst_buffer_add_video_crop_meta (buffer);
    /* configure the cropping metadata */
    meta->x = 1;
    meta->y = 2;
    meta->width = 3;
    meta->height = 4;

   // g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
    ret = gst_app_src_push_buffer(appsrc, buffer);

    if (ret != GST_FLOW_OK) {
    g_print("quit: %s\n", __func__);
        g_main_loop_quit (mm_loop);
    }
}

void startPipe()
{
        GstElement* m_pipeline;
        gst_init (NULL, NULL);
        mm_loop = g_main_loop_new (NULL, FALSE);
        m_pipeline = gst_parse_launch ("appsrc name=testSrc caps=video/x-raw,format=RGB,width=640,height=480,framerate=30/1 ! "
                        "videoconvert name=ffmpeg ! "
                        "x264enc ! "
                        "h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=172.20.21.255 port=5600 sync=false async=false", NULL);

        GstElement* appsrc = gst_bin_get_by_name(GST_BIN(m_pipeline), "testSrc");

        GstAppSrcCallbacks cbs;
        cbs.need_data = need_buf;
        cbs.enough_data = enough_buf;
        gst_app_src_set_callbacks(GST_APP_SRC_CAST(appsrc), &cbs, NULL, NULL);
        gst_element_set_state (m_pipeline, GST_STATE_PLAYING);
        g_main_loop_run (mm_loop);
        /* clean up */
        gst_element_set_state (m_pipeline, GST_STATE_NULL);
        gst_object_unref (GST_OBJECT (m_pipeline));
        g_main_loop_unref (mm_loop);
}

client:

/* fakesink handoff callback */
void
on_gst_buffer(GstElement * element,
                        GstBuffer * buf,
                        GstPad * pad,
                                                gpointer data)
{
    /* ref then push buffer to use it in qt */
        GstVideoCropMeta *meta = gst_buffer_get_video_crop_meta(buf);
        if (meta == NULL)
                return;
        g_print ("gstBuffer");
    gst_buffer_ref(buf);
}

.........
gchar *pipeline = g_strdup_printf ("udpsrc port=5600 ! "
                         "application/x-rtp, encoding-name=H264,payload=96 !  "
                         "rtph264depay ! h264parse ! avdec_h264 ! "
                         "autovideosink name =fakesink0");

         m_pipeline = GST_PIPELINE (gst_parse_launch (pipeline, NULL));
         g_free (pipeline);

         m_bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
         gst_bus_add_watch(m_bus, (GstBusFunc) bus_call, m_loop);
         gst_object_unref(m_bus);

         GstElement *fakesink = gst_bin_get_by_name(GST_BIN(m_pipeline), "fakesink0");
         g_object_set(G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL);
         g_signal_connect(fakesink, "handoff", G_CALLBACK (on_gst_buffer), m_loop);
         gst_object_unref(fakesink);

         GstStateChangeReturn ret =
                         gst_element_set_state(GST_ELEMENT(m_pipeline), GST_STATE_PLAYING);
Reply | Threaded
Open this post in threaded view
|

Re: How to get cropmeta from buffer?

Sebastian Dröge-3
On Thu, 2016-09-01 at 02:18 -0700, fthfth wrote:
> Hello all,
>
> I am new in GStreamer and image processing. Sorry for stupid questions. 
> I want to send an image with metadata so initially I have used
> videocropmeta. I am not able to retrive the meta, it always returns null. If
> you help me, I would be appreciated.
> [...]

Not all elements are passing through the crop meta, specifically it is
currently only handled on raw video elements and only if all elements
handle it. Before using it, you have to check via the ALLOCATION query
if all elements support it.

But that's not your problem actually. You assume that the crop meta can
be sent over RTP over UDP, which is not the case. You will have to
encode it in a way that can be sent over RTP, e.g. by using a custom
RTP header extension (for which you have to write code).

--
Sebastian Dröge, Centricular Ltd · http://www.centricular.com
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

signature.asc (949 bytes) Download Attachment