annotate snow.c @ 2160:11e1425b3a66 libavcodec

cleanup
author michael
date Mon, 02 Aug 2004 18:01:03 +0000
parents 7f42295c1517
children ec7789e19e43
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1 /*
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3 *
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
4 * This library is free software; you can redistribute it and/or
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
5 * modify it under the terms of the GNU Lesser General Public
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
6 * License as published by the Free Software Foundation; either
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
7 * version 2 of the License, or (at your option) any later version.
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
8 *
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
9 * This library is distributed in the hope that it will be useful,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
12 * Lesser General Public License for more details.
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
13 *
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
14 * You should have received a copy of the GNU Lesser General Public
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
15 * License along with this library; if not, write to the Free Software
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
17 */
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
18
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
19 #include "avcodec.h"
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
20 #include "common.h"
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
21 #include "dsputil.h"
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
22 #include "cabac.h"
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
23
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
24 #include "mpegvideo.h"
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
25
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
26 #undef NDEBUG
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
27 #include <assert.h>
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
28
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
29 #define MAX_DECOMPOSITIONS 8
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
30 #define MAX_PLANES 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
31 #define DWTELEM int
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
32 #define QROOT 8
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
33
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
34 static const int8_t quant3[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
35 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
43 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
44 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
51 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
52 static const int8_t quant3b[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
53 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
54 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
55 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
62 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
63 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
64 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
69 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
70 static const int8_t quant5[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
71 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
72 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
73 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
74 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
75 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
79 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
80 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
81 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
82 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
83 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
84 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
85 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
86 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
87 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
88 static const int8_t quant7[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
89 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
90 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
91 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
92 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
93 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
94 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
95 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
96 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
97 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
98 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
99 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
100 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
101 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
102 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
103 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
104 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
105 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
106 static const int8_t quant9[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
107 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
108 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
109 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
110 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
111 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
112 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
115 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
116 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
117 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
118 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
119 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
120 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
121 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
122 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
123 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
124 static const int8_t quant11[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
125 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
126 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
127 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
128 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
129 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
130 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
131 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
132 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
133 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
134 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
135 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
136 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
137 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
138 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
139 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
140 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
141 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
142 static const int8_t quant13[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
143 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
144 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
145 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
146 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
147 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
148 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
149 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
150 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
151 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
152 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
153 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
154 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
155 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
156 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
157 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
158 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
159 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
160
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
161 #define OBMC_MAX 64
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
162 #if 0 //64*cubic
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
163 static const uint8_t obmc32[1024]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
164 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
165 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
166 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
167 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
168 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
169 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
170 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
171 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
172 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
173 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
174 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
175 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
176 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
177 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
178 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
179 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
180 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
181 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
182 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
183 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
184 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
185 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
186 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
187 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
189 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
190 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
191 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
192 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
193 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
194 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
195 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
196 //error:0.000022
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
197 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
198 static const uint8_t obmc16[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
199 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
200 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
201 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
202 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
203 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
204 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
205 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
206 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
207 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
208 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
209 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
210 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
211 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
212 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
213 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
214 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
215 //error:0.000033
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
216 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
217 #elif 1 // 64*linear
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
218 static const uint8_t obmc32[1024]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
219 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
220 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
221 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
222 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
223 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
224 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
225 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
226 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
227 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
228 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
229 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
230 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
231 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
232 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
233 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
234 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
235 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
236 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
237 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
238 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
239 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
240 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
241 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
242 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
244 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
245 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
246 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
247 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
248 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
249 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
250 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
251 //error:0.000020
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
252 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
253 static const uint8_t obmc16[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
254 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
255 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
256 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
257 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
258 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
259 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
260 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
261 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
262 4,11,19,26,34,41,49,56,56,49,41,34,26,19,11, 4,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
263 3,10,16,23,29,36,42,49,49,42,36,29,23,16,10, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
264 3, 8,14,19,25,30,36,41,41,36,30,25,19,14, 8, 3,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
265 2, 7,11,16,20,25,29,34,34,29,25,20,16,11, 7, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
266 2, 5, 9,12,16,19,23,26,26,23,19,16,12, 9, 5, 2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
267 1, 4, 6, 9,11,14,16,19,19,16,14,11, 9, 6, 4, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
268 1, 2, 4, 5, 7, 8,10,11,11,10, 8, 7, 5, 4, 2, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
269 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
270 //error:0.000015
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
271 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
272 #else //64*cos
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
273 static const uint8_t obmc32[1024]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
274 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
275 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
276 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
277 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
278 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
279 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
280 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
281 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
282 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
283 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
284 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
285 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
286 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
287 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
288 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
289 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
290 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
291 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
292 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
293 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
294 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
295 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
296 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
297 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
299 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
300 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
301 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
302 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
303 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
304 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
305 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,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
306 //error:0.000022
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
307 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
308 static const uint8_t obmc16[256]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
309 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
310 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
311 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
312 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
313 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
314 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
315 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
316 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
317 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
318 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
319 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
320 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
321 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
322 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
323 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
324 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
325 //error:0.000022
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
326 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
327 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
328
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
329 typedef struct SubBand{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
330 int level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
331 int stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
332 int width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
333 int height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
334 int qlog; ///< log(qscale)/log[2^(1/6)]
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
335 DWTELEM *buf;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
336 struct SubBand *parent;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
337 uint8_t state[/*7*2*/ 7 + 512][32];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
338 }SubBand;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
339
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
340 typedef struct Plane{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
341 int width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
342 int height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
343 SubBand band[MAX_DECOMPOSITIONS][4];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
344 }Plane;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
345
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
346 typedef struct SnowContext{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
347 // 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)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
348
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
349 AVCodecContext *avctx;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
350 CABACContext c;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
351 DSPContext dsp;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
352 AVFrame input_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
353 AVFrame current_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
354 AVFrame last_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
355 AVFrame mconly_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
356 // uint8_t q_context[16];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
357 uint8_t header_state[32];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
358 int keyframe;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
359 int version;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
360 int spatial_decomposition_type;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
361 int temporal_decomposition_type;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
362 int spatial_decomposition_count;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
363 int temporal_decomposition_count;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
364 DWTELEM *spatial_dwt_buffer;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
365 DWTELEM *pred_buffer;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
366 int colorspace_type;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
367 int chroma_h_shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
368 int chroma_v_shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
369 int spatial_scalability;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
370 int qlog;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
371 int mv_scale;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
372 int qbias;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
373 #define QBIAS_SHIFT 3
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
374 int b_width; //FIXME remove?
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
375 int b_height; //FIXME remove?
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
376 Plane plane[MAX_PLANES];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
377 SubBand mb_band;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
378 SubBand mv_band[2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
379
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
380 uint16_t *mb_type;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
381 uint8_t *mb_mean;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
382 uint32_t *dummy;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
383 int16_t (*motion_val8)[2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
384 int16_t (*motion_val16)[2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
385 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)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
386 }SnowContext;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
387
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
388 #define QEXPSHIFT 7 //FIXME try to change this to 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
389 static const uint8_t qexp[8]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
390 128, 140, 152, 166, 181, 197, 215, 235
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
391 // 64, 70, 76, 83, 91, 99, 108, 117
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
392 // 32, 35, 38, 41, 45, 49, 54, 59
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
393 // 16, 17, 19, 21, 23, 25, 27, 29
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
394 // 8, 9, 10, 10, 11, 12, 13, 15
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
395 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
396
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
397 static inline int mirror(int v, int m){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
398 if (v<0) return -v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
399 else if(v>m) return 2*m-v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
400 else return v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
401 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
402
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
403 static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
404 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
405
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
406 if(v){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
407 const int a= ABS(v);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
408 const int e= av_log2(a);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
409 #if 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
410 const int el= FFMIN(e, 10);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
411 put_cabac(c, state+0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
412
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
413 for(i=0; i<el; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
414 put_cabac(c, state+1+i, 1); //1..10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
415 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
416 for(; i<e; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
417 put_cabac(c, state+1+9, 1); //1..10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
418 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
419 put_cabac(c, state+1+FFMIN(i,9), 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
420
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
421 for(i=e-1; i>=el; i--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
422 put_cabac(c, state+22+9, (a>>i)&1); //22..31
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
423 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
424 for(; i>=0; i--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
425 put_cabac(c, state+22+i, (a>>i)&1); //22..31
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
426 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
427
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
428 if(is_signed)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
429 put_cabac(c, state+11 + el, v < 0); //11..21
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
430 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
431
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
432 put_cabac(c, state+0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
433 if(e<=9){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
434 for(i=0; i<e; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
435 put_cabac(c, state+1+i, 1); //1..10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
436 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
437 put_cabac(c, state+1+i, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
438
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
439 for(i=e-1; i>=0; i--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
440 put_cabac(c, state+22+i, (a>>i)&1); //22..31
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
441 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
442
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
443 if(is_signed)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
444 put_cabac(c, state+11 + e, v < 0); //11..21
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
445 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
446 for(i=0; i<e; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
447 put_cabac(c, state+1+FFMIN(i,9), 1); //1..10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
448 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
449 put_cabac(c, state+1+FFMIN(i,9), 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
450
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
451 for(i=e-1; i>=0; i--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
452 put_cabac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
453 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
454
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
455 if(is_signed)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
456 put_cabac(c, state+11 + FFMIN(e,10), v < 0); //11..21
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
457 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
458 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
459 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
460 put_cabac(c, state+0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
461 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
462 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
463
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
464 static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
465 if(get_cabac(c, state+0))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
466 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
467 else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
468 int i, e, a, el;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
469 //FIXME try to merge loops with FFMIN() maybe they are equally fast and they are surly cuter
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
470 for(e=0; e<10; e++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
471 if(get_cabac(c, state + 1 + e)==0) // 1..10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
472 break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
473 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
474 el= e;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
475
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
476 if(e==10){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
477 while(get_cabac(c, state + 1 + 9)) //10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
478 e++;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
479 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
480 a= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
481 for(i=e-1; i>=el; i--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
482 a += a + get_cabac(c, state+22+9); //31
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
483 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
484 for(; i>=0; i--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
485 a += a + get_cabac(c, state+22+i); //22..31
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
486 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
487
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
488 if(is_signed && get_cabac(c, state+11 + el)) //11..21
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
489 return -a;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
490 else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
491 return a;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
492 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
493 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
494
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
495 static inline void put_symbol2(CABACContext *c, uint8_t *state, int v, int log2){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
496 int i;
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
497 int r= log2>=0 ? 1<<log2 : 1;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
498
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
499 assert(v>=0);
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
500 assert(log2>=-4);
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
501
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
502 while(v >= r){
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
503 put_cabac(c, state+4+log2, 1);
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
504 v -= r;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
505 log2++;
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
506 if(log2>0) r+=r;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
507 }
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
508 put_cabac(c, state+4+log2, 0);
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
509
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
510 for(i=log2-1; i>=0; i--){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
511 put_cabac(c, state+31-i, (v>>i)&1);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
512 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
513 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
514
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
515 static inline int get_symbol2(CABACContext *c, uint8_t *state, int log2){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
516 int i;
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
517 int r= log2>=0 ? 1<<log2 : 1;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
518 int v=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
519
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
520 assert(log2>=-4);
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
521
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
522 while(get_cabac(c, state+4+log2)){
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
523 v+= r;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
524 log2++;
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
525 if(log2>0) r+=r;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
526 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
527
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
528 for(i=log2-1; i>=0; i--){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
529 v+= get_cabac(c, state+31-i)<<i;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
530 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
531
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
532 return v;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
533 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
534
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
535 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){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
536 const int mirror_left= !highpass;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
537 const int mirror_right= (width&1) ^ highpass;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
538 const int w= (width>>1) - 1 + (highpass & width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
539 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
540
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
541 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
542 if(mirror_left){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
543 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
544 dst += dst_step;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
545 src += src_step;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
546 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
547
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
548 for(i=0; i<w; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
549 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
550 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
551
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
552 if(mirror_right){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
553 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
554 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
555 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
556
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
557 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){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
558 const int mirror_left= !highpass;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
559 const int mirror_right= (width&1) ^ highpass;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
560 const int w= (width>>1) - 1 + (highpass & width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
561 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
562
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
563 if(mirror_left){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
564 int r= 3*2*ref[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
565 r += r>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
566 r += r>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
567 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
568 dst += dst_step;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
569 src += src_step;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
570 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
571
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
572 for(i=0; i<w; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
573 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
574 r += r>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
575 r += r>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
576 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
577 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
578
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
579 if(mirror_right){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
580 int r= 3*2*ref[w*ref_step];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
581 r += r>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
582 r += r>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
583 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
584 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
585 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
586
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
587
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
588 static void inplace_lift(int *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
589 int x, i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
590
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
591 for(x=start; x<width; x+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
592 int64_t sum=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
593
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
594 for(i=0; i<n; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
595 int x2= x + 2*i - n + 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
596 if (x2< 0) x2= -x2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
597 else if(x2>=width) x2= 2*width-x2-2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
598 sum += coeffs[i]*(int64_t)dst[x2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
599 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
600 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
601 else dst[x] += (sum + (1<<shift)/2)>>shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
602 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
603 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
604
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
605 static void inplace_liftV(int *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
606 int x, y, i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
607 for(y=start; y<height; y+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
608 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
609 int64_t sum=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
610
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
611 for(i=0; i<n; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
612 int y2= y + 2*i - n + 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
613 if (y2< 0) y2= -y2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
614 else if(y2>=height) y2= 2*height-y2-2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
615 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
616 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
617 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
618 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
619 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
620 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
621 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
622
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
623 #define SCALEX 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
624 #define LX0 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
625 #define LX1 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
626
2139
michael
parents: 2138
diff changeset
627 #if 0 // more accurate 9/7
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
628 #define N1 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
629 #define SHIFT1 14
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
630 #define COEFFS1 (int[]){-25987,-25987}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
631 #define N2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
632 #define SHIFT2 19
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
633 #define COEFFS2 (int[]){-27777,-27777}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
634 #define N3 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
635 #define SHIFT3 15
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
636 #define COEFFS3 (int[]){28931,28931}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
637 #define N4 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
638 #define SHIFT4 15
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
639 #define COEFFS4 (int[]){14533,14533}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
640 #elif 1 // 13/7 CRF
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
641 #define N1 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
642 #define SHIFT1 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
643 #define COEFFS1 (int[]){1,-9,-9,1}
2139
michael
parents: 2138
diff changeset
644 #define N2 4
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
645 #define SHIFT2 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
646 #define COEFFS2 (int[]){-1,5,5,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
647 #define N3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
648 #define SHIFT3 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
649 #define COEFFS3 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
650 #define N4 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
651 #define SHIFT4 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
652 #define COEFFS4 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
653 #elif 1 // 3/5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
654 #define LX0 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
655 #define LX1 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
656 #define SCALEX 0.5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
657 #define N1 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
658 #define SHIFT1 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
659 #define COEFFS1 (int[]){1,1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
660 #define N2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
661 #define SHIFT2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
662 #define COEFFS2 (int[]){-1,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
663 #define N3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
664 #define SHIFT3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
665 #define COEFFS3 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
666 #define N4 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
667 #define SHIFT4 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
668 #define COEFFS4 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
669 #elif 1 // 11/5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
670 #define N1 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
671 #define SHIFT1 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
672 #define COEFFS1 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
673 #define N2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
674 #define SHIFT2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
675 #define COEFFS2 (int[]){-1,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
676 #define N3 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
677 #define SHIFT3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
678 #define COEFFS3 (int[]){-1,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
679 #define N4 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
680 #define SHIFT4 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
681 #define COEFFS4 (int[]){-5,29,29,-5}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
682 #define SCALEX 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
683 #elif 1 // 9/7 CDF
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
684 #define N1 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
685 #define SHIFT1 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
686 #define COEFFS1 (int[]){-203,-203}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
687 #define N2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
688 #define SHIFT2 12
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
689 #define COEFFS2 (int[]){-217,-217}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
690 #define N3 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
691 #define SHIFT3 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
692 #define COEFFS3 (int[]){113,113}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
693 #define N4 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
694 #define SHIFT4 9
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
695 #define COEFFS4 (int[]){227,227}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
696 #define SCALEX 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
697 #elif 1 // 7/5 CDF
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
698 #define N1 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
699 #define SHIFT1 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
700 #define COEFFS1 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
701 #define N2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
702 #define SHIFT2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
703 #define COEFFS2 (int[]){-1,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
704 #define N3 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
705 #define SHIFT3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
706 #define COEFFS3 (int[]){-1,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
707 #define N4 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
708 #define SHIFT4 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
709 #define COEFFS4 (int[]){3,3}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
710 #elif 1 // 9/7 MN
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
711 #define N1 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
712 #define SHIFT1 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
713 #define COEFFS1 (int[]){1,-9,-9,1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
714 #define N2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
715 #define SHIFT2 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
716 #define COEFFS2 (int[]){1,1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
717 #define N3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
718 #define SHIFT3 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
719 #define COEFFS3 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
720 #define N4 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
721 #define SHIFT4 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
722 #define COEFFS4 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
723 #else // 13/7 CRF
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
724 #define N1 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
725 #define SHIFT1 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
726 #define COEFFS1 (int[]){1,-9,-9,1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
727 #define N2 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
728 #define SHIFT2 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
729 #define COEFFS2 (int[]){-1,5,5,-1}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
730 #define N3 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
731 #define SHIFT3 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
732 #define COEFFS3 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
733 #define N4 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
734 #define SHIFT4 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
735 #define COEFFS4 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
736 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
737 static void horizontal_decomposeX(int *b, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
738 int temp[width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
739 const int width2= width>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
740 const int w2= (width+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
741 int A1,A2,A3,A4, x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
742
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
743 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
744 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
745 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
746 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
747
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
748 for(x=0; x<width2; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
749 temp[x ]= b[2*x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
750 temp[x+w2]= b[2*x + 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
751 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
752 if(width&1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
753 temp[x ]= b[2*x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
754 memcpy(b, temp, width*sizeof(int));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
755 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
756
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
757 static void horizontal_composeX(int *b, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
758 int temp[width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
759 const int width2= width>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
760 int A1,A2,A3,A4, x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
761 const int w2= (width+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
762
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
763 memcpy(temp, b, width*sizeof(int));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
764 for(x=0; x<width2; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
765 b[2*x ]= temp[x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
766 b[2*x + 1]= temp[x+w2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
767 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
768 if(width&1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
769 b[2*x ]= temp[x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
770
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
771 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
772 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
773 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
774 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
775 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
776
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
777 static void spatial_decomposeX(int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
778 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
779
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
780 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
781 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
782 buffer[y*stride + x] *= SCALEX;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
783 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
784 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
785
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
786 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
787 horizontal_decomposeX(buffer + y*stride, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
788 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
789
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
790 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
791 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
792 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
793 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
794 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
795
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
796 static void spatial_composeX(int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
797 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
798
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
799 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
800 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
801 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
802 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
803
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
804 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
805 horizontal_composeX(buffer + y*stride, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
806 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
807
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
808 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
809 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
810 buffer[y*stride + x] /= SCALEX;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
811 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
812 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
813 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
814
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
815 static void horizontal_decompose53i(int *b, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
816 int temp[width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
817 const int width2= width>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
818 int A1,A2,A3,A4, x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
819 const int w2= (width+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
820
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
821 for(x=0; x<width2; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
822 temp[x ]= b[2*x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
823 temp[x+w2]= b[2*x + 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
824 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
825 if(width&1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
826 temp[x ]= b[2*x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
827 #if 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
828 A2= temp[1 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
829 A4= temp[0 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
830 A1= temp[0+width2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
831 A1 -= (A2 + A4)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
832 A4 += (A1 + 1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
833 b[0+width2] = A1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
834 b[0 ] = A4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
835 for(x=1; x+1<width2; x+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
836 A3= temp[x+width2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
837 A4= temp[x+1 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
838 A3 -= (A2 + A4)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
839 A2 += (A1 + A3 + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
840 b[x+width2] = A3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
841 b[x ] = A2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
842
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
843 A1= temp[x+1+width2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
844 A2= temp[x+2 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
845 A1 -= (A2 + A4)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
846 A4 += (A1 + A3 + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
847 b[x+1+width2] = A1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
848 b[x+1 ] = A4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
849 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
850 A3= temp[width-1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
851 A3 -= A2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
852 A2 += (A1 + A3 + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
853 b[width -1] = A3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
854 b[width2-1] = A2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
855 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
856 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
857 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
858 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
859 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
860
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
861 static void vertical_decompose53iH0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
862 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
863
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
864 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
865 b1[i] -= (b0[i] + b2[i])>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
866 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
867 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
868
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
869 static void vertical_decompose53iL0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
870 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
871
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
872 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
873 b1[i] += (b0[i] + b2[i] + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
874 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
875 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
876
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
877 static void spatial_decompose53i(int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
878 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
879 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
880 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
881
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
882 for(y=-2; y<height; y+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
883 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
884 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
885
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
886 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
887 if(b1 <= b3) horizontal_decompose53i(b2, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
888 if(y+2 < height) horizontal_decompose53i(b3, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
889 STOP_TIMER("horizontal_decompose53i")}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
890
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
891 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
892 if(b1 <= b3) vertical_decompose53iH0(b1, b2, b3, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
893 if(b0 <= b2) vertical_decompose53iL0(b0, b1, b2, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
894 STOP_TIMER("vertical_decompose53i*")}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
895
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
896 b0=b2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
897 b1=b3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
898 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
899 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
900
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
901 #define lift5 lift
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
902 #if 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
903 #define W_AM 3
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
904 #define W_AO 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
905 #define W_AS 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
906
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
907 #define W_BM 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
908 #define W_BO 8
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
909 #define W_BS 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
910
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
911 #undef lift5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
912 #define W_CM 9999
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
913 #define W_CO 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
914 #define W_CS 2
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
915
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
916 #define W_DM 15
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
917 #define W_DO 16
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
918 #define W_DS 5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
919 #elif 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
920 #define W_AM 55
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
921 #define W_AO 16
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
922 #define W_AS 5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
923
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
924 #define W_BM 3
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
925 #define W_BO 32
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
926 #define W_BS 6
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
927
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
928 #define W_CM 127
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
929 #define W_CO 64
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
930 #define W_CS 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
931
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
932 #define W_DM 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
933 #define W_DO 8
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
934 #define W_DS 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
935 #elif 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
936 #define W_AM 97
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
937 #define W_AO 32
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
938 #define W_AS 6
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
939
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
940 #define W_BM 63
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
941 #define W_BO 512
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
942 #define W_BS 10
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
943
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
944 #define W_CM 13
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
945 #define W_CO 8
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
946 #define W_CS 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
947
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
948 #define W_DM 15
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
949 #define W_DO 16
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
950 #define W_DS 5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
951
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
952 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
953
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
954 #define W_AM 203
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
955 #define W_AO 64
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
956 #define W_AS 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
957
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
958 #define W_BM 217
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
959 #define W_BO 2048
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
960 #define W_BS 12
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
961
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
962 #define W_CM 113
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
963 #define W_CO 64
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
964 #define W_CS 7
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
965
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
966 #define W_DM 227
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
967 #define W_DO 128
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
968 #define W_DS 9
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
969 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
970 static void horizontal_decompose97i(int *b, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
971 int temp[width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
972 const int w2= (width+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
973
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
974 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
975 lift (temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
976 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
977 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
978 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
979
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
980
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
981 static void vertical_decompose97iH0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
982 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
983
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
984 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
985 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
986 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
987 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
988
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
989 static void vertical_decompose97iH1(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
990 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
991
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
992 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
993 #ifdef lift5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
994 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
995 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
996 int r= 3*(b0[i] + b2[i]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
997 r+= r>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
998 r+= r>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
999 b1[i] += (r+W_CO)>>W_CS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1000 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1001 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1002 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1003
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1004 static void vertical_decompose97iL0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1005 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1006
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1007 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1008 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1009 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1010 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1011
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1012 static void vertical_decompose97iL1(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1013 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1014
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1015 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1016 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1017 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1018 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1019
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1020 static void spatial_decompose97i(int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1021 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1022 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1023 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1024 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1025 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1026
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1027 for(y=-4; y<height; y+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1028 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1029 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1030
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1031 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1032 if(b3 <= b5) horizontal_decompose97i(b4, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1033 if(y+4 < height) horizontal_decompose97i(b5, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1034 if(width>400){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1035 STOP_TIMER("horizontal_decompose97i")
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1036 }}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1037
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1038 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1039 if(b3 <= b5) vertical_decompose97iH0(b3, b4, b5, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1040 if(b2 <= b4) vertical_decompose97iL0(b2, b3, b4, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1041 if(b1 <= b3) vertical_decompose97iH1(b1, b2, b3, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1042 if(b0 <= b2) vertical_decompose97iL1(b0, b1, b2, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1043
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1044 if(width>400){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1045 STOP_TIMER("vertical_decompose97i")
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1046 }}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1047
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1048 b0=b2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1049 b1=b3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1050 b2=b4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1051 b3=b5;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1052 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1053 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1054
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1055 static void spatial_dwt(SnowContext *s, int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1056 int level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1057
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1058 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1059 switch(s->spatial_decomposition_type){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1060 case 0: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1061 case 1: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1062 case 2: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1063 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1064 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1065 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1066
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1067 static void horizontal_compose53i(int *b, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1068 int temp[width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1069 const int width2= width>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1070 const int w2= (width+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1071 int A1,A2,A3,A4, x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1072
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1073 #if 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1074 A2= temp[1 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1075 A4= temp[0 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1076 A1= temp[0+width2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1077 A1 -= (A2 + A4)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1078 A4 += (A1 + 1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1079 b[0+width2] = A1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1080 b[0 ] = A4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1081 for(x=1; x+1<width2; x+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1082 A3= temp[x+width2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1083 A4= temp[x+1 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1084 A3 -= (A2 + A4)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1085 A2 += (A1 + A3 + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1086 b[x+width2] = A3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1087 b[x ] = A2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1088
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1089 A1= temp[x+1+width2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1090 A2= temp[x+2 ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1091 A1 -= (A2 + A4)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1092 A4 += (A1 + A3 + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1093 b[x+1+width2] = A1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1094 b[x+1 ] = A4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1095 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1096 A3= temp[width-1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1097 A3 -= A2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1098 A2 += (A1 + A3 + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1099 b[width -1] = A3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1100 b[width2-1] = A2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1101 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1102 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1103 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1104 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1105 for(x=0; x<width2; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1106 b[2*x ]= temp[x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1107 b[2*x + 1]= temp[x+w2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1108 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1109 if(width&1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1110 b[2*x ]= temp[x ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1111 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1112
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1113 static void vertical_compose53iH0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1114 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1115
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1116 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1117 b1[i] += (b0[i] + b2[i])>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1118 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1119 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1120
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1121 static void vertical_compose53iL0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1122 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1123
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1124 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1125 b1[i] -= (b0[i] + b2[i] + 2)>>2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1126 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1127 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1128
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1129 static void spatial_compose53i(int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1130 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1131 DWTELEM *b0= buffer + mirror(-1-1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1132 DWTELEM *b1= buffer + mirror(-1 , height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1133
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1134 for(y=-1; y<=height; y+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1135 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1136 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1137
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1138 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1139 if(b1 <= b3) vertical_compose53iL0(b1, b2, b3, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1140 if(b0 <= b2) vertical_compose53iH0(b0, b1, b2, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1141 STOP_TIMER("vertical_compose53i*")}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1142
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1143 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1144 if(y-1 >= 0) horizontal_compose53i(b0, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1145 if(b0 <= b2) horizontal_compose53i(b1, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1146 STOP_TIMER("horizontal_compose53i")}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1147
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1148 b0=b2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1149 b1=b3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1150 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1151 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1152
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1153
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1154 static void horizontal_compose97i(int *b, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1155 int temp[width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1156 const int w2= (width+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1157
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1158 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1159 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1160 lift (b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1161 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1162 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1163
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1164 static void vertical_compose97iH0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1165 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1166
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1167 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1168 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1169 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1170 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1171
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1172 static void vertical_compose97iH1(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1173 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1174
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1175 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1176 #ifdef lift5
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1177 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1178 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1179 int r= 3*(b0[i] + b2[i]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1180 r+= r>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1181 r+= r>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1182 b1[i] -= (r+W_CO)>>W_CS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1183 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1184 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1185 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1186
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1187 static void vertical_compose97iL0(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1188 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1189
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1190 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1191 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1192 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1193 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1194
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1195 static void vertical_compose97iL1(int *b0, int *b1, int *b2, int width){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1196 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1197
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1198 for(i=0; i<width; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1199 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1200 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1201 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1202
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1203 static void spatial_compose97i(int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1204 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1205 DWTELEM *b0= buffer + mirror(-3-1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1206 DWTELEM *b1= buffer + mirror(-3 , height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1207 DWTELEM *b2= buffer + mirror(-3+1, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1208 DWTELEM *b3= buffer + mirror(-3+2, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1209
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1210 for(y=-3; y<=height; y+=2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1211 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1212 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1213
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1214 if(stride == width && y+4 < height && 0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1215 int x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1216 for(x=0; x<width/2; x++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1217 b5[x] += 64*2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1218 for(; x<width; x++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1219 b5[x] += 169*2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1220 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1221
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1222 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1223 if(b3 <= b5) vertical_compose97iL1(b3, b4, b5, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1224 if(b2 <= b4) vertical_compose97iH1(b2, b3, b4, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1225 if(b1 <= b3) vertical_compose97iL0(b1, b2, b3, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1226 if(b0 <= b2) vertical_compose97iH0(b0, b1, b2, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1227 if(width>400){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1228 STOP_TIMER("vertical_compose97i")}}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1229
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1230 {START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1231 if(y-1>= 0) horizontal_compose97i(b0, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1232 if(b0 <= b2) horizontal_compose97i(b1, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1233 if(width>400 && b0 <= b2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1234 STOP_TIMER("horizontal_compose97i")}}
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1235
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1236 b0=b2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1237 b1=b3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1238 b2=b4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1239 b3=b5;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1240 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1241 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1242
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1243 static void spatial_idwt(SnowContext *s, int *buffer, int width, int height, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1244 int level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1245
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1246 for(level=s->spatial_decomposition_count-1; level>=0; level--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1247 switch(s->spatial_decomposition_type){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1248 case 0: spatial_compose97i(buffer, width>>level, height>>level, stride<<level); break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1249 case 1: spatial_compose53i(buffer, width>>level, height>>level, stride<<level); break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1250 case 2: spatial_composeX (buffer, width>>level, height>>level, stride<<level); break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1251 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1252 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1253 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1254
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1255 static const int hilbert[16][2]={
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1256 {0,0}, {1,0}, {1,1}, {0,1},
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1257 {0,2}, {0,3}, {1,3}, {1,2},
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1258 {2,2}, {2,3}, {3,3}, {3,2},
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1259 {3,1}, {2,1}, {2,0}, {3,0},
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1260 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1261 #if 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1262 -o o-
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1263 | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1264 o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1265
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1266 -o-o o-o-
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1267 | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1268 o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1269 | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1270 o o-o o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1271 | | | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1272 o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1273
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1274 0112122312232334122323342334
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1275 0123456789ABCDEF0123456789AB
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1276 RLLRMRRLLRRMRLLMLRRLMLLRRLLM
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1277
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1278 4 B F 14 1B
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1279 4 11 15 20 27
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1280
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1281 -o o-o-o o-o-o o-
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1282 | | | | | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1283 o-o o-o o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1284 | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1285 o-o o-o o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1286 | | | | | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1287 o o-o-o o-o-o o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1288 | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1289 o-o o-o-o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1290 | | | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1291 o-o o-o o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1292 | | | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1293 o o-o o o o-o o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1294 | | | | | | | |
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1295 o-o o-o o-o o-o
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1296
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1297 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1298
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1299 #define SVI(a, i, x, y) \
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1300 {\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1301 a[i][0]= x;\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1302 a[i][1]= y;\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1303 i++;\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1304 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1305
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1306 static int sig_cmp(const void *a, const void *b){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1307 const int16_t* da = (const int16_t *) a;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1308 const int16_t* db = (const int16_t *) b;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1309
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1310 if(da[1] != db[1]) return da[1] - db[1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1311 else return da[0] - db[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1312 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1313
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1314 static int deint(unsigned int a){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1315 a &= 0x55555555; //0 1 2 3 4 5 6 7 8 9 A B C D E F
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1316 a += a & 0x11111111; // 01 23 45 67 89 AB CD EF
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1317 a += 3*(a & 0x0F0F0F0F);// 0123 4567 89AB CDEF
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1318 a += 15*(a & 0x00FF00FF);// 01234567 89ABCDEF
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1319 a +=255*(a & 0x0000FFFF);// 0123456789ABCDEF
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1320 return a>>15;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1321 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1322
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1323 static void encode_subband_z0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1324 const int level= b->level;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1325 const int w= b->width;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1326 const int h= b->height;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1327 int x, y, pos;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1328
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1329 if(1){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1330 int run=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1331 int runs[w*h];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1332 int run_index=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1333 int count=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1334
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1335 for(pos=0; ; pos++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1336 int x= deint(pos );
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1337 int y= deint(pos>>1);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1338 int v, p=0, pr=0, pd=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1339 int /*ll=0, */l=0, lt=0, t=0/*, rt=0*/;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1340
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1341 if(x>=w || y>=h){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1342 if(x>=w && y>=h)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1343 break;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1344 continue;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1345 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1346 count++;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1347
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1348 v= src[x + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1349
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1350 if(y){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1351 t= src[x + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1352 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1353 lt= src[x - 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1354 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1355 if(x + 1 < w){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1356 /*rt= src[x + 1 + (y-1)*stride]*/;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1357 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1358 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1359 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1360 l= src[x - 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1361 /*if(x > 1){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1362 if(orientation==1) ll= src[y + (x-2)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1363 else ll= src[x - 2 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1364 }*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1365 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1366 if(parent){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1367 int px= x>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1368 int py= y>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1369 if(px<b->parent->width && py<b->parent->height){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1370 p= parent[px + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1371 /*if(px+1<b->parent->width)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1372 pr= parent[px + 1 + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1373 if(py+1<b->parent->height)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1374 pd= parent[px + (py+1)*2*stride];*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1375 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1376 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1377 if(!(/*ll|*/l|lt|t|/*rt|*/p)){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1378 if(v){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1379 runs[run_index++]= run;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1380 run=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1381 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1382 run++;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1383 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1384 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1385 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1386 assert(count==w*h);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1387 runs[run_index++]= run;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1388 run_index=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1389 run= runs[run_index++];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1390
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1391 put_symbol(&s->c, b->state[1], run, 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1392
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1393 for(pos=0; ; pos++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1394 int x= deint(pos );
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1395 int y= deint(pos>>1);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1396 int v, p=0, pr=0, pd=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1397 int /*ll=0, */l=0, lt=0, t=0/*, rt=0*/;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1398
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1399 if(x>=w || y>=h){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1400 if(x>=w && y>=h)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1401 break;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1402 continue;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1403 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1404 v= src[x + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1405
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1406 if(y){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1407 t= src[x + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1408 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1409 lt= src[x - 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1410 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1411 if(x + 1 < w){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1412 // rt= src[x + 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1413 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1414 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1415 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1416 l= src[x - 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1417 /*if(x > 1){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1418 if(orientation==1) ll= src[y + (x-2)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1419 else ll= src[x - 2 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1420 }*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1421 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1422
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1423 if(parent){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1424 int px= x>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1425 int py= y>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1426 if(px<b->parent->width && py<b->parent->height){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1427 p= parent[px + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1428 /* if(px+1<b->parent->width)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1429 pr= parent[px + 1 + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1430 if(py+1<b->parent->height)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1431 pd= parent[px + (py+1)*2*stride];*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1432 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1433 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1434 if(/*ll|*/l|lt|t|/*rt|*/p){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1435 int context= av_log2(/*ABS(ll) + */2*(3*ABS(l) + ABS(lt) + 2*ABS(t) + /*ABS(rt) +*/ ABS(p)));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1436
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1437 put_cabac(&s->c, &b->state[0][context], !!v);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1438 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1439 if(!run){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1440 run= runs[run_index++];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1441 put_symbol(&s->c, b->state[1], run, 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1442 assert(v);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1443 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1444 run--;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1445 assert(!v);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1446 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1447 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1448 if(v){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1449 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + /*ABS(rt) +*/ ABS(p));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1450
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1451 put_symbol(&s->c, b->state[context + 2], ABS(v)-1, 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1452 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1453 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1454 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1455 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1456 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1457
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1458 static void encode_subband_bp(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1459 const int level= b->level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1460 const int w= b->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1461 const int h= b->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1462 int x, y;
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1463
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1464 #if 0
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1465 int plane;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1466 for(plane=24; plane>=0; plane--){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1467 int run=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1468 int runs[w*h];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1469 int run_index=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1470
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1471 for(y=0; y<h; y++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1472 for(x=0; x<w; x++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1473 int v, lv, p=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1474 int d=0, r=0, rd=0, ld=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1475 int /*ll=0, */l=0, lt=0, t=0, rt=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1476 v= src[x + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1477
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1478 if(y){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1479 t= src[x + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1480 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1481 lt= src[x - 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1482 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1483 if(x + 1 < w){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1484 rt= src[x + 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1485 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1486 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1487 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1488 l= src[x - 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1489 /*if(x > 1){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1490 if(orientation==1) ll= src[y + (x-2)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1491 else ll= src[x - 2 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1492 }*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1493 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1494 if(y+1<h){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1495 d= src[x + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1496 if(x) ld= src[x - 1 + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1497 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1498 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1499 if(x + 1 < w)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1500 r= src[x + 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1501 if(parent){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1502 int px= x>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1503 int py= y>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1504 if(px<b->parent->width && py<b->parent->height)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1505 p= parent[px + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1506 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1507 #define HIDE(c, plane) c= c>=0 ? c&((-1)<<(plane)) : -((-c)&((-1)<<(plane)));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1508 lv=v;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1509 HIDE( v, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1510 HIDE(lv, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1511 HIDE( p, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1512 HIDE( l, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1513 HIDE(lt, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1514 HIDE( t, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1515 HIDE(rt, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1516 HIDE( r, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1517 HIDE(rd, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1518 HIDE( d, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1519 HIDE(ld, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1520 if(!(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv)){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1521 if(v){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1522 runs[run_index++]= run;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1523 run=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1524 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1525 run++;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1526 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1527 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1528 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1529 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1530 runs[run_index++]= run;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1531 run_index=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1532 run= runs[run_index++];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1533
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1534 put_symbol(&s->c, b->state[1], run, 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1535
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1536 for(y=0; y<h; y++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1537 for(x=0; x<w; x++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1538 int v, p=0, lv;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1539 int /*ll=0, */l=0, lt=0, t=0, rt=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1540 int d=0, r=0, rd=0, ld=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1541 v= src[x + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1542
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1543 if(y){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1544 t= src[x + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1545 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1546 lt= src[x - 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1547 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1548 if(x + 1 < w){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1549 rt= src[x + 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1550 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1551 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1552 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1553 l= src[x - 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1554 /*if(x > 1){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1555 if(orientation==1) ll= src[y + (x-2)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1556 else ll= src[x - 2 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1557 }*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1558 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1559 if(y+1<h){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1560 d= src[x + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1561 if(x) ld= src[x - 1 + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1562 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1563 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1564 if(x + 1 < w)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1565 r= src[x + 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1566
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1567 if(parent){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1568 int px= x>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1569 int py= y>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1570 if(px<b->parent->width && py<b->parent->height)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1571 p= parent[px + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1572 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1573 lv=v;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1574 HIDE( v, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1575 HIDE(lv, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1576 HIDE( p, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1577 HIDE( l, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1578 HIDE(lt, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1579 HIDE( t, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1580 HIDE(rt, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1581 HIDE( r, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1582 HIDE(rd, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1583 HIDE( d, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1584 HIDE(ld, plane+1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1585 if(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1586 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1587 +3*ABS(r) + ABS(rd) + 2*ABS(d) + ABS(ld));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1588
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1589 if(lv) put_cabac(&s->c, &b->state[99][context + 8*(av_log2(ABS(lv))-plane)], !!(v-lv));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1590 else put_cabac(&s->c, &b->state[ 0][context], !!v);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1591 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1592 assert(!lv);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1593 if(!run){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1594 run= runs[run_index++];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1595 put_symbol(&s->c, b->state[1], run, 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1596 assert(v);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1597 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1598 run--;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1599 assert(!v);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1600 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1601 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1602 if(v && !lv){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1603 int context= clip(quant3b[l&0xFF] + quant3b[r&0xFF], -1,1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1604 + 3*clip(quant3b[t&0xFF] + quant3b[d&0xFF], -1,1);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1605 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + context], v<0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1606 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1607 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1608 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1609 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1610 return;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1611 #endif
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1612 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1613
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1614 static void encode_subband_X(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1615 const int level= b->level;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1616 const int w= b->width;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1617 const int h= b->height;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1618 int x, y;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1619
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1620 #if 0
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1621 if(orientation==3 && parent && 0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1622 int16_t candidate[w*h][2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1623 uint8_t state[w*h];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1624 int16_t boarder[3][w*h*4][2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1625 int16_t significant[w*h][2];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1626 int candidate_count=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1627 int boarder_count[3]={0,0,0};
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1628 int significant_count=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1629 int rle_pos=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1630 int v, last_v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1631 int primary= orientation==1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1632
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1633 memset(candidate, 0, sizeof(candidate));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1634 memset(state, 0, sizeof(state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1635 memset(boarder, 0, sizeof(boarder));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1636
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1637 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1638 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1639 if(parent[(x>>1) + (y>>1)*2*stride])
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1640 SVI(candidate, candidate_count, x, y)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1641 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1642 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1643
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1644 for(;;){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1645 while(candidate_count && !boarder_count[0] && !boarder_count[1] && !boarder_count[2]){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1646 candidate_count--;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1647 x= candidate[ candidate_count][0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1648 y= candidate[ candidate_count][1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1649 if(state[x + y*w])
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1650 continue;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1651 state[x + y*w]= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1652 v= !!src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1653 put_cabac(&s->c, &b->state[0][0], v);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1654 if(v){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1655 SVI(significant, significant_count, x,y)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1656 if(x && !state[x - 1 + y *w]) SVI(boarder[0],boarder_count[0],x-1,y )
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1657 if(y && !state[x + (y-1)*w]) SVI(boarder[1],boarder_count[1],x ,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1658 if(x+1<w && !state[x + 1 + y *w]) SVI(boarder[0],boarder_count[0],x+1,y )
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1659 if(y+1<h && !state[x + (y+1)*w]) SVI(boarder[1],boarder_count[1],x ,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1660 if(x && y && !state[x - 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x-1,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1661 if(x && y+1<h && !state[x - 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x-1,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1662 if(x+1<w && y+1<h && !state[x + 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x+1,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1663 if(x+1<w && y && !state[x + 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x+1,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1664 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1665 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1666 while(!boarder_count[0] && !boarder_count[1] && !boarder_count[2] && rle_pos < w*h){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1667 int run=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1668 for(; rle_pos < w*h;){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1669 x= rle_pos % w; //FIXME speed
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1670 y= rle_pos / w;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1671 rle_pos++;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1672 if(state[x + y*w])
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1673 continue;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1674 state[x + y*w]= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1675 v= !!src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1676 if(v){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1677 put_symbol(&s->c, b->state[1], run, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1678 SVI(significant, significant_count, x,y)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1679 if(x && !state[x - 1 + y *w]) SVI(boarder[0],boarder_count[0],x-1,y )
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1680 if(y && !state[x + (y-1)*w]) SVI(boarder[1],boarder_count[1],x ,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1681 if(x+1<w && !state[x + 1 + y *w]) SVI(boarder[0],boarder_count[0],x+1,y )
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1682 if(y+1<h && !state[x + (y+1)*w]) SVI(boarder[1],boarder_count[1],x ,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1683 if(x && y && !state[x - 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x-1,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1684 if(x && y+1<h && !state[x - 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x-1,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1685 if(x+1<w && y+1<h && !state[x + 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x+1,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1686 if(x+1<w && y && !state[x + 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x+1,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1687 break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1688 //FIXME note only right & down can be boarders
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1689 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1690 run++;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1691 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1692 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1693 if(!boarder_count[0] && !boarder_count[1] && !boarder_count[2])
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1694 break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1695
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1696 while(boarder_count[0] || boarder_count[1] || boarder_count[2]){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1697 int index;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1698
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1699 if (boarder_count[ primary]) index= primary;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1700 else if(boarder_count[1-primary]) index=1-primary;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1701 else index=2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1702
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1703 boarder_count[index]--;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1704 x= boarder[index][ boarder_count[index] ][0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1705 y= boarder[index][ boarder_count[index] ][1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1706 if(state[x + y*w]) //FIXME maybe check earlier
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1707 continue;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1708 state[x + y*w]= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1709 v= !!src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1710 put_cabac(&s->c, &b->state[0][index+1], v);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1711 if(v){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1712 SVI(significant, significant_count, x,y)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1713 if(x && !state[x - 1 + y *w]) SVI(boarder[0],boarder_count[0],x-1,y )
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1714 if(y && !state[x + (y-1)*w]) SVI(boarder[1],boarder_count[1],x ,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1715 if(x+1<w && !state[x + 1 + y *w]) SVI(boarder[0],boarder_count[0],x+1,y )
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1716 if(y+1<h && !state[x + (y+1)*w]) SVI(boarder[1],boarder_count[1],x ,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1717 if(x && y && !state[x - 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x-1,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1718 if(x && y+1<h && !state[x - 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x-1,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1719 if(x+1<w && y+1<h && !state[x + 1 + (y+1)*w]) SVI(boarder[2],boarder_count[2],x+1,y+1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1720 if(x+1<w && y && !state[x + 1 + (y-1)*w]) SVI(boarder[2],boarder_count[2],x+1,y-1)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1721 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1722 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1723 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1724 //FIXME sort significant coeffs maybe
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1725 if(1){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1726 qsort(significant, significant_count, sizeof(int16_t[2]), sig_cmp);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1727 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1728
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1729 last_v=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1730 while(significant_count){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1731 int context= 3 + quant7[last_v&0xFF]; //use significance of suroundings
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1732 significant_count--;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1733 x= significant[significant_count][0];//FIXME try opposit direction
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1734 y= significant[significant_count][1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1735 v= src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1736 put_symbol(&s->c, b->state[context + 2], v, 1); //FIXME try to avoid first bit, try this with the old code too!!
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1737 last_v= v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1738 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1739 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1740 #endif
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1741 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1742
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1743 static void encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1744 const int level= b->level;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1745 const int w= b->width;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1746 const int h= b->height;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1747 int x, y;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1748
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1749 if(1){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1750 int run=0;
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1751 int runs[w*h];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1752 int run_index=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1753
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1754 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1755 for(x=0; x<w; x++){
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1756 int v, p=0;
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1757 int /*ll=0, */l=0, lt=0, t=0, rt=0;
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1758 v= src[x + y*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1759
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1760 if(y){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1761 t= src[x + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1762 if(x){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1763 lt= src[x - 1 + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1764 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1765 if(x + 1 < w){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1766 rt= src[x + 1 + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1767 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1768 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1769 if(x){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1770 l= src[x - 1 + y*stride];
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1771 /*if(x > 1){
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1772 if(orientation==1) ll= src[y + (x-2)*stride];
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1773 else ll= src[x - 2 + y*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1774 }*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1775 }
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1776 if(parent){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1777 int px= x>>1;
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1778 int py= y>>1;
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1779 if(px<b->parent->width && py<b->parent->height)
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1780 p= parent[px + py*2*stride];
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1781 }
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1782 if(!(/*ll|*/l|lt|t|rt|p)){
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1783 if(v){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1784 runs[run_index++]= run;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1785 run=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1786 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1787 run++;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1788 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1789 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1790 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1791 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1792 runs[run_index++]= run;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1793 run_index=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1794 run= runs[run_index++];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1795
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1796 put_symbol2(&s->c, b->state[1], run, 3);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1797
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1798 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1799 for(x=0; x<w; x++){
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1800 int v, p=0;
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1801 int /*ll=0, */l=0, lt=0, t=0, rt=0;
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1802 v= src[x + y*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1803
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1804 if(y){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1805 t= src[x + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1806 if(x){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1807 lt= src[x - 1 + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1808 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1809 if(x + 1 < w){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1810 rt= src[x + 1 + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1811 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1812 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1813 if(x){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1814 l= src[x - 1 + y*stride];
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1815 /*if(x > 1){
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1816 if(orientation==1) ll= src[y + (x-2)*stride];
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1817 else ll= src[x - 2 + y*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1818 }*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1819 }
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1820 if(parent){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1821 int px= x>>1;
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1822 int py= y>>1;
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1823 if(px<b->parent->width && py<b->parent->height)
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1824 p= parent[px + py*2*stride];
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1825 }
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1826 if(/*ll|*/l|lt|t|rt|p){
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1827 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1828
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1829 put_cabac(&s->c, &b->state[0][context], !!v);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1830 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1831 if(!run){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1832 run= runs[run_index++];
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1833
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1834 put_symbol2(&s->c, b->state[1], run, 3);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1835 assert(v);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1836 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1837 run--;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1838 assert(!v);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1839 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1840 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1841 if(v){
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1842 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1843
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
1844 put_symbol2(&s->c, b->state[context + 2], ABS(v)-1, context-4);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1845 put_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]], v<0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1846 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1847 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1848 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1849 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1850 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1851
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1852 static void encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1853 // encode_subband_qtree(s, b, src, parent, stride, orientation);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1854 // encode_subband_z0run(s, b, src, parent, stride, orientation);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1855 encode_subband_c0run(s, b, src, parent, stride, orientation);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1856 // encode_subband_dzr(s, b, src, parent, stride, orientation);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1857 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1858
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1859 static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1860 const int level= b->level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1861 const int w= b->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1862 const int h= b->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1863 int x,y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1864
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1865 START_TIMER
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1866 #if 0
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1867 for(y=0; y<b->height; y++)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1868 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1869
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1870 int plane;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1871 for(plane=24; plane>=0; plane--){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1872 int run;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1873
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1874 run= get_symbol(&s->c, b->state[1], 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1875
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1876 #define HIDE(c, plane) c= c>=0 ? c&((-1)<<(plane)) : -((-c)&((-1)<<(plane)));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1877
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1878 for(y=0; y<h; y++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1879 for(x=0; x<w; x++){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1880 int v, p=0, lv;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1881 int /*ll=0, */l=0, lt=0, t=0, rt=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1882 int d=0, r=0, rd=0, ld=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1883 lv= src[x + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1884
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1885 if(y){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1886 t= src[x + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1887 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1888 lt= src[x - 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1889 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1890 if(x + 1 < w){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1891 rt= src[x + 1 + (y-1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1892 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1893 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1894 if(x){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1895 l= src[x - 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1896 /*if(x > 1){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1897 if(orientation==1) ll= src[y + (x-2)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1898 else ll= src[x - 2 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1899 }*/
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1900 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1901 if(y+1<h){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1902 d= src[x + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1903 if(x) ld= src[x - 1 + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1904 if(x + 1 < w) rd= src[x + 1 + (y+1)*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1905 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1906 if(x + 1 < w)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1907 r= src[x + 1 + y*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1908
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1909 if(parent){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1910 int px= x>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1911 int py= y>>1;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1912 if(px<b->parent->width && py<b->parent->height)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1913 p= parent[px + py*2*stride];
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1914 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1915 HIDE( p, plane)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1916 if(/*ll|*/l|lt|t|rt|r|rd|ld|d|p|lv){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1917 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1918 +3*ABS(r) + ABS(rd) + 2*ABS(d) + ABS(ld));
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1919
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1920 if(lv){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1921 assert(context + 8*av_log2(ABS(lv)) < 512 - 100);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1922 if(get_cabac(&s->c, &b->state[99][context + 8*(av_log2(ABS(lv))-plane)])){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1923 if(lv<0) v= lv - (1<<plane);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1924 else v= lv + (1<<plane);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1925 }else
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1926 v=lv;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1927 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1928 v= get_cabac(&s->c, &b->state[ 0][context]) << plane;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1929 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1930 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1931 assert(!lv);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1932 if(!run){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1933 run= get_symbol(&s->c, b->state[1], 0);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1934 v= 1<<plane;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1935 }else{
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1936 run--;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1937 v=0;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1938 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1939 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1940 if(v && !lv){
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1941 int context= clip(quant3b[l&0xFF] + quant3b[r&0xFF], -1,1)
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1942 + 3*clip(quant3b[t&0xFF] + quant3b[d&0xFF], -1,1);
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1943 if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + context]))
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1944 v= -v;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1945 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1946 src[x + y*stride]= v;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1947 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1948 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1949 }
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1950 return;
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1951 #endif
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1952 if(1){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1953 int run;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1954
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1955 for(y=0; y<b->height; y++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1956 memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1957
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1958 run= get_symbol2(&s->c, b->state[1], 3);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1959 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1960 for(x=0; x<w; x++){
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1961 int v, p=0;
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1962 int /*ll=0, */l=0, lt=0, t=0, rt=0;
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1963
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1964 if(y){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1965 t= src[x + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1966 if(x){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1967 lt= src[x - 1 + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1968 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1969 if(x + 1 < w){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1970 rt= src[x + 1 + (y-1)*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1971 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1972 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1973 if(x){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1974 l= src[x - 1 + y*stride];
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1975 /*if(x > 1){
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1976 if(orientation==1) ll= src[y + (x-2)*stride];
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1977 else ll= src[x - 2 + y*stride];
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1978 }*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1979 }
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1980 if(parent){
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1981 int px= x>>1;
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
1982 int py= y>>1;
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1983 if(px<b->parent->width && py<b->parent->height)
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1984 p= parent[px + py*2*stride];
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1985 }
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1986 if(/*ll|*/l|lt|t|rt|p){
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
1987 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
2144
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1988
e33371c1e2b4 better context model (0.2-1% lower bitrate)
michael
parents: 2139
diff changeset
1989 v=get_cabac(&s->c, &b->state[0][context]);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1990 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1991 if(!run){
2155
274a01d80f4a various subband encoders (all either worse or complicated so they are commented out)
michael
parents: 2152
diff changeset
1992 run= get_symbol2(&s->c, b->state[1], 3);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1993 //FIXME optimize this here
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1994 //FIXME try to store a more naive run
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1995 v=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1996 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1997 run--;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1998 v=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
1999 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2000 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2001 if(v){
2148
678be5a8f282 use parent sample to predict significance & magnitude
michael
parents: 2146
diff changeset
2002 int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));
2159
7f42295c1517 improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents: 2156
diff changeset
2003 v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1;
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2004 if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]]))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2005 v= -v;
2149
48dc4ec06e88 cleanup
michael
parents: 2148
diff changeset
2006 src[x + y*stride]= v;
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2007 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2008 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2009 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2010 if(level+1 == s->spatial_decomposition_count){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2011 STOP_TIMER("decode_subband")
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2012 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2013
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2014 return;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2015 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2016 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2017
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2018 static void reset_contexts(SnowContext *s){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2019 int plane_index, level, orientation;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2020
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2021 for(plane_index=0; plane_index<2; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2022 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2023 for(orientation=level ? 1:0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2024 memset(s->plane[plane_index].band[level][orientation].state, 0, sizeof(s->plane[plane_index].band[level][orientation].state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2025 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2026 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2027 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2028 memset(s->mb_band.state, 0, sizeof(s->mb_band.state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2029 memset(s->mv_band[0].state, 0, sizeof(s->mv_band[0].state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2030 memset(s->mv_band[1].state, 0, sizeof(s->mv_band[1].state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2031 memset(s->header_state, 0, sizeof(s->header_state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2032 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2033
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2034 static void mc_block(uint8_t *dst, uint8_t *src, uint8_t *tmp, int stride, int b_w, int b_h, int dx, int dy){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2035 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2036
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2037 for(y=0; y < b_h+5; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2038 for(x=0; x < b_w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2039 int a0= src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2040 int a1= src[x + 1 + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2041 int a2= src[x + 2 + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2042 int a3= src[x + 3 + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2043 int a4= src[x + 4 + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2044 int a5= src[x + 5 + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2045 // int am= 9*(a1+a2) - (a0+a3);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2046 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2047 // int am= 18*(a2+a3) - 2*(a1+a4);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2048 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2049 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2050
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2051 // if(b_w==16) am= 8*(a1+a2);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2052
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2053 if(dx<8) tmp[x + y*stride]= (32*a2*( 8-dx) + am* dx + 128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2054 else tmp[x + y*stride]= ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2055
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2056 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2057 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2058 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2059 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2060 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2061 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2062 for(y=0; y < b_h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2063 for(x=0; x < b_w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2064 int a0= tmp[x + y *stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2065 int a1= tmp[x + (y + 1)*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2066 int a2= tmp[x + (y + 2)*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2067 int a3= tmp[x + (y + 3)*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2068 int a4= tmp[x + (y + 4)*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2069 int a5= tmp[x + (y + 5)*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2070 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2071 // int am= 18*(a2+a3) - 2*(a1+a4);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2072 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2073 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2074
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2075 // if(b_w==16) am= 8*(a1+a2);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2076
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2077 if(dy<8) dst[x + y*stride]= (32*a2*( 8-dy) + am* dy + 128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2078 else dst[x + y*stride]= ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2079
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2080 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2081 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2082 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2083 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2084 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2085 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2086 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2087
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2088 #define mcb(dx,dy,b_w)\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2089 static void mc_block ## dx ## dy(uint8_t *dst, uint8_t *src, int stride){\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2090 uint8_t tmp[stride*(b_w+5)];\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2091 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2092 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2093
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2094 mcb( 0, 0,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2095 mcb( 4, 0,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2096 mcb( 8, 0,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2097 mcb(12, 0,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2098 mcb( 0, 4,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2099 mcb( 4, 4,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2100 mcb( 8, 4,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2101 mcb(12, 4,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2102 mcb( 0, 8,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2103 mcb( 4, 8,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2104 mcb( 8, 8,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2105 mcb(12, 8,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2106 mcb( 0,12,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2107 mcb( 4,12,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2108 mcb( 8,12,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2109 mcb(12,12,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2110
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2111 #define mca(dx,dy,b_w)\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2112 static void mc_block_hpel ## dx ## dy(uint8_t *dst, uint8_t *src, int stride, int h){\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2113 uint8_t tmp[stride*(b_w+5)];\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2114 assert(h==b_w);\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2115 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2116 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2117
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2118 mca( 0, 0,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2119 mca( 8, 0,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2120 mca( 0, 8,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2121 mca( 8, 8,16)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2122
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2123 static void add_xblock(DWTELEM *dst, uint8_t *src, uint8_t *obmc, int s_x, int s_y, int b_w, int b_h, int mv_x, int mv_y, int w, int h, int dst_stride, int src_stride, int obmc_stride, int mb_type, int add){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2124 uint8_t tmp[src_stride*(b_h+5)]; //FIXME move to context to gurantee alignment
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2125 int x,y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2126
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2127 if(s_x<0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2128 obmc -= s_x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2129 b_w += s_x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2130 s_x=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2131 }else if(s_x + b_w > w){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2132 b_w = w - s_x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2133 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2134 if(s_y<0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2135 obmc -= s_y*obmc_stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2136 b_h += s_y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2137 s_y=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2138 }else if(s_y + b_h> h){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2139 b_h = h - s_y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2140 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2141
2152
2f6518c0e6cc 1/0 fix
michael
parents: 2151
diff changeset
2142 if(b_w<=0 || b_h<=0) return;
2f6518c0e6cc 1/0 fix
michael
parents: 2151
diff changeset
2143
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2144 dst += s_x + s_y*dst_stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2145
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2146 if(mb_type==1){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2147 src += s_x + s_y*src_stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2148 for(y=0; y < b_h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2149 for(x=0; x < b_w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2150 if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2151 else dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2152 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2153 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2154 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2155 int dx= mv_x&15;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2156 int dy= mv_y&15;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2157 // int dxy= (mv_x&1) + 2*(mv_y&1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2158
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2159 s_x += (mv_x>>4) - 2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2160 s_y += (mv_y>>4) - 2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2161 src += s_x + s_y*src_stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2162 //use dsputil
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2163
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2164 if( (unsigned)s_x >= w - b_w - 4
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2165 || (unsigned)s_y >= h - b_h - 4){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2166 ff_emulated_edge_mc(tmp + 32, src, src_stride, b_w+5, b_h+5, s_x, s_y, w, h);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2167 src= tmp + 32;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2168 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2169
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2170 if(mb_type==0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2171 mc_block(tmp, src, tmp + 64+8, src_stride, b_w, b_h, dx, dy);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2172 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2173 int sum=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2174 for(y=0; y < b_h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2175 for(x=0; x < b_w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2176 sum += src[x+ y*src_stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2177 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2178 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2179 sum= (sum + b_h*b_w/2) / (b_h*b_w);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2180 for(y=0; y < b_h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2181 for(x=0; x < b_w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2182 tmp[x + y*src_stride]= sum;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2183 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2184 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2185 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2186
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2187 for(y=0; y < b_h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2188 for(x=0; x < b_w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2189 if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2190 else dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2191 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2192 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2193 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2194 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2195
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2196 static void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2197 Plane *p= &s->plane[plane_index];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2198 const int mb_w= s->mb_band.width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2199 const int mb_h= s->mb_band.height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2200 const int mb_stride= s->mb_band.stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2201 int x, y, mb_x, mb_y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2202 int scale = plane_index ? s->mv_scale : 2*s->mv_scale;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2203 int block_w = plane_index ? 8 : 16;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2204 uint8_t *obmc = plane_index ? obmc16 : obmc32;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2205 int obmc_stride= plane_index ? 16 : 32;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2206 int ref_stride= s->last_picture.linesize[plane_index];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2207 uint8_t *ref = s->last_picture.data[plane_index];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2208 int w= p->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2209 int h= p->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2210
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2211 if(s->avctx->debug&512){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2212 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2213 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2214 if(add) buf[x + y*w]+= 128*256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2215 else buf[x + y*w]-= 128*256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2216 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2217 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2218
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2219 return;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2220 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2221 for(mb_y=-1; mb_y<=mb_h; mb_y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2222 for(mb_x=-1; mb_x<=mb_w; mb_x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2223 int index= clip(mb_x, 0, mb_w-1) + clip(mb_y, 0, mb_h-1)*mb_stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2224
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2225 add_xblock(buf, ref, obmc,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2226 block_w*mb_x - block_w/2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2227 block_w*mb_y - block_w/2,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2228 2*block_w, 2*block_w,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2229 s->mv_band[0].buf[index]*scale, s->mv_band[1].buf[index]*scale,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2230 w, h,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2231 w, ref_stride, obmc_stride,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2232 s->mb_band.buf[index], add);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2233
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2234 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2235 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2236 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2237
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2238 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2239 const int level= b->level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2240 const int w= b->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2241 const int h= b->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2242 const int qlog= clip(s->qlog + b->qlog, 0, 128);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2243 const int qmul= qexp[qlog&7]<<(qlog>>3);
2150
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2244 int x,y, thres1, thres2;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2245 START_TIMER
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2246
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2247 assert(QROOT==8);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2248
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2249 bias= bias ? 0 : (3*qmul)>>3;
2150
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2250 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2251 thres2= 2*thres1;
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2252
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2253 if(!bias){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2254 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2255 for(x=0; x<w; x++){
2150
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2256 int i= src[x + y*stride];
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2257
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2258 if((unsigned)(i+thres1) > thres2){
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2259 if(i>=0){
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2260 i<<= QEXPSHIFT;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2261 i/= qmul; //FIXME optimize
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2262 src[x + y*stride]= i;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2263 }else{
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2264 i= -i;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2265 i<<= QEXPSHIFT;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2266 i/= qmul; //FIXME optimize
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2267 src[x + y*stride]= -i;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2268 }
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2269 }else
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2270 src[x + y*stride]= 0;
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2271 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2272 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2273 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2274 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2275 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2276 int i= src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2277
2150
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2278 if((unsigned)(i+thres1) > thres2){
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2279 if(i>=0){
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2280 i<<= QEXPSHIFT;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2281 i= (i + bias) / qmul; //FIXME optimize
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2282 src[x + y*stride]= i;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2283 }else{
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2284 i= -i;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2285 i<<= QEXPSHIFT;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2286 i= (i + bias) / qmul; //FIXME optimize
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2287 src[x + y*stride]= -i;
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2288 }
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2289 }else
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2290 src[x + y*stride]= 0;
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2291 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2292 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2293 }
2150
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2294 if(level+1 == s->spatial_decomposition_count){
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2295 // STOP_TIMER("quantize")
8aff375a986b optimize quantizaton (about 3x faster)
michael
parents: 2149
diff changeset
2296 }
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2297 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2298
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2299 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2300 const int level= b->level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2301 const int w= b->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2302 const int h= b->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2303 const int qlog= clip(s->qlog + b->qlog, 0, 128);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2304 const int qmul= qexp[qlog&7]<<(qlog>>3);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2305 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2306 int x,y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2307
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2308 assert(QROOT==8);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2309
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2310 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2311 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2312 int i= src[x + y*stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2313 if(i<0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2314 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2315 }else if(i>0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2316 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2317 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2318 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2319 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2320 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2321
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2322 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2323 const int w= b->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2324 const int h= b->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2325 int x,y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2326
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2327 for(y=h-1; y>=0; y--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2328 for(x=w-1; x>=0; x--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2329 int i= x + y*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2330
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2331 if(x){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2332 if(use_median){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2333 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2334 else src[i] -= src[i - 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2335 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2336 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2337 else src[i] -= src[i - 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2338 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2339 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2340 if(y) src[i] -= src[i - stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2341 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2342 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2343 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2344 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2345
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2346 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2347 const int w= b->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2348 const int h= b->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2349 int x,y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2350
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2351 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2352 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2353 int i= x + y*stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2354
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2355 if(x){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2356 if(use_median){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2357 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2358 else src[i] += src[i - 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2359 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2360 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2361 else src[i] += src[i - 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2362 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2363 }else{
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2364 if(y) src[i] += src[i - stride];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2365 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2366 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2367 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2368 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2369
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2370 static void encode_header(SnowContext *s){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2371 int plane_index, level, orientation;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2372
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2373 put_cabac(&s->c, s->header_state, s->keyframe); // state clearing stuff?
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2374 if(s->keyframe){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2375 put_symbol(&s->c, s->header_state, s->version, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2376 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2377 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2378 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2379 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2380 put_symbol(&s->c, s->header_state, s->b_width, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2381 put_symbol(&s->c, s->header_state, s->b_height, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2382 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2383 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2384 put_cabac(&s->c, s->header_state, s->spatial_scalability);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2385 // put_cabac(&s->c, s->header_state, s->rate_scalability);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2386
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2387 for(plane_index=0; plane_index<2; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2388 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2389 for(orientation=level ? 1:0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2390 if(orientation==2) continue;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2391 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2392 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2393 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2394 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2395 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2396 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2397 put_symbol(&s->c, s->header_state, s->qlog, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2398 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2399 put_symbol(&s->c, s->header_state, s->qbias, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2400 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2401
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2402 static int decode_header(SnowContext *s){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2403 int plane_index, level, orientation;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2404
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2405 s->keyframe= get_cabac(&s->c, s->header_state);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2406 if(s->keyframe){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2407 s->version= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2408 if(s->version>0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2409 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2410 return -1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2411 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2412 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2413 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2414 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2415 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2416 s->b_width= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2417 s->b_height= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2418 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2419 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2420 s->spatial_scalability= get_cabac(&s->c, s->header_state);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2421 // s->rate_scalability= get_cabac(&s->c, s->header_state);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2422
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2423 for(plane_index=0; plane_index<3; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2424 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2425 for(orientation=level ? 1:0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2426 int q;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2427 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2428 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2429 else q= get_symbol(&s->c, s->header_state, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2430 s->plane[plane_index].band[level][orientation].qlog= q;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2431 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2432 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2433 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2434 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2435
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2436 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2437 if(s->spatial_decomposition_type > 2){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2438 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2439 return -1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2440 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2441
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2442 s->qlog= get_symbol(&s->c, s->header_state, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2443 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2444 s->qbias= get_symbol(&s->c, s->header_state, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2445
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2446 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2447 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2448
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2449 static int common_init(AVCodecContext *avctx){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2450 SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2451 int width, height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2452 int level, orientation, plane_index, dec;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2453
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2454 s->avctx= avctx;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2455
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2456 dsputil_init(&s->dsp, avctx);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2457
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2458 #define mcf(dx,dy)\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2459 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2460 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2461 mc_block ## dx ## dy;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2462
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2463 mcf( 0, 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2464 mcf( 4, 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2465 mcf( 8, 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2466 mcf(12, 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2467 mcf( 0, 4)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2468 mcf( 4, 4)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2469 mcf( 8, 4)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2470 mcf(12, 4)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2471 mcf( 0, 8)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2472 mcf( 4, 8)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2473 mcf( 8, 8)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2474 mcf(12, 8)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2475 mcf( 0,12)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2476 mcf( 4,12)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2477 mcf( 8,12)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2478 mcf(12,12)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2479
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2480 #define mcfh(dx,dy)\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2481 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2482 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2483 mc_block_hpel ## dx ## dy;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2484
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2485 mcfh(0, 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2486 mcfh(8, 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2487 mcfh(0, 8)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2488 mcfh(8, 8)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2489
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2490 dec= s->spatial_decomposition_count= 5;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2491 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2492
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2493 s->chroma_h_shift= 1; //FIXME XXX
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2494 s->chroma_v_shift= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2495
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2496 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2497
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2498 s->b_width = (s->avctx->width +(1<<dec)-1)>>dec;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2499 s->b_height= (s->avctx->height+(1<<dec)-1)>>dec;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2500
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2501 s->spatial_dwt_buffer= av_mallocz(s->b_width*s->b_height*sizeof(DWTELEM)<<(2*dec));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2502 s->pred_buffer= av_mallocz(s->b_width*s->b_height*sizeof(DWTELEM)<<(2*dec));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2503
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2504 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2505
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2506 for(plane_index=0; plane_index<3; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2507 int w= s->avctx->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2508 int h= s->avctx->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2509
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2510 if(plane_index){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2511 w>>= s->chroma_h_shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2512 h>>= s->chroma_v_shift;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2513 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2514 s->plane[plane_index].width = w;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2515 s->plane[plane_index].height= h;
2160
11e1425b3a66 cleanup
michael
parents: 2159
diff changeset
2516 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2517 for(level=s->spatial_decomposition_count-1; level>=0; level--){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2518 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2519 SubBand *b= &s->plane[plane_index].band[level][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2520
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2521 b->buf= s->spatial_dwt_buffer;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2522 b->level= level;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2523 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2524 b->width = (w + !(orientation&1))>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2525 b->height= (h + !(orientation>1))>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2526
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2527 if(orientation&1) b->buf += (w+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2528 if(orientation>1) b->buf += b->stride>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2529
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2530 if(level)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2531 b->parent= &s->plane[plane_index].band[level-1][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2532 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2533 w= (w+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2534 h= (h+1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2535 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2536 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2537
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2538 //FIXME init_subband() ?
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2539 s->mb_band.stride= s->mv_band[0].stride= s->mv_band[1].stride=
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2540 s->mb_band.width = s->mv_band[0].width = s->mv_band[1].width = (s->avctx->width + 15)>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2541 s->mb_band.height= s->mv_band[0].height= s->mv_band[1].height= (s->avctx->height+ 15)>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2542 s->mb_band .buf= av_mallocz(s->mb_band .stride * s->mb_band .height*sizeof(DWTELEM));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2543 s->mv_band[0].buf= av_mallocz(s->mv_band[0].stride * s->mv_band[0].height*sizeof(DWTELEM));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2544 s->mv_band[1].buf= av_mallocz(s->mv_band[1].stride * s->mv_band[1].height*sizeof(DWTELEM));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2545
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2546 reset_contexts(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2547 /*
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2548 width= s->width= avctx->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2549 height= s->height= avctx->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2550
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2551 assert(width && height);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2552 */
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2553 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2554
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2555 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2556 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2557
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2558
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2559 static void calculate_vissual_weight(SnowContext *s, Plane *p){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2560 int width = p->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2561 int height= p->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2562 int i, level, orientation, x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2563
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2564 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2565 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2566 SubBand *b= &p->band[level][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2567 DWTELEM *buf= b->buf;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2568 int64_t error=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2569
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2570 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2571 buf[b->width/2 + b->height/2*b->stride]= 256*256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2572 spatial_idwt(s, s->spatial_dwt_buffer, width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2573 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2574 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2575 int64_t d= s->spatial_dwt_buffer[x + y*width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2576 error += d*d;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2577 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2578 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2579
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2580 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2581 av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2582 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2583 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2584 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2585
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2586 static int encode_init(AVCodecContext *avctx)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2587 {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2588 SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2589 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2590 int level, orientation, plane_index;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2591
2151
44c973bfec0f dont segfault without -strict -1
michael
parents: 2150
diff changeset
2592 if(avctx->strict_std_compliance >= 0){
44c973bfec0f dont segfault without -strict -1
michael
parents: 2150
diff changeset
2593 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
44c973bfec0f dont segfault without -strict -1
michael
parents: 2150
diff changeset
2594 "use vstrict=-1 to use it anyway\n");
44c973bfec0f dont segfault without -strict -1
michael
parents: 2150
diff changeset
2595 return -1;
44c973bfec0f dont segfault without -strict -1
michael
parents: 2150
diff changeset
2596 }
44c973bfec0f dont segfault without -strict -1
michael
parents: 2150
diff changeset
2597
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2598 common_init(avctx);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2599
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2600 s->version=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2601
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2602 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2603 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2604 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2605 s->mb_type = av_mallocz((s->mb_band.width+1)*s->mb_band.height*sizeof(int16_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2606 s->mb_mean = av_mallocz((s->mb_band.width+1)*s->mb_band.height*sizeof(int8_t ));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2607 s->dummy = av_mallocz((s->mb_band.width+1)*s->mb_band.height*sizeof(int32_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2608 h263_encode_init(&s->m); //mv_penalty
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2609
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2610 for(plane_index=0; plane_index<3; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2611 calculate_vissual_weight(s, &s->plane[plane_index]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2612 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2613
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2614
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2615 avctx->coded_frame= &s->current_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2616 switch(avctx->pix_fmt){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2617 // case PIX_FMT_YUV444P:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2618 // case PIX_FMT_YUV422P:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2619 case PIX_FMT_YUV420P:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2620 case PIX_FMT_GRAY8:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2621 // case PIX_FMT_YUV411P:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2622 // case PIX_FMT_YUV410P:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2623 s->colorspace_type= 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2624 break;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2625 /* case PIX_FMT_RGBA32:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2626 s->colorspace= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2627 break;*/
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2628 default:
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2629 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2630 return -1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2631 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2632 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2633 s->chroma_h_shift= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2634 s->chroma_v_shift= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2635 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2636 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2637
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2638 static int frame_start(SnowContext *s){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2639 AVFrame tmp;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2640
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2641 if(s->keyframe)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2642 reset_contexts(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2643
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2644 tmp= s->last_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2645 s->last_picture= s->current_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2646 s->current_picture= tmp;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2647
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2648 s->current_picture.reference= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2649 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2650 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2651 return -1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2652 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2653
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2654 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2655 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2656
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2657 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2658 SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2659 CABACContext * const c= &s->c;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2660 AVFrame *pict = data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2661 const int width= s->avctx->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2662 const int height= s->avctx->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2663 int used_count= 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2664 int log2_threshold, level, orientation, plane_index, i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2665
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2666 ff_init_cabac_encoder(c, buf, buf_size);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2667 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2668
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2669 s->input_picture = *pict;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2670
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2671 memset(s->header_state, 0, sizeof(s->header_state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2672
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2673 s->keyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2674 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2675
2146
b288cdc2ad68 log2() & bsd
michael
parents: 2144
diff changeset
2676 s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2));
2138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2677 //<64 >60
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2678 s->qlog += 61;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2679
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2680 for(i=0; i<s->mb_band.stride * s->mb_band.height; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2681 s->mb_band.buf[i]= s->keyframe;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2682 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2683
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2684 frame_start(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2685
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2686 if(pict->pict_type == P_TYPE){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2687 int block_width = (width +15)>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2688 int block_height= (height+15)>>4;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2689 int stride= s->current_picture.linesize[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2690 uint8_t *src_plane= s->input_picture.data[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2691 int src_stride= s->input_picture.linesize[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2692 int x,y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2693
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2694 assert(s->current_picture.data[0]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2695 assert(s->last_picture.data[0]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2696
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2697 s->m.avctx= s->avctx;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2698 s->m.current_picture.data[0]= s->current_picture.data[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2699 s->m. last_picture.data[0]= s-> last_picture.data[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2700 s->m. new_picture.data[0]= s-> input_picture.data[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2701 s->m.current_picture_ptr= &s->m.current_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2702 s->m. last_picture_ptr= &s->m. last_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2703 s->m.linesize=
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2704 s->m. last_picture.linesize[0]=
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2705 s->m. new_picture.linesize[0]=
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2706 s->m.current_picture.linesize[0]= stride;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2707 s->m.width = width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2708 s->m.height= height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2709 s->m.mb_width = block_width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2710 s->m.mb_height= block_height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2711 s->m.mb_stride= s->m.mb_width+1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2712 s->m.b8_stride= 2*s->m.mb_width+1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2713 s->m.f_code=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2714 s->m.pict_type= pict->pict_type;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2715 s->m.me_method= s->avctx->me_method;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2716 s->m.me.scene_change_score=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2717 s->m.flags= s->avctx->flags;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2718 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2719 s->m.out_format= FMT_H263;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2720 s->m.unrestricted_mv= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2721
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2722 s->m.lambda= pict->quality * 3/2; //FIXME bug somewhere else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2723 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2724 s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2725
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2726 if(!s->motion_val8){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2727 s->motion_val8 = av_mallocz(s->m.b8_stride*block_height*2*2*sizeof(int16_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2728 s->motion_val16= av_mallocz(s->m.mb_stride*block_height*2*sizeof(int16_t));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2729 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2730
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2731 s->m.mb_type= s->mb_type;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2732
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2733 //dummies, to avoid segfaults
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2734 s->m.current_picture.mb_mean = s->mb_mean;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2735 s->m.current_picture.mb_var = (int16_t*)s->dummy;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2736 s->m.current_picture.mc_mb_var= (int16_t*)s->dummy;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2737 s->m.current_picture.mb_type = s->dummy;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2738
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2739 s->m.current_picture.motion_val[0]= s->motion_val8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2740 s->m.p_mv_table= s->motion_val16;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2741 s->m.dsp= s->dsp; //move
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2742 ff_init_me(&s->m);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2743
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2744
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2745 s->m.me.pre_pass=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2746 s->m.me.dia_size= s->avctx->pre_dia_size;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2747 s->m.first_slice_line=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2748 for(y= block_height-1; y >= 0; y--) {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2749 uint8_t src[stride*16];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2750
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2751 s->m.new_picture.data[0]= src - y*16*stride; //ugly
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2752 s->m.mb_y= y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2753 for(i=0; i<16 && i + 16*y<height; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2754 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2755 for(x=width; x<16*block_width; x++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2756 src[i*stride+x]= src[i*stride+x-1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2757 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2758 for(; i<16 && i + 16*y<16*block_height; i++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2759 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2760
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2761 for(x=block_width-1; x >=0 ;x--) {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2762 s->m.mb_x= x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2763 ff_init_block_index(&s->m);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2764 ff_update_block_index(&s->m);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2765 ff_pre_estimate_p_frame_motion(&s->m, x, y);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2766 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2767 s->m.first_slice_line=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2768 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2769 s->m.me.pre_pass=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2770
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2771
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2772 s->m.me.dia_size= s->avctx->dia_size;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2773 s->m.first_slice_line=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2774 for (y = 0; y < block_height; y++) {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2775 uint8_t src[stride*16];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2776
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2777 s->m.new_picture.data[0]= src - y*16*stride; //ugly
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2778 s->m.mb_y= y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2779
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2780 assert(width <= stride);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2781 assert(width <= 16*block_width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2782
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2783 for(i=0; i<16 && i + 16*y<height; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2784 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2785 for(x=width; x<16*block_width; x++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2786 src[i*stride+x]= src[i*stride+x-1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2787 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2788 for(; i<16 && i + 16*y<16*block_height; i++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2789 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2790
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2791 for (x = 0; x < block_width; x++) {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2792 int mb_xy= x + y*(s->mb_band.stride);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2793 s->m.mb_x= x;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2794 ff_init_block_index(&s->m);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2795 ff_update_block_index(&s->m);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2796
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2797 ff_estimate_p_frame_motion(&s->m, x, y);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2798
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2799 s->mb_band .buf[mb_xy]= (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2800 ? 0 : 2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2801 s->mv_band[0].buf[mb_xy]= s->motion_val16[x + y*s->m.mb_stride][0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2802 s->mv_band[1].buf[mb_xy]= s->motion_val16[x + y*s->m.mb_stride][1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2803
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2804 if(s->mb_band .buf[x + y*(s->mb_band.stride)]==2 && 0){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2805 int dc0=128, dc1=128, dc, dc2, dir;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2806 int offset= (s->avctx->flags & CODEC_FLAG_QPEL) ? 64 : 32;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2807
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2808 dc =s->mb_mean[x + y *s->m.mb_stride ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2809 if(x) dc0=s->mb_mean[x + y *s->m.mb_stride - 1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2810 if(y) dc1=s->mb_mean[x + (y-1)*s->m.mb_stride ];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2811 dc2= (dc0+dc1)>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2812 #if 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2813 if (ABS(dc0 - dc) < ABS(dc1 - dc) && ABS(dc0 - dc) < ABS(dc2 - dc))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2814 dir= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2815 else if(ABS(dc0 - dc) >=ABS(dc1 - dc) && ABS(dc1 - dc) < ABS(dc2 - dc))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2816 dir=-1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2817 else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2818 dir=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2819 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2820 if(ABS(dc0 - dc) < ABS(dc1 - dc) && x){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2821 s->mv_band[0].buf[mb_xy]= s->mv_band[0].buf[x + y*(s->mb_band.stride)-1] - offset;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2822 s->mv_band[1].buf[mb_xy]= s->mv_band[1].buf[x + y*(s->mb_band.stride)-1];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2823 s->mb_mean[x + y *s->m.mb_stride ]= dc0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2824 }else if(y){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2825 s->mv_band[0].buf[mb_xy]= s->mv_band[0].buf[x + (y-1)*(s->mb_band.stride)];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2826 s->mv_band[1].buf[mb_xy]= s->mv_band[1].buf[x + (y-1)*(s->mb_band.stride)] - offset;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2827 s->mb_mean[x + y *s->m.mb_stride ]= dc1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2828 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2829 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2830 // s->mb_band .buf[x + y*(s->mb_band.stride)]=1; //FIXME intra only test
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2831 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2832 s->m.first_slice_line=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2833 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2834 assert(s->m.pict_type == P_TYPE);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2835 if(s->m.me.scene_change_score > s->avctx->scenechange_threshold){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2836 s->m.pict_type=
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2837 pict->pict_type =I_TYPE;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2838 for(i=0; i<s->mb_band.stride * s->mb_band.height; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2839 s->mb_band.buf[i]= 1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2840 s->mv_band[0].buf[i]=
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2841 s->mv_band[1].buf[i]= 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2842 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2843 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2844 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2845 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2846
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2847 s->m.first_slice_line=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2848
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2849 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2850
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2851 encode_header(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2852
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2853 decorrelate(s, &s->mb_band , s->mb_band .buf, s->mb_band .stride, 0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2854 decorrelate(s, &s->mv_band[0], s->mv_band[0].buf, s->mv_band[0].stride, 0, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2855 decorrelate(s, &s->mv_band[1], s->mv_band[1].buf, s->mv_band[1].stride, 0 ,1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2856 encode_subband(s, &s->mb_band , s->mb_band .buf, NULL, s->mb_band .stride, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2857 encode_subband(s, &s->mv_band[0], s->mv_band[0].buf, NULL, s->mv_band[0].stride, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2858 encode_subband(s, &s->mv_band[1], s->mv_band[1].buf, NULL, s->mv_band[1].stride, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2859
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2860 //FIXME avoid this
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2861 correlate(s, &s->mb_band , s->mb_band .buf, s->mb_band .stride, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2862 correlate(s, &s->mv_band[0], s->mv_band[0].buf, s->mv_band[0].stride, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2863 correlate(s, &s->mv_band[1], s->mv_band[1].buf, s->mv_band[1].stride, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2864
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2865 for(plane_index=0; plane_index<3; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2866 Plane *p= &s->plane[plane_index];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2867 int w= p->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2868 int h= p->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2869 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2870 int bits= put_bits_count(&s->c.pb);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2871
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2872 //FIXME optimize
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2873 if(pict->data[plane_index]) //FIXME gray hack
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2874 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2875 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2876 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2877 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2878 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2879 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2880 spatial_dwt(s, s->spatial_dwt_buffer, w, h, w);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2881
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2882 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2883 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2884 SubBand *b= &p->band[level][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2885
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2886 quantize(s, b, b->buf, b->stride, s->qbias);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2887 if(orientation==0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2888 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2889 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2890 assert(b->parent==NULL || b->parent->stride == b->stride*2);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2891 if(orientation==0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2892 correlate(s, b, b->buf, b->stride, 1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2893 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2894 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2895 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2896
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2897 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2898 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2899 SubBand *b= &p->band[level][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2900
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2901 dequantize(s, b, b->buf, b->stride);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2902 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2903 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2904
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2905 spatial_idwt(s, s->spatial_dwt_buffer, w, h, w);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2906 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2907 //FIXME optimize
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2908 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2909 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2910 int v= (s->spatial_dwt_buffer[y*w + x]+128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2911 if(v&(~255)) v= ~(v>>31);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2912 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2913 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2914 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2915 if(s->avctx->flags&CODEC_FLAG_PSNR){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2916 int64_t error= 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2917
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2918 if(pict->data[plane_index]) //FIXME gray hack
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2919 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2920 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2921 int d= s->spatial_dwt_buffer[y*w + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x]*256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2922 error += d*d;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2923 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2924 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2925 error= (error + 128*256)>>16;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2926 s->avctx->error[plane_index] += error;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2927 s->avctx->error[3] += error;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2928 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2929 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2930
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2931 if(s->last_picture.data[0])
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2932 avctx->release_buffer(avctx, &s->last_picture);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2933
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2934 emms_c();
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2935
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2936 return put_cabac_terminate(c, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2937 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2938
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2939 static void common_end(SnowContext *s){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2940 av_freep(&s->spatial_dwt_buffer);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2941 av_freep(&s->mb_band.buf);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2942 av_freep(&s->mv_band[0].buf);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2943 av_freep(&s->mv_band[1].buf);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2944
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2945 av_freep(&s->m.me.scratchpad);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2946 av_freep(&s->m.me.map);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2947 av_freep(&s->m.me.score_map);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2948 av_freep(&s->mb_type);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2949 av_freep(&s->mb_mean);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2950 av_freep(&s->dummy);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2951 av_freep(&s->motion_val8);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2952 av_freep(&s->motion_val16);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2953 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2954
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2955 static int encode_end(AVCodecContext *avctx)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2956 {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2957 SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2958
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2959 common_end(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2960
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2961 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2962 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2963
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2964 static int decode_init(AVCodecContext *avctx)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2965 {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2966 // SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2967
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2968 common_init(avctx);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2969
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2970 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2971 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2972
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2973 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2974 SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2975 CABACContext * const c= &s->c;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2976 const int width= s->avctx->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2977 const int height= s->avctx->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2978 int bytes_read;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2979 AVFrame *picture = data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2980 int log2_threshold, level, orientation, plane_index;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2981
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2982
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2983 /* no supplementary picture */
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2984 if (buf_size == 0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2985 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2986
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2987 ff_init_cabac_decoder(c, buf, buf_size);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2988 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2989
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2990 memset(s->header_state, 0, sizeof(s->header_state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2991
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2992 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2993 decode_header(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2994
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2995 frame_start(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2996 //keyframe flag dupliaction mess FIXME
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2997 if(avctx->debug&FF_DEBUG_PICT_INFO)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2998 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
2999
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3000 decode_subband(s, &s->mb_band , s->mb_band .buf, NULL, s->mb_band .stride, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3001 decode_subband(s, &s->mv_band[0], s->mv_band[0].buf, NULL, s->mv_band[0].stride, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3002 decode_subband(s, &s->mv_band[1], s->mv_band[1].buf, NULL, s->mv_band[1].stride, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3003 correlate(s, &s->mb_band , s->mb_band .buf, s->mb_band .stride, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3004 correlate(s, &s->mv_band[0], s->mv_band[0].buf, s->mv_band[0].stride, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3005 correlate(s, &s->mv_band[1], s->mv_band[1].buf, s->mv_band[1].stride, 1, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3006
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3007 for(plane_index=0; plane_index<3; plane_index++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3008 Plane *p= &s->plane[plane_index];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3009 int w= p->width;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3010 int h= p->height;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3011 int x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3012
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3013 if(s->avctx->debug&2048){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3014 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3015 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3016
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3017 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3018 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3019 int v= (s->spatial_dwt_buffer[y*w + x]+128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3020 if(v&(~255)) v= ~(v>>31);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3021 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3022 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3023 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3024 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3025 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3026 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3027 SubBand *b= &p->band[level][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3028
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3029 decode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3030 if(orientation==0)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3031 correlate(s, b, b->buf, b->stride, 1, 0);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3032 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3033 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3034 if(!(s->avctx->debug&1024))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3035 for(level=0; level<s->spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3036 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3037 SubBand *b= &p->band[level][orientation];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3038
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3039 dequantize(s, b, b->buf, b->stride);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3040 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3041 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3042
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3043 spatial_idwt(s, s->spatial_dwt_buffer, w, h, w);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3044 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3045
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3046 //FIXME optimize
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3047 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3048 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3049 int v= (s->spatial_dwt_buffer[y*w + x]+128)>>8;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3050 if(v&(~255)) v= ~(v>>31);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3051 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= v;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3052 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3053 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3054 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3055
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3056 emms_c();
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3057
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3058 if(s->last_picture.data[0])
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3059 avctx->release_buffer(avctx, &s->last_picture);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3060
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3061 if(!(s->avctx->debug&2048))
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3062 *picture= s->current_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3063 else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3064 *picture= s->mconly_picture;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3065
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3066 *data_size = sizeof(AVFrame);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3067
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3068 bytes_read= get_cabac_terminate(c);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3069 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3070
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3071 return bytes_read;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3072 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3073
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3074 static int decode_end(AVCodecContext *avctx)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3075 {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3076 SnowContext *s = avctx->priv_data;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3077
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3078 common_end(s);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3079
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3080 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3081 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3082
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3083 AVCodec snow_decoder = {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3084 "snow",
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3085 CODEC_TYPE_VIDEO,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3086 CODEC_ID_SNOW,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3087 sizeof(SnowContext),
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3088 decode_init,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3089 NULL,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3090 decode_end,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3091 decode_frame,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3092 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3093 NULL
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3094 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3095
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3096 AVCodec snow_encoder = {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3097 "snow",
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3098 CODEC_TYPE_VIDEO,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3099 CODEC_ID_SNOW,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3100 sizeof(SnowContext),
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3101 encode_init,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3102 encode_frame,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3103 encode_end,
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3104 };
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3105
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3106
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3107 #if 0
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3108 #undef malloc
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3109 #undef free
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3110 #undef printf
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3111
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3112 int main(){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3113 int width=256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3114 int height=256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3115 int buffer[2][width*height];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3116 SnowContext s;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3117 int i;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3118 s.spatial_decomposition_count=6;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3119 s.spatial_decomposition_type=1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3120
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3121 printf("testing 5/3 DWT\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3122 for(i=0; i<width*height; i++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3123 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3124
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3125 spatial_dwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3126 spatial_idwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3127
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3128 for(i=0; i<width*height; i++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3129 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3130
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3131 printf("testing 9/7 DWT\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3132 s.spatial_decomposition_type=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3133 for(i=0; i<width*height; i++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3134 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3135
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3136 spatial_dwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3137 spatial_idwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3138
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3139 for(i=0; i<width*height; i++)
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3140 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3141
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3142 printf("testing AC coder\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3143 memset(s.header_state, 0, sizeof(s.header_state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3144 ff_init_cabac_encoder(&s.c, buffer[0], 256*256);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3145 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3146
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3147 for(i=-256; i<256; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3148 START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3149 put_symbol(&s.c, s.header_state, i*i*i/3*ABS(i), 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3150 STOP_TIMER("put_symbol")
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3151 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3152 put_cabac_terminate(&s.c, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3153
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3154 memset(s.header_state, 0, sizeof(s.header_state));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3155 ff_init_cabac_decoder(&s.c, buffer[0], 256*256);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3156 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3157
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3158 for(i=-256; i<256; i++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3159 int j;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3160 START_TIMER
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3161 j= get_symbol(&s.c, s.header_state, 1);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3162 STOP_TIMER("get_symbol")
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3163 if(j!=i*i*i/3*ABS(i)) printf("fsck: %d != %d\n", i, j);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3164 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3165 {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3166 int level, orientation, x, y;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3167 int64_t errors[8][4];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3168 int64_t g=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3169
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3170 memset(errors, 0, sizeof(errors));
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3171 s.spatial_decomposition_count=3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3172 s.spatial_decomposition_type=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3173 for(level=0; level<s.spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3174 for(orientation=level ? 1 : 0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3175 int w= width >> (s.spatial_decomposition_count-level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3176 int h= height >> (s.spatial_decomposition_count-level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3177 int stride= width << (s.spatial_decomposition_count-level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3178 DWTELEM *buf= buffer[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3179 int64_t error=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3180
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3181 if(orientation&1) buf+=w;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3182 if(orientation>1) buf+=stride>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3183
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3184 memset(buffer[0], 0, sizeof(int)*width*height);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3185 buf[w/2 + h/2*stride]= 256*256;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3186 spatial_idwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3187 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3188 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3189 int64_t d= buffer[0][x + y*width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3190 error += d*d;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3191 if(ABS(width/2-x)<9 && ABS(height/2-y)<9 && level==2) printf("%8lld ", d);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3192 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3193 if(ABS(height/2-y)<9 && level==2) printf("\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3194 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3195 error= (int)(sqrt(error)+0.5);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3196 errors[level][orientation]= error;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3197 if(g) g=ff_gcd(g, error);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3198 else g= error;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3199 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3200 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3201 printf("static int const visual_weight[][4]={\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3202 for(level=0; level<s.spatial_decomposition_count; level++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3203 printf(" {");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3204 for(orientation=0; orientation<4; orientation++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3205 printf("%8lld,", errors[level][orientation]/g);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3206 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3207 printf("},\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3208 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3209 printf("};\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3210 {
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3211 int level=2;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3212 int orientation=3;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3213 int w= width >> (s.spatial_decomposition_count-level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3214 int h= height >> (s.spatial_decomposition_count-level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3215 int stride= width << (s.spatial_decomposition_count-level);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3216 DWTELEM *buf= buffer[0];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3217 int64_t error=0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3218
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3219 buf+=w;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3220 buf+=stride>>1;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3221
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3222 memset(buffer[0], 0, sizeof(int)*width*height);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3223 #if 1
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3224 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3225 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3226 int tab[4]={0,2,3,1};
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3227 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3228 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3229 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3230 spatial_dwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3231 #else
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3232 for(y=0; y<h; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3233 for(x=0; x<w; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3234 buf[x + y*stride ]=169;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3235 buf[x + y*stride-w]=64;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3236 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3237 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3238 spatial_idwt(&s, buffer[0], width, height, width);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3239 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3240 for(y=0; y<height; y++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3241 for(x=0; x<width; x++){
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3242 int64_t d= buffer[0][x + y*width];
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3243 error += d*d;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3244 if(ABS(width/2-x)<9 && ABS(height/2-y)<9) printf("%8lld ", d);
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3245 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3246 if(ABS(height/2-y)<9) printf("\n");
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3247 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3248 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3249
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3250 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3251 return 0;
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3252 }
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3253 #endif
1ac13c350369 my experimental wavelet codec
michael
parents:
diff changeset
3254