diff options
-rw-r--r-- | .AURINFO | 29 | ||||
-rw-r--r-- | .SRCINFO | 29 | ||||
-rw-r--r-- | 20-sc.conf | 6 | ||||
-rw-r--r-- | Add_libdvbcsa_support.diff | 363 | ||||
-rw-r--r-- | PKGBUILD | 64 |
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" +} |