如何测试gstreamer插件对多种视频格式的支持

如何测试gstreamer插件对多种视频格式的支持,gstreamer,Gstreamer,我使用v0.10.34 gstreamer核心、插件库等。。。 我开发了一个简单的过滤器来修改Y组件,但我想处理所有的视频格式,而不使用视频解码和我的过滤器之间的颜色空间转换器 现在,我使用以下cmd来测试我的过滤器: ../../Build/lin64_release/bin/gst-launch-0.10 -v filesrc location=input.mp4 ! decodebin2 name=dec ! ffmpegcolorspace ! myfilter silent=1 ! t

我使用v0.10.34 gstreamer核心、插件库等。。。 我开发了一个简单的过滤器来修改Y组件,但我想处理所有的视频格式,而不使用视频解码和我的过滤器之间的颜色空间转换器

现在,我使用以下cmd来测试我的过滤器:

../../Build/lin64_release/bin/gst-launch-0.10 -v filesrc location=input.mp4 ! decodebin2 name=dec ! ffmpegcolorspace ! myfilter silent=1 ! tee name=t \ t. ! queue ! filesink location=test.yuv \ t. ! queue ! ffmpegcolorspace ! ximagesink
我的第一个问题是,如何强制/设置特定的cap(视频格式)作为过滤器的输入

第二个问题是,如果我只使用YUY2UYVY作为模板来创建src和sink pad,为什么我会获得与I420格式的连接


欢迎所有关于这些主题的想法和好的url。

对于第一个问题,
\u set\u caps
功能似乎负责接受或拒绝与给定caps的连接。为了实现这一点,我使用了一组受支持的CAP(定义为
GstStaticCaps
),并在我的
\u set\u caps
功能中检查了我收到的CAP与我用作模板的GstStaticCaps的交点

static gboolean 
gst_myfilter_set_caps (GstPad * pad, GstCaps * caps)
{
  Gstmyfilter *filter;
  GstVideoFormat format;
  int i, w, h;
  gboolean isSupported;

  filter = GST_NGPTVSTUB (gst_pad_get_parent (pad));

  if(!gst_video_format_parse_caps(caps, &format, &w, &h)) {
    if (filter->silent == FALSE) {
      g_print("Unable to get video format from caps\n");
    }
    return FALSE;
  }

  isSupported = FALSE;
  for (i = 0; i < G_N_ELEMENTS (gst_myfilter_video_format_caps); i++) {
    if(gst_caps_can_intersect(caps, gst_static_caps_get(&gst_myfilter_video_format_caps[i]))) {
      isSupported = TRUE;
      break;
    }
  }

  if(!isSupported) {
    if (filter->silent == FALSE) {
      g_print("that caps is not supported\n");
    }
    return FALSE;
  }

对于第一个问题,似乎由
\u set\u caps
函数负责接受或拒绝与给定caps的连接。为了实现这一点,我使用了一组受支持的CAP(定义为
GstStaticCaps
),并在我的
\u set\u caps
功能中检查了我收到的CAP与我用作模板的GstStaticCaps的交点

static gboolean 
gst_myfilter_set_caps (GstPad * pad, GstCaps * caps)
{
  Gstmyfilter *filter;
  GstVideoFormat format;
  int i, w, h;
  gboolean isSupported;

  filter = GST_NGPTVSTUB (gst_pad_get_parent (pad));

  if(!gst_video_format_parse_caps(caps, &format, &w, &h)) {
    if (filter->silent == FALSE) {
      g_print("Unable to get video format from caps\n");
    }
    return FALSE;
  }

  isSupported = FALSE;
  for (i = 0; i < G_N_ELEMENTS (gst_myfilter_video_format_caps); i++) {
    if(gst_caps_can_intersect(caps, gst_static_caps_get(&gst_myfilter_video_format_caps[i]))) {
      isSupported = TRUE;
      break;
    }
  }

  if(!isSupported) {
    if (filter->silent == FALSE) {
      g_print("that caps is not supported\n");
    }
    return FALSE;
  }