2016-06-25 6 views
0

Я только начинаю писать код (C++) в системе Ubuntu 14.04.4 для доступа к потокам DVB через тюнер DVB TV USB. Я использую libdvbv5. Я в Великобритании, используя наземное freeview.Linux LibdvbV5 EIT grabbing - не хватает времени

Пытается захватить информацию о вне эфира (EIT). Удалось сделать список событий с идентификатором сервиса, временем начала, продолжительностью, именем, описанием и т. Д. Все кажется прекрасным - за исключением того, что он занимает всего 3 дня вперед, тогда как я замечаю, что другим приложениям удается получить 7 дней вперед.

Посмотрел на некоторые другие проекты для этого, такие как dvbtee и mythtv, но еще не удалось выяснить, что не так (много кода). Ничего, что я фильтрует по дате, ни от того, что я вижу, делает libdvbv5.

Идентификатор программы EIT равен 0x12, а идентификатор полной таблицы расписания - 0x50 (до 0x5f). Как я уже сказал, он захватывает всю информацию без каких-либо ошибок, но только за 3 дня вперед, и я знаю, что определенно больше доступно.

Заставляет меня думать, что я поступаю правильно, но смотрю не в том месте? Любые предложения приветствуются.

ответ

1

нашел ответ сам:

Стол с TID 0x50 имеет первые 3-4 дня, 0x51 следующего 3+ и так далее. Теоретически она может достигать 0x5f. Таким образом, чтобы получить все будущие события, которые доступны, нужно циклически повторять процесс с использованием TID 0x50 + [0x00 ... 0x0f] до тех пор, пока не будет достигнут конец или один из них не даст больше событий.

Однако, похоже, что это невозможно с помощью libdvbv5: в дескрипторах.c имеется таблица dvb_table_initializers [256] для различных типов таблиц, но она инициализирует базовый DVB_TABLE_EIT_SCHEDULE (0x50) не все остальные. Поэтому он не будет анализировать другие таблицы. Таким образом, нужно восстановить libdvbv5 с изменением в descriptors.c, как показано ниже, чтобы инициализировать все соответствующие TIDS:

const dvb_table_init_func dvb_table_initializers[256] = { 
[0 ... 255]        = NULL, 
[DVB_TABLE_PAT]       = TABLE_INIT(dvb_table_pat), 
[DVB_TABLE_CAT]       = TABLE_INIT(dvb_table_cat), 
[DVB_TABLE_PMT]       = TABLE_INIT(dvb_table_pmt), 
[DVB_TABLE_NIT]       = TABLE_INIT(dvb_table_nit), 
[DVB_TABLE_SDT]       = TABLE_INIT(dvb_table_sdt), 
[DVB_TABLE_EIT]       = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE]    = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x01]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x02]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x03]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x04]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x05]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x06]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x07]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x08]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x09]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x0a]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x0b]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x0c]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x0d]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x0e]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE + 0x0f]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER]   = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x01] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x02] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x03] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x04] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x05] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x06] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x07] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x08] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x09] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0a] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0b] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0c] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0d] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0e] = TABLE_INIT(dvb_table_eit), 
[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0f] = TABLE_INIT(dvb_table_eit), 
[ATSC_TABLE_MGT]      = TABLE_INIT(atsc_table_mgt), 
[ATSC_TABLE_EIT]      = TABLE_INIT(atsc_table_eit), 
[ATSC_TABLE_TVCT]      = TABLE_INIT(atsc_table_vct), 
[ATSC_TABLE_CVCT]      = TABLE_INIT(atsc_table_vct), 
}; 

Я также сделал это для DVB_TABLE_EIT_SCHEDULE_OTHER, который я предполагаю, это правильно, но не пробовал. Однако он работает для DVB_TABLE_EIT_SCHEDULE.