YANO's digital garage

Copyright ©YANO All rights reserved. https://www.bravotouring.com/~yano/

Last-modified: 2024-04-08 (月)


[一語一絵/IT系]

epgrec一式改修 / 2013-05-25 (土)

予てより/var/log/messagesに時々現れていた

epgdump[5897]: segfault at 7fff3b687000 ip 0000000000403c55 sp 00007fff3b680cb0 error 4 in epgdump[400000+9000]
の頻度が高くなってきた気がした。

結果的には2時間間隔で実行する番組表の取得に失敗しているわけだが、何回かに1回でもきちんと取得できていれば大筋で問題無い仕組みなのでスルーしていたのだが、[External]epgrec プロジェクト - SourceForge.JPでは特にアップデートされた形跡は無いものの、いろいろと有志が改修を試みているようなので、ひとつまじめに取り組んでみた。

yano@GT110b:~/software/tv$ diff -bc epgdumpr2_20111001/ epgdumpr2/
diff -bc epgdumpr2_20111001/Makefile epgdumpr2/Makefile
*** epgdumpr2_20111001/Makefile 2009-03-15 21:33:35.000000000 +0900
--- epgdumpr2/Makefile  2013-05-17 12:00:24.366854210 +0900
***************
*** 1,10 ****
  TARGETS               = epgdump
  OBJ_TARGETS   = epgdump.o aribstr.o eit.o ts.o util.o sdt.o
  HEDDERDEPEND  = eit.h sdt.h aribstr.h ts.h util.h

  LANG=C
  CC            = gcc
! CFLAGS                =  -std=c99 -O2 -Wall -g
  #LDFLAGS              = -pthread
  LIBS          =

--- 1,12 ----
+ PREFIX          = /usr/local
  TARGETS               = epgdump
  OBJ_TARGETS   = epgdump.o aribstr.o eit.o ts.o util.o sdt.o
  HEDDERDEPEND  = eit.h sdt.h aribstr.h ts.h util.h

  LANG=C
  CC            = gcc
! #CFLAGS               =  -std=c99 -O2 -Wall -g
! CFLAGS          =  -std=c99 -O2 -Wall -g -Werror -Wno-return-type
  #LDFLAGS              = -pthread
  LIBS          =

***************
*** 21,23 ****
--- 23,28 ----

  clean:
                rm -f core ${TARGETS} *.o
+
+ install:
+       install -m 755 ${TARGETS} ${PREFIX}/bin
diff -bc epgdumpr2_20111001/aribstr.c epgdumpr2/aribstr.c
*** epgdumpr2_20111001/aribstr.c        2009-11-18 12:35:20.000000000 +0900
--- epgdumpr2/aribstr.c 2013-05-17 11:27:45.868259545 +0900
***************
*** 318,324 ****

        fptr = code;
        tptr = xcode;
!       iconv(cd, &fptr, &inbyte, &tptr, &outbyte);

        iconv_close(cd);

--- 318,324 ----

        fptr = code;
        tptr = xcode;
!       iconv(cd, (char **)&fptr, &inbyte, &tptr, &outbyte);

        iconv_close(cd);

***************
*** 622,644 ****
  void LockingShiftGL(const BYTE byIndexG)
  {
        // LSx
!       m_pLockingGL = &m_CodeG[byIndexG];
  }

  void LockingShiftGR(const BYTE byIndexG)
  {
        // LSxR
!       m_pLockingGR = &m_CodeG[byIndexG];
  }

  void SingleShiftGL(const BYTE byIndexG)
  {
        // SSx
!       m_pSingleGL  = &m_CodeG[byIndexG];
  }

