1 /* 2 * Copyright (c) 2011-2012 - Mauro Carvalho Chehab 3 * Copyright (c) 2012 - Andre Roth <neolynx@gmail.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU Lesser General Public License as published by 7 * the Free Software Foundation version 2.1 of the License. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 18 * 19 */ 20 21 /** 22 * @file pat.h 23 * @ingroup dvb_table 24 * @brief Provides the descriptors for PAT MPEG-TS table 25 * @copyright GNU Lesser General Public License version 2.1 (LGPLv2.1) 26 * @author Mauro Carvalho Chehab 27 * @author Andre Roth 28 * 29 * @par Relevant specs 30 * The table described herein is defined at: 31 * - ISO/IEC 13818-1 32 * 33 * @see http://www.etherguidesystems.com/help/sdos/mpeg/syntax/tablesections/pat.aspx 34 * 35 * @par Bug Report 36 * Please submit bug reports and patches to linux-media@vger.kernel.org 37 */ 38 39 #ifndef _PAT_H 40 #define _PAT_H 41 42 #include <stdint.h> 43 #include <unistd.h> /* ssize_t */ 44 45 #include <libdvbv5/header.h> 46 47 /** 48 * @def DVB_TABLE_PAT 49 * @brief PAT table ID 50 * @ingroup dvb_table 51 * @def DVB_TABLE_PAT_PID 52 * @brief PAT Program ID 53 * @ingroup dvb_table 54 */ 55 #define DVB_TABLE_PAT 0x00 56 #define DVB_TABLE_PAT_PID 0x0000 57 58 /** 59 * @struct dvb_table_pat_program 60 * @brief MPEG-TS PAT program table 61 * @ingroup dvb_table 62 * 63 * @param service_id service id 64 * @param pid pid 65 * @param next pointer to struct dvb_table_pat_program 66 * 67 * This structure is used to store the original PAT program table, 68 * converting the integer fields to the CPU endianness. 69 * 70 * The undocumented parameters are used only internally by the API and/or 71 * are fields that are reserved. They shouldn't be used, as they may change 72 * on future API releases. 73 * 74 * Everything after dvb_table_pat_program::next (including it) won't be bit-mapped 75 * to the data parsed from the MPEG TS. So, metadata are added there. 76 */ 77 struct dvb_table_pat_program { 78 uint16_t service_id; 79 union { 80 uint16_t bitfield; 81 struct { 82 uint16_t pid:13; 83 uint8_t reserved:3; 84 } __attribute__((packed)); 85 } __attribute__((packed)); 86 struct dvb_table_pat_program *next; 87 } __attribute__((packed)); 88 89 /** 90 * @struct dvb_table_pat 91 * @brief MPEG-TS PAT table 92 * @ingroup dvb_table 93 * 94 * @param header struct dvb_table_header content 95 * @param programs number of programs 96 * @param program pointer to struct dvb_table_pat_program 97 98 * This structure is used to store the original PAT table, 99 * converting the integer fields to the CPU endianness. 100 * 101 * The undocumented parameters are used only internally by the API and/or 102 * are fields that are reserved. They shouldn't be used, as they may change 103 * on future API releases. 104 * 105 * Everything after dvb_table_pat_program::program (including it) won't be bit-mapped 106 * to the data parsed from the MPEG TS. So, metadata are added there. 107 */ 108 struct dvb_table_pat { 109 struct dvb_table_header header; 110 uint16_t programs; 111 struct dvb_table_pat_program *program; 112 } __attribute__((packed)); 113 114 /** 115 * @brief Macro used to find programs on a PAT table 116 * @ingroup dvb_table 117 * 118 * @param _pgm program to seek 119 * @param _pat pointer to struct dvb_table_pat_program 120 */ 121 #define dvb_pat_program_foreach(_pgm, _pat) \ 122 if (_pat && _pat->program) \ 123 for (struct dvb_table_pat_program *_pgm = _pat->program; _pgm; _pgm = _pgm->next) \ 124 125 struct dvb_v5_fe_parms; 126 127 #ifdef __cplusplus 128 extern "C" { 129 #endif 130 131 /** 132 * @brief Initializes and parses PAT table 133 * @ingroup dvb_table 134 * 135 * @param parms struct dvb_v5_fe_parms pointer to the opened device 136 * @param buf buffer containing the PAT raw data 137 * @param buflen length of the buffer 138 * @param table pointer to struct dvb_table_pat to be allocated and filled 139 * 140 * This function allocates a PAT table and fills the fields inside 141 * the struct. It also makes sure that all fields will follow the CPU 142 * endianness. Due to that, the content of the buffer may change. 143 * 144 * @return On success, it returns the size of the allocated struct. 145 * A negative value indicates an error. 146 */ 147 ssize_t dvb_table_pat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, 148 ssize_t buflen, struct dvb_table_pat **table); 149 150 /** 151 * @brief Frees all data allocated by the PAT table parser 152 * @ingroup dvb_table 153 * 154 * @param table pointer to struct dvb_table_pat to be freed 155 */ 156 void dvb_table_pat_free(struct dvb_table_pat *table); 157 158 /** 159 * @brief Prints the content of the PAT table 160 * @ingroup dvb_table 161 * 162 * @param parms struct dvb_v5_fe_parms pointer to the opened device 163 * @param table pointer to struct dvb_table_pat 164 */ 165 void dvb_table_pat_print(struct dvb_v5_fe_parms *parms, 166 struct dvb_table_pat *table); 167 168 #ifdef __cplusplus 169 } 170 #endif 171 172 #endif 173