libwebmを見てみた

ページを検索してみて驚いたのですが、libwebmについて日本語で記述してあるページって私のブログしかなかったということが・・・。

というわけでlibwebmです。libwebmというよりmkvparserといった方が自然です。WebMのコンテナを操作するためのライブラリです。

名前からわかるとおり、mkvの仕様を参考に作られたような感じでルートのヘッダ部の構造は同じのようです。

コードはgitを使ってとってくれば完了ですが・・・。そのソースコードに唖然としてしまいました。

せめてサンプルコードくらいまともに動いてよ・・・

mkvparserのコードをコンパイルして仮にエンコードしたWebMのファイルをサンプル(コンテナの状態を出力するもの)で読ませてみたのですが・・・。

メモリ保護エラーで落ちました。

しかも保護エラーで落ちたポイントがサンプルコード中ではなくてライブラリのコード(しかも中心部)のコードだったという落ちが。

私でもわかるようなポイントでした。形式化するとこんなコードのミスです。

1カ所目

long long *p = new long long [n];
if(i > n){ /* pのメモリを拡張する */ }
p[i] = val; ++i;

2カ所目

long long *tmp,*ptr;
long long *tmp = new long long[size];
memset(tmp,0x00,size); memcpy(tmp,ptr,lastsize);
delete[] ptr; ptr = tmp; lastsize = size;

添え字の判定位置を間違えているやらメモリのコピーサイズおかしいやら・・・。

といっても私がリポジトリ上のコードを修正できるわけでもないですし、コードの開発者側に知らせる義務があるかどうかわからないですし・・・。

もしくはこのコードが半分忘れ去られているのでは、とも思っています。(DirectShowのWebMのライブラリは正しいので)

Windows(VC++)でやるならwebdshow付属のlibmkvparserを元にして作った方がいいと思う

一応libwebmにもVisualStudioのプロジェクトファイルは付属していますが、いろいろと微妙な問題があります。VC++では滅多に見かけないlong longがあったり・・・

VC++で組みたいならlibmkvparserからコードを変更する方が安全だと思います。が、DirectShowとの連動が強めになってます。

libmkvparser内にCMediaType(DirectShowのメディア種別を扱うクラス)が登場したりしているのでその部分を切り離すかそのまま利用するか考える必要があります。

libvpxはlibtheoraとライブラリの形式がほとんど同じなのでそちらは難しくない

そもそもlibvpxもlibtheoraも同じグループが組んでいるバージョン違い(libvpxはVP8、libtheoraはVP6(の拡張))なのでそれはそうなるはずですよね~と。

libvpxのビルドにはyasmが必要なのでダウンロードしておかないとだめですよ、と。32bit版のライブラリでいいならコンパイル済みのものがありますが。

というわけで次回のプロジェクトには組み込まない方がいいかな~と

思いました。そのままでは64bitには非対応だったり、すでにlibtheoraと独自フォーマットでの再生ができるのでそこまでこだわって組み込むほどでもなかったりと思いました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL