TL;DR
- PyroWave는 이더넷 기반 로컬 네트워크 게임 스트리밍에서 대역폭 부담보다 지연 최소화를 우선하는 인트라 전용 비디오 코덱임.
- Vulkan 컴퓨트 셰이더로 완전히 구현되며, 1080p에서 인코딩·디코딩 각각 약 0.1ms 미만, 4K에서 약 0.2ms 미만을 목표로 함.
- YCbCr 4:2:0·4:4:4, CDF 9/7 이산 웨이블릿 변환, 이미지별 최대 비트레이트를 정확히 지정하는 레이트 제어를 지원함.
- 계수 인코딩을 단순화해 병렬 처리 성능과 단일 패스 정확한 레이트 제어를 얻으며, 목표 비트레이트는 약 200Mbps 이상임.
- 64×64 계수 블록을 독립적으로 인코딩해 패킷 손실 복구에 강하며, PyroFling 통합 빌드와 독립 C API·Android 빌드·명령줄 도구를 제공함.
개요
- PyroWave는 사실상 정지 이미지 코덱에 가까운 인트라 전용 비디오 코덱으로, GPU에서 매우 빠르게 인코딩하도록 최적화됨.
- 1080p에서 인코딩과 디코딩 각각 약 0.1ms 미만, 4K에서 약 0.2ms 미만을 목표로 하며, Vulkan 컴퓨트 셰이더로 완전히 구현됨.
- 목표 비트레이트는 약 200Mbps 이상이며, 대역폭보다 지연 시간을 절대적으로 낮추는 일이 중요한 이더넷 기반 로컬 네트워크 게임 스트리밍을 대상으로 함.
- PyroFling 프로젝트의 일부로 통합됨.
- 2014년 석사 논문과 범위가 비슷하지만, 현재 사용 사례는 원시 비디오를 이더넷 링크에 맞추는 대신 게임 스트리밍에 초점을 둠.
색 공간
- 현재 YCbCr 4:2:0과 4:4:4를 구현함.
웨이블릿
- 이미지를 CDF 9/7 필터를 사용하는 이산 웨이블릿 변환(Discrete Wavelet Transform)으로 변환함.
- 이 방식은 기본적으로 JPEG2000과 동일함.
정확한 레이트 제어
- 인코더가 인코딩된 이미지의 최대 비트레이트를 정확한 값으로 지정할 수 있음.
단순한 ‘엔트로피’ 코딩
- 계수 인코딩은 일반적인 이미지 코덱에 비해 단순하며, 특히 압축률이 높을 때 비트레이트가 크게 증가하는 원인임.
- 이 단순성은 인코딩·디코딩을 크게 빠르게 하며, 처리의 병렬화가 매우 용이함.
- 이미지 전체에 대해 단일 패스로 정확한 레이트 제어를 수행할 수 있음.
- 이론상 인코딩된 비트플레인에 더 적절한 엔트로피 코더를 추가해 어느 정도 경쟁력 있는 압축을 달성할 수 있지만, 해당 방식은 검토되지 않았으며 범위에 포함되지 않음.
- 이 용도로는 High Throughput JPEG2000이 참고할 만한 대상임.
패킷 손실에 대한 복원력
- 인트라 전용 구조와 계수의 64×64 블록별 독립 인코딩으로 패킷 손실 후 복원력이 높음.
- PyroWave는 광섬유 링크를 통한 장거리 스트리밍에서 실전 테스트를 거침.
비트스트림 정의
- 비트스트림 정의는
docs/bitstream.md에 있음.
빌드
- 일반적인 경우 PyroWave는 Granite와 함께 PyroFling의 일부로 빌드하도록 설계됨.
독립형 C API
- 이 API는 개발 중이며, API·ABI가 아직 안정적이지 않음.
- Granite의 일부를 체크아웃해야 하며,
checkout_granite.sh스크립트를 사용함. - CMake와 Ninja로 일반 빌드를 수행하고 설치하면 C API가 설치됨.
- 빌드 설정은 설치 접두 경로를
output으로, 빌드 유형을Release로 지정하며, 설치 결과에는pyrowave.h, 공유 라이브러리, CMake 설정 파일과 pkg-config 파일이 포함됨. - Linux, MinGW, msys2, MSVC에서 빌드를 테스트함.
pyrowave-c-test는 공유 C API를 단위 테스트하며, API의 기본 사용 안내 역할도 함.build-steamrt.sh를 사용해 Sniper SDK를 대상으로 빌드하는 방식도 지원됨.
Android 독립형 빌드
- NDK가 설치된 환경을 전제로 함.
- 확인된 NDK 버전은
29.0.14206865이며, 이론상 모든 NDK 버전이 동작할 수 있음. - Android CMake 툴체인 파일과
arm64-v8aABI를 지정하고 Ninja로 빌드·설치함.
로컬 개발 및 CLI
- 저장소의 예제·테스트 애플리케이션을 빌드하려면 CMake 실행 전에 전체 Granite를 체크아웃해야 함.
PYROWAVE_DEVEL=ON옵션을 지정하면 전체 개발 빌드를 생성함.
기본 인코더·디코더 CLI
- 기본 CLI는 Y4M 파일을 입력받아 원시 비트스트림으로 출력하며, 로컬 테스트용임.
- 인코더에
test.y4m,out.wave,400000을 지정하면 각 프레임의 최대 크기가 400KB인 원시 비트스트림을 생성함. - 디코더에 해당 비트스트림과 출력 파일
out.y4m을 지정하면 Y4M으로 디코딩함.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요