Raph Levien, RP2350 DVI 실험에서 출발한 초고속 복호화 이미지 포맷 nibnib 공개
- Raph Levien이 RP2350 마이크로컨트롤러의 DVI 출력 실험에서 출발한 이미지 포맷 nibnib을 GitHub에 공개함. 픽셀당 약 6사이클 예산에서 픽셀 페치와 팔레트 조회, 라인 버퍼 저장이 겨우 들어가는 기기를 겨냥함.
- 팔레트에 절대 색이 아니라 델타를 저장해 부드러운 영역의 품질을 끌어올렸고, 입력 1바이트에서 픽셀 2개를 복호화해 4bpp 압축을 달성함.
- 복호화는 지난 픽셀을 두 배로 키운 값에 팔레트에서 읽은 32비트 값을 더해 RGB565 픽셀 2개를 만드는 방식이며, 하위 16비트가 왼쪽 픽셀임.
- 복호화는 단순하고 결정적이지만 인코딩 선택지가 많아 비대칭 구조이며, Floyd-Steinberg 디더링으로 양자화 오차를 이웃 픽셀로 넘겨 드리프트를 막음.
- Adafruit Fruit Jam 보드에서 SD 카드로 640x480 영상을 60fps로 스트리밍하는 데모가 있고, 디코더는 새 저수준 언어 symbolasm으로 작성됨.
Hacker News 의견들
Amiga HAM 비디오 모드가 은근히 떠오르네. 가로로 색 번지는 느낌이 비슷함.
이걸 compression이라고 부르는 건 좀 무리인 듯. 델타 코딩 필터에 팔레트화가 전부잖아. 근데 이게 잘 된다는 게 신기하긴 해. 복호화기가 델타를 풀어야 하니 오차가 쌓일 거라 생각했는데, Floyd-Steinberg 디더링 얘기가 나오는 걸 보면 그걸로 잡는 모양.
Floyd-Steinberg는 양자화 오차를 100% 이웃 픽셀로 넘기니까 드리프트가 없는 게 그렇게 놀랍진 않아. Atkinson은 75%만 남기고. 색 축 여러 개 추적하는 건 오차를 3벡터로 보고 크기 최소화하는 거겠지. 임베디드 CPU용 코딩 연습으로 보는 게 맞는 것 같고, 그래도 인상적임.
RP2350에 맞춰 최적화한 게 파이프라인 깊고 SIMD 넓은 최신 데스크톱 코어에서도 최적일 리는 없지.
맞음. 리소스 제약이 심한 기기용으로 만든 거라서. 헷갈릴 만하면 README를 고치겠음.
속도를 강조하면서 JPEG 상대 수치를 안 보여주는 건 좀 아쉬움. BCx도 사실 같은 팔레트/코드북 방식인데 두 팔레트 항목 사이를 보간해서 더 효율적이고.
JPEG를 실시간으로 못 푸는 플랫폼을 노린다면 의미가 있지. HDMI 라인 속도로 복호화되고 픽셀당 6 옵코드임.
인코딩과 디코딩 속도 차이가 크다는 게 특수 목적 하드웨어에서는 쓸 만한 전략 같아. 라디오 방송처럼 중앙에서 한 번 만들고 수신기 여러 개가 읽는 구조에 맞음.
-1 먹은 이유를 모르겠는데 알려줄 사람 있음?
HN에는 DM 없음. 최근 3개월 댓글이 AI 생성처럼 보여서 그런 듯. 가이드라인에서도 금지고 커뮤니티도 싫어함.
Amiga HAM이랑 비슷함. OCS는 6비트 입력으로 12비트 4096색을 냈고, AGA는 8비트 입력으로 262144색까지 갔음. HAM도 압축 방식이라고 부를 수 있겠네.
Adafruit Fruit Jam 있으면 데모 돌려볼 수 있음. SD 카드에서 640x480 영상을 60fps로 스트리밍하고, 정지 이미지는 플래시에서 표시함. 디코더는 symbolasm이라는 새 저수준 언어로 썼음.
symbolasm 멋있다. MenuetOS에서 fasm 가지고 놀던 때가 생각나네.
이름 있는 변수랑 구조체 필드는 매크로 어셈블러에도 있는 거 아님? 그래도 symbolasm이 훨씬 편해 보이고 개발자 의도도 드러남.
적어도 네 프로젝트 일부는 바이브 코딩이지? 저장소랑 HN 댓글에서 LLM 쓴다고 했잖아.