Instalacja sasc-ng w Ubuntu 10.10

Ten wpis został napisany dawno temu i może być już nieaktualny.

Matrix Źródło zdjęcia: http://picasaweb.google.com/lh/photo/JMArfIS7cNM4bAtfH4_blQ Jak już kiedyś pisałem, sasc-ng pozwala na oglądanie kodowanych kanałów w dowolnej aplikacji obsługującej standard dvb. Sama aplikacja nie musi "wiedzieć", że kanał jest kodowany. Moduł jądra kompilowany z sasc-ng tworzy dodatkowe urządzenie, na którym dostępny jest odkodowany sygnał. Jedyne do czego musimy zmusić aplikację DVB, to wskazać właściwe urządzenie. Sasc-ng nie jest dostępny w oficjalnych repozytoriach Ubuntu, dlatego trzeba go skompilować.

Instalacja zależności

Zaczynamy od instalacji nagłówków jądra i kilku innych pakietów potrzebnych do kompilacji:

sudo apt-get install linux-headers-`uname -r` build-essential mercurial libssl-dev gettext

Pobranie źródeł

Źródła sasc-ng pobieramy wprost z repozytorium dewelopera:

mkdir -p ~/Apps/src
cd ~/Apps/src
hg clone http://85.17.209.13:6100/sc

Nałożenie łatki usuwającej sprawdzanie uprawnień

Niestety sasc-ng odmawiał działania z moją kartą Cyfry+. Okazało się, że maska uprawnień PBM obliczana jest nieprawidłowo. Okazało się też, że jej obliczanie wydaje się być niepotrzebne (wielkie dzięki dla Wojtka za zauważenie tego!). Łatka sprawia, że metoda sprawdzająca uprawnienia zawsze zwróci true.

cd ~/Apps/src/
wget https://gist.github.com/raw/675636/185dd32935ce1e5e8b7a876d82859bf80d0cc71e/sc-seca.c.patch
cd ~/Apps/src/sc
patch -p1 < ../sc-seca.c.patch

Kompilacja

Wreszcie czas na kompilację programu i modułu jądra:

cd ~/Apps/src/sc/contrib/sasc-ng/
chmod +x configure
chmod +x dvbloopback/module/config_dvb.pl
./configure
make
make module

Instalacja

Kopiujemy moduł, binarkę i kilka bibliotek w ogólnie dostępne miejsca:

cd ~/Apps/src/sc/contrib/sasc-ng/
sudo rm /lib/modules/`uname -r`/misc/dvbloopback.ko
sudo cp sasc-ng /usr/bin
sudo cp sc/PLUGINS/lib/* /usr/lib/
sudo mkdir /lib/modules/`uname -r`/misc
sudo /usr/bin/install dvbloopback.ko /lib/modules/`uname -r`/misc/
sudo depmod

Konfiguracja

Tworzymy katalog na konfigurację:

sudo mkdir /etc/sc_files

Przykładowe pliki konfiguracyjne znajdziemy w katalogu examples źródeł sc (ściągnęliśmy je do ~/Apps/src/sc). Kartę Cyfry wpinam do programatora Phoenix, którego mam podłączonego do portu COM. Aby sasc-ng 'zobaczył' kartę, tworzymy wpis w /etc/sc_files/cardslot.conf:

sudo su -c "echo 'serial:/dev/ttyS0:0:0' > /etc/sc_files/cardslot.conf"

Uruchomienie

Przed pierwszym uruchomieniem musimy załadować moduł jądra:

sudo modprobe dvbloopback

Teraz możemy już uruchomić sasc-ng:

sasc-ng -j 0:1 --cam-budget --cam-dir /etc/sc_files

Jak zwykle wszystkie dostępne opcje dostępne są po wywołaniu sasc-ng -h.

Testowanie z mplayerem

Powinniśmy już być w stanie zobaczyć obraz kodowanych kanałów w aplikacjach typu mplayer, czy xine. Pokażę to na podstawie mplayera. Jeśli nie posiadamy listy kanałów, tworzymy ją szybko:

echo 'PLANETE(CYFRA +):10719:v:0:27500:165:100:4406' > ~/.mplayer/channels.conf

Uruchamiamy mplayer używając protokołu dvb://. Ważne jest, żeby pamiętać o wskazaniu odpowiedniego urządzenia DVB (w tym przypadku '2'):

mplayer dvb://2@

Testowanie z VDR

VDR sam rozponaje, czy program jest kodowany. Jeśli nie mamy softcama w VDR, to VDR uzna, że nie może pokazać obrazu. Musimy go nieco "ogłupić". Po pierwsze wszystkie kanały muszą być oznaczone jako niekodowane. Zamiast:

PLANETE;CYFRA +:10719:VC56M2O0S0:S13.0E:27500:165=2:100=pol@4:0:**100**:4406:318:11000:0

Powinniśmy mieć:

PLANETE;CYFRA +:10719:VC56M2O0S0:S13.0E:27500:165=2:100=pol@4:0:**0**:4406:318:11000:0

'0' oznacza program FTA. Poza tym musimy sprawić, aby VDR nie nadpisał nam naszych zmian. W tym celu w pliku /etc/vdr/setup.conf zmieniamy wartość opcji UpdateChannels na 0:

UpdateChannels = 0

Pozostało jeszcze kazać VDR korzystać z drugiego urządzenia DVB, na którym dostępny jest odkodowany sygnał. Do zmiennej OPTIONS w pliku /etc/default/vdr dodajemy opcję -D:

OPTIONS="-w 60 -D 1"

Uwaga: VDR numeruje urządzenia od zera. Dlatego wskazujemy urządzenie numer jeden. Zakładając, że mamy już uruchomiony sasc-ng, startujemy VDR:

sudo service vdr start

i cieszymy się odkodowanym obrazem TV. Wskazówka: Sprawienie, żeby wszystkie kanały były widziane jako FTA może być pracochłonne. Poniższym skryptem robimy to automatycznie dla całej listy:

sed -i -e 's/:\([^:]\+\)\(:\([^:]\+\):\([^:]\+\):\([^:]\+\):\([^:]\+\)\)$/:0\2/' channels.conf

Skrypt startowy

VDR jest domyślnie uruchamiany podczas startu systemu. Do pełni szczęścia chcielibyśmy, aby sasc-ng uruchamiany był przed VDR. Napisałem w tym celu skrypt init.d dla Ubuntu:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          sasc-ng
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# X-Start-Before:    $vdr
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts sasc-ng
# Description:       starts sasc-ng
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=sasc-ng
DESC=sasc-ng

test -x $DAEMON || exit 0

PIDFILE="/var/run/$NAME.pid"
SASC_NG="/usr/bin/sasc-ng"
OPTIONS="-j 0:1 --cam-budget"
CAM_DIR="./sc_files"

# Include sasc-ng defaults if available
if [ -f /etc/default/sasc-ng ] ; then
    . /etc/default/sasc-ng
fi

SASC_NG_ARGUMENTS="$OPTIONS --cam-dir $CAM_DIR -P $PIDFILE -D"

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
    echo "Loading dvbloopback module"
    modprobe dvbloopback

    echo -n "Starting $DESC: "
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec "$SASC_NG" -- $SASC_NG_ARGUMENTS || true
    echo "$NAME."
    ;;
  stop)
    echo -n "Stopping $DESC: "
    start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec "$SASC_NG" || true
    echo "$NAME."

    sleep 1
    echo "Unloading dvbloopback module"
    rmmod dvbloopback
    ;;
  restart)
    echo -n "Restarting $DESC: "
    start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec "$SASC_NG" || true
    sleep 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec "$SASC_NG" -- $SASC_NG_ARGUMENTS || true
    echo "$NAME."
    ;;
  status)
    status_of_proc -p $PIDFILE "$SASC_NG" sasc-ng && exit 0 || exit $?
    ;;
  *)
    echo "Usage: $NAME {start|stop|restart|status}" >&2
    exit 1
    ;;
esac

exit 0

Skrypt kopiujemy do /etc/init.d/sasc-ng i nadajemy mu prawa do wykonywania (chmod +x /etc/init.d/sasc-ng). Konfigurację przeprowadzamy w /etc/default/sasc-ng:

OPTIONS="-j 0:1 --cam-budget"
CAM_DIR="/etc/sc_files"

Teraz sasc-ng uruchamiamy i zatrzymujemy jak każdą usługę Ubuntu:

sudo service sasc-ng start

Aby program uruchamiany był ze startem Ubuntu wykonujemy:

sudo update-rc.d sasc-ng defaults

Uwagi

Mam nadzieję, że opis jest wystarczająco przejrzysty. Czekam na ewentualne sugestie, czy też inne komentarze ;)

Jakub Zalas

Jakub Zalas

Architekt, Programista, Trener