試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Mandriva Linux 2009.0のStepManiaのパッケージで動画背景が動作しない件について

StepManiaの概要とMandriva Linuxのパッケージについて」で結果画面にならない現象については解決したが、背景に動画を使用しているデータを実行したところ、動画が出るはずの部分で背景が真っ黒になってしまう現象が起こった。

  1. 本家版では動画背景は動作
  2. Mandriva Linux 2009.0のパッケージはパッチの当て方を見直してFFmpegライブラリを使用するところまでは行ったがうまく動作せず
    1. FFmpegサポートを有効にする
    2. 必要なもの以外を全てGentooのパッチにしてみる
  3. 結果
    1. デコード失敗?のメッセージ

本家版では動画背景は動作

公式サイトにて配布されているx86_32向けのファイルでは背景の動画を正常に再生することができる。ただし、幾つかの依存ライブラリがあるので、事前に入れておく必要がある。動画をデコードするために使用されるFFmpegのライブラリは組み込まれている(静的リンクされている)ようなので別途用意する必要はない。
Mandriva Linux 2009.0ではi586版の以下のパッケージが少なくとも必要。

  • libmad0(要求ファイル名: libmad.so.0)
  • libSDL1.2_0(要求ファイル名: libSDL-1.2.so.0)
  • libvorbisfile3(要求ファイル名: libvorbisfile.so.3)
  • libXtst6(要求ファイル名: libXtst.so.6)

Mandriva Linux 2009.0のパッケージはパッチの当て方を見直してFFmpegライブラリを使用するところまでは行ったがうまく動作せず

FFmpegサポートを有効にする
StepManiaの概要とMandriva Linuxのパッケージについて」で作成したパッケージについて、ビルド前のconfigureスクリプトの出力を見ると

(中略)
checking for TLS... yes
checking for library containing avcodec_init... -lavcodec
checking for library containing guess_format... -lavformat
checking for libavcodec >= 0.4.9... no
checking for libavformat >= 0.4.9... no
checking for library containing dladdr... -ldl
checking for crash handler components... ok
checking for working cxa_demangle... yes
(以下略)

と出ていたので、動画を処理するライブラリが検出されずに動画背景を処理する機能が無効化されてしまったように見える。
アプリケーション実行時、端末には

(中略)
/////////////////////////////////////////
WARNING: Unknown movie driver name: FFMpeg
/////////////////////////////////////////
(以下略)

と出ていた。
Gentooで使用されているパッチを見ると020_all_ffmpeg.patchというのがあるのだが、「StepManiaの概要とMandriva Linuxのパッケージについて」では使用しなかったため、これを適用してみることにした。
ところがパッチが当たらず、詳しくパッチの中身を見てみると、既に使用されている

と内容がかぶっていることが分かり、これらは使用しないようにして、StepMania-3.9-ffmpeg_4629_4754.patchも外した。
その上でautoreconfでconfigureスクリプトを更新するようにすると

(中略)
checking pkg-config is at least version 0.9.0... yes
checking for FFMPEG... yes
checking for img_convert in -lavcodec... yes
checking for library containing dladdr... -ldl
checking for crash handler components... ok
checking for working cxa_demangle... yes
(以下略)

このあたりの検出はOKとなった。しかし

x86_64-mandriva-linux-gnu-g++ -DHAVE_CONFIG_H -I.  -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT   -finline-limit=300   -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -MT MovieTexture_FFMpeg.o -MD -MP -MF .deps/MovieTexture_FFMpeg.Tpo -c -o MovieTexture_FFMpeg.o `test -f 'arch/MovieTexture/MovieTexture_FFMpeg.cpp' || echo './'`arch/MovieTexture/MovieTexture_FFMpeg.cpp
arch/MovieTexture/MovieTexture_FFMpeg.cpp:28:29: error: ffmpeg/avformat.h: No such file or directory

今度は動画を処理する部分のビルドエラーが発生した。
この問題については、GentooPortageツリー内のfilesディレクトリに入っているパッチstepmania-3.9-newffmpeg.diffが役に立った。
これで無事にビルドが通るようになった。しかし、動作を確認してみると、FFmpegのライブラリが動画を処理しているメッセージ(後述)は出るのだが背景は真っ黒のまま。

