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-v8a ABI를 지정하고 Ninja로 빌드·설치함.

로컬 개발 및 CLI

  • 저장소의 예제·테스트 애플리케이션을 빌드하려면 CMake 실행 전에 전체 Granite를 체크아웃해야 함.
  • PYROWAVE_DEVEL=ON 옵션을 지정하면 전체 개발 빌드를 생성함.

기본 인코더·디코더 CLI

  • 기본 CLI는 Y4M 파일을 입력받아 원시 비트스트림으로 출력하며, 로컬 테스트용임.
  • 인코더에 test.y4m, out.wave, 400000을 지정하면 각 프레임의 최대 크기가 400KB인 원시 비트스트림을 생성함.
  • 디코더에 해당 비트스트림과 출력 파일 out.y4m을 지정하면 Y4M으로 디코딩함.