N900에서 Theora 재생하기

이 글은 Mathew Gregnan의 개인 weblog로부터 퍼온 것입니다. 그는 모바일 기기에 HTML5 open video를 구현하기 위한 작업들을 하고 있습니다. 구글은 Theora 재생을 ARM CPU 상에서 처리할 수 있게 하는 일에 자금을 지원하기로 최근 발표했습니다. 모질라에서도 이와 비슷하게 모바일 기기 상의 DSP가 비디오 디코딩을 수행함으로써 CPU를 대부분 유휴 상태에 있게 하려는 일을 위해 대략 지난 일 년간 자금지원을 해 왔습니다.

이 게시물은 엄밀히 말하면 웹 개발자를 위한 것은 아니지만, 이런 것이 어떻게 동작하는지 알고 싶어하는 사람들에게는 충분히 관심 거리가 될 것이라고 생각합니다.

Theora 비디오를 N900에서 80%의 CPU 유휴시간을 확보하면서 전체화면으로 재생하기

C64x+ DSP의 조합은 Palm Pre, Motorola Droid, and Nokia N900와 같은 TI의 OMAP3 SoC 위에 구현된 시스템에서 자주 볼 수 있다. 작년에 모질라에서는 Xiph의 Theora 비디오 코덱을 TI의 C64x + DSP 상에 포팅하는 Leonora 프로젝트에 자금지원을 했다. David Schleef는 포팅 작업을 대단히 빠른 속도로 수행했고 그 결과를 발표했다. 이 프로젝트의 목적은 로얄티가 없는 고품질의 미디어 코덱을 일반적인 모바일 컴퓨팅 플랫폼에 제공하는 것이다. 이 프로젝트의 최초 목표는 N900상의 FireFox Mobile이고, 나는 FireFox에 David의 작업 결과를 통합하는 일을 하고 있다. 비디오 재생을 가속하고 통합 결과를 테스트하는데 FireFox가 돌아가는 다른 기기들로도 시험해 보기 위해, 나는 Chris Double이 최초로 작성했고 plogg라고 불리는 독립형 Ogg Theora/Vorbis 재생기의 한 버전을 해킹하는 중이다.

비디오 디코딩이나 재생은 CPU에 부하를 많이 주는 프로세스이다. 특히 모든 처리 단계들이 단일 CPU의 시간을 점유하기 위해 경쟁하는 상황에서는 더욱 그러하다. 재생 프로세스에서 CPU 점유율이 높은 부분은 몇 개의 더 세밀한 부분들로 쪼개질 수 있다. 이러한 부분들을 점유율이 높은 것부터 순서대로 정리하자면 아래와 같다.

  1. 비디오 프레임 디코드
  2. 비디오 색상공간 변환 (Y’CbCr 에서 RGB로)
  3. 비디오 프레임 출력
  4. 오디오 블락 디코드
  5. 오디오 블락 재생

David의 DSP 작업은, 1번 항목을 CPU에서 완전히 분리시켰고 “하드웨어에 의해 가속된” 비디오 디코딩을 효율적으로 제공했다. 대부분의 기기들에는 2번과 3번 항목의 작업을 그래픽 하드웨어에 전가해 줄 방법이 있다. 하지만, 기존의 그래픽 렌더링 파이프라인과 통합하고자 할 때 이런 방법을 사용하는 것은 어려움이 있을 수 있다.

N900은 800 X 480의 픽셀을 갖고 있는데, 나는 CPU 점유율을 낮게 유지하고 배터리 사용 시간을 최대화하면서, 초당 30프레임의 속도로 800 X 480 의 비디오를 전체화면으로 재생하기를 원했다.

N900에 들어 있는 ARM CPU는 상당히 빠르다. 순수하게 비디오 디코딩만을 테스트해 보면, ARM에 특화된 최적화가 이루어지지 않은 기본적인 Theora 라이브러리로는 640 X 360 픽셀의 비디오를 초당 76 프레임의 속도로 디코딩 할 수 있고 800 X 480을 초당 32 프레임의 속도로까지 디코딩 가능하다. Robin Watts에 의한 ARM에 최적화된 포팅 결과를 이용하면, 이 속도는 각각 110FPS와 47FPS가 된다. David의 DSP 포팅 결과를 이용하면 속도는 각각 78FPS, 39FPS가 되는데, 모든 디코딩 부하가 DSP에 전가되기 때문에 CPU는 완전히 유휴상태에 머문다. 이런 속도를 고려해 보면, 화면에 데이터를 뿌려주는 작업만 충분히 빨리 수행 가능하다면, N900에서 부드러운 비디오 재생이 가능하다는 것이 명백하다.

FireFox 렌더링 엔진에 적용 가능한 기술들을 사용하는 실험의 기초로서 나는 plogg를 사용하고 있다. 이러한 요구조건으로 인해 몇몇 기술들은 즉시 제외 대상이 된다. 예를 들면, 하드웨어 Y’CbCr 오버레이를 사용하여 비디오 프레임을 출력하는 방법은 제외되는데, 그것은 FireFox에서는 임의의 HTML 내용을 오버레이 위에서 렌더링하는 것이 불가능하기 때문이다.

Chris의 plogg 최초 버전에서는 SDL의 Y’CbCr 오버레이 API를 사용했는데, 이것은 대부분의 시스템에서 빠르고 직접적인 오버레이 방법을 사용한다. 이것이 재생 성능에 대한 기준을 제시해 주었다. 800 X 480의 테스트용 비디오를 DSP를 이용해 디코딩 할 때, 33FPS로 20%의 CPU 유휴시간을 확보하면서 재생할 수 있었다. 위에서 언급한 순수 비디오 디코딩의 벤치마크 경우와는 달리, plogg 벤치마크 테스트에서는 영상과 음성을 정확히 동기화하면서 양쪽 다 재생했다. 44.1kHz의 스테레오 오디오에 대해서는 PulseAudio의 CPU 점유율이10-15% 정도라는 것을 볼 수 있었다. 이것은 어떤 특정 설정 상태에서는 음성 재생이 상당한 CPU 점유율을 차지할 수 있다는 것을 의미한다.

FireFox에서의 OpenGL로 가속되는 합성 작업에 새로 고안된 Layers API를 제공하는 작업이 이미 진행 중에 있었기 때문에, 색상공간 변환작업이 GPU에서 수행되도록 하기 위해서 GLSL fragment shader를 사용해 보는 것은 논리적으로 합당해 보였다. 하지만 이 방법은 전체화면으로 비디오를 재생하기에는 너무 느리다는 것이 드러났다.

N900에서 가용한 여러 벤더들의 OpenGL 확장기능의 목록을 살펴보던 중, 나는 texture streaming API를 발견했다. 이것을 사용하면, CPU를 많이 잡아 먹는 texture 업로드나 색상공간 변환 같은 일을 수행할 필요 없이 texture 메모리를 직접적으로 매핑해서 Y’CbCr 데이터를 메모리에 복사해 넣을 수가 있다. 색공간 변환 작업이 표준 OpenGL API들로는 접근 불가능 했던 전용 그래픽 하드웨어로 이관되는 것이다. 이것과 함께 gst-bc-cat 프로젝트에서 만든 bc-cat 커널의 수정본을 사용하면 26FPS 속도로 CPU 유휴시간을 81%로 유지하면서 재생하는 것이 가능하다.

현재의 bc-cat 커널 드라이버의 한 가지 단점을 말하자면, 지원하는 texture 포맷(NV12, UYVY, RGB565, YUYV)이 매우 제한적이며 그것들 중에 Theora가 지원하는 것이 없다는 점이다. 이 문제를 해결하기 위해서는 planar Y’CbCr 을 packed 4:2:2 UYVY로 포맷을 변환할 필요가 있다. 다행히도 이 변환 작업은 전체 색상공간 변환보다 훨씬 단순한 작업이다. Timothy Terriberry는 이 변환 작업이 DSP에서 수행되게 하는 몇 개의 패치를 보내 줬다. Theora의 출력과 호환되는 texture 포맷을 지원할 수 있도록 bc-cat 드라이버를 확장할 수 있다면, 성능은 훨씬 더 향상될 수 있을 것이다.

벤치마킹을 위한 테스트 파일로는 Big Buck Bunny (video: 640×360 @ 500 kbps 24 FPS, audio: 64 kbps 48kHz stereo, 9분 56초, 40MB)와 영화 9의 예고편(video: 800×480 @ 2 Mbps 23.98 FPS, audio: 44.1kHz stereo, 2분 30초, 30MB)을 사용했다. CPU 속도는 600MHz로 고정해서 테스트 했다.

요약하자면, 비디오 디코딩은 DSP가 담당하고 색상공간 변환과 페인팅은 GPU가 담당하게 함으로써, CPU 점유율을 낮게 유지한 채 전체화면으로 Ogg Theora 비디오를 최대 재생 속도로 N900에서 재생하는 것이 가능했다. 아직 최적화의 여지가 남아 있고, 배터리 사용시간에 대한 튜닝도 연구해 봐야 하고, FireFox에 통합하는 작업도 남아 있는 상태이다.

비디오만 디코딩:

디코더 FPS (800×480) 유휴 CPU
libtheora 1.1 32 0.7%
TheorARM 0.04 47 0.4%
leonora (DSP) 39 99.0%

재생 (비디오 디코딩 + 화면출력, 오디오 디코딩 + 음성출력 안 함). DSP로 비디오 디코딩:

재생방법 FPS (800×480) 유휴 CPU
SDL/overlay 33 20.0%
OpenGL/bc-cat 26 81.4%

원저자: Christoper Blizzard – 원문으로 가기

작성자: John Kim

Software로 더 좋아지는 세상을 꿈 꿔 봅니다.

John Kim가 작성한 문서들…


댓글이 없습니다.

댓글 쓰기