metadata_pointer_descriptor.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. /*
  2. * section and descriptor parser
  3. *
  4. * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
  5. * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  20. */
  21. #ifndef _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR
  22. #define _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR 1
  23. #ifdef __cplusplus
  24. extern "C"
  25. {
  26. #endif
  27. #include <libucsi/descriptor.h>
  28. #include <libucsi/endianops.h>
  29. /**
  30. * Possible values for the mpeg_carriage_flags field.
  31. */
  32. enum {
  33. MPEG_CARRIAGE_SAME_TS = 0x00,
  34. MPEG_CARRIAGE_DIFFERENT_TS = 0x01,
  35. MPEG_CARRIAGE_PS = 0x02,
  36. MPEG_CARRIAGE_OTHER = 0x03,
  37. };
  38. /**
  39. * mpeg_metadata_pointer_descriptor structure.
  40. */
  41. struct mpeg_metadata_pointer_descriptor {
  42. struct descriptor d;
  43. uint16_t metadata_application_format;
  44. /* struct mpeg_metadata_pointer_descriptor_application_format_identifier appid */
  45. /* uint8_t metadata_format */
  46. /* struct mpeg_metadata_pointer_descriptor_format_identifier formid */
  47. /* struct mpeg_metadata_pointer_descriptor_flags flags */
  48. /* struct mpeg_metadata_pointer_descriptor_locator locator */
  49. /* struct mpeg_metadata_pointer_descriptor_program_number program_number */
  50. /* struct mpeg_metadata_pointer_descriptor_carriage carriage */
  51. /* uint8_t private_data[] */
  52. } __ucsi_packed;
  53. /**
  54. * appid field of a metadata_pointer_descriptor.
  55. */
  56. struct mpeg_metadata_pointer_descriptor_application_format_identifier {
  57. uint32_t id;
  58. } __ucsi_packed;
  59. /**
  60. * formid field of a metadata_pointer_descriptor.
  61. */
  62. struct mpeg_metadata_pointer_descriptor_format_identifier {
  63. uint32_t id;
  64. } __ucsi_packed;
  65. /**
  66. * Flags field of a metadata_pointer_descriptor
  67. */
  68. struct mpeg_metadata_pointer_descriptor_flags {
  69. uint8_t metadata_service_id;
  70. EBIT3(uint8_t metadata_locator_record_flag : 1; ,
  71. uint8_t mpeg_carriage_flags : 2; ,
  72. uint8_t reserved : 5; );
  73. } __ucsi_packed;
  74. /**
  75. * Reference_id field of a metadata_pointer_descriptor.
  76. */
  77. struct mpeg_metadata_pointer_descriptor_locator {
  78. uint8_t metadata_locator_record_length;
  79. /* uint8_t data[] */
  80. } __ucsi_packed;
  81. /**
  82. * program_number field of a metadata_pointer_descriptor.
  83. */
  84. struct mpeg_metadata_pointer_descriptor_program_number {
  85. uint16_t number;
  86. } __ucsi_packed;
  87. /**
  88. * carriage field of a metadata_pointer_descriptor.
  89. */
  90. struct mpeg_metadata_pointer_descriptor_carriage {
  91. uint16_t transport_stream_location;
  92. uint16_t transport_stream_id;
  93. } __ucsi_packed;
  94. /**
  95. * Process an mpeg_metadata_pointer_descriptor.
  96. *
  97. * @param d Generic descriptor.
  98. * @return Pointer to an mpeg_metadata_pointer_descriptor, or NULL on error.
  99. */
  100. static inline struct mpeg_metadata_pointer_descriptor*
  101. mpeg_metadata_pointer_descriptor_codec(struct descriptor* d)
  102. {
  103. uint32_t pos = 2;
  104. uint8_t *buf = (uint8_t*) d;
  105. uint32_t len = d->len + 2;
  106. struct mpeg_metadata_pointer_descriptor_flags *flags;
  107. int id;
  108. if (len < sizeof(struct mpeg_metadata_pointer_descriptor))
  109. return NULL;
  110. bswap16(buf + pos);
  111. id = *((uint16_t*) (buf+pos));
  112. pos += 2;
  113. if (id == 0xffff) {
  114. if (len < (pos+4))
  115. return NULL;
  116. bswap32(buf+pos);
  117. pos += 4;
  118. }
  119. if (len < (pos+1))
  120. return NULL;
  121. id = buf[pos];
  122. pos++;
  123. if (id == 0xff) {
  124. if (len < (pos+4))
  125. return NULL;
  126. bswap32(buf+pos);
  127. pos += 4;
  128. }
  129. if (len < (pos + sizeof(struct mpeg_metadata_pointer_descriptor_flags)))
  130. return NULL;
  131. flags = (struct mpeg_metadata_pointer_descriptor_flags*) (buf+pos);
  132. pos += sizeof(struct mpeg_metadata_pointer_descriptor_flags);
  133. if (flags->metadata_locator_record_flag == 1) {
  134. if (len < (pos+1))
  135. return NULL;
  136. if (len < (pos+1+buf[pos]))
  137. return NULL;
  138. pos += 1 + buf[pos];
  139. }
  140. if (flags->mpeg_carriage_flags < 3) {
  141. if (len < (pos + 2))
  142. return NULL;
  143. bswap16(buf+pos);
  144. pos += 2;
  145. }
  146. if (flags->mpeg_carriage_flags == 1) {
  147. if (len < (pos + 4))
  148. return NULL;
  149. bswap16(buf+pos);
  150. bswap16(buf+pos+2);
  151. pos += 4;
  152. }
  153. if (len < pos)
  154. return NULL;
  155. return (struct mpeg_metadata_pointer_descriptor*) d;
  156. }
  157. /**
  158. * Accessor for pointer to appid field of an mpeg_metadata_pointer_descriptor.
  159. *
  160. * @param d The mpeg_metadata_pointer_descriptor structure.
  161. * @return The pointer, or NULL on error.
  162. */
  163. static inline struct mpeg_metadata_pointer_descriptor_application_format_identifier*
  164. mpeg_metadata_pointer_descriptor_appid(struct mpeg_metadata_pointer_descriptor *d)
  165. {
  166. uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
  167. if (d->metadata_application_format != 0xffff)
  168. return NULL;
  169. return (struct mpeg_metadata_pointer_descriptor_application_format_identifier*) buf;
  170. }
  171. /**
  172. * Accessor for metadata_format field of an mpeg_metadata_pointer_descriptor.
  173. *
  174. * @param d The mpeg_metadata_pointer_descriptor structure.
  175. * @return The pointer, or NULL on error.
  176. */
  177. static inline uint8_t
  178. mpeg_metadata_pointer_descriptor_metadata_format(struct mpeg_metadata_pointer_descriptor *d)
  179. {
  180. uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
  181. if (d->metadata_application_format == 0xffff)
  182. buf+=4;
  183. return *buf;
  184. }
  185. /**
  186. * Accessor for pointer to formid field of an mpeg_metadata_pointer_descriptor.
  187. *
  188. * @param d The mpeg_metadata_pointer_descriptor structure.
  189. * @return The pointer, or NULL on error.
  190. */
  191. static inline struct mpeg_metadata_pointer_descriptor_format_identifier*
  192. mpeg_metadata_pointer_descriptor_formid(struct mpeg_metadata_pointer_descriptor *d)
  193. {
  194. uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
  195. if (d->metadata_application_format == 0xffff)
  196. buf+=4;
  197. if (*buf != 0xff)
  198. return NULL;
  199. return (struct mpeg_metadata_pointer_descriptor_format_identifier*) (buf+1);
  200. }
  201. /**
  202. * Accessor for flags field of an mpeg_metadata_pointer_descriptor.
  203. *
  204. * @param d The mpeg_metadata_pointer_descriptor structure.
  205. * @return Pointer to the field, or NULL on error.
  206. */
  207. static inline struct mpeg_metadata_pointer_descriptor_flags*
  208. mpeg_metadata_pointer_descriptor_flags(struct mpeg_metadata_pointer_descriptor *d)
  209. {
  210. uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
  211. if (d->metadata_application_format == 0xffff)
  212. buf+=4;
  213. if (*buf == 0xff)
  214. buf+=4;
  215. return (struct mpeg_metadata_pointer_descriptor_flags*) buf;
  216. }
  217. /**
  218. * Accessor for locator field of an mpeg_metadata_pointer_descriptor.
  219. *
  220. * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
  221. * @return Pointer to the field, or NULL on error.
  222. */
  223. static inline struct mpeg_metadata_pointer_descriptor_locator*
  224. mpeg_metadata_pointer_descriptor_locator(struct mpeg_metadata_pointer_descriptor_flags *flags)
  225. {
  226. uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
  227. if (flags->metadata_locator_record_flag!=1)
  228. return NULL;
  229. return (struct mpeg_metadata_pointer_descriptor_locator *) buf;
  230. }
  231. /**
  232. * Accessor for data field of an mpeg_metadata_pointer_descriptor_locator.
  233. *
  234. * @param d The mpeg_metadata_pointer_descriptor_locator structure.
  235. * @return Pointer to the field.
  236. */
  237. static inline uint8_t*
  238. mpeg_metadata_pointer_descriptor_locator_data(struct mpeg_metadata_pointer_descriptor_locator *d)
  239. {
  240. return (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor_locator);
  241. }
  242. /**
  243. * Accessor for program_number field of an mpeg_metadata_pointer_descriptor.
  244. *
  245. * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
  246. * @return Pointer to the field, or NULL on error.
  247. */
  248. static inline struct mpeg_metadata_pointer_descriptor_program_number*
  249. mpeg_metadata_pointer_descriptor_program_number(struct mpeg_metadata_pointer_descriptor_flags *flags)
  250. {
  251. uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
  252. if (flags->mpeg_carriage_flags < 3)
  253. return NULL;
  254. if (flags->metadata_locator_record_flag==1)
  255. buf += 1 + buf[1];
  256. return (struct mpeg_metadata_pointer_descriptor_program_number*) buf;
  257. }
  258. /**
  259. * Accessor for carriage field of an mpeg_metadata_pointer_descriptor.
  260. *
  261. * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
  262. * @return Pointer to the field, or NULL on error.
  263. */
  264. static inline struct mpeg_metadata_pointer_descriptor_carriage*
  265. mpeg_metadata_pointer_descriptor_carriage(struct mpeg_metadata_pointer_descriptor_flags *flags)
  266. {
  267. uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
  268. if (flags->mpeg_carriage_flags != 1)
  269. return NULL;
  270. if (flags->metadata_locator_record_flag==1)
  271. buf += 1 + buf[1];
  272. if (flags->mpeg_carriage_flags < 3)
  273. buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number);
  274. return (struct mpeg_metadata_pointer_descriptor_carriage *) buf;
  275. }
  276. /**
  277. * Accessor for private_data field of an mpeg_metadata_pointer_descriptor.
  278. *
  279. * @param d The mpeg_metadata_pointer_descriptor structure.
  280. * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
  281. * @param length Where the number of bytes in the field should be stored.
  282. * @return Pointer to the field.
  283. */
  284. static inline uint8_t*
  285. mpeg_metadata_pointer_descriptor_private_data(struct mpeg_metadata_pointer_descriptor *d,
  286. struct mpeg_metadata_pointer_descriptor_flags *flags,
  287. int *length)
  288. {
  289. uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
  290. uint8_t *end = (uint8_t*) d + d->d.len + 2;
  291. if (flags->metadata_locator_record_flag==1)
  292. buf += 1 + buf[1];
  293. if (flags->mpeg_carriage_flags < 3)
  294. buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number);
  295. if (flags->mpeg_carriage_flags != 1)
  296. buf += sizeof(struct mpeg_metadata_pointer_descriptor_carriage);
  297. *length = end - buf;
  298. return buf;
  299. }
  300. #ifdef __cplusplus
  301. }
  302. #endif
  303. #endif