2013. 7. 24. 11:42ㆍMultiMedia Framework/GStreamer
element가 생성되었다고 해서 곧바로 어떤 작업을 수행하는 것은 아니다. element의 상태를 변경해야 할 필요가 있다.
element는 총 4 가지 상태로 나눌 수 있으며, 다음과 같다.
GST_STATE_NULL
- default 상태. 이 상태에서는 어떤 resource도 할당 받지 못한 상태이다.
- reference count가 0이거나 free 상태일때 element는 반드시 NULL 상태를 유지해야 한다.
GST_STATE_READY
- ready 상태. element가 resource를 막 할당받은 상태이다. 이 말인 즉, buffer등의 resource가 Stream 내에 보존되고 있다는 말이다.
- 하지만 이 상태에서는 Stream이 열려있지는 않다. 그래서 stream 위치는 자동적으로 0이 된다.
- 만약 이전 상태에서 Stream이 열려 있었다면, 이상태에서는 Stream이 닫혀야 되고, Stream 위치나 프로퍼티도 재설정 되어야 한다.
GST_STATE_PAUSED
- 이 상태에서는 Stream이 열려 있기는 하지만, 동작하고 있지는 않다.
- element가 스트림의 위치를 변경하는 등의 상태 변화는 허락하지만, 데이터를 재생시키는 것은 허락하지 않는다.
- clock이 동작하지 않는다는 것을 빼면 PLAYING 상태와 동일하다.
GST_STATE_PLAYING
- PLAYING 상태. clock이 현재 동작하고 있다는 것을 제외하고는 PAUSE 상태와 동일하다.
gst_element_set_state() 함수를 통하여 element의 상태를 변경할 수 있다. 만약 사용자가 element의 상태를 NULL에서 PLAYING으로 변경한다면, GStreamer 내부에서는 READY와 PAUSED 상태를 모두 거쳐서 PLAYING 상태로 변경할 것이다.
"pad-added" 나 "new-decoded-pad" 등의 signal callback을 통해 이미 동작중인 pipeline에 동적으로 element를 추가하려고 한다면, gst_element_set_state()나 gst_element_sync_state_with_parent() 함수를 사용하여 해당 element의 상태를 변경해야 한다.