2014-11-20 4 views
0

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

Я попытался это сделать, и я прочитал некоторую документацию, но безуспешно. Может ли кто-нибудь помочь мне понять и рассказать мне, как читать все 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); 
+0

Что вы подразумеваете под «неполным»? Что не хватает вашему EPG? Вы также можете фильтровать 'SDT', чтобы получить некоторую информацию об услуге (имя, поставщик, статус скремблирования и т. Д.). – Coconop

+0

@Coconop. Я получаю всего несколько событий, например 5, но мне нужно построить полный файл xmltv , И когда я запускаю свою программу, он каждый раз возвращает разные события. – Alrick

+0

Является ли это TS-файлом или это источник вживую? В режиме реального времени сервисы добавляются/удаляются на лету, так что это нормально, чтобы получить разные результаты. Не могли бы вы показать, как вы фильтруете СПЭ? – Coconop

ответ

1

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

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