Захват Linux LibdvbV5 EIT — не хватает дней

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

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

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

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

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

0

Решение

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

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

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

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, хотя.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]