! const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)
  {
        // Gのグラフィックセットを割り当てる
        switch(byCode){
        case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
--- 622,646 ----
  void LockingShiftGL(const BYTE byIndexG)
  {
        // LSx
!       m_pLockingGL = &m_CodeG[(int)byIndexG];
  }

  void LockingShiftGR(const BYTE byIndexG)
  {
        // LSxR
!       m_pLockingGR = &m_CodeG[(int)byIndexG];
  }

  void SingleShiftGL(const BYTE byIndexG)
  {
        // SSx
!       m_pSingleGL  = &m_CodeG[(int)byIndexG];
  }

! const bool DesignationGSET(const BYTE byIndexG_arg, const BYTE byCode)
  {
+       int byIndexG = (int)byIndexG_arg;
+
        // Gのグラフィックセットを割り当てる
        switch(byCode){
        case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
***************
*** 660,667 ****
        }
  }

! const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)
  {
        // DRCSのグラフィックセットを割り当てる
        switch(byCode){
        case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
--- 662,671 ----
        }
  }

! const bool DesignationDRCS(const BYTE byIndexG_arg, const BYTE byCode)
  {
+       int byIndexG = (int)byIndexG_arg;
+
        // DRCSのグラフィックセットを割り当てる
        switch(byCode){
        case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
diff -bc epgdumpr2_20111001/eit.h epgdumpr2/eit.h
*** epgdumpr2_20111001/eit.h    2009-11-18 12:23:01.000000000 +0900
--- epgdumpr2/eit.h     2013-05-17 11:27:45.868259545 +0900
***************
*** 28,34 ****
  typedef struct _EITbody {
        int event_id;
        char start_time[5];
!       char duration[3];
        int running_status;
        int free_CA_mode;
        int descriptors_loop_length;
--- 28,34 ----
  typedef struct _EITbody {
        int event_id;
        char start_time[5];
!       unsigned char duration[3];
        int running_status;
        int free_CA_mode;
        int descriptors_loop_length;
diff -bc epgdumpr2_20111001/ts.c epgdumpr2/ts.c
*** epgdumpr2_20111001/ts.c     2010-02-27 16:45:15.000000000 +0900
--- epgdumpr2/ts.c      2013-05-21 13:30:28.732126582 +0900
***************
*** 40,52 ****

        /* 戻すべき残りがあるか? */
        if(ridx >= 0 && secs[ridx].cont) {
                /* バッファチェック */
                if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) {
                        secs[ridx].cont = 0;
                        secs[ridx].seclen = 0;
                        secs[ridx].setlen = 0;
                        secs[ridx].curlen = 0;
!               } else {
                        len = secs[ridx].cur.payloadlen - secs[ridx].curlen;
                        /* 全部設定済みチェック */
                        if(len == 0) {
--- 40,56 ----

        /* 戻すべき残りがあるか? */
        if(ridx >= 0 && secs[ridx].cont) {
+ /*
+ printf("secs[%d].cur.cont=%d, secs[%d].cur.payloadlen=%d, secs[%d].curlen=%d, secs[%d].seclen=%d, len=%d\n",
+ ridx, secs[ridx].cur.cont, ridx, secs[ridx].cur.payloadlen, ridx, secs[ridx].curlen, ridx, secs[ridx].seclen, len);
+ */
                /* バッファチェック */
                if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) {
                        secs[ridx].cont = 0;
                        secs[ridx].seclen = 0;
                        secs[ridx].setlen = 0;
                        secs[ridx].curlen = 0;
!               } else if ( secs[ridx].curlen <= secs[ridx].cur.payloadlen ){
                        len = secs[ridx].cur.payloadlen - secs[ridx].curlen;
                        /* 全部設定済みチェック */
                        if(len == 0) {
***************
*** 68,73 ****
--- 72,82 ----

                                boff = 12;
                                secs[ridx].seclen = getBit(&secs[ridx].cur.payload[secs[ridx].curlen], &boff, 12) + 3; // ヘッダ
+                               if(secs[ridx].seclen > MAXSECLEN){
+                                       // セクションが MAXSECLEN より大きい時はこのセクションをスキップ
+                                       secs[ridx].cont = 0;
+                                       goto retry;
+                               }

                                /*
                                  if(secs[ridx].seclen == 2334) {
***************
*** 96,101 ****
--- 105,116 ----
                                        goto retry; /* もう一回 */
                                }
                        }
+               } else {
+ /*
+ printf("secs[%d].cont=%d, secs[%d].cur.payloadlen=%d, secs[%d].curlen=%d, secs[%d].seclen=%d\n",
+ ridx, secs[ridx].cont, ridx, secs[ridx].cur.payloadlen, ridx, secs[ridx].curlen, ridx, secs[ridx].seclen);
+ */
+                       secs[ridx].cont = 0;
                }
        }

***************
*** 203,209 ****
                }

                memset(pk.payload, 0xFF, sizeof(pk.payload));
!               if(pk.payloadlen <= 0){
                        continue;
                }
                memcpy(pk.payload, payptr, pk.payloadlen);
--- 218,224 ----
                }

                memset(pk.payload, 0xFF, sizeof(pk.payload));
!               if( !(0 < pk.payloadlen && pk.payloadlen <= sizeof(pk.payload)) ){
                        continue;
                }
                memcpy(pk.payload, payptr, pk.payloadlen);
***************
*** 227,232 ****
--- 242,252 ----
                                        /* 最初 セクション長を調べる */
                                        boff = 12;
                                        secs[i].seclen = getBit(secs[i].cur.payload, &boff, 12) + 3; // ヘッダ;
+                                       if(secs[i].seclen > MAXSECLEN){
+                                               /* セクション長が MAXSECLEN より長いときはこのセクションをスキップ */
+                                               secs[i].cont = 0;
+                                               goto retry;
+                                       }
                                        /*
                                          if(secs[i].seclen == 2334) {
                                          printf("aa");
***************
*** 274,280 ****
                }
        }

!       //return NULL;
  }

  /* BonTest/TsStream.cppからのパクリ */
--- 294,300 ----
                }
        }

!       return NULL;
  }

  /* BonTest/TsStream.cppからのパクリ */
***************
*** 311,316 ****
--- 331,342 ----

  int checkcrc(SECcache *secs) {

+       /* regard a section with more than MAXSECLEN data as an error. */
+       if(secs->seclen > MAXSECLEN) {
+               fprintf(stderr, "SECcache overrun secs->seclen=%d\n", secs->seclen);
+               return 0;
+       }
+
        /* セクションの終りに置かれる4バイトのCRC32は、
           CRC計算の結果0になるように設定される。
           値が発生した場合は、エラーなので対象外にする */
***************
*** 320,323 ****
        }
        return 1;
  }
-
--- 346,348 ----
diff -bc epgdumpr2_20111001/util.h epgdumpr2/util.h
*** epgdumpr2_20111001/util.h   2009-03-08 16:53:42.000000000 +0900
--- epgdumpr2/util.h    2013-05-17 11:46:37.356293005 +0900
***************
*** 1,12 ****
--- 1,15 ----
  #ifndef UTIL_H
  #define UTILH 1

+ // try for segfault at 7fff77650000 ip 0000000000403c55 sp 00007fff7764ae30 error 4 in epgdump[400000+9000]
+ // #define MAXSECLEN (4096*4)
  #define MAXSECLEN 4096

  #ifdef __cplusplus
  extern "C"{
  #endif /* __cplusplus */

+       int   strrep(char *buf, char *mae, char *ato);
        int   getBit(unsigned char *byte, int *pbit, int gbit);
        void  getStr(char *tostr, unsigned char *byte, int *pbit, int len);
        int   parseOTHERdesc(unsigned char *data);

しかし、この改修を行っても[External]日テレNEWS24の番組表が空っぽのままだったので更に調べてみたところ、[External]日テレNEWS24のチャンネルがCS24:350からCS8:349に移っていた。ついでに[External]ディズニージュニアがCS8:339でスタートしたのも思い出したので、そのへんも追加。差分は「BS新チャンネル対応公式版」の[External]epgdumpr2_20111001.tar.gzに対する差分なので、2011年11月版のCSチャンネル対応も含む。

diff -bc epgdumpr2_20111001/epgdump.c epgdumpr2/epgdump.c
*** epgdumpr2_20111001/epgdump.c        2011-10-01 17:35:13.000000000 +0900
--- epgdumpr2/epgdump.c 2013-05-21 18:10:05.744396429 +0900
***************
*** 78,88 ****
        { "D-Life", "4258.epgdata.ontvjapan", 18290, 4, 258},
        { "NHK総合テレビジョン(東京)", "4291.epgdata.ontvjapan", 17168, 4, 291},
        { "NHK教育テレビジョン(東京)", "4292.epgdata.ontvjapan", 17168, 4, 292},
        { "日本テレビ", "4294.epgdata.ontvjapan", 17169, 4, 294},
        { "テレビ朝日", "4295.epgdata.ontvjapan", 17169, 4, 295},
        { "TBSテレビ", "4296.epgdata.ontvjapan", 17169, 4, 296},
        { "テレビ東京", "4297.epgdata.ontvjapan", 17169, 4, 297},
-       { "フジテレビ", "4298.epgdata.ontvjapan", 17168, 4, 298},
        { "放送大学ラジオ", "4531.epgdata.ontvjapan", 18098, 4, 531},
        { "WNI", "4910.ontvjapan.com", 16626, 4, 910},
  };
--- 78,88 ----
        { "D-Life", "4258.epgdata.ontvjapan", 18290, 4, 258},
        { "NHK総合テレビジョン(東京)", "4291.epgdata.ontvjapan", 17168, 4, 291},
        { "NHK教育テレビジョン(東京)", "4292.epgdata.ontvjapan", 17168, 4, 292},
+       { "フジテレビ", "4298.epgdata.ontvjapan", 17168, 4, 298},
        { "日本テレビ", "4294.epgdata.ontvjapan", 17169, 4, 294},
        { "テレビ朝日", "4295.epgdata.ontvjapan", 17169, 4, 295},
        { "TBSテレビ", "4296.epgdata.ontvjapan", 17169, 4, 296},
        { "テレビ東京", "4297.epgdata.ontvjapan", 17169, 4, 297},
        { "放送大学ラジオ", "4531.epgdata.ontvjapan", 18098, 4, 531},
        { "WNI", "4910.ontvjapan.com", 16626, 4, 910},
  };
***************
*** 92,162 ****


  static STATION csSta[] = {
!       { "スターchプラス", "1002.ontvjapan.com", 24608, 6, 237},
!       { "日本映画専門chHD", "1086.ontvjapan.com", 24608, 6, 239},
!       { "フジテレビNEXT", "306ch.epgdata.ontvjapan", 24608, 6, 306},
        { "ショップチャンネル", "1059.ontvjapan.com", 24704, 6, 55},
!       { "キッズステーションHD", "1045.ontvjapan.com", 24704, 6, 335},
!       { "ザ・シネマ", "1217.ontvjapan.com", 24736, 6, 228},
!       { "スカチャンHD800", "800ch.epgdata.ontvjapan", 24736, 6, 800},
!       { "スカチャン801", "801ch.epgdata.ontvjapan", 24736, 6, 801},
!       { "スカチャン802", "802ch.epgdata.ontvjapan", 24736, 6, 802},
!       { "e2プロモ", "100ch.epgdata.ontvjapan", 28736, 7, 100},
!       { "ホームドラマチャンネル", "294ch.epgdata.ontvjapan", 28736, 7, 294},
!       { "Jスポーツ ESPN", "1025.ontvjapan.com", 28736, 7, 256},
!       { "FOX", "1016.ontvjapan.com", 28736, 7, 312},
!       { "スペースシャワーTV", "1018.ontvjapan.com", 28736, 7, 322},
!       { "カートゥーン ネット", "1046.ontvjapan.com", 28736, 7, 331},
!       { "ディズニーXD", "1213.ontvjapan.com", 28736, 7, 334},
!       { "東映チャンネル", "1010.ontvjapan.com", 28768, 7, 221},
!       { "衛星劇場", "1005.ontvjapan.com", 28768, 7, 222},
!       { "チャンネルNECO", "1008.ontvjapan.com", 28768, 7, 223},
!       { "洋画★シネフィル", "1009.ontvjapan.com", 28768, 7, 224},
!       { "スター・クラシック", "1003.ontvjapan.com", 28768, 7, 238},
!       { "時代劇専門チャンネル", "1133.ontvjapan.com", 28768, 7, 292},
!       { "スーパードラマ", "1006.ontvjapan.com", 28768, 7, 310},
!       { "AXN", "1014.ontvjapan.com", 28768, 7, 311},
!       { "ナショジオチャンネル", "1204.ontvjapan.com", 28768, 7, 343},
!       { "ワンテンポータル", "110ch.epgdata.ontvjapan", 28864, 7, 110},
!       { "ゴルフチャンネル", "1028.ontvjapan.com", 28864, 7, 260},
!       { "テレ朝チャンネル", "1092.ontvjapan.com", 28864, 7, 303},
!       { "MTV", "1019.ontvjapan.com", 28864, 7, 323},
!       { "ミュージック・エア", "1024.ontvjapan.com", 28864, 7, 324},
!       { "朝日ニュースター", "1067.ontvjapan.com", 28864, 7, 352},
!       { "BBCワールド", "1070.ontvjapan.com", 28864, 7, 353},
!       { "CNNj", "1069.ontvjapan.com", 28864, 7, 354},
!       { "Jスポーツ 1", "1041.ontvjapan.com", 28896, 7, 251},
!       { "Jスポーツ 2", "1042.ontvjapan.com", 28896, 7, 252},
!       { "JスポーツPlusH", "1043.ontvjapan.com", 28896, 7, 253},
!       { "GAORA", "1026.ontvjapan.com", 28896, 7, 254},
!       { "sky・Aスポーツ+", "1040.ontvjapan.com", 28896, 7, 255},
!       { "宝塚プロモチャンネル", "101ch.epgdata.ontvjapan", 28928, 7, 101},
!       { "SKY・STAGE", "1207.ontvjapan.com", 28928, 7, 290},
        { "チャンネル銀河", "305ch.epgdata.ontvjapan", 28928, 7, 305},
!       { "AT-X", "1201.ontvjapan.com", 28928, 7, 333},
!       { "ヒストリーチャンネル", "1050.ontvjapan.com", 28928, 7, 342},
!       { "スカチャン803", "803ch.epgdata.ontvjapan", 28928, 7, 803},
!       { "スカチャン804", "804ch.epgdata.ontvjapan", 28928, 7, 804},
!       { "ムービープラスHD", "1007.ontvjapan.com", 28960, 7, 240},
        { "ゴルフネットワーク", "1027.ontvjapan.com", 28960, 7, 262},
!       { "LaLa HD", "1074.ontvjapan.com", 28960, 7, 314},
!       { "フジテレビONE", "1073.ontvjapan.com", 28992, 7, 307},
!       { "フジテレビTWO", "1072.ontvjapan.com", 28992, 7, 308},
!       { "アニマックス", "1047.ontvjapan.com", 28992, 7, 332},
!       { "ディスカバリー", "1062.ontvjapan.com", 28992, 7, 340},
!       { "アニマルプラネット", "1193.ontvjapan.com", 28992, 7, 341},
!       { "C-TBSウエルカム", "160ch.epgdata.ontvjapan", 29024, 7, 160},
!       { "QVC", "1120.ontvjapan.com", 29024, 7, 161},
!       { "プライム365.TV", "185ch.epgdata.ontvjapan", 29024, 7, 185},
!       { "ファミリー劇場", "1015.ontvjapan.com", 29024, 7, 293},
!       { "TBSチャンネル", "3201.ontvjapan.com", 29024, 7, 301},
!       { "ディズニーチャンネル", "1090.ontvjapan.com", 29024, 7, 304},
!       { "MUSIC ON! TV", "1022.ontvjapan.com", 29024, 7, 325},
!       { "TBSニュースバード", "1076.ontvjapan.com", 29024, 7, 351},
!       { "日テレG+HD", "1068.ontvjapan.com", 29056, 7, 257},
        { "日テレプラス", "300ch.epgdata.ontvjapan", 29056, 7, 300},
!       { "Music Japan TV", "1208.ontvjapan.com", 29056, 7, 321},
!       { "日テレNEWS24", "2002.ontvjapan.com", 29056, 7, 350},
        { "旅チャンネル", "1052.ontvjapan.com", 29056, 7, 362},
  };

