前回CentOS 7で使用できることを確認したので、今回はUbuntu 14.04 LTSで検証を行う。
検証を行う環境は以下。
- OS:Ubuntu Desktop 14.04 LTS
- 録画チューナー:PT2(余ってた)
- CPU:Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
- メモリ:4GB
それでは行ってみよう。
1.最低限の設定を行う
IPアドレスやホスト名の設定を行っておく。
ここについては割愛。
設定後、apt-get updateを行っておく。
sudo apt-get update
2.LAMP環境のインストール
次に、LAMP環境のインストールを行う。
(正直、Softcasの検証だけなら箇所はあまり必要ではない。epgrecなどの導入時用に記述しているだけだ。)
sudo apt-get install -y apache2 mysql-server libapache2-mod-auth-mysql php5-mysql php5 libapache2-mod-php5 php5-mcrypt
3.b25&PT2ドライバ&recpt1のインストール
PT2のドライバをインストールするため、必要となるパッケージをインストールする。
sudo apt-get install -y libccid libpcsclite-dev libpcsclite1 pcsc-tools pcscd autoconf g++
パッケージインストール後、復号ツールであるb25をダウンロード、解凍してインストールする。
wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
unzip c44e16dbb0e2.zip
cd pt1-c44e16dbb0e2/arib25
make clean && make && make install
次に、PT2ドライバのインストールを行う。
cd
sudo su -
echo "blacklist earth-pt1" > /etc/modprobe.d/blacklist.conf
exit
wget http://hg.honeyplanet.jp/pt1/archive/tip.tar.bz2
tar -xvlf tip.tar.bz2
cd pt1-c8688d7d6382/driver/
make
sudo make install
sudo modprobe pt1_drv
sudo reboot
再起動後、Ubuntu 14.04 LTSでPT2を認識している事を確認する。
test@test-P5K-E:~$ lspci | grep Multi
04:02.0 Multimedia controller: Xilinx Corporation Device 222a (rev 01)
test@test-P5K-E:~$
test@test-P5K-E:~$ lsmod | grep pt1
pt1_drv 40802 0
test@test-P5K-E:~$
test@test-P5K-E:~$ ls -la /dev | grep pt1
crw-rw-rw- 1 root video 248, 0 12月 23 23:30 pt1video0
crw-rw-rw- 1 root video 248, 1 12月 23 23:30 pt1video1
crw-rw-rw- 1 root video 248, 2 12月 23 23:30 pt1video2
crw-rw-rw- 1 root video 248, 3 12月 23 23:30 pt1video3
次に、recpt1のインストールを行う。
以下のコマンドを実行する。
cd pt1-c8688d7d6382/recpt1/
sudo ./autogen.sh
sudo ./configure -enable-b25
make
sudo make install
sudo su
echo "/usr/local/lib" > /etc/ld.so.conf.d/recpt1.conf
exit
sudo ldconfig
4.Softcasのインストール
さて、それではSoftcasのインストールを行ってみよう。
以下のコマンドで、softcasをダウンロード、解凍する。
wget http://www.wazoku.net/softcas.zip
unzip softcas.zip
cd softcas
wget -O winscard.cpp http://pastebin.com/download.php?i=5144Ah9g
wget -O Makefile http://pastebin.com/download.php?i=FQdSixkB
次に、ライブラリが変更されたため、winscard.cppの一部を書き換える必要がある。
以下のコマンドでソースの書き換えを行う。
sed -i "/LONG SCardGetStatusChange/s/LPSCARD_READERSTATE_A/LPSCARD_READERSTATE/g" winscard.cpp
sed -i "s/SCARD_IO_REQUEST g_rgSCardT1Pci;/const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, sizeof(SCARD_IO_REQUEST) };/g" winscard.cpp
上記対応で、winscard.cppは以下のようになる。
●winscard.cpp
// Put the following files in the same folder:
// Crypto.cpp, Crypto.h, Decoder-ECM.cpp, Decoder.h, Global.h
// Keys.cpp, Keys.h, Keyset.cpp, Keyset.h
// You should modify "Size" in Decoder-ECM.cpp l42 to "Size-3"
#include <string.h>
#include <PCSC/winscard.h>
#define htons htons_
#define ntohs ntohs_
#include "Global.h"
#include "Keys.h"
#include "Decoder.h"
#define CHAR char
extern"C"{
void __attribute__ ((constructor)) SCardVCasInit(void) {
BCAS::Keys::RegisterAll();
}
LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
{
*phContext=(SCARDCONTEXT)0x35313239;
return SCARD_S_SUCCESS;
}
LONG SCardListReaders(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
{
CHAR r[]="@OishiiSlurper\0";
if(mszReaders)memcpy(mszReaders,r,sizeof r);
*pcchReaders=sizeof r/sizeof r[0];
return SCARD_S_SUCCESS;
}
LONG SCardConnect(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
{
*phCard=(SCARDHANDLE)0x35313239;
*pdwActiveProtocol=SCARD_PROTOCOL_T1;
return SCARD_S_SUCCESS;
}
LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
{
switch(pbSendBuffer[1])
{
case 0x30:{
BYTE r[]={
0x00,0x39,0x00,0x00,0x21,0x00,0x00,0x05, 0xc0,0xff,0xee,0xc0,0xff,0xee,0x01,0x50,
0x36,0x31,0x04,0x66,0x4b,0x17,0xea,0x5c, 0x32,0xdf,0x9c,0xf5,0xc4,0xc3,0x6c,0x1b,
0xec,0x99,0x39,0x21,0x68,0x9d,0x4b,0xb7, 0xb7,0x4e,0x40,0x84,0x0d,0x2e,0x7d,0x98,
0xfe,0x27,0x19,0x99,0x19,0x69,0x09,0x11, 0x01,0x02,0x01,0x90,0x00};
memcpy(pbRecvBuffer,r,sizeof r);
*pcbRecvLength=sizeof r;
break;}
case 0x32:{
BYTE r[]={
0x00,0x0f,0x00,0x00,0x21,0x00,0x01,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x90,0x00};
memcpy(pbRecvBuffer,r,sizeof r);
*pcbRecvLength=sizeof r;
break;}
case 0x34:{
BYTE r[]={
0x00,0x15,0x00,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x90, 0x00};
BCAS::Decoder::DecodeECM(pbSendBuffer+5,pbSendBuffer[4],r+6,NULL);
memcpy(pbRecvBuffer,r,sizeof r);
*pcbRecvLength=sizeof r;
break;}
case 0x80:{
BYTE r[]={
0x00,0x10,0x00,0x00,0xA1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00};
memcpy(pbRecvBuffer,r,sizeof r);
*pcbRecvLength=sizeof r;
break;}
default:{
BYTE r[]={
0x00,0x04,0x00,0x00,0xa1,0xfe,0x90,0x00};
memcpy(pbRecvBuffer,r,sizeof r);
*pcbRecvLength=sizeof r;
break;}
}
return SCARD_S_SUCCESS;
}
LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition){return SCARD_S_SUCCESS;}
LONG SCardFreeMemory(SCARDCONTEXT,LPCVOID){return SCARD_S_SUCCESS;}
LONG SCardReleaseContext(SCARDCONTEXT){return SCARD_S_SUCCESS;}
LONG SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout,LPSCARD_READERSTATE rgReaderStates, DWORD cReaders){return SCARD_S_SUCCESS; }
SCARD_IO_REQUEST g_rgSCardT1Pci_;
const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, sizeof(SCARD_IO_REQUEST) };
}
ソース書き換え後、makeを行う。
make
make後、「libpcsclite.so.1.0.0」というファイルが作成されているので、これを既存の、ファイルと置き換える。
元のファイルについては、以下のコマンドで場所を確認する。
$ find /lib/ -name libpcsclite.so.1.0.0
/lib/x86_64-linux-gnu/libpcsclite.so.1.0.0
上記コマンドでファイルの場所は分かったので、置き換えを行う。
sudo cp libpcsclite.so.1.0.0 /lib/x86_64-linux-gnu/
これで、Softcasを利用する準備が整った。
5.テストの実施
実際に利用出来るか、以下のコマンドでテストする。
recpt1 --strip -b25 27 10 test.ts
テストの結果、無事に再生することが出来た。
これでUbuntuとCentOS、どちらのOSでも利用できるようになった。