[linux-dvb] Re: CA_ZAP/DVB libs

Andrew de Quincey adq_dvb at lidskialf.net
Thu Jul 7 19:21:52 CEST 2005


Random attempt at using libdvbsak#1:

Possible API for parsing a PAT table:

struct bitstream {
        union {
                struct {
                        unsigned char *buf;
                        size_t len;
                } mem;
        } u;
        enum {
                BITSTREAM_MEM,
        } type;
        unsigned int ptr;
        int error;
};

struct dvbsi_section {
        int pid;

        uint8_t table_id;
        int section_syntax_ind;
        /* if section_syntax_indicator == 1: */
        int table_id_ext;
        int version_nr;
        int current_next_ind;
        uint8_t section_nr;
        uint8_t last_section_nr;
        uint8_t crc32[4];

        struct bitstream contents;
};

struct dvbsi_table_pat {
        uint16_t transport_stream_id;
        uint16_t network_pid;
        int program_count;
};

struct dvbsi_table_pat_program {
        uint16_t number;
        uint16_t map_pid;
};

int dvbsi_decode_section_header(struct dvbsi_section* section, struct 
bitstream* bs);

int dvbsi_table_decode_pat(struct dvbsi_table_pat* pat, struct bitstream* bs);

int dvbsi_table_decode_pat_program(struct dvbsi_table_pat_program* program, 
struct bitstream* bs);

The return value is the number of bytes used, or a negative error code. The 
"struct bitstream" pointers are updated by the _caller_ using this value.

The idea is you decode the section header first with 
dvbsi_decode_section_header(), then you decode the PAT with 
dvbsi_table_decode_pat() if it was one. Since the PAT can have a variable 
number of programs, that only decodes the invariant parts, so you use 
dvbsi_table_decode_pat_program() to decode the programs themselves.


Descriptors are done similarily - you get a bitstream structure pointing at 
the start of them in an SI table structure.

You use the followings to get the ID and length of the descriptor.

int dvbsi_descriptor_id(struct bitstream* bs);
int dvbsi_descriptor_length(struct bitstream* bs);

if you like the descriptor, you decode it with the appropriate function.

int dvbsi_descriptor_decode_service(struct dvbsi_descriptor_service *srv, 
struct bitstream *bs);
....

Otherwise you just skip over the descriptor data to the next one.

This involves no mallocing whatsoever - and it leaves it entirely up to the 
application what to do with the extracted data. Sort of like a a SAX-style 
XML parser as opposed to a DOM style if you know what I mean.

Hmm, this idea reminds me of a certain other library now I think of it... 
anyway lemme know what you think. 




More information about the linux-dvb mailing list