Mandriva Linux 2009.0のStepManiaのパッケージで動画背景が動作しない件について
「StepManiaの概要とMandriva Linuxのパッケージについて」で結果画面にならない現象については解決したが、背景に動画を使用しているデータを実行したところ、動画が出るはずの部分で背景が真っ黒になってしまう現象が起こった。
本家版では動画背景は動作
公式サイトにて配布されている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-src-averror.patch
- StepMania-3.9-src-int64_c.patch
- StepMania-3.9-src-avcodec_namespace.patch
と内容がかぶっていることが分かり、これらは使用しないようにして、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
今度は動画を処理する部分のビルドエラーが発生した。
この問題については、GentooのPortageツリー内のfilesディレクトリに入っているパッチstepmania-3.9-newffmpeg.diffが役に立った。
これで無事にビルドが通るようになった。しかし、動作を確認してみると、FFmpegのライブラリが動画を処理しているメッセージ(後述)は出るのだが背景は真っ黒のまま。
必要なもの以外を全てGentooのパッチにしてみる
まずStepMania-3.9-x86_64-build.patchとStepMania-3.9-build_crypto.patchを030_all_64bits.patchに、StepMania-3.9-eventmask.patchを080_all_sdl.patchに(修正内容は同一)、StepMania-3.9-extraqual.patchとStepMania-3.9-replace-this.patchを050_all_gcc.patch(これも同一)に置き換えた。Luaについては、変数ac_cv_lib_lualib_luaopen_baseのexportをする代わりにlib64lua-devel(5.1.4)を使用してGentooの070_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では動画は正常に再生できている。
使用したバージョン: