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