--- 92,159 ----


  static STATION csSta[] = {
! /* ND2 */
!       { "TBSチャンネル", "3201.ontvjapan.com", 24608, 6, 296},
!       { "テレ朝チャンネル", "1092.ontvjapan.com", 24608, 6, 298},
!       { "朝日ニュースター", "1067.ontvjapan.com", 24608, 6, 299},
! /* ND4 */
!       { "e2プロモ", "100ch.epgdata.ontvjapan", 28736, 7, 100},
!       { "ザ・シネマ", "1217.ontvjapan.com", 28736, 7, 227},
!       { "チャンネルNECO", "1008.ontvjapan.com", 28736, 7, 223},
!       { "ヒストリーチャンネル", "1050.ontvjapan.com", 28736, 7, 342},
!       { "スカイ・A Sports+", "1040.ontvjapan.com", 28736, 7, 250},
! /* ND6 */
!       { "ディスカバリー", "1062.ontvjapan.com", 28768, 7, 340},
!       { "アニマルプラネット", "1193.ontvjapan.com", 28768, 7, 341},
!       { "ホームドラマチャンネル", "294ch.epgdata.ontvjapan", 28768, 7, 294},
!       { "MTV", "1019.ontvjapan.com", 28768, 7, 323},
!       { "CNNJ", "1069.ontvjapan.com", 28768, 7, 354},
! /* ND8 */
        { "ショップチャンネル", "1059.ontvjapan.com", 24704, 6, 55},
!       { "東映チャンネル", "1010.ontvjapan.com", 24704, 6, 218},
!       { "衛星劇場", "1005.ontvjapan.com", 24704, 6, 219},
!       { "ミュージック・エア", "1024.ontvjapan.com", 24704, 6, 326},
!       { "ディズニージュニア", "339ch.epgdata.ontvjapan", 24704, 6, 339},
!       { "日テレNEWS24", "2002.ontvjapan.com", 24704, 6, 349},
! /* ND10 */
!       { "スカチャン0HD", "800ch.epgdata.ontvjapan", 24736, 6, 800},
!       { "スカチャン1HD", "801ch.epgdata.ontvjapan", 24736, 6, 801},
!       { "スカチャン2", "802ch.epgdata.ontvjapan", 24736, 6, 802},
!       { "スカチャン3", "803ch.epgdata.ontvjapan", 24736, 6, 805},
! /* ND12 */
!       { "キッズステーションHD", "1045.ontvjapan.com", 28864, 7, 330},
!       { "GAORA", "1026.ontvjapan.com", 28864, 7, 254},
!       { "MUSIC ON! TV", "1022.ontvjapan.com", 28864, 7, 325},
! /* ND14 */
!       { "時代劇専門チャンネル", "1133.ontvjapan.com", 28896, 7, 292},
!       { "ファミリー劇場", "1015.ontvjapan.com", 28896, 7, 293},
!       { "スーパー!ドラマTV", "1006.ontvjapan.com", 28896, 7, 310},
! /* ND16 */
!       { "SKY STAGE", "1207.ontvjapan.com", 28928, 7, 290},
        { "チャンネル銀河", "305ch.epgdata.ontvjapan", 28928, 7, 305},
!       { "AT-X", "1201.ontvjapan.com", 28928, 7, 333},
!       { "AXN", "1014.ontvjapan.com", 28928, 7, 311},
!       { "ナショジオチャンネル", "1204.ontvjapan.com", 28928, 7, 343},
!       { "BBCワールドニュース", "1070.ontvjapan.com", 28928, 7, 353},
! /* ND18 */
!       { "ムービープラスHD", "1007.ontvjapan.com", 28960, 7, 240},
        { "ゴルフネットワーク", "1027.ontvjapan.com", 28960, 7, 262},
!       { "LaLa HD", "1074.ontvjapan.com", 28960, 7, 314},
! /* ND20 */
!       { "フジテレビONE", "1073.ontvjapan.com", 28992, 7, 307},
!       { "フジテレビTWO", "1072.ontvjapan.com", 28992, 7, 308},
!       { "フジテレビNEXT", "306ch.epgdata.ontvjapan", 28992, 7, 309},
! /* ND22 */
!       { "QVC", "1120.ontvjapan.com", 29024, 7, 161},
!       { "TBSニュースバード", "1076.ontvjapan.com", 29024, 7, 351},
!       { "FOX", "1016.ontvjapan.com", 29024, 7, 312},
!       { "スペースシャワーTV", "1018.ontvjapan.com", 29024, 7, 322},
!       { "カートゥーン ネットワーク", "1046.ontvjapan.com", 29024, 7, 331},
! /* ND 24*/
!       { "日テレG+HD", "1068.ontvjapan.com", 29056, 7, 257},
        { "日テレプラス", "300ch.epgdata.ontvjapan", 29056, 7, 300},
!       { "FOXムービー プレミアム", "229ch.epgdata.ontvjapan", 29056, 7, 229},
!       { "スペースシャワーTVプラス", "321ch.epgdata.ontvjapan", 29056, 7, 321},
        { "旅チャンネル", "1052.ontvjapan.com", 29056, 7, 362},
  };

