/schroedinger-1.0.11/testsuite/common.c

# · C · 906 lines · 815 code · 89 blank · 2 comment · 210 complexity · efd27d5166d9a60bfad4edfa547a105e MD5 · raw file

  1. #ifdef HAVE_CONFIG_H
  2. #include "config.h"
  3. #endif
  4. #include <schroedinger/schro.h>
  5. #include <schroedinger/schrowavelet.h>
  6. #include <schroedinger/schrofft.h>
  7. #include <orc-test/orcrandom.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <math.h>
  12. #include "common.h"
  13. double sgn(double x)
  14. {
  15. if (x<0) return -1;
  16. if (x>0) return 1;
  17. return 0;
  18. }
  19. double
  20. random_std (void)
  21. {
  22. double x;
  23. double y;
  24. while (1) {
  25. x = -5.0 + rand () * (1.0/RAND_MAX) * 10;
  26. y = rand () * (1.0/RAND_MAX);
  27. if (y < exp(-x*x*0.5)) return x;
  28. }
  29. }
  30. double
  31. random_triangle (void)
  32. {
  33. return rand () * (1.0/RAND_MAX) - rand () * (1.0/RAND_MAX);
  34. }
  35. int
  36. gain_to_quant_index (double x)
  37. {
  38. int i = 0;
  39. x *= x;
  40. x *= x;
  41. while (x*x > 2) {
  42. x *= 0.5;
  43. i++;
  44. }
  45. return i;
  46. }
  47. double
  48. sum_f64 (double *a, int n)
  49. {
  50. double sum = 0;
  51. int i;
  52. for(i=0;i<n;i++){
  53. sum += a[i];
  54. }
  55. return sum;
  56. }
  57. double
  58. multsum_f64 (double *a, double *b, int n)
  59. {
  60. double sum = 0;
  61. int i;
  62. for(i=0;i<n;i++){
  63. sum += a[i]*b[i];
  64. }
  65. return sum;
  66. }
  67. /* Test patterns */
  68. OrcRandomContext context;
  69. static void
  70. gen_random (SchroFrameData *fd, int type)
  71. {
  72. int i,j;
  73. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  74. uint8_t *data;
  75. for(j=0;j<fd->height;j++){
  76. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  77. orc_random_bits (&context, data, fd->width);
  78. }
  79. } else if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_S16) {
  80. int16_t *data;
  81. for(j=0;j<fd->height;j++){
  82. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  83. for(i=0;i<fd->width;i++) {
  84. data[i] = orc_random(&context)&0xff;
  85. }
  86. }
  87. } else {
  88. int32_t *data;
  89. for(j=0;j<fd->height;j++){
  90. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  91. for(i=0;i<fd->width;i++) {
  92. data[i] = orc_random(&context)&0xffff;
  93. }
  94. }
  95. }
  96. }
  97. static int gen_const_array[] = { 0, 1, 127, 128, 129, 254, 255 };
  98. #define CONST 255
  99. static void
  100. gen_const (SchroFrameData *fd, int type)
  101. {
  102. int i,j;
  103. int value = gen_const_array[type];
  104. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  105. for(j=0;j<fd->height;j++){
  106. uint8_t *data;
  107. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  108. for(i=0;i<fd->width;i++) {
  109. data[i] = value;
  110. }
  111. }
  112. } else {
  113. for(j=0;j<fd->height;j++){
  114. int16_t *data;
  115. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  116. for(i=0;i<fd->width;i++) {
  117. data[i] = value;
  118. }
  119. }
  120. }
  121. }
  122. static void
  123. gen_vert_lines (SchroFrameData *fd, int type)
  124. {
  125. int i,j;
  126. int pitch;
  127. pitch = type + 2;
  128. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  129. uint8_t *data;
  130. for(j=0;j<fd->height;j++){
  131. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  132. for(i=0;i<fd->width;i++) {
  133. data[i] = CONST*((i%pitch)==0);
  134. }
  135. }
  136. } else {
  137. int16_t *data;
  138. for(j=0;j<fd->height;j++){
  139. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  140. for(i=0;i<fd->width;i++) {
  141. data[i] = CONST*((i%pitch)==0);
  142. }
  143. }
  144. }
  145. }
  146. static void
  147. gen_horiz_lines (SchroFrameData *fd, int type)
  148. {
  149. int i,j;
  150. int pitch;
  151. pitch = type + 2;
  152. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  153. uint8_t *data;
  154. for(j=0;j<fd->height;j++){
  155. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  156. for(i=0;i<fd->width;i++) {
  157. data[i] = CONST*(((j+1)%pitch)==0);
  158. }
  159. }
  160. } else {
  161. int16_t *data;
  162. for(j=0;j<fd->height;j++){
  163. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  164. for(i=0;i<fd->width;i++) {
  165. data[i] = CONST*(((j+1)%pitch)==0);
  166. }
  167. }
  168. }
  169. }
  170. static void
  171. gen_vert_bands (SchroFrameData *fd, int type)
  172. {
  173. int i,j;
  174. int pitch;
  175. pitch = type + 1;
  176. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  177. uint8_t *data;
  178. for(j=0;j<fd->height;j++){
  179. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  180. for(i=0;i<fd->width;i++) {
  181. data[i] = CONST*((i/pitch)&1);
  182. }
  183. }
  184. } else {
  185. int16_t *data;
  186. for(j=0;j<fd->height;j++){
  187. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  188. for(i=0;i<fd->width;i++) {
  189. data[i] = CONST*((i/pitch)&1);
  190. }
  191. }
  192. }
  193. }
  194. static void
  195. gen_horiz_bands (SchroFrameData *fd, int type)
  196. {
  197. int i,j;
  198. int pitch;
  199. pitch = type + 1;
  200. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  201. uint8_t *data;
  202. for(j=0;j<fd->height;j++){
  203. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  204. for(i=0;i<fd->width;i++) {
  205. data[i] = CONST*((j/pitch)&1);
  206. }
  207. }
  208. } else {
  209. int16_t *data;
  210. for(j=0;j<fd->height;j++){
  211. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  212. for(i=0;i<fd->width;i++) {
  213. data[i] = CONST*((j/pitch)&1);
  214. }
  215. }
  216. }
  217. }
  218. static void
  219. gen_vert_edge (SchroFrameData *fd, int type)
  220. {
  221. int i,j;
  222. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  223. uint8_t *data;
  224. for(j=0;j<fd->height;j++){
  225. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  226. for(i=0;i<fd->width;i++) {
  227. data[i] = CONST*(i*2 < fd->width);
  228. }
  229. }
  230. } else {
  231. int16_t *data;
  232. for(j=0;j<fd->height;j++){
  233. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  234. for(i=0;i<fd->width;i++) {
  235. data[i] = CONST*(i*2 < fd->width);
  236. }
  237. }
  238. }
  239. }
  240. static void
  241. gen_horiz_edge (SchroFrameData *fd, int type)
  242. {
  243. int i,j;
  244. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  245. uint8_t *data;
  246. for(j=0;j<fd->height;j++){
  247. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  248. for(i=0;i<fd->width;i++) {
  249. data[i] = CONST*(j*2 < fd->height);
  250. }
  251. }
  252. } else {
  253. int16_t *data;
  254. for(j=0;j<fd->height;j++){
  255. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  256. for(i=0;i<fd->width;i++) {
  257. data[i] = CONST*(j*2 < fd->height);
  258. }
  259. }
  260. }
  261. }
  262. static void
  263. gen_vert_ramp (SchroFrameData *fd, int type)
  264. {
  265. int i,j;
  266. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  267. uint8_t *data;
  268. for(j=0;j<fd->height;j++){
  269. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  270. for(i=0;i<fd->width;i++) {
  271. data[i] = ((i<<4)>>type)&0xff;
  272. }
  273. }
  274. } else {
  275. int16_t *data;
  276. for(j=0;j<fd->height;j++){
  277. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  278. for(i=0;i<fd->width;i++) {
  279. data[i] = ((i<<4)>>type)&0xff;
  280. }
  281. }
  282. }
  283. }
  284. static void
  285. gen_horiz_ramp (SchroFrameData *fd, int type)
  286. {
  287. int i,j;
  288. if (SCHRO_FRAME_FORMAT_DEPTH(fd->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  289. uint8_t *data;
  290. for(j=0;j<fd->height;j++){
  291. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  292. for(i=0;i<fd->width;i++) {
  293. data[i] = ((j<<4)>>type)&0xff;
  294. }
  295. }
  296. } else {
  297. int16_t *data;
  298. for(j=0;j<fd->height;j++){
  299. data = SCHRO_FRAME_DATA_GET_LINE(fd, j);
  300. for(i=0;i<fd->width;i++) {
  301. data[i] = ((j<<4)>>type)&0xff;
  302. }
  303. }
  304. }
  305. }
  306. typedef struct _Generator Generator;
  307. struct _Generator {
  308. char *name;
  309. void (*generate)(SchroFrameData *fd, int i);
  310. int n;
  311. };
  312. Generator generators_u8[] = {
  313. { "random", gen_random, 1 },
  314. { "const", gen_const, ARRAY_SIZE(gen_const_array) },
  315. { "vert_lines", gen_vert_lines, 8 },
  316. { "horiz_lines", gen_horiz_lines, 16 },
  317. { "vert_bands", gen_vert_bands, 8 },
  318. { "horiz_bands", gen_horiz_bands, 8 },
  319. { "vert_edge", gen_vert_edge, 1 },
  320. { "horiz_edge", gen_horiz_edge, 1 },
  321. { "vert_ramp", gen_vert_ramp, 8 },
  322. { "horiz_ramp", gen_horiz_ramp, 8 },
  323. };
  324. int
  325. test_pattern_get_n_generators (void)
  326. {
  327. int i;
  328. int n;
  329. n = 0;
  330. for(i=0;i<ARRAY_SIZE(generators_u8);i++) {
  331. n += generators_u8[i].n;
  332. }
  333. return n;
  334. }
  335. void
  336. test_pattern_generate (SchroFrameData *fd, char *name, int n)
  337. {
  338. int i;
  339. for(i=0;i<ARRAY_SIZE(generators_u8);i++) {
  340. if (n < generators_u8[i].n) {
  341. generators_u8[i].generate (fd, n);
  342. if (name) sprintf(name, "%s %d", generators_u8[i].name, n);
  343. return;
  344. }
  345. n -= generators_u8[i].n;
  346. }
  347. }
  348. int
  349. frame_data_compare (SchroFrameData *dest, SchroFrameData *src)
  350. {
  351. int i,j;
  352. int src_depth = SCHRO_FRAME_FORMAT_DEPTH(src->format);
  353. int dest_depth = SCHRO_FRAME_FORMAT_DEPTH(dest->format);
  354. if (src_depth == SCHRO_FRAME_FORMAT_DEPTH_U8 &&
  355. dest_depth == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  356. uint8_t *d;
  357. uint8_t *s;
  358. for(j=0;j<dest->height;j++){
  359. d = SCHRO_FRAME_DATA_GET_LINE(dest, j);
  360. s = SCHRO_FRAME_DATA_GET_LINE(src, j);
  361. for(i=0;i<dest->width;i++){
  362. if (d[i] != s[i]) return FALSE;
  363. }
  364. }
  365. } else if (dest_depth == SCHRO_FRAME_FORMAT_DEPTH_S16 &&
  366. src_depth == SCHRO_FRAME_FORMAT_DEPTH_S16) {
  367. int16_t *d;
  368. int16_t *s;
  369. for(j=0;j<dest->height;j++){
  370. d = SCHRO_FRAME_DATA_GET_LINE(dest, j);
  371. s = SCHRO_FRAME_DATA_GET_LINE(src, j);
  372. for(i=0;i<dest->width;i++){
  373. if (d[i] != s[i]) return FALSE;
  374. }
  375. }
  376. } else if (dest_depth == SCHRO_FRAME_FORMAT_DEPTH_S32 &&
  377. src_depth == SCHRO_FRAME_FORMAT_DEPTH_S16) {
  378. int32_t *d;
  379. int16_t *s;
  380. for(j=0;j<dest->height;j++){
  381. d = SCHRO_FRAME_DATA_GET_LINE(dest, j);
  382. s = SCHRO_FRAME_DATA_GET_LINE(src, j);
  383. for(i=0;i<dest->width;i++){
  384. if (d[i] != s[i]) return FALSE;
  385. }
  386. }
  387. }
  388. return TRUE;
  389. }
  390. void
  391. frame_data_dump_u8 (SchroFrameData *test, SchroFrameData *ref)
  392. {
  393. int i;
  394. int j;
  395. printf("=====\n");
  396. for(j=0;j<test->height;j++){
  397. uint8_t *tline;
  398. uint8_t *rline;
  399. tline = SCHRO_FRAME_DATA_GET_LINE(test, j);
  400. rline = SCHRO_FRAME_DATA_GET_LINE(ref, j);
  401. for(i=0;i<test->width;i++){
  402. if (tline[i] == rline[i]) {
  403. printf("%4d ", tline[i]);
  404. } else {
  405. printf("\033[00;01;37;41m%4d\033[00m ", tline[i]);
  406. }
  407. }
  408. printf("\n");
  409. }
  410. printf("=====\n");
  411. }
  412. void
  413. frame_data_dump_s16 (SchroFrameData *test, SchroFrameData *ref)
  414. {
  415. int i;
  416. int j;
  417. printf("=====\n");
  418. for(j=0;j<test->height;j++){
  419. int16_t *tline;
  420. int16_t *rline;
  421. tline = SCHRO_FRAME_DATA_GET_LINE(test, j);
  422. rline = SCHRO_FRAME_DATA_GET_LINE(ref, j);
  423. for(i=0;i<test->width;i++){
  424. if (tline[i] == rline[i]) {
  425. printf("%4d ", tline[i]);
  426. } else {
  427. printf("\033[00;01;37;41m%4d\033[00m ", tline[i]);
  428. }
  429. }
  430. printf("\n");
  431. }
  432. printf("=====\n");
  433. }
  434. void
  435. frame_data_dump_s32_s16 (SchroFrameData *test, SchroFrameData *ref)
  436. {
  437. int i;
  438. int j;
  439. printf("=====\n");
  440. for(j=0;j<test->height;j++){
  441. int32_t *tline;
  442. int16_t *rline;
  443. tline = SCHRO_FRAME_DATA_GET_LINE(test, j);
  444. rline = SCHRO_FRAME_DATA_GET_LINE(ref, j);
  445. for(i=0;i<test->width;i++){
  446. if (tline[i] == rline[i]) {
  447. printf("%4d ", tline[i]);
  448. } else {
  449. printf("\033[00;01;37;41m%4d\033[00m ", tline[i]);
  450. }
  451. }
  452. printf("\n");
  453. }
  454. printf("=====\n");
  455. }
  456. void
  457. frame_data_dump_full (SchroFrameData *test, SchroFrameData *ref, SchroFrameData *orig)
  458. {
  459. int i;
  460. int j;
  461. int test_depth = SCHRO_FRAME_FORMAT_DEPTH(test->format);
  462. int ref_depth = SCHRO_FRAME_FORMAT_DEPTH(ref->format);
  463. printf("=====\n");
  464. if (test_depth == SCHRO_FRAME_FORMAT_DEPTH_U8 &&
  465. ref_depth == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  466. for(j=0;j<test->height;j++){
  467. uint8_t *tline;
  468. uint8_t *rline;
  469. uint8_t *oline;
  470. tline = SCHRO_FRAME_DATA_GET_LINE(test, j);
  471. rline = SCHRO_FRAME_DATA_GET_LINE(ref, j);
  472. oline = SCHRO_FRAME_DATA_GET_LINE(orig, j);
  473. for(i=0;i<test->width;i++){
  474. printf("\033[00;35m%4d\033[00m ", oline[i]);
  475. }
  476. printf("\n");
  477. for(i=0;i<test->width;i++){
  478. printf("\033[00;32m%4d\033[00m ", rline[i]);
  479. }
  480. printf("\n");
  481. for(i=0;i<test->width;i++){
  482. if (tline[i] == rline[i]) {
  483. printf("%4d ", tline[i]);
  484. } else {
  485. printf("\033[00;01;37;41m%4d\033[00m ", tline[i]);
  486. }
  487. }
  488. printf("\n");
  489. }
  490. } else if (ref_depth == SCHRO_FRAME_FORMAT_DEPTH_S16 &&
  491. test_depth == SCHRO_FRAME_FORMAT_DEPTH_S16) {
  492. for(j=0;j<test->height;j++){
  493. int16_t *tline;
  494. int16_t *rline;
  495. int16_t *oline;
  496. tline = SCHRO_FRAME_DATA_GET_LINE(test, j);
  497. rline = SCHRO_FRAME_DATA_GET_LINE(ref, j);
  498. oline = SCHRO_FRAME_DATA_GET_LINE(orig, j);
  499. for(i=0;i<test->width;i++){
  500. printf("\033[00;35m%4d\033[00m ", oline[i]);
  501. }
  502. printf("\n");
  503. for(i=0;i<test->width;i++){
  504. printf("\033[00;32m%4d\033[00m ", rline[i]);
  505. }
  506. printf("\n");
  507. for(i=0;i<test->width;i++){
  508. if (tline[i] == rline[i]) {
  509. printf("%4d ", tline[i]);
  510. } else {
  511. printf("\033[00;01;37;41m%4d\033[00m ", tline[i]);
  512. }
  513. }
  514. printf("\n");
  515. }
  516. } else if (test_depth == SCHRO_FRAME_FORMAT_DEPTH_S32 &&
  517. ref_depth == SCHRO_FRAME_FORMAT_DEPTH_S16) {
  518. for(j=0;j<test->height;j++){
  519. int32_t *tline;
  520. int16_t *rline;
  521. int16_t *oline;
  522. tline = SCHRO_FRAME_DATA_GET_LINE(test, j);
  523. rline = SCHRO_FRAME_DATA_GET_LINE(ref, j);
  524. oline = SCHRO_FRAME_DATA_GET_LINE(orig, j);
  525. for(i=0;i<test->width;i++){
  526. printf("\033[00;35m%4d\033[00m ", oline[i]);
  527. }
  528. printf("\n");
  529. for(i=0;i<test->width;i++){
  530. printf("\033[00;32m%4d\033[00m ", rline[i]);
  531. }
  532. printf("\n");
  533. for(i=0;i<test->width;i++){
  534. if (tline[i] == rline[i]) {
  535. printf("%4d ", tline[i]);
  536. } else {
  537. printf("\033[00;01;37;41m%4d\033[00m ", tline[i]);
  538. }
  539. }
  540. printf("\n");
  541. }
  542. }
  543. printf("=====\n");
  544. }
  545. int
  546. frame_compare (SchroFrame *dest, SchroFrame *src)
  547. {
  548. int ret;
  549. ret = frame_data_compare (dest->components + 0, src->components + 0);
  550. ret &= frame_data_compare (dest->components + 1, src->components + 1);
  551. ret &= frame_data_compare (dest->components + 2, src->components + 2);
  552. return ret;
  553. }
  554. void
  555. frame_data_dump (SchroFrameData *test, SchroFrameData *ref)
  556. {
  557. if (SCHRO_FRAME_FORMAT_DEPTH(test->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  558. frame_data_dump_u8 (test, ref);
  559. } else {
  560. frame_data_dump_s16 (test, ref);
  561. }
  562. }
  563. void
  564. frame_dump (SchroFrame *test, SchroFrame *ref)
  565. {
  566. if (SCHRO_FRAME_FORMAT_DEPTH(test->format) == SCHRO_FRAME_FORMAT_DEPTH_U8) {
  567. frame_data_dump_u8 (test->components + 0, ref->components + 0);
  568. frame_data_dump_u8 (test->components + 1, ref->components + 1);
  569. frame_data_dump_u8 (test->components + 2, ref->components + 2);
  570. } else {
  571. frame_data_dump_s16 (test->components + 0, ref->components + 0);
  572. frame_data_dump_s16 (test->components + 1, ref->components + 1);
  573. frame_data_dump_s16 (test->components + 2, ref->components + 2);
  574. }
  575. }
  576. /* simple parse dirac stream */
  577. int
  578. parse_packet (FILE *file, void **p_data, int *p_size)
  579. {
  580. unsigned char *packet;
  581. unsigned char header[13];
  582. int n;
  583. int size;
  584. n = fread (header, 1, 13, file);
  585. if (n == 0) {
  586. *p_data = NULL;
  587. *p_size = 0;
  588. return 1;
  589. }
  590. if (n < 13) {
  591. printf("truncated header\n");
  592. return 0;
  593. }
  594. if (header[0] != 'B' || header[1] != 'B' || header[2] != 'C' ||
  595. header[3] != 'D') {
  596. return 0;
  597. }
  598. size = (header[5]<<24) | (header[6]<<16) | (header[7]<<8) | (header[8]);
  599. if (size == 0) {
  600. size = 13;
  601. }
  602. if (size < 13) {
  603. return 0;
  604. }
  605. if (size > 16*1024*1024) {
  606. printf("packet too large? (%d > 16777216)\n", size);
  607. return 0;
  608. }
  609. packet = malloc (size);
  610. memcpy (packet, header, 13);
  611. n = fread (packet + 13, 1, size - 13, file);
  612. if (n < size - 13) {
  613. free (packet);
  614. return 0;
  615. }
  616. *p_data = packet;
  617. *p_size = size;
  618. return 1;
  619. }
  620. void
  621. interleave (int16_t *a, int n)
  622. {
  623. int i;
  624. int16_t tmp[300];
  625. for(i=0;i<n/2;i++){
  626. tmp[i*2] = a[i];
  627. tmp[i*2 + 1] = a[n/2 + i];
  628. }
  629. for(i=0;i<n;i++){
  630. a[i] = tmp[i];
  631. }
  632. }
  633. void
  634. deinterleave (int16_t *a, int n)
  635. {
  636. int i;
  637. int16_t tmp[300];
  638. for(i=0;i<n/2;i++){
  639. tmp[i] = a[i*2];
  640. tmp[n/2 + i] = a[i*2+1];
  641. }
  642. for(i=0;i<n;i++){
  643. a[i] = tmp[i];
  644. }
  645. }
  646. void
  647. extend(int16_t *a, int n)
  648. {
  649. a[-8] = a[0];
  650. a[-7] = a[1];
  651. a[-6] = a[0];
  652. a[-5] = a[1];
  653. a[-4] = a[0];
  654. a[-3] = a[1];
  655. a[-2] = a[0];
  656. a[-1] = a[1];
  657. a[n+0] = a[n-2];
  658. a[n+1] = a[n-1];
  659. a[n+2] = a[n-2];
  660. a[n+3] = a[n-1];
  661. a[n+4] = a[n-2];
  662. a[n+5] = a[n-1];
  663. a[n+6] = a[n-2];
  664. a[n+7] = a[n-1];
  665. }
  666. void
  667. synth(int16_t *a, int n, int filter)
  668. {
  669. int i;
  670. switch (filter) {
  671. case SCHRO_WAVELET_DESLAURIERS_DUBUC_9_7:
  672. extend(a,n);
  673. for(i=0;i<n;i+=2){
  674. a[i] -= (a[i-1] + a[i+1] + 2)>>2;
  675. }
  676. extend(a,n);
  677. for(i=0;i<n;i+=2){
  678. a[i + 1] += (-a[i-2] + 9 * a[i] + 9 * a[i+2] - a[i+4] + 8)>>4;
  679. }
  680. break;
  681. case SCHRO_WAVELET_LE_GALL_5_3:
  682. extend(a,n);
  683. for(i=0;i<n;i+=2){
  684. a[i] -= (a[i-1] + a[i+1] + 2)>>2;
  685. }
  686. extend(a,n);
  687. for(i=0;i<n;i+=2){
  688. a[i + 1] += (a[i] + a[i+2] + 1)>>1;
  689. }
  690. break;
  691. case SCHRO_WAVELET_DESLAURIERS_DUBUC_13_7:
  692. extend(a,n);
  693. for(i=0;i<n;i+=2){
  694. a[i] -= (-a[i-3] + 9 * a[i-1] + 9 * a[i+1] - a[i+3] + 16)>>5;
  695. }
  696. extend(a,n);
  697. for(i=0;i<n;i+=2){
  698. a[i+1] += (-a[i-2] + 9 * a[i] + 9 * a[i+2] - a[i+4] + 8)>>4;
  699. }
  700. break;
  701. case SCHRO_WAVELET_HAAR_0:
  702. case SCHRO_WAVELET_HAAR_1:
  703. for(i=0;i<n;i+=2){
  704. a[i] -= (a[i+1] + 1)>>1;
  705. }
  706. for(i=0;i<n;i+=2){
  707. a[i+1] += a[i];
  708. }
  709. break;
  710. case SCHRO_WAVELET_FIDELITY:
  711. extend(a,n);
  712. for(i=0;i<n;i+=2){
  713. a[i+1] += (-2*a[i-6] + 10*a[i-4] - 25*a[i-2] + 81*a[i] +
  714. 81*a[i+2] - 25*a[i+4] + 10*a[i+6] - 2*a[i+8] + 128) >> 8;
  715. }
  716. extend(a,n);
  717. for(i=0;i<n;i+=2){
  718. a[i] -= (-8*a[i-7] + 21*a[i-5] - 46*a[i-3] + 161*a[i-1] +
  719. 161*a[i+1] - 46*a[i+3] + 21*a[i+5] - 8*a[i+7] + 128) >> 8;
  720. }
  721. break;
  722. case SCHRO_WAVELET_DAUBECHIES_9_7:
  723. extend(a,n);
  724. for(i=0;i<n;i+=2){
  725. a[i] -= (1817*a[i-1] + 1817 * a[i+1] + 2048)>>12;
  726. }
  727. extend(a,n);
  728. for(i=0;i<n;i+=2){
  729. a[i+1] -= (3616*a[i] + 3616 * a[i+2] + 2048)>>12;
  730. }
  731. extend(a,n);
  732. for(i=0;i<n;i+=2){
  733. a[i] += (217*a[i-1] + 217 * a[i+1] + 2048)>>12;
  734. }
  735. extend(a,n);
  736. for(i=0;i<n;i+=2){
  737. a[i+1] += (6497*a[i] + 6497 * a[i+2] + 2048)>>12;
  738. }
  739. break;
  740. }
  741. }
  742. void
  743. split (int16_t *a, int n, int filter)
  744. {
  745. int i;
  746. switch (filter) {
  747. case SCHRO_WAVELET_DESLAURIERS_DUBUC_9_7:
  748. extend(a,n);
  749. for(i=0;i<n;i+=2){
  750. a[i + 1] -= (-a[i-2] + 9 * a[i] + 9 * a[i+2] - a[i+4] + 8)>>4;
  751. }
  752. extend(a,n);
  753. for(i=0;i<n;i+=2){
  754. a[i] += (a[i-1] + a[i+1] + 2)>>2;
  755. }
  756. break;
  757. case SCHRO_WAVELET_LE_GALL_5_3:
  758. extend(a,n);
  759. for(i=0;i<n;i+=2){
  760. a[i + 1] -= (a[i] + a[i+2] + 1)>>1;
  761. }
  762. extend(a,n);
  763. for(i=0;i<n;i+=2){
  764. a[i] += (a[i-1] + a[i+1] + 2)>>2;
  765. }
  766. break;
  767. case SCHRO_WAVELET_DESLAURIERS_DUBUC_13_7:
  768. extend(a,n);
  769. for(i=0;i<n;i+=2){
  770. a[i+1] -= (-a[i-2] + 9 * a[i] + 9 * a[i+2] - a[i+4] + 8)>>4;
  771. }
  772. extend(a,n);
  773. for(i=0;i<n;i+=2){
  774. a[i] += (-a[i-3] + 9 * a[i-1] + 9 * a[i+1] - a[i+3] + 16)>>5;
  775. }
  776. break;
  777. case SCHRO_WAVELET_HAAR_0:
  778. case SCHRO_WAVELET_HAAR_1:
  779. for(i=0;i<n;i+=2){
  780. a[i+1] -= a[i];
  781. }
  782. for(i=0;i<n;i+=2){
  783. a[i] += (a[i+1] + 1)>>1;
  784. }
  785. break;
  786. case SCHRO_WAVELET_FIDELITY:
  787. extend(a,n);
  788. for(i=0;i<n;i+=2){
  789. a[i] += (-8*a[i-7] + 21*a[i-5] - 46*a[i-3] + 161*a[i-1] +
  790. 161*a[i+1] - 46*a[i+3] + 21*a[i+5] - 8*a[i+7] + 128) >> 8;
  791. }
  792. extend(a,n);
  793. for(i=0;i<n;i+=2){
  794. a[i+1] -= (-2*a[i-6] + 10*a[i-4] - 25*a[i-2] + 81*a[i] +
  795. 81*a[i+2] - 25*a[i+4] + 10*a[i+6] - 2*a[i+8] + 128) >> 8;
  796. }
  797. break;
  798. case SCHRO_WAVELET_DAUBECHIES_9_7:
  799. extend(a,n);
  800. for(i=0;i<n;i+=2){
  801. a[i+1] -= (6497*a[i] + 6497 * a[i+2] + 2048)>>12;
  802. }
  803. extend(a,n);
  804. for(i=0;i<n;i+=2){
  805. a[i] -= (217*a[i-1] + 217 * a[i+1] + 2048)>>12;
  806. }
  807. extend(a,n);
  808. for(i=0;i<n;i+=2){
  809. a[i+1] += (3616*a[i] + 3616 * a[i+2] + 2048)>>12;
  810. }
  811. extend(a,n);
  812. for(i=0;i<n;i+=2){
  813. a[i] += (1817*a[i-1] + 1817 * a[i+1] + 2048)>>12;
  814. }
  815. break;
  816. }
  817. }