summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.AURINFO29
-rw-r--r--.SRCINFO29
-rw-r--r--20-sc.conf6
-rw-r--r--Add_libdvbcsa_support.diff363
-rw-r--r--PKGBUILD64
5 files changed, 491 insertions, 0 deletions
diff --git a/.AURINFO b/.AURINFO
new file mode 100644
index 000000000000..248791d9d346
--- /dev/null
+++ b/.AURINFO
@@ -0,0 +1,29 @@
+pkgbase = vdr-sc
+ pkgdesc = Software CAM emulation
+ pkgver = 20120721
+ pkgrel = 12
+ url = http://207.44.152.197/
+ arch = x86_64
+ arch = i686
+ arch = arm
+ arch = armv6h
+ arch = armv7h
+ license = GPL2
+ makedepends = mercurial
+ depends = libdvbcsa
+ depends = openssl
+ depends = vdr-api=2.1.6
+ backup = etc/vdr/conf.avail/20-sc.conf
+ source = vdr-sc::hg+http://85.17.209.13:6100#revision=29b7b5f2
+ source = ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.6.tar.bz2
+ source = http://data.gpo.zugaina.org/vdr-devel/media-plugins/vdr-sc/files/vdr-sc-0.9.3.20120815_vdr-2.1.4_compilefix.diff
+ source = Add_libdvbcsa_support.diff
+ source = 20-sc.conf
+ md5sums = SKIP
+ md5sums = 79519dac59166fabc2029b916bd61d00
+ md5sums = 529bc4056e2be62904f676780ea2fbc8
+ md5sums = b00108754f574c0773d30e288b703045
+ md5sums = 397dfba03003ba28c5f95d0855497d78
+
+pkgname = vdr-sc
+
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..248791d9d346
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,29 @@
+pkgbase = vdr-sc
+ pkgdesc = Software CAM emulation
+ pkgver = 20120721
+ pkgrel = 12
+ url = http://207.44.152.197/
+ arch = x86_64
+ arch = i686
+ arch = arm
+ arch = armv6h
+ arch = armv7h
+ license = GPL2
+ makedepends = mercurial
+ depends = libdvbcsa
+ depends = openssl
+ depends = vdr-api=2.1.6
+ backup = etc/vdr/conf.avail/20-sc.conf
+ source = vdr-sc::hg+http://85.17.209.13:6100#revision=29b7b5f2
+ source = ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.6.tar.bz2
+ source = http://data.gpo.zugaina.org/vdr-devel/media-plugins/vdr-sc/files/vdr-sc-0.9.3.20120815_vdr-2.1.4_compilefix.diff
+ source = Add_libdvbcsa_support.diff
+ source = 20-sc.conf
+ md5sums = SKIP
+ md5sums = 79519dac59166fabc2029b916bd61d00
+ md5sums = 529bc4056e2be62904f676780ea2fbc8
+ md5sums = b00108754f574c0773d30e288b703045
+ md5sums = 397dfba03003ba28c5f95d0855497d78
+
+pkgname = vdr-sc
+
diff --git a/20-sc.conf b/20-sc.conf
new file mode 100644
index 000000000000..b3d89db6d133
--- /dev/null
+++ b/20-sc.conf
@@ -0,0 +1,6 @@
+[sc]
+#--budget=N
+# forces DVB device N to budget mode
+
+#--external-au=CMD
+# script for external key updates \ No newline at end of file
diff --git a/Add_libdvbcsa_support.diff b/Add_libdvbcsa_support.diff
new file mode 100644
index 000000000000..ebd520fbcf75
--- /dev/null
+++ b/Add_libdvbcsa_support.diff
@@ -0,0 +1,363 @@
+diff -ruN vdr-sc.orig/cam.c vdr-sc/cam.c
+--- vdr-sc.orig/cam.c 2013-05-04 22:47:03.338513750 +0200
++++ vdr-sc/cam.c 2013-05-04 22:49:16.315041313 +0200
+@@ -2799,10 +2799,19 @@
+ :stall(MAX_STALL_MS)
+ {
+ devId=DevId;
++#ifndef LIBDVBCSA
+ cs=get_suggested_cluster_size();
+ PRINTF(L_CORE_CSA,"%s: clustersize=%d rangesize=%d",devId,cs,cs*2+5);
+ range=MALLOC(unsigned char *,(cs*2+5));
+ memset(keys,0,sizeof(keys));
++#else
++ cs = dvbcsa_bs_batch_size();
++ PRINTF(L_CORE_CSA,"%d: batch_size=%d", devId, cs);
++ cs_tsbbatch_even = (dvbcsa_bs_batch_s *) malloc((cs + 1) * sizeof(struct dvbcsa_bs_batch_s));
++ cs_tsbbatch_odd = (dvbcsa_bs_batch_s *) malloc((cs + 1) * sizeof(struct dvbcsa_bs_batch_s));
++ memset(cs_key_even, 0, sizeof(cs_key_even));
++ memset(cs_key_odd, 0, sizeof(cs_key_odd));
++#endif
+ memset(pidmap,0,sizeof(pidmap));
+ ResetState();
+ }
+@@ -2810,8 +2819,19 @@
+ cDeCSA::~cDeCSA()
+ {
+ for(int i=0; i<MAX_CSA_IDX; i++)
++#ifndef LIBDVBCSA
+ if(keys[i]) free_key_struct(keys[i]);
+ free(range);
++#else
++ {
++ if (cs_key_even[i])
++ dvbcsa_bs_key_free(cs_key_even[i]);
++ if (cs_key_odd[i])
++ dvbcsa_bs_key_free(cs_key_odd[i]);
++ }
++ free(cs_tsbbatch_even);
++ free(cs_tsbbatch_odd);
++#endif
+ }
+
+ void cDeCSA::ResetState(void)
+@@ -2819,7 +2839,9 @@
+ PRINTF(L_CORE_CSA,"%s: reset state",devId);
+ memset(even_odd,0,sizeof(even_odd));
+ memset(flags,0,sizeof(flags));
++#ifndef LIBDVBCSA
+ lastData=0;
++#endif
+ }
+
+ void cDeCSA::SetActive(bool on)
+@@ -2831,8 +2853,16 @@
+
+ bool cDeCSA::GetKeyStruct(int idx)
+ {
++#ifndef LIBDVBCSA
+ if(!keys[idx]) keys[idx]=get_key_struct();
+ return keys[idx]!=0;
++#else
++ if (!cs_key_even[idx])
++ cs_key_even[idx] = dvbcsa_bs_key_alloc();
++ if (!cs_key_odd[idx])
++ cs_key_odd[idx] = dvbcsa_bs_key_alloc();
++ return (cs_key_even[idx] != 0) && (cs_key_odd[idx] != 0);
++#endif
+ }
+
+ bool cDeCSA::SetDescr(ca_descr_t *ca_descr, bool initial)
+@@ -2850,13 +2880,21 @@
+ }
+ LDUMP(L_CORE_CSA,ca_descr->cw,8,"%s.%d: %4s key set",devId,idx,ca_descr->parity?"odd":"even");
+ if(ca_descr->parity==0) {
++#ifndef LIBDVBCSA
+ set_even_control_word(keys[idx],ca_descr->cw);
++#else
++ dvbcsa_bs_key_set(ca_descr->cw, cs_key_even[idx]);
++#endif
+ if(!CheckNull(ca_descr->cw,8)) flags[idx]|=FL_EVEN_GOOD|FL_ACTIVITY;
+ else PRINTF(L_CORE_CSA,"%s.%d: zero even CW",devId,idx);
+ wait.Broadcast();
+ }
+ else {
++#ifndef LIBDVBCSA
+ set_odd_control_word(keys[idx],ca_descr->cw);
++#else
++ dvbcsa_bs_key_set(ca_descr->cw, cs_key_odd[idx]);
++#endif
+ if(!CheckNull(ca_descr->cw,8)) flags[idx]|=FL_ODD_GOOD|FL_ACTIVITY;
+ else PRINTF(L_CORE_CSA,"%s.%d: zero odd CW",devId,idx);
+ wait.Broadcast();
+@@ -2875,24 +2913,80 @@
+ return true;
+ }
+
++#ifdef LIBDVBCSA
++unsigned char ts_packet_get_payload_offset(unsigned char *ts_packet)
++{
++ if (ts_packet[0] != TS_SYNC_BYTE)
++ return 0;
++
++ unsigned char adapt_field = (ts_packet[3] &~ 0xDF) >> 5; // 11x11111
++ unsigned char payload_field = (ts_packet[3] &~ 0xEF) >> 4; // 111x1111
++
++ if (!adapt_field && !payload_field) // Not allowed
++ return 0;
++
++ if (adapt_field)
++ {
++ unsigned char adapt_len = ts_packet[4];
++ if (payload_field && adapt_len > 182) // Validity checks
++ return 0;
++ if (!payload_field && adapt_len > 183)
++ return 0;
++ if (adapt_len + 4 > TS_SIZE) // adaptation field takes the whole packet
++ return 0;
++ return 4 + 1 + adapt_len; // ts header + adapt_field_len_byte + adapt_field_len
++ }
++ else
++ {
++ return 4; // No adaptation, data starts directly after TS header
++ }
++}
++#endif
++
+ bool cDeCSA::Decrypt(unsigned char *data, int len, bool force)
+ {
+ cMutexLock lock(&mutex);
++#ifndef LIBDVBCSA
++ if (!range)
++#else
++ if (!cs_tsbbatch_even || !cs_tsbbatch_odd)
++#endif
++ {
++ PRINTF(L_CORE_CSA,"%s: Error allocating memory for DeCSA", __FUNCTION__);
++ return false;
++ }
++
++#ifndef LIBDVBCSA
+ int r=-2, ccs=0, currIdx=-1;
+ bool newRange=true;
+ range[0]=0;
++#else
++ int ccs = 0, currIdx = -1;
++ int payload_len, offset;
++ int cs_fill_even = 0;
++ int cs_fill_odd = 0;
++#endif
+ len-=(TS_SIZE-1);
+ int l;
+ for(l=0; l<len; l+=TS_SIZE) {
+ if(data[l]!=TS_SYNC_BYTE) { // let higher level cope with that
+ PRINTF(L_CORE_CSA,"%s: garbage in TS buffer",devId);
++#ifndef LIBDVBCSA
+ if(ccs) force=true; // prevent buffer stall
++#endif
+ break;
+ }
+ unsigned int ev_od=data[l+3]&0xC0;
+ if(ev_od==0x80 || ev_od==0xC0) { // encrypted
++#ifdef LIBDVBCSA
++ offset = ts_packet_get_payload_offset(data + l);
++ payload_len = TS_SIZE - offset;
++#endif
+ int idx=pidmap[((data[l+1]<<8)+data[l+2])&(MAX_CSA_PIDS-1)];
+ if(currIdx<0 || idx==currIdx) { // same or no index
++#ifdef LIBDVBCSA
++ data[l + 3] &= 0x3f; // consider it decrypted now
++#endif
+ currIdx=idx;
+ if(ccs==0 && ev_od!=even_odd[idx]) {
+ even_odd[idx]=ev_od;
+@@ -2917,20 +3011,38 @@
+ else PRINTF(L_CORE_CSA,"%s.%d: not active. wait skipped",devId,idx);
+ }
+ }
++#ifndef LIBDVBCSA
+ if(newRange) {
+ r+=2; newRange=false;
+ range[r]=&data[l];
+ range[r+2]=0;
+ }
+ range[r+1]=&data[l+TS_SIZE];
++#else
++ if (((ev_od & 0x40) >> 6) == 0)
++ {
++ cs_tsbbatch_even[cs_fill_even].data = &data[l + offset];
++ cs_tsbbatch_even[cs_fill_even].len = payload_len;
++ cs_fill_even++;
++ }
++ else
++ {
++ cs_tsbbatch_odd[cs_fill_odd].data = &data[l + offset];
++ cs_tsbbatch_odd[cs_fill_odd].len = payload_len;
++ cs_fill_odd++;
++ }
++#endif
+ if(++ccs>=cs) break;
+ }
++#ifndef LIBDVBCSA
+ else newRange=true; // other index, create hole
++#endif
+ }
+ else { // unencrypted
+ // nothing, we don't create holes for unencrypted packets
+ }
+ }
++#ifndef LIBDVBCSA
+ int scanTS=l/TS_SIZE;
+ int stallP=ccs*100/scanTS;
+
+@@ -2977,6 +3089,26 @@
+ }
+ else PRINTF(L_CORE_CSAVERB,"%s.%d: incomplete ccs=%3d cs=%3d",devId,currIdx,ccs,cs);
+ }
++#else
++ if (GetKeyStruct(currIdx))
++ {
++ if (cs_fill_even)
++ {
++ cs_tsbbatch_even[cs_fill_even].data = NULL;
++ dvbcsa_bs_decrypt(cs_key_even[currIdx], cs_tsbbatch_even, 184);
++ cs_fill_even = 0;
++ }
++ if (cs_fill_odd)
++ {
++ cs_tsbbatch_odd[cs_fill_odd].data = NULL;
++ dvbcsa_bs_decrypt(cs_key_odd[currIdx], cs_tsbbatch_odd, 184);
++ cs_fill_odd = 0;
++ }
++
++ stall.Set(MAX_STALL_MS);
++ return true;
++ }
++#endif
+ return false;
+ }
+
+diff -ruN vdr-sc.orig/cam.h vdr-sc/cam.h
+--- vdr-sc.orig/cam.h 2013-05-04 22:47:03.631830306 +0200
++++ vdr-sc/cam.h 2013-05-04 22:49:16.315041313 +0200
+@@ -235,15 +235,28 @@
+
+ #ifndef SASC
+
++#ifdef LIBDVBCSA
++extern "C" {
++#include <dvbcsa/dvbcsa.h>
++}
++#endif
++
+ #define MAX_CSA_PIDS 8192
+ #define MAX_CSA_IDX 16
+
+ class cDeCSA {
+ private:
+ int cs;
++#ifndef LIBDVBCSA
+ unsigned char **range, *lastData;
+- unsigned char pidmap[MAX_CSA_PIDS];
+ void *keys[MAX_CSA_IDX];
++#else
++ struct dvbcsa_bs_batch_s *cs_tsbbatch_even;
++ struct dvbcsa_bs_batch_s *cs_tsbbatch_odd;
++ struct dvbcsa_bs_key_s *cs_key_even[MAX_CSA_IDX];
++ struct dvbcsa_bs_key_s *cs_key_odd[MAX_CSA_IDX];
++#endif
++ unsigned char pidmap[MAX_CSA_PIDS];
+ unsigned int even_odd[MAX_CSA_IDX], flags[MAX_CSA_IDX];
+ cMutex mutex;
+ cCondVar wait;
+diff -ruN vdr-sc.orig/device.c vdr-sc/device.c
+--- vdr-sc.orig/device.c 2013-05-04 22:47:03.338513750 +0200
++++ vdr-sc/device.c 2013-05-04 22:49:16.318374424 +0200
+@@ -52,7 +52,7 @@
+ SetDescription("TS buffer on device %d", CardIndex);
+ f=File; size=Size; cardIndex=CardIndex; decsa=DeCsa;
+ delivered=false;
+- ringBuffer=new cRingBufferLinear(Size,TS_SIZE,true,"FFdecsa-TS");
++ ringBuffer=new cRingBufferLinear(Size,TS_SIZE,true,RINGBUFFERNAME);
+ ringBuffer->SetTimeouts(100,100);
+ if(decsa) decsa->SetActive(true);
+ SetActive(ScActive);
+diff -ruN vdr-sc.orig/device.h vdr-sc/device.h
+--- vdr-sc.orig/device.h 2013-05-04 22:47:03.628497164 +0200
++++ vdr-sc/device.h 2013-05-04 22:49:16.318374424 +0200
+@@ -25,6 +25,12 @@
+ #include <vdr/thread.h>
+ #include "misc.h"
+
++#ifndef LIBDVBCSA
++#define RINGBUFFERNAME "FFdecsa-TS"
++#else
++#define RINGBUFFERNAME "libdvbcsa-ts"
++#endif
++
+ class cDeCSA;
+
+ // ----------------------------------------------------------------
+diff -ruN vdr-sc.orig/Makefile vdr-sc/Makefile
+--- vdr-sc.orig/Makefile 2013-05-04 22:47:03.628497164 +0200
++++ vdr-sc/Makefile 2013-05-04 22:55:28.510416219 +0200
+@@ -143,19 +143,23 @@
+ DEFINES += -DVDR_MAXCAID=$(MAXCAID)
+ endif
+
++ifndef LIBDVBCSA
+ # FFdeCSA
+-CPUOPT ?= pentium
+-PARALLEL ?= PARALLEL_32_INT
+-CSAFLAGS ?= -Wall -fPIC -g -O3 -mmmx -fomit-frame-pointer -fexpensive-optimizations -funroll-loops
++PARALLEL ?= PARALLEL_128_SSE2
++CSAFLAGS ?= -fexpensive-optimizations -funroll-loops -mmmx -msse -msse2 -msse3
+ FFDECSADIR = FFdecsa
+ FFDECSA = $(FFDECSADIR)/FFdecsa.o
+-FFDECSATEST = $(FFDECSADIR)/FFdecsa_test.done
++DECSALIB = $(FFDECSA)
++else
++# libdvbcsa
++DECSALIB = -ldvbcsa
++DEFINES += -DLIBDVBCSA
++endif
+
+ # SASC
+ ifdef SASC
+ DEFINES += -DSASC
+ FFDECSA =
+-FFDECSATEST =
+ endif
+
+ # export for system makefiles
+@@ -175,7 +179,7 @@
+ else
+ BUILDTARGETS = $(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION) systems-pre $(DEVPLUGTARGETS)
+ endif
+-BUILDTARGETS += $(FFDECSATEST) systems i18n
++BUILDTARGETS += systems i18n
+
+ all: $(BUILDTARGETS)
+ .PHONY: i18n systems systems-pre contrib clean clean-core clean-systems clean-pre dist srcdist
+@@ -196,7 +200,7 @@
+ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(INCLUDES) $<
+
+ libvdr-$(PLUGIN).so: $(OBJS) $(FFDECSA)
+- $(CXX) $(CXXFLAGS) -shared $(OBJS) $(FFDECSA) $(LIBS) $(SHAREDLIBS) -o $@
++ $(CXX) $(CXXFLAGS) -shared $(OBJS) $(DECSALIB) $(LIBS) $(SHAREDLIBS) -o $@
+
+ $(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION): libvdr-$(PLUGIN).so
+ @cp -p $< $@
+@@ -216,8 +220,10 @@
+ $(LIBDIR)/libsc-dvbhddevice-$(SCAPIVERS).so.$(APIVERSION): libsc-dvbhddevice.so
+ @cp -p $< $@
+
+-$(FFDECSA) $(FFDECSATEST): $(FFDECSADIR)/*.c $(FFDECSADIR)/*.h
+- @$(MAKE) COMPILER="$(CXX)" FLAGS="$(CSAFLAGS) -march=$(CPUOPT)" PARALLEL_MODE=$(PARALLEL) -C $(FFDECSADIR) all
++ifndef LIBDVBCSA
++$(FFDECSA): $(FFDECSADIR)/*.c $(FFDECSADIR)/*.h
++ @$(MAKE) COMPILER="$(CXX)" FLAGS="$(CXXFLAGS) $(CSAFLAGS)" PARALLEL_MODE=$(PARALLEL) -C $(FFDECSADIR) all
++endif
+
+ $(I18Npot): $(shell grep -rl '\(tr\|trNOOP\)(\".*\")' *.c $(SYSDIR))
+ xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR-SC --package-version=$(VERSION) --msgid-bugs-address='<noone@nowhere.org>' -o $@ `ls $^`
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..9d7f78282553
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,64 @@
+# Maintainer: Christopher Reimer <vdr4arch[at]creimer[dot]net>
+pkgname=vdr-sc
+pkgver=20120721
+_hgver=29b7b5f2
+_vdrapi=2.1.6
+pkgrel=12
+pkgdesc="Software CAM emulation"
+url="http://207.44.152.197/"
+arch=('x86_64' 'i686' 'arm' 'armv6h' 'armv7h')
+license=('GPL2')
+depends=('libdvbcsa' 'openssl' "vdr-api=${_vdrapi}")
+makedepends=('mercurial')
+_plugname=$(echo $pkgname | sed 's/vdr-//g')
+source=("$pkgname::hg+http://85.17.209.13:6100#revision=$_hgver"
+ "ftp://ftp.tvdr.de/vdr/Developer/vdr-$_vdrapi.tar.bz2"
+ 'http://data.gpo.zugaina.org/vdr-devel/media-plugins/vdr-sc/files/vdr-sc-0.9.3.20120815_vdr-2.1.4_compilefix.diff'
+ 'Add_libdvbcsa_support.diff'
+ "20-$_plugname.conf")
+backup=("etc/vdr/conf.avail/20-$_plugname.conf")
+md5sums=('SKIP'
+ '79519dac59166fabc2029b916bd61d00'
+ '529bc4056e2be62904f676780ea2fbc8'
+ 'b00108754f574c0773d30e288b703045'
+ '397dfba03003ba28c5f95d0855497d78')
+
+pkgver() {
+ cd "$srcdir/$pkgname"
+ hg log -l1 --template "{shortdate(date)}" | sed 's/-//g'
+}
+
+prepare() {
+ cd "$srcdir/$pkgname"
+
+ patch -p1 -i "$srcdir/Add_libdvbcsa_support.diff"
+ patch -p1 -i "$srcdir/vdr-sc-0.9.3.20120815_vdr-2.1.4_compilefix.diff"
+
+ #Disable Keyfile support. If you want to watch paytv, pay for it.
+# ( cd systems
+# ls | grep -v cardclient | xargs rm -r )
+
+ sed -i 's/MAXDVBDEVICES/MAXDEVICES/g' device.c
+
+ ln -sfr "$srcdir/vdr-$_vdrapi/PLUGINS/src/dvbhddevice" "$srcdir"
+ ln -sfr "$srcdir/vdr-$_vdrapi/PLUGINS/src/dvbsddevice" "$srcdir"
+}
+
+package() {
+ cd "$srcdir/$pkgname"
+
+ mkdir -p "$pkgdir/usr/lib/vdr/plugins"
+ make CFLAGS="$(pkg-config vdr --variable=cflags)" \
+ CXXFLAGS="$(pkg-config vdr --variable=cxxflags)" \
+ VDRDIR="/usr" \
+ LIBDIR="$pkgdir/$(pkg-config vdr --variable=libdir)" \
+ LOCALEDIR="$pkgdir/$(pkg-config vdr --variable=locdir)" \
+ MAXCAID=64 \
+ LIBDVBCSA=1 \
+ i18n systems libsc-dvbhddevice.so libsc-dvbsddevice.so libvdr-$_plugname.so
+ install -Dm755 libsc-dvbhddevice.so "$pkgdir/usr/lib/vdr/plugins/libsc-dvbhddevice.so.$_vdrapi"
+ install -Dm755 libsc-dvbsddevice.so "$pkgdir/usr/lib/vdr/plugins/libsc-dvbsddevice.so.$_vdrapi"
+ install -Dm755 libvdr-$_plugname.so "$pkgdir/usr/lib/vdr/plugins/libvdr-$_plugname.so.$_vdrapi"
+
+ install -Dm644 "$srcdir/20-$_plugname.conf" "$pkgdir/etc/vdr/conf.avail/20-$_plugname.conf"
+}