前後のエントリ

2007年12月12日(水)

ffmpegで-flagsが機能しない件

ffmpegで-flagsを付けると再生できないmp4ファイルができるようになっちゃいました。 rev.11142で変更されたffmpeg.cが怪しいような気がする。 なつかしのprintf()デバッグによって必死に追いかけてみると、libavcodecのopt.cに行き着きました。 av_get_string()で得た文字列をそのままav_set_string()に渡しても、FF_OPT_TYPE_FLAGSタイプの場合はゼロに初期化されちゃって困ったことになっている模様です。 FF_OPT_TYPE_FLAGSタイプのときはav_get_string()から"0x80042000"のような文字列が返ってきます。 "+loop+ilme"のような文字列ではありません。 ところがav_set_string()は"+loop+ilme"のような文字列を想定しているので、いかにも16進数の数字的な文字列には反応しないみたい。 で、av_set_string()にそれらしい処理を追加してみました。 av_get_string()から返ってくる文字列をそのままav_set_string()に渡したら、16進数の数字的な文字列を16進数の数字だと思って設定します。 sscanf()とかいきなり使ってるんであまり安全じゃないかもしれません。 むしろffmpeg.cを元に戻した方が確実と思われます。 まあ私専用なんで。

diff -urd ffmpeg/libavcodec/opt.c ffmpeg-11202/libavcodec/opt.c
--- ffmpeg/libavcodec/opt.c Tue Dec  4 22:08:42 2007
+++ ffmpeg-11202/libavcodec/opt.c   Wed Dec 12 22:49:14 2007
@@ -149,6 +149,13 @@
             if(o->type == FF_OPT_TYPE_FLAGS){
                 if     (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
                 else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
+                else {
+                    if(d == 0 && buf[0] == '0' && buf[1] == 'x' && strlen(buf) == 10){
+                        unsigned int dd;
+                        sscanf(buf, "0x%08X", &dd);
+                        d= dd;
+                    }
+                }
             }else if(cmd=='-')
                 d= -d;
 

-flagsを使わないffmpegユーザなどいないと思うんだけど、あまり話題になっているような気がしない。 もしかしたら私の環境だけで起きる不具合なのかもしれない。

投稿者 ミキオ | 2007-12-12(水) 22:57:08 | [ソフトウェア] | 2007年12月 | ツイートする

zenback

前後のエントリ