Advertisement
Guest User

b25 patch for BonDriverProxy_Linux version 1.1.4.4

a guest
Sep 2nd, 2014
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 11.29 KB | None | 0 0
  1. diff -r 7be3bddbf7c3 -r aeeca29707aa BonDriverProxy.cpp
  2. --- a/BonDriverProxy.cpp    Thu Aug 28 21:23:44 2014 +0900
  3. +++ b/BonDriverProxy.cpp    Tue Sep 02 17:10:53 2014 +0900
  4. @@ -1,5 +1,8 @@
  5.  #include "BonDriverProxy.h"
  6.  
  7. +#include <getopt.h>
  8. +#include "arib25/arib_std_b25.h"
  9. +
  10.  namespace BonDriverProxy {
  11.  
  12.  #define STRICT_LOCK
  13. @@ -7,8 +10,44 @@
  14.  static std::list<cProxyServer *> InstanceList;
  15.  static cCriticalSection Lock_Instance;
  16.  
  17. +static B_CAS_CARD *g_bcas = 0;
  18. +static int g_b25_round  = 4;
  19. +static int g_b25_enable = 0;
  20. +static int g_b25_strip  = 0;
  21. +static int g_b25_emm    = 0;
  22. +
  23.  static int Init(int ac, char *av[])
  24.  {
  25. +   static const struct option options[] = {
  26. +       {"b25",         no_argument, &g_b25_enable, 1},
  27. +       {"strip",       no_argument, &g_b25_strip, 1},
  28. +       {"EMM",         no_argument, &g_b25_emm, 1},
  29. +       {"round", required_argument, &g_b25_emm, 'r'},
  30. +       {0}
  31. +   };
  32. +   int opt;
  33. +   while ((opt = getopt_long(ac, av, "", options, NULL)) != -1)
  34. +   {
  35. +       switch (opt)
  36. +       {
  37. +       case 0:     // long options
  38. +           break;
  39. +       case 'r':   // multi2 round
  40. +           g_b25_round = strtoul(optarg, NULL, 10);
  41. +           break;
  42. +       default:
  43. +           return -1;
  44. +       }
  45. +   }
  46. +   if (optind > 1) {
  47. +       int i = optind;
  48. +       int j = 1;
  49. +       while (i < ac) {
  50. +           av[j++] = av[i++];
  51. +       }
  52. +       ac -= optind - 1;
  53. +   }
  54. +
  55.     if (ac < 3)
  56.         return -1;
  57.     ::strncpy(g_Host, av[1], sizeof(g_Host) - 1);
  58. @@ -20,6 +59,17 @@
  59.         if (ac > 4)
  60.             g_TsPacketBufSize = ::atoi(av[4]);
  61.     }
  62. +
  63. +   if (g_b25_enable)
  64. +   {
  65. +       g_bcas = create_b_cas_card();
  66. +       if (g_bcas) {
  67. +           if (g_bcas->init(g_bcas) < 0) {
  68. +               g_bcas->release(g_bcas);
  69. +               g_bcas = 0;
  70. +           }
  71. +       }
  72. +   }
  73.     return 0;
  74.  }
  75.  
  76. @@ -740,6 +790,25 @@
  77.     ts.tv_sec = 0;
  78.     ts.tv_nsec = WAIT_TIME * 1000 * 1000;
  79.  
  80. +   ARIB_STD_B25 *b25 = 0;
  81. +   if (g_bcas)
  82. +   {
  83. +       if ((b25 = create_arib_std_b25()) != 0)
  84. +       {
  85. +           if (b25->set_b_cas_card(b25, g_bcas) < 0)
  86. +           {
  87. +               b25->release(b25);
  88. +               b25 = 0;
  89. +           }
  90. +           else
  91. +           {
  92. +               b25->set_strip(b25, g_b25_strip);
  93. +               b25->set_emm_proc(b25, g_b25_emm);
  94. +               b25->set_multi2_round(b25, g_b25_round);
  95. +           }
  96. +       }
  97. +   }
  98. +
  99.     // TS読み込みループ
  100.     while (!StopTsRead)
  101.     {
  102. @@ -755,10 +824,26 @@
  103.             LOCK(TsLock);
  104.             if (pIBon->GetTsStream(&pBuf, &dwSize, &dwRemain) && (dwSize != 0))
  105.             {
  106. -               if ((pos + dwSize) < TsPacketBufSize)
  107. +               ARIB_STD_B25_BUFFER buf;
  108. +               if (b25)
  109.                 {
  110. -                   ::memcpy(&pTsBuf[pos], pBuf, dwSize);
  111. -                   pos += dwSize;
  112. +                   buf.data = pBuf;
  113. +                   buf.size = dwSize;
  114. +                   b25->put(b25, &buf);
  115. +                   b25->get(b25, &buf);
  116. +                   if (buf.size == 0)
  117. +                       continue;
  118. +               }
  119. +               else
  120. +               {
  121. +                   buf.data = pBuf;
  122. +                   buf.size = dwSize;
  123. +               }
  124. +
  125. +               if ((pos + buf.size) < TsPacketBufSize)
  126. +               {
  127. +                   ::memcpy(&pTsBuf[pos], buf.data, buf.size);
  128. +                   pos += buf.size;
  129.                     if (dwRemain == 0)
  130.                     {
  131.                         for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
  132. @@ -769,28 +854,28 @@
  133.                 else
  134.                 {
  135.                     DWORD left, dwLen = TsPacketBufSize - pos;
  136. -                   ::memcpy(&pTsBuf[pos], pBuf, dwLen);
  137. +                   ::memcpy(&pTsBuf[pos], buf.data, dwLen);
  138.                     for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
  139.                         (*it)->makePacket(eGetTsStream, pTsBuf, TsPacketBufSize, fSignalLevel);
  140. -                   left = dwSize - dwLen;
  141. -                   pBuf += dwLen;
  142. +                   left = buf.size - dwLen;
  143. +                   buf.data += dwLen;
  144.                     while (left > TsPacketBufSize)
  145.                     {
  146.                         for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
  147. -                           (*it)->makePacket(eGetTsStream, pBuf, TsPacketBufSize, fSignalLevel);
  148. +                           (*it)->makePacket(eGetTsStream, buf.data, TsPacketBufSize, fSignalLevel);
  149.                         left -= TsPacketBufSize;
  150. -                       pBuf += TsPacketBufSize;
  151. +                       buf.data += TsPacketBufSize;
  152.                     }
  153.                     if (left != 0)
  154.                     {
  155.                         if (dwRemain == 0)
  156.                         {
  157.                             for (std::list<cProxyServer *>::iterator it = TsReceiversList.begin(); it != TsReceiversList.end(); ++it)
  158. -                               (*it)->makePacket(eGetTsStream, pBuf, left, fSignalLevel);
  159. +                               (*it)->makePacket(eGetTsStream, buf.data, left, fSignalLevel);
  160.                             left = 0;
  161.                         }
  162.                         else
  163. -                           ::memcpy(pTsBuf, pBuf, left);
  164. +                           ::memcpy(pTsBuf, buf.data, left);
  165.                     }
  166.                     pos = left;
  167.                 }
  168. @@ -799,6 +884,8 @@
  169.         if (dwRemain == 0)
  170.             ::nanosleep(&ts, NULL);
  171.     }
  172. +   if (b25)
  173. +       b25->release(b25);
  174.     delete[] pTsBuf;
  175.     return NULL;
  176.  }
  177. @@ -969,7 +1056,7 @@
  178.  {
  179.     if (BonDriverProxy::Init(argc, argv) != 0)
  180.     {
  181. -       fprintf(stderr, "usage: %s address port (packet_fifo_size tspacket_bufsize)\ne.g. $ %s 192.168.0.100 1192\n", argv[0],argv[0]);
  182. +       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]);
  183.         return 0;
  184.     }
  185.  
  186. diff -r 7be3bddbf7c3 -r aeeca29707aa Makefile
  187. --- a/Makefile  Thu Aug 28 21:23:44 2014 +0900
  188. +++ b/Makefile  Tue Sep 02 17:10:53 2014 +0900
  189. @@ -2,8 +2,8 @@
  190.  
  191.  SRCDIR = .
  192.  LDFLAGS =
  193. -LIBS = -ldl
  194. -SRCS = BonDriverProxy.cpp BonDriver_Proxy.cpp BonDriver_LinuxPT.cpp
  195. +LIBS = -ldl -larib25
  196. +SRCS = BonDriverProxy.cpp BonDriver_Proxy.cpp BonDriver_LinuxPT.cpp sample.cpp
  197.  
  198.  UNAME := $(shell uname)
  199.  ifeq ($(UNAME), Darwin)
  200. @@ -18,11 +18,14 @@
  201.     EXT = so
  202.  endif
  203.  
  204. -all: server client driver
  205. +all: server client driver sample
  206.  server: BonDriverProxy
  207.  client: BonDriver_Proxy.$(EXT)
  208.  driver: BonDriver_LinuxPT.$(EXT)
  209.  
  210. +sample: sample.o
  211. +   $(CXX) $(CXXFLAGS) -rdynamic -o $@ $^ $(LIBS)
  212. +
  213.  BonDriverProxy: BonDriverProxy.o
  214.     $(CXX) $(CXXFLAGS) -rdynamic -o $@ $^ $(LIBS)
  215.  
  216. @@ -50,7 +53,7 @@
  217.  endif
  218.  
  219.  clean:
  220. -   $(RM) *.o *.so *.dylib BonDriverProxy .depend
  221. +   $(RM) *.o *.so *.dylib BonDriverProxy sample .depend
  222.  distclean: clean
  223.  
  224.  dep: .depend
  225. diff -r 7be3bddbf7c3 -r aeeca29707aa sample.cpp
  226. --- a/sample.cpp    Thu Aug 28 21:23:44 2014 +0900
  227. +++ b/sample.cpp    Tue Sep 02 17:10:53 2014 +0900
  228. @@ -1,7 +1,7 @@
  229.  /*
  230. -$ g++ -O2 -Wall -rdynamic -o sample sample.cpp -ldl
  231. +$ g++ -O2 -Wall -rdynamic -o sample sample.cpp -ldl -larib25
  232.  */
  233. -#define FILE_OFFSET_BITS   64
  234. +#define _FILE_OFFSET_BITS  64
  235.  #include <unistd.h>
  236.  #include <stdio.h>
  237.  #include <stdlib.h>
  238. @@ -15,6 +15,123 @@
  239.  #include "typedef.h"
  240.  #include "IBonDriver2.h"
  241.  
  242. +#include <getopt.h>
  243. +#include "arib25/arib_std_b25.h"
  244. +
  245. +class B25Decorder {
  246. +   ARIB_STD_B25 *b25;
  247. +   B_CAS_CARD *bcas;
  248. +   bool valid;
  249. +   ARIB_STD_B25_BUFFER sbuf;
  250. +   ARIB_STD_B25_BUFFER dbuf;
  251. +
  252. +public:
  253. +   B25Decorder() : b25(0), bcas(0), valid(false) {}
  254. +   ~B25Decorder() { release(); }
  255. +
  256. +   int init(bool strip, bool emm, int round = 4)
  257. +   {
  258. +       int code = -1;
  259. +       if (valid)
  260. +           release();
  261. +
  262. +       if (!(bcas = create_b_cas_card()))
  263. +           goto err;
  264. +
  265. +       if (!(b25 = create_arib_std_b25()))
  266. +           goto err;
  267. +
  268. +       if ((code = bcas->init(bcas)) < 0)
  269. +           goto err;
  270. +
  271. +       if ((code = b25->set_b_cas_card(b25, bcas)) < 0)
  272. +           goto err;
  273. +
  274. +       b25->set_strip(b25, strip);
  275. +       b25->set_emm_proc(b25, emm);
  276. +       b25->set_multi2_round(b25, round);
  277. +
  278. +       valid = true;
  279. +
  280. +   err:
  281. +       if (code < 0)
  282. +           release();
  283. +       return code;
  284. +   }
  285. +
  286. +   void release()
  287. +   {
  288. +       if (b25)
  289. +           b25->release(b25);
  290. +
  291. +       if (bcas)
  292. +           bcas->release(bcas);
  293. +
  294. +       b25 = 0;
  295. +       bcas = 0;
  296. +       valid = false;
  297. +   }
  298. +
  299. +   ssize_t write(int fd, void *buf, size_t count)
  300. +   {
  301. +       if (!valid)
  302. +           return write_full(fd, buf, count);
  303. +
  304. +       sbuf.data = static_cast<uint8_t*>(buf);
  305. +       sbuf.size = count;
  306. +
  307. +       int code;
  308. +       if ((code = b25->put(b25, &sbuf)) < 0)
  309. +           return code;
  310. +
  311. +       if ((code = b25->get(b25, &dbuf)) < 0)
  312. +           return code;
  313. +
  314. +       if (dbuf.size > 0)
  315. +       {
  316. +           ssize_t len;
  317. +           if ((len = write_full(fd, dbuf.data, dbuf.size)) < 0)
  318. +               return len;
  319. +       }
  320. +       return count;
  321. +   }
  322. +
  323. +   static ssize_t write_full(int fd, const void *buf, size_t count)
  324. +   {
  325. +       size_t size_remain = count;
  326. +       size_t offset = 0;
  327. +
  328. +       while (size_remain > 0) {
  329. +           ssize_t wc = ::write(fd, static_cast<const char*>(buf) + offset, size_remain);
  330. +           if (wc < 0) {
  331. +               perror("write");
  332. +               return wc;
  333. +           }
  334. +           size_remain -= wc;
  335. +           offset += wc;
  336. +       }
  337. +       return count;
  338. +   }
  339. +
  340. +   int flush(int fd)
  341. +   {
  342. +       int code;
  343. +       if (!valid)
  344. +           return 0;
  345. +
  346. +       if ((code = b25->flush(b25)) < 0)
  347. +           return code;
  348. +
  349. +       if ((code = b25->get(b25, &dbuf)) < 0)
  350. +           return code;
  351. +
  352. +       if (dbuf.size > 0)
  353. +           return write_full(fd, dbuf.data, dbuf.size);
  354. +
  355. +       return 0;
  356. +   }
  357. +};
  358. +
  359.  static volatile BOOL bStop = FALSE;
  360.  static void handler(int sig)
  361.  {
  362. @@ -23,13 +140,17 @@
  363.  
  364.  void usage(char *p)
  365.  {
  366. -   fprintf(stderr, "usage: %s [-b bondriver] [-s space_no] [-c channel_no] ( [-t sec] [-o filename] )\n", p);
  367. +   fprintf(stderr, "usage: %s [--b25 [--round N] [--strip] [--EMM]] [-b bondriver] [-s space_no] [-c channel_no] ( [-t sec] [-o filename] )\n", p);
  368.     exit(0);
  369.  }
  370.  
  371.  int main(int argc, char *argv[])
  372.  {
  373.     int opt, bfind, sfind, cfind, ofind, wfd;
  374. +   int b25 = false;
  375. +   int strip = false;
  376. +   int emm = false;
  377. +   int round = 4;
  378.     char *bon, *output;
  379.     DWORD sec, dwSpace, dwChannel;
  380.  
  381. @@ -38,10 +159,24 @@
  382.     bon = output = NULL;
  383.     bfind = sfind = cfind = ofind = 0;
  384.     dwSpace = dwChannel = 0;
  385. -   while ((opt = getopt(argc, argv, "b:s:c:t:o:")) != -1)
  386. +
  387. +   static const struct option options[] = {
  388. +       {"b25",         no_argument, &b25,   1},
  389. +       {"strip",       no_argument, &strip, 1},
  390. +       {"EMM",         no_argument, &emm,   1},
  391. +       {"round", required_argument, NULL, 'r'},
  392. +       {0}
  393. +   };
  394. +
  395. +   while ((opt = getopt_long(argc, argv, "b:s:c:t:o:", options, NULL)) != -1)
  396.     {
  397.         switch (opt)
  398.         {
  399. +       case 0:     // long options
  400. +           break;
  401. +       case 'r':   // multi2 round
  402. +           round = strtoul(optarg, NULL, 10);
  403. +           break;
  404.         case 'b':   // BonDriver指定
  405.             bon = optarg;
  406.             bfind = 1;
  407. @@ -150,6 +285,12 @@
  408.     timespec ts;
  409.     ts.tv_sec = 0;
  410.     ts.tv_nsec = 10 * 1000 * 1000;  // 10ms
  411. +   B25Decorder b25dec;
  412. +   if (b25)
  413. +   {
  414. +       if (b25dec.init(strip, emm, round) < 0)
  415. +           goto err;
  416. +   }
  417.     while (!bStop)
  418.     {
  419.         // TSストリーム取得
  420. @@ -158,18 +299,8 @@
  421.         {
  422.             // この時点でpBufに長さdwSize分のTSストリームを取得した状態なので、それを書き出し
  423.             // (もしバッファリングやデスクランブルやTS分離処理を入れるならこの辺で)
  424. -           int len, left = (int)dwSize;
  425. -           do
  426. -           {
  427. -               len = write(wfd, pBuf, left);
  428. -               if (len < 0)
  429. -               {
  430. -                   perror("write");
  431. -                   goto err;
  432. -               }
  433. -               left -= len;
  434. -               pBuf += len;
  435. -           } while (left > 0);
  436. +           if (b25dec.write(wfd, pBuf, dwSize) < 0)
  437. +               goto err;
  438.         }
  439.         // 取得待ちTSデータが無ければ適当な時間待つ
  440.         if (dwRemain == 0)
  441. @@ -180,29 +311,14 @@
  442.     pIBon->CloseTuner();
  443.  
  444.     // BonDriver内のバッファに残っている分があれば一応回収
  445. -   while (1)
  446. +   if (pIBon->GetTsStream(&pBuf, &dwSize, &dwRemain) && (dwSize != 0))
  447.     {
  448. -       dwSize = dwRemain = 0;
  449. -       if (pIBon->GetTsStream(&pBuf, &dwSize, &dwRemain) && (dwSize != 0))
  450. -       {
  451. -           int len, left = (int)dwSize;
  452. -           do
  453. -           {
  454. -               len = write(wfd, pBuf, left);
  455. -               if (len < 0)
  456. -               {
  457. -                   perror("write");
  458. -                   goto err;
  459. -               }
  460. -               left -= len;
  461. -               pBuf += len;
  462. -           } while (left > 0);
  463. -       }
  464. -       if (dwRemain == 0)
  465. -           break;
  466. +       if (b25dec.write(wfd, pBuf, dwSize) < 0)
  467. +           goto err;
  468.     }
  469.  
  470.  err:
  471. +   b25dec.flush(wfd);
  472.     close(wfd);
  473.     // インスタンス解放 & モジュールリリース
  474.     pIBon->Release();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement