8.2. 패드의 캐퍼빌리티

패드는 엘리먼트가 밖으로 보이는데 아주 중요한 역할을 하므로, 메커니즘은 캐퍼빌리티를 이용해 패드 간 데이터의 흐름을 표현해야 합니다. 여기서는 캐퍼빌리티가 무엇인지, 그리고 어떻게 사용하는지를 개념을 이해할 정도로 충분한 정도로만 간단히 설명할 것입니다. 캐퍼빌리티를 깊게 보고, GStreamer에서 지원하는 모든 캐퍼빌리티 정의 리스트를 확인하고 싶다면, 플러그인 작성 안내(Plugin Writers Guide)를 참고하세요.

캐퍼빌리티는 패드 탬플릿과 패드에 붙습니다. 패드 템플릿의 경우, 템플릿으로 생성된 패드를 통해 흐르는 미디어의 타입을 설명해야 합니다. 패드의 경우, 패드가 아직 네고시에이션이 완료되지 않았을 때는 가능한 캐퍼빌리티(보통 패드 템플릿에서 복사)를 나타내고, 패드가 네고시에이션을 완료했을 때는 현재 흐르는 데이터의 미디어 타입을 나타낼 수 있습니다.

 

8.1.2. 캐퍼빌리티 해부

패드의 캐퍼빌리티는 GstCaps 오브젝트에 나와있습니다. 내부적으로 GstCaps는 하나 이상의 GstStructure를 가지고 있고, GstStructure는 하나의 미디어 타입을 서술합니다. 네고시에디티드 패드는 딱 하나의 구조체(Structure)를 가지고 있습니다. 또한 이 구조체는 고정된 하나의 값을 가집니다. 이런 제약은 네고시에이션이 안된 패드나 패드 템플릿에는 적용되지 않습니다.

예를 들어, 아래에 gst-inspect vorbisdec 명령을 실행하면 확일한 수 있는  ‘vorbisdec’ 엘리먼트의 캐퍼빌리티 덤프가 있습니다. 두 개의 패드(소스와 싱크 패드)를 확인할 수 있습니다. 두 패드는 항상 사용 가능하고, 캐퍼빌리티가 있습니다. 싱크 패드는 vorbis로 인코딩 된 오디오 데이터(audio/x-vorbis)를 받을 수 있습니다. 소스 패드는 디코딩 된 로우 오디오 샘플(auido/x-raw)을 다음 엘리먼트에 전달하기 위해 사용합니다. 또한 소스 패드는 오디오 샘플레이트, 채널 수 등의 프로퍼티를 담고 있습니다.

 

8.2.2. 프로퍼티와 값(value)

프로퍼티는 캐퍼빌리티의 추가 정보를 서술하기 위해 쓰입니다. 프로퍼티는 키(스트링)와 값으로 구성됩니다. 사용가능한 여러 값의 타입이 있습니다.

  • 기본 타입은 Glib에 GType으로 등록된 값과 거의 유사합니다. 이 프로퍼티는 특정하고 다이나믹하지 않은 프로퍼티 값을 가집니다.
    • int 값 (G_TYPE_INT) : 정확한 값을 가짐
    • boolean 값 (G_TYPE_BOOLEAN) : 참, 거짓 값을 가짐
    • float 값 (G_TYPE_FLOAT) : 정확한 float형 값을 가짐
    • string 값 (G_TYPE_STRING) : UTF-8 문자열을 가짐
    • fraction값 (G_TYPE_FRACTION) : 정수로 표현되는 분수값을 가짐
  • 범위(range) 타입은 값의 범위 표현을 위해 GStreamer에 등록된 GType입니다. 오디오 샘플레이트나 비디오 사이즈 표현을 위해 사용됩니다. GStreamer는 두 가지 타입을 정의합니다.
    • int 범위 값  (G_TYPE_INT_RANGE) : 정수로 표현되는 범위 값. 값의 최소와 최대값으로 알려줌
    • float범위 값  (G_TYPE_FLOAT_RANGE) : float으로 표현되는 범위 값. 값의 최소와 최대값으로 알려줌
    • fraction범위 값  (G_TYPE_FRACTION_RANGE) : 분수로 표현되는 범위 값. 값의 최소와 최대값으로 알려줌
  • 리스트 값 (G_TYPE_LIST) : 프로퍼티는 기본 값을 담은 모든 값의 리스트를 가질 수 있습니다.
    • 리스트 값의 예 : 샘플레이트 44100MHz와 48000MHz로 표현되는 캡은하나의 값은 44100이고, 다른 하나는 48000 값을 가지는  int 값의 리스트를 지원합니다.
  • 배열 값 (G_TYPE_ARRAY) : 배열값을 가지는 프로퍼티. 배열에 들어있는 각 값은 전체 값이 됩니다. 배열에 있는 모든 값은 같은 엘리먼트 타입이어야 합니다. 이 말의 의미는 배열은 정수의 조합, 정수의 리스트, 정수 범위를 함께 가질 수 있고, 이것은 float이나 문자열에서도 동일하니다. 그러나 float과 int 값을 동시에 가질 수 없습니다.
    • 배열 값의 예 : 오디오의 경우, 두 개 이상의 채널이 채널 레이아웃에 지정될 수 있습니다(하나 혹은 두 개의 채널은 가지는 오디오 레이아웃은 캡에 명시하지 않는 한은 암묵적으로 처리됨). 따라서 채널 레이아웃은 스피커의 위치를 나타내는 int emun 값을 가진 배열로 표현됩니다. 리스트 값과는 달리 배열의 값은 전체로 해석이 되어야 합니다.


Posted by _유부남J군_