Windows上でWin32ネイティブスレッドを使う x264 をビルドする方法

この記事は 2017/9 時点で古い情報です。2017/9 時点のビルド手順はこちらを参照してください。

Update

以下元記事

ビルドするもの

前回は pthread を使っていましたが、x264 r1834(a51816)でWin32ネイティブスレッドがサポートされたので、スレッド周りはネイティブを使うようにして、mp4 出力をサポートした x264

用意しておくもの

MinGW猫科研究所の準備

猫科研究所パックをHDD上の適当な場所に展開する。 230MB ぐらい食うので余裕のある場所に(RAMディスク上に展開したところ、次の手順でエラーを起こしたので展開先は通常のHDD上が無難そうです)。
展開した先の msys\_felidlabo の中にある 04_gccinstall.bat を実行する。

1) gcc-4.4.1-tdm
2) gcc-3.4.5-20060117-3
3) cancel
select gcc version :

と聞いてくるので 1 を選ぶ(pthread のコンパイルに 4 系が要求される模様)。

INFO: gcc-4.4.1-tdm installed.

続行するには何かキーを押してください . . .

続いて 05_plus-build.bat を実行。結構時間かかる。手元では30分弱。

pthread のビルド

pthread 版ではここで pthredのビルドをしてましたがWin32ネイティブスレッドに対応したので、この手順は不要になりました。

GPAC のビルド

Windowsexplorer なりシェルなりでダウンロードしておいた gpac-0.4.5.tar.gz を msys のホームディレクトリにコピーします。

C:\>copy gpac-0.4.5.tar.gz C:/msys/home/xxxxx/

同じくmsys のホームディレクトリに次のパッチファイルを作っておきます。
ファイル名は適当でいいですが、libpng14-infopp-null.patch とでもしておきます。

--- src/media_tools/img.c
+++ src/media_tools/img.c
@@ -551,7 +551,7 @@
     /* Allocate/initialize the image information data.  REQUIRED */
     info_ptr = png_create_info_struct(png_ptr);
     if (info_ptr == NULL) {
-          png_destroy_write_struct(&png_ptr,  png_infopp_NULL);
+          png_destroy_write_struct(&png_ptr,  NULL);
          return GF_IO_ERR;
     }

msys.bat を実行。ここからしばらく MINGW32 のシェル上での操作になります。
gpac を展開して展開先のディレクトリに移動します。

$ tar zxf gpac-0.4.5.tar.gz

$ cd gpac

$

先ほど作っておいたパッチをあてます。

$ patch -p0 -N < ../libpng14-infopp-null.patch
(Stripping trailing CRs from patch.)
patching file src/media_tools/img.c
Hunk #1 succeeded at 551 with fuzz 1.

$

./configure。 --prefix=/mingw を付けるのがこの環境でのポイント。

$ ./configure --prefix=/mingw
(省略)
Creating config.mak
Done - type 'make help' for make info, 'make' to build

$

特殊なのがここでの config.h のコピー。やっとかないと make で No such file とエラーになる

$ cp config.h include/gpac/internal/

そして make と make install

$ make lib install-lib
(省略)
mkdir -p "/mingw/lib"
install -m 644 "./bin/gcc/libgpac_static.a" "/mingw/lib"
mkdir -p "/mingw/lib"
install -m 644 "./bin/gcc/libgpac_static.a" "/mingw/lib"

$

x264 のビルド

まずは x264 のソースをリポジトリから引っ張ってくる。この時点では r1884(7313bb) だったので以降それ基準で。(コマンドラインから git を叩ける状態になっていないとできないので注意)

$ git clone git://git.videolan.org/x264.git x264
Cloning into x264...
remote: Counting objects: 13216, done.
remote: Compressing objects: 100% (4093/4093), done.
remote: Total 13216 (delta 10739), reused 11274 (delta 9082)
Receiving objects: 100% (13216/13216), 3.27 MiB | 72 KiB/s, done.
Resolving deltas: 100% (10739/10739), done.


ここで clone されるのは master ブランチなので stable で、と言う場合は stable ブランチに切り替えておく。(master で行く場合はこの手順は不要)

$ git co -b stable origin/stable
Branch stable set up to track remote branch stable from origin.
Switched to a new branch 'stable'

$ git br
  master
* stable

$

そして ./configure。configure の後、gpac が yes、thread が win32 になってるか確認。

$ cd x264
$ ./configure --enable-win32thread
Platform:   X86
System:     MINGW
asm:        yes
avs:        yes
lavf:       no
ffms:       no
gpac:       yes
gpl:        yes
thread:     win32
filters:    crop select_every
debug:      no
gprof:      no
PIC:        no
shared:     no
visualize:  no
bit depth:  8

You can run 'make' or 'make fprofiled' now.

最後に make して x264.exe が出来ればできあがり。

$ make
(省略)
ranlib libx264.a
gcc -o x264.exe x264.o input/input.o input/timecode.o input/raw.o input/y4m.o ou
tput/raw.o output/matroska.o output/matroska_ebml.o output/flv.o output/flv_byte
stream.o filters/filters.o filters/video/video.o filters/video/source.o filters/
video/internal.o filters/video/resize.o filters/video/cache.o filters/video/fix_
vfr_pts.o filters/video/select_every.o filters/video/crop.o filters/video/depth.
o input/avs.o input/thread.o output/mp4.o libx264.a -lgpac_static -lwinmm  -Wl,-
-large-address-aware -s

$ ls x264.exe
x264.exe

$


exit して msys\home\(ユーザ名)\x264.exe を適当な場所にコピーして動くか確認。動くはず。

C:\>x264 --help
x264 core:112 r1875 78b4fc4
Syntax: x264 [options] -o outfile infile

Infile can be raw (in which case resolution is required),
  or YUV4MPEG (*.y4m),
  or Avisynth if compiled with support (yes).
  or libav* formats if compiled with lavf support (no) or ffms support (no).
Outfile type is selected by filename:
.264 -> Raw bytestream
.mkv -> Matroska
.flv -> Flash Video
.mp4 -> MP4 if compiled with GPAC support (yes)
Output bit depth: 8 (configured at compile time)

Options:
(省略)
C:\>

以上でビルドは完了です。
あとは煮るなり焼くなり炊くなりご随意に。

謝辞

msys の環境を作るのが面倒なのですが、そこをさくっとできるようなパッケージを作成&公開されている猫科研究所の中の人に感謝です。

参考:

lavf と ffms をサポートしたビルドを作りたいけどとっかかりが見つからないんだよねぇorz