You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

372 lines
10KB

  1. /*
  2. * Discrete wavelet transform
  3. * Copyright (c) 2007 Kamil Nowosad
  4. * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
  5. *
  6. * This file is part of Libav.
  7. *
  8. * Libav is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * Libav is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with Libav; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. /**
  23. * @file
  24. * Discrete wavelet transform
  25. */
  26. #include "libavutil/common.h"
  27. #include "libavutil/mem.h"
  28. #include "jpeg2000dwt.h"
  29. #include "internal.h"
  30. /* Defines for 9/7 DWT lifting parameters.
  31. * Parameters are in float. */
  32. #define F_LFTG_ALPHA 1.586134342059924f
  33. #define F_LFTG_BETA 0.052980118572961f
  34. #define F_LFTG_GAMMA 0.882911075530934f
  35. #define F_LFTG_DELTA 0.443506852043971f
  36. #define F_LFTG_K 1.230174104914001f
  37. #define F_LFTG_X 1.625732422f
  38. /* FIXME: Why use 1.625732422 instead of 1/F_LFTG_K?
  39. * Incorrect value in JPEG2000 norm.
  40. * see (ISO/IEC 15444:1 (version 2002) F.3.8.2 */
  41. /* Lifting parameters in integer format.
  42. * Computed as param = (float param) * (1 << 16) */
  43. #define I_LFTG_ALPHA 103949
  44. #define I_LFTG_BETA 3472
  45. #define I_LFTG_GAMMA 57862
  46. #define I_LFTG_DELTA 29066
  47. #define I_LFTG_K 80621
  48. #define I_LFTG_X 106544
  49. static inline void extend53(int *p, int i0, int i1)
  50. {
  51. p[i0 - 1] = p[i0 + 1];
  52. p[i1] = p[i1 - 2];
  53. p[i0 - 2] = p[i0 + 2];
  54. p[i1 + 1] = p[i1 - 3];
  55. }
  56. static inline void extend97_float(float *p, int i0, int i1)
  57. {
  58. int i;
  59. for (i = 1; i <= 4; i++) {
  60. p[i0 - i] = p[i0 + i];
  61. p[i1 + i - 1] = p[i1 - i - 1];
  62. }
  63. }
  64. static inline void extend97_int(int32_t *p, int i0, int i1)
  65. {
  66. int i;
  67. for (i = 1; i <= 4; i++) {
  68. p[i0 - i] = p[i0 + i];
  69. p[i1 + i - 1] = p[i1 - i - 1];
  70. }
  71. }
  72. static void sr_1d53(int *p, int i0, int i1)
  73. {
  74. int i;
  75. if (i1 == i0 + 1)
  76. return;
  77. extend53(p, i0, i1);
  78. for (i = i0 / 2; i < i1 / 2 + 1; i++)
  79. p[2 * i] -= (p[2 * i - 1] + p[2 * i + 1] + 2) >> 2;
  80. for (i = i0 / 2; i < i1 / 2; i++)
  81. p[2 * i + 1] += (p[2 * i] + p[2 * i + 2]) >> 1;
  82. }
  83. static void dwt_decode53(DWTContext *s, int *t)
  84. {
  85. int lev;
  86. int w = s->linelen[s->ndeclevels - 1][0];
  87. int32_t *line = s->i_linebuf;
  88. line += 3;
  89. for (lev = 0; lev < s->ndeclevels; lev++) {
  90. int lh = s->linelen[lev][0],
  91. lv = s->linelen[lev][1],
  92. mh = s->mod[lev][0],
  93. mv = s->mod[lev][1],
  94. lp;
  95. int *l;
  96. // HOR_SD
  97. l = line + mh;
  98. for (lp = 0; lp < lv; lp++) {
  99. int i, j = 0;
  100. // copy with interleaving
  101. for (i = mh; i < lh; i += 2, j++)
  102. l[i] = t[w * lp + j];
  103. for (i = 1 - mh; i < lh; i += 2, j++)
  104. l[i] = t[w * lp + j];
  105. sr_1d53(line, mh, mh + lh);
  106. for (i = 0; i < lh; i++)
  107. t[w * lp + i] = l[i];
  108. }
  109. // VER_SD
  110. l = line + mv;
  111. for (lp = 0; lp < lh; lp++) {
  112. int i, j = 0;
  113. // copy with interleaving
  114. for (i = mv; i < lv; i += 2, j++)
  115. l[i] = t[w * j + lp];
  116. for (i = 1 - mv; i < lv; i += 2, j++)
  117. l[i] = t[w * j + lp];
  118. sr_1d53(line, mv, mv + lv);
  119. for (i = 0; i < lv; i++)
  120. t[w * i + lp] = l[i];
  121. }
  122. }
  123. }
  124. static void sr_1d97_float(float *p, int i0, int i1)
  125. {
  126. int i;
  127. if (i1 == i0 + 1)
  128. return;
  129. extend97_float(p, i0, i1);
  130. /*step 1*/
  131. for (i = i0 / 2 - 1; i < i1 / 2 + 2; i++)
  132. p[2 * i] *= F_LFTG_K;
  133. /* step 2*/
  134. for (i = i0 / 2 - 2; i < i1 / 2 + 2; i++)
  135. p[2 * i + 1] *= F_LFTG_X;
  136. /* step 3*/
  137. for (i = i0 / 2 - 1; i < i1 / 2 + 2; i++)
  138. p[2 * i] -= F_LFTG_DELTA * (p[2 * i - 1] + p[2 * i + 1]);
  139. /* step 4 */
  140. for (i = i0 / 2 - 1; i < i1 / 2 + 1; i++)
  141. p[2 * i + 1] -= F_LFTG_GAMMA * (p[2 * i] + p[2 * i + 2]);
  142. /*step 5*/
  143. for (i = i0 / 2; i < i1 / 2 + 1; i++)
  144. p[2 * i] += F_LFTG_BETA * (p[2 * i - 1] + p[2 * i + 1]);
  145. /* step 6 */
  146. for (i = i0 / 2; i < i1 / 2; i++)
  147. p[2 * i + 1] += F_LFTG_ALPHA * (p[2 * i] + p[2 * i + 2]);
  148. }
  149. static void dwt_decode97_float(DWTContext *s, float *t)
  150. {
  151. int lev;
  152. int w = s->linelen[s->ndeclevels - 1][0];
  153. float *line = s->f_linebuf;
  154. float *data = t;
  155. /* position at index O of line range [0-5,w+5] cf. extend function */
  156. line += 5;
  157. for (lev = 0; lev < s->ndeclevels; lev++) {
  158. int lh = s->linelen[lev][0],
  159. lv = s->linelen[lev][1],
  160. mh = s->mod[lev][0],
  161. mv = s->mod[lev][1],
  162. lp;
  163. float *l;
  164. // HOR_SD
  165. l = line + mh;
  166. for (lp = 0; lp < lv; lp++) {
  167. int i, j = 0;
  168. // copy with interleaving
  169. for (i = mh; i < lh; i += 2, j++)
  170. l[i] = data[w * lp + j];
  171. for (i = 1 - mh; i < lh; i += 2, j++)
  172. l[i] = data[w * lp + j];
  173. sr_1d97_float(line, mh, mh + lh);
  174. for (i = 0; i < lh; i++)
  175. data[w * lp + i] = l[i];
  176. }
  177. // VER_SD
  178. l = line + mv;
  179. for (lp = 0; lp < lh; lp++) {
  180. int i, j = 0;
  181. // copy with interleaving
  182. for (i = mv; i < lv; i += 2, j++)
  183. l[i] = data[w * j + lp];
  184. for (i = 1 - mv; i < lv; i += 2, j++)
  185. l[i] = data[w * j + lp];
  186. sr_1d97_float(line, mv, mv + lv);
  187. for (i = 0; i < lv; i++)
  188. data[w * i + lp] = l[i];
  189. }
  190. }
  191. }
  192. static void sr_1d97_int(int32_t *p, int i0, int i1)
  193. {
  194. int i;
  195. if (i1 == i0 + 1)
  196. return;
  197. extend97_int(p, i0, i1);
  198. /*step 1*/
  199. for (i = i0 / 2 - 1; i < i1 / 2 + 2; i++)
  200. p[2 * i] = ((p[2 * i] * I_LFTG_K) + (1 << 15)) >> 16;
  201. /* step 2*/
  202. for (i = i0 / 2 - 2; i < i1 / 2 + 2; i++)
  203. p[2 * i + 1] = ((p[2 * i + 1] * I_LFTG_X) + (1 << 15)) >> 16;
  204. /* step 3*/
  205. for (i = i0 / 2 - 1; i < i1 / 2 + 2; i++)
  206. p[2 * i] -= (I_LFTG_DELTA * (p[2 * i - 1] + p[2 * i + 1]) + (1 << 15)) >> 16;
  207. /* step 4 */
  208. for (i = i0 / 2 - 1; i < i1 / 2 + 1; i++)
  209. p[2 * i + 1] -= (I_LFTG_GAMMA * (p[2 * i] + p[2 * i + 2]) + (1 << 15)) >> 16;
  210. /*step 5*/
  211. for (i = i0 / 2; i < i1 / 2 + 1; i++)
  212. p[2 * i] += (I_LFTG_BETA * (p[2 * i - 1] + p[2 * i + 1]) + (1 << 15)) >> 16;
  213. /* step 6 */
  214. for (i = i0 / 2; i < i1 / 2; i++)
  215. p[2 * i + 1] += (I_LFTG_ALPHA * (p[2 * i] + p[2 * i + 2]) + (1 << 15)) >> 16;
  216. }
  217. static void dwt_decode97_int(DWTContext *s, int32_t *t)
  218. {
  219. int lev;
  220. int w = s->linelen[s->ndeclevels - 1][0];
  221. int32_t *line = s->i_linebuf;
  222. int32_t *data = t;
  223. /* position at index O of line range [0-5,w+5] cf. extend function */
  224. line += 5;
  225. for (lev = 0; lev < s->ndeclevels; lev++) {
  226. int lh = s->linelen[lev][0],
  227. lv = s->linelen[lev][1],
  228. mh = s->mod[lev][0],
  229. mv = s->mod[lev][1],
  230. lp;
  231. int32_t *l;
  232. // HOR_SD
  233. l = line + mh;
  234. for (lp = 0; lp < lv; lp++) {
  235. int i, j = 0;
  236. // copy with interleaving
  237. for (i = mh; i < lh; i += 2, j++)
  238. l[i] = data[w * lp + j];
  239. for (i = 1 - mh; i < lh; i += 2, j++)
  240. l[i] = data[w * lp + j];
  241. sr_1d97_int(line, mh, mh + lh);
  242. for (i = 0; i < lh; i++)
  243. data[w * lp + i] = l[i];
  244. }
  245. // VER_SD
  246. l = line + mv;
  247. for (lp = 0; lp < lh; lp++) {
  248. int i, j = 0;
  249. // copy with interleaving
  250. for (i = mv; i < lv; i += 2, j++)
  251. l[i] = data[w * j + lp];
  252. for (i = 1 - mv; i < lv; i += 2, j++)
  253. l[i] = data[w * j + lp];
  254. sr_1d97_int(line, mv, mv + lv);
  255. for (i = 0; i < lv; i++)
  256. data[w * i + lp] = l[i];
  257. }
  258. }
  259. }
  260. int ff_jpeg2000_dwt_init(DWTContext *s, uint16_t border[2][2],
  261. int decomp_levels, int type)
  262. {
  263. int i, j, lev = decomp_levels, maxlen,
  264. b[2][2];
  265. s->ndeclevels = decomp_levels;
  266. s->type = type;
  267. for (i = 0; i < 2; i++)
  268. for (j = 0; j < 2; j++)
  269. b[i][j] = border[i][j];
  270. maxlen = FFMAX(b[0][1] - b[0][0],
  271. b[1][1] - b[1][0]);
  272. while (--lev >= 0)
  273. for (i = 0; i < 2; i++) {
  274. s->linelen[lev][i] = b[i][1] - b[i][0];
  275. s->mod[lev][i] = b[i][0] & 1;
  276. for (j = 0; j < 2; j++)
  277. b[i][j] = (b[i][j] + 1) >> 1;
  278. }
  279. switch (type) {
  280. case FF_DWT97:
  281. s->f_linebuf = av_malloc((maxlen + 12) * sizeof(*s->f_linebuf));
  282. if (!s->f_linebuf)
  283. return AVERROR(ENOMEM);
  284. break;
  285. case FF_DWT97_INT:
  286. s->i_linebuf = av_malloc((maxlen + 12) * sizeof(*s->i_linebuf));
  287. if (!s->i_linebuf)
  288. return AVERROR(ENOMEM);
  289. break;
  290. case FF_DWT53:
  291. s->i_linebuf = av_malloc((maxlen + 6) * sizeof(*s->i_linebuf));
  292. if (!s->i_linebuf)
  293. return AVERROR(ENOMEM);
  294. break;
  295. default:
  296. return -1;
  297. }
  298. return 0;
  299. }
  300. int ff_dwt_decode(DWTContext *s, void *t)
  301. {
  302. switch (s->type) {
  303. case FF_DWT97:
  304. dwt_decode97_float(s, t);
  305. break;
  306. case FF_DWT97_INT:
  307. dwt_decode97_int(s, t);
  308. break;
  309. case FF_DWT53:
  310. dwt_decode53(s, t);
  311. break;
  312. default:
  313. return -1;
  314. }
  315. return 0;
  316. }
  317. void ff_dwt_destroy(DWTContext *s)
  318. {
  319. av_freep(&s->f_linebuf);
  320. av_freep(&s->i_linebuf);
  321. }