Filterの選定
basic_vorbis_fileのテスト用にエンコーダも必要になりました。
Zlib FiltersやBzip2 Filtersがsymmetric_filterを使って実装されているため、同じようにsymmetric_filterで試していました。
symmetric_filterには、
- Source/Sinkの種類に依存しない。
- filter()関数の定義だけで、DualUseFilterを実装できる。
といった利点もあるのですが、filter()関数の実装が複雑になりがちで、libvorbisとの相性も悪い感じです。問題点としては、
- 状態遷移を自前で管理する必要がある。
- 入出力の両方でバッファリングが必要になる。
- libvorbisがエンコード結果をrealloc()で確保したバッファに出力する。symmetric_filter()を使う場合は、この結果をfilter()に渡されたバッファに分割してコピーすることになる。
が挙げられます。
InputFilterやOutputFilterなら、入力か出力の一方をブロック操作で行えるので、状態遷移とバッファリング手間が半分で済みます。
また、Vorbisエンコーディングは可変長方式なので、出力バッファのサイズをread()の引数で指定されたサイズと一致させることはできません。
今回は、OutputFilterモデルを採用するのがよさそうです。
うーん、結局Sinkのアダプタとして作っても大差ないのかなぁ。