必要なもの以外を全てGentooのパッチにしてみる
まずStepMania-3.9-x86_64-build.patchStepMania-3.9-build_crypto.patch030_all_64bits.patchに、StepMania-3.9-eventmask.patch080_all_sdl.patchに(修正内容は同一)、StepMania-3.9-extraqual.patchStepMania-3.9-replace-this.patch050_all_gcc.patch(これも同一)に置き換えた。
Luaについては、変数ac_cv_lib_lualib_luaopen_baseのexportをする代わりにlib64lua-devel(5.1.4)を使用してGentoo070_all_lua.patchを当てると検出できるようになった。先にバージョン5.0でこのパッチを当てて試していたのだが検出に失敗し、色々試した結果Luaを5.1にすることで通るようになった。

(中略)
checking for jpeglib.h... yes
checking for lua-config50... no
checking for lua-config... no
checking for lua_open in -llua... no
checking for lua_open in -llua50... no
checking for luaopen_base in -llualib... no
checking for luaopen_base in -llualib50... no
checking for x86_64-mandriva-linux-gnu-pkg-config... no
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for LUA... yes
(以下略)

他に、StepMania-3.9-pkgdir.patchはconfigureスクリプトを直接編集しているため、autoreconfの後でsedで別途編集するようにした。
最終的には、パッチ一覧が

Patch3:		StepMania-3.9-home.patch
Patch4:		StepMania-3.9-pkgdir.patch
Patch10:	010_all_alsa.patch
Patch20:	020_all_ffmpeg.patch
Patch30:	030_all_64bits.patch
Patch40:	040_all_alias.patch
Patch50:	050_all_gcc.patch
Patch60:	060_all_gettid.patch
Patch70:	070_all_lua.patch
Patch80:	080_all_sdl.patch
Patch90:	090_all_vorbis.patch
Patch100:	100_all_jpeg.patch
Patch110:	110_all_gcc43.patch
Patch500:	stepmania-3.9-newffmpeg.diff
Patch510:	stepmania-3.9-newerffmpeg.diff

のように、適用部分が

%patch3 -p1 -b .home
%patch4 -p1 -b .pkgdir
%patch10 -p1 -b .alsa
%patch20 -p1 -b .ffmpeg
%patch30 -p0 -b .64bits
%patch40 -p1 -b .alias
%patch50 -p0 -b .gcc
%patch60 -p1 -b .gettid
%patch70 -p1 -b .lua
%patch80 -p0 -b .sdl
%patch90 -p1 -b .vorbis
%patch100 -p1 -b .jpeg
%patch110 -p0 -b .gcc43
%patch500 -p1 -b .newffmpeg
%patch510 -p1 -b .newerffmpeg
autoreconf
# StepMania-3.9-pkgdir.patch modifies configure script directly.
# after autoreconf, needed to re-modify
%{__sed} -i 's:DEFS=-DHAVE_CONFIG_H:DEFS="-DHAVE_CONFIG_H -DPKG_LIB_DIR=\\\\\\"\\$(pkglibdir)\\\\\\" -DPKG_DATA_DIR=\\\\\\"\\$(pkgdatadir)\\\\\\"":' configure

のようになった。

結果

残念ながら、ここまでの修正を行っても背景動画は真っ黒のままとなった。端末への出力ではFFmpegのライブラリからのメッセージが出ているので、処理自体はされているようだ。ただし正常にデコードされているかは怪しい。Mandriva Linux 2009.0に用意されているパッケージ(3.9-9mdv2009.0)も同様の状態だった。

デコード失敗?のメッセージ
Web検索で背景動画付きのデータを適当に探して試したところ

(中略)
/////////////////////////////////////////
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 46 26
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 46 26
(中略)
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 3 27
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 3 27
[wmv2 @ 0x7ff54b3447c0]ac-tex damaged at 8 27
[wmv2 @ 0x7ff54b3447c0]
error while decoding inter block: 8 x 27 (1)
[wmv2 @ 0x7ff54b3447c0]Error at MB: 1385
[wmv2 @ 0x7ff54b3447c0]concealing 98 DC, 98 AC, 98 MV errors
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 46 26
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 46 26
(中略)
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 3 27
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 3 27
[wmv2 @ 0x7ff54b3447c0]ac-tex damaged at 8 27
[wmv2 @ 0x7ff54b3447c0]
error while decoding inter block: 8 x 27 (1)
[wmv2 @ 0x7ff54b3447c0]Error at MB: 1385
[wmv2 @ 0x7ff54b3447c0]concealing 98 DC, 98 AC, 98 MV errors
score: 1755
score: 3510
score: 3510
score: 10530
score: 19305
(以下スコア)
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 46 26
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 46 26
(中略)
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 3 27
[wmv2 @ 0x7ff54b3447c0]ignoring overflow at 3 27
[wmv2 @ 0x7ff54b3447c0]overreading 1473 bits
[wmv2 @ 0x7ff54b3447c0]concealing 1400 DC, 1400 AC, 1400 MV errors
/////////////////////////////////////////
(以下略)

のような感じになった。この中で使用されている動画ファイルを別のXvid入りの.aviファイルに(同じファイル名にして)差し替えてみたが

(中略)
/////////////////////////////////////////
score: 1755
[mpeg4 @ 0x7fd5e006e7c0]ac-tex damaged at 21 1
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 62
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
(中略)
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]illegal mb_num in video packet (1472 1200) 
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
(中略)
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]cbpc damaged at 0 0
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 0
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
(中略)
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]illegal mb_num in video packet (1680 1200) 
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
score: 4914
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]illegal mb_num in video packet (1472 1200) 
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
(中略)
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
Marker bit missing before time_increment in video packed header
Marker bit missing before vop_coding_type in video packed header
[mpeg4 @ 0x7fd5e006e7c0]ac-tex damaged at 1 0
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 1
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]cbpc damaged at 0 0
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 0
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
(中略)
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]cbpc damaged at 0 0
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 0
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]illegal mb_num in video packet (1536 1200) 
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]illegal mb_num in video packet (1536 1200) 
[mpeg4 @ 0x7fd5e006e7c0]cbpc damaged at 0 0
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 0
[mpeg4 @ 0x7fd5e006e7c0]cbpc damaged at 0 0
[mpeg4 @ 0x7fd5e006e7c0]Error at MB: 0
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
(中略)
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]marker does not match f_code
[mpeg4 @ 0x7fd5e006e7c0]concealing 1200 DC, 1200 AC, 1200 MV errors
score: 9652
score: 16672
(以下スコア)

やはりおかしい。本家の実行ファイルではこのようなエラーは出ていない。
ログファイル内の動画ファイルに関する出力は下のようになっていた。*1
[引用]ファイル名: ~/StepMania/log.txt

(中略)
00:22.559: Sprite::LoadFromTexture( Songs/[中略]/[ファイル名].avi )
00:22.559: Movie Songs/[中略]/[ファイル名].avi has handler 'XVID', type 'XVID'
00:22.559: Initializing driver: FFMpeg
00:22.559: MovieTexture_FFMpeg::MovieTexture_FFMpeg(Songs/[中略]/[ファイル名].avi)
00:22.568: Opening codec mpeg4
00:22.568: Bitrate: 0
00:22.568: Codec pixel format: yuv420p
00:22.580: format 16, 00007c00 000003e0 0000001f 00008000
00:22.583: glTexImage2D(format GL_RGB5_A1, 1024x512, format GL_BGRA, type GL_UNSIGNED_SHORT_1_5_5_5_REV, pixfmt 7, imgpixfmt 7
00:22.584: Resolution: 640x480 (640x480, 1024x512)
00:22.584: Texture pixel format: 3
00:22.592: Starting thread: MovieTexture_FFMpeg(Songs/[中略]/[ファイル名].avi)
00:22.592: Created movie texture "Songs/[中略]/[ファイル名].avi" with driver "FFMpeg"
00:22.592: Song::LoadFromSMFile(Cache/Songs/xxxxxxxxxx)
(以下略)

Gentooでは本記事途中の一覧に書いたパッチの他にはファイルの場所に関するstepmania-3.9-gentoo.patchというパッチしか使用されていないが、これで正常に動作しているのかは環境がないので不明。
また、src/arch/MovieTexture/MovieTexture_FFMpeg.cppへの修正が別途必要なのか、あるいはFFmpegライブラリ(libswscaler/libavformat/libavutil/libavcodec)のバージョンによる問題なのかも分からない。なお、ffplayでは動画は正常に再生できている。

使用したバージョン:

  • stepmania 3.9-9mdv2009.0 + Gentooパッチ
  • lib64ffmpeg-devel 0.4.9-3.pre1.14161.1.1mdv2009.0

*1:これはXvidなファイルに差し替えたときのもの