9 #include "Raym/Log.h"
\r
11 #include "Raym/Raym.h"
\r
12 #include "b25/aribstr.h"
\r
13 #include "ry0/iPTd/Analyzer.h"
\r
15 using namespace Raym;
\r
22 Analyzer::Analyzer()
\r
26 _demux.setListener(this);
\r
29 Analyzer::~Analyzer()
\r
37 Analyzer *Analyzer::alloc()
\r
39 return new Analyzer();
\r
42 Analyzer *Analyzer::init()
\r
47 Dictionary *Analyzer::stationInfo()
\r
49 Dictionary *result = NULL;
\r
51 _demux.setFlag(MPEG2::TS::Demultiplexer::FLG_SDT, true);
\r
56 while ((result == NULL) && (count++ < 32))
\r
58 while (_sdt == NULL)
\r
63 if (_sdt->_table_id == 0x42)
\r
65 result = Dictionary::dictionaryWithCapacity(0);
\r
66 Array *services = Array::arrayWithCapacity(0);
\r
67 result->setObject(services, KEY_SERVICES);
\r
68 for (uint32_t i = 0; i < _sdt->_service_count; ++i)
\r
70 Dictionary *service = Dictionary::dictionaryWithCapacity(0);
\r
71 services->addObject(service);
\r
73 sprintf_s(tmp, "%d", _sdt->_services[i]._service_id);
\r
74 service->setString(tmp, KEY_SERVICE_ID);
\r
75 sprintf_s(tmp, "%d", _sdt->_services[i]._desc->service_type);
\r
76 service->setString(tmp, KEY_SERVICE_TYPE);
\r
77 if (_sdt->_services[i]._desc->service_name_length > 0)
\r
79 String *name = String::stringWithCString(_sdt->_services[i]._desc->service_name, ShiftJISStringEncoding);
\r
80 service->setString(name, KEY_NAME);
\r
83 result->setString(name, KEY_NAME);
\r
95 _demux.setFlag(MPEG2::TS::Demultiplexer::FLG_SDT, false);
\r
100 Array *Analyzer::collectEPGs(time_t limit)
\r
102 _demux.setFlag(MPEG2::TS::Demultiplexer::FLG_EIT, true);
\r
104 std::vector<MPEG2::TS::EIT *> eits;
\r
108 time_t start = time(NULL);
\r
111 while ((_eit == NULL) && (time(NULL) < start + limit))
\r
113 RaymCondTimedWait(this, 1000);
\r
118 eits.push_back(_eit);
\r
129 _demux.setFlag(MPEG2::TS::Demultiplexer::FLG_EIT, false);
\r
131 Array *result = Array::arrayWithCapacity(0);
\r
133 std::vector<MPEG2::TS::EIT *>::iterator it;
\r
134 for (it = eits.begin(); it != eits.end(); ++it)
\r
136 MPEG2::TS::EIT *eit = (*it);
\r
137 if ((eit->_table_id == MPEG2::TS::EIT::TABLE_ID_SELF) ||
\r
138 ((MPEG2::TS::EIT::TABLE_ID_SELF_SCHEDULE_BEGIN <= eit->_table_id) && (eit->_table_id <= MPEG2::TS::EIT::TABLE_ID_SELF_SCHEDULE_END)))
\r
140 MPEG2::TS::EIT::Event *event;
\r
141 while ((event = eit->nextEvent()) != NULL)
\r
143 char service_id[32];
\r
144 sprintf_s(service_id, "%d", eit->_service_id);
\r
147 sprintf_s(event_id, "%d", event->_event_id);
\r
149 Dictionary *epg = NULL;
\r
151 for (uint32_t i = 0; i < result->count(); ++i)
\r
153 epg = (Dictionary *)result->objectAtIndex(i);
\r
154 if (epg->stringForKey(KEY_EPG_SERVICE_ID)->isEqualToString(service_id) &&
\r
155 epg->stringForKey(KEY_EPG_EVENT_ID)->isEqualToString(event_id))
\r
164 epg = Dictionary::dictionaryWithCapacity(0);
\r
165 epg->setString(service_id, KEY_EPG_SERVICE_ID);
\r
166 epg->setString(event_id, KEY_EPG_EVENT_ID);
\r
169 sprintf_s(date, sizeof(date), "%02d/%02d/%02d", event->_st_year, event->_st_month, event->_st_day);
\r
170 epg->setString(date, KEY_EPG_DATE);
\r
173 sprintf_s(start, sizeof(start), "%02d:%02d:%02d", event->_st_hour, event->_st_min, event->_st_sec);
\r
174 epg->setString(start, KEY_EPG_START);
\r
176 int hour = event->_st_hour + event->_dur_hour;
\r
177 int min = event->_st_min + event->_dur_min;
\r
178 int sec = event->_st_sec + event->_dur_sec;
\r
190 sprintf_s(end, sizeof(end), "%02d:%02d:%02d", hour, min, sec);
\r
191 epg->setString(end, KEY_EPG_END);
\r
194 sprintf_s(duration, sizeof(duration), "%d", event->_dur_hour * 3600 + event->_dur_min * 60 + event->_dur_sec);
\r
195 epg->setString(duration, KEY_EPG_DURATION);
\r
197 result->addObject(epg);
\r
200 Array *ext_items = NULL;
\r
201 String *ext_item_desc = NULL;
\r
202 Data *ext_item = NULL;
\r
203 Data *ext_text = NULL;
\r
205 MPEG2::TS::Descriptor *desc;
\r
206 while ((desc = event->nextDescriptor()) != NULL)
\r
208 switch (desc->_descriptor_tag)
\r
210 case MPEG2::TS::TAG_BOUQUET_NAME_DESCRIPTOR:
\r
211 DebugLog3("TAG_BOUQUET_NAME_DESCRIPTOR\n");
\r
214 case MPEG2::TS::TAG_SERVICE_DESCRIPTOR:
\r
215 DebugLog3("TAG_SERVICE_DESCRIPTOR\n");
\r
218 case MPEG2::TS::TAG_SHORT_EVENT_DESCRIPTOR:
\r
219 DebugLog3("TAG_SHORT_EVENT_DESCRIPTOR\n");
\r
220 if (desc->_short_event._event_name_length > 0)
\r
222 char *tmp = (char *)malloc(desc->_short_event._event_name_length * 3);
\r
225 AribToString(tmp, (const char *)desc->_short_event._event_name, desc->_short_event._event_name_length);
\r
226 String *event_name = String::stringWithCString(tmp, ShiftJISStringEncoding);
\r
227 if (event_name != NULL)
\r
229 epg->setString(event_name, KEY_EPG_TITLE);
\r
234 if (desc->_short_event._text_length > 0)
\r
236 char *tmp = (char *)malloc(desc->_short_event._text_length * 3);
\r
239 AribToString(tmp, (const char *)desc->_short_event._text, desc->_short_event._text_length);
\r
240 String *text = String::stringWithCString(tmp, ShiftJISStringEncoding);
\r
243 epg->setString(text, KEY_EPG_DESCRIPTION);
\r
250 case MPEG2::TS::TAG_EXTENDED_EVENT_DESCRIPTOR:
\r
251 DebugLog3("TAG_EXTENDED_EVENT_DESCRIPTOR\n");
\r
253 for (int i = 0; i < desc->_extended_event._item_count; ++i)
\r
255 if (ext_items == NULL)
\r
257 ext_items = Array::arrayWithCapacity(0);
\r
258 epg->setObject(ext_items, KEY_EPG_EXT_ITEMS);
\r
261 if (desc->_extended_event._items[i]._item_description_length > 0)
\r
263 if (ext_item != NULL)
\r
265 char *tmp = (char *)malloc(ext_item->length() * 3);
\r
268 AribToString(tmp, (const char *)ext_item->bytes(), ext_item->length());
\r
269 String *desc = String::stringWithCString(tmp, ShiftJISStringEncoding);
\r
272 Dictionary *dict = Dictionary::dictionaryWithCapacity(0);
\r
273 if (ext_item_desc != NULL)
\r
275 dict->setString(ext_item_desc, KEY_EPG_EXT_ITEM_DESCRIPTION);
\r
276 ext_item_desc = NULL;
\r
278 dict->setString(desc, KEY_EPG_EXT_ITEM);
\r
279 ext_items->addObject(dict);
\r
286 char *tmp = (char *)malloc(desc->_extended_event._items[i]._item_description_length * 3);
\r
289 AribToString(tmp, (const char *)desc->_extended_event._items[i]._item_description,
\r
290 desc->_extended_event._items[i]._item_description_length);
\r
291 ext_item_desc = String::stringWithCString(tmp, ShiftJISStringEncoding);
\r
296 ext_item_desc = NULL;
\r
300 if (desc->_extended_event._items[i]._item_length > 0)
\r
302 if (ext_item == NULL)
\r
304 ext_item = Data::dataWithCapacity(0);
\r
306 ext_item->appendBytes(desc->_extended_event._items[i]._item,
\r
307 desc->_extended_event._items[i]._item_length);
\r
310 if (desc->_extended_event._text_length > 0)
\r
312 if (ext_text == NULL)
\r
314 ext_text = Data::dataWithCapacity(0);
\r
316 ext_text->appendBytes(desc->_extended_event._text, desc->_extended_event._text_length);
\r
321 case MPEG2::TS::TAG_CONTENT_DESCRIPTOR:
\r
322 DebugLog3("TAG_CONTENT_DESCRIPTOR\n");
\r
325 case MPEG2::TS::TAG_SERIES_DESCRIPTOR:
\r
326 DebugLog3("TAG_SERIES_DESCRIPTOR\n");
\r
329 case MPEG2::TS::TAG_EVENT_GROUP_DESCRIPTOR:
\r
330 DebugLog3("TAG_EVENT_GROUP_DESCRIPTOR\n");
\r
333 case MPEG2::TS::TAG_COMPONENT_DESCRIPTOR:
\r
334 DebugLog3("TAG_COMPONENT_DESCRIPTOR\n");
\r
337 case MPEG2::TS::TAG_DIGITAL_COPY_CONTROL_DESCRIPTOR:
\r
338 DebugLog3("TAG_DIGITAL_COPY_CONTROL_DESCRIPTOR\n");
\r
341 case MPEG2::TS::TAG_AUDIO_COMPONENT_DESCRIPTOR:
\r
342 DebugLog3("TAG_AUDIO_COMPONENT_DESCRIPTOR\n");
\r
345 case MPEG2::TS::TAG_DATA_CONTENT_DESCRIPTOR:
\r
346 DebugLog3("TAG_AUDIO_COMPONENT_DESCRIPTOR\n");
\r
350 DebugLog3("Unknown descriptor: 0x%02X\n", desc->_descriptor_tag);
\r
355 if (ext_item != NULL)
\r
357 char *tmp = (char *)malloc(ext_item->length() * 3);
\r
360 AribToString(tmp, (const char *)ext_item->bytes(), ext_item->length());
\r
361 String *desc = String::stringWithCString(tmp, ShiftJISStringEncoding);
\r
364 Dictionary *dict = Dictionary::dictionaryWithCapacity(0);
\r
365 if (ext_item_desc != NULL)
\r
367 dict->setString(ext_item_desc, KEY_EPG_EXT_ITEM_DESCRIPTION);
\r
368 ext_item_desc = NULL;
\r
370 dict->setString(desc, KEY_EPG_EXT_ITEM);
\r
371 ext_items->addObject(dict);
\r
378 if (ext_text != NULL)
\r
380 char *tmp = (char *)malloc(ext_text->length() * 3);
\r
383 AribToString(tmp, (const char *)ext_text->bytes(), ext_text->length());
\r
384 String *desc = String::stringWithCString(tmp, ShiftJISStringEncoding);
\r
387 Dictionary *dict = Dictionary::dictionaryWithCapacity(0);
\r
388 dict->setString("no desc", KEY_EPG_EXT_ITEM_DESCRIPTION);
\r
389 dict->setString(desc, KEY_EPG_EXT_ITEM);
\r
390 ext_items->addObject(dict);
\r
405 void Analyzer::put(uint8_t *buffer, uint32_t size)
\r
407 _demux.put(buffer, size);
\r
410 void Analyzer::detect(MPEG2::TS::SDT *sdt)
\r
418 _sdt = new MPEG2::TS::SDT(*sdt);
\r
419 RaymCondSignal(this);
\r
423 void Analyzer::detect(MPEG2::TS::EIT *eit)
\r
431 _eit = new MPEG2::TS::EIT(*eit);
\r
432 RaymCondSignal(this);
\r