728x90
반응형
GStreamer로 작업을 하다보면, 파이프라인 구축을 위하여 생성된 항목들을 연결 (link)해주어야 합니다.
C에서는 gst_bin_add_many() 함수가 있어서 간단하게 구현이 가능한데, 파이썬에서는 해당 함수 대신 Element.link_many() 함수를 이용해야 합니다. 그래서 link_many() 함수가 어떻게 구현이 되어 있는지 궁금하여 찾아 보니, 다음과 같이 구현되어 있었습니다.
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, none)
return zip(a, b)
Gst.Element에 다음과 같이 link_many() 함수가 구현되어 있습니다.
class Element(Gst.Element):
@staticmethod
def link_many(*args):
'''
@raises: Gst.LinkError
'''
for pair in pairwise(args):
if not pair[0].link(pair[1]):
raise LinkError(
'Failed to link {} and {}'.format(pair[0], pair[1]))
다음과 같이 예제를 보면, 동작 이해가 더욱 쉬우실 겁니다.
from itertools import pairwise
class Element:
@staticmethod
def link_many(*args):
'''
@raises: Gst.LinkError
'''
for pair in pairwise(args):
print(f'pairwise to link {pair[0]} and {pair[1]}')
Element.link_many(1, 2, 3, 4, 5)
위 예제를 실행한 결과는 다음과 같습니다.
pairwise to link 1 and 2
pairwise to link 2 and 3
pairwise to link 3 and 4
pairwise to link 4 and 5
GStreamer에서 생성된 각 요소 (Element)를 서로 연결하여 파이프라인을 만들 때와 같이 앞 항목과 뒤 항목을 가지고 반복작업을 수행할 때 아주 유용한 pairwise() 함수였습니다.
"itertools" 패키지에 pairwise() 함수 말고도 생각보다 유용한 함수들이 꾀 있었습니다. 관심있으신 분은 아래의 참고자료를 확인해 보시면 도움이 되실 겁니다.
참고자료
- "itertools — Functions creating iterators for efficient looping":https://docs.python.org/3/library/itertools.html
'프로그래밍 > Python' 카테고리의 다른 글
[PyQt5] 사용자 위젯에서 배경 그리기 (0) | 2023.11.27 |
---|---|
[Qt] 창을 전체화면으로 표시하기 (0) | 2023.11.25 |
[Python] Flask 서버 멀티 스레드로 구동하기 (0) | 2023.11.10 |
[python] ModuleNotFoundError: No module named 'packaging' (0) | 2023.10.31 |
[python] Could not find a version that satisfies the requirement torch==1.11.0+cu113 (0) | 2023.10.01 |