miniDLNAいじり(いじりちゅう)

タイムシーク対応を、ゆるゆると。
PMS avcmodを参考に、ファイルサイズ÷放映時間で秒あたりのbyte数を出して、TimeSeekRange.dlna.orgで指定された時刻指定をかければ、だいたいのスキップ位置を算出できるはず。
その前提は、放映時間が正しく拾えていることなんだけど、どうもffmpeg(libavformat)のav_find_stream_info()の結果が怪しい。放映時間が0だったり、30分の番組で9時間1分15秒だったり。TSのpacket_sizeが8だったりもする。
というわけで、multimedia/ffmpegを、multimedia/ffmpeg-develで置き換えてみた。

# portupgrade -f -o multimedia/ffmpeg-devel ffmpeg

結果。。。あまり変わらん。
放映時間が9時間の方は、RESOLUTIONが352x240になっているので、たぶんワンセグのpidを見ちゃって、そのビットレートでファイルサイズを割ってるんじゃないかなぁ。
放映時間が0だった方は、ちゃんと取れるようになっていた。
まずワンセグを分離すべきか?
どちらも、TSパケットサイズは8のまま。ただし、本番サーバではちゃんと188になってるっぽい。違いは、本番はi386でHDUSで録画、実験機はamd64でPT2で録画。。。amd64か?
DLNA.ORG_OP=11を送ったら、BRAVIA再生中に上が押せるようになった。その時のリクエスト:

GET /MediaItems/38.mpg HTTP/1.1
TimeSeekRange.dlna.org: npt=31.637-
getcontentFeatures.dlna.org: 1
Pragma: getIfoFileURI.dlna.org
transferMode.dlna.org: Streaming
X-AV-Physical-Unit-Info: pa="BRAVIA MBT-WZ1";
X-AV-Client-Info: av=5.0; cn="Sony Corporation"; mn="BRAVIA MBT-WZ1"; mv="1.7";
Host: 192.168.0.1:8200

対する返答が:

HTTP/1.1 200 OK
Content-Type: video/mpeg
Content-Length: 3890284438
TimeSeekRange.dlna.org: npt=31.637-1834.000/1834.000 bytes 68286426-3958570863/3958570864
transferMode.dlna.org: Streaming
Accept-Ranges: bytes
Connection: close
Date: Wed, 21 Apr 2010 17:32:32 GMT
EXT:
realTimeInfo.dlna.org: DLNA.ORG_TLAG=*
contentFeatures.dlna.org: DLNA.ORG_PN=MPEG_TS_HD_60_L2_ISO;DLNA.ORG_OP=11;DLNA.ORG_CI=0
Server: FreeBSD/8.0-BETA3 DLNADOC/1.50 UPnP/1.0 MiniDLNA/1.0

スキップするどころか、先頭に戻るわ、カウンタがおかしくなるわ、玉砕。
レスポンスのヘッダは合ってるように見えるが。。。