o3dgcArithmeticCodec.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. /*
  2. Copyright (c) 2004 Amir Said ([email protected]) & William A. Pearlman ([email protected])
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without modification,
  5. are permitted provided that the following conditions are met:
  6. - Redistributions of source code must retain the above copyright notice, this list
  7. of conditions and the following disclaimer.
  8. - Redistributions in binary form must reproduce the above copyright notice, this list of
  9. conditions and the following disclaimer in the documentation and/or other materials
  10. provided with the distribution.
  11. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
  12. EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  13. MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
  14. THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  15. SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  16. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  17. OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  18. IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  19. IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  20. OF SUCH DAMAGE.
  21. */
  22. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  23. // -
  24. // **************************** -
  25. // ARITHMETIC CODING EXAMPLES -
  26. // **************************** -
  27. // -
  28. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  29. // -
  30. // Fast arithmetic coding implementation -
  31. // -> 32-bit variables, 32-bit product, periodic updates, table decoding -
  32. // -
  33. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  34. // -
  35. // Version 1.00 - April 25, 2004 -
  36. // -
  37. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  38. // -
  39. // WARNING -
  40. // ========= -
  41. // -
  42. // The only purpose of this program is to demonstrate the basic principles -
  43. // of arithmetic coding. It is provided as is, without any express or -
  44. // implied warranty, without even the warranty of fitness for any particular -
  45. // purpose, or that the implementations are correct. -
  46. // -
  47. // Permission to copy and redistribute this code is hereby granted, provided -
  48. // that this warning and copyright notices are not removed or altered. -
  49. // -
  50. // Copyright (c) 2004 by Amir Said ([email protected]) & -
  51. // William A. Pearlman ([email protected]) -
  52. // -
  53. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  54. // -
  55. // A description of the arithmetic coding method used here is available in -
  56. // -
  57. // Lossless Compression Handbook, ed. K. Sayood -
  58. // Chapter 5: Arithmetic Coding (A. Said), pp. 101-152, Academic Press, 2003 -
  59. // -
  60. // A. Said, Introduction to Arithetic Coding Theory and Practice -
  61. // HP Labs report HPL-2004-76 - http://www.hpl.hp.com/techreports/ -
  62. // -
  63. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  64. // - - Inclusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  65. #include <stdlib.h>
  66. #include "o3dgcArithmeticCodec.h"
  67. namespace o3dgc
  68. {
  69. // - - Constants - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  70. const unsigned AC__MinLength = 0x01000000U; // threshold for renormalization
  71. const unsigned AC__MaxLength = 0xFFFFFFFFU; // maximum AC interval length
  72. // Maximum values for binary models
  73. const unsigned BM__LengthShift = 13; // length bits discarded before mult.
  74. const unsigned BM__MaxCount = 1 << BM__LengthShift; // for adaptive models
  75. // Maximum values for general models
  76. const unsigned DM__LengthShift = 15; // length bits discarded before mult.
  77. const unsigned DM__MaxCount = 1 << DM__LengthShift; // for adaptive models
  78. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  79. // - - Static functions - - - - - - - - - - - - - - - - - - - - - - - - - - -
  80. AI_WONT_RETURN static void AC_Error(const char * msg) AI_WONT_RETURN_SUFFIX;
  81. static void AC_Error(const char * msg)
  82. {
  83. fprintf(stderr, "\n\n -> Arithmetic coding error: ");
  84. fputs(msg, stderr);
  85. fputs("\n Execution terminated!\n", stderr);
  86. getchar();
  87. exit(1);
  88. }
  89. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  90. // - - Coding implementations - - - - - - - - - - - - - - - - - - - - - - - -
  91. inline void Arithmetic_Codec::propagate_carry(void)
  92. {
  93. unsigned char * p; // carry propagation on compressed data buffer
  94. for (p = ac_pointer - 1; *p == 0xFFU; p--) *p = 0;
  95. ++*p;
  96. }
  97. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  98. inline void Arithmetic_Codec::renorm_enc_interval(void)
  99. {
  100. do { // output and discard top byte
  101. *ac_pointer++ = (unsigned char)(base >> 24);
  102. base <<= 8;
  103. } while ((length <<= 8) < AC__MinLength); // length multiplied by 256
  104. }
  105. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  106. inline void Arithmetic_Codec::renorm_dec_interval(void)
  107. {
  108. do { // read least-significant byte
  109. value = (value << 8) | unsigned(*++ac_pointer);
  110. } while ((length <<= 8) < AC__MinLength); // length multiplied by 256
  111. }
  112. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  113. void Arithmetic_Codec::put_bit(unsigned bit)
  114. {
  115. #ifdef _DEBUG
  116. if (mode != 1) AC_Error("encoder not initialized");
  117. #endif
  118. length >>= 1; // halve interval
  119. if (bit) {
  120. unsigned init_base = base;
  121. base += length; // move base
  122. if (init_base > base) propagate_carry(); // overflow = carry
  123. }
  124. if (length < AC__MinLength) renorm_enc_interval(); // renormalization
  125. }
  126. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  127. unsigned Arithmetic_Codec::get_bit(void)
  128. {
  129. #ifdef _DEBUG
  130. if (mode != 2) AC_Error("decoder not initialized");
  131. #endif
  132. length >>= 1; // halve interval
  133. unsigned bit = (value >= length); // decode bit
  134. if (bit) value -= length; // move base
  135. if (length < AC__MinLength) renorm_dec_interval(); // renormalization
  136. return bit; // return data bit value
  137. }
  138. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  139. void Arithmetic_Codec::put_bits(unsigned data, unsigned bits)
  140. {
  141. #ifdef _DEBUG
  142. if (mode != 1) AC_Error("encoder not initialized");
  143. if ((bits < 1) || (bits > 20)) AC_Error("invalid number of bits");
  144. if (data >= (1U << bits)) AC_Error("invalid data");
  145. #endif
  146. unsigned init_base = base;
  147. base += data * (length >>= bits); // new interval base and length
  148. if (init_base > base) propagate_carry(); // overflow = carry
  149. if (length < AC__MinLength) renorm_enc_interval(); // renormalization
  150. }
  151. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  152. unsigned Arithmetic_Codec::get_bits(unsigned bits)
  153. {
  154. #ifdef _DEBUG
  155. if (mode != 2) AC_Error("decoder not initialized");
  156. if ((bits < 1) || (bits > 20)) AC_Error("invalid number of bits");
  157. #endif
  158. unsigned s = value / (length >>= bits); // decode symbol, change length
  159. value -= length * s; // update interval
  160. if (length < AC__MinLength) renorm_dec_interval(); // renormalization
  161. return s;
  162. }
  163. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  164. void Arithmetic_Codec::encode(unsigned bit,
  165. Static_Bit_Model & M)
  166. {
  167. #ifdef _DEBUG
  168. if (mode != 1) AC_Error("encoder not initialized");
  169. #endif
  170. unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
  171. // update interval
  172. if (bit == 0)
  173. length = x;
  174. else {
  175. unsigned init_base = base;
  176. base += x;
  177. length -= x;
  178. if (init_base > base) propagate_carry(); // overflow = carry
  179. }
  180. if (length < AC__MinLength) renorm_enc_interval(); // renormalization
  181. }
  182. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  183. unsigned Arithmetic_Codec::decode(Static_Bit_Model & M)
  184. {
  185. #ifdef _DEBUG
  186. if (mode != 2) AC_Error("decoder not initialized");
  187. #endif
  188. unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
  189. unsigned bit = (value >= x); // decision
  190. // update & shift interval
  191. if (bit == 0)
  192. length = x;
  193. else {
  194. value -= x; // shifted interval base = 0
  195. length -= x;
  196. }
  197. if (length < AC__MinLength) renorm_dec_interval(); // renormalization
  198. return bit; // return data bit value
  199. }
  200. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  201. void Arithmetic_Codec::encode(unsigned bit,
  202. Adaptive_Bit_Model & M)
  203. {
  204. #ifdef _DEBUG
  205. if (mode != 1) AC_Error("encoder not initialized");
  206. #endif
  207. unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
  208. // update interval
  209. if (bit == 0) {
  210. length = x;
  211. ++M.bit_0_count;
  212. }
  213. else {
  214. unsigned init_base = base;
  215. base += x;
  216. length -= x;
  217. if (init_base > base) propagate_carry(); // overflow = carry
  218. }
  219. if (length < AC__MinLength) renorm_enc_interval(); // renormalization
  220. if (--M.bits_until_update == 0) M.update(); // periodic model update
  221. }
  222. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  223. unsigned Arithmetic_Codec::decode(Adaptive_Bit_Model & M)
  224. {
  225. #ifdef _DEBUG
  226. if (mode != 2) AC_Error("decoder not initialized");
  227. #endif
  228. unsigned x = M.bit_0_prob * (length >> BM__LengthShift); // product l x p0
  229. unsigned bit = (value >= x); // decision
  230. // update interval
  231. if (bit == 0) {
  232. length = x;
  233. ++M.bit_0_count;
  234. }
  235. else {
  236. value -= x;
  237. length -= x;
  238. }
  239. if (length < AC__MinLength) renorm_dec_interval(); // renormalization
  240. if (--M.bits_until_update == 0) M.update(); // periodic model update
  241. return bit; // return data bit value
  242. }
  243. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  244. void Arithmetic_Codec::encode(unsigned data,
  245. Static_Data_Model & M)
  246. {
  247. #ifdef _DEBUG
  248. if (mode != 1) AC_Error("encoder not initialized");
  249. if (data >= M.data_symbols) AC_Error("invalid data symbol");
  250. #endif
  251. unsigned x, init_base = base;
  252. // compute products
  253. if (data == M.last_symbol) {
  254. x = M.distribution[data] * (length >> DM__LengthShift);
  255. base += x; // update interval
  256. length -= x; // no product needed
  257. }
  258. else {
  259. x = M.distribution[data] * (length >>= DM__LengthShift);
  260. base += x; // update interval
  261. length = M.distribution[data+1] * length - x;
  262. }
  263. if (init_base > base) propagate_carry(); // overflow = carry
  264. if (length < AC__MinLength) renorm_enc_interval(); // renormalization
  265. }
  266. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  267. unsigned Arithmetic_Codec::decode(Static_Data_Model & M)
  268. {
  269. #ifdef _DEBUG
  270. if (mode != 2) AC_Error("decoder not initialized");
  271. #endif
  272. unsigned n, s, x, y = length;
  273. if (M.decoder_table) { // use table look-up for faster decoding
  274. unsigned dv = value / (length >>= DM__LengthShift);
  275. unsigned t = dv >> M.table_shift;
  276. s = M.decoder_table[t]; // initial decision based on table look-up
  277. n = M.decoder_table[t+1] + 1;
  278. while (n > s + 1) { // finish with bisection search
  279. unsigned m = (s + n) >> 1;
  280. if (M.distribution[m] > dv) n = m; else s = m;
  281. }
  282. // compute products
  283. x = M.distribution[s] * length;
  284. if (s != M.last_symbol) y = M.distribution[s+1] * length;
  285. }
  286. else { // decode using only multiplications
  287. x = s = 0;
  288. length >>= DM__LengthShift;
  289. unsigned m = (n = M.data_symbols) >> 1;
  290. // decode via bisection search
  291. do {
  292. unsigned z = length * M.distribution[m];
  293. if (z > value) {
  294. n = m;
  295. y = z; // value is smaller
  296. }
  297. else {
  298. s = m;
  299. x = z; // value is larger or equal
  300. }
  301. } while ((m = (s + n) >> 1) != s);
  302. }
  303. value -= x; // update interval
  304. length = y - x;
  305. if (length < AC__MinLength) renorm_dec_interval(); // renormalization
  306. return s;
  307. }
  308. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  309. void Arithmetic_Codec::encode(unsigned data,
  310. Adaptive_Data_Model & M)
  311. {
  312. #ifdef _DEBUG
  313. if (mode != 1) AC_Error("encoder not initialized");
  314. if (data >= M.data_symbols)
  315. {
  316. AC_Error("invalid data symbol");
  317. }
  318. #endif
  319. unsigned x, init_base = base;
  320. // compute products
  321. if (data == M.last_symbol) {
  322. x = M.distribution[data] * (length >> DM__LengthShift);
  323. base += x; // update interval
  324. length -= x; // no product needed
  325. }
  326. else {
  327. x = M.distribution[data] * (length >>= DM__LengthShift);
  328. base += x; // update interval
  329. length = M.distribution[data+1] * length - x;
  330. }
  331. if (init_base > base) propagate_carry(); // overflow = carry
  332. if (length < AC__MinLength) renorm_enc_interval(); // renormalization
  333. ++M.symbol_count[data];
  334. if (--M.symbols_until_update == 0) M.update(true); // periodic model update
  335. }
  336. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  337. unsigned Arithmetic_Codec::decode(Adaptive_Data_Model & M)
  338. {
  339. #ifdef _DEBUG
  340. if (mode != 2) AC_Error("decoder not initialized");
  341. #endif
  342. unsigned n, s, x, y = length;
  343. if (M.decoder_table) { // use table look-up for faster decoding
  344. unsigned dv = value / (length >>= DM__LengthShift);
  345. unsigned t = dv >> M.table_shift;
  346. s = M.decoder_table[t]; // initial decision based on table look-up
  347. n = M.decoder_table[t+1] + 1;
  348. while (n > s + 1) { // finish with bisection search
  349. unsigned m = (s + n) >> 1;
  350. if (M.distribution[m] > dv) n = m; else s = m;
  351. }
  352. // compute products
  353. x = M.distribution[s] * length;
  354. if (s != M.last_symbol) {
  355. y = M.distribution[s+1] * length;
  356. }
  357. }
  358. else { // decode using only multiplications
  359. x = s = 0;
  360. length >>= DM__LengthShift;
  361. unsigned m = (n = M.data_symbols) >> 1;
  362. // decode via bisection search
  363. do {
  364. unsigned z = length * M.distribution[m];
  365. if (z > value) {
  366. n = m;
  367. y = z; // value is smaller
  368. }
  369. else {
  370. s = m;
  371. x = z; // value is larger or equal
  372. }
  373. } while ((m = (s + n) >> 1) != s);
  374. }
  375. value -= x; // update interval
  376. length = y - x;
  377. if (length < AC__MinLength) renorm_dec_interval(); // renormalization
  378. ++M.symbol_count[s];
  379. if (--M.symbols_until_update == 0) M.update(false); // periodic model update
  380. return s;
  381. }
  382. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  383. // - - Other Arithmetic_Codec implementations - - - - - - - - - - - - - - - -
  384. Arithmetic_Codec::Arithmetic_Codec(void)
  385. {
  386. mode = buffer_size = 0;
  387. new_buffer = code_buffer = 0;
  388. }
  389. Arithmetic_Codec::Arithmetic_Codec(unsigned max_code_bytes,
  390. unsigned char * user_buffer)
  391. {
  392. mode = buffer_size = 0;
  393. new_buffer = code_buffer = 0;
  394. set_buffer(max_code_bytes, user_buffer);
  395. }
  396. Arithmetic_Codec::~Arithmetic_Codec(void)
  397. {
  398. delete [] new_buffer;
  399. }
  400. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  401. void Arithmetic_Codec::set_buffer(unsigned max_code_bytes,
  402. unsigned char * user_buffer)
  403. {
  404. // test for reasonable sizes
  405. if (!max_code_bytes)// || (max_code_bytes > 0x10000000U)) // updated by K. Mammou
  406. {
  407. AC_Error("invalid codec buffer size");
  408. }
  409. if (mode != 0) AC_Error("cannot set buffer while encoding or decoding");
  410. if (user_buffer != 0) { // user provides memory buffer
  411. buffer_size = max_code_bytes;
  412. code_buffer = user_buffer; // set buffer for compressed data
  413. delete [] new_buffer; // free anything previously assigned
  414. new_buffer = 0;
  415. return;
  416. }
  417. if (max_code_bytes <= buffer_size) return; // enough available
  418. buffer_size = max_code_bytes; // assign new memory
  419. delete [] new_buffer; // free anything previously assigned
  420. new_buffer = new unsigned char[buffer_size+16]; // 16 extra bytes
  421. code_buffer = new_buffer; // set buffer for compressed data
  422. }
  423. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  424. void Arithmetic_Codec::start_encoder(void)
  425. {
  426. if (mode != 0) AC_Error("cannot start encoder");
  427. if (buffer_size == 0) AC_Error("no code buffer set");
  428. mode = 1;
  429. base = 0; // initialize encoder variables: interval and pointer
  430. length = AC__MaxLength;
  431. ac_pointer = code_buffer; // pointer to next data byte
  432. }
  433. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  434. void Arithmetic_Codec::start_decoder(void)
  435. {
  436. if (mode != 0) AC_Error("cannot start decoder");
  437. if (buffer_size == 0) AC_Error("no code buffer set");
  438. // initialize decoder: interval, pointer, initial code value
  439. mode = 2;
  440. length = AC__MaxLength;
  441. ac_pointer = code_buffer + 3;
  442. value = (unsigned(code_buffer[0]) << 24)|(unsigned(code_buffer[1]) << 16) |
  443. (unsigned(code_buffer[2]) << 8)| unsigned(code_buffer[3]);
  444. }
  445. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  446. void Arithmetic_Codec::read_from_file(FILE * code_file)
  447. {
  448. unsigned shift = 0, code_bytes = 0;
  449. int file_byte;
  450. // read variable-length header with number of code bytes
  451. do {
  452. if ((file_byte = getc(code_file)) == EOF)
  453. AC_Error("cannot read code from file");
  454. code_bytes |= unsigned(file_byte & 0x7F) << shift;
  455. shift += 7;
  456. } while (file_byte & 0x80);
  457. // read compressed data
  458. if (code_bytes > buffer_size) AC_Error("code buffer overflow");
  459. if (fread(code_buffer, 1, code_bytes, code_file) != code_bytes)
  460. AC_Error("cannot read code from file");
  461. start_decoder(); // initialize decoder
  462. }
  463. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  464. unsigned Arithmetic_Codec::stop_encoder(void)
  465. {
  466. if (mode != 1) AC_Error("invalid to stop encoder");
  467. mode = 0;
  468. unsigned init_base = base; // done encoding: set final data bytes
  469. if (length > 2 * AC__MinLength) {
  470. base += AC__MinLength; // base offset
  471. length = AC__MinLength >> 1; // set new length for 1 more byte
  472. }
  473. else {
  474. base += AC__MinLength >> 1; // base offset
  475. length = AC__MinLength >> 9; // set new length for 2 more bytes
  476. }
  477. if (init_base > base) propagate_carry(); // overflow = carry
  478. renorm_enc_interval(); // renormalization = output last bytes
  479. unsigned code_bytes = unsigned(ac_pointer - code_buffer);
  480. if (code_bytes > buffer_size) AC_Error("code buffer overflow");
  481. return code_bytes; // number of bytes used
  482. }
  483. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  484. unsigned Arithmetic_Codec::write_to_file(FILE * code_file)
  485. {
  486. unsigned header_bytes = 0, code_bytes = stop_encoder(), nb = code_bytes;
  487. // write variable-length header with number of code bytes
  488. do {
  489. int file_byte = int(nb & 0x7FU);
  490. if ((nb >>= 7) > 0) file_byte |= 0x80;
  491. if (putc(file_byte, code_file) == EOF)
  492. AC_Error("cannot write compressed data to file");
  493. header_bytes++;
  494. } while (nb);
  495. // write compressed data
  496. if (fwrite(code_buffer, 1, code_bytes, code_file) != code_bytes)
  497. AC_Error("cannot write compressed data to file");
  498. return code_bytes + header_bytes; // bytes used
  499. }
  500. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  501. void Arithmetic_Codec::stop_decoder(void)
  502. {
  503. if (mode != 2) AC_Error("invalid to stop decoder");
  504. mode = 0;
  505. }
  506. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  507. // - Static bit model implementation - - - - - - - - - - - - - - - - - - - - -
  508. Static_Bit_Model::Static_Bit_Model(void)
  509. {
  510. bit_0_prob = 1U << (BM__LengthShift - 1); // p0 = 0.5
  511. }
  512. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  513. void Static_Bit_Model::set_probability_0(double p0)
  514. {
  515. if ((p0 < 0.0001)||(p0 > 0.9999)) AC_Error("invalid bit probability");
  516. bit_0_prob = unsigned(p0 * (1 << BM__LengthShift));
  517. }
  518. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  519. // - Adaptive bit model implementation - - - - - - - - - - - - - - - - - - - -
  520. Adaptive_Bit_Model::Adaptive_Bit_Model(void)
  521. {
  522. reset();
  523. }
  524. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  525. void Adaptive_Bit_Model::reset(void)
  526. {
  527. // initialization to equiprobable model
  528. bit_0_count = 1;
  529. bit_count = 2;
  530. bit_0_prob = 1U << (BM__LengthShift - 1);
  531. update_cycle = bits_until_update = 4; // start with frequent updates
  532. }
  533. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  534. void Adaptive_Bit_Model::update(void)
  535. {
  536. // halve counts when a threshold is reached
  537. if ((bit_count += update_cycle) > BM__MaxCount) {
  538. bit_count = (bit_count + 1) >> 1;
  539. bit_0_count = (bit_0_count + 1) >> 1;
  540. if (bit_0_count == bit_count) ++bit_count;
  541. }
  542. // compute scaled bit 0 probability
  543. unsigned scale = 0x80000000U / bit_count;
  544. bit_0_prob = (bit_0_count * scale) >> (31 - BM__LengthShift);
  545. // set frequency of model updates
  546. update_cycle = (5 * update_cycle) >> 2;
  547. if (update_cycle > 64) update_cycle = 64;
  548. bits_until_update = update_cycle;
  549. }
  550. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  551. // - - Static data model implementation - - - - - - - - - - - - - - - - - - -
  552. Static_Data_Model::Static_Data_Model(void)
  553. {
  554. data_symbols = 0;
  555. distribution = 0;
  556. }
  557. Static_Data_Model::~Static_Data_Model(void)
  558. {
  559. delete [] distribution;
  560. }
  561. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  562. void Static_Data_Model::set_distribution(unsigned number_of_symbols,
  563. const double probability[])
  564. {
  565. if ((number_of_symbols < 2) || (number_of_symbols > (1 << 11)))
  566. AC_Error("invalid number of data symbols");
  567. if (data_symbols != number_of_symbols) { // assign memory for data model
  568. data_symbols = number_of_symbols;
  569. last_symbol = data_symbols - 1;
  570. delete [] distribution;
  571. // define size of table for fast decoding
  572. if (data_symbols > 16) {
  573. unsigned table_bits = 3;
  574. while (data_symbols > (1U << (table_bits + 2))) ++table_bits;
  575. table_size = 1 << table_bits;
  576. table_shift = DM__LengthShift - table_bits;
  577. distribution = new unsigned[data_symbols+table_size+2];
  578. decoder_table = distribution + data_symbols;
  579. }
  580. else { // small alphabet: no table needed
  581. decoder_table = 0;
  582. table_size = table_shift = 0;
  583. distribution = new unsigned[data_symbols];
  584. }
  585. }
  586. // compute cumulative distribution, decoder table
  587. unsigned s = 0;
  588. double sum = 0.0, p = 1.0 / double(data_symbols);
  589. for (unsigned k = 0; k < data_symbols; k++) {
  590. if (probability) p = probability[k];
  591. if ((p < 0.0001) || (p > 0.9999)) AC_Error("invalid symbol probability");
  592. distribution[k] = unsigned(sum * (1 << DM__LengthShift));
  593. sum += p;
  594. if (table_size == 0) continue;
  595. unsigned w = distribution[k] >> table_shift;
  596. while (s < w) decoder_table[++s] = k - 1;
  597. }
  598. if (table_size != 0) {
  599. decoder_table[0] = 0;
  600. while (s <= table_size) decoder_table[++s] = data_symbols - 1;
  601. }
  602. if ((sum < 0.9999) || (sum > 1.0001)) AC_Error("invalid probabilities");
  603. }
  604. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  605. // - - Adaptive data model implementation - - - - - - - - - - - - - - - - - -
  606. Adaptive_Data_Model::Adaptive_Data_Model(void)
  607. {
  608. data_symbols = 0;
  609. distribution = 0;
  610. }
  611. Adaptive_Data_Model::Adaptive_Data_Model(unsigned number_of_symbols)
  612. {
  613. data_symbols = 0;
  614. distribution = 0;
  615. set_alphabet(number_of_symbols);
  616. }
  617. Adaptive_Data_Model::~Adaptive_Data_Model(void)
  618. {
  619. delete [] distribution;
  620. }
  621. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  622. void Adaptive_Data_Model::set_alphabet(unsigned number_of_symbols)
  623. {
  624. if ((number_of_symbols < 2) || (number_of_symbols > (1 << 11)))
  625. AC_Error("invalid number of data symbols");
  626. if (data_symbols != number_of_symbols) { // assign memory for data model
  627. data_symbols = number_of_symbols;
  628. last_symbol = data_symbols - 1;
  629. delete [] distribution;
  630. // define size of table for fast decoding
  631. if (data_symbols > 16) {
  632. unsigned table_bits = 3;
  633. while (data_symbols > (1U << (table_bits + 2))) ++table_bits;
  634. table_size = 1 << table_bits;
  635. table_shift = DM__LengthShift - table_bits;
  636. distribution = new unsigned[2*data_symbols+table_size+2];
  637. decoder_table = distribution + 2 * data_symbols;
  638. }
  639. else { // small alphabet: no table needed
  640. decoder_table = 0;
  641. table_size = table_shift = 0;
  642. distribution = new unsigned[2*data_symbols];
  643. }
  644. symbol_count = distribution + data_symbols;
  645. }
  646. reset(); // initialize model
  647. }
  648. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  649. void Adaptive_Data_Model::update(bool from_encoder)
  650. {
  651. // halve counts when a threshold is reached
  652. if ((total_count += update_cycle) > DM__MaxCount) {
  653. total_count = 0;
  654. for (unsigned n = 0; n < data_symbols; n++)
  655. total_count += (symbol_count[n] = (symbol_count[n] + 1) >> 1);
  656. }
  657. assert(total_count > 0);
  658. // compute cumulative distribution, decoder table
  659. unsigned k, sum = 0, s = 0;
  660. unsigned scale = 0x80000000U / total_count;
  661. if (from_encoder || (table_size == 0))
  662. for (k = 0; k < data_symbols; k++) {
  663. distribution[k] = (scale * sum) >> (31 - DM__LengthShift);
  664. sum += symbol_count[k];
  665. }
  666. else {
  667. assert(decoder_table);
  668. for (k = 0; k < data_symbols; k++) {
  669. distribution[k] = (scale * sum) >> (31 - DM__LengthShift);
  670. sum += symbol_count[k];
  671. unsigned w = distribution[k] >> table_shift;
  672. while (s < w) decoder_table[++s] = k - 1;
  673. }
  674. decoder_table[0] = 0;
  675. while (s <= table_size) decoder_table[++s] = data_symbols - 1;
  676. }
  677. // set frequency of model updates
  678. update_cycle = (5 * update_cycle) >> 2;
  679. unsigned max_cycle = (data_symbols + 6) << 3;
  680. if (update_cycle > max_cycle) update_cycle = max_cycle;
  681. symbols_until_update = update_cycle;
  682. }
  683. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  684. void Adaptive_Data_Model::reset(void)
  685. {
  686. if (data_symbols == 0) return;
  687. // restore probability estimates to uniform distribution
  688. total_count = 0;
  689. update_cycle = data_symbols;
  690. for (unsigned k = 0; k < data_symbols; k++) symbol_count[k] = 1;
  691. update(false);
  692. symbols_until_update = update_cycle = (data_symbols + 6) >> 1;
  693. }
  694. }
  695. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */