日々

EPGStationで録画終了後にtsselectでエラーチェックログを出力するようにしてみたので結果を軽く見てみたところ、いずれもDropやScamble、Errorは無しで良いカンジ。ただ、eit_txtoutで録画の開始日時を確認すると番組が始まった数秒後になっていることがほとんどなので、本当に先頭が切れているのか確認してみた。
TSパケットを確認するプログラムを軽く作ってPIDごとに初めて出現するパケットと、そのPIDで初めて出現する開始パケットを一覧で出力してみた。プログラムが切り替わったことを示すPMTの前にMPEG-2とAACの開始パケットに加えてPCRも存在するので問題は無さげ。ただ、TOTはPMTの後に出てくるので、これが先頭が切れてると思われる原因じゃないかと思う。
てな訳で、初めて出現するTOTの値に、それより手前に出現するPCRと最初に現れるPCRの時間差を加えることで、本当の録画開始日時が得られるハズと思ってプログラムを書いてみる。つか、既に書いていたもので軽くチェックすると値がおかしい。あらためてプログラムを確認していくと、どうやら33bitのPCRの値を格納する部分でミスっているっぽいことが判明。
原因はMinGWGCC 3.3でlong longな変数に左ビットシフトを32以上かけようとすると値が32bitに丸められてしまうことが判った。他にも32bitを超える値が格納されている時に左ビットシフトを1以上かけただけでも値が丸められてしまうっぽい。64bit幅の表示方法を使ってなかった&符号を意識してなかった&型変換の際の型宣言や定数の型指定がなかった等で勘違いだったっぽい(汗)仕方ないのでバイト列を1バイトずつ256掛けてから加える方法でデータを1つにまとめて2で割ることで下位ビットを1ビットずつ捨てることにした。
とりあえず、見た目はともかく、ちゃんと動いたのでまあいいかってことで。
定時後、第二神明で帰宅。晩御飯はししゃもとコロッケとわかめとふの味噌汁。
何となく今日のプログラムの続きを作成。TOTが1秒単位なのでPCRはbaseだけでも十分な分解能があるってことで計算。ちゃんとEPGStation(Mirakurun)で番組開始ジャストから番組終了1秒後まで録画されていることが確認出来た。やっぱ、eit_txtoutはTOTのみしか見てなかったんだ。まあ、TOTって出てるから当然だとは思うけど(滝汗)これでより正確な録画開始と終了を確認出来る。
PCRのラップアラウンドとかちゃんと考慮したものを後日完成させよう。出来れば、EITも参照したいところだけどこっちは面倒そう。
タマ&フレンズ見終わったところでお茶入れてもらって一服。
今回プログラム組んでて、やはり手元にあった方がいいなってことで、デジタル放送教科書(上)をポチる。改訂版出てるのは知ってたけど、もう絶版みたい(汗)