Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -r 7be3bddbf7c3 -r 6ec6a070e70e sample.cpp
- --- a/sample.cpp Thu Aug 28 21:23:44 2014 +0900
- +++ b/sample.cpp Mon Sep 01 17:29:45 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(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");
- + break;
- + }
- + size_remain -= wc;
- + offset += wc;
- + }
- + return count - size_remain;
- + }
- +
- + 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