GstCaps small TIP: How to handle GstFeatures

문자열에서 GstCapsFeatures를 포함한 GstCaps 다루기

Nvidia 계열의 임베디드 보드에서 GStreamer Pipeline을 사용하는 경우 다음과 같은 예제를 볼수 있습니다.

 $ gst-launch-1.0 nvcamerasrc ! video/x-raw(memory:NVMM),width=1920,height=1080 ! nvvidconv ! autovidoesink

memory:NVMM은 Zero-copy 기능을 활성화하기 위해서 GstCaps에 부가적으로 제공하는 메타정보(GstCapsFeatures)이나, API를 사용하여 GstCaps를 생성할 때는 GstCapsFeatures를 직접 다룰 필요가 있습니다.

이와 관련하여 주로 접하게되는 Assertion Error는 다음과 같습니다.

GStreamer-CRITICAL **: gst_structure_new_empty: assertion 'gst_structure_validate_name (name)' failed
convFilterCaps could not be created. Exiting.

위 에러는 대게 gst_caps_new_simple() 함수를 이용하여 video/x-raw(memory:NVMM)을 처리할 것으로 기대한 경우에 볼 수 있습니다. 이는 gst_caps_from_string("video/x-raw(memory:NVMM)", NULL)이 동작한 것과 같은 방식으로 처리될 것으로 예상하고 사용한 경우에 볼 수 있는 에러이며, 메타정보를 정확하기 다루기 위해서는 다음의 코드처럼 GstCapsFeatures 객체를 별도로 생성하여 처리해야합니다.

/**
 * gcc -o caps_features `pkg-config --cflags --libs gstreamer-1.0` caps_features.c
 */

int
main (int argc, char **argv)
{
  GstCaps *a_caps, *b_caps;
  GstCapsFeatures *a_f, *b_f;

  gst_init (&argc, &argv);

  a_caps = gst_caps_from_string ("video/x-raw(memory:NVMM)");
  a_f = gst_caps_get_features (a_caps, 0);

  b_caps = gst_caps_new_simple ("video/x-raw", NULL);
  b_f = gst_caps_features_new ("memory:NVMM", NULL);

  gst_caps_set_features_simple (b_caps, b_f);

  g_print ("caps objects are %s\n", gst_caps_is_equal (a_caps,
          b_caps) ? "equal" : "*not* equal");

  gst_caps_unref (a_caps);
  gst_caps_unref (b_caps);

  return 0;
}