eingusteのblog

Windows向けFFmpegバイナリを個人的にビルド(コンパイル)してます。その更新情報など。

タグ:外部ライブラリ

昨日、少しだけですがFFmpegに必要なライブラリの再構築を行いました。
お知らせしたとおり、コンパイラ(ビルド環境)を変更しましたので、32bit版、64bit版ともに一通りビルドしなおし中です。
zlib-1.2.8	OK
bzip2-1.0.6	OK
GMP-6.1.0	OK
nettle-3.2	OK
libtasn1-4.8	OK
GnuTLS 3.4.13	OK
x264		OK
x265		OK
libiconv-1.14	OK
以上、です。

libvpx-1.5.0のインストール手順のメモです。

git clone https://chromium.googlesource.com/webm/libvpx

mkdir -p libvpx-build
cd libvpx-build
../libvpx/configure --target=x86_64-win64-gcc --disable-unit-tests --disable-examples --disable-docs --enable-runtime-cpu-detect --as=yasm --enable-multithread --enable-vp8 --enable-vp9 --enable-webm-io --enable-libyuv --enable-postproc --enable-vp9-postproc --disable-shared --enable-static --enable-multi-res-encoding --enable-vp9-temporal-denoising --enable-temporal-denoising --extra-cflags="-pipe -O"
make make install
 

32bit版はconfigureのtargetオプションを--target=x86-win32-gccにします。

32bit版では--extra-cflags="-pipe"にしています。

64bit版で--extra-cflags="-pipe -O"にしているのは、2016-03-27時点のlibvpxのソースではffmpegでクラッシュしたためです。

2016-03-30時点のソースではクラッシュしないようなので、64bit版も--extra-cflags="-pipe"に戻しました。

以上

GnuTLS-3.4.10のインストール手順のメモです。

まずgmplib-6.1.0からインストールします。

wget --no-check-certificate https://gmplib.org/download/gmp/gmp-6.1.0.tar.lz
tar xf gmp-6.1.0.tar.lz
cd gmp-6.1.0
./configure --build=i686-w64-mingw32 --enable-cxx
make
make install
(64bit版はconfigureのbuildオプションを--build=x86_64-w64-mingw32にします。)


次にnettle-3.2をインストールします。

wget ftp://ftp.gnu.org/gnu/nettle/nettle-3.2.tar.gz
tar xf nettle-3.2.tar.gz
cd nettle-3.2
./configure --disable-shared --disable-openssl --build=i686-w64-mingw32
make
make install
(64bit版はconfigureのbuildオプションを--build=x86_64-w64-mingw32にします。)


最後にGnuTLS-3.4.10をインストールします。
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.4/gnutls-3.4.10.tar.xz
tar xf gnutls-3.4.10.tar.xz
cd gnutls-3.4.10
CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure --disable-shared --disable-cxx --disable-doc --disable-nls --disable-gtk-doc-html --without-p11-kit --disable-guile --with-included-libtasn1 --build=i686-w64-mingw32
sed -i.orig -e "/Libs.private:/s/$/ -lcrypt32/" lib/gnutls.pc
make make install-strip

(64bit版はconfigureのbuildオプションを--build=x86_64-w64-mingw32にします。)

CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure --disable-shared --disable-cxx --disable-doc --disable-nls --disable-gtk-doc-html --without-p11-kit --disable-guile --with-included-libtasn1 --build=x86_64-w64-mingw32

以上

64bit版のlibx265でエンコード終了時に不正終了していることが分かりました。
そのためリビジョンを遡って、不正終了しないリビジョンで更新を止めることにします。
32bit版のffmpegでは発生していないので、64bit版のみの処置です。
現在、どのリビジョンで不正終了しないか調査中です。
更新が出来次第、こちらでお知らせします。

追記
8093リビジョンまで遡ることになりました。これは9月17日のリビジョンです。
バージョンはx265 version 1.3+221-c07038ca0e07となります。
64bit版のx265はこのリビジョンでしばらく更新をとめます。
git版は次回更新以降、反映させます。
安定版は今夜、更新しました。

追記2
リビジョン8115、x265 version 1.3+243-ee76b64fd051で64bit版の不正終了が直りましたので、再びリビジョンを更新します。最新の安定版は更新しました。

外部ライブラリlibvpxを更新したところ、vp9のエンコード時にVP8E_SET_NOISE_SENSITIVITYに関するエラーが発生していました。

http://pastebin.com/AVaZmdX5
Failed to set VP8E_SET_NOISE_SENSITIVITY codec control: Unspecified internal error

libvpxのlogを確認したところ、VP9E_SET_NOISE_SENSITIVITYに変更することとなったようです。そこで、vp8エンコードのときにはVP8E_SET_NOISE_SENSITIVITYを有効にし、vp9エンコード時にはVP9E_SET_NOISE_SENSITIVITYを有効にするようにソースに修正を加えました。
そのパッチは以下のとおりです。
http://pastebin.com/mHiR9ZqD
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 163d12a..0d89c85 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -125,6 +125,7 @@ static const char *const ctlidstr[] = {
     [VP9E_SET_TILE_ROWS]               = "VP9E_SET_TILE_ROWS",
     [VP9E_SET_FRAME_PARALLEL_DECODING] = "VP9E_SET_FRAME_PARALLEL_DECODING",
     [VP9E_SET_AQ_MODE]                 = "VP9E_SET_AQ_MODE",
+    [VP9E_SET_NOISE_SENSITIVITY]       = "VP9E_SET_NOISE_SENSITIVITY",
 #endif
 };
 
@@ -440,7 +441,8 @@ static av_cold int vpx_init(AVCodecContext *avctx,
         codecctl_int(avctx, VP8E_SET_ARNR_STRENGTH,    ctx->arnr_strength);
     if (ctx->arnr_type >= 0)
         codecctl_int(avctx, VP8E_SET_ARNR_TYPE,        ctx->arnr_type);
-    codecctl_int(avctx, VP8E_SET_NOISE_SENSITIVITY, avctx->noise_reduction);
+    if (avctx->codec_id == AV_CODEC_ID_VP8)
+        codecctl_int(avctx, VP8E_SET_NOISE_SENSITIVITY, avctx->noise_reduction);
     if (avctx->codec_id == AV_CODEC_ID_VP8)
         codecctl_int(avctx, VP8E_SET_TOKEN_PARTITIONS,  av_log2(avctx->slices));
     codecctl_int(avctx, VP8E_SET_STATIC_THRESHOLD,  avctx->mb_threshold);
@@ -451,6 +453,7 @@ static av_cold int vpx_init(AVCodecContext *avctx,
 
 #if CONFIG_LIBVPX_VP9_ENCODER
     if (avctx->codec_id == AV_CODEC_ID_VP9) {
+        codecctl_int(avctx, VP9E_SET_NOISE_SENSITIVITY, avctx->noise_reduction);
         if (ctx->lossless >= 0)
             codecctl_int(avctx, VP9E_SET_LOSSLESS, ctx->lossless);
         if (ctx->tile_columns >= 0)

↑このページのトップヘ