2012年2月18日土曜日

MySQL対応

取りあえず動くようにできました。
DATABASE_NAME, USER_NAME, PASSWORDは適当に読み替えてください。
MySQLのテーブル作成時に、da_channel, da_event, da_genreのプライマリキーにNOT NULL AUTO_INCREMENTを追加しました。

--- epg.pl.orig 2009-01-25 16:32:56.000000000 +0900
+++ epg.pl      2012-02-18 12:03:30.000000000 +0900
@@ -190,7 +190,7 @@
 and
        ? <= dv_start_time
 and
-       dv_start_time < datetime(?, ?)
+       dv_start_time < addtime(?, ?)
 END

        my $sth = $dbh->prepare($sql);
@@ -218,7 +218,7 @@
 update
        da_event
 set
-       dv_duration = time(julianday(?) - julianday(dv_start_time) - 0.5)
+       dv_duration = timediff(?, dv_start_time)
 where
        dv_service_id = ?
 and
@@ -226,7 +226,7 @@
 and
        dv_start_time < ?
 and
-       ? < datetime(dv_start_time, dv_duration)
+       ? < addtime(dv_start_time, dv_duration)
 END

        my $udh = $dbh->prepare($sql);
@@ -325,8 +325,8 @@
 }

 sub dbiConnect {
-       my $dsn = 'DBI:SQLite:dbname=epg.db';
-       my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 1, AutoCommit => 0});
+       my $dsn = 'DBI:mysql:database=DATABASE_NAME;host=localhost';
+       my $dbh = DBI->connect($dsn, 'USER_NAME', 'PASSWORD', {RaiseError => 1, AutoCommit => 0, mysql_enable_utf8 => 1});
        return $dbh;
 }

epg.cgiは、次のようになりました。
サブクエリが遅かったので、distinctをつけましたが影響あるのか分かりません。まあジャンルなので。

--- epg.cgi.orig        2009-01-25 15:38:34.000000000 +0900
+++ epg.cgi     2012-02-18 13:00:08.000000000 +0900
@@ -3,9 +3,11 @@
 use strict;
 use DBI;
 use CGI;
+use utf8;
+
+my $dsn = 'DBI:mysql:database=DATABASE_NAME;host=localhost';
+my $dbh = DBI->connect($dsn, 'USER_NAME', 'PASSWORD', {RaiseError => 1, AutoCommit => 0, mysql_enable_utf8 => 1});

-my $dsn = 'DBI:SQLite:dbname=../oneseg24/epg.db';
-my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 1, AutoCommit => 0});

 my @tm = localtime(time - 60*60*4); $tm[5] += 1900; $tm[4]++;
 my $q = new CGI;
@@ -33,6 +35,7 @@
        '#553333',
 );

+binmode(STDOUT,":utf8");
 print "Content-type: text/html\n\n";

 print <<END;
@@ -126,12 +129,12 @@
        p.dv_name,
        p.dv_text,

