OSDN Git Service

EPG解析処理再考中
[iptd/iPTd.git] / src / ry0 / iPTd / Controller.cpp
index aab83f2..b7cde41 100644 (file)
@@ -21,8 +21,9 @@
 \r
 #include "ry0/iPTd/Controller.h"\r
 #include "ry0/iPTd/HTTPLiveStreaming.h"\r
-#include "mpeg2/ts/Analyzer.h"\r
+#include "ry0/iPTd/Analyzer.h"\r
 \r
+#include "b25/aribstr.h"\r
 #include "b25/arib_std_b25.h"\r
 #include "b25/b_cas_card.h"\r
 \r
@@ -57,8 +58,9 @@ static const long long CMD_COLLECT_EPG_ISDB_T   = 0x0006;  // 番組情報取得
 //\r
 static const TimeInterval DEF_COLLECT_EPG_DELAY    = 1.0;\r
 static const TimeInterval DEF_COLLECT_EPG_RETRY    = 60.0;\r
-static const TimeInterval DEF_COLLECT_EPG_LIMIT_S  = 10.5;\r
-static const TimeInterval DEF_COLLECT_EPG_LIMIT_T  = 20.5;\r
+\r
+static const time_t DEF_COLLECT_EPG_LIMIT_S  = 20;\r
+static const time_t DEF_COLLECT_EPG_LIMIT_T  = 30;\r
 \r
 static const time_t OFFSET_OF_START_TIME        = -2;       // 録画開始時刻の補正(秒単位)\r
 static const time_t OFFSET_OF_END_TIME          = -3;       // 録画停止時刻の補正(秒単位)\r
@@ -222,7 +224,7 @@ void Controller::removePastEPGs()
     RaymUnlock(this);\r
 }\r
 \r
-void Controller::collectEPGsForTuner(int tuner, TimeInterval limit)\r
+void Controller::collectEPGsForTuner(int tuner, time_t limit)\r
 {\r
     DebugLog2("Controller::collectEPGsForTuner(%d) start.", tuner);\r
 \r
@@ -240,51 +242,21 @@ void Controller::collectEPGsForTuner(int tuner, TimeInterval limit)
         return;\r
     }\r
 \r
-    // \r
-    Array *collected = Array::arrayWithCapacity(0);\r
-\r
-    // 開始時刻取得\r
-    Date *start = Date::date();\r
-\r
-    // 取得開始\r
-    bool done = false;\r
-    while (!done)\r
-    {\r
-        AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
 \r
-        // EPG取得\r
-        MPEG2::TS::Analyzer an;\r
-        an.setFlag(MPEG2::TS::Analyzer::FLAG_EIT);\r
-        _tuners[tuner]->setListener(&an);\r
-        Array *epgs = an.epgInfos();\r
-        _tuners[tuner]->setListener(NULL);\r
+    Analyzer *an = Analyzer::alloc()->init();\r
+    _tuners[tuner]->setListener(an);\r
 \r
-        if (epgs != NULL)\r
-        {\r
-            // 取得成功\r
-            collected->addObjectsFromArray(epgs);\r
-        }\r
+    Array *collected = an->collectEPGs(limit);\r
 \r
-        // リミットチェック\r
-        if (Date::date()->timeIntervalSinceDate(start) >= limit)\r
-        {\r
-            done = true;\r
-        }\r
-\r
-        // キャンセル確認\r
-        RaymLock(this);\r
-        if (!done)\r
-        {\r
-            done = _cancel_epg_collect;\r
-        }\r
-        RaymUnlock(this);\r
-\r
-        pool->release();\r
-    }\r
+    _tuners[tuner]->setListener(NULL);\r
+    an->release();\r
 \r
     // lock\r
     RaymLock(this);\r
 \r
+    long add_cnt = 0;\r
+    long discard = 0;\r
+\r
     for (uint j = 0; j < collected->count(); ++j)\r
     {\r
         Dictionary *epg1 = (Dictionary *)collected->objectAtIndex(j);\r
@@ -292,6 +264,8 @@ void Controller::collectEPGsForTuner(int tuner, TimeInterval limit)
         if (epg1->stringForKey(KEY_EPG_TITLE) == NULL)\r
         {\r
             // タイトルが無い場合は不要\r
+            ++discard;\r
+//            DebugLog0("discard: %s", epg1->toString().c_str());\r
             continue;\r
         }\r
 \r
@@ -310,10 +284,12 @@ void Controller::collectEPGsForTuner(int tuner, TimeInterval limit)
             key = epg1->stringForKey(KEY_EPG_EVENT_ID);\r
             if (key != NULL)\r
             {\r
+                ++add_cnt;\r
                 epgs_of_service->setObject(epg1, key);\r
             }\r
         }\r
     }\r
