snow.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:135k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  */
  18. #include "avcodec.h"
  19. #include "common.h"
  20. #include "dsputil.h"
  21. #include "rangecoder.h"
  22. #define MID_STATE 128
  23. #include "mpegvideo.h"
  24. #undef NDEBUG
  25. #include <assert.h>
  26. #define MAX_DECOMPOSITIONS 8
  27. #define MAX_PLANES 4
  28. #define DWTELEM int
  29. #define QSHIFT 5
  30. #define QROOT (1<<QSHIFT)
  31. #define LOSSLESS_QLOG -128
  32. #define FRAC_BITS 8
  33. static const int8_t quant3[256]={
  34.  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  35.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  36.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  37.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  38.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  39.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  40.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  41.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  42. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  43. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  44. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  45. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  46. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  47. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  48. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  49. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
  50. };
  51. static const int8_t quant3b[256]={
  52.  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  53.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  54.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  55.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  56.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  57.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  58.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  59.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  60. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  61. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  62. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  63. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  64. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  65. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  66. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  67. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  68. };
  69. static const int8_t quant3bA[256]={
  70.  0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  71.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  72.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  73.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  74.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  75.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  76.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  77.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  78.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  79.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  80.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  81.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  82.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  83.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  84.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  85.  1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
  86. };
  87. static const int8_t quant5[256]={
  88.  0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  89.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  90.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  91.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  92.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  93.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  94.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  95.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  96. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  97. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  98. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  99. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  100. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  101. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  102. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  103. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
  104. };
  105. static const int8_t quant7[256]={
  106.  0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  107.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  108.  2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
  109.  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  110.  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  111.  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  112.  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  113.  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  114. -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
  115. -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
  116. -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
  117. -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
  118. -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
  119. -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
  120. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  121. -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
  122. };
  123. static const int8_t quant9[256]={
  124.  0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  125.  3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  126.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  127.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  128.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  129.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  130.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  131.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  132. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  133. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  134. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  135. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  136. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  137. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  138. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
  139. -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
  140. };
  141. static const int8_t quant11[256]={
  142.  0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
  143.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  144.  4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  145.  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  146.  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  147.  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  148.  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  149.  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  150. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  151. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  152. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  153. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  154. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  155. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
  156. -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  157. -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
  158. };
  159. static const int8_t quant13[256]={
  160.  0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  161.  4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  162.  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  163.  5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  164.  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  165.  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  166.  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  167.  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  168. -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
  169. -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
  170. -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
  171. -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
  172. -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
  173. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  174. -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
  175. -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
  176. };
  177. #define LOG2_OBMC_MAX 6
  178. #define OBMC_MAX (1<<(LOG2_OBMC_MAX))
  179. #if 0 //64*cubic
  180. static const uint8_t obmc32[1024]={
  181.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  182.  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  183.  0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
  184.  0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0,
  185.  0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0,
  186.  0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0,
  187.  0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
  188.  0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0,
  189.  0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
  190.  0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0,
  191.  0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
  192.  0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
  193.  0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0,
  194.  0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0,
  195.  0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0,
  196.  0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
  197.  0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
  198.  0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0,
  199.  0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0,
  200.  0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0,
  201.  0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0,
  202.  0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0,
  203.  0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0,
  204.  0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0,
  205.  0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0,
  206.  0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0,
  207.  0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0,
  208.  0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0,
  209.  0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0,
  210.  0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
  211.  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  212.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  213. //error:0.000022
  214. };
  215. static const uint8_t obmc16[256]={
  216.  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  217.  0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
  218.  0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
  219.  0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
  220.  0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
  221.  0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
  222.  1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
  223.  1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
  224.  1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
  225.  1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
  226.  0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
  227.  0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
  228.  0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
  229.  0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
  230.  0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
  231.  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  232. //error:0.000033
  233. };
  234. #elif 1 // 64*linear
  235. static const uint8_t obmc32[1024]={
  236.  0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  237.  0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0,
  238.  0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0,
  239.  0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
  240.  1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1,
  241.  1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1,
  242.  1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
  243.  1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1,
  244.  1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1,
  245.  1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1,
  246.  1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1,
  247.  1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1,
  248.  2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2,
  249.  2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2,
  250.  2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2,
  251.  2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2,
  252.  2, 6,10,14,17,21,25,29,33,37,41,45,48,52,56,60,60,56,52,48,45,41,37,33,29,25,21,17,14,10, 6, 2,
  253.  2, 5, 9,13,16,20,24,27,31,34,38,42,45,49,53,56,56,53,49,45,42,38,34,31,27,24,20,16,13, 9, 5, 2,
  254.  2, 5, 8,12,15,19,22,25,29,32,35,39,42,46,49,52,52,49,46,42,39,35,32,29,25,22,19,15,12, 8, 5, 2,
  255.  2, 5, 8,11,14,17,20,23,27,30,33,36,39,42,45,48,48,45,42,39,36,33,30,27,23,20,17,14,11, 8, 5, 2,
  256.  1, 4, 7,10,13,16,19,22,24,27,30,33,36,39,42,45,45,42,39,36,33,30,27,24,22,19,16,13,10, 7, 4, 1,
  257.  1, 4, 7, 9,12,14,17,20,22,25,28,30,33,35,38,41,41,38,35,33,30,28,25,22,20,17,14,12, 9, 7, 4, 1,
  258.  1, 4, 6, 8,11,13,15,18,20,23,25,27,30,32,34,37,37,34,32,30,27,25,23,20,18,15,13,11, 8, 6, 4, 1,
  259.  1, 3, 5, 7,10,12,14,16,18,20,22,24,27,29,31,33,33,31,29,27,24,22,20,18,16,14,12,10, 7, 5, 3, 1,
  260.  1, 3, 5, 7, 8,10,12,14,16,18,20,22,23,25,27,29,29,27,25,23,22,20,18,16,14,12,10, 8, 7, 5, 3, 1,
  261.  1, 2, 4, 6, 7, 9,11,12,14,15,17,19,20,22,24,25,25,24,22,20,19,17,15,14,12,11, 9, 7, 6, 4, 2, 1,
  262.  1, 2, 3, 5, 6, 8, 9,10,12,13,14,16,17,19,20,21,21,20,19,17,16,14,13,12,10, 9, 8, 6, 5, 3, 2, 1,
  263.  1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,14,15,16,17,17,16,15,14,13,12,11,10, 8, 7, 6, 5, 4, 3, 2, 1,
  264.  0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,14,13,12,11,10, 9, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
  265.  0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9,10,10, 9, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 2, 2, 1, 0,
  266.  0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0,
  267.  0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  268.  //error:0.000020
  269. };
  270. static const uint8_t obmc16[256]={
  271.  0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
  272.  1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
  273.  1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
  274.  2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
  275.  2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
  276.  3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
  277.  3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
  278.  4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
  279.  4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
  280.  3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
  281.  3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
  282.  2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
  283.  2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
  284.  1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
  285.  1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
  286.  0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
  287. //error:0.000015
  288. };
  289. #else //64*cos
  290. static const uint8_t obmc32[1024]={
  291.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  292.  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  293.  0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
  294.  0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0,
  295.  0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0,
  296.  0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0,
  297.  0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
  298.  0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0,
  299.  0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
  300.  0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0,
  301.  0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
  302.  0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
  303.  0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0,
  304.  0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0,
  305.  0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0,
  306.  0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
  307.  0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
  308.  0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0,
  309.  0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0,
  310.  0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0,
  311.  0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0,
  312.  0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0,
  313.  0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0,
  314.  0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0,
  315.  0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0,
  316.  0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0,
  317.  0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0,
  318.  0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0,
  319.  0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0,
  320.  0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0,
  321.  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  322.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  323. //error:0.000022
  324. };
  325. static const uint8_t obmc16[256]={
  326.  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  327.  0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
  328.  0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
  329.  0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
  330.  0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
  331.  1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
  332.  1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
  333.  0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
  334.  0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
  335.  1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
  336.  1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
  337.  0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
  338.  0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
  339.  0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
  340.  0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
  341.  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  342. //error:0.000022
  343. };
  344. #endif
  345. //linear *64
  346. static const uint8_t obmc8[64]={
  347.  1, 3, 5, 7, 7, 5, 3, 1,
  348.  3, 9,15,21,21,15, 9, 3,
  349.  5,15,25,35,35,25,15, 5,
  350.  7,21,35,49,49,35,21, 7,
  351.  7,21,35,49,49,35,21, 7,
  352.  5,15,25,35,35,25,15, 5,
  353.  3, 9,15,21,21,15, 9, 3,
  354.  1, 3, 5, 7, 7, 5, 3, 1,
  355. //error:0.000000
  356. };
  357. //linear *64
  358. static const uint8_t obmc4[16]={
  359.  4,12,12, 4,
  360. 12,36,36,12,
  361. 12,36,36,12,
  362.  4,12,12, 4,
  363. //error:0.000000
  364. };
  365. static const uint8_t *obmc_tab[4]={
  366.     obmc32, obmc16, obmc8, obmc4
  367. };
  368. typedef struct BlockNode{
  369.     int16_t mx;
  370.     int16_t my;
  371.     uint8_t color[3];
  372.     uint8_t type;
  373. //#define TYPE_SPLIT    1
  374. #define BLOCK_INTRA   1
  375. //#define TYPE_NOCOLOR  4
  376.     uint8_t level; //FIXME merge into type?
  377. }BlockNode;
  378. #define LOG2_MB_SIZE 4
  379. #define MB_SIZE (1<<LOG2_MB_SIZE)
  380. typedef struct x_and_coeff{
  381.     int16_t x;
  382.     uint16_t coeff;
  383. } x_and_coeff;
  384. typedef struct SubBand{
  385.     int level;
  386.     int stride;
  387.     int width;
  388.     int height;
  389.     int qlog;                                   ///< log(qscale)/log[2^(1/6)]
  390.     DWTELEM *buf;
  391.     int buf_x_offset;
  392.     int buf_y_offset;
  393.     int stride_line; ///< Stride measured in lines, not pixels.
  394.     x_and_coeff * x_coeff;
  395.     struct SubBand *parent;
  396.     uint8_t state[/*7*2*/ 7 + 512][32];
  397. }SubBand;
  398. typedef struct Plane{
  399.     int width;
  400.     int height;
  401.     SubBand band[MAX_DECOMPOSITIONS][4];
  402. }Plane;
  403. /** Used to minimize the amount of memory used in order to optimize cache performance. **/
  404. typedef struct {
  405.     DWTELEM * * line; ///< For use by idwt and predict_slices.
  406.     DWTELEM * * data_stack; ///< Used for internal purposes.
  407.     int data_stack_top;
  408.     int line_count;
  409.     int line_width;
  410.     int data_count;
  411.     DWTELEM * base_buffer; ///< Buffer that this structure is caching.
  412. } slice_buffer;
  413. typedef struct SnowContext{
  414. //    MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX)
  415.     AVCodecContext *avctx;
  416.     RangeCoder c;
  417.     DSPContext dsp;
  418.     AVFrame input_picture;
  419.     AVFrame current_picture;
  420.     AVFrame last_picture;
  421.     AVFrame mconly_picture;
  422. //     uint8_t q_context[16];
  423.     uint8_t header_state[32];
  424.     uint8_t block_state[128 + 32*128];
  425.     int keyframe;
  426.     int always_reset;
  427.     int version;
  428.     int spatial_decomposition_type;
  429.     int temporal_decomposition_type;
  430.     int spatial_decomposition_count;
  431.     int temporal_decomposition_count;
  432.     DWTELEM *spatial_dwt_buffer;
  433.     int colorspace_type;
  434.     int chroma_h_shift;
  435.     int chroma_v_shift;
  436.     int spatial_scalability;
  437.     int qlog;
  438.     int lambda;
  439.     int lambda2;
  440.     int mv_scale;
  441.     int qbias;
  442. #define QBIAS_SHIFT 3
  443.     int b_width;
  444.     int b_height;
  445.     int block_max_depth;
  446.     Plane plane[MAX_PLANES];
  447.     BlockNode *block;
  448.     slice_buffer sb;
  449.     MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX)
  450. }SnowContext;
  451. typedef struct {
  452.     DWTELEM *b0;
  453.     DWTELEM *b1;
  454.     DWTELEM *b2;
  455.     DWTELEM *b3;
  456.     int y;
  457. } dwt_compose_t;
  458. #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num)))
  459. //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
  460. static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
  461. {
  462.     int i;
  463.   
  464.     buf->base_buffer = base_buffer;
  465.     buf->line_count = line_count;
  466.     buf->line_width = line_width;
  467.     buf->data_count = max_allocated_lines;
  468.     buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
  469.     buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
  470.   
  471.     for (i = 0; i < max_allocated_lines; i++)
  472.     {
  473.       buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
  474.     }
  475.     
  476.     buf->data_stack_top = max_allocated_lines - 1;
  477. }
  478. static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
  479. {
  480.     int i;
  481.     int offset;
  482.     DWTELEM * buffer;
  483.   
  484. //  av_log(NULL, AV_LOG_DEBUG, "Cache hit: %dn", line);  
  485.   
  486.     assert(buf->data_stack_top >= 0);
  487. //  assert(!buf->line[line]);
  488.     if (buf->line[line])
  489.         return buf->line[line];
  490.     
  491.     offset = buf->line_width * line;
  492.     buffer = buf->data_stack[buf->data_stack_top];
  493.     buf->data_stack_top--;
  494.     buf->line[line] = buffer;
  495.   
  496. //  av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %dn", line, buf->data_stack_top + 1);
  497.   
  498.     return buffer;
  499. }
  500. static void slice_buffer_release(slice_buffer * buf, int line)
  501. {
  502.     int i;
  503.     int offset;
  504.     DWTELEM * buffer;
  505.     assert(line >= 0 && line < buf->line_count);
  506.     assert(buf->line[line]);
  507.     offset = buf->line_width * line;
  508.     buffer = buf->line[line];
  509.     buf->data_stack_top++;
  510.     buf->data_stack[buf->data_stack_top] = buffer;
  511.     buf->line[line] = NULL;
  512.   
  513. //  av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %dn", line, buf->data_stack_top + 1);
  514. }
  515. static void slice_buffer_flush(slice_buffer * buf)
  516. {
  517.     int i;
  518.     for (i = 0; i < buf->line_count; i++)
  519.     {
  520.         if (buf->line[i])
  521.         {
  522. //      av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d n", i);
  523.             slice_buffer_release(buf, i);
  524.         }
  525.     }
  526. }
  527. static void slice_buffer_destroy(slice_buffer * buf)
  528. {
  529.     int i;
  530.     slice_buffer_flush(buf);
  531.   
  532.     for (i = buf->data_count - 1; i >= 0; i--)
  533.     {
  534.         assert(buf->data_stack[i]);
  535.         av_free(buf->data_stack[i]);
  536.     }
  537.     assert(buf->data_stack);
  538.     av_free(buf->data_stack);
  539.     assert(buf->line);
  540.     av_free(buf->line);
  541. }
  542. #ifdef __sgi
  543. // Avoid a name clash on SGI IRIX
  544. #undef qexp
  545. #endif
  546. #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
  547. static uint8_t qexp[QROOT];
  548. static inline int mirror(int v, int m){
  549.     if     (v<0) return -v;
  550.     else if(v>m) return 2*m-v;
  551.     else         return v;
  552. }
  553. static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
  554.     int i;
  555.     if(v){
  556.         const int a= ABS(v);
  557.         const int e= av_log2(a);
  558. #if 1
  559.         const int el= FFMIN(e, 10);   
  560.         put_rac(c, state+0, 0);
  561.         for(i=0; i<el; i++){
  562.             put_rac(c, state+1+i, 1);  //1..10
  563.         }
  564.         for(; i<e; i++){
  565.             put_rac(c, state+1+9, 1);  //1..10
  566.         }
  567.         put_rac(c, state+1+FFMIN(i,9), 0);
  568.         for(i=e-1; i>=el; i--){
  569.             put_rac(c, state+22+9, (a>>i)&1); //22..31
  570.         }
  571.         for(; i>=0; i--){
  572.             put_rac(c, state+22+i, (a>>i)&1); //22..31
  573.         }
  574.         if(is_signed)
  575.             put_rac(c, state+11 + el, v < 0); //11..21
  576. #else
  577.         
  578.         put_rac(c, state+0, 0);
  579.         if(e<=9){
  580.             for(i=0; i<e; i++){
  581.                 put_rac(c, state+1+i, 1);  //1..10
  582.             }
  583.             put_rac(c, state+1+i, 0);
  584.             for(i=e-1; i>=0; i--){
  585.                 put_rac(c, state+22+i, (a>>i)&1); //22..31
  586.             }
  587.             if(is_signed)
  588.                 put_rac(c, state+11 + e, v < 0); //11..21
  589.         }else{
  590.             for(i=0; i<e; i++){
  591.                 put_rac(c, state+1+FFMIN(i,9), 1);  //1..10
  592.             }
  593.             put_rac(c, state+1+FFMIN(i,9), 0);
  594.             for(i=e-1; i>=0; i--){
  595.                 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
  596.             }
  597.             if(is_signed)
  598.                 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
  599.         }
  600. #endif
  601.     }else{
  602.         put_rac(c, state+0, 1);
  603.     }
  604. }
  605. static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
  606.     if(get_rac(c, state+0))
  607.         return 0;
  608.     else{
  609.         int i, e, a;
  610.         e= 0;
  611.         while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
  612.             e++;
  613.         }
  614.         a= 1;
  615.         for(i=e-1; i>=0; i--){
  616.             a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
  617.         }
  618.         if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
  619.             return -a;
  620.         else
  621.             return a;
  622.     }
  623. }
  624. static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
  625.     int i;
  626.     int r= log2>=0 ? 1<<log2 : 1;
  627.     assert(v>=0);
  628.     assert(log2>=-4);
  629.     while(v >= r){
  630.         put_rac(c, state+4+log2, 1);
  631.         v -= r;
  632.         log2++;
  633.         if(log2>0) r+=r;
  634.     }
  635.     put_rac(c, state+4+log2, 0);
  636.     
  637.     for(i=log2-1; i>=0; i--){
  638.         put_rac(c, state+31-i, (v>>i)&1);
  639.     }
  640. }
  641. static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
  642.     int i;
  643.     int r= log2>=0 ? 1<<log2 : 1;
  644.     int v=0;
  645.     assert(log2>=-4);
  646.     while(get_rac(c, state+4+log2)){
  647.         v+= r;
  648.         log2++;
  649.         if(log2>0) r+=r;
  650.     }
  651.     
  652.     for(i=log2-1; i>=0; i--){
  653.         v+= get_rac(c, state+31-i)<<i;
  654.     }
  655.     return v;
  656. }
  657. static always_inline void lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
  658.     const int mirror_left= !highpass;
  659.     const int mirror_right= (width&1) ^ highpass;
  660.     const int w= (width>>1) - 1 + (highpass & width);
  661.     int i;
  662. #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
  663.     if(mirror_left){
  664.         dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
  665.         dst += dst_step;
  666.         src += src_step;
  667.     }
  668.     
  669.     for(i=0; i<w; i++){
  670.         dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
  671.     }
  672.     
  673.     if(mirror_right){
  674.         dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
  675.     }
  676. }
  677. static always_inline void lift5(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
  678.     const int mirror_left= !highpass;
  679.     const int mirror_right= (width&1) ^ highpass;
  680.     const int w= (width>>1) - 1 + (highpass & width);
  681.     int i;
  682.     if(mirror_left){
  683.         int r= 3*2*ref[0];
  684.         r += r>>4;
  685.         r += r>>8;
  686.         dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
  687.         dst += dst_step;
  688.         src += src_step;
  689.     }
  690.     
  691.     for(i=0; i<w; i++){
  692.         int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
  693.         r += r>>4;
  694.         r += r>>8;
  695.         dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
  696.     }
  697.     
  698.     if(mirror_right){
  699.         int r= 3*2*ref[w*ref_step];
  700.         r += r>>4;
  701.         r += r>>8;
  702.         dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
  703.     }
  704. }
  705. static always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
  706.     const int mirror_left= !highpass;
  707.     const int mirror_right= (width&1) ^ highpass;
  708.     const int w= (width>>1) - 1 + (highpass & width);
  709.     int i;
  710.     assert(shift == 4);
  711. #define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
  712.     if(mirror_left){
  713.         dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
  714.         dst += dst_step;
  715.         src += src_step;
  716.     }
  717.     
  718.     for(i=0; i<w; i++){
  719.         dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
  720.     }
  721.     
  722.     if(mirror_right){
  723.         dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
  724.     }
  725. }
  726. static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
  727.     int x, i;
  728.     
  729.     for(x=start; x<width; x+=2){
  730.         int64_t sum=0;
  731.         for(i=0; i<n; i++){
  732.             int x2= x + 2*i - n + 1;
  733.             if     (x2<     0) x2= -x2;
  734.             else if(x2>=width) x2= 2*width-x2-2;
  735.             sum += coeffs[i]*(int64_t)dst[x2];
  736.         }
  737.         if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
  738.         else        dst[x] += (sum + (1<<shift)/2)>>shift;
  739.     }
  740. }
  741. static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
  742.     int x, y, i;
  743.     for(y=start; y<height; y+=2){
  744.         for(x=0; x<width; x++){
  745.             int64_t sum=0;
  746.     
  747.             for(i=0; i<n; i++){
  748.                 int y2= y + 2*i - n + 1;
  749.                 if     (y2<      0) y2= -y2;
  750.                 else if(y2>=height) y2= 2*height-y2-2;
  751.                 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
  752.             }
  753.             if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
  754.             else        dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
  755.         }
  756.     }
  757. }
  758. #define SCALEX 1
  759. #define LX0 0
  760. #define LX1 1
  761. #if 0 // more accurate 9/7
  762. #define N1 2
  763. #define SHIFT1 14
  764. #define COEFFS1 (int[]){-25987,-25987}
  765. #define N2 2
  766. #define SHIFT2 19
  767. #define COEFFS2 (int[]){-27777,-27777}
  768. #define N3 2
  769. #define SHIFT3 15
  770. #define COEFFS3 (int[]){28931,28931}
  771. #define N4 2
  772. #define SHIFT4 15
  773. #define COEFFS4 (int[]){14533,14533}
  774. #elif 1 // 13/7 CRF
  775. #define N1 4
  776. #define SHIFT1 4
  777. #define COEFFS1 (int[]){1,-9,-9,1}
  778. #define N2 4
  779. #define SHIFT2 4
  780. #define COEFFS2 (int[]){-1,5,5,-1}
  781. #define N3 0
  782. #define SHIFT3 1
  783. #define COEFFS3 NULL
  784. #define N4 0
  785. #define SHIFT4 1
  786. #define COEFFS4 NULL
  787. #elif 1 // 3/5
  788. #define LX0 1
  789. #define LX1 0
  790. #define SCALEX 0.5
  791. #define N1 2
  792. #define SHIFT1 1
  793. #define COEFFS1 (int[]){1,1}
  794. #define N2 2
  795. #define SHIFT2 2
  796. #define COEFFS2 (int[]){-1,-1}
  797. #define N3 0
  798. #define SHIFT3 0
  799. #define COEFFS3 NULL
  800. #define N4 0
  801. #define SHIFT4 0
  802. #define COEFFS4 NULL
  803. #elif 1 // 11/5 
  804. #define N1 0
  805. #define SHIFT1 1
  806. #define COEFFS1 NULL
  807. #define N2 2
  808. #define SHIFT2 2
  809. #define COEFFS2 (int[]){-1,-1}
  810. #define N3 2
  811. #define SHIFT3 0
  812. #define COEFFS3 (int[]){-1,-1}
  813. #define N4 4
  814. #define SHIFT4 7
  815. #define COEFFS4 (int[]){-5,29,29,-5}
  816. #define SCALEX 4
  817. #elif 1 // 9/7 CDF
  818. #define N1 2
  819. #define SHIFT1 7
  820. #define COEFFS1 (int[]){-203,-203}
  821. #define N2 2
  822. #define SHIFT2 12
  823. #define COEFFS2 (int[]){-217,-217}
  824. #define N3 2
  825. #define SHIFT3 7
  826. #define COEFFS3 (int[]){113,113}
  827. #define N4 2
  828. #define SHIFT4 9
  829. #define COEFFS4 (int[]){227,227}
  830. #define SCALEX 1
  831. #elif 1 // 7/5 CDF
  832. #define N1 0
  833. #define SHIFT1 1
  834. #define COEFFS1 NULL
  835. #define N2 2
  836. #define SHIFT2 2
  837. #define COEFFS2 (int[]){-1,-1}
  838. #define N3 2
  839. #define SHIFT3 0
  840. #define COEFFS3 (int[]){-1,-1}
  841. #define N4 2
  842. #define SHIFT4 4
  843. #define COEFFS4 (int[]){3,3}
  844. #elif 1 // 9/7 MN
  845. #define N1 4
  846. #define SHIFT1 4
  847. #define COEFFS1 (int[]){1,-9,-9,1}
  848. #define N2 2
  849. #define SHIFT2 2
  850. #define COEFFS2 (int[]){1,1}
  851. #define N3 0
  852. #define SHIFT3 1
  853. #define COEFFS3 NULL
  854. #define N4 0
  855. #define SHIFT4 1
  856. #define COEFFS4 NULL
  857. #else // 13/7 CRF
  858. #define N1 4
  859. #define SHIFT1 4
  860. #define COEFFS1 (int[]){1,-9,-9,1}
  861. #define N2 4
  862. #define SHIFT2 4
  863. #define COEFFS2 (int[]){-1,5,5,-1}
  864. #define N3 0
  865. #define SHIFT3 1
  866. #define COEFFS3 NULL
  867. #define N4 0
  868. #define SHIFT4 1
  869. #define COEFFS4 NULL
  870. #endif
  871. static void horizontal_decomposeX(DWTELEM *b, int width){
  872.     DWTELEM temp[width];
  873.     const int width2= width>>1;
  874.     const int w2= (width+1)>>1;
  875.     int A1,A2,A3,A4, x;
  876.     inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
  877.     inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
  878.     inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
  879.     inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
  880.     
  881.     for(x=0; x<width2; x++){
  882.         temp[x   ]= b[2*x    ];
  883.         temp[x+w2]= b[2*x + 1];
  884.     }
  885.     if(width&1)
  886.         temp[x   ]= b[2*x    ];
  887.     memcpy(b, temp, width*sizeof(int));
  888. }
  889. static void horizontal_composeX(DWTELEM *b, int width){
  890.     DWTELEM temp[width];
  891.     const int width2= width>>1;
  892.     int A1,A2,A3,A4, x;
  893.     const int w2= (width+1)>>1;
  894.     memcpy(temp, b, width*sizeof(int));
  895.     for(x=0; x<width2; x++){
  896.         b[2*x    ]= temp[x   ];
  897.         b[2*x + 1]= temp[x+w2];
  898.     }
  899.     if(width&1)
  900.         b[2*x    ]= temp[x   ];
  901.     inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
  902.     inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
  903.     inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
  904.     inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
  905. }
  906. static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
  907.     int x, y;
  908.   
  909.     for(y=0; y<height; y++){
  910.         for(x=0; x<width; x++){
  911.             buffer[y*stride + x] *= SCALEX;
  912.         }
  913.     }
  914.     for(y=0; y<height; y++){
  915.         horizontal_decomposeX(buffer + y*stride, width);
  916.     }
  917.     
  918.     inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
  919.     inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
  920.     inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
  921.     inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);    
  922. }
  923. static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
  924.     int x, y;
  925.   
  926.     inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
  927.     inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
  928.     inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
  929.     inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
  930.     for(y=0; y<height; y++){
  931.         horizontal_composeX(buffer + y*stride, width);
  932.     }
  933.     for(y=0; y<height; y++){
  934.         for(x=0; x<width; x++){
  935.             buffer[y*stride + x] /= SCALEX;
  936.         }
  937.     }
  938. }
  939. static void horizontal_decompose53i(DWTELEM *b, int width){
  940.     DWTELEM temp[width];
  941.     const int width2= width>>1;
  942.     int A1,A2,A3,A4, x;
  943.     const int w2= (width+1)>>1;
  944.     for(x=0; x<width2; x++){
  945.         temp[x   ]= b[2*x    ];
  946.         temp[x+w2]= b[2*x + 1];
  947.     }
  948.     if(width&1)
  949.         temp[x   ]= b[2*x    ];
  950. #if 0
  951.     A2= temp[1       ];
  952.     A4= temp[0       ];
  953.     A1= temp[0+width2];
  954.     A1 -= (A2 + A4)>>1;
  955.     A4 += (A1 + 1)>>1;
  956.     b[0+width2] = A1;
  957.     b[0       ] = A4;
  958.     for(x=1; x+1<width2; x+=2){
  959.         A3= temp[x+width2];
  960.         A4= temp[x+1     ];
  961.         A3 -= (A2 + A4)>>1;
  962.         A2 += (A1 + A3 + 2)>>2;
  963.         b[x+width2] = A3;
  964.         b[x       ] = A2;
  965.         A1= temp[x+1+width2];
  966.         A2= temp[x+2       ];
  967.         A1 -= (A2 + A4)>>1;
  968.         A4 += (A1 + A3 + 2)>>2;
  969.         b[x+1+width2] = A1;
  970.         b[x+1       ] = A4;
  971.     }
  972.     A3= temp[width-1];
  973.     A3 -= A2;
  974.     A2 += (A1 + A3 + 2)>>2;
  975.     b[width -1] = A3;
  976.     b[width2-1] = A2;
  977. #else        
  978.     lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
  979.     lift(b   , temp   , b+w2, 1, 1, 1, width,  1, 2, 2, 0, 0);
  980. #endif
  981. }
  982. static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  983.     int i;
  984.     
  985.     for(i=0; i<width; i++){
  986.         b1[i] -= (b0[i] + b2[i])>>1;
  987.     }
  988. }
  989. static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  990.     int i;
  991.     
  992.     for(i=0; i<width; i++){
  993.         b1[i] += (b0[i] + b2[i] + 2)>>2;
  994.     }
  995. }
  996. static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
  997.     int y;
  998.     DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
  999.     DWTELEM *b1= buffer + mirror(-2  , height-1)*stride;
  1000.   
  1001.     for(y=-2; y<height; y+=2){
  1002.         DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
  1003.         DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
  1004. {START_TIMER
  1005.         if(b1 <= b3)     horizontal_decompose53i(b2, width);
  1006.         if(y+2 < height) horizontal_decompose53i(b3, width);
  1007. STOP_TIMER("horizontal_decompose53i")}
  1008.         
  1009. {START_TIMER
  1010.         if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
  1011.         if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
  1012. STOP_TIMER("vertical_decompose53i*")}
  1013.         
  1014.         b0=b2;
  1015.         b1=b3;
  1016.     }
  1017. }
  1018. #define liftS lift
  1019. #define lift5 lift
  1020. #if 1
  1021. #define W_AM 3
  1022. #define W_AO 0
  1023. #define W_AS 1
  1024. #undef liftS
  1025. #define W_BM 1
  1026. #define W_BO 8
  1027. #define W_BS 4
  1028. #define W_CM 1
  1029. #define W_CO 0
  1030. #define W_CS 0
  1031. #define W_DM 3
  1032. #define W_DO 4
  1033. #define W_DS 3
  1034. #elif 0
  1035. #define W_AM 55
  1036. #define W_AO 16
  1037. #define W_AS 5
  1038. #define W_BM 3
  1039. #define W_BO 32
  1040. #define W_BS 6
  1041. #define W_CM 127
  1042. #define W_CO 64
  1043. #define W_CS 7
  1044. #define W_DM 7
  1045. #define W_DO 8
  1046. #define W_DS 4
  1047. #elif 0
  1048. #define W_AM 97
  1049. #define W_AO 32
  1050. #define W_AS 6
  1051. #define W_BM 63
  1052. #define W_BO 512
  1053. #define W_BS 10
  1054. #define W_CM 13
  1055. #define W_CO 8
  1056. #define W_CS 4
  1057. #define W_DM 15
  1058. #define W_DO 16
  1059. #define W_DS 5
  1060. #else
  1061. #define W_AM 203
  1062. #define W_AO 64
  1063. #define W_AS 7
  1064. #define W_BM 217
  1065. #define W_BO 2048
  1066. #define W_BS 12
  1067. #define W_CM 113
  1068. #define W_CO 64
  1069. #define W_CS 7
  1070. #define W_DM 227
  1071. #define W_DO 128
  1072. #define W_DS 9
  1073. #endif
  1074. static void horizontal_decompose97i(DWTELEM *b, int width){
  1075.     DWTELEM temp[width];
  1076.     const int w2= (width+1)>>1;
  1077.     lift (temp+w2, b    +1, b      , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
  1078.     liftS(temp   , b      , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
  1079.     lift5(b   +w2, temp+w2, temp   , 1, 1, 1, width,  W_CM, W_CO, W_CS, 1, 0);
  1080.     lift (b      , temp   , b   +w2, 1, 1, 1, width,  W_DM, W_DO, W_DS, 0, 0);
  1081. }
  1082. static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1083.     int i;
  1084.     
  1085.     for(i=0; i<width; i++){
  1086.         b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
  1087.     }
  1088. }
  1089. static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1090.     int i;
  1091.     
  1092.     for(i=0; i<width; i++){
  1093. #ifdef lift5
  1094.         b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
  1095. #else
  1096.         int r= 3*(b0[i] + b2[i]);
  1097.         r+= r>>4;
  1098.         r+= r>>8;
  1099.         b1[i] += (r+W_CO)>>W_CS;
  1100. #endif
  1101.     }
  1102. }
  1103. static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1104.     int i;
  1105.     
  1106.     for(i=0; i<width; i++){
  1107. #ifdef liftS
  1108.         b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
  1109. #else
  1110.         b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
  1111. #endif
  1112.     }
  1113. }
  1114. static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1115.     int i;
  1116.     
  1117.     for(i=0; i<width; i++){
  1118.         b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
  1119.     }
  1120. }
  1121. static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
  1122.     int y;
  1123.     DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
  1124.     DWTELEM *b1= buffer + mirror(-4  , height-1)*stride;
  1125.     DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
  1126.     DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
  1127.   
  1128.     for(y=-4; y<height; y+=2){
  1129.         DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
  1130.         DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
  1131. {START_TIMER
  1132.         if(b3 <= b5)     horizontal_decompose97i(b4, width);
  1133.         if(y+4 < height) horizontal_decompose97i(b5, width);
  1134. if(width>400){
  1135. STOP_TIMER("horizontal_decompose97i")
  1136. }}
  1137.         
  1138. {START_TIMER
  1139.         if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
  1140.         if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
  1141.         if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
  1142.         if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
  1143. if(width>400){
  1144. STOP_TIMER("vertical_decompose97i")
  1145. }}
  1146.         
  1147.         b0=b2;
  1148.         b1=b3;
  1149.         b2=b4;
  1150.         b3=b5;
  1151.     }
  1152. }
  1153. void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
  1154.     int level;
  1155.     
  1156.     for(level=0; level<decomposition_count; level++){
  1157.         switch(type){
  1158.         case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
  1159.         case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
  1160.         case 2: spatial_decomposeX  (buffer, width>>level, height>>level, stride<<level); break;
  1161.         }
  1162.     }
  1163. }
  1164. static void horizontal_compose53i(DWTELEM *b, int width){
  1165.     DWTELEM temp[width];
  1166.     const int width2= width>>1;
  1167.     const int w2= (width+1)>>1;
  1168.     int A1,A2,A3,A4, x;
  1169. #if 0
  1170.     A2= temp[1       ];
  1171.     A4= temp[0       ];
  1172.     A1= temp[0+width2];
  1173.     A1 -= (A2 + A4)>>1;
  1174.     A4 += (A1 + 1)>>1;
  1175.     b[0+width2] = A1;
  1176.     b[0       ] = A4;
  1177.     for(x=1; x+1<width2; x+=2){
  1178.         A3= temp[x+width2];
  1179.         A4= temp[x+1     ];
  1180.         A3 -= (A2 + A4)>>1;
  1181.         A2 += (A1 + A3 + 2)>>2;
  1182.         b[x+width2] = A3;
  1183.         b[x       ] = A2;
  1184.         A1= temp[x+1+width2];
  1185.         A2= temp[x+2       ];
  1186.         A1 -= (A2 + A4)>>1;
  1187.         A4 += (A1 + A3 + 2)>>2;
  1188.         b[x+1+width2] = A1;
  1189.         b[x+1       ] = A4;
  1190.     }
  1191.     A3= temp[width-1];
  1192.     A3 -= A2;
  1193.     A2 += (A1 + A3 + 2)>>2;
  1194.     b[width -1] = A3;
  1195.     b[width2-1] = A2;
  1196. #else   
  1197.     lift(temp   , b   , b+w2, 1, 1, 1, width,  1, 2, 2, 0, 1);
  1198.     lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
  1199. #endif
  1200.     for(x=0; x<width2; x++){
  1201.         b[2*x    ]= temp[x   ];
  1202.         b[2*x + 1]= temp[x+w2];
  1203.     }
  1204.     if(width&1)
  1205.         b[2*x    ]= temp[x   ];
  1206. }
  1207. static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1208.     int i;
  1209.     
  1210.     for(i=0; i<width; i++){
  1211.         b1[i] += (b0[i] + b2[i])>>1;
  1212.     }
  1213. }
  1214. static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1215.     int i;
  1216.     
  1217.     for(i=0; i<width; i++){
  1218.         b1[i] -= (b0[i] + b2[i] + 2)>>2;
  1219.     }
  1220. }
  1221. static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
  1222.     cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
  1223.     cs->b1 = slice_buffer_get_line(sb, mirror(-1  , height-1) * stride_line);
  1224.     cs->y = -1;
  1225. }
  1226. static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
  1227.     cs->b0 = buffer + mirror(-1-1, height-1)*stride;
  1228.     cs->b1 = buffer + mirror(-1  , height-1)*stride;
  1229.     cs->y = -1;
  1230. }
  1231. static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
  1232.     int y= cs->y;
  1233.     int mirror0 = mirror(y-1, height-1);
  1234.     int mirror1 = mirror(y  , height-1);
  1235.     int mirror2 = mirror(y+1, height-1);
  1236.     int mirror3 = mirror(y+2, height-1);
  1237.     
  1238.     DWTELEM *b0= cs->b0;
  1239.     DWTELEM *b1= cs->b1;
  1240.     DWTELEM *b2= slice_buffer_get_line(sb, mirror2 * stride_line);
  1241.     DWTELEM *b3= slice_buffer_get_line(sb, mirror3 * stride_line);
  1242. {START_TIMER
  1243.         if(mirror1 <= mirror3) vertical_compose53iL0(b1, b2, b3, width);
  1244.         if(mirror0 <= mirror2) vertical_compose53iH0(b0, b1, b2, width);
  1245. STOP_TIMER("vertical_compose53i*")}
  1246. {START_TIMER
  1247.         if(y-1 >= 0) horizontal_compose53i(b0, width);
  1248.         if(mirror0 <= mirror2) horizontal_compose53i(b1, width);
  1249. STOP_TIMER("horizontal_compose53i")}
  1250.     cs->b0 = b2;
  1251.     cs->b1 = b3;
  1252.     cs->y += 2;
  1253. }
  1254. static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
  1255.     int y= cs->y;
  1256.     DWTELEM *b0= cs->b0;
  1257.     DWTELEM *b1= cs->b1;
  1258.     DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
  1259.     DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
  1260. {START_TIMER
  1261.         if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
  1262.         if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
  1263. STOP_TIMER("vertical_compose53i*")}
  1264. {START_TIMER
  1265.         if(y-1 >= 0) horizontal_compose53i(b0, width);
  1266.         if(b0 <= b2) horizontal_compose53i(b1, width);
  1267. STOP_TIMER("horizontal_compose53i")}
  1268.     cs->b0 = b2;
  1269.     cs->b1 = b3;
  1270.     cs->y += 2;
  1271. }
  1272. static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
  1273.     dwt_compose_t cs;
  1274.     spatial_compose53i_init(&cs, buffer, height, stride);
  1275.     while(cs.y <= height)
  1276.         spatial_compose53i_dy(&cs, buffer, width, height, stride);
  1277. }   
  1278.  
  1279. static void horizontal_compose97i(DWTELEM *b, int width){
  1280.     DWTELEM temp[width];
  1281.     const int w2= (width+1)>>1;
  1282.     lift (temp   , b      , b   +w2, 1, 1, 1, width,  W_DM, W_DO, W_DS, 0, 1);
  1283.     lift5(temp+w2, b   +w2, temp   , 1, 1, 1, width,  W_CM, W_CO, W_CS, 1, 1);
  1284.     liftS(b      , temp   , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
  1285.     lift (b+1    , temp+w2, b      , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
  1286. }
  1287. static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1288.     int i;
  1289.     
  1290.     for(i=0; i<width; i++){
  1291.         b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
  1292.     }
  1293. }
  1294. static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1295.     int i;
  1296.     
  1297.     for(i=0; i<width; i++){
  1298. #ifdef lift5
  1299.         b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
  1300. #else
  1301.         int r= 3*(b0[i] + b2[i]);
  1302.         r+= r>>4;
  1303.         r+= r>>8;
  1304.         b1[i] -= (r+W_CO)>>W_CS;
  1305. #endif
  1306.     }
  1307. }
  1308. static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1309.     int i;
  1310.     
  1311.     for(i=0; i<width; i++){
  1312. #ifdef liftS
  1313.         b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
  1314. #else
  1315.         b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
  1316. #endif
  1317.     }
  1318. }
  1319. static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
  1320.     int i;
  1321.     
  1322.     for(i=0; i<width; i++){
  1323.         b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
  1324.     }
  1325. }
  1326. static void vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
  1327.     int i;
  1328.     
  1329.     for(i=0; i<width; i++){
  1330.         int r;
  1331.         b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
  1332. #ifdef lift5
  1333.         b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
  1334. #else
  1335.         r= 3*(b2[i] + b4[i]);
  1336.         r+= r>>4;
  1337.         r+= r>>8;
  1338.         b3[i] -= (r+W_CO)>>W_CS;
  1339. #endif
  1340. #ifdef liftS
  1341.         b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
  1342. #else
  1343.         b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
  1344. #endif
  1345.         b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
  1346.     }
  1347. }
  1348. static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
  1349.     cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
  1350.     cs->b1 = slice_buffer_get_line(sb, mirror(-3  , height-1) * stride_line);
  1351.     cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
  1352.     cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
  1353.     cs->y = -3;
  1354. }
  1355. static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
  1356.     cs->b0 = buffer + mirror(-3-1, height-1)*stride;
  1357.     cs->b1 = buffer + mirror(-3  , height-1)*stride;
  1358.     cs->b2 = buffer + mirror(-3+1, height-1)*stride;
  1359.     cs->b3 = buffer + mirror(-3+2, height-1)*stride;
  1360.     cs->y = -3;
  1361. }
  1362. static void spatial_compose97i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
  1363.     int y = cs->y;
  1364.     
  1365.     int mirror0 = mirror(y - 1, height - 1);
  1366.     int mirror1 = mirror(y + 0, height - 1);
  1367.     int mirror2 = mirror(y + 1, height - 1);
  1368.     int mirror3 = mirror(y + 2, height - 1);
  1369.     int mirror4 = mirror(y + 3, height - 1);
  1370.     int mirror5 = mirror(y + 4, height - 1);
  1371.     DWTELEM *b0= cs->b0;
  1372.     DWTELEM *b1= cs->b1;
  1373.     DWTELEM *b2= cs->b2;
  1374.     DWTELEM *b3= cs->b3;
  1375.     DWTELEM *b4= slice_buffer_get_line(sb, mirror4 * stride_line);
  1376.     DWTELEM *b5= slice_buffer_get_line(sb, mirror5 * stride_line);
  1377.         
  1378. {START_TIMER
  1379.     if(y>0 && y+4<height){
  1380.         vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
  1381.     }else{
  1382.         if(mirror3 <= mirror5) vertical_compose97iL1(b3, b4, b5, width);
  1383.         if(mirror2 <= mirror4) vertical_compose97iH1(b2, b3, b4, width);
  1384.         if(mirror1 <= mirror3) vertical_compose97iL0(b1, b2, b3, width);
  1385.         if(mirror0 <= mirror2) vertical_compose97iH0(b0, b1, b2, width);
  1386.     }
  1387. if(width>400){
  1388. STOP_TIMER("vertical_compose97i")}}
  1389. {START_TIMER
  1390.         if(y-1>=  0) horizontal_compose97i(b0, width);
  1391.         if(mirror0 <= mirror2) horizontal_compose97i(b1, width);
  1392. if(width>400 && mirror0 <= mirror2){
  1393. STOP_TIMER("horizontal_compose97i")}}
  1394.     cs->b0=b2;
  1395.     cs->b1=b3;
  1396.     cs->b2=b4;
  1397.     cs->b3=b5;
  1398.     cs->y += 2;
  1399. }
  1400. static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
  1401.     int y = cs->y;
  1402.     DWTELEM *b0= cs->b0;
  1403.     DWTELEM *b1= cs->b1;
  1404.     DWTELEM *b2= cs->b2;
  1405.     DWTELEM *b3= cs->b3;
  1406.     DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
  1407.     DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
  1408.         if(stride == width && y+4 < height && 0){ 
  1409.             int x;
  1410.             for(x=0; x<width/2; x++)
  1411.                 b5[x] += 64*2;
  1412.             for(; x<width; x++)
  1413.                 b5[x] += 169*2;
  1414.         }
  1415.         
  1416. {START_TIMER
  1417.         if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
  1418.         if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
  1419.         if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
  1420.         if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
  1421. if(width>400){
  1422. STOP_TIMER("vertical_compose97i")}}
  1423. {START_TIMER
  1424.         if(y-1>=  0) horizontal_compose97i(b0, width);
  1425.         if(b0 <= b2) horizontal_compose97i(b1, width);
  1426. if(width>400 && b0 <= b2){
  1427. STOP_TIMER("horizontal_compose97i")}}
  1428.     cs->b0=b2;
  1429.     cs->b1=b3;
  1430.     cs->b2=b4;
  1431.     cs->b3=b5;
  1432.     cs->y += 2;
  1433. }
  1434. static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
  1435.     dwt_compose_t cs;
  1436.     spatial_compose97i_init(&cs, buffer, height, stride);
  1437.     while(cs.y <= height)
  1438.         spatial_compose97i_dy(&cs, buffer, width, height, stride);
  1439. }
  1440. void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){
  1441.     int level;
  1442.     for(level=decomposition_count-1; level>=0; level--){
  1443.         switch(type){
  1444.         case 0: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
  1445.         case 1: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
  1446.         /* not slicified yet */
  1447.         case 2: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
  1448.           av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.n"); break;
  1449.         }
  1450.     }
  1451. }
  1452. void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
  1453.     int level;
  1454.     for(level=decomposition_count-1; level>=0; level--){
  1455.         switch(type){
  1456.         case 0: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
  1457.         case 1: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
  1458.         /* not slicified yet */
  1459.         case 2: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
  1460.         }
  1461.     }
  1462. }
  1463. void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
  1464.     const int support = type==1 ? 3 : 5;
  1465.     int level;
  1466.     if(type==2) return;
  1467.     for(level=decomposition_count-1; level>=0; level--){
  1468.         while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
  1469.             switch(type){
  1470.             case 0: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
  1471.                     break;
  1472.             case 1: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
  1473.                     break;
  1474.             case 2: break;
  1475.             }
  1476.         }
  1477.     }
  1478. }
  1479. void ff_spatial_idwt_buffered_slice(dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
  1480.     const int support = type==1 ? 3 : 5;
  1481.     int level;
  1482.     if(type==2) return;
  1483.     for(level=decomposition_count-1; level>=0; level--){
  1484.         while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
  1485.             switch(type){
  1486.             case 0: spatial_compose97i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
  1487.                     break;
  1488.             case 1: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
  1489.                     break;
  1490.             case 2: break;
  1491.             }
  1492.         }
  1493.     }
  1494. }
  1495. void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
  1496.     if(type==2){
  1497.         int level;
  1498.         for(level=decomposition_count-1; level>=0; level--)
  1499.             spatial_composeX  (buffer, width>>level, height>>level, stride<<level);
  1500.     }else{
  1501.         dwt_compose_t cs[MAX_DECOMPOSITIONS];
  1502.         int y;
  1503.         ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
  1504.         for(y=0; y<height; y+=4)
  1505.             ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
  1506.     }
  1507. }
  1508. static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
  1509.     const int w= b->width;
  1510.     const int h= b->height;
  1511.     int x, y;
  1512.     if(1){
  1513.         int run=0;
  1514.         int runs[w*h];
  1515.         int run_index=0;
  1516.         int max_index;
  1517.                 
  1518.         for(y=0; y<h; y++){
  1519.             for(x=0; x<w; x++){
  1520.                 int v, p=0;
  1521.                 int /*ll=0, */l=0, lt=0, t=0, rt=0;
  1522.                 v= src[x + y*stride];
  1523.                 if(y){
  1524.                     t= src[x + (y-1)*stride];
  1525.                     if(x){
  1526.                         lt= src[x - 1 + (y-1)*stride];
  1527.                     }
  1528.                     if(x + 1 < w){
  1529.                         rt= src[x + 1 + (y-1)*stride];
  1530.                     }
  1531.                 }
  1532.                 if(x){
  1533.                     l= src[x - 1 + y*stride];
  1534.                     /*if(x > 1){
  1535.                         if(orientation==1) ll= src[y + (x-2)*stride];
  1536.                         else               ll= src[x - 2 + y*stride];
  1537.                     }*/
  1538.                 }
  1539.                 if(parent){
  1540.                     int px= x>>1;
  1541.                     int py= y>>1;
  1542.                     if(px<b->parent->width && py<b->parent->height) 
  1543.                         p= parent[px + py*2*stride];
  1544.                 }
  1545.                 if(!(/*ll|*/l|lt|t|rt|p)){
  1546.                     if(v){
  1547.                         runs[run_index++]= run;
  1548.                         run=0;
  1549.                     }else{
  1550.                         run++;
  1551.                     }
  1552.                 }
  1553.             }
  1554.         }
  1555.         max_index= run_index;
  1556.         runs[run_index++]= run;
  1557.         run_index=0;
  1558.         run= runs[run_index++];
  1559.         put_symbol2(&s->c, b->state[30], max_index, 0);
  1560.         if(run_index <= max_index)
  1561.             put_symbol2(&s->c, b->state[1], run, 3);
  1562.         
  1563.         for(y=0; y<h; y++){
  1564.             if(s->c.bytestream_end - s->c.bytestream < w*40){
  1565.                 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too largen");
  1566.                 return -1;
  1567.             }
  1568.             for(x=0; x<w; x++){
  1569.                 int v, p=0;
  1570.                 int /*ll=0, */l=0, lt=0, t=0, rt=0;
  1571.                 v= src[x + y*stride];
  1572.                 if(y){
  1573.                     t= src[x + (y-1)*stride];
  1574.                     if(x){
  1575.                         lt= src[x - 1 + (y-1)*stride];
  1576.                     }
  1577.                     if(x + 1 < w){
  1578.                         rt= src[x + 1 + (y-1)*stride];
  1579.                     }
  1580.                 }
  1581.                 if(x){
  1582.                     l= src[x - 1 + y*stride];
  1583.                     /*if(x > 1){
  1584.                         if(orientation==1) ll= src[y + (x-2)*stride];
  1585.                         else               ll= src[x - 2 + y*stride];
  1586.                     }*/
  1587.                 }
  1588.                 if(parent){
  1589.                     int px= x>>1;
  1590.                     int py= y>>1;
  1591.                     if(px<b->parent->width && py<b->parent->height) 
  1592.                         p= parent[px + py*2*stride];
  1593.                 }
  1594.                 if(/*ll|*/l|lt|t|rt|p){
  1595.                     int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
  1596.                     put_rac(&s->c, &b->state[0][context], !!v);
  1597.                 }else{
  1598.                     if(!run){
  1599.                         run= runs[run_index++];
  1600.                         if(run_index <= max_index)
  1601.                             put_symbol2(&s->c, b->state[1], run, 3);
  1602.                         assert(v);
  1603.                     }else{
  1604.                         run--;
  1605.                         assert(!v);
  1606.                     }
  1607.                 }
  1608.                 if(v){
  1609.                     int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
  1610.                     int l2= 2*ABS(l) + (l<0);
  1611.                     int t2= 2*ABS(t) + (t<0);
  1612.                     put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
  1613.                     put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
  1614.                 }
  1615.             }
  1616.         }
  1617.     }
  1618.     return 0;
  1619. }
  1620. static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){    
  1621. //    encode_subband_qtree(s, b, src, parent, stride, orientation);
  1622. //    encode_subband_z0run(s, b, src, parent, stride, orientation);
  1623.     return encode_subband_c0run(s, b, src, parent, stride, orientation);
  1624. //    encode_subband_dzr(s, b, src, parent, stride, orientation);
  1625. }
  1626. static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
  1627.     const int w= b->width;
  1628.     const int h= b->height;
  1629.     int x,y;
  1630.     
  1631.     if(1){
  1632.         int run, runs;
  1633.         x_and_coeff *xc= b->x_coeff;
  1634.         x_and_coeff *prev_xc= NULL;
  1635.         x_and_coeff *prev2_xc= xc;
  1636.         x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
  1637.         x_and_coeff *prev_parent_xc= parent_xc;
  1638.         runs= get_symbol2(&s->c, b->state[30], 0);
  1639.         if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
  1640.         else           run= INT_MAX;
  1641.         for(y=0; y<h; y++){
  1642.             int v=0;
  1643.             int lt=0, t=0, rt=0;
  1644.             if(y && prev_xc->x == 0){
  1645.                 rt= prev_xc->coeff;
  1646.             }
  1647.             for(x=0; x<w; x++){
  1648.                 int p=0;
  1649.                 const int l= v;
  1650.                 
  1651.                 lt= t; t= rt;
  1652.                 if(y){
  1653.                     if(prev_xc->x <= x)
  1654.                         prev_xc++;
  1655.                     if(prev_xc->x == x + 1)
  1656.                         rt= prev_xc->coeff;
  1657.                     else
  1658.                         rt=0;
  1659.                 }
  1660.                 if(parent_xc){
  1661.                     if(x>>1 > parent_xc->x){
  1662.                         parent_xc++;
  1663.                     }
  1664.                     if(x>>1 == parent_xc->x){
  1665.                         p= parent_xc->coeff;
  1666.                     }
  1667.                 }
  1668.                 if(/*ll|*/l|lt|t|rt|p){
  1669.                     int context= av_log2(/*ABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
  1670.                     v=get_rac(&s->c, &b->state[0][context]);
  1671.                     if(v){
  1672.                         v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
  1673.                         v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
  1674.                         
  1675.                         xc->x=x;
  1676.                         (xc++)->coeff= v;
  1677.                     }
  1678.                 }else{
  1679.                     if(!run){
  1680.                         if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
  1681.                         else           run= INT_MAX;
  1682.                         v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
  1683.                         v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
  1684.                         
  1685.                         xc->x=x;
  1686.                         (xc++)->coeff= v;
  1687.                     }else{
  1688.                         int max_run;
  1689.                         run--;
  1690.                         v=0;
  1691.                         if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
  1692.                         else  max_run= FFMIN(run, w-x-1);
  1693.                         if(parent_xc)
  1694.                             max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
  1695.                         x+= max_run;
  1696.                         run-= max_run;
  1697.                     }
  1698.                 }
  1699.             }
  1700.             (xc++)->x= w+1; //end marker
  1701.             prev_xc= prev2_xc;
  1702.             prev2_xc= xc;
  1703.             
  1704.             if(parent_xc){
  1705.                 if(y&1){
  1706.                     while(parent_xc->x != parent->width+1)
  1707.                         parent_xc++;
  1708.                     parent_xc++;
  1709.                     prev_parent_xc= parent_xc;
  1710.                 }else{
  1711.                     parent_xc= prev_parent_xc;
  1712.                 }
  1713.             }
  1714.         }
  1715.         (xc++)->x= w+1; //end marker
  1716.     }
  1717. }
  1718. static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
  1719.     const int w= b->width;
  1720.     int x,y;
  1721.     const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
  1722.     int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
  1723.     int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
  1724.     int new_index = 0;
  1725.     
  1726.     START_TIMER
  1727.     if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
  1728.         qadd= 0;
  1729.         qmul= 1<<QEXPSHIFT;
  1730.     }
  1731.     /* If we are on the second or later slice, restore our index. */
  1732.     if (start_y != 0)
  1733.         new_index = save_state[0];
  1734.         
  1735.     for(y=start_y; y<h; y++){
  1736.         int x = 0;
  1737.         int v;
  1738.         DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
  1739.         memset(line, 0, b->width*sizeof(DWTELEM));
  1740.         v = b->x_coeff[new_index].coeff;
  1741.         x = b->x_coeff[new_index++].x;
  1742.         while(x < w)
  1743.         {
  1744.             register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
  1745.             register int u= -(v&1);
  1746.             line[x] = (t^u) - u;
  1747.             v = b->x_coeff[new_index].coeff;
  1748.             x = b->x_coeff[new_index++].x;
  1749.         }
  1750.     }
  1751.     if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
  1752.         STOP_TIMER("decode_subband")
  1753.     }
  1754.         
  1755.     /* Save our variables for the next slice. */
  1756.     save_state[0] = new_index;
  1757.         
  1758.     return;
  1759. }
  1760. static void reset_contexts(SnowContext *s){
  1761.     int plane_index, level, orientation;
  1762.     for(plane_index=0; plane_index<3; plane_index++){
  1763.         for(level=0; level<s->spatial_decomposition_count; level++){
  1764.             for(orientation=level ? 1:0; orientation<4; orientation++){
  1765.                 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
  1766.             }
  1767.         }
  1768.     }
  1769.     memset(s->header_state, MID_STATE, sizeof(s->header_state));
  1770.     memset(s->block_state, MID_STATE, sizeof(s->block_state));
  1771. }
  1772. static int alloc_blocks(SnowContext *s){
  1773.     int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
  1774.     int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
  1775.     
  1776.     s->b_width = w;
  1777.     s->b_height= h;
  1778.     
  1779.     s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
  1780.     return 0;
  1781. }
  1782. static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
  1783.     uint8_t *bytestream= d->bytestream;
  1784.     uint8_t *bytestream_start= d->bytestream_start;
  1785.     *d= *s;
  1786.     d->bytestream= bytestream;
  1787.     d->bytestream_start= bytestream_start;
  1788. }
  1789. //near copy & paste from dsputil, FIXME
  1790. static int pix_sum(uint8_t * pix, int line_size, int w)
  1791. {
  1792.     int s, i, j;
  1793.     s = 0;
  1794.     for (i = 0; i < w; i++) {
  1795.         for (j = 0; j < w; j++) {
  1796.             s += pix[0];
  1797.             pix ++;
  1798.         }
  1799.         pix += line_size - w;
  1800.     }
  1801.     return s;
  1802. }
  1803. //near copy & paste from dsputil, FIXME
  1804. static int pix_norm1(uint8_t * pix, int line_size, int w)
  1805. {
  1806.     int s, i, j;
  1807.     uint32_t *sq = squareTbl + 256;
  1808.     s = 0;
  1809.     for (i = 0; i < w; i++) {
  1810.         for (j = 0; j < w; j ++) {
  1811.             s += sq[pix[0]];
  1812.             pix ++;
  1813.         }
  1814.         pix += line_size - w;
  1815.     }
  1816.     return s;
  1817. }
  1818. static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int type){
  1819.     const int w= s->b_width << s->block_max_depth;
  1820.     const int rem_depth= s->block_max_depth - level;
  1821.     const int index= (x + y*w) << rem_depth;
  1822.     const int block_w= 1<<rem_depth;
  1823.     BlockNode block;
  1824.     int i,j;
  1825.     
  1826.     block.color[0]= l;
  1827.     block.color[1]= cb;
  1828.     block.color[2]= cr;
  1829.     block.mx= mx;
  1830.     block.my= my;
  1831.     block.type= type;
  1832.     block.level= level;
  1833.     for(j=0; j<block_w; j++){
  1834.         for(i=0; i<block_w; i++){