From a6ed936b6b2897910c1c95f953c3811ee1ebdf03 Mon Sep 17 00:00:00 2001 From: Georgi Chorbadzhiyski Date: Wed, 8 Jun 2011 19:36:29 +0000 Subject: [PATCH] * Add support for Conditional Access Table --- mpeg/psi.h | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ mpeg/psi_print.h | 39 +++++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/mpeg/psi.h b/mpeg/psi.h index 11585cc..2b55f75 100644 --- a/mpeg/psi.h +++ b/mpeg/psi.h @@ -966,6 +966,88 @@ static inline void pat_table_print(uint8_t **pp_sections, f_print pf_print, } } +/***************************************************************************** + * Conditional Access Table + *****************************************************************************/ +#define CAT_PID 0x01 +#define CAT_TABLE_ID 0x01 +#define CAT_HEADER_SIZE PSI_HEADER_SIZE_SYNTAX1 + +static inline void cat_init(uint8_t *p_cat) +{ + psi_init(p_cat, true); + psi_set_tableid(p_cat, CAT_TABLE_ID); + p_cat[1] &= ~0x40; + psi_set_section(p_cat, 0); + psi_set_lastsection(p_cat, 0); +} + +static inline void cat_set_length(uint8_t *p_cat, uint16_t i_cat_length) +{ + psi_set_length(p_cat, CAT_HEADER_SIZE + PSI_CRC_SIZE - PSI_HEADER_SIZE + + i_cat_length); +} + +static inline uint16_t cat_get_desclength(const uint8_t *p_cat) +{ + return psi_get_length(p_cat) - (CAT_HEADER_SIZE + PSI_CRC_SIZE - PSI_HEADER_SIZE); +} + +static inline uint8_t *cat_alloc_descs(uint8_t *p_cat) +{ + uint16_t i_desc_len = cat_get_desclength(p_cat); + uint8_t *p_buf = malloc(i_desc_len + 2); + if (!p_buf) + return NULL; + + memcpy(p_buf + 2, p_cat + 8, i_desc_len); + descs_set_length(p_buf, i_desc_len); + + return p_buf; +} + +static inline void cat_free_descs(uint8_t *p_cat_descs) +{ + free(p_cat_descs); +} + +static inline bool cat_validate(const uint8_t *p_cat) +{ + uint16_t i_section_size = psi_get_length(p_cat) + PSI_HEADER_SIZE + - PSI_CRC_SIZE; + const uint8_t *p_cat_n; + + if (!psi_get_syntax(p_cat) || psi_get_section(p_cat) + || psi_get_lastsection(p_cat) + || psi_get_tableid(p_cat) != CAT_TABLE_ID) + return false; + + if (!psi_check_crc(p_cat)) + return false; + + if (i_section_size < CAT_HEADER_SIZE + || i_section_size < CAT_HEADER_SIZE + cat_get_desclength(p_cat)) + return false; + + return true; +} + +static inline bool cat_table_validate(uint8_t **pp_sections) +{ + uint8_t i_last_section = psi_table_get_lastsection(pp_sections); + uint8_t i; + + for (i = 0; i <= i_last_section; i++) { + uint8_t *p_section = psi_table_get_section(pp_sections, i); + int j = 0; + + if (!psi_check_crc(p_section)) + return false; + } + + return true; +} + /***************************************************************************** * Program Map Table *****************************************************************************/ diff --git a/mpeg/psi_print.h b/mpeg/psi_print.h index 2f482a2..1f3063f 100644 --- a/mpeg/psi_print.h +++ b/mpeg/psi_print.h @@ -31,6 +31,45 @@ extern "C" { #endif +/***************************************************************************** + * Conditional Access Table + *****************************************************************************/ +static inline void cat_table_print(uint8_t **pp_sections, f_print pf_print, + void *opaque, print_type_t i_print_type) +{ + uint8_t i_last_section = psi_table_get_lastsection(pp_sections); + uint8_t i; + + switch (i_print_type) { + case PRINT_XML: + pf_print(opaque, "", + psi_table_get_version(pp_sections), + !psi_table_get_current(pp_sections) ? 0 : 1); + break; + default: + pf_print(opaque, "new CAT version=%hhu%s", + psi_table_get_version(pp_sections), + !psi_table_get_current(pp_sections) ? " (next)" : ""); + } + + for (i = 0; i <= i_last_section; i++) { + uint8_t *p_section = psi_table_get_section(pp_sections, i); + uint8_t *p_descs = cat_alloc_descs(p_section); + + descs_print(p_descs, pf_print, opaque, NULL, NULL, i_print_type); + + cat_free_descs(p_descs); + } + + switch (i_print_type) { + case PRINT_XML: + pf_print(opaque, ""); + break; + default: + pf_print(opaque, "end CAT"); + } +} + /***************************************************************************** * Program Map Table *****************************************************************************/