Pipeline OpenCV Mat (which includes 8 bit RGB data from IP camera) to GStreamer
Rashmi
pulgamrashmi at gmail.com
Tue Jul 16 11:56:40 UTC 2019
Hello,
Please check whether the following code is correct as I'm new to GStreamer.
I'm trying to create a pipeline from the data obtained by IP camera through
OpenCV which is present in cv::Mat (Mat includes 8bit RGB data of the
camera) and stream it through udp by encoding it using VP8.
Please provide inputs with explanations so that I can understand as I'm
learning GStreamer.
//destroy the cv::Mat buffer
void buffer_destroy(gpointer data) {
cv::Mat* done = (cv::Mat*)data;
delete done;
}
//create pipeline from cv::Mat
int createGStreamerPipeline ( cv::Mat *frame )
{
GstElement *pipeline, *source, *filter, *encode, *pay, *udp;
GstAppSrc *appsrc;
GstCaps *filtercaps;
GstBus *bus;
GstMessage *msg;
GMainLoop *loop;
GstStateChangeReturn ret;
static GstClockTime timestamp = 0;
GstBuffer *buffer;
int buffer_size;
GstFlowReturn flowRet;
//initialize all elements
// gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("pipeline");
// source = gst_element_factory_make ("v4l2src", "source");
source = gst_element_factory_make ( "appsrc", "source" );
filter = gst_element_factory_make ("capsfilter", "filter");
encode = gst_element_factory_make ("vp8enc", "encode");
pay = gst_element_factory_make ("rtpvp8pay", "pay");
udp = gst_element_factory_make ("udpsink", "udp");
//creating source
/*buffer = gst_buffer_new_and_alloc ( ( gsize ) frame.size( ) );
GST_BUFFER_TIMESTAMP (buffer) = timestamp;
GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (frame.size( ),
GST_SECOND, 2);
timestamp += GST_BUFFER_DURATION (buffer);
g_signal_emit_by_name (frame.data->appsrc, "push-buffer", buffer,
&flowRet);
gst_buffer_unref ( buffer );
frame.data->appsrc = source; */
buffer_size = frame->cols * frame->rows * frame->channels( );
buffer = gst_buffer_new_wrapped_full( (GstMemoryFlags)0,
(gpointer)(frame->data), buffer_size, 0, buffer_size, frame, buffer_destroy
);
gst_app_src_push_buffer ( GST_APP_SRC ( appsrc ), buffer);
//check for null objects
if (!pipeline || !source || !filter || !encode || !pay || !udp) {
std::cout << "Failed to create all elements :" << std::endl;
std::cout << " pipeline : " << !pipeline << std::endl;
std::cout << "source : " << !source << std::endl;
std::cout << "filter : " << !filter << std::endl;
std::cout << "encode : " << !encode << std::endl;
std::cout << "pay : " << !pay << std::endl;
std::cout << "udp : " << !udp << std::endl;
return -1;
}
//set video source
// g_object_set (G_OBJECT (source), "device", "/dev/video1", NULL);
std::cout << "==>set video source." << std::endl;
g_object_set (G_OBJECT (udp), "host", "10.0.0.6", NULL);
g_object_set (G_OBJECT (udp), "port", 5004, NULL);
std::cout << "==>set video sink." << std::endl;
filtercaps = gst_caps_new_simple ("video/x-raw",
"format", G_TYPE_STRING, "RGB",
"width", G_TYPE_INT, 640,
"height", G_TYPE_INT, 480,
"pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
"framerate", GST_TYPE_FRACTION, 30, 1,
NULL);
g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
gst_caps_unref (filtercaps);
//add all elements together
gst_bin_add_many (GST_BIN (pipeline), source, filter, encode, pay, udp,
NULL);
if (gst_element_link_many (source, filter, encode, pay, udp, NULL) != TRUE
) {
std::cout << "Elements could not be linked." << std::endl;
gst_object_unref (pipeline);
return -1;
}
//set the pipeline state to playing
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
if (ret == GST_STATE_CHANGE_FAILURE) {
std::cout << "Unable to set the pipeline to the playing state." <<
std::endl;
gst_object_unref (pipeline);
return -1;
}
std::cout << "==>set video to play." << std::endl;
//get pipeline's bus
bus = gst_element_get_bus (pipeline);
std::cout << "==>setup bus." << std::endl;
loop = g_main_loop_new (NULL, FALSE);
std::cout << "==>begin stream." << std::endl;
g_main_loop_run (loop);
g_main_loop_unref (loop);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
More information about the gstreamer-devel
mailing list