atsc_text.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. /*
  2. * section and descriptor parser
  3. *
  4. * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  19. */
  20. #include <stdint.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <errno.h>
  24. #include "libucsi/endianops.h"
  25. #include "libucsi/atsc/types.h"
  26. #define HUFFTREE_LITERAL_MASK 0x80
  27. #define HUFFSTRING_END 0x00
  28. #define HUFFSTRING_ESCAPE 0x1b
  29. #define DEST_ALLOC_DELTA 20
  30. struct hufftree_entry {
  31. uint8_t left_idx;
  32. uint8_t right_idx;
  33. } __ucsi_packed;
  34. struct huffbuff {
  35. uint8_t *buf;
  36. uint32_t buf_len;
  37. uint32_t cur_byte;
  38. uint8_t cur_bit;
  39. };
  40. static struct hufftree_entry program_description_hufftree[][128] = {
  41. { {0x14, 0x15}, {0x9b, 0xd6}, {0xc9, 0xcf}, {0xd7, 0xc7}, {0x01, 0xa2},
  42. {0xce, 0xcb}, {0x02, 0x03}, {0xc5, 0xcc}, {0xc6, 0xc8}, {0x04, 0xc4},
  43. {0x05, 0xc2}, {0x06, 0xc3}, {0xd2, 0x07}, {0xd3, 0x08}, {0xca, 0xd4},
  44. {0x09, 0xcd}, {0xd0, 0x0a}, {0xc1, 0x0b}, {0x0c, 0x0d}, {0x0e, 0x0f},
  45. {0x10, 0x11}, {0x12, 0x13}, },
  46. { {0x9b, 0x9b}, },
  47. { {0x9b, 0x9b}, },
  48. { {0x9b, 0x9b}, },
  49. { {0x9b, 0x9b}, },
  50. { {0x9b, 0x9b}, },
  51. { {0x9b, 0x9b}, },
  52. { {0x9b, 0x9b}, },
  53. { {0x9b, 0x9b}, },
  54. { {0x9b, 0x9b}, },
  55. { {0x9b, 0x9b}, },
  56. { {0x9b, 0x9b}, },
  57. { {0x9b, 0x9b}, },
  58. { {0x9b, 0x9b}, },
  59. { {0x9b, 0x9b}, },
  60. { {0x9b, 0x9b}, },
  61. { {0x9b, 0x9b}, },
  62. { {0x9b, 0x9b}, },
  63. { {0x9b, 0x9b}, },
  64. { {0x9b, 0x9b}, },
  65. { {0x9b, 0x9b}, },
  66. { {0x9b, 0x9b}, },
  67. { {0x9b, 0x9b}, },
  68. { {0x9b, 0x9b}, },
  69. { {0x9b, 0x9b}, },
  70. { {0x9b, 0x9b}, },
  71. { {0x9b, 0x9b}, },
  72. { {0x9b, 0x9b}, },
  73. { {0x9b, 0x9b}, },
  74. { {0x9b, 0x9b}, },
  75. { {0x9b, 0x9b}, },
  76. { {0x9b, 0x9b}, },
  77. { {0x38, 0x39}, {0xad, 0xaf}, {0xb7, 0xda}, {0xa8, 0xb3}, {0xb5, 0x01},
  78. {0x02, 0x9b}, {0xb4, 0xf1}, {0xa2, 0xd5}, {0xd6, 0xd9}, {0x03, 0x04},
  79. {0x05, 0xcf}, {0x06, 0xc9}, {0xf9, 0xea}, {0xeb, 0xf5}, {0xf6, 0x07},
  80. {0x08, 0x09}, {0xb2, 0xc5}, {0xc6, 0xb1}, {0x0a, 0xee}, {0xcb, 0x0b},
  81. {0xd4, 0x0c}, {0xc4, 0xc8}, {0xd2, 0x0d}, {0x0e, 0x0f}, {0xc7, 0xca},
  82. {0xce, 0xd0}, {0xd7, 0x10}, {0xc2, 0x11}, {0xcc, 0xec}, {0xe5, 0xe7},
  83. {0x12, 0xcd}, {0x13, 0x14}, {0xc3, 0x15}, {0x16, 0x17}, {0xed, 0x18},
  84. {0x19, 0xf2}, {0x1a, 0xd3}, {0x1b, 0x1c}, {0xe4, 0x1d}, {0xc1, 0xe3},
  85. {0x1e, 0xe9}, {0xf0, 0xe2}, {0xf7, 0x1f}, {0xf3, 0xe6}, {0x20, 0x21},
  86. {0x22, 0xe8}, {0xef, 0x23}, {0x24, 0x25}, {0x26, 0x27}, {0x28, 0x29},
  87. {0x2a, 0xf4}, {0x2b, 0x2c}, {0x2d, 0x2e}, {0x2f, 0xe1}, {0x30, 0x31},
  88. {0x32, 0x33}, {0x34, 0x35}, {0x36, 0x37}, },
  89. { {0x9b, 0x9b}, },
  90. { {0x03, 0x04}, {0x80, 0xae}, {0xc8, 0xd4}, {0x01, 0x02}, {0x9b, 0xa0}, },
  91. { {0x9b, 0x9b}, },
  92. { {0x9b, 0x9b}, },
  93. { {0x9b, 0x9b}, },
  94. { {0x9b, 0x9b}, },
  95. { {0x02, 0xf3}, {0xa0, 0xf4}, {0x9b, 0x01}, },
  96. { {0x9b, 0x9b}, },
  97. { {0xac, 0x9b}, },
  98. { {0x9b, 0x9b}, },
  99. { {0x9b, 0x9b}, },
  100. { {0x01, 0xa0}, {0x9b, 0xa2}, },
  101. { {0x07, 0x08}, {0xe2, 0xe4}, {0xe5, 0xe6}, {0xa0, 0xf2}, {0xe1, 0x01},
  102. {0x02, 0xf3}, {0xe3, 0x03}, {0x04, 0x05}, {0x9b, 0x06}, },
  103. { {0x04, 0x80}, {0xca, 0xd3}, {0xa2, 0x01}, {0x9b, 0x02}, {0x03, 0xa0}, },
  104. { {0x9b, 0xa0}, },
  105. { {0x03, 0x04}, {0x9b, 0xb7}, {0xf4, 0xa0}, {0xb0, 0xf3}, {0x01, 0x02}, },
  106. { {0xb9, 0x02}, {0xb8, 0x9b}, {0xa0, 0x01}, },
  107. { {0xae, 0x02}, {0xb6, 0x9b}, {0x01, 0xa0}, },
  108. { {0xa0, 0x01}, {0x9b, 0xb0}, },
  109. { {0xae, 0x01}, {0x9b, 0xa0}, },
  110. { {0xae, 0x01}, {0xa0, 0x9b}, },
  111. { {0x9b, 0x9b}, },
  112. { {0x9b, 0x01}, {0xac, 0xae}, },
  113. { {0x9b, 0x9b}, },
  114. { {0x02, 0x03}, {0x9b, 0xa0}, {0xb5, 0xb6}, {0xb8, 0x01}, },
  115. { {0x9b, 0xa0}, },
  116. { {0x9b, 0xa0}, },
  117. { {0x9b, 0x9b}, },
  118. { {0x9b, 0x9b}, },
  119. { {0x9b, 0x9b}, },
  120. { {0x9b, 0xa0}, },
  121. { {0x9b, 0x9b}, },
  122. { {0x08, 0x09}, {0xe6, 0xf5}, {0xf3, 0xf4}, {0x9b, 0xe4}, {0x01, 0xed},
  123. {0x02, 0x03}, {0x04, 0xf2}, {0x05, 0x06}, {0xec, 0xee}, {0x07, 0xa0}, },
  124. { {0x05, 0x06}, {0x9b, 0xec}, {0xf5, 0x01}, {0x02, 0xe1}, {0xef, 0xe5},
  125. {0xe9, 0xf2}, {0x03, 0x04}, },
  126. { {0x06, 0x07}, {0x9b, 0xe9}, {0xf9, 0xf2}, {0xf5, 0x01}, {0x02, 0x03},
  127. {0xec, 0xef}, {0xe1, 0x04}, {0xe8, 0x05}, },
  128. { {0x05, 0x06}, {0xf9, 0xf2}, {0xf5, 0x9b}, {0xe5, 0xef}, {0x01, 0x02},
  129. {0xe9, 0xe1}, {0x03, 0x04}, },
  130. { {0x06, 0x07}, {0xe1, 0xe9}, {0xee, 0xf6}, {0xe4, 0xec}, {0xf3, 0x01},
  131. {0x02, 0xf2}, {0x03, 0x04}, {0x9b, 0x05}, },
  132. { {0x02, 0x03}, {0xe5, 0xec}, {0x9b, 0xef}, {0x01, 0xf2}, },
  133. { {0x05, 0x06}, {0xf5, 0xef}, {0x9b, 0xec}, {0xe9, 0x01}, {0xe1, 0xf2},
  134. {0x02, 0xe5}, {0x03, 0x04}, },
  135. { {0x03, 0x04}, {0x9b, 0xe5}, {0xe9, 0xf5}, {0xe1, 0x01}, {0xef, 0x02}, },
  136. { {0x04, 0x05}, {0xa0, 0xc9}, {0xf3, 0x9b}, {0xae, 0xf2}, {0x01, 0x02},
  137. {0x03, 0xee}, },
  138. { {0xef, 0x05}, {0x9b, 0xae}, {0xe9, 0xe5}, {0x01, 0xf5}, {0x02, 0xe1},
  139. {0x03, 0x04}, },
  140. { {0xe5, 0x03}, {0xe1, 0xe9}, {0xf2, 0x9b}, {0x01, 0x02}, },
  141. { {0x03, 0x04}, {0x9b, 0xe9}, {0xf5, 0x01}, {0xe5, 0x02}, {0xef, 0xe1}, },
  142. { {0xe1, 0x05}, {0x9b, 0xe3}, {0xef, 0x01}, {0xf5, 0xe5}, {0x02, 0x03},
  143. {0xe9, 0x04}, },
  144. { {0xe5, 0x03}, {0x9b, 0xe9}, {0x01, 0xe1}, {0xef, 0x02}, },
  145. { {0x03, 0x04}, {0xa7, 0xee}, {0xec, 0xf2}, {0xf3, 0x01}, {0x9b, 0x02}, },
  146. { {0xe1, 0x06}, {0x9b, 0xe8}, {0xe9, 0x01}, {0xf2, 0xec}, {0x02, 0xef},
  147. {0x03, 0xe5}, {0x04, 0x05}, },
  148. { {0x9b, 0x9b}, },
  149. { {0x03, 0x04}, {0x9b, 0xae}, {0x01, 0xe9}, {0x02, 0xe1}, {0xe5, 0xef}, },
  150. { {0x09, 0x0a}, {0xf6, 0xf9}, {0x01, 0xae}, {0xe3, 0xe9}, {0xf5, 0x9b},
  151. {0xe5, 0xef}, {0x02, 0x03}, {0xe1, 0x04}, {0xe8, 0x05}, {0x06, 0xf4},
  152. {0x07, 0x08}, },
  153. { {0xe8, 0x07}, {0xe5, 0xf7}, {0xd6, 0xe1}, {0x9b, 0xe9}, {0xf2, 0x01},
  154. {0x02, 0x03}, {0x04, 0xef}, {0x05, 0x06}, },
  155. { {0xae, 0x01}, {0x9b, 0xee}, },
  156. { {0xe9, 0x02}, {0xe5, 0x9b}, {0xa0, 0x01}, },
  157. { {0x03, 0x04}, {0x9b, 0xe8}, {0xe5, 0xe1}, {0xef, 0x01}, {0xe9, 0x02}, },
  158. { {0x9b, 0x9b}, },
  159. { {0x9b, 0xef}, },
  160. { {0x9b, 0x9b}, },
  161. { {0x9b, 0x9b}, },
  162. { {0x9b, 0x9b}, },
  163. { {0x9b, 0x9b}, },
  164. { {0x9b, 0x9b}, },
  165. { {0x9b, 0x9b}, },
  166. { {0x9b, 0x9b}, },
  167. { {0x18, 0x19}, {0xe8, 0xef}, {0xf8, 0x9b}, {0xa7, 0xf7}, {0xfa, 0x01},
  168. {0x02, 0x03}, {0x04, 0xe5}, {0xae, 0x05}, {0xe6, 0xe2}, {0x06, 0xf6},
  169. {0xeb, 0xf5}, {0xe9, 0x07}, {0xf0, 0xf9}, {0xe7, 0x08}, {0x09, 0xe4},
  170. {0x0a, 0xe3}, {0x0b, 0xed}, {0x0c, 0xf3}, {0x0d, 0x0e}, {0x0f, 0xec},
  171. {0x10, 0xf4}, {0x11, 0x12}, {0xf2, 0xa0}, {0x13, 0x14}, {0x15, 0xee},
  172. {0x16, 0x17}, },
  173. { {0x0b, 0x0c}, {0xe4, 0xf3}, {0x9b, 0xae}, {0xe2, 0x01}, {0x02, 0x03},
  174. {0xec, 0xa0}, {0x04, 0xe9}, {0xf2, 0xf5}, {0x05, 0xf9}, {0xe1, 0x06},
  175. {0xef, 0x07}, {0xe5, 0x08}, {0x09, 0x0a}, },
  176. { {0x0f, 0x10}, {0xf1, 0xae}, {0xc4, 0xf9}, {0xac, 0x01}, {0xe3, 0x02},
  177. {0x9b, 0xf2}, {0x03, 0x04}, {0xa0, 0xec}, {0xf5, 0x05}, {0x06, 0xe9},
  178. {0x07, 0xeb}, {0x08, 0xf4}, {0x09, 0xe5}, {0x0a, 0xef}, {0xe1, 0xe8},
  179. {0x0b, 0x0c}, {0x0d, 0x0e}, },
  180. { {0x13, 0x14}, {0xa7, 0xbb}, {0xe6, 0xed}, {0xf7, 0xe7}, {0xf6, 0x01},
  181. {0x02, 0x9b}, {0xee, 0x03}, {0x04, 0xec}, {0x05, 0xf5}, {0x06, 0xac},
  182. {0xe4, 0xf9}, {0xf2, 0x07}, {0x08, 0x09}, {0xae, 0x0a}, {0xef, 0x0b},
  183. {0xe1, 0xf3}, {0x0c, 0xe9}, {0x0d, 0x0e}, {0x0f, 0x10}, {0xe5, 0x11},
  184. {0x12, 0xa0}, },
  185. { {0x1d, 0x1e}, {0xa9, 0xe8}, {0xf5, 0x9b}, {0x01, 0xad}, {0xbb, 0xeb},
  186. {0xfa, 0x02}, {0xa7, 0xe6}, {0xe2, 0xe7}, {0x03, 0x04}, {0x05, 0x06},
  187. {0xe9, 0xf8}, {0x07, 0xac}, {0xef, 0xf0}, {0x08, 0xed}, {0xf6, 0xf9},
  188. {0x09, 0xf7}, {0x0a, 0x0b}, {0xae, 0x0c}, {0xe3, 0x0d}, {0xe5, 0xf4},
  189. {0x0e, 0x0f}, {0xe4, 0x10}, {0xec, 0x11}, {0xe1, 0x12}, {0x13, 0x14},
  190. {0x15, 0x16}, {0xee, 0xf3}, {0x17, 0x18}, {0xf2, 0xa0}, {0x19, 0x1a},
  191. {0x1b, 0x1c}, },
  192. { {0x09, 0x0a}, {0xae, 0x9b}, {0xec, 0x01}, {0xf5, 0x02}, {0xf4, 0xe6},
  193. {0x03, 0xe1}, {0xe5, 0xe9}, {0x04, 0xf2}, {0xef, 0x05}, {0x06, 0x07},
  194. {0xa0, 0x08}, },
  195. { {0x0e, 0x0f}, {0xad, 0xe7}, {0x9b, 0xa7}, {0xf9, 0x01}, {0xec, 0x02},
  196. {0xac, 0xf2}, {0x03, 0xae}, {0xf3, 0xf5}, {0x04, 0x05}, {0xef, 0x06},
  197. {0x07, 0xe9}, {0xe1, 0x08}, {0x09, 0xe8}, {0x0a, 0x0b}, {0xe5, 0x0c},
  198. {0xa0, 0x0d}, },
  199. { {0x0d, 0x0e}, {0xa7, 0xac}, {0xf3, 0xad}, {0x01, 0x02}, {0x9b, 0xf9},
  200. {0xf5, 0xae}, {0x03, 0xee}, {0x04, 0xf2}, {0x05, 0x06}, {0xf4, 0x07},
  201. {0x08, 0x09}, {0xef, 0xe1}, {0xa0, 0x0a}, {0xe9, 0x0b}, {0x0c, 0xe5}, },
  202. { {0x14, 0x15}, {0xac, 0xe2}, {0xf8, 0x9b}, {0xae, 0xfa}, {0x01, 0xeb},
  203. {0x02, 0xa0}, {0x03, 0x04}, {0xf0, 0x05}, {0x06, 0xe6}, {0xf6, 0x07},
  204. {0xe4, 0xed}, {0xe7, 0x08}, {0xe1, 0xef}, {0xf2, 0x09}, {0x0a, 0x0b},
  205. {0xec, 0x0c}, {0xe5, 0xe3}, {0x0d, 0xf4}, {0x0e, 0xf3}, {0x0f, 0x10},
  206. {0x11, 0xee}, {0x12, 0x13}, },
  207. { {0x03, 0xef}, {0x9b, 0xe1}, {0xe5, 0xf5}, {0x01, 0x02}, },
  208. { {0x08, 0x09}, {0xec, 0xf9}, {0xa7, 0xee}, {0x01, 0xac}, {0x9b, 0xae},
  209. {0x02, 0x03}, {0x04, 0xf3}, {0x05, 0xe9}, {0x06, 0xa0}, {0x07, 0xe5}, },
  210. { {0x16, 0x17}, {0xa7, 0xad}, {0xee, 0xe3}, {0xeb, 0xf2}, {0x9b, 0xe2},
  211. {0x01, 0x02}, {0xf5, 0x03}, {0xf4, 0xac}, {0x04, 0x05}, {0xe6, 0xed},
  212. {0xf6, 0x06}, {0xae, 0xf0}, {0x07, 0x08}, {0xf3, 0x09}, {0x0a, 0xe4},
  213. {0x0b, 0x0c}, {0xf9, 0x0d}, {0xef, 0x0e}, {0xe1, 0x0f}, {0x10, 0xe9},
  214. {0xec, 0x11}, {0xa0, 0xe5}, {0x12, 0x13}, {0x14, 0x15}, },
  215. { {0x0c, 0x0d}, {0xa7, 0xbb}, {0x9b, 0x01}, {0xf9, 0xae}, {0xe2, 0x02},
  216. {0xed, 0xf3}, {0x03, 0xf5}, {0xef, 0xf0}, {0x04, 0x05}, {0xe9, 0x06},
  217. {0x07, 0x08}, {0x09, 0xa0}, {0xe1, 0xe5}, {0x0a, 0x0b}, },
  218. { {0x19, 0x1a}, {0xad, 0xbb}, {0xe2, 0xea}, {0xed, 0xf2}, {0xfa, 0xe6},
  219. {0xec, 0x01}, {0x02, 0x03}, {0x9b, 0xf5}, {0x04, 0xa7}, {0xf6, 0xf9},
  220. {0x05, 0x06}, {0xeb, 0xef}, {0x07, 0x08}, {0x09, 0x0a}, {0xac, 0x0b},
  221. {0x0c, 0xe3}, {0xae, 0x0d}, {0xee, 0xe9}, {0x0e, 0xe1}, {0x0f, 0xf3},
  222. {0x10, 0x11}, {0xf4, 0x12}, {0xe7, 0xe5}, {0x13, 0x14}, {0xe4, 0x15},
  223. {0x16, 0x17}, {0xa0, 0x18}, },
  224. { {0x1a, 0x1b}, {0xc2, 0x9b}, {0xad, 0xac}, {0xf8, 0x01}, {0xae, 0x02},
  225. {0x03, 0xe5}, {0xe7, 0xe8}, {0xf9, 0xe9}, {0xeb, 0x04}, {0xe3, 0xe1},
  226. {0x05, 0xf6}, {0x06, 0xe4}, {0x07, 0xe2}, {0xf0, 0x08}, {0x09, 0xf3},
  227. {0xf4, 0xf7}, {0xef, 0x0a}, {0x0b, 0x0c}, {0x0d, 0xec}, {0x0e, 0x0f},
  228. {0x10, 0xf5}, {0xed, 0x11}, {0xe6, 0xa0}, {0x12, 0xf2}, {0x13, 0x14},
  229. {0x15, 0xee}, {0x16, 0x17}, {0x18, 0x19}, },
  230. { {0x0e, 0x0f}, {0xad, 0xed}, {0xf9, 0x9b}, {0xae, 0x01}, {0xf3, 0x02},
  231. {0x03, 0xf5}, {0xf4, 0xf0}, {0x04, 0xef}, {0x05, 0xe9}, {0x06, 0xe8},
  232. {0xa0, 0xe1}, {0xec, 0x07}, {0xf2, 0x08}, {0xe5, 0x09}, {0x0a, 0x0b},
  233. {0x0c, 0x0d}, },
  234. { {0x9b, 0xf5}, },
  235. { {0x19, 0x1a}, {0xa9, 0xbb}, {0xf6, 0xe6}, {0x01, 0x9b}, {0xad, 0xe2},
  236. {0xf0, 0x02}, {0xa7, 0x03}, {0x04, 0x05}, {0xf5, 0xe3}, {0xac, 0xe7},
  237. {0xf2, 0x06}, {0xeb, 0x07}, {0xec, 0xed}, {0xee, 0xf9}, {0x08, 0xae},
  238. {0x09, 0x0a}, {0xe4, 0x0b}, {0x0c, 0xf4}, {0x0d, 0xf3}, {0x0e, 0x0f},
  239. {0x10, 0xe1}, {0xef, 0x11}, {0xe9, 0x12}, {0x13, 0xe5}, {0x14, 0xa0},
  240. {0x15, 0x16}, {0x17, 0x18}, },
  241. { {0xa0, 0x16}, {0xa2, 0xa7}, {0xe2, 0xeb}, {0xed, 0xee}, {0x9b, 0xf7},
  242. {0x01, 0x02}, {0x03, 0xbb}, {0xf9, 0xf0}, {0x04, 0x05}, {0xec, 0x06},
  243. {0x07, 0x08}, {0xf5, 0xe1}, {0x09, 0xac}, {0xe3, 0x0a}, {0xe8, 0x0b},
  244. {0xe9, 0x0c}, {0xef, 0xf3}, {0xae, 0x0d}, {0x0e, 0xe5}, {0x0f, 0x10},
  245. {0x11, 0xf4}, {0x12, 0x13}, {0x14, 0x15}, },
  246. { {0x14, 0x15}, {0xbb, 0xe2}, {0xad, 0xed}, {0x01, 0x9b}, {0xa7, 0xe3},
  247. {0xac, 0xec}, {0xee, 0x02}, {0xf7, 0x03}, {0x04, 0xf9}, {0x05, 0x06},
  248. {0x07, 0x08}, {0xf4, 0xae}, {0xf5, 0x09}, {0x0a, 0xf2}, {0xe1, 0xf3},
  249. {0x0b, 0x0c}, {0x0d, 0xe9}, {0x0e, 0x0f}, {0xef, 0xe5}, {0x10, 0xa0},
  250. {0xe8, 0x11}, {0x12, 0x13}, },
  251. { {0x11, 0x12}, {0xef, 0xf6}, {0x9b, 0xeb}, {0xf9, 0x01}, {0xa0, 0xe2},
  252. {0x02, 0xe1}, {0x03, 0xed}, {0x04, 0xe3}, {0xe9, 0x05}, {0xe4, 0xe5},
  253. {0xe7, 0x06}, {0xec, 0xf0}, {0x07, 0x08}, {0x09, 0x0a}, {0x0b, 0xf3},
  254. {0x0c, 0xf4}, {0xee, 0x0d}, {0xf2, 0x0e}, {0x0f, 0x10}, },
  255. { {0x05, 0xe5}, {0xf3, 0xf9}, {0x9b, 0x01}, {0xef, 0x02}, {0x03, 0xe1},
  256. {0x04, 0xe9}, },
  257. { {0x0a, 0x0b}, {0xae, 0x9b}, {0xec, 0xed}, {0x01, 0x02}, {0xf3, 0xee},
  258. {0xf2, 0x03}, {0xe5, 0x04}, {0xe8, 0xa0}, {0xe1, 0x05}, {0xef, 0x06},
  259. {0x07, 0x08}, {0xe9, 0x09}, },
  260. { {0x05, 0x06}, {0xa0, 0xac}, {0xad, 0xf4}, {0xe9, 0x01}, {0x02, 0xe1},
  261. {0xe5, 0x03}, {0x9b, 0x04}, },
  262. { {0x11, 0xa0}, {0xbf, 0xe1}, {0xe2, 0xe6}, {0xed, 0xe4}, {0xe9, 0xf7},
  263. {0xa7, 0x01}, {0x02, 0xbb}, {0x03, 0x04}, {0xec, 0x05}, {0x9b, 0xee},
  264. {0x06, 0xef}, {0x07, 0xac}, {0xe5, 0xf3}, {0x08, 0x09}, {0x0a, 0xae},
  265. {0x0b, 0x0c}, {0x0d, 0x0e}, {0x0f, 0x10}, },
  266. { {0x06, 0x07}, {0xa0, 0xae}, {0xe1, 0xe5}, {0xec, 0xfa}, {0x9b, 0xef},
  267. {0xe9, 0x01}, {0x02, 0x03}, {0x04, 0x05}, },
  268. { {0x9b, 0x9b}, },
  269. { {0x9b, 0x9b}, },
  270. { {0x9b, 0x9b}, },
  271. { {0x9b, 0x9b}, },
  272. };
  273. static struct hufftree_entry program_title_hufftree[][128] = {
  274. { {0x1b, 0x1c}, {0xb4, 0xa4}, {0xb2, 0xb7}, {0xda, 0x01}, {0xd1, 0x02},
  275. {0x03, 0x9b}, {0x04, 0xd5}, {0xd9, 0x05}, {0xcb, 0xd6}, {0x06, 0xcf},
  276. {0x07, 0x08}, {0xca, 0x09}, {0xc9, 0xc5}, {0xc6, 0x0a}, {0xd2, 0xc4},
  277. {0xc7, 0xcc}, {0xd0, 0xc8}, {0xd7, 0xce}, {0x0b, 0xc1}, {0x0c, 0xc2},
  278. {0xcd, 0xc3}, {0x0d, 0x0e}, {0x0f, 0x10}, {0xd3, 0x11}, {0xd4, 0x12},
  279. {0x13, 0x14}, {0x15, 0x16}, {0x17, 0x18}, {0x19, 0x1a}, },
  280. { {0x9b, 0x9b}, },
  281. { {0x9b, 0x9b}, },
  282. { {0x9b, 0x9b}, },
  283. { {0x9b, 0x9b}, },
  284. { {0x9b, 0x9b}, },
  285. { {0x9b, 0x9b}, },
  286. { {0x9b, 0x9b}, },
  287. { {0x9b, 0x9b}, },
  288. { {0x9b, 0x9b}, },
  289. { {0x9b, 0x9b}, },
  290. { {0x9b, 0x9b}, },
  291. { {0x9b, 0x9b}, },
  292. { {0x9b, 0x9b}, },
  293. { {0x9b, 0x9b}, },
  294. { {0x9b, 0x9b}, },
  295. { {0x9b, 0x9b}, },
  296. { {0x9b, 0x9b}, },
  297. { {0x9b, 0x9b}, },
  298. { {0x9b, 0x9b}, },
  299. { {0x9b, 0x9b}, },
  300. { {0x9b, 0x9b}, },
  301. { {0x9b, 0x9b}, },
  302. { {0x9b, 0x9b}, },
  303. { {0x9b, 0x9b}, },
  304. { {0x9b, 0x9b}, },
  305. { {0x9b, 0x9b}, },
  306. { {0x9b, 0x9b}, },
  307. { {0x9b, 0x9b}, },
  308. { {0x9b, 0x9b}, },
  309. { {0x9b, 0x9b}, },
  310. { {0x9b, 0x9b}, },
  311. { {0x29, 0x2a}, {0xd8, 0xe5}, {0xb9, 0x01}, {0xa7, 0xb1}, {0xec, 0xd1},
  312. {0x02, 0xad}, {0xb2, 0xda}, {0xe3, 0xb3}, {0x03, 0xe4}, {0xe6, 0x04},
  313. {0x9b, 0xe2}, {0x05, 0x06}, {0x07, 0x08}, {0x09, 0xd5}, {0x0a, 0xd6},
  314. {0x0b, 0xd9}, {0x0c, 0xa6}, {0xe9, 0xcb}, {0xc5, 0xcf}, {0x0d, 0x0e},
  315. {0xca, 0xc9}, {0x0f, 0xc7}, {0x10, 0x11}, {0xe1, 0x12}, {0x13, 0xc6},
  316. {0xd2, 0xc8}, {0xce, 0xc1}, {0xc4, 0xd0}, {0xcc, 0x14}, {0x15, 0xef},
  317. {0xc2, 0xd7}, {0x16, 0xcd}, {0x17, 0xf4}, {0xd4, 0x18}, {0x19, 0x1a},
  318. {0xc3, 0xd3}, {0x1b, 0x1c}, {0x1d, 0x1e}, {0x1f, 0x20}, {0x21, 0x22},
  319. {0x23, 0x24}, {0x25, 0x26}, {0x27, 0x28}, },
  320. { {0x01, 0x80}, {0xa0, 0x9b}, },
  321. { {0x9b, 0x9b}, },
  322. { {0x9b, 0x9b}, },
  323. { {0xb1, 0x9b}, },
  324. { {0x9b, 0x9b}, },
  325. { {0x9b, 0xa0}, },
  326. { {0x04, 0xf3}, {0xe4, 0xb9}, {0x01, 0xf4}, {0xa0, 0x9b}, {0x02, 0x03}, },
  327. { {0x9b, 0x9b}, },
  328. { {0x9b, 0x9b}, },
  329. { {0x01, 0x02}, {0x9b, 0xc1}, {0xc8, 0xd3}, },
  330. { {0x9b, 0x9b}, },
  331. { {0x9b, 0xa0}, },
  332. { {0x07, 0x08}, {0xb1, 0xd2}, {0xd3, 0xd4}, {0xd5, 0xad}, {0xcd, 0xc1},
  333. {0x01, 0x02}, {0x03, 0xa0}, {0x04, 0x9b}, {0x05, 0x06}, },
  334. { {0xa0, 0x05}, {0xc9, 0xd7}, {0xd3, 0x01}, {0x02, 0x9b}, {0xae, 0x80},
  335. {0x03, 0x04}, },
  336. { {0x9b, 0x9b}, },
  337. { {0x02, 0x03}, {0xad, 0x9b}, {0x01, 0x80}, {0xa0, 0xb0}, },
  338. { {0x04, 0x05}, {0x80, 0x9b}, {0xb1, 0xb2}, {0xa0, 0xb0}, {0xb9, 0x01},
  339. {0x02, 0x03}, },
  340. { {0x02, 0x03}, {0xb1, 0xba}, {0x01, 0xb0}, {0x9b, 0x80}, },
  341. { {0x80, 0x01}, {0xb0, 0x9b}, },
  342. { {0x9b, 0xb8}, },
  343. { {0x9b, 0x9b}, },
  344. { {0x9b, 0x9b}, },
  345. { {0x9b, 0xb0}, },
  346. { {0x9b, 0xa0}, },
  347. { {0x02, 0x03}, {0xb1, 0xb3}, {0xb9, 0xb0}, {0x01, 0x9b}, },
  348. { {0x9b, 0xa0}, },
  349. { {0x9b, 0x9b}, },
  350. { {0x9b, 0x9b}, },
  351. { {0x9b, 0x9b}, },
  352. { {0x9b, 0x9b}, },
  353. { {0x9b, 0x80}, },
  354. { {0x9b, 0x9b}, },
  355. { {0x13, 0x14}, {0xaa, 0xad}, {0xae, 0xf6}, {0xe7, 0xf4}, {0xe2, 0xe9},
  356. {0x01, 0x02}, {0xc2, 0xf0}, {0x9b, 0xf3}, {0xe3, 0xe6}, {0xf7, 0x03},
  357. {0xf5, 0x04}, {0x05, 0x06}, {0xf2, 0x07}, {0x08, 0x09}, {0x0a, 0x0b},
  358. {0x0c, 0xe4}, {0xa0, 0x0d}, {0xec, 0xee}, {0x0e, 0xed}, {0x0f, 0x10},
  359. {0x11, 0x12}, },
  360. { {0x08, 0x09}, {0xc1, 0xd3}, {0x9b, 0x01}, {0xc3, 0x02}, {0xe9, 0xec},
  361. {0x03, 0xf2}, {0xf5, 0x04}, {0xef, 0xe1}, {0x05, 0xe5}, {0x06, 0x07}, },
  362. { {0x0b, 0x0c}, {0xc1, 0xf9}, {0x01, 0xc2}, {0xcf, 0xe5}, {0xf5, 0x9b},
  363. {0xe9, 0x02}, {0xa0, 0x03}, {0x04, 0x05}, {0xf2, 0x06}, {0xec, 0x07},
  364. {0xe1, 0x08}, {0x09, 0xe8}, {0x0a, 0xef}, },
  365. { {0x05, 0x06}, {0xf9, 0x9b}, {0x01, 0xf5}, {0x02, 0xf2}, {0xe9, 0xe5},
  366. {0xef, 0x03}, {0xe1, 0x04}, },
  367. { {0x0a, 0x0b}, {0xf1, 0xf5}, {0xf3, 0x01}, {0xed, 0xf9}, {0xc3, 0x02},
  368. {0xec, 0xee}, {0xe4, 0xf8}, {0x03, 0x9b}, {0xf6, 0x04}, {0x05, 0xe1},
  369. {0x06, 0x07}, {0x08, 0x09}, },
  370. { {0x07, 0x08}, {0xa0, 0x9b}, {0xcc, 0x01}, {0xe5, 0x02}, {0xec, 0xf5},
  371. {0xef, 0x03}, {0xe9, 0xf2}, {0x04, 0x05}, {0xe1, 0x06}, },
  372. { {0x09, 0x0a}, {0xae, 0xec}, {0xf9, 0xc1}, {0xe8, 0x01}, {0x9b, 0x02},
  373. {0x03, 0x04}, {0xe1, 0xf5}, {0xe9, 0x05}, {0xe5, 0x06}, {0xf2, 0xef},
  374. {0x07, 0x08}, },
  375. { {0xef, 0x05}, {0x80, 0x9b}, {0xf5, 0x01}, {0x02, 0xe9}, {0xe1, 0x03},
  376. {0xe5, 0x04}, },
  377. { {0xee, 0x0b}, {0xba, 0xd4}, {0xae, 0xf2}, {0xe3, 0x01}, {0xa0, 0x02},
  378. {0x80, 0x9b}, {0xed, 0x03}, {0xc9, 0xf3}, {0xf4, 0x04}, {0x05, 0x06},
  379. {0x07, 0x08}, {0x09, 0x0a}, },
  380. { {0x02, 0x03}, {0x9b, 0xf5}, {0x01, 0xe1}, {0xef, 0xe5}, },
  381. { {0x05, 0xe9}, {0xe1, 0xef}, {0xf5, 0xee}, {0x9b, 0xe5}, {0x01, 0x02},
  382. {0x03, 0x04}, },
  383. { {0x04, 0x05}, {0xa0, 0x9b}, {0x01, 0xf5}, {0x02, 0xe5}, {0xef, 0x03},
  384. {0xe1, 0xe9}, },
  385. { {0x08, 0x09}, {0xaa, 0xd4}, {0x01, 0x9b}, {0xe3, 0x02}, {0xf2, 0x03},
  386. {0xe5, 0x04}, {0xf5, 0xf9}, {0xe9, 0x05}, {0xef, 0x06}, {0x07, 0xe1}, },
  387. { {0xe5, 0x08}, {0xce, 0xa0}, {0xc6, 0xf5}, {0x01, 0x02}, {0x9b, 0xc2},
  388. {0x03, 0xe1}, {0x04, 0xef}, {0x05, 0xe9}, {0x06, 0x07}, },
  389. { {0x09, 0x0a}, {0xe4, 0xf3}, {0xe6, 0xf6}, {0xf7, 0xf0}, {0xf2, 0x01},
  390. {0xec, 0x02}, {0x03, 0xa0}, {0x9b, 0x04}, {0x05, 0xf5}, {0x06, 0x07},
  391. {0xee, 0x08}, },
  392. { {0x0b, 0x0c}, {0xa0, 0xf3}, {0xf9, 0xae}, {0xd2, 0xc7}, {0x01, 0x9b},
  393. {0x02, 0xf5}, {0x03, 0x04}, {0x05, 0xe9}, {0xec, 0x06}, {0xe5, 0x07},
  394. {0xef, 0x08}, {0xe1, 0x09}, {0xf2, 0x0a}, },
  395. { {0x01, 0xf5}, {0x9b, 0xd6}, },
  396. { {0x04, 0x05}, {0xe8, 0x9b}, {0x01, 0xf5}, {0x02, 0xe1}, {0xe9, 0xef},
  397. {0x03, 0xe5}, },
  398. { {0x10, 0x11}, {0xaa, 0xec}, {0xf1, 0xae}, {0xa0, 0xf7}, {0xed, 0xee},
  399. {0x01, 0x02}, {0x9b, 0xeb}, {0x03, 0x04}, {0x05, 0x06}, {0xe3, 0x07},
  400. {0xef, 0x08}, {0xe9, 0xf5}, {0x09, 0xe1}, {0xe5, 0xf0}, {0xe8, 0x0a},
  401. {0x0b, 0x0c}, {0x0d, 0xf4}, {0x0e, 0x0f}, },
  402. { {0xe8, 0x0a}, {0xad, 0xce}, {0x9b, 0x01}, {0xd6, 0x02}, {0xf5, 0xf7},
  403. {0x03, 0x04}, {0xe1, 0xe5}, {0xe9, 0x05}, {0xf2, 0x06}, {0xef, 0x07},
  404. {0x08, 0x09}, },
  405. { {0xee, 0x03}, {0xec, 0xae}, {0x01, 0x9b}, {0x02, 0xf0}, },
  406. { {0x06, 0xe9}, {0xa0, 0xc3}, {0xef, 0x9b}, {0xe5, 0x01}, {0x80, 0x02},
  407. {0x03, 0xe1}, {0x04, 0x05}, },
  408. { {0x06, 0x07}, {0xc6, 0xd7}, {0x01, 0x9b}, {0xf2, 0x02}, {0x03, 0xe8},
  409. {0xe5, 0xe1}, {0x04, 0xe9}, {0xef, 0x05}, },
  410. { {0x9b, 0x9b}, },
  411. { {0x02, 0xef}, {0xe1, 0x9b}, {0x01, 0xe5}, },
  412. { {0x01, 0xef}, {0x9b, 0xe1}, },
  413. { {0x9b, 0x9b}, },
  414. { {0x9b, 0x9b}, },
  415. { {0x9b, 0x9b}, },
  416. { {0x9b, 0x9b}, },
  417. { {0x9b, 0x9b}, },
  418. { {0x9b, 0x9b}, },
  419. { {0x19, 0x1a}, {0x9b, 0xba}, {0xe5, 0xea}, {0xf8, 0x01}, {0x02, 0xe6},
  420. {0xa7, 0x03}, {0xfa, 0xe8}, {0x04, 0xf7}, {0x05, 0xf5}, {0xe2, 0x06},
  421. {0xeb, 0x07}, {0xf0, 0x08}, {0x80, 0xf6}, {0xe7, 0x09}, {0xe4, 0x0a},
  422. {0xa0, 0xe9}, {0x0b, 0xe3}, {0xf9, 0x0c}, {0x0d, 0xed}, {0x0e, 0x0f},
  423. {0xf3, 0x10}, {0x11, 0xec}, {0x12, 0xf4}, {0xf2, 0x13}, {0xee, 0x14},
  424. {0x15, 0x16}, {0x17, 0x18}, },
  425. { {0x0a, 0x0b}, {0xf3, 0x9b}, {0xf5, 0xe2}, {0x01, 0x80}, {0xa0, 0x02},
  426. {0xe5, 0xf2}, {0xe9, 0x03}, {0xec, 0x04}, {0xf9, 0x05}, {0xef, 0x06},
  427. {0xe1, 0x07}, {0x08, 0x09}, },
  428. { {0x10, 0x11}, {0xc3, 0xcc}, {0xc7, 0x9b}, {0xe3, 0x01}, {0x80, 0xec},
  429. {0xf9, 0x02}, {0xf3, 0x03}, {0xf5, 0x04}, {0x05, 0xf2}, {0x06, 0xe9},
  430. {0xa0, 0x07}, {0x08, 0xef}, {0xf4, 0x09}, {0x0a, 0xe1}, {0x0b, 0xe8},
  431. {0xeb, 0xe5}, {0x0c, 0x0d}, {0x0e, 0x0f}, },
  432. { {0x0e, 0x0f}, {0xae, 0xf5}, {0xf7, 0x01}, {0xec, 0x02}, {0xe4, 0xe7},
  433. {0xf2, 0x03}, {0x9b, 0xef}, {0x04, 0xf6}, {0x05, 0x06}, {0xf9, 0xf3},
  434. {0x07, 0xe9}, {0xe1, 0x08}, {0x09, 0x80}, {0x0a, 0x0b}, {0xe5, 0x0c},
  435. {0x0d, 0xa0}, },
  436. { {0x1e, 0x1f}, {0x9b, 0xa1}, {0xad, 0xe8}, {0xea, 0xf1}, {0xf5, 0xfa},
  437. {0x01, 0x02}, {0x03, 0x04}, {0xba, 0xf8}, {0xa7, 0xe2}, {0xe9, 0x05},
  438. {0x06, 0x07}, {0xe6, 0xed}, {0xe7, 0xeb}, {0x08, 0x09}, {0xf6, 0xf0},
  439. {0x0a, 0xef}, {0x0b, 0xe3}, {0x0c, 0x0d}, {0x0e, 0xf9}, {0x0f, 0xe4},
  440. {0xec, 0x10}, {0xe5, 0x11}, {0xf4, 0xf7}, {0x12, 0x13}, {0xe1, 0x14},
  441. {0x15, 0x16}, {0xee, 0xf3}, {0x17, 0x80}, {0x18, 0x19}, {0xf2, 0x1a},
  442. {0x1b, 0xa0}, {0x1c, 0x1d}, },
  443. { {0xa0, 0x0b}, {0xf5, 0x9b}, {0x01, 0xec}, {0xf3, 0xf2}, {0x80, 0xe1},
  444. {0x02, 0x03}, {0xf4, 0xe9}, {0xef, 0xe6}, {0x04, 0x05}, {0x06, 0x07},
  445. {0xe5, 0x08}, {0x09, 0x0a}, },
  446. { {0x0f, 0x10}, {0xba, 0xf9}, {0xa7, 0xf4}, {0x9b, 0x01}, {0xe7, 0xec},
  447. {0x02, 0xee}, {0x03, 0xef}, {0xf5, 0x04}, {0xf2, 0x05}, {0x06, 0xe9},
  448. {0x07, 0xf3}, {0xe1, 0x08}, {0x09, 0x0a}, {0x0b, 0xe5}, {0x80, 0x0c},
  449. {0xe8, 0xa0}, {0x0d, 0x0e}, },
  450. { {0xe5, 0x0d}, {0xe2, 0xf5}, {0xf7, 0x9b}, {0xec, 0x01}, {0xf9, 0xee},
  451. {0x02, 0x03}, {0x04, 0xf2}, {0x05, 0x80}, {0x06, 0xa0}, {0xe1, 0xef},
  452. {0x07, 0xf4}, {0xe9, 0x08}, {0x09, 0x0a}, {0x0b, 0x0c}, },
  453. { {0x15, 0x16}, {0xa1, 0xf8}, {0xe9, 0xeb}, {0x01, 0x80}, {0x9b, 0xfa},
  454. {0xe2, 0x02}, {0x03, 0x04}, {0xa0, 0xf0}, {0x05, 0x06}, {0x07, 0xe1},
  455. {0x08, 0xe6}, {0xf2, 0xed}, {0xf6, 0x09}, {0xe4, 0x0a}, {0xef, 0xf4},
  456. {0xec, 0xf3}, {0xe7, 0xe5}, {0x0b, 0xe3}, {0x0c, 0x0d}, {0x0e, 0x0f},
  457. {0x10, 0x11}, {0x12, 0x13}, {0xee, 0x14}, },
  458. { {0xef, 0x01}, {0x9b, 0xe1}, },
  459. { {0x0b, 0x0c}, {0xd4, 0xef}, {0xe6, 0xec}, {0xf7, 0xe1}, {0x01, 0xba},
  460. {0x02, 0x9b}, {0xf9, 0x03}, {0x04, 0x05}, {0xf3, 0x06}, {0x07, 0x08},
  461. {0xe9, 0xa0}, {0x09, 0x80}, {0xe5, 0x0a}, },
  462. { {0x15, 0x16}, {0xa7, 0xba}, {0xe3, 0xf7}, {0xf2, 0xad}, {0xe2, 0x01},
  463. {0x02, 0x9b}, {0xe6, 0x03}, {0xed, 0xf6}, {0x04, 0xeb}, {0x05, 0xf4},
  464. {0x06, 0x07}, {0x08, 0xf3}, {0x09, 0xf5}, {0x0a, 0xef}, {0x0b, 0x0c},
  465. {0x80, 0xf9}, {0xe1, 0x0d}, {0xe4, 0xe9}, {0xa0, 0x0e}, {0x0f, 0xec},
  466. {0xe5, 0x10}, {0x11, 0x12}, {0x13, 0x14}, },
  467. { {0x0a, 0x0b}, {0xf9, 0x9b}, {0xf5, 0xf3}, {0x01, 0x02}, {0xe2, 0xed},
  468. {0x80, 0x03}, {0xf0, 0xef}, {0x04, 0xa0}, {0x05, 0xe9}, {0x06, 0xe1},
  469. {0x07, 0x08}, {0x09, 0xe5}, },
  470. { {0x18, 0x19}, {0xe2, 0xea}, {0xf2, 0xe8}, {0xec, 0xed}, {0xfa, 0x9b},
  471. {0x01, 0xf5}, {0x02, 0x03}, {0xf6, 0x04}, {0xba, 0xe6}, {0x05, 0x06},
  472. {0xeb, 0xef}, {0x07, 0xa7}, {0xf9, 0x08}, {0x09, 0x0a}, {0x0b, 0xe3},
  473. {0x0c, 0xee}, {0xe1, 0x0d}, {0xf3, 0x0e}, {0xe9, 0x0f}, {0x10, 0xf4},
  474. {0x80, 0xe4}, {0xe5, 0x11}, {0x12, 0xe7}, {0xa0, 0x13}, {0x14, 0x15},
  475. {0x16, 0x17}, },
  476. { {0x1b, 0x1c}, {0xae, 0xfa}, {0xbf, 0x01}, {0xa7, 0x9b}, {0x02, 0xe9},
  477. {0xf8, 0xf9}, {0x03, 0xe5}, {0xe8, 0x04}, {0xe1, 0xeb}, {0x05, 0xe2},
  478. {0x06, 0x07}, {0xe3, 0x08}, {0xe7, 0xf4}, {0x09, 0x80}, {0xf6, 0xf0},
  479. {0x0a, 0xe4}, {0x0b, 0xf3}, {0xf7, 0x0c}, {0x0d, 0xef}, {0xec, 0xa0},
  480. {0x0e, 0x0f}, {0xed, 0xe6}, {0x10, 0xf5}, {0x11, 0x12}, {0x13, 0x14},
  481. {0x15, 0xf2}, {0x16, 0xee}, {0x17, 0x18}, {0x19, 0x1a}, },
  482. { {0x0e, 0x0f}, {0xed, 0xa7}, {0x9b, 0xe4}, {0x01, 0xf9}, {0xf3, 0xf2},
  483. {0xf4, 0x02}, {0xe8, 0x03}, {0xec, 0xf0}, {0x04, 0xe1}, {0xe9, 0x05},
  484. {0x06, 0x80}, {0xa0, 0x07}, {0x08, 0x09}, {0x0a, 0xe5}, {0xef, 0x0b},
  485. {0x0c, 0x0d}, },
  486. { {0x9b, 0xf5}, },
  487. { {0x18, 0x19}, {0xba, 0xac}, {0xf6, 0x9b}, {0xf0, 0xe2}, {0x01, 0xe6},
  488. {0x02, 0xa7}, {0xae, 0xe7}, {0x03, 0xe3}, {0xf5, 0x04}, {0xed, 0x05},
  489. {0x06, 0x07}, {0xeb, 0x08}, {0x09, 0xee}, {0xf2, 0x0a}, {0xe4, 0x0b},
  490. {0xf9, 0xec}, {0x0c, 0x0d}, {0xf4, 0x80}, {0x0e, 0xef}, {0xf3, 0xa0},
  491. {0xe1, 0x0f}, {0xe9, 0x10}, {0x11, 0xe5}, {0x12, 0x13}, {0x14, 0x15},
  492. {0x16, 0x17}, },
  493. { {0x19, 0x1a}, {0xa7, 0xac}, {0xbf, 0xc3}, {0xc8, 0xe4}, {0xe6, 0xed},
  494. {0xf2, 0xae}, {0xec, 0xee}, {0xf9, 0x01}, {0x02, 0x03}, {0x04, 0xba},
  495. {0x05, 0x9b}, {0xf5, 0x06}, {0x07, 0x08}, {0x09, 0xeb}, {0xf0, 0x0a},
  496. {0x0b, 0x0c}, {0xe1, 0xe3}, {0x0d, 0xe8}, {0x0e, 0x0f}, {0xef, 0x10},
  497. {0x11, 0xf3}, {0x12, 0xe9}, {0x13, 0xe5}, {0x14, 0x15}, {0xf4, 0x16},
  498. {0x17, 0xa0}, {0x18, 0x80}, },
  499. { {0x14, 0x15}, {0xba, 0xbf}, {0xe4, 0xf7}, {0x9b, 0xa7}, {0x01, 0xee},
  500. {0x02, 0x03}, {0x04, 0xe3}, {0xe2, 0xed}, {0x05, 0xf9}, {0x06, 0xf4},
  501. {0x07, 0xec}, {0x08, 0xf5}, {0xf2, 0x09}, {0xe1, 0xf3}, {0x0a, 0xef},
  502. {0x0b, 0x0c}, {0x0d, 0xe9}, {0x80, 0xe5}, {0x0e, 0xa0}, {0x0f, 0xe8},
  503. {0x10, 0x11}, {0x12, 0x13}, },
  504. { {0x11, 0x12}, {0xeb, 0xfa}, {0x80, 0xe6}, {0x9b, 0x01}, {0xa0, 0x02},
  505. {0x03, 0xe9}, {0xe1, 0x04}, {0xe4, 0xf0}, {0xed, 0xe2}, {0xe3, 0xe7},
  506. {0xec, 0x05}, {0xe5, 0x06}, {0x07, 0x08}, {0x09, 0xf4}, {0x0a, 0x0b},
  507. {0x0c, 0xf3}, {0xee, 0x0d}, {0x0e, 0xf2}, {0x0f, 0x10}, },
  508. { {0x04, 0xe5}, {0xf3, 0xef}, {0x9b, 0x01}, {0xe1, 0x02}, {0x03, 0xe9}, },
  509. { {0x0b, 0x0c}, {0xa7, 0xe2}, {0xec, 0xe3}, {0xf2, 0x01}, {0x9b, 0x02},
  510. {0x03, 0x04}, {0xe9, 0xef}, {0xee, 0xe5}, {0xe1, 0x80}, {0x05, 0xa0},
  511. {0x06, 0x07}, {0x08, 0x09}, {0xf3, 0x0a}, },
  512. { {0x05, 0x06}, {0x9b, 0xa0}, {0xe1, 0xe5}, {0xe9, 0x01}, {0x80, 0xf0},
  513. {0x02, 0xf4}, {0x03, 0x04}, },
  514. { {0xa0, 0x13}, {0xe3, 0xad}, {0xe4, 0xe9}, {0xee, 0xef}, {0xf0, 0xf4},
  515. {0xf6, 0xa1}, {0xe1, 0xed}, {0x01, 0xe2}, {0x02, 0x03}, {0x04, 0xa7},
  516. {0x05, 0x06}, {0xf7, 0x07}, {0x9b, 0xec}, {0x08, 0xe5}, {0x09, 0x0a},
  517. {0x0b, 0x0c}, {0x0d, 0x0e}, {0xf3, 0x0f}, {0x10, 0x11}, {0x80, 0x12}, },
  518. { {0x05, 0x06}, {0xe5, 0xfa}, {0xa0, 0xf9}, {0x9b, 0x01}, {0x80, 0xe9},
  519. {0x02, 0xe1}, {0x03, 0x04}, },
  520. { {0x9b, 0x9b}, },
  521. { {0x9b, 0x9b}, },
  522. { {0x9b, 0x9b}, },
  523. { {0x9b, 0x9b}, },
  524. };
  525. static inline void huffbuff_init(struct huffbuff *hbuf, uint8_t *buf, uint32_t buf_len)
  526. {
  527. memset(hbuf, 0, sizeof(struct huffbuff));
  528. hbuf->buf = buf;
  529. hbuf->buf_len = buf_len;
  530. }
  531. static inline int huffbuff_bits(struct huffbuff *hbuf, uint8_t nbits)
  532. {
  533. uint8_t result = 0;
  534. if (nbits > 8)
  535. return -1;
  536. while(nbits--) {
  537. if (hbuf->cur_byte >= hbuf->buf_len) {
  538. return -1;
  539. }
  540. result <<= 1;
  541. if (hbuf->buf[hbuf->cur_byte] & (0x80 >> hbuf->cur_bit))
  542. result |= 1;
  543. if (++hbuf->cur_bit > 7) {
  544. hbuf->cur_byte++;
  545. hbuf->cur_bit = 0;
  546. }
  547. }
  548. return result;
  549. }
  550. static inline int append_unicode_char(uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos,
  551. uint32_t c)
  552. {
  553. uint8_t tmp[3];
  554. int tmplen = 0;
  555. // encode the unicode character first of all
  556. if (c < 0x80) {
  557. tmp[0] = c;
  558. tmplen = 1;
  559. } else if (c < 0x800) {
  560. tmp[0] = 0xc0 | ((c >> 6) & 0x1f);
  561. tmp[1] = 0x80 | (c & 0x3f);
  562. tmplen = 2;
  563. } else if (c < 0x10000) {
  564. tmp[0] = 0xe0 | ((c >> 12) & 0x0f);
  565. tmp[1] = 0x80 | ((c >> 6) & 0x3f);
  566. tmp[2] = 0x80 | (c & 0x3f);
  567. tmplen = 3;
  568. } else {
  569. return -1;
  570. }
  571. // do we have enough buffer space?
  572. if ((*destbufpos + tmplen) >= *destbuflen) {
  573. uint8_t *new_dest = realloc(*destbuf, *destbuflen + DEST_ALLOC_DELTA);
  574. if (new_dest == NULL)
  575. return -ENOMEM;
  576. *destbuf = new_dest;
  577. *destbuflen += DEST_ALLOC_DELTA;
  578. }
  579. // copy it into position
  580. memcpy(*destbuf + *destbufpos, tmp, tmplen);
  581. *destbufpos += tmplen;
  582. return 0;
  583. }
  584. static inline int unicode_decode(uint8_t *srcbuf, size_t srcbuflen, int mode,
  585. uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos)
  586. {
  587. size_t i;
  588. uint32_t msb = mode << 8;
  589. for(i=0; i< srcbuflen; i++) {
  590. if (append_unicode_char(destbuf, destbuflen, destbufpos, msb + srcbuf[i]))
  591. return -1;
  592. }
  593. return *destbufpos;
  594. }
  595. static int huffman_decode_uncompressed(struct huffbuff *hbuf,
  596. uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos)
  597. {
  598. int c;
  599. while(hbuf->cur_byte < hbuf->buf_len) {
  600. // get next byte
  601. if ((c = huffbuff_bits(hbuf, 8)) < 0)
  602. return -1;
  603. switch(c) {
  604. case HUFFSTRING_END:
  605. return 0;
  606. case HUFFSTRING_ESCAPE:
  607. return HUFFSTRING_ESCAPE;
  608. default:
  609. if (append_unicode_char(destbuf, destbuflen, destbufpos, c))
  610. return -1;
  611. // if it is 7 bit, we swap back to the compressed context
  612. if ((c & 0x80) == 0)
  613. return c;
  614. // characters following an 8 bit uncompressed char are uncompressed as well
  615. break;
  616. }
  617. }
  618. // ran out of string; pretend we saw an end of string char
  619. return HUFFSTRING_END;
  620. }
  621. static int huffman_decode(uint8_t *src, size_t srclen,
  622. uint8_t **destbuf, size_t *destbuflen, size_t *destbufpos,
  623. struct hufftree_entry hufftree[][128])
  624. {
  625. struct huffbuff hbuf;
  626. int bit;
  627. struct hufftree_entry *tree = hufftree[0];
  628. uint8_t treeidx = 0;
  629. uint8_t treeval;
  630. int tmp;
  631. huffbuff_init(&hbuf, src, srclen);
  632. while(hbuf.cur_byte < hbuf.buf_len) {
  633. // get the next bit
  634. if ((bit = huffbuff_bits(&hbuf, 1)) < 0)
  635. return *destbufpos;
  636. if (!bit) {
  637. treeval = tree[treeidx].left_idx;
  638. } else {
  639. treeval = tree[treeidx].right_idx;
  640. }
  641. if (treeval & HUFFTREE_LITERAL_MASK) {
  642. switch(treeval & ~HUFFTREE_LITERAL_MASK) {
  643. case HUFFSTRING_END:
  644. return 0;
  645. case HUFFSTRING_ESCAPE:
  646. if ((tmp =
  647. huffman_decode_uncompressed(&hbuf,
  648. destbuf, destbuflen, destbufpos)) < 0)
  649. return tmp;
  650. if (tmp == 0)
  651. return *destbufpos;
  652. tree = hufftree[tmp];
  653. treeidx = 0;
  654. break;
  655. default:
  656. // stash it
  657. if (append_unicode_char(destbuf, destbuflen, destbufpos,
  658. treeval & ~HUFFTREE_LITERAL_MASK))
  659. return -1;
  660. tree = hufftree[treeval & ~HUFFTREE_LITERAL_MASK];
  661. treeidx = 0;
  662. break;
  663. }
  664. } else {
  665. treeidx = treeval;
  666. }
  667. }
  668. return *destbufpos;
  669. }
  670. int atsc_text_segment_decode(struct atsc_text_string_segment *segment,
  671. uint8_t **destbuf, size_t *destbufsize, size_t *destbufpos)
  672. {
  673. if (segment->mode > ATSC_TEXT_SEGMENT_MODE_UNICODE_RANGE_MAX)
  674. return -1;
  675. // mode==0 MUST be used for compressed text
  676. if ((segment->mode) && (segment->compression_type))
  677. return -1;
  678. uint8_t *buf = atsc_text_string_segment_bytes(segment);
  679. switch(segment->compression_type) {
  680. case ATSC_TEXT_COMPRESS_NONE:
  681. return unicode_decode(buf, segment->number_bytes, segment->mode,
  682. destbuf, destbufsize, destbufpos);
  683. case ATSC_TEXT_COMPRESS_PROGRAM_TITLE:
  684. return huffman_decode(buf, segment->number_bytes,
  685. destbuf, destbufsize, destbufpos,
  686. program_title_hufftree);
  687. case ATSC_TEXT_COMPRESS_PROGRAM_DESCRIPTION:
  688. return huffman_decode(buf, segment->number_bytes,
  689. destbuf, destbufsize, destbufpos,
  690. program_description_hufftree);
  691. }
  692. return -1;
  693. }