***************
*** 352,357 ****
--- 349,358 ----
                staCount = csStaCount;
                act = 0 ;
        }else{
+               if(infile == NULL){
+                       fprintf(stderr, "Can't open file: %s\n", file);
+                       return 1;
+               }
                act = 1 ;
                svttop = calloc(1, sizeof(SVT_CONTROL));
                GetSDT(infile, svttop, secs, SECCOUNT);

epgrec/settings/satelite_channel.phpのチャンネル設定も。

<?php
// 全国用BSデジタルチャンネルマップ
$BS_CHANNEL_MAP = array(
        "4101.epgdata.ontvjapan"  =>  "101", // NHK BS1
        "4103.epgdata.ontvjapan"  =>  "103", // NHK BSプレミアム
        "4141.epgdata.ontvjapan"  =>  "141", // BS日テレ
        "4151.epgdata.ontvjapan"  =>  "151", // BS朝日
        "4161.epgdata.ontvjapan"  =>  "161", // BS TBS
        "4171.epgdata.ontvjapan"  =>  "171", // BS Japan
        "4181.epgdata.ontvjapan"  =>  "181", // BSフジ
        "4211.epgdata.ontvjapan"  =>  "211", // BS11
        "4222.epgdata.ontvjapan"  =>  "222", // TwellV
        "4191.epgdata.ontvjapan"  =>  "191", // WOWOWプライム
        "4192.epgdata.ontvjapan"  =>  "192", // WOWOWライブ
        "4193.epgdata.ontvjapan"  =>  "193", // WOWOWシネマ
        "4200.epgdata.ontvjapan"  =>  "200", // Star Channel 1
        "4201.epgdata.ontvjapan"  =>  "201", // Star Channel 2
        "4202.epgdata.ontvjapan"  =>  "202", // Star Channel 3
        "4231.epgdata.ontvjapan"  =>  "231", // 放送大学1
        "4232.epgdata.ontvjapan"  =>  "232", // 放送大学2
        "4233.epgdata.ontvjapan"  =>  "233", // 放送大学3
        "4234.epgdata.ontvjapan"  =>  "234", // グリーンチャンネル
        "4236.epgdata.ontvjapan"  =>  "236", // BSアニマックス
        "4238.epgdata.ontvjapan"  =>  "238", // FOX bs238
        "4241.epgdata.ontvjapan"  =>  "241", // BSスカパー!
        "4242.epgdata.ontvjapan"  =>  "242", // J-SPORTS1
        "4243.epgdata.ontvjapan"  =>  "243", // J-SPORTS2
        "4244.epgdata.ontvjapan"  =>  "244", // J-SPORTS3
        "4245.epgdata.ontvjapan"  =>  "245", // J-SPORTS4
        "4251.epgdata.ontvjapan"  =>  "251", // BS釣りビジョン
        "4252.epgdata.ontvjapan"  =>  "252", // IMAGICA BS
        "4255.epgdata.ontvjapan"  =>  "255", // 日本映画専門チャンネル
        "4256.epgdata.ontvjapan"  =>  "256", // Disny Channel
        "4258.epgdata.ontvjapan"  =>  "258", // D-Life
        "4531.epgdata.ontvjapan"  =>  "531", // 放送大学ラジオ
//      "4910.epgdata.ontvjapan"  =>  "910", // WNI
        "4291.epgdata.ontvjapan"  =>  "291", // NHK-G東京
        "4292.epgdata.ontvjapan"  =>  "292", // NHK-E東京
        "4294.epgdata.ontvjapan"  =>  "294", // 日本テレビ
        "4295.epgdata.ontvjapan"  =>  "295", // テレビ朝日
        "4296.epgdata.ontvjapan"  =>  "296", // TBS
        "4297.epgdata.ontvjapan"  =>  "297", // テレビ東京
        "4298.epgdata.ontvjapan"  =>  "298", // フジテレビ
);

// 全国用CSデジタルチャンネルマップ
$CS_CHANNEL_MAP = array(
        "3201.ontvjapan.com"            =>      "CS2",  // 296, // "TBSチャンネル"
        "1092.ontvjapan.com"            =>      "CS2",  // 298, // "テレ朝チャンネル"
        "1067.ontvjapan.com"            =>      "CS2",  // 299, // "朝日ニュースター"

        "100ch.epgdata.ontvjapan"       =>      "CS4",  // 100, // "e2プロモ"
        "1217.ontvjapan.com"            =>      "CS4",  // 227, // "ザ・シネマ"
        "1008.ontvjapan.com"            =>      "CS4",  // 223, // "チャンネルNECO"
        "1050.ontvjapan.com"            =>      "CS4",  // 342, // "ヒストリーチャンネル"
        "1040.ontvjapan.com"            =>      "CS4",  // 250, // "スカイ・A sports+"


        "1062.ontvjapan.com"            =>      "CS6",  // 340, // "ディスカバリー"
        "1193.ontvjapan.com"            =>      "CS6",  // 341, // "アニマルプラネット"
        "294ch.epgdata.ontvjapan"       =>      "CS6",  // 294, // "ホームドラマチャンネル"
        "1019.ontvjapan.com"            =>      "CS6",  // 323, // "MTV"
        "1069.ontvjapan.com"            =>      "CS6",  // 354, // "CNNj"

        "1059.ontvjapan.com"            =>      "CS8",  // 55,  // "ショップチャンネル"
        "1010.ontvjapan.com"            =>      "CS8",  // 218, // "東映チャンネル"
        "1005.ontvjapan.com"            =>      "CS8",  // 219, // "衛星劇場"
        "1024.ontvjapan.com"            =>      "CS8",  // 326, // "ミュージック・エア"
        "339ch.epgdata.ontvjapan"       =>      "CS8",  // 339, // "ディズニージュニア"
        "2002.ontvjapan.com"            =>      "CS8",  // 349, // "日テレNEWS24"

        "800ch.epgdata.ontvjapan"       =>      "CS10", // 800, // "スカチャン0HD"
        "801ch.epgdata.ontvjapan"       =>      "CS10", // 801, // "スカチャン1HD"
        "802ch.epgdata.ontvjapan"       =>      "CS10", // 802, // "スカチャン2"
        "803ch.epgdata.ontvjapan"       =>      "CS10", // 805, // "スカチャン3"

        "1045.ontvjapan.com"            =>      "CS12", // 330, // "キッズステーションHD"
        "1026.ontvjapan.com"            =>      "CS12", // 254, // "GAORA"
        "1022.ontvjapan.com"            =>      "CS12", // 325, // "MUSIC ON! TV"

        "1133.ontvjapan.com"            =>      "CS14", // 292, // "時代劇専門チャンネル"
        "1015.ontvjapan.com"            =>      "CS14", // 293, // "ファミリー劇場"
        "1006.ontvjapan.com"            =>      "CS14", // 310, // "スーパー!ドラマTV"

        "1207.ontvjapan.com"            =>      "CS16", // 290, // "SKY STAGE"
        "305ch.epgdata.ontvjapan"       =>      "CS16", // 305, // "チャンネル銀河"
        "1201.ontvjapan.com"            =>      "CS16", // 333, // "AT-X"
        "1014.ontvjapan.com"            =>      "CS16", // 311, // "AXN"
        "1204.ontvjapan.com"            =>      "CS16", // 343, // "ナショジオチャンネル"
        "1070.ontvjapan.com"            =>      "CS16", // 353, // "BBCワールドニュース"

        "1007.ontvjapan.com"            =>      "CS18", // 240, // "ムービープラスHD"
        "1027.ontvjapan.com"            =>      "CS18", // 262, // "ゴルフネットワーク"
        "1074.ontvjapan.com"            =>      "CS18", // 314, // "LaLa HD"

        "1073.ontvjapan.com"            =>      "CS20", // 307, // "フジテレビONE"
        "1072.ontvjapan.com"            =>      "CS20", // 308, // "フジテレビTWO"
        "306ch.epgdata.ontvjapan"       =>      "CS20", // 309, // "フジテレビNEXT"

        "1120.ontvjapan.com"            =>      "CS22", // 161, // "QVC"
        "1076.ontvjapan.com"            =>      "CS22", // 351, // "TBSニュースバード"
        "1016.ontvjapan.com"            =>      "CS22", // 312, // "FOX"
        "1018.ontvjapan.com"            =>      "CS22", // 322, // "スペースシャワーTV"
        "1046.ontvjapan.com"            =>      "CS22", // 331, // "カートゥーン ネットワーク"

        "1068.ontvjapan.com"            =>      "CS24", // 257, // "日テレG+HD"
        "300ch.epgdata.ontvjapan"       =>      "CS24", // 300, // "日テレプラス"
        "229ch.epgdata.ontvjapan"       =>      "CS24", // 229, // "FOXムービー プレミアム"
        "321ch.epgdata.ontvjapan"       =>      "CS24", // 321, // "スペースシャワーTVプラス"
        "1052.ontvjapan.com"            =>      "CS24", // 362, // "旅チャンネル"
);
?>
epgrec/config.phpにはMP4エンコードスクリプト(DO_MP4ENC)の設定を、epgrec/recorder.phpにはDO_MP4ENCの起動処理を追加。
yano@GT110b:~/software/tv$ diff -bc epgrec/config.php.sample /var/www/epgrec/config.php
*** epgrec/config.php.sample    2011-10-02 16:50:54.000000000 +0900
--- /var/www/epgrec/config.php  2013-05-17 09:40:38.000000000 +0900
***************
*** 73,78 ****
--- 86,92 ----

  define( "PADDING_TIME", 180 );                                                // 詰め物時間
  define( "DO_RECORD", INSTALL_PATH . "/do-record.sh" );                // レコードスクリプト
+ define( "DO_MP4ENC", INSTALL_PATH . "/do-mp4enc.sh" );                // MP4エンコードスクリプト
  define( "COMPLETE_CMD", INSTALL_PATH . "/recomplete.php" );   // 録画終了コマンド
  define( "GEN_THUMBNAIL", INSTALL_PATH . "/gen-thumbnail.sh" );        // サムネール生成スクリプト
  define( "RECORDER_CMD", INSTALL_PATH . "/recorder.php" );
yano@GT110b:~/software/tv$ diff -bc epgrec/recorder.php /var/www/epgrec/
*** epgrec/recorder.php  2011-10-02 16:50:54.000000000 +0900
--- /var/www/epgrec/recorder.php      2013-05-21 02:01:27.000000000 +0900
***************
*** 276,281 ****
--- 276,285 ----
                // 予約完了
                reclog( "recorder:: 予約ID". $rrec->id .":".$rrec->type.$rrec->channel.$rrec->title."の録画終了" );

+               $cmdline = DO_MP4ENC ." ". INSTALL_PATH .$settings->spool . "/". $rrec->path;
+               exec($cmdline);
+               reclog( "recorder:: 予約ID". $rrec->id .":".INSTALL_PATH .$settings->spool . "/". $rrec->path."のエンコード終了" );
+
                // サムネール作成
                if( $settings->use_thumbs == 1 ) {
                        $gen_thumbnail = INSTALL_PATH."/gen-thumbnail.sh";
epgrec/Reservation.class.phpは出力ファイル名の"サービスID"対応と、英数字の全角→半角変換&空白などの特殊記号を_に置き換える改造。
yano@GT110b:~/software/tv$ diff -bc epgrec/Reservation.class.php /var/www/epgrec/
*** epgrec/Reservation.class.php        2012-10-13 16:09:54.975488795 +0900
--- /var/www/epgrec/Reservation.class.php       2013-05-21 09:53:06.000000000 +0900
***************
*** 209,214 ****
--- 209,215 ----
                        %ET%    終了日時
                        %TYPE%  GR/BS/CS
                        %CH%    チャンネル番号
+                       %SID%   サービスID
                        %DOW%   曜日(Sun-Mon)
                        %DOWJ%  曜日(日-土)
                        %YEAR%  開始年
***************
*** 225,230 ****
--- 226,232 ----

                        // %TITLE%
                        $filename = mb_str_replace("%TITLE%", trim($title), $filename);
+                       $filename = mb_convert_kana(trim($filename),"as","UTF-8");
                        // %ST% 開始日時
                        $filename = mb_str_replace("%ST%",date("YmdHis", $start_time), $filename );
                        // %ET% 終了日時
***************
*** 233,238 ****
--- 235,242 ----
                        $filename = mb_str_replace("%TYPE%",$crec->type, $filename );
                        // %CH% チャンネル番号
                        $filename = mb_str_replace("%CH%","".$crec->channel, $filename );
+                       // %SID%        サービスID
+                       $filename = mb_str_replace("%SID%","".$crec->sid, $filename );
                        // %DOW%        曜日(Sun-Mon)
                        $filename = mb_str_replace("%DOW%",date("D", $start_time), $filename );
                        // %DOWJ%       曜日(日-土)
***************
*** 256,261 ****
--- 260,266 ----
  //                    $filename = preg_replace("/[ \.\/\*:<>\?\\|()\'\"&]/u","_", trim($filename) );

                        // preg_replaceがUTF-8に対応できない環境があるようなのでmb_ereg_replaceに戻す
+                       mb_regex_encoding("UTF-8");
                        $filename = mb_ereg_replace("[ \./\*:<>\?\\|()\'\"&]","_", trim($filename) );

                        // 文字コード変換

【参照】
●衛星デジタル放送 情報ページ http://www5e.biglobe.ne.jp/~kazu_f/digital-sat/
N-SAT-110(SUPERBIRD-D/JCSAT-110) トランスポンダ利用状況
●PukiWiki Plus! http://baalzephon.no-ip.org/
Linux/テレビ関連/PT2
●録画予約システムepgrec http://www.mda.or.jp/epgrec/
epgrec/epgrec.git/summary
●pt1 http://hg.honeyplanet.jp/pt1/
●Amazon.co.jp https://www.amazon.co.jp/
PT3 Rev.A 12,400円