インテル コンパイラー 1000本ノックプロジェクト 5ページ

H.264エンコーダ「x264」

 x264は、GPLで提供されているH.264エンコーダだ。WindowsやMac OS X、Linux/UNIXで動作し、またエンコーダエンジンとしてさまざまなアプリケーションで利用されている。

 x264の公式サイトではソースコードの開発版スナップショットのみが配布されており、x264のWindows向けバイナリはhttp://x264.nl/にて配布されている。また、Gitによるソースコードの取得も可能だ。

Windows環境でのコンパイル

 x264の配布ソースコードには、「build\win32」ディレクトリ以下にVisual Studioのプロジェクトファイルが含まれている。こちらをVisual StudioのIDEで開き、コンパイル設定を行えば良い。

 なお、筆者が試したバージョンのソースコードでは、「C99」と呼ばれる、1999年に策定されたCの新標準規格内で採用された機能が用いられている。そのため、C99に対応していないVisual C++ではそのままではコンパイルできなかった。インテル コンパイラーでは、「/Qstd=c99」オプションを使用することでC99サポートを有効にでき、問題なくコンパイルが可能である。

 また、x264ではSSE2を利用するためのアセンブラで書かれたコードが含まれているのだが、このコードはGCC向けに記述されており、そのままではインテル コンパイラーで利用できない。そのため、Visual C++やインテル コンパイラーでコンパイルしたバイナリは、GCCでコンパイルしたバイナリよりもパフォーマンスが低下してしまう問題がある。

 そのほか、コンパイルを行うために加えた修正点は以下のとおりだ。

  • muxsers.cの296行目「fprintf(stderr, “Bad header magic (%”PRIx32″ <=> %s)\n”,」を「fprintf(stderr, “Bad header magic (\”PRIx32\” <=> %s)\n”,」のように修正
  • encoder\looahead.cがプロジェクトファイルとして登録されていなかったので、このファイルを「libx264」プロジェクトに追加

Linux環境でのコンパイル

 Linux環境でのx264のコンパイルでは、configureスクリプトを使用してコンパイル設定を行っている。そのため、次のようにconfigureを実行するだけでコンパイルが可能だ。

$ CC=icc CFLAGS="<コンパイルオプション>" ./configure

パフォーマンス比較(Linux版)

 パフォーマンス比較には解像度720×480、約7秒の動画ファイルを用い、このファイルをデフォルト設定でエンコードした場合のフレームレートを比較した。結果は下記の表10のとおりだ。また、コンパイルオプションについてはデフォルトのものを用いている。結果を見ると、インテル コンパイラーで作成したx264のほうが、若干ではあるがフレームレートが高くなっている。

表10 x264のパフォーマンス比較
コンパイラ 平均フレームレート
インテル コンパイラー 63.58fps
GCC 61.98fps

AACエンコーダ「FAAC」

 現在よく使われている音声圧縮コーデックの1つに「AAC」がある。AACは地上デジタル放送や、アップルのiTunesのデフォルトコーデックとして採用されているコーデックで、低いビットレートでも比較的高音質なのが特徴だ。AAC形式での音声圧縮を行うAACエンコーダはいくつか存在するが、オープンソースで提供されているものとして「FAAC」がある。

 FAACはコマンドラインツールおよびライブラリとして提供されているが、オープンソースで提供されているためほかの動画/音声エンコーダツールなどでも多く採用されている。

FAACのコンパイル(Windows環境)

 FAACのソースコードは、ダウンロードページから入手可能だ。本記事では、2009年2月11日に公開された「faac-1.28.zip」を使用した。このソースアーカイブを展開すると、「frontend」ディレクトリ以下にVisual Studio向けのプロジェクトファイル「faac.sln」が含まれているので、これをVisual Studioで開いてコンパイル設定を行えば良い。

パフォーマンス比較

 約4分のWAVE形式音声ファイルをFAACのデフォルト設定でエンコードし、エンコードが完了するまでの時間を測定した。結果は次の表11のとおりだ。FAACについてもLAMEと同様、インテル コンパイラーを使用することでパフォーマンスの向上が確認できる。

表11 FAACのパフォーマンス比較
コンパイラ/コンパイルオプション エンコード時間
Visual C++(/O2) 10.7秒
インテル コンパイラー(/O3、/Qip) 8.8秒