как разобрать изображение между GstBuffer и Mat в функции цепочки плагинов Gstreamer - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь реализовать функцию _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: как заполнить буфер вывода?

Я искал много онлайн в течение нескольких дней, но до сих пор не могу решить их.

...