+    DebugLog0("add: %d, discard: %d", add_cnt, discard);\r
 \r
     // ファイルへ書き出し\r
     _epgs->writeToFile(_epgs_path, true);\r
@@ -373,6 +349,8 @@ bool Controller::collectEPGs(Tuner::Type type)
             // チャンネル設定\r
             if (_tuners[tuner]->setChannel(ch))\r
             {\r
+                DebugLog0("  %s: channel: %d", _tuners[tuner]->name(), ch);\r
+\r
                 // EPG取集\r
                 collectEPGsForTuner(tuner, ((type == Tuner::ISDB_S) ? DEF_COLLECT_EPG_LIMIT_S : DEF_COLLECT_EPG_LIMIT_T));\r
 \r
@@ -1373,36 +1351,28 @@ void Controller::scanChannel(int tuner)
             channelInfo->setBool(true, KEY_ENABLED);\r
 \r
             // 局情報を取得\r
-            MPEG2::TS::Analyzer an;\r
-            an.setFlag(MPEG2::TS::Analyzer::FLAG_SDT);\r
-            _tuners[tuner]->setListener(&an);\r
-            uint32_t count = 0;\r
-            while (count++ < 8)\r
-            {\r
-                Dictionary *stationInfo = an.stationInfo();\r
-                if (stationInfo != NULL)\r
+            Analyzer *an = Analyzer::alloc()->init();\r
+            _tuners[tuner]->setListener(an);\r
+\r
+            Dictionary *stationInfo = an->stationInfo();\r
+            if (stationInfo != NULL)\r
+            {\r
+                if (stationInfo->stringForKey(KEY_NAME) != NULL)\r
                 {\r
-                    if (stationInfo->stringForKey(KEY_NAME) != NULL)\r
-                    {\r
-                        channelInfo->setString(stationInfo->stringForKey(KEY_NAME), KEY_NAME);\r
-                    }\r
-                    if (stationInfo->objectForKey(KEY_SERVICES) != NULL)\r
-                    {\r
-                        channelInfo->setObject(stationInfo->objectForKey(KEY_SERVICES), KEY_SERVICES);\r
-                    }\r
+                    channelInfo->setString(stationInfo->stringForKey(KEY_NAME), KEY_NAME);\r
                 }\r
-\r
-                if ((channelInfo->stringForKey(KEY_NAME) != NULL) && (channelInfo->objectForKey(KEY_SERVICES) != NULL))\r
+                if (stationInfo->objectForKey(KEY_SERVICES) != NULL)\r
                 {\r
-                    break;\r
+                    channelInfo->setObject(stationInfo->objectForKey(KEY_SERVICES), KEY_SERVICES);\r
+                }\r
+                if (channelInfo->stringForKey(KEY_NAME) != NULL)\r
+                {\r
+                    DebugLog0("    Name: %s", channelInfo->stringForKey(KEY_NAME)->cString());\r
                 }\r
             }\r
 \r
-            if (channelInfo->stringForKey(KEY_NAME) != NULL)\r
-            {\r
-                DebugLog0("    Name: %s", channelInfo->stringForKey(KEY_NAME)->cString());\r
-            }\r
             _tuners[tuner]->setListener(NULL);\r
+            an->release();\r
 \r
             // 成功したチャンネルを保持\r
             lastChannel = ch;\r
@@ -1412,11 +1382,9 @@ void Controller::scanChannel(int tuner)
             DebugLog0("  CH %s: NG", chkey);\r
         }\r
 \r
-        // unlock\r
         RaymUnlock(this);\r
     }\r
 \r
-    // lock\r
     RaymLock(this);\r
 \r
     // チューナを初期化済みに更新\r
@@ -4950,20 +4918,22 @@ void Controller::timerExpired(Timer *timer, void *userInfo)
         {\r
             // 初期化成功\r
             DebugLog2("tuner initialize success.");\r
-\r
+#if 0\r
             // EPG収集用タイマ起動(ISDB-S)\r
             _timer_epg_s = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_S, true);\r
             if (_timer_epg_s != NULL)\r
             {\r
                 _timer_epg_s->fire();\r
             }\r
-\r
+#endif\r
+#if 1\r
             // EPG収集用タイマ起動(ISDB-T)\r
             _timer_epg_t = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_T, true);\r
             if (_timer_epg_t != NULL)\r
             {\r
                 _timer_epg_t->fire();\r
             }\r
+#endif\r
         }\r
         else\r
         {\r