2014年4月26日土曜日

epgrec dvb: Value too large for defined data type

epgrecをpt2(dvb)で使っててたまに以下のようなエラーが出る。
 dd: reading `/dev/dvb/adapter0/dvr0': Value too large for defined data type

これが出るとデータがドロップされているので、動画がちょっと飛ぶ。
なんとかしたい。

ちょっと調べた限りでは、ファイルサイズ32bitの壁みたいな情報があったけど、
多分それが原因では無さそう。
(ちゃんと64bitを指定してるし。)

メッセージを調べると、errornoのEOVERFLOWの時に出るメッセージのようだ。
どうもdd内のreadがEOVERFLOWで失敗しているっぽい。
となると原因はドライバ内と思われる。

で、pt2に関係ありそうなところで、EOVERFLOWがあるのは、kernelソース内
drivers/media/dvb/pt1/dvb-core/dmxdev.c
dvb_dmxdev_buffer_writeで、

        free = dvb_ringbuffer_free(buf);
        if (len > free) {
                dprintk("dmxdev: buffer overflow\n");
                return -EOVERFLOW;
        }

という感じでリングバッファにデータを詰め込もうとしているところくらいか。
どうもカーネル内のリングバッファが足りてないのではないか?

と思ったので、カーネルのリングバッファサイズを増やしたい。
カーネルソースを眺めた結果、ioctlのDMX_SET_BUFFER_SIZEで動的に変更できそうだ。

結果はまたあとで書く。

0 件のコメント:

コメントを投稿