<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Can you run your app with warning logging enabled? Any of the following should work:<div class=""><br class=""></div><div class="">./app --gst-debug=2</div><div class=""><br class=""></div><div class="">Or</div><div class=""><br class=""></div><div class="">GST_DEBUG=2 ./app</div><div class=""><br class=""></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Mar 14, 2019, at 2:17 PM, Saurabh Bora <<a href="mailto:saurabh9bora@gmail.com" class="">saurabh9bora@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class="">Hi Experts!, <div class=""><br class=""></div><div class="">Thanks!! Michael, I tried the approach suggested by you and it works fine. I could verify the conversion of cv::Mat to GstBuffer and vice versa. On cv::write I get exact image that I had copied to GstBuffer.</div><div class=""><br class=""></div><div class="">However, I am unable to get correct image on autovidesink. With current code below, I see a skewed and distorted grayscale image. Note that I had to set width and height of videocaps on appsrc element as 133, 133 respectively, even though dimesnions of my input image is 134*134. If I set width and height as 134, 134 in videocaps, I see a black videosink.</div><div class=""><br class=""></div><div class="">//----------------------------------------------------------</div><div class=""><div class="">#include <gst/gst.h></div><div class="">#include <opencv2/opencv.hpp></div><div class="">#include <opencv2/highgui.hpp></div><div class=""><br class=""></div><div class="">static GMainLoop *loop;</div><div class=""><br class=""></div><div class="">void buffer_destroy(gpointer data)</div><div class="">{</div><div class=""><span style="white-space:pre" class="">     </span>cv::Mat* done = (cv::Mat*)data;</div><div class=""><span style="white-space:pre" class=""> </span>delete done;</div><div class="">}</div><div class=""><br class=""></div><div class="">static void</div><div class="">cb_need_data(GstElement *appsrc,</div><div class=""><span style="white-space:pre" class="">   </span>guint       unused_size,</div><div class=""><span style="white-space:pre" class="">    </span>gpointer    user_data)</div><div class="">{</div><div class=""><span style="white-space:pre" class="">     </span>static GstClockTime timestamp = 0;</div><div class=""><span style="white-space:pre" class="">      </span>GstBuffer *buffer;</div><div class=""><span style="white-space:pre" class="">      </span>GstFlowReturn ret;</div><div class=""><span style="white-space:pre" class="">      </span>char *data1;</div><div class=""><span style="white-space:pre" class="">    </span>GstMapInfo map;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">  </span>cv::Mat* img = new cv::Mat(cv::imread("C:/Users/212730892.LOGON/Desktop/lena.jpg"));</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">   </span>std::cout << "cb_need_data called" << std::endl;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">   </span>gsize sizeInBytes = img->total() * img->elemSize();</div><div class=""><span style="white-space:pre" class="">       </span>std::cout << "Size getting copied: " << sizeInBytes << std::endl;</div><div class=""><span style="white-space:pre" class="">   </span>buffer = gst_buffer_new_wrapped_full((GstMemoryFlags)0, (gpointer)(img->data), sizeInBytes, 0, sizeInBytes, (gpointer)img, (GDestroyNotify)buffer_destroy);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">   </span>gsize bufferSize = gst_buffer_get_size(buffer);</div><div class=""><span style="white-space:pre" class=""> </span>std::cout << "Buffer Size: " << bufferSize << std::endl;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">     </span>//Convert GstBuffer back to cv::Mat, to check if data was correctly copied</div><div class=""><span style="white-space:pre" class="">      </span>GstMapInfo info;</div><div class=""><span style="white-space:pre" class="">        </span>gst_buffer_map(buffer, &info, GST_MAP_READ);</div><div class=""><span style="white-space:pre" class="">        </span>cv::Mat img2(cv::Size(img->size().height, img->size().width), CV_8UC3, (char*)(info.data));</div><div class=""><span style="white-space:pre" class="">       </span>cv::imwrite("C:/Users/212730892.LOGON/Desktop/dummy1.jpg", img2);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">      </span>GST_BUFFER_OFFSET(buffer) = 0;</div><div class=""><span style="white-space:pre" class="">  </span>GST_BUFFER_PTS(buffer) = timestamp;</div><div class=""><span style="white-space:pre" class="">     </span>GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 30);</div><div class=""><span style="white-space:pre" class="">     </span>//GST_BUFFER_DURATION(buffer) = GST_CLOCK_TIME_NONE;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">     </span>timestamp += GST_BUFFER_DURATION(buffer);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">        </span>g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);</div><div class=""><span style="white-space:pre" class="">       </span>gst_buffer_unref(buffer);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">        </span>if (ret != GST_FLOW_OK) {</div><div class=""><span style="white-space:pre" class="">               </span>/* something wrong, stop pushing */</div><div class=""><span style="white-space:pre" class="">             </span>g_main_loop_quit(loop);</div><div class=""><span style="white-space:pre" class=""> </span>}</div><div class="">}</div><div class=""><br class=""></div><div class="">gint</div><div class="">main(gint   argc,</div><div class=""><span style="white-space:pre" class="">  </span>gchar *argv[])</div><div class="">{</div><div class=""><span style="white-space:pre" class="">       </span>GstElement *pipeline, *appsrc, *conv, *videosink;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">        </span>/* init GStreamer */</div><div class=""><span style="white-space:pre" class="">    </span>gst_init(&argc, &argv);</div><div class=""><span style="white-space:pre" class=""> </span>loop = g_main_loop_new(NULL, FALSE);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">     </span>/* setup pipeline */</div><div class=""><span style="white-space:pre" class="">    </span>pipeline = gst_pipeline_new("pipeline");</div><div class=""><span style="white-space:pre" class="">      </span>appsrc = gst_element_factory_make("appsrc", "source");</div><div class=""><span style="white-space:pre" class="">      </span>conv = gst_element_factory_make("videoconvert", "conv");</div><div class=""><span style="white-space:pre" class="">    </span>videosink = gst_element_factory_make("autovideosink", "videosink");</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">  </span>/* setup */</div><div class=""><span style="white-space:pre" class="">     </span>g_object_set(G_OBJECT(appsrc), "caps",</div><div class=""><span style="white-space:pre" class="">                </span>gst_caps_new_simple("video/x-raw",</div><div class=""><span style="white-space:pre" class="">                    </span>"format", G_TYPE_STRING, "RGB",</div><div class=""><span style="white-space:pre" class="">                     </span>"width", G_TYPE_INT, 133,</div><div class=""><span style="white-space:pre" class="">                     </span>"height", G_TYPE_INT, 133,</div><div class=""><span style="white-space:pre" class="">                    </span>"framerate", GST_TYPE_FRACTION, 1, 30,</div><div class=""><span style="white-space:pre" class="">                        </span>NULL), NULL);</div><div class=""><span style="white-space:pre" class="">   </span>gst_bin_add_many(GST_BIN(pipeline), appsrc, conv, videosink, NULL);</div><div class=""><span style="white-space:pre" class="">     </span>gst_element_link_many(appsrc, conv, videosink, NULL);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">    </span>/* setup appsrc */</div><div class=""><span style="white-space:pre" class="">      </span>g_object_set(G_OBJECT(appsrc),</div><div class=""><span style="white-space:pre" class="">          </span>"stream-type", 0,</div><div class=""><span style="white-space:pre" class="">             </span>"format", GST_FORMAT_TIME, NULL);</div><div class=""><span style="white-space:pre" class="">     </span>g_signal_connect(appsrc, "need-data", G_CALLBACK(cb_need_data), NULL);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class=""> </span>/* play */</div><div class=""><span style="white-space:pre" class="">      </span>gst_element_set_state(pipeline, GST_STATE_PLAYING);</div><div class=""><span style="white-space:pre" class="">     </span>g_main_loop_run(loop);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">   </span>if (gst_element_set_state(pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)</div><div class=""><span style="white-space:pre" class="">        </span>{</div><div class=""><span style="white-space:pre" class="">               </span>g_printerr("Unable to set the pipeline to the playing state.\n");</div><div class=""><span style="white-space:pre" class="">     </span>}</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class="">        </span>// Free resources</div><div class=""><span style="white-space:pre" class="">       </span>gst_object_unref(GST_OBJECT(pipeline));</div><div class=""><span style="white-space:pre" class=""> </span>g_main_loop_unref(loop);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre" class=""> </span>return 0;</div><div class="">}</div></div><div class="">//-------------------------------------------------------------------------</div><div class=""><br class=""></div><div class="">I am new to gstreamer framework and it would be a great help if someone could point me in right direction.</div></div></div><div class=""><br class=""></div><div class="">Thanks and Regards,</div><div class="">Saurabh Bora</div><div class=""><br class=""></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Mar 13, 2019 at 11:48 PM Michael Gruner <<a href="mailto:michael.gruner@ridgerun.com" class="">michael.gruner@ridgerun.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto" class="">It looks like img2, being a local variable, ends  its life when “cb_need_data” ends. That leaves the pointer in “buffer” invalid. For this one you’re better off with the copy. <div class=""><br class=""></div><div class="">Another option is to alloc img2 on the heap, and use gst_buffer_new_wrapped_full to carry img2 along with buffer and free then together.<br class=""><br class=""><div id="gmail-m_7923909520158695290AppleMailSignature" dir="ltr" class="">Michael</div><div id="gmail-m_7923909520158695290AppleMailSignature" dir="ltr" class=""><a href="http://www.ridgerun.com/" target="_blank" class="">www.ridgerun.com</a></div><div dir="ltr" class=""><br class="">On Mar 13, 2019, at 10:51 AM, Saurabh Bora <<a href="mailto:saurabh9bora@gmail.com" target="_blank" class="">saurabh9bora@gmail.com</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class="">Hi Michael, <div class=""><br class=""></div><div class="">Thanks! for your input. I tried what you suggested as below:</div><div class=""><br class=""></div><div class="">//---------------------------------------------------------------</div><div class=""><div class="">#include <gst/gst.h></div><div class="">#include <opencv2/opencv.hpp></div><div class="">#include <opencv2/highgui.hpp></div><div class="">#include <opencv2/imgproc/imgproc.hpp></div><div class=""><br class=""></div><div class="">static GMainLoop *loop;</div><div class=""><br class=""></div><div class="">static void</div><div class="">cb_need_data(GstElement *appsrc,</div><div class=""><span style="white-space:pre-wrap" class="">     </span>guint       unused_size,</div><div class=""><span style="white-space:pre-wrap" class="">       </span>gpointer    user_data)</div><div class="">{</div><div class=""><span style="white-space:pre-wrap" class="">        </span>static GstClockTime timestamp = 0;</div><div class=""><span style="white-space:pre-wrap" class=""> </span>GstBuffer *buffer;</div><div class=""><span style="white-space:pre-wrap" class=""> </span>guint size, depth, height, width, step, channels;</div><div class=""><span style="white-space:pre-wrap" class="">  </span>GstFlowReturn ret;</div><div class=""><span style="white-space:pre-wrap" class=""> </span>guchar *data1;</div><div class=""><span style="white-space:pre-wrap" class="">     </span>GstMapInfo map;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">     </span>cv::Mat img2;</div><div class=""><span style="white-space:pre-wrap" class="">      </span>cv::Mat img = cv::imread("C:/Users/212730892.LOGON/Desktop/lena.jpg");</div><div class=""><span style="white-space:pre-wrap" class="">   </span>cv::cvtColor(img, img2, cv::COLOR_BGR2RGB);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class=""> </span>height = img.size().height;</div><div class=""><span style="white-space:pre-wrap" class="">        </span>width = img.size().width;</div><div class=""><span style="white-space:pre-wrap" class="">  </span>//step = img.widthStep;</div><div class=""><span style="white-space:pre-wrap" class="">    </span>channels = img.channels();</div><div class=""><span style="white-space:pre-wrap" class=""> </span>//depth = img->depth;</div><div class=""><span style="white-space:pre-wrap" class="">   </span>data1 = (guchar *)img.data;</div><div class=""><span style="white-space:pre-wrap" class="">        </span>size = height * width * channels * sizeof(guchar);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">  </span>std::cout << "cb_need_data called" << std::endl;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">      </span>buffer = gst_buffer_new_wrapped(img2.data, img2.total() * img2.elemSize());</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class=""> </span>GstMapInfo info;</div><div class=""><span style="white-space:pre-wrap" class="">   </span>gst_buffer_map(buffer, &info, GST_MAP_READ);</div><div class=""><span style="white-space:pre-wrap" class="">   </span>cv::Mat mat(height, width, CV_8UC3, info.data);</div><div class=""><span style="white-space:pre-wrap" class="">    </span>cv::imshow("Output", mat);</div><div class=""><span style="white-space:pre-wrap" class="">       </span>//gst_buffer_unmap(buffer, &info);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">      </span>GST_BUFFER_PTS(buffer) = timestamp;</div><div class=""><span style="white-space:pre-wrap" class="">        </span>GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 2);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">  </span>timestamp += GST_BUFFER_DURATION(buffer);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">   </span>g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);</div><div class=""><span style="white-space:pre-wrap" class="">  </span>//gst_buffer_unref(buffer);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class=""> </span>if (ret != GST_FLOW_OK) {</div><div class=""><span style="white-space:pre-wrap" class="">          </span>/* something wrong, stop pushing */</div><div class=""><span style="white-space:pre-wrap" class="">                </span>g_main_loop_quit(loop);</div><div class=""><span style="white-space:pre-wrap" class="">    </span>}</div><div class="">}</div><div class=""><br class=""></div><div class="">gint</div><div class="">main(gint   argc,</div><div class=""><span style="white-space:pre-wrap" class="">     </span>gchar *argv[])</div><div class="">{</div><div class=""><span style="white-space:pre-wrap" class="">  </span>GstElement *pipeline, *appsrc, *conv, *videosink;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">   </span>/* init GStreamer */</div><div class=""><span style="white-space:pre-wrap" class="">       </span>gst_init(&argc, &argv);</div><div class=""><span style="white-space:pre-wrap" class="">    </span>loop = g_main_loop_new(NULL, FALSE);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">        </span>/* setup pipeline */</div><div class=""><span style="white-space:pre-wrap" class="">       </span>pipeline = gst_pipeline_new("pipeline");</div><div class=""><span style="white-space:pre-wrap" class=""> </span>appsrc = gst_element_factory_make("appsrc", "source");</div><div class=""><span style="white-space:pre-wrap" class=""> </span>conv = gst_element_factory_make("videoconvert", "conv");</div><div class=""><span style="white-space:pre-wrap" class="">       </span>videosink = gst_element_factory_make("autovideosink", "videosink");</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">     </span>/* setup */</div><div class=""><span style="white-space:pre-wrap" class="">        </span>g_object_set(G_OBJECT(appsrc), "caps",</div><div class=""><span style="white-space:pre-wrap" class="">           </span>gst_caps_new_simple("video/x-raw",</div><div class=""><span style="white-space:pre-wrap" class="">                       </span>"format", G_TYPE_STRING, "RGB",</div><div class=""><span style="white-space:pre-wrap" class="">                        </span>"width", G_TYPE_INT, 134,</div><div class=""><span style="white-space:pre-wrap" class="">                        </span>"height", G_TYPE_INT, 134,</div><div class=""><span style="white-space:pre-wrap" class="">                       </span>"framerate", GST_TYPE_FRACTION, 1, 1,</div><div class=""><span style="white-space:pre-wrap" class="">                    </span>NULL), NULL);</div><div class=""><span style="white-space:pre-wrap" class="">      </span>gst_bin_add_many(GST_BIN(pipeline), appsrc, conv, videosink, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>gst_element_link_many(appsrc, conv, videosink, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">      </span>//g_object_set (videosink, "device", "/dev/video0", NULL);</div><div class=""><span style="white-space:pre-wrap" class="">     </span>/* setup appsrc */</div><div class=""><span style="white-space:pre-wrap" class=""> </span>g_object_set(G_OBJECT(appsrc),</div><div class=""><span style="white-space:pre-wrap" class="">             </span>"stream-type", 0,</div><div class=""><span style="white-space:pre-wrap" class="">                </span>"format", GST_FORMAT_TIME, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>g_signal_connect(appsrc, "need-data", G_CALLBACK(cb_need_data), NULL);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">    </span>/* play */</div><div class=""><span style="white-space:pre-wrap" class=""> </span>gst_element_set_state(pipeline, GST_STATE_PLAYING);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>g_main_loop_run(loop);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">      </span>if (gst_element_set_state(pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)</div><div class=""><span style="white-space:pre-wrap" class="">   </span>{</div><div class=""><span style="white-space:pre-wrap" class="">          </span>g_printerr("Unable to set the pipeline to the playing state.\n");</div><div class=""><span style="white-space:pre-wrap" class="">        </span>}</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">   </span>// Free resources</div><div class=""><span style="white-space:pre-wrap" class="">  </span>gst_object_unref(GST_OBJECT(pipeline));</div><div class=""><span style="white-space:pre-wrap" class="">    </span>g_main_loop_unref(loop);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">    </span>return 0;</div><div class="">}</div></div><div class="">//----------------------------------------------------------------------------------------------</div><div class=""><br class=""></div><div class="">It still does not work as expected. It would be a great help if you could point out where I am going wrong.</div><div class="">Thanks!!</div></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Mar 13, 2019 at 7:40 PM Michael Gruner <<a href="mailto:michael.gruner@ridgerun.com" target="_blank" class="">michael.gruner@ridgerun.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto" class="">Hi Saurabh<div class=""><br class=""></div><div class="">Yo may convert from a cv::Mat to a GstBuffer without a memory copy by using gst_buffer_new_wrapped:</div><div class=""><br class=""></div><div class=""><a href="https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#gst-buffer-new-wrapped" target="_blank" class="">https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#gst-buffer-new-wrapped</a></div><div class=""><br class=""></div><div class="">Something like: <br class="">buffer = gst_buffer_new_wrapped (mat.data, mat.total()*mat.elemSize());</div><div class=""><br class=""></div><div class="">In order to make a cv::Mat from a GstBuffer you first need to take the data out of the buffer. </div><div class=""><br class=""></div><div class="">GstMapInfo info;</div><div class="">gst_buffer_map (buffer, &info, GST_MAP_READ); // or write</div><div class="">mat = cv::Mat(height, width, CV_8C3, map.data); // change your format accordingly</div><div class="">...</div><div class="">gst_buffer_unmap (buffer, &info);</div><div class=""><br class=""></div><div class="">Hope it helps.</div><div class=""><br class=""></div><div class=""><div id="gmail-m_7923909520158695290gmail-m_3626855293976323275AppleMailSignature" dir="ltr" class="">Michael</div><div id="gmail-m_7923909520158695290gmail-m_3626855293976323275AppleMailSignature" dir="ltr" class=""><a href="http://www.ridgerun.com/" target="_blank" class="">www.ridgerun.com</a></div><div dir="ltr" class=""><br class="">On Mar 13, 2019, at 7:15 AM, Saurabh Bora <<a href="mailto:saurabh9bora@gmail.com" target="_blank" class="">saurabh9bora@gmail.com</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class="">Hi Experts!!, <div class=""><br class=""></div><div class="">I am trying to read opencv images locally and push them into gstreamer pipeline. I am using appsrc element with "need-data" signal attached to call-back function.</div><div class="">Please look at the code below. </div><div class=""><br class=""></div><div class="">//------------------------------------------------------------------------------------------------------</div><div class=""><div class="">#include <gst/gst.h></div><div class="">#include <opencv2/opencv.hpp></div><div class="">#include <opencv2/highgui.hpp></div><div class=""><br class=""></div><div class="">static GMainLoop *loop;</div><div class=""><br class=""></div><div class="">static void</div><div class="">cb_need_data(GstElement *appsrc,</div><div class=""><span style="white-space:pre-wrap" class="">   </span>guint       unused_size,</div><div class=""><span style="white-space:pre-wrap" class="">       </span>gpointer    user_data)</div><div class="">{</div><div class=""><span style="white-space:pre-wrap" class="">        </span>static GstClockTime timestamp = 0;</div><div class=""><span style="white-space:pre-wrap" class=""> </span>GstBuffer *buffer;</div><div class=""><span style="white-space:pre-wrap" class=""> </span>guint size, depth, height, width, step, channels;</div><div class=""><span style="white-space:pre-wrap" class="">  </span>GstFlowReturn ret;</div><div class=""><span style="white-space:pre-wrap" class=""> </span>guchar *data1;</div><div class=""><span style="white-space:pre-wrap" class="">     </span>GstMapInfo map;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">     </span>cv::Mat img = cv::imread("C:/Users/212730892.LOGON/Desktop/lena.jpg");</div><div class=""><span style="white-space:pre-wrap" class="">   </span>height = img.size().height;</div><div class=""><span style="white-space:pre-wrap" class="">        </span>width = img.size().width;</div><div class=""><span style="white-space:pre-wrap" class="">  </span>//step = img.widthStep;</div><div class=""><span style="white-space:pre-wrap" class="">    </span>channels = img.channels();</div><div class=""><span style="white-space:pre-wrap" class=""> </span>//depth = img->depth;</div><div class=""><span style="white-space:pre-wrap" class="">   </span>data1 = (guchar *)img.data;</div><div class=""><span style="white-space:pre-wrap" class="">        </span>size = height * width* channels;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">    </span>// Copy cv::Mat to GstBuffer</div><div class=""><span style="white-space:pre-wrap" class="">       </span>buffer = gst_buffer_new_allocate(NULL, size, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>gst_buffer_map(buffer, &map, GST_MAP_WRITE);</div><div class=""><span style="white-space:pre-wrap" class="">   </span>memcpy((guchar *)map.data, data1, gst_buffer_get_size(buffer));</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">     </span>//Convert GstBuffer back to cv::Mat and write it, to check if data was correctly copied. //This is where I get to know that data is not correct.</div><div class=""><span style="white-space:pre-wrap" class="">   </span>cv::Mat img2(cv::Size(134, 134), CV_8UC3, (char*)(buffer));</div><div class=""><span style="white-space:pre-wrap" class="">        </span>cv::imwrite("C:/Users/212730892.LOGON/Desktop/dummy1.jpg", img2);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class=""> </span>GST_BUFFER_PTS(buffer) = timestamp;</div><div class=""><span style="white-space:pre-wrap" class="">        </span>GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 2);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">  </span>timestamp += GST_BUFFER_DURATION(buffer);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">   </span>g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);</div><div class=""><span style="white-space:pre-wrap" class="">  </span>//gst_buffer_unref(buffer);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class=""> </span>if (ret != GST_FLOW_OK) {</div><div class=""><span style="white-space:pre-wrap" class="">          </span>/* something wrong, stop pushing */</div><div class=""><span style="white-space:pre-wrap" class="">                </span>g_main_loop_quit(loop);</div><div class=""><span style="white-space:pre-wrap" class="">    </span>}</div><div class="">}</div><div class=""><br class=""></div><div class="">gint</div><div class="">main(gint   argc,</div><div class=""><span style="white-space:pre-wrap" class="">     </span>gchar *argv[])</div><div class="">{</div><div class=""><span style="white-space:pre-wrap" class="">  </span>GstElement *pipeline, *appsrc, *conv, *videosink;</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">   </span>/* init GStreamer */</div><div class=""><span style="white-space:pre-wrap" class="">       </span>gst_init(&argc, &argv);</div><div class=""><span style="white-space:pre-wrap" class="">    </span>loop = g_main_loop_new(NULL, FALSE);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">        </span>/* setup pipeline */</div><div class=""><span style="white-space:pre-wrap" class="">       </span>pipeline = gst_pipeline_new("pipeline");</div><div class=""><span style="white-space:pre-wrap" class=""> </span>appsrc = gst_element_factory_make("appsrc", "source");</div><div class=""><span style="white-space:pre-wrap" class=""> </span>conv = gst_element_factory_make("videoconvert", "conv");</div><div class=""><span style="white-space:pre-wrap" class="">       </span>videosink = gst_element_factory_make("autovideosink", "videosink");</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">     </span>/* setup */</div><div class=""><span style="white-space:pre-wrap" class="">        </span>g_object_set(G_OBJECT(appsrc), "caps",</div><div class=""><span style="white-space:pre-wrap" class="">           </span>gst_caps_new_simple("video/x-raw",</div><div class=""><span style="white-space:pre-wrap" class="">                       </span>"format", G_TYPE_STRING, "RGB",</div><div class=""><span style="white-space:pre-wrap" class="">                        </span>"width", G_TYPE_INT, 134,</div><div class=""><span style="white-space:pre-wrap" class="">                        </span>"height", G_TYPE_INT, 134,</div><div class=""><span style="white-space:pre-wrap" class="">                       </span>"framerate", GST_TYPE_FRACTION, 1, 1,</div><div class=""><span style="white-space:pre-wrap" class="">                    </span>NULL), NULL);</div><div class=""><span style="white-space:pre-wrap" class="">      </span>gst_bin_add_many(GST_BIN(pipeline), appsrc, conv, videosink, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>gst_element_link_many(appsrc, conv, videosink, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">      </span>//g_object_set (videosink, "device", "/dev/video0", NULL);</div><div class=""><span style="white-space:pre-wrap" class="">     </span>/* setup appsrc */</div><div class=""><span style="white-space:pre-wrap" class=""> </span>g_object_set(G_OBJECT(appsrc),</div><div class=""><span style="white-space:pre-wrap" class="">             </span>"stream-type", 0,</div><div class=""><span style="white-space:pre-wrap" class="">                </span>"format", GST_FORMAT_TIME, NULL);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>g_signal_connect(appsrc, "need-data", G_CALLBACK(cb_need_data), NULL);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">    </span>/* play */</div><div class=""><span style="white-space:pre-wrap" class=""> </span>gst_element_set_state(pipeline, GST_STATE_PLAYING);</div><div class=""><span style="white-space:pre-wrap" class="">        </span>g_main_loop_run(loop);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">      </span>if (gst_element_set_state(pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)</div><div class=""><span style="white-space:pre-wrap" class="">   </span>{</div><div class=""><span style="white-space:pre-wrap" class="">          </span>g_printerr("Unable to set the pipeline to the playing state.\n");</div><div class=""><span style="white-space:pre-wrap" class="">        </span>}</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">   </span>// Free resources</div><div class=""><span style="white-space:pre-wrap" class="">  </span>gst_object_unref(GST_OBJECT(pipeline));</div><div class=""><span style="white-space:pre-wrap" class="">    </span>g_main_loop_unref(loop);</div><div class=""><br class=""></div><div class=""><span style="white-space:pre-wrap" class="">    </span>return 0;</div><div class="">}</div></div><div class=""><div class="">//-------------------------------------------------------------------------------------------------------------------------------------</div><div class=""><br class=""></div><div class="">In cb_need_data, the part where copying I am copying to GstBuffer seems to be wrong and it does not work as expected. </div><div class="">Can anyone, please help me understand, how can I copy the image data perfectly and pass it downstream to other elements without losing any data?</div><div class=""><br class=""></div>-- <br class=""><div dir="ltr" class="gmail-m_7923909520158695290gmail-m_3626855293976323275gmail_signature"><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class="">Thanks and Regards,</div><div dir="ltr" class="">Saurabh Bora<br class=""><div class=""><br class=""></div><div class="">PH NO : 7038166900</div><div class="">EMAIL : <a href="mailto:saurabh9bora@gmail.com" style="font-size:12.8px" target="_blank" class="">saurabh9bora@gmail.com</a></div><div class="">             <a href="mailto:saurabh9bora@outlook.com" target="_blank" class="">saurabh9bora@outlook.com</a></div></div></div></div></div></div></div></div></div></div></div></div>
</div></blockquote><blockquote type="cite" class=""><div dir="ltr" class=""><span class="">_______________________________________________</span><br class=""><span class="">gstreamer-devel mailing list</span><br class=""><span class=""><a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" class="">gstreamer-devel@lists.freedesktop.org</a></span><br class=""><span class=""><a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank" class="">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a></span></div></blockquote></div></div>_______________________________________________<br class="">
gstreamer-devel mailing list<br class="">
<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" class="">gstreamer-devel@lists.freedesktop.org</a><br class="">
<a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" rel="noreferrer" target="_blank" class="">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a></blockquote></div><br clear="all" class=""><div class=""><br class=""></div>-- <br class=""><div dir="ltr" class="gmail-m_7923909520158695290gmail_signature"><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class="">Thanks and Regards,</div><div dir="ltr" class="">Saurabh Bora<br class=""><div class=""><br class=""></div><div class="">PH NO : 7038166900</div><div class="">EMAIL : <a href="mailto:saurabh9bora@gmail.com" style="font-size:12.8px" target="_blank" class="">saurabh9bora@gmail.com</a></div><div class="">             <a href="mailto:saurabh9bora@outlook.com" target="_blank" class="">saurabh9bora@outlook.com</a></div></div></div></div></div></div></div></div></div>
</div></blockquote><blockquote type="cite" class=""><div dir="ltr" class=""><span class="">_______________________________________________</span><br class=""><span class="">gstreamer-devel mailing list</span><br class=""><span class=""><a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" class="">gstreamer-devel@lists.freedesktop.org</a></span><br class=""><span class=""><a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank" class="">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a></span></div></blockquote></div></div>_______________________________________________<br class="">
gstreamer-devel mailing list<br class="">
<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" class="">gstreamer-devel@lists.freedesktop.org</a><br class="">
<a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" rel="noreferrer" target="_blank" class="">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a></blockquote></div><br clear="all" class=""><div class=""><br class=""></div>-- <br class=""><div dir="ltr" class="gmail_signature"><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div class=""><div dir="ltr" class="">Thanks and Regards,</div><div dir="ltr" class="">Saurabh Bora<br class=""><div class=""><br class=""></div><div class="">PH NO : 7038166900</div><div class="">EMAIL : <a href="mailto:saurabh9bora@gmail.com" style="font-size:12.8px" target="_blank" class="">saurabh9bora@gmail.com</a></div><div class="">             <a href="mailto:saurabh9bora@outlook.com" target="_blank" class="">saurabh9bora@outlook.com</a></div></div></div></div></div></div></div></div></div></div>
_______________________________________________<br class="">gstreamer-devel mailing list<br class=""><a href="mailto:gstreamer-devel@lists.freedesktop.org" class="">gstreamer-devel@lists.freedesktop.org</a><br class="">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</div></blockquote></div><br class=""></div></body></html>