Я пытаюсь реализовать функцию _chain плагина Gstreamer на основе его шаблона, которая просто заменяет входной видеокадр (BGRx) на мое преобразованное изображение того же размера, как показано ниже:
static GstFlowReturn gst_myplugin_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) {
Gstmyplugin *filter;
filter = GST_MYPLUGIN (parent);
if(filter->silent == FALSE)
g_print("I'm plugged, therefore I'm in. \n");
// retrieve pass-in image frame from input buf
GstMapInfo map;
gst_buffer_map(buf, &map, GST_MAP_READ);
cv::Mat frame(cv::Size(width, height), CV_8UC4, (char *)map.data, cv::Mat::AUTOSTEP); //Q1
// check the orignal frame
cv::imshow("Input image", frame); //Q2
// convert to new image by same size
cv::Mat out = my_convert(frame);
// how to populate output buffer from Mat out then
GstBuffer *out_buf = ??? //Q3
//return gst_pad_push(filter->srcpad, buf); transparent filter in plugin template
return gst_pad_push(filer->srcpad, out_buf); //send my converted image
}
Итак, есть три вопроса (также отмеченных в вышеупомянутых строках):
Q1: как получить ширину и высоту входного изображения?
Q2: почему проанализированное изображение не может быть отображено как что в видео?
Q3: как заполнить буфер вывода?
Я искал много онлайн в течение нескольких дней, но до сих пор не могу решить их.