Получение EPG от DVB-S

Пытаюсь написать граббер EPG. Я использую библиотеку libucsi под linux. Я могу прочитать один TS из таблицы EIT и расшифровать данные EPG. Но он неполный и я не умею читать все необходимые ТЗ.

Я пытался погуглить и прочитал кое-какую документацию, но безуспешно. Может ли кто-нибудь помочь мне понять и сказать мне, как прочитать все TS для полного EPG? Имеет ли EIT какой-то идентификатор непрерывности или что-то в этом роде?

Спасибо за помощь.

Функция [EDIT] для чтения данных:

void readD(char * dedev, __u8 * data, int size_data ,int pid)
{
    int defd;

    if ((defd = open(dedev, O_RDWR | O_LARGEFILE )) < 0) 
    {
      perror("opening demux failed");
      return 0;
    }

    #define TS_BUF_SIZE   (256 * 1024)      
    long dmx_buffer_size = TS_BUF_SIZE;

    if( ioctl(defd,DMX_SET_BUFFER_SIZE,dmx_buffer_size) < 0)
    {
      perror("set demux filter failed");
      return 0;
    }

    struct dmx_sct_filter_params    sctFilterParams;
    memset(&sctFilterParams, 0, sizeof(struct dmx_sct_filter_params));
    sctFilterParams.pid=pid;
    sctFilterParams.timeout=10000; //10s
    sctFilterParams.flags=DMX_IMMEDIATE_START|DMX_CHECK_CRC;

    if( ioctl(defd,DMX_SET_FILTER,&sctFilterParams) < 0)
    {
      perror("set demux filter failed");
      return 0;
    }

    read(defd,data,size_data);

    close(defd);
}

и я называю это:

#define TS_PACKET_SIZE 188
__u8 pat_data[TS_PACKET_SIZE*10];
readD(dedev, pat_data, sizeof(pat_data) ,PID_EIT);

person Alrick    schedule 20.11.2014    source источник
comment
Что вы подразумеваете под неполным? Чего не хватает в вашем EPG? Вы также можете отфильтровать SDT, чтобы получить некоторую информацию об услуге (имя, провайдер, статус скремблирования и т. д.).   -  person n0p    schedule 24.11.2014
comment
@Coconop Я получаю только несколько событий, например 5, но мне нужно создать полный файл xmltv. И когда я запускаю свою программу, она каждый раз возвращает разные события.   -  person Alrick    schedule 26.11.2014
comment
Это файл TS или живой источник? В реальном времени службы добавляются/удаляются «на лету», поэтому получение разных результатов является нормальным явлением. Не могли бы вы показать, как вы фильтруете EIT?   -  person n0p    schedule 26.11.2014
comment
@Coconop Это живой источник. И я думаю, что вы меня не понимаете. Поэтому я пытаюсь переписать свою проблему. Например, передается набор из n программ (от ‹программного канала = 1› до ‹программного канала = n›). Итак, у меня должны быть программы с 1 по n, но у меня есть только программы с 1 по 5 или с 5 по 10, только часть набора программ. И мой вопрос все тот же.   -  person Alrick    schedule 27.11.2014
comment
Хорошо, я понимаю. Но без кода трудно сказать, почему вам не хватает некоторых программ...   -  person n0p    schedule 27.11.2014
comment
@Coconop Я добавляю функцию для чтения данных.   -  person Alrick    schedule 27.11.2014


Ответы (1)


Я бы заподозрил неправильный размер буфера: кажется, вы скопировали код для фильтрации PAT и адаптировали его для EIT: как вы можете быть уверены, что ваш раздел поместится в ваш буфер из 10 TP pat_data?

Вы должны проверить код возврата read : вам может потребоваться изменить размер буфера или выполнить последующие вызовы, чтобы получить все это.

person n0p    schedule 28.11.2014