Beta4から更新されたので、早速入れ替えてみたのだが、oggencのオプション-qを0より小さくするとセグる。
lib/psy.c:_vp_offset_and_mix()の
for(i=0;i<n;i++){ ... if((logmdct[i]-lastmdct[i]) > 20){
で-q=-1等のときnが256になって、 lastmdct[i]がオーバーランしているようだ。
lastmdctはlib/mapping0.cにて、
b->nblock+i*128;
となっていて(iはchannel数)、 nblockのサイズはlib/block.cにて128*channel数と決め打ちになっている。
しかたがないから、むりやりバッファを増やしてみた。
--- lib/block.c.orig Sun Nov 6 10:28:03 2005 +++ lib/block.c Sun Nov 6 10:28:16 2005 @@ -288,8 +288,8 @@ b->psy_g_look=_vp_global_look(vi); /* added by aoyumi */ - b->nblock = _ogg_calloc((128*vi->channels), sizeof(*b->nblock)); - b->tblock = _ogg_calloc((128*vi->channels), sizeof(*b->tblock)); + b->nblock = _ogg_calloc((128*vi->channels)*2, sizeof(*b->nblock)); + b->tblock = _ogg_calloc((128*vi->channels)*2, sizeof(*b->tblock)); b->lownoise_compand_level = _ogg_calloc(vi->channels, sizeof(*b->lownoise_compand_level)); /* Initialize the envelope state storage */
これが期待されたエンコード結果を生成しているのかまったく自信がない(糞耳)。
とかなんとかいいながら、 -q=-2などとやって遊んでいるのだが(平均ビットレートは30〜40kb/sくらい)、 変な歪みもなくてよい。
blog comments powered by Disqus