Convert CvMat to GstBuffer
Florian Echtler
floe at butterbrot.org
Mon Jun 12 09:08:41 UTC 2017
I'd recommend using gst_buffer_new_wrapped_full instead, that saves a buffer
copy. Here's an example I'm using with appsrc which works fine (warning:
hardcoded buffer size):
void buffer_destroy(gpointer data) {
cv::Mat* done = (cv::Mat*)data;
delete done;
}
GstFlowReturn prepare_buffer(GstAppSrc* appsrc, cv::Mat* frame) {
guint size = 1280 * 720 * 4;
GstBuffer *buffer = gst_buffer_new_wrapped_full( (GstMemoryFlags)0,
(gpointer)(frame->data), size, 0, size, frame, buffer_destroy );
return gst_app_src_push_buffer(appsrc, buffer);
}
Best regards, Florian
On 09.06.2017 00:34, raomayurs wrote:
> Hi,
> I am a newbie to gstreamer plugin development. I am trying to create a
> plugin using the tool provided by gstreamer. I am following the plugin
> writer's guide. I am trying to process data in the _chain function. I was
> able to successfully extract the video frame from GstBuffer and do my
> processing using openCV. But now I am unable to reconvert CvMat into
> GstBuffer.
>
> Here is my code:
>
> GBuffer* process_data(GstPad *sinkPad, GstMyFilter *filter, GstBuffer *buf)
> {
> //Get Height and width of input frame
> gint gheight, gwidth;
> static GstClockTime timestamp = 0;
> int height, width, channels = 3;
> GstCaps *caps = gst_pad_get_current_caps(sinkPad);
> GstStructure *str = gst_caps_get_structure (caps, 0);
> if (!gst_structure_get_int (str, "width", &gwidth)) {
> width = 1280;
> } else {
> width = (int) gwidth;
> }
> if (!gst_structure_get_int (str, "height", &gheight)) {
> height = 720;
> } else {
> height = (int) gheight;
> }
>
> // convert buffer to opencv mat
> GstMapInfo map;
> gst_buffer_map (buf, &map, GST_MAP_READ);
> CvMat frame_yuv = cvMat(height + height/2, width, CV_8UC1, map.data);
> CvMat *frame = cvCreateMat(height, width, CV_8UC3);
> cvCvtColor(&frame_yuv, frame, CV_YUV2RGB_YV12);
>
> // Process frame
> CvMat *r = cvCreateMat(height, width, CV_8UC1);
> CvMat *g = cvCreateMat(height, width, CV_8UC1);
> CvMat *b = cvCreateMat(height, width, CV_8UC1);
>
> CvMat cameraMatrix = cvMat(3, 3, CV_64F, filter->cameraMatrix);
> CvMat distortionCoefficients = cvMat(5, 1, CV_64F,
> filter->distortionCoefficients);
> CvMat *newcamera_matrix = cvCreateMat(3, 3, CV_64F);
> CvMat *r1 = cvCreateMat(height, width, CV_8UC1);
> CvMat *g1 = cvCreateMat(height, width, CV_8UC1);
> CvMat *b1 = cvCreateMat(height, width, CV_8UC1);
> CvMat *undistorted = cvCreateMat(height, width, CV_8UC3);
> CvSize imgSize = cvSize(width, height);
> cvGetOptimalNewCameraMatrix(&cameraMatrix, &distortionCoefficients,
> imgSize, 1.0, newcamera_matrix, imgSize, NULL, 0);
> cvSplit(frame, r,g,b, NULL);
> cvUndistort2(r, r1, &cameraMatrix, &distortionCoefficients,
> newcamera_matrix);
> cvUndistort2(g, g1, &cameraMatrix, &distortionCoefficients,
> newcamera_matrix);
> cvUndistort2(b, b1, &cameraMatrix, &distortionCoefficients,
> newcamera_matrix);
> cvMerge(1r,g1,b1, NULL, undistorted);
>
> //reconvert processed cvMat into GstBuffer
> GstMapInfo mapinfo;
> GstBuffer *buffer;
> gint size = height * width * channels;
> buffer = gst_buffer_new_allocate (NULL, size, NULL);
> gst_buffer_map (buffer, &mapinfo, GST_MAP_WRITE);
> memcpy( (guchar *)map.data, (guchar *)&(undistorted->data),
> gst_buffer_get_size( buffer ) );
> GST_BUFFER_PTS (buffer) = timestamp;
> GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND,
> 2);
>
> timestamp += GST_BUFFER_DURATION (buffer);
> return buffer;
> }
>
> The returned buffer is passed to the src pad of the filter. The above code
> is not creating the buffer correctly. Am I converting cvMat to GstBuffer
> correctly? Because the openCV part is working correctly. The undistorted
> matrix is as expected. But the conversion to GstBuffer is failing for some
> reason. Any help will be really appreciated.
>
> Thanks
>
>
>
> --
> View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Convert-CvMat-to-GstBuffer-tp4683259.html
> Sent from the GStreamer-devel mailing list archive at Nabble.com.
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
--
SENT FROM MY DEC VT50 TERMINAL
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170612/557793ad/attachment-0001.sig>
More information about the gstreamer-devel
mailing list