Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -r 7be3bddbf7c3 -r aeeca29707aa BonDriverProxy.cpp
- --- a/BonDriverProxy.cpp Thu Aug 28 21:23:44 2014 +0900
- +++ b/BonDriverProxy.cpp Tue Sep 02 17:10:53 2014 +0900
- @@ -1,5 +1,8 @@
- #include "BonDriverProxy.h"
- +#include <getopt.h>
- +#include "arib25/arib_std_b25.h"
- +
- namespace BonDriverProxy {
- #define STRICT_LOCK
- @@ -7,8 +10,44 @@
- static std::list<cProxyServer *> InstanceList;
- static cCriticalSection Lock_Instance;
- +static B_CAS_CARD *g_bcas = 0;
- +static int g_b25_round = 4;
- +static int g_b25_enable = 0;
- +static int g_b25_strip = 0;
- +static int g_b25_emm = 0;
- +
- static int Init(int ac, char *av[])
- {
- + static const struct option options[] = {
- + {"b25", no_argument, &g_b25_enable, 1},
- + {"strip", no_argument, &g_b25_strip, 1},
- + {"EMM", no_argument, &g_b25_emm, 1},
- + {"round", required_argument, &g_b25_emm, 'r'},
- + {0}
- + };
- + int opt;
- + while ((opt = getopt_long(ac, av, "", options, NULL)) != -1)
- + {
- + switch (opt)
- + {
- + case 0: // long options
- + break;
- + case 'r': // multi2 round
- + g_b25_round = strtoul(optarg, NULL, 10);
- + break;
- + default:
- + return -1;
- + }
- + }
- + if (optind > 1) {
- + int i = optind;
- + int j = 1;
- + while (i < ac) {
- + av[j++] = av[i++];
- + }
- + ac -= optind - 1;
- + }
- +
- if (ac < 3)
- return -1;
- ::strncpy(g_Host, av[1], sizeof(g_Host) - 1);
- @@ -20,6 +59,17 @@
- if (ac > 4)
- g_TsPacketBufSize = ::atoi(av[4]);
- }
- +
- + if (g_b25_enable)
- + {
- + g_bcas = create_b_cas_card();
- + if (g_bcas) {
- + if (g_bcas->init(g_bcas) < 0) {
- + g_bcas->release(g_bcas);
- + g_bcas = 0;
- + }
- + }
- + }
- return 0;
- }
- @@ -740,6 +790,25 @@
- ts.tv_sec = 0;
- ts.tv_nsec = WAIT_TIME * 1000 * 1000;
- + ARIB_STD_B25 *b25 = 0;
- + if (g_bcas)
- + {
- + if ((b25 = create_arib_std_b25()) != 0)
- + {
- + if (b25->set_b_cas_card(b25, g_bcas) < 0)
- + {
- + b25->release(b25);
- + b25 = 0;
- + }
- + else
- + {
- + b25->set_strip(b25, g_b25_strip);
- + b25->set_emm_proc(b25, g_b25_emm);
- + b25->set_multi2_round(b25, g_b25_round);
- + }
- + }
- + }
- +
- // TS読み込みループ
- while (!StopTsRead)
- {
- @@ -755,10 +824,26 @@
- LOCK(TsLock);
- if (pIBon->GetTsStream(&pBuf, &dwSize, &dwRemain) && (dwSize != 0))
- {
- - if ((pos + dwSize) < TsPacketBufSize)
- + ARIB_STD_B25_BUFFER buf;
- + if (b25)
- {
- - ::memcpy(&pTsBuf[pos], pBuf, dwSize);
- - pos += dwSize;
- + buf.data = pBuf;
- + buf.size = dwSize;
- + b25->put(b25, &buf);
- + b25->get(b25, &buf);
- + if (buf.size == 0)
- + continue;
- + }
- + else
- + {
- + buf.data = pBuf;
- + buf.size = dwSize;
- + }
- +
- + if ((pos + buf.size) < TsPacketBufSize)
- + {
- + ::memcpy(&pTsBuf[pos], buf.data, buf.size);
- + pos += buf.size;
- if (dwRemain == 0)
- {
- for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
- @@ -769,28 +854,28 @@
- else
- {
- DWORD left, dwLen = TsPacketBufSize - pos;
- - ::memcpy(&pTsBuf[pos], pBuf, dwLen);
- + ::memcpy(&pTsBuf[pos], buf.data, dwLen);
- for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
- (*it)->makePacket(eGetTsStream, pTsBuf, TsPacketBufSize, fSignalLevel);
- - left = dwSize - dwLen;
- - pBuf += dwLen;
- + left = buf.size - dwLen;
- + buf.data += dwLen;
- while (left > TsPacketBufSize)
- {
- for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
- - (*it)->makePacket(eGetTsStream, pBuf, TsPacketBufSize, fSignalLevel);
- + (*it)->makePacket(eGetTsStream, buf.data, TsPacketBufSize, fSignalLevel);
- left -= TsPacketBufSize;
- - pBuf += TsPacketBufSize;
- + buf.data += TsPacketBufSize;
- }
- if (left != 0)
- {
- if (dwRemain == 0)
- {
- for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
- - (*it)->makePacket(eGetTsStream, pBuf, left, fSignalLevel);
- + (*it)->makePacket(eGetTsStream, buf.data, left, fSignalLevel);
- left = 0;
- }
- else
- - ::memcpy(pTsBuf, pBuf, left);
- + ::memcpy(pTsBuf, buf.data, left);
- }
- pos = left;
- }
- @@ -799,6 +884,8 @@
- if (dwRemain == 0)
- ::nanosleep(&ts, NULL);
- }
- + if (b25)
- + b25->release(b25);
- delete[] pTsBuf;
- return NULL;
- }
- @@ -969,7 +1056,7 @@
- {
- if (BonDriverProxy::Init(argc, argv) != 0)
- {
- - fprintf(stderr, "usage: %s address port (packet_fifo_size tspacket_bufsize)\ne.g. $ %s 192.168.0.100 1192\n", argv[0],argv[0]);
- + fprintf(stderr, "usage: %s [--b25 [--round N] [--strip] [--EMM]] address port (packet_fifo_size tspacket_bufsize)\ne.g. $ %s 192.168.0.100 1192\n", argv[0],argv[0]);
- return 0;
- }
- diff -r 7be3bddbf7c3 -r aeeca29707aa Makefile
- --- a/Makefile Thu Aug 28 21:23:44 2014 +0900
- +++ b/Makefile Tue Sep 02 17:10:53 2014 +0900
- @@ -2,8 +2,8 @@
- SRCDIR = .
- LDFLAGS =
- -LIBS = -ldl
- -SRCS = BonDriverProxy.cpp BonDriver_Proxy.cpp BonDriver_LinuxPT.cpp
- +LIBS = -ldl -larib25
- +SRCS = BonDriverProxy.cpp BonDriver_Proxy.cpp BonDriver_LinuxPT.cpp sample.cpp
- UNAME := $(shell uname)
- ifeq ($(UNAME), Darwin)
- @@ -18,11 +18,14 @@
- EXT = so
- endif
- -all: server client driver
- +all: server client driver sample
- server: BonDriverProxy
- client: BonDriver_Proxy.$(EXT)
- driver: BonDriver_LinuxPT.$(EXT)
- +sample: sample.o
- + $(CXX) $(CXXFLAGS) -rdynamic -o $@ $^ $(LIBS)
- +
- BonDriverProxy: BonDriverProxy.o
- $(CXX) $(CXXFLAGS) -rdynamic -o $@ $^ $(LIBS)
- @@ -50,7 +53,7 @@
- endif
- clean:
- - $(RM) *.o *.so *.dylib BonDriverProxy .depend
- + $(RM) *.o *.so *.dylib BonDriverProxy sample .depend
- distclean: clean
- dep: .depend
- diff -r 7be3bddbf7c3 -r aeeca29707aa sample.cpp
- --- a/sample.cpp Thu Aug 28 21:23:44 2014 +0900
- +++ b/sample.cpp Tue Sep 02 17:10:53 2014 +0900
- @@ -1,7 +1,7 @@
- /*
- -$ g++ -O2 -Wall -rdynamic -o sample sample.cpp -ldl
- +$ g++ -O2 -Wall -rdynamic -o sample sample.cpp -ldl -larib25
- */
- -#define FILE_OFFSET_BITS 64
- +#define _FILE_OFFSET_BITS 64
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- @@ -15,6 +15,123 @@
- #include "typedef.h"
- #include "IBonDriver2.h"
- +#include <getopt.h>
- +#include "arib25/arib_std_b25.h"
- +
- +class B25Decorder {
- + ARIB_STD_B25 *b25;
- + B_CAS_CARD *bcas;
- + bool valid;
- + ARIB_STD_B25_BUFFER sbuf;
- + ARIB_STD_B25_BUFFER dbuf;
- +
- +public:
- + B25Decorder() : b25(0), bcas(0), valid(false) {}
- + ~B25Decorder() { release(); }
- +
- + int init(bool strip, bool emm, int round = 4)
- + {
- + int code = -1;
- + if (valid)
- + release();
- +
- + if (!(bcas = create_b_cas_card()))
- + goto err;
- +
- + if (!(b25 = create_arib_std_b25()))
- + goto err;
- +
- + if ((code = bcas->init(bcas)) < 0)
- + goto err;
- +
- + if ((code = b25->set_b_cas_card(b25, bcas)) < 0)
- + goto err;
- +
- + b25->set_strip(b25, strip);
- + b25->set_emm_proc(b25, emm);
- + b25->set_multi2_round(b25, round);
- +
- + valid = true;
- +
- + err:
- + if (code < 0)
- + release();
- + return code;
- + }
- +
- + void release()
- + {
- + if (b25)
- + b25->release(b25);
- +
- + if (bcas)
- + bcas->release(bcas);
- +
- + b25 = 0;
- + bcas = 0;
- + valid = false;
- + }
- +
- + ssize_t write(int fd, void *buf, size_t count)
- + {
- + if (!valid)
- + return write_full(fd, buf, count);
- +
- + sbuf.data = static_cast<uint8_t*>(buf);
- + sbuf.size = count;
- +
- + int code;
- + if ((code = b25->put(b25, &sbuf)) < 0)
- + return code;
- +
- + if ((code = b25->get(b25, &dbuf)) < 0)
- + return code;
- +
- + if (dbuf.size > 0)
- + {
- + ssize_t len;
- + if ((len = write_full(fd, dbuf.data, dbuf.size)) < 0)
- + return len;
- + }
- + return count;
- + }
- +
- + static ssize_t write_full(int fd, const void *buf, size_t count)
- + {
- + size_t size_remain = count;
- + size_t offset = 0;
- +
- + while (size_remain > 0) {
- + ssize_t wc = ::write(fd, static_cast<const char*>(buf) + offset, size_remain);
- + if (wc < 0) {
- + perror("write");
- + return wc;
- + }
- + size_remain -= wc;
- + offset += wc;
- + }
- + return count;
- + }
- +
- + int flush(int fd)
- + {
- + int code;
- + if (!valid)
- + return 0;
- +
- + if ((code = b25->flush(b25)) < 0)
- + return code;
- +
- + if ((code = b25->get(b25, &dbuf)) < 0)
- + return code;
- +
- + if (dbuf.size > 0)
- + return write_full(fd, dbuf.data, dbuf.size);
- +
- + return 0;
- + }
- +};
- +
- static volatile BOOL bStop = FALSE;
- static void handler(int sig)
- {
- @@ -23,13 +140,17 @@
- void usage(char *p)
- {
- - fprintf(stderr, "usage: %s [-b bondriver] [-s space_no] [-c channel_no] ( [-t sec] [-o filename] )\n", p);
- + fprintf(stderr, "usage: %s [--b25 [--round N] [--strip] [--EMM]] [-b bondriver] [-s space_no] [-c channel_no] ( [-t sec] [-o filename] )\n", p);
- exit(0);
- }
- int main(int argc, char *argv[])
- {
- int opt, bfind, sfind, cfind, ofind, wfd;
- + int b25 = false;
- + int strip = false;
- + int emm = false;
- + int round = 4;
- char *bon, *output;
- DWORD sec, dwSpace, dwChannel;
- @@ -38,10 +159,24 @@
- bon = output = NULL;
- bfind = sfind = cfind = ofind = 0;
- dwSpace = dwChannel = 0;
- - while ((opt = getopt(argc, argv, "b:s:c:t:o:")) != -1)
- +
- + static const struct option options[] = {
- + {"b25", no_argument, &b25, 1},
- + {"strip", no_argument, &strip, 1},
- + {"EMM", no_argument, &emm, 1},
- + {"round", required_argument, NULL, 'r'},
- + {0}
- + };
- +
- + while ((opt = getopt_long(argc, argv, "b:s:c:t:o:", options, NULL)) != -1)
- {
- switch (opt)
- {
- + case 0: // long options
- + break;
- + case 'r': // multi2 round
- + round = strtoul(optarg, NULL, 10);
- + break;
- case 'b': // BonDriver指定
- bon = optarg;
- bfind = 1;
- @@ -150,6 +285,12 @@
- timespec ts;
- ts.tv_sec = 0;
- ts.tv_nsec = 10 * 1000 * 1000; // 10ms
- + B25Decorder b25dec;
- + if (b25)
- + {
- + if (b25dec.init(strip, emm, round) < 0)
- + goto err;
- + }
- while (!bStop)
- {
- // TSストリーム取得
- @@ -158,18 +299,8 @@
- {
- // この時点でpBufに長さdwSize分のTSストリームを取得した状態なので、それを書き出し
- // (もしバッファリングやデスクランブルやTS分離処理を入れるならこの辺で)
- - int len, left = (int)dwSize;
- - do
- - {
- - len = write(wfd, pBuf, left);
- - if (len < 0)
- - {
- - perror("write");
- - goto err;
- - }
- - left -= len;
- - pBuf += len;
- - } while (left > 0);
- + if (b25dec.write(wfd, pBuf, dwSize) < 0)
- + goto err;
- }
- // 取得待ちTSデータが無ければ適当な時間待つ
- if (dwRemain == 0)
- @@ -180,29 +311,14 @@
- pIBon->CloseTuner();
- // BonDriver内のバッファに残っている分があれば一応回収
- - while (1)
- + if (pIBon->GetTsStream(&pBuf, &dwSize, &dwRemain) && (dwSize != 0))
- {
- - dwSize = dwRemain = 0;
- - if (pIBon->GetTsStream(&pBuf, &dwSize, &dwRemain) && (dwSize != 0))
- - {
- - int len, left = (int)dwSize;
- - do
- - {
- - len = write(wfd, pBuf, left);
- - if (len < 0)
- - {
- - perror("write");
- - goto err;
- - }
- - left -= len;
- - pBuf += len;
- - } while (left > 0);
- - }
- - if (dwRemain == 0)
- - break;
- + if (b25dec.write(wfd, pBuf, dwSize) < 0)
- + goto err;
- }
- err:
- + b25dec.flush(wfd);
- close(wfd);
- // インスタンス解放 & モジュールリリース
- pIBon->Release();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement