プログラマのつれづれなるままにプログラマのつれづれなるままに音宮志久が思ったことなどをネタにします。プログラムネタ・数学ネタがメインです。Libraryを使ったときにレイヤーモードで再生がうまくいかない」との投稿から始まった更新劇でした。利用者的な視点とプログラマ的な視点からちょっとこれについて書いてみたいと思います。最新版についてはこちらにて公開しています。Library(dsexfilter)はこれがなくても更新対象だったなんです。dsexfilterは今回のkrmovieの問題とはあまり関係がありません。機能的な問題をこの記事を書いた日の一昨日あたりに気になって更新しようかな~と思っていたところに飛び込んできた、というわけです。本来の更新対象はdsexfilterでWebMを再生させたときのオーディオライン出力が整数16bit固定だったので浮動小数形式のサンプル出力もできるようにするWebMの(自分のプログラムライブラリ内での)管理位置をいろいろといじっていたのでそれが問題ないかの確認だったわけです。普通にMPEGやWMVをレイヤー経由で再生している分には絶対に出ない問題です。いう問題に引っかかりました。krmovie内に配置したdsexfilterの読み込みはAVIファイルなどをDirectShow経由で読み込もうとするときに通過するルーチンと同じ動作をするようにしてあったのですが、その部分で問題が起こったのかな~?と思い独立した処理に変更して問題解決・・・?と思ったらそうでもなく。違う方法でデバッグをしてみて発覚したのが、レイヤー描画を受け取るときに映像ラインのデコードフィルタが「高さを負(ボトムアップではなくトップダウン)」で渡したときにkrmovieのレイヤー描画処理まで「高さが負(不正な高さ)」と処理されたことにあります。0によるコメントアウトの部分を復活させてトップダウン絵がきたときの処理を追加することでとりあえず一つは解決したわけです。そもそもWebMの出力をレイヤー描画することがそのままだとできないというのも、WebMの映像ラインの最終出力フォーマットはYV12になります。これはそれぞれの成分が平面になっているフォーマットなのでレイヤー描画するためには中間変換フィルタが必要になるのですが、Windowsのデフォルトフィルタではこれを変換する処理がありません。そのため、WebMをレイヤーモードで描画するには変換フィルタを実装する必要性に迫られたわけです。いうわけで、0.10の更新ではこの中間フィルタを呼び出せるようにする、という変更を行いました。デバッグの時間が取られそうな実装内容のような気がするかもしれませんが、実はdsexfilterに実装してあるTheoraもlibtheoraを使ったときの出力はYV12なので、これを内部デコーダ上でYV12=>RGB32としている処理があるのでこれをフィルタとして独立させるという方法で実装しました。それほど手間ではなかったりします。これのフィルタを追加登録した場合のみWebMの出力はRGB32で扱えます。あとはレイヤー描画フィルタに接続して完了ですね。映像ラインでデコードフィルタがフレームレート(正しくは1フレームの時間)を返さないときにレイヤー描画処理でエラーを起こすことにあります。どちらの問題もMPEGとWMVの2つのフォーマットを限定して吉里吉里(+krmovie)で扱っている限りはエラーを起こさないですので安心してください。この部分を修正してなんとかレイヤーモードでの描画処理が正しくできるようになったわけです。コメントをキャンセルメールアドレスが公開されることはありません。志久プログラムネタや思いついたり世間で話題になっている数学ネタを解説したりしています。プログラマとしては今年度(つまり2020年3月)までの復帰となるか、完全復帰となるか、別の仕事に戻るかは運と実力次第。ちなみに教育系のプログラムでもOKです。アクセスカウンタアクセス数:スポンサーリンク。