-       (select
+       (select distinct
                g1.mg_name
        from
-               da_genre g
+               da_genre as g
                        left outer join
-                               ma_genre1 g1
+                               ma_genre1 as g1
                        on
                                g1.mg_level1 = g.mg_level1
        where
@@ -145,21 +148,21 @@
        c.dc_id,
        c.dc_ch,

-       strftime('%s', p.dv_start_time),
-       strftime('%s', datetime(p.dv_start_time, p.dv_duration)),
-       strftime('%Y%m%d-%H%M%S', p.dv_start_time),
-       strftime('%H%M%S', datetime(p.dv_start_time, p.dv_duration)),
-       strftime('%H', p.dv_start_time),
-       strftime('%M', p.dv_start_time),
-
-       julianday(p.dv_start_time) - julianday(?),
-       p.dv_start_time <= datetime('now', 'localtime'),
-       datetime('now', 'localtime') < datetime(p.dv_start_time, p.dv_duration)
+       unix_timestamp(p.dv_start_time),
+       unix_timestamp(addtime(p.dv_start_time, p.dv_duration)),
+       date_format(p.dv_start_time, '%Y%m%d-%H%i%s'),
+       date_format(addtime(p.dv_start_time, p.dv_duration), '%H%i%s'),
+       date_format(p.dv_start_time, '%H'),
+       date_format(p.dv_start_time, '%i'),
+
+       datediff(p.dv_start_time, ?),
+       p.dv_start_time <= localtime(),
+       localtime() < addtime(p.dv_start_time, p.dv_duration)

 from
-       da_event p
+       da_event as p
                inner join
-                       da_channel c
+                       da_channel as c
                on
                        c.dc_network_id = p.dv_original_network_id
                and
@@ -167,9 +170,9 @@
 where
        c.dc_id = ?
 and
-       datetime(?, '4 hours') <= p.dv_start_time
+       date_add(?, INTERVAL 4 hour) <= p.dv_start_time
 and
-       p.dv_start_time < datetime(?, '29 hours')
+       p.dv_start_time < date_add(?, INTERVAL 29 hour)
 order by
        p.dv_start_time
 END
diffをそのまま書くと間延びしますのね。
スタイルシートとかでスクロールできるようにした方がいいのかも。

2012年2月17日金曜日

database is locked

epg.plがほぼ毎日、次のようなメッセージを出力しています。
DBD::SQLite::st execute failed: database is locked at /var/oneseg24/epg.pl line 209.
それぞれのチャンネルで動作しているepg.plのDB処理がかぶるタイミングが結構あるようです。
MySQLを使用するように改造してみようと思います。
DBIを使用しているので修正は簡単にできそうですが、SQLiteの手軽さが無くなってしまうのはちょっと微妙な感じもします。

2012年2月12日日曜日

ワンセグ野郎できた!

ワンセグ野郎のセットアップは、特に書くこともないくらい簡単でした。
無事に生TSが取れてたようで、番組も問題なく見ることができました。
これでワンセグ野郎の仲間入りです。

URLをメモしておきます。開発者に方々に感謝!

OneSeg24 for Linux
perlRTMP
DVB tools - dvbstream




Siano Niceが動いた!

PachworkにステータスがRFCですが、パッチがありました。firmwareの選択処理とモジュールの依存関係処理を追加しているようです。
私の環境では、ファームウェアは正しく読み込めているようなので、モジュールの依存関係のところだけコードを変更しました。

--- sms-cards.c.orig       2012-02-11 07:45:34.642588548 +0900
+++ sms-cards.c 2012-02-11 17:52:52.515595099 +0900
@@ -299,6 +299,7 @@
        case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
        case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
        case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
+       case SMS1XXX_BOARD_SIANO_NICE:
                request_module("smsdvb");
                break;
        default:
修正前

$ lsmod |grep sms
smsusb                  9020  0
smsmdtv                32268  1 smsusb
rc_core                19720  7 smsmdtv,ir_lirc_codec,ir_sony_decoder,ir_jvc_decoder,ir_rc6_decoder,ir_rc5_decoder,ir_nec_decoder
修正後、smsdvbがロードされて/dev/dvbもできました。
$ rmmod smsusb smsmdtv
$ lsmod |grep sm
smsdvb                 13579  0
dvb_core              104074  1 smsdvb
smsusb                  9020  0
smsmdtv                32268  2 smsdvb,smsusb
rc_core                19720  7 smsmdtv,ir_lirc_codec,ir_sony_decoder,ir_jvc_decoder,ir_rc6_decoder,ir_rc5_decoder,ir_nec_decoder
$ ls /dev/dvb
adapter0

$ dmesg
usb 1-1.2: new high speed USB device using ehci_hcd and address 8
usb 1-1.2: New USB device found, idVendor=187f, idProduct=0202
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.2: Product: MDTV Receiver
usb 1-1.2: Manufacturer: MDTV Receiver
usb 1-1.2: configuration #1 chosen from 1 choice
usb 1-1.2: firmware: requesting isdbt_nova_12mhz_b0.inp
smscore_set_device_mode: firmware download success: isdbt_nova_12mhz_b0.inp
DVB: registering new adapter (Siano Nice Digital Receiver)
DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
usbcore: registered new interface driver smsusb
DVB toolsで提供されているdvbstreamを使用して、TSが取れるか確認します。 試しにTBS(周波数527143)を指定してみると、データは取れているようです。

$ ./dvbstream -c 0 -f 527143 8192 -o > test.ts
dvbstream v0.5 - (C) Dave Chapman 2001-2004
Released under the GPL.
Latest version available from http://www.linuxstb.org/
Using DVB card "Siano Mobile Digital MDTV Receiver"
tuning DVB-T (in United Kingdom) to 527143000 Hz
polling....
Getting frontend event
FE_STATUS:
polling....
Getting frontend event
FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC
Event:  Frequency: 10600000
SymbolRate: 0
FEC_inner:  0

Bit error rate: 258
Signal strength: 30
SNR: 15
FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC
Setting filter for PID 8192
Output to stdout
Streaming 1 stream
^C
Caught signal 2 - closing cleanly.
取りあえず、東京で見られる8局は受信できるようなので、生TSが取れていることを期待してOneSeg24 for Linuxをセットアップします。

sianoモジュールコンパイル

Windowsマシンで付属CDからドライバをインストールすると、C:\windows\system32にisdbt_nova_12mhz_b0.inpがインストールされます。これは、LinuxTVのCVOC-E121で書かれているファームウェアと同じなので、まずはNova Bと同じ方法を試してみることにします。

CentOS6で使用するので、CentOSのwikiを参考に環境を準備します。

まず、カーネルソースをインストールしてパッチを当てます。

$ uname -r
2.6.32-220.4.1.el6.x86_64
$ rpm -iv kernel-2.6.32-220.4.1.el6.src.rpm
$ cd ~/rpmbuild/SPEC
$ rpmbuild -bp --target=`uname -m` kernel-2.6.spec


取りあえず、標準のモジュールをコンパイルしてみます。

$ cd ~/rpmbuild/BUILD/kernel-2.6.32-220.4.1.el6/linux-2.6.32-220.4.1.el6.x86_64
$ cp /lib/modules/`uname -r`/build/Module.symvers .
$ make prepare
$ make modules_prepare
$ make M=drivers/media/dvb/siano

特にエラーも出ないようなので、、LinuxTVのCVOC-E121にあるパッチを/tmp/siano.patchとして保存し、コンパイルします。
kernel 2.6.35.10用のパッチですが、そのままあたりました。

$ cd drivers/media/dvb/siano
$ patch -p1 < /tmp/siano.patch
patching file smscoreapi.c
Hunk #2 succeeded at 529 (offset -2 lines).
Hunk #3 succeeded at 576 (offset -2 lines).
Hunk #4 succeeded at 605 (offset -2 lines).
patching file smscoreapi.h
patching file smsdvb.c
$ cd -
$ make M=drivers/media/dvb/siano

オリジナルモジュールのバックアップを取って、入れ替えます。

$ tar cfz /tmp/siano-`uname -r`.tar.gz /lib/modules/`uname -r`/kernel/drivers/media/dvb/siano
$ su
# cp drivers/media/dvb/siano/*.ko /lib/modules/`uname -r`/kernel/drivers/media/dvb/siano

lsmodでsms*がロードされているか確認し、必要に応じrmmodします。
チューナーを再度挿してみると、次のような表示が出ました。いけそうな感じです。

$ dmesg
usb 1-1.2: new high speed USB device using ehci_hcd and address 4
usb 1-1.2: New USB device found, idVendor=187f, idProduct=0202
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.2: Product: MDTV Receiver
usb 1-1.2: Manufacturer: MDTV Receiver
usb 1-1.2: configuration #1 chosen from 1 choice
usb 1-1.2: firmware: requesting isdbt_nova_12mhz_b0.inp
smscore_set_device_mode: error -2 loading firmware: isdbt_nova_12mhz_b0.inp, trying again with default firmware
usb 1-1.2: firmware: requesting isdbt_nova_12mhz_b0.inp
smscore_set_device_mode: error -2 loading firmware: isdbt_nova_12mhz_b0.inp
smsusb_init_device: line: 382: smscore_start_device(...) failed
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
sms_ir_exit:
smsusb: probe of 1-1.2:1.0 failed with error -2

winodwsマシーンからisdbt_nova_12mhz_b0.inpをコピーして、/lib/firmwareに置いて再挑戦するとエラーにならなくなりましたが、/dev/dvb/*ができません。

$ dmesg
usb 1-1.2: new high speed USB device using ehci_hcd and address 6
usb 1-1.2: New USB device found, idVendor=187f, idProduct=0202
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.2: Product: MDTV Receiver
usb 1-1.2: Manufacturer: MDTV Receiver
usb 1-1.2: configuration #1 chosen from 1 choice
usb 1-1.2: firmware: requesting isdbt_nova_12mhz_b0.inp
smscore_set_device_mode: firmware download success: isdbt_nova_12mhz_b0.inp
$ ls -l /dev/dvb*
ls: cannot access /dev/dvb*: No such file or directory

もうちょい作業が必要なようです。

2012年2月11日土曜日

Siano Mobile Silicon Nice

購入したチューナーはSianoチップでしたが、実績のあるNova BではなくNiceのようです。

$ lsusb
Bus 001 Device 003: ID 187f:0202 Siano Mobile Silicon Nice

LinuxTVのSmart Plusを見ると、動作していないような記述があります。
dmesgは、次のようになりました。

usb 1-1.2: new high speed USB device using ehci_hcd and address 3
usb 1-1.2: New USB device found, idVendor=187f, idProduct=0202
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.2: Product: MDTV Receiver
usb 1-1.2: Manufacturer: MDTV Receiver
usb 1-1.2: configuration #1 chosen from 1 choice
IR NEC protocol handler initialized
usb 1-1.2: firmware: requesting dvb_nova_12mhz_b0.inp
smscore_set_device_mode: error -2 loading firmware: dvb_nova_12mhz_b0.inp, trying again with default firmware
usb 1-1.2: firmware: requesting dvb_nova_12mhz_b0.inp
smscore_set_device_mode: error -2 loading firmware: dvb_nova_12mhz_b0.inp
smsusb_init_device: line: 382: smscore_start_device(...) failed
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
IR RC5(x) protocol handler initialized
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
smsusb_onresponse: line: 117: error, urb status -2, 0 bytes
sms_ir_exit:
smsusb: probe of 1-1.2:1.0 failed with error -2
usbcore: registered new interface driver smsusb
IR RC6 protocol handler initialized
IR JVC protocol handler initialized
IR Sony protocol handler initialized
lirc_dev: IR Remote Control driver registered, major 249
IR LIRC bridge handler initialized


いろいろ試してみる必要がありそうです。

ISDB-T Digital TV Receiver

LinuxTVのISDB-T USB Devicesで実績のあるチップ、特にSiano Mobile Silicon Nova Bチップだと日本でも使用出来るようです。

ワンセグ野郎の夢敗れたり・・・で、蟹チップに変わってしまった商品が紹介されていたので参考にさせて頂き、dealextremeからISDB-T Digital TV Receiver USB Dongle with IR Remote Controllerを購入してみました。
使えなくても諦めのつく価格だったので、8個注文してしまいました。(ダメだったらもったいないけど)

届いたものは、USB ATSC Receiverと印刷されていて、違う商品のパッケージっぽいです。
画像


中身はこんな感じで、EzTV ISDB-Tとドングルにプリントされてました。
画像


注文してから届くまで20日も掛かったのに、ATSCのレシーバーだったらゴミになるところでした。

2012年2月9日木曜日

ワンセグ野郎

今更ながら24時間ワンセグ野郎を知りました。
調べてみると、Linuxで利用できるチューナーがまだ入手できるようなので、OneSeg24 for Linuxを構築してみることにしました。