MobileHackerzさんのインデックス形式(YYMMDDhh_Chnn.idx)が デファクトとなっている。内部はARIB TR-B14 TOT JST_time(40bit) + ストリーム(YYMMDDhh_Chnn.ts)の先頭バイトオフセット(32bitまたは64bit)。これでシークできるようになってるわけね。
俺システムではdvbstreamの出力を上記の形式に変換するために、perlrtmp氏の OneSeg24 for Linuxに付属のrec.plを 使っていた。しかし見ての通りPerlなので、スクリプトでTSストリームのパースを 24時間やっているわけだ。しかも8ch分。
UNIXパイプの基本的な構造として、
# (プロセスA) | (プロセスB)
とつないだ時、プロセスBの処理が滞るとプロセスAも自動的に止められてしまう(ブロックI/O)。プロセスAがcatコマンドみたいな一時停止しても良いものであれば全く問題なく綺麗に動く。 しかし、Linuxワンセグ野郎の場合は、dvbstreamというUSBターゲットからDVB API経由でリアルタイムにストリーム読み出すコマンドなので、止められてバッファオーバーすると即座にアボンな訳だ。
AtomPCでやっていた時のパケットロスは、このCPUぶん回しに影響されているのでは という 仮説の元 、以前字幕解析用に作ったdumpeitにrec.plと同様の機能を 付け足してみた。当然Cネイティブ。
入力は2009年3月30日00:00:00〜2009年3月31日23:59:59までのNHK総合の総ストリーム8987488520バイト。
# cat /mnt/ts/090330/*_Ch27.ts /mnt/ts/090331/*_Ch27.ts | time perl rec.pl -h 27 -d /tmp/ts2 305.51user 97.31system 9:15.40elapsed 72%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (1major+14718minor)pagefaults 0swaps
Perlでは9分15秒 でした。
次は俺のプログラムdumpeit。
# cat /mnt/ts/090330/*_Ch27.ts /mnt/ts/090331/*_Ch27.ts | time ./dumpeit -h 27 -d /tmp/ts2 75.55user 102.14system 6:54.48elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (3major+5433minor)pagefaults 0swaps
Cネイティブでも6分54秒....たった3割減? 実際にはrec.plはファイルの分割だけ、 dumpeitはEITファイル(番組情報)とSUBファイル(字幕)をパースして生成するから、 dumpeitの方が遥かに重い処理ではあるがそれにしても....
仮説と異なる結果がでたので、試しに8GB分のファイルコピー(catリダイレクト)を測定する。
# cat /mnt/ts/090330/*_Ch27.ts /mnt/ts/090331/*_Ch27.ts | time cat > /tmp/ts2/test.ts 4.26user 115.42system 6:07.82elapsed 32%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+152minor)pagefaults 0swaps
単なるコピーで6分7秒だと?! ということは 演算部分だけ抜き出せば4倍速 なわけだ(188秒vs47秒、字幕パースしてるにしては優秀でそ)。
しかし....もしかして....AtomからAthlon64X2に乗り換えて取りこぼさなくなったのは CPUじゃなくてHDDのせい だったかもしれないな...。
Atomは「WesternDigital WD Caviar Green WD10EADS(5400rpm)」Athlonの方は「日立 Deskstar 7K1000.B HDT721010SLA360 (7200rpm)」 なんだよ。 ワンセグはビットレートが低いとは言え、8ch分のストリームをリアルタイムにパースして個々のファイルに書き込んでいくわけだから処理自体がランダムアクセスの固まりみたいなもん。だからHDDはランダムが少しでも速い方が良いというわけだ。
が....perlrtmp氏はAtom+WD10EADSで見事に間に合っているわけだが....やっぱ俺の書いたLOG-J200チューナドライバがタコなせいかしら(笑)二人ではチューナ構成が全くちがうのだ。
論点がぼやけてきたけど、これからワンセグ野郎システムを組む人には7200rpmHDDをお薦めして筆をおくことにします。