annotate src/ffmpeg/libavcodec/snow.c @ 811:3afe5701df41 trunk

[svn] - remove h261/h263/h264 stuff
author nenolod
date Mon, 12 Mar 2007 11:38:51 -0700
parents e8776388b02a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
808
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1 /*
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4 * This file is part of FFmpeg.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
5 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
10 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
14 * Lesser General Public License for more details.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
15 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
19 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
20
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
21 #include "avcodec.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
22 #include "common.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
23 #include "dsputil.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
24 #include "snow.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
25
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
26 #include "rangecoder.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
27
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
28 #include "mpegvideo.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
29
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
30 #undef NDEBUG
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
31 #include <assert.h>
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
32
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
33 static const int8_t quant3[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
34 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
35 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
42 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
43 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
44 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
50 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
51 static const int8_t quant3b[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
52 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
53 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
54 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
55 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
62 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
63 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
64 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
68 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
69 static const int8_t quant3bA[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
70 0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
71 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
72 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
73 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
74 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
75 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
76 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
77 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
78 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
79 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
80 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
81 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
82 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
83 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
84 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
85 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
86 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
87 static const int8_t quant5[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
88 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
89 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
90 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
91 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
92 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
93 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
94 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
95 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
96 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
97 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
98 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
99 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
100 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
101 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
102 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
103 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
104 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
105 static const int8_t quant7[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
106 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
107 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
108 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
109 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
110 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
111 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
112 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
113 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
114 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
115 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
116 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
117 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
118 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
119 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
120 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
121 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
122 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
123 static const int8_t quant9[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
124 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
125 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
126 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
127 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
128 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
129 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
130 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
131 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
132 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
133 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
134 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
135 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
136 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
137 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
138 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
139 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
140 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
141 static const int8_t quant11[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
142 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
143 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
144 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
145 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
146 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
147 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
148 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
149 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
150 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
151 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
152 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
153 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
154 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
155 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
156 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
157 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
158 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
159 static const int8_t quant13[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
160 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
161 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
162 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
163 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
164 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
165 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
166 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
167 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
168 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
169 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
170 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
171 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
172 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
173 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
174 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
175 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
176 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
177
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
178 #if 0 //64*cubic
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
179 static const uint8_t obmc32[1024]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
180 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
181 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
182 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
183 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
184 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
185 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
186 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
187 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
188 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
189 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
190 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
191 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
192 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
193 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
194 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
195 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
196 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
197 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
198 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
199 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
200 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
201 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
202 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
203 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
204 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
205 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
206 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
207 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
208 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
209 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
210 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
211 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
212 //error:0.000022
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
213 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
214 static const uint8_t obmc16[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
215 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
216 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
217 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
218 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
219 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
220 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
221 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
222 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
223 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
224 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
225 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
226 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
227 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
228 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
229 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
230 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
231 //error:0.000033
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
232 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
233 #elif 1 // 64*linear
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
234 static const uint8_t obmc32[1024]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
235 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
236 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
237 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
238 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
239 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
240 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
241 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
242 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
243 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
244 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
245 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
246 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
247 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
248 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
249 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
250 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
251 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
252 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
253 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
254 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
255 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
256 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
257 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
258 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
259 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
260 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
261 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
262 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
263 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
264 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
265 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
266 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
267 //error:0.000020
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
268 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
269 static const uint8_t obmc16[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
270 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
271 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
272 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
273 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
274 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
275 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
276 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
277 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
278 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
279 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
280 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
281 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
282 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
283 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
284 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
285 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
286 //error:0.000015
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
287 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
288 #else //64*cos
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
289 static const uint8_t obmc32[1024]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
290 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
291 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
292 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
293 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
294 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
295 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
296 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
297 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
298 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
299 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
300 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
301 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
302 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
303 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
304 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
305 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
306 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
307 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
308 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
309 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
310 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
311 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
312 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
313 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
314 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
315 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
316 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
317 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
318 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
319 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
320 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
321 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,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
322 //error:0.000022
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
323 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
324 static const uint8_t obmc16[256]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
325 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
326 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
327 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
328 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
329 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
330 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
331 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
332 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
333 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
334 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
335 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
336 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
337 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
338 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
339 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
340 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
341 //error:0.000022
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
342 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
343 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
344
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
345 //linear *64
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
346 static const uint8_t obmc8[64]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
347 4, 12, 20, 28, 28, 20, 12, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
348 12, 36, 60, 84, 84, 60, 36, 12,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
349 20, 60,100,140,140,100, 60, 20,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
350 28, 84,140,196,196,140, 84, 28,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
351 28, 84,140,196,196,140, 84, 28,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
352 20, 60,100,140,140,100, 60, 20,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
353 12, 36, 60, 84, 84, 60, 36, 12,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
354 4, 12, 20, 28, 28, 20, 12, 4,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
355 //error:0.000000
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
356 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
357
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
358 //linear *64
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
359 static const uint8_t obmc4[16]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
360 16, 48, 48, 16,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
361 48,144,144, 48,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
362 48,144,144, 48,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
363 16, 48, 48, 16,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
364 //error:0.000000
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
365 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
366
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
367 static const uint8_t *obmc_tab[4]={
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
368 obmc32, obmc16, obmc8, obmc4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
369 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
370
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
371 static int scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
372
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
373 typedef struct BlockNode{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
374 int16_t mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
375 int16_t my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
376 uint8_t ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
377 uint8_t color[3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
378 uint8_t type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
379 //#define TYPE_SPLIT 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
380 #define BLOCK_INTRA 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
381 #define BLOCK_OPT 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
382 //#define TYPE_NOCOLOR 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
383 uint8_t level; //FIXME merge into type?
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
384 }BlockNode;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
385
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
386 static const BlockNode null_block= { //FIXME add border maybe
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
387 .color= {128,128,128},
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
388 .mx= 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
389 .my= 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
390 .ref= 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
391 .type= 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
392 .level= 0,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
393 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
394
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
395 #define LOG2_MB_SIZE 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
396 #define MB_SIZE (1<<LOG2_MB_SIZE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
397
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
398 typedef struct x_and_coeff{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
399 int16_t x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
400 uint16_t coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
401 } x_and_coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
402
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
403 typedef struct SubBand{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
404 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
405 int stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
406 int width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
407 int height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
408 int qlog; ///< log(qscale)/log[2^(1/6)]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
409 DWTELEM *buf;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
410 int buf_x_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
411 int buf_y_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
412 int stride_line; ///< Stride measured in lines, not pixels.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
413 x_and_coeff * x_coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
414 struct SubBand *parent;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
415 uint8_t state[/*7*2*/ 7 + 512][32];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
416 }SubBand;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
417
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
418 typedef struct Plane{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
419 int width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
420 int height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
421 SubBand band[MAX_DECOMPOSITIONS][4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
422 }Plane;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
423
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
424 typedef struct SnowContext{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
425 // 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)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
426
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
427 AVCodecContext *avctx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
428 RangeCoder c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
429 DSPContext dsp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
430 AVFrame new_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
431 AVFrame input_picture; ///< new_picture with the internal linesizes
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
432 AVFrame current_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
433 AVFrame last_picture[MAX_REF_FRAMES];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
434 AVFrame mconly_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
435 // uint8_t q_context[16];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
436 uint8_t header_state[32];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
437 uint8_t block_state[128 + 32*128];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
438 int keyframe;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
439 int always_reset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
440 int version;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
441 int spatial_decomposition_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
442 int temporal_decomposition_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
443 int spatial_decomposition_count;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
444 int temporal_decomposition_count;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
445 int max_ref_frames;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
446 int ref_frames;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
447 int16_t (*ref_mvs[MAX_REF_FRAMES])[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
448 uint32_t *ref_scores[MAX_REF_FRAMES];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
449 DWTELEM *spatial_dwt_buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
450 int colorspace_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
451 int chroma_h_shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
452 int chroma_v_shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
453 int spatial_scalability;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
454 int qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
455 int lambda;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
456 int lambda2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
457 int pass1_rc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
458 int mv_scale;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
459 int qbias;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
460 #define QBIAS_SHIFT 3
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
461 int b_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
462 int b_height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
463 int block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
464 Plane plane[MAX_PLANES];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
465 BlockNode *block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
466 #define ME_CACHE_SIZE 1024
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
467 int me_cache[ME_CACHE_SIZE];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
468 int me_cache_generation;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
469 slice_buffer sb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
470
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
471 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)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
472 }SnowContext;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
473
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
474 typedef struct {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
475 DWTELEM *b0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
476 DWTELEM *b1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
477 DWTELEM *b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
478 DWTELEM *b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
479 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
480 } dwt_compose_t;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
481
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
482 #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num)))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
483 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num)))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
484
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
485 static void iterative_me(SnowContext *s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
486
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
487 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
488 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
489 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
490
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
491 buf->base_buffer = base_buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
492 buf->line_count = line_count;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
493 buf->line_width = line_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
494 buf->data_count = max_allocated_lines;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
495 buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
496 buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
497
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
498 for (i = 0; i < max_allocated_lines; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
499 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
500 buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
501 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
502
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
503 buf->data_stack_top = max_allocated_lines - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
504 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
505
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
506 static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
507 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
508 int offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
509 DWTELEM * buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
510
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
511 // av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
512
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
513 assert(buf->data_stack_top >= 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
514 // assert(!buf->line[line]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
515 if (buf->line[line])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
516 return buf->line[line];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
517
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
518 offset = buf->line_width * line;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
519 buffer = buf->data_stack[buf->data_stack_top];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
520 buf->data_stack_top--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
521 buf->line[line] = buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
522
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
523 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
524
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
525 return buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
526 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
527
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
528 static void slice_buffer_release(slice_buffer * buf, int line)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
529 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
530 int offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
531 DWTELEM * buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
532
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
533 assert(line >= 0 && line < buf->line_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
534 assert(buf->line[line]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
535
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
536 offset = buf->line_width * line;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
537 buffer = buf->line[line];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
538 buf->data_stack_top++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
539 buf->data_stack[buf->data_stack_top] = buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
540 buf->line[line] = NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
541
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
542 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
543 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
544
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
545 static void slice_buffer_flush(slice_buffer * buf)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
546 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
547 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
548 for (i = 0; i < buf->line_count; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
549 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
550 if (buf->line[i])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
551 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
552 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
553 slice_buffer_release(buf, i);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
554 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
555 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
556 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
557
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
558 static void slice_buffer_destroy(slice_buffer * buf)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
559 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
560 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
561 slice_buffer_flush(buf);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
562
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
563 for (i = buf->data_count - 1; i >= 0; i--)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
564 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
565 assert(buf->data_stack[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
566 av_freep(&buf->data_stack[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
567 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
568 assert(buf->data_stack);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
569 av_freep(&buf->data_stack);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
570 assert(buf->line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
571 av_freep(&buf->line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
572 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
573
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
574 #ifdef __sgi
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
575 // Avoid a name clash on SGI IRIX
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
576 #undef qexp
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
577 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
578 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
579 static uint8_t qexp[QROOT];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
580
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
581 static inline int mirror(int v, int m){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
582 while((unsigned)v > (unsigned)m){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
583 v=-v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
584 if(v<0) v+= 2*m;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
585 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
586 return v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
587 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
588
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
589 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
590 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
591
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
592 if(v){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
593 const int a= FFABS(v);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
594 const int e= av_log2(a);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
595 #if 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
596 const int el= FFMIN(e, 10);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
597 put_rac(c, state+0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
598
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
599 for(i=0; i<el; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
600 put_rac(c, state+1+i, 1); //1..10
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
601 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
602 for(; i<e; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
603 put_rac(c, state+1+9, 1); //1..10
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
604 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
605 put_rac(c, state+1+FFMIN(i,9), 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
606
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
607 for(i=e-1; i>=el; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
608 put_rac(c, state+22+9, (a>>i)&1); //22..31
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
609 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
610 for(; i>=0; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
611 put_rac(c, state+22+i, (a>>i)&1); //22..31
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
612 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
613
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
614 if(is_signed)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
615 put_rac(c, state+11 + el, v < 0); //11..21
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
616 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
617
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
618 put_rac(c, state+0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
619 if(e<=9){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
620 for(i=0; i<e; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
621 put_rac(c, state+1+i, 1); //1..10
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
622 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
623 put_rac(c, state+1+i, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
624
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
625 for(i=e-1; i>=0; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
626 put_rac(c, state+22+i, (a>>i)&1); //22..31
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
627 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
628
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
629 if(is_signed)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
630 put_rac(c, state+11 + e, v < 0); //11..21
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
631 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
632 for(i=0; i<e; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
633 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
634 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
635 put_rac(c, state+1+FFMIN(i,9), 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
636
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
637 for(i=e-1; i>=0; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
638 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
639 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
640
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
641 if(is_signed)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
642 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
643 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
644 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
645 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
646 put_rac(c, state+0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
647 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
648 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
649
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
650 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
651 if(get_rac(c, state+0))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
652 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
653 else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
654 int i, e, a;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
655 e= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
656 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
657 e++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
658 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
659
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
660 a= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
661 for(i=e-1; i>=0; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
662 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
663 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
664
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
665 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
666 return -a;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
667 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
668 return a;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
669 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
670 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
671
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
672 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
673 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
674 int r= log2>=0 ? 1<<log2 : 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
675
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
676 assert(v>=0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
677 assert(log2>=-4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
678
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
679 while(v >= r){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
680 put_rac(c, state+4+log2, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
681 v -= r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
682 log2++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
683 if(log2>0) r+=r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
684 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
685 put_rac(c, state+4+log2, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
686
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
687 for(i=log2-1; i>=0; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
688 put_rac(c, state+31-i, (v>>i)&1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
689 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
690 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
691
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
692 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
693 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
694 int r= log2>=0 ? 1<<log2 : 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
695 int v=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
696
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
697 assert(log2>=-4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
698
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
699 while(get_rac(c, state+4+log2)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
700 v+= r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
701 log2++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
702 if(log2>0) r+=r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
703 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
704
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
705 for(i=log2-1; i>=0; i--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
706 v+= get_rac(c, state+31-i)<<i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
707 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
708
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
709 return v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
710 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
711
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
712 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){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
713 const int mirror_left= !highpass;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
714 const int mirror_right= (width&1) ^ highpass;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
715 const int w= (width>>1) - 1 + (highpass & width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
716 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
717
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
718 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref)))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
719 if(mirror_left){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
720 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
721 dst += dst_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
722 src += src_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
723 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
724
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
725 for(i=0; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
726 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
727 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
728
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
729 if(mirror_right){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
730 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
731 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
732 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
733
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
734 #ifndef lift5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
735 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){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
736 const int mirror_left= !highpass;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
737 const int mirror_right= (width&1) ^ highpass;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
738 const int w= (width>>1) - 1 + (highpass & width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
739 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
740
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
741 if(mirror_left){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
742 int r= 3*2*ref[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
743 r += r>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
744 r += r>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
745 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
746 dst += dst_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
747 src += src_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
748 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
749
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
750 for(i=0; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
751 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
752 r += r>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
753 r += r>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
754 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
755 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
756
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
757 if(mirror_right){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
758 int r= 3*2*ref[w*ref_step];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
759 r += r>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
760 r += r>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
761 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
762 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
763 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
764 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
765
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
766 #ifndef liftS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
767 static always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
768 const int mirror_left= !highpass;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
769 const int mirror_right= (width&1) ^ highpass;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
770 const int w= (width>>1) - 1 + (highpass & width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
771 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
772
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
773 assert(shift == 4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
774 #define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
775 if(mirror_left){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
776 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
777 dst += dst_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
778 src += src_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
779 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
780
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
781 for(i=0; i<w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
782 dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
783 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
784
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
785 if(mirror_right){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
786 dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
787 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
788 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
789 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
790
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
791
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
792 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
793 int x, i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
794
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
795 for(x=start; x<width; x+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
796 int64_t sum=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
797
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
798 for(i=0; i<n; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
799 int x2= x + 2*i - n + 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
800 if (x2< 0) x2= -x2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
801 else if(x2>=width) x2= 2*width-x2-2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
802 sum += coeffs[i]*(int64_t)dst[x2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
803 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
804 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
805 else dst[x] += (sum + (1<<shift)/2)>>shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
806 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
807 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
808
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
809 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
810 int x, y, i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
811 for(y=start; y<height; y+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
812 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
813 int64_t sum=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
814
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
815 for(i=0; i<n; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
816 int y2= y + 2*i - n + 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
817 if (y2< 0) y2= -y2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
818 else if(y2>=height) y2= 2*height-y2-2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
819 sum += coeffs[i]*(int64_t)dst[x + y2*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
820 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
821 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
822 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
823 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
824 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
825 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
826
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
827 #define SCALEX 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
828 #define LX0 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
829 #define LX1 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
830
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
831 #if 0 // more accurate 9/7
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
832 #define N1 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
833 #define SHIFT1 14
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
834 #define COEFFS1 (int[]){-25987,-25987}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
835 #define N2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
836 #define SHIFT2 19
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
837 #define COEFFS2 (int[]){-27777,-27777}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
838 #define N3 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
839 #define SHIFT3 15
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
840 #define COEFFS3 (int[]){28931,28931}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
841 #define N4 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
842 #define SHIFT4 15
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
843 #define COEFFS4 (int[]){14533,14533}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
844 #elif 1 // 13/7 CRF
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
845 #define N1 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
846 #define SHIFT1 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
847 #define COEFFS1 (int[]){1,-9,-9,1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
848 #define N2 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
849 #define SHIFT2 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
850 #define COEFFS2 (int[]){-1,5,5,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
851 #define N3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
852 #define SHIFT3 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
853 #define COEFFS3 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
854 #define N4 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
855 #define SHIFT4 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
856 #define COEFFS4 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
857 #elif 1 // 3/5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
858 #define LX0 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
859 #define LX1 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
860 #define SCALEX 0.5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
861 #define N1 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
862 #define SHIFT1 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
863 #define COEFFS1 (int[]){1,1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
864 #define N2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
865 #define SHIFT2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
866 #define COEFFS2 (int[]){-1,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
867 #define N3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
868 #define SHIFT3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
869 #define COEFFS3 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
870 #define N4 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
871 #define SHIFT4 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
872 #define COEFFS4 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
873 #elif 1 // 11/5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
874 #define N1 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
875 #define SHIFT1 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
876 #define COEFFS1 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
877 #define N2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
878 #define SHIFT2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
879 #define COEFFS2 (int[]){-1,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
880 #define N3 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
881 #define SHIFT3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
882 #define COEFFS3 (int[]){-1,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
883 #define N4 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
884 #define SHIFT4 7
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
885 #define COEFFS4 (int[]){-5,29,29,-5}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
886 #define SCALEX 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
887 #elif 1 // 9/7 CDF
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
888 #define N1 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
889 #define SHIFT1 7
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
890 #define COEFFS1 (int[]){-203,-203}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
891 #define N2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
892 #define SHIFT2 12
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
893 #define COEFFS2 (int[]){-217,-217}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
894 #define N3 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
895 #define SHIFT3 7
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
896 #define COEFFS3 (int[]){113,113}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
897 #define N4 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
898 #define SHIFT4 9
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
899 #define COEFFS4 (int[]){227,227}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
900 #define SCALEX 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
901 #elif 1 // 7/5 CDF
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
902 #define N1 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
903 #define SHIFT1 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
904 #define COEFFS1 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
905 #define N2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
906 #define SHIFT2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
907 #define COEFFS2 (int[]){-1,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
908 #define N3 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
909 #define SHIFT3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
910 #define COEFFS3 (int[]){-1,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
911 #define N4 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
912 #define SHIFT4 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
913 #define COEFFS4 (int[]){3,3}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
914 #elif 1 // 9/7 MN
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
915 #define N1 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
916 #define SHIFT1 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
917 #define COEFFS1 (int[]){1,-9,-9,1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
918 #define N2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
919 #define SHIFT2 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
920 #define COEFFS2 (int[]){1,1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
921 #define N3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
922 #define SHIFT3 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
923 #define COEFFS3 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
924 #define N4 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
925 #define SHIFT4 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
926 #define COEFFS4 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
927 #else // 13/7 CRF
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
928 #define N1 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
929 #define SHIFT1 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
930 #define COEFFS1 (int[]){1,-9,-9,1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
931 #define N2 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
932 #define SHIFT2 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
933 #define COEFFS2 (int[]){-1,5,5,-1}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
934 #define N3 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
935 #define SHIFT3 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
936 #define COEFFS3 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
937 #define N4 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
938 #define SHIFT4 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
939 #define COEFFS4 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
940 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
941 static void horizontal_decomposeX(DWTELEM *b, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
942 DWTELEM temp[width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
943 const int width2= width>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
944 const int w2= (width+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
945 int x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
946
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
947 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
948 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
949 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
950 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
951
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
952 for(x=0; x<width2; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
953 temp[x ]= b[2*x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
954 temp[x+w2]= b[2*x + 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
955 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
956 if(width&1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
957 temp[x ]= b[2*x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
958 memcpy(b, temp, width*sizeof(int));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
959 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
960
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
961 static void horizontal_composeX(DWTELEM *b, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
962 DWTELEM temp[width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
963 const int width2= width>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
964 int x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
965 const int w2= (width+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
966
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
967 memcpy(temp, b, width*sizeof(int));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
968 for(x=0; x<width2; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
969 b[2*x ]= temp[x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
970 b[2*x + 1]= temp[x+w2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
971 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
972 if(width&1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
973 b[2*x ]= temp[x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
974
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
975 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
976 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
977 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
978 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
979 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
980
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
981 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
982 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
983
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
984 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
985 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
986 buffer[y*stride + x] *= SCALEX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
987 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
988 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
989
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
990 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
991 horizontal_decomposeX(buffer + y*stride, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
992 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
993
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
994 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
995 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
996 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
997 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
998 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
999
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1000 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1001 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1002
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1003 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1004 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1005 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1006 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1007
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1008 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1009 horizontal_composeX(buffer + y*stride, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1010 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1011
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1012 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1013 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1014 buffer[y*stride + x] /= SCALEX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1015 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1016 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1017 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1018
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1019 static void horizontal_decompose53i(DWTELEM *b, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1020 DWTELEM temp[width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1021 const int width2= width>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1022 int x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1023 const int w2= (width+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1024
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1025 for(x=0; x<width2; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1026 temp[x ]= b[2*x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1027 temp[x+w2]= b[2*x + 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1028 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1029 if(width&1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1030 temp[x ]= b[2*x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1031 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1032 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1033 int A1,A2,A3,A4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1034 A2= temp[1 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1035 A4= temp[0 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1036 A1= temp[0+width2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1037 A1 -= (A2 + A4)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1038 A4 += (A1 + 1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1039 b[0+width2] = A1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1040 b[0 ] = A4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1041 for(x=1; x+1<width2; x+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1042 A3= temp[x+width2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1043 A4= temp[x+1 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1044 A3 -= (A2 + A4)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1045 A2 += (A1 + A3 + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1046 b[x+width2] = A3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1047 b[x ] = A2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1048
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1049 A1= temp[x+1+width2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1050 A2= temp[x+2 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1051 A1 -= (A2 + A4)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1052 A4 += (A1 + A3 + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1053 b[x+1+width2] = A1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1054 b[x+1 ] = A4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1055 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1056 A3= temp[width-1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1057 A3 -= A2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1058 A2 += (A1 + A3 + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1059 b[width -1] = A3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1060 b[width2-1] = A2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1061 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1062 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1063 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1064 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1065 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1066 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1067
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1068 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1069 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1070
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1071 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1072 b1[i] -= (b0[i] + b2[i])>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1073 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1074 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1075
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1076 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1077 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1078
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1079 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1080 b1[i] += (b0[i] + b2[i] + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1081 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1082 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1083
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1084 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1085 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1086 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1087 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1088
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1089 for(y=-2; y<height; y+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1090 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1091 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1092
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1093 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1094 if(y+1<(unsigned)height) horizontal_decompose53i(b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1095 if(y+2<(unsigned)height) horizontal_decompose53i(b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1096 STOP_TIMER("horizontal_decompose53i")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1097
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1098 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1099 if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1100 if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1101 STOP_TIMER("vertical_decompose53i*")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1102
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1103 b0=b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1104 b1=b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1105 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1106 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1107
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1108 static void horizontal_decompose97i(DWTELEM *b, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1109 DWTELEM temp[width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1110 const int w2= (width+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1111
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1112 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1113 liftS(temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1114 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1115 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1116 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1117
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1118
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1119 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1120 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1121
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1122 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1123 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1124 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1125 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1126
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1127 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1128 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1129
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1130 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1131 #ifdef lift5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1132 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1133 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1134 int r= 3*(b0[i] + b2[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1135 r+= r>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1136 r+= r>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1137 b1[i] += (r+W_CO)>>W_CS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1138 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1139 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1140 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1141
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1142 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1143 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1144
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1145 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1146 #ifdef liftS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1147 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1148 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1149 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1150 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1151 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1152 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1153
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1154 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1155 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1156
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1157 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1158 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1159 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1160 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1161
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1162 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1163 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1164 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1165 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1166 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1167 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1168
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1169 for(y=-4; y<height; y+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1170 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1171 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1172
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1173 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1174 if(y+3<(unsigned)height) horizontal_decompose97i(b4, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1175 if(y+4<(unsigned)height) horizontal_decompose97i(b5, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1176 if(width>400){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1177 STOP_TIMER("horizontal_decompose97i")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1178 }}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1179
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1180 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1181 if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1182 if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1183 if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1184 if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1185
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1186 if(width>400){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1187 STOP_TIMER("vertical_decompose97i")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1188 }}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1189
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1190 b0=b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1191 b1=b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1192 b2=b4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1193 b3=b5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1194 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1195 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1196
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1197 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1198 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1199
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1200 for(level=0; level<decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1201 switch(type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1202 case DWT_97: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1203 case DWT_53: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1204 case DWT_X: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1205 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1206 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1207 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1208
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1209 static void horizontal_compose53i(DWTELEM *b, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1210 DWTELEM temp[width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1211 const int width2= width>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1212 const int w2= (width+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1213 int x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1214
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1215 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1216 int A1,A2,A3,A4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1217 A2= temp[1 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1218 A4= temp[0 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1219 A1= temp[0+width2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1220 A1 -= (A2 + A4)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1221 A4 += (A1 + 1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1222 b[0+width2] = A1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1223 b[0 ] = A4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1224 for(x=1; x+1<width2; x+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1225 A3= temp[x+width2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1226 A4= temp[x+1 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1227 A3 -= (A2 + A4)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1228 A2 += (A1 + A3 + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1229 b[x+width2] = A3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1230 b[x ] = A2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1231
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1232 A1= temp[x+1+width2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1233 A2= temp[x+2 ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1234 A1 -= (A2 + A4)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1235 A4 += (A1 + A3 + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1236 b[x+1+width2] = A1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1237 b[x+1 ] = A4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1238 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1239 A3= temp[width-1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1240 A3 -= A2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1241 A2 += (A1 + A3 + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1242 b[width -1] = A3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1243 b[width2-1] = A2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1244 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1245 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1246 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1247 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1248 for(x=0; x<width2; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1249 b[2*x ]= temp[x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1250 b[2*x + 1]= temp[x+w2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1251 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1252 if(width&1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1253 b[2*x ]= temp[x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1254 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1255
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1256 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1257 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1258
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1259 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1260 b1[i] += (b0[i] + b2[i])>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1261 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1262 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1263
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1264 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1265 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1266
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1267 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1268 b1[i] -= (b0[i] + b2[i] + 2)>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1269 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1270 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1271
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1272 static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1273 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1274 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1275 cs->y = -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1276 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1277
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1278 static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1279 cs->b0 = buffer + mirror(-1-1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1280 cs->b1 = buffer + mirror(-1 , height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1281 cs->y = -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1282 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1283
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1284 static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1285 int y= cs->y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1286
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1287 DWTELEM *b0= cs->b0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1288 DWTELEM *b1= cs->b1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1289 DWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1290 DWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1291
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1292 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1293 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1294 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1295 STOP_TIMER("vertical_compose53i*")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1296
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1297 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1298 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1299 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1300 STOP_TIMER("horizontal_compose53i")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1301
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1302 cs->b0 = b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1303 cs->b1 = b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1304 cs->y += 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1305 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1306
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1307 static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1308 int y= cs->y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1309 DWTELEM *b0= cs->b0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1310 DWTELEM *b1= cs->b1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1311 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1312 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1313
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1314 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1315 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1316 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1317 STOP_TIMER("vertical_compose53i*")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1318
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1319 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1320 if(y-1<(unsigned)height) horizontal_compose53i(b0, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1321 if(y+0<(unsigned)height) horizontal_compose53i(b1, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1322 STOP_TIMER("horizontal_compose53i")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1323
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1324 cs->b0 = b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1325 cs->b1 = b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1326 cs->y += 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1327 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1328
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1329 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1330 dwt_compose_t cs;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1331 spatial_compose53i_init(&cs, buffer, height, stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1332 while(cs.y <= height)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1333 spatial_compose53i_dy(&cs, buffer, width, height, stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1334 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1335
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1336
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1337 void ff_snow_horizontal_compose97i(DWTELEM *b, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1338 DWTELEM temp[width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1339 const int w2= (width+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1340
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1341 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1342 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1343 liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1344 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1345 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1346
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1347 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1348 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1349
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1350 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1351 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1352 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1353 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1354
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1355 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1356 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1357
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1358 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1359 #ifdef lift5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1360 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1361 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1362 int r= 3*(b0[i] + b2[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1363 r+= r>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1364 r+= r>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1365 b1[i] -= (r+W_CO)>>W_CS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1366 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1367 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1368 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1369
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1370 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1371 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1372
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1373 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1374 #ifdef liftS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1375 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1376 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1377 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1378 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1379 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1380 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1381
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1382 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1383 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1384
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1385 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1386 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1387 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1388 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1389
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1390 void ff_snow_vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1391 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1392
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1393 for(i=0; i<width; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1394 #ifndef lift5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1395 int r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1396 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1397 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1398 #ifdef lift5
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1399 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1400 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1401 r= 3*(b2[i] + b4[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1402 r+= r>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1403 r+= r>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1404 b3[i] -= (r+W_CO)>>W_CS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1405 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1406 #ifdef liftS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1407 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1408 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1409 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1410 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1411 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1412 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1413 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1414
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1415 static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1416 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1417 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1418 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1419 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1420 cs->y = -3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1421 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1422
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1423 static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1424 cs->b0 = buffer + mirror(-3-1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1425 cs->b1 = buffer + mirror(-3 , height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1426 cs->b2 = buffer + mirror(-3+1, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1427 cs->b3 = buffer + mirror(-3+2, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1428 cs->y = -3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1429 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1430
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1431 static void spatial_compose97i_dy_buffered(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1432 int y = cs->y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1433
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1434 DWTELEM *b0= cs->b0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1435 DWTELEM *b1= cs->b1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1436 DWTELEM *b2= cs->b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1437 DWTELEM *b3= cs->b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1438 DWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1439 DWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1440
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1441 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1442 if(y>0 && y+4<height){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1443 dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1444 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1445 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1446 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1447 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1448 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1449 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1450 if(width>400){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1451 STOP_TIMER("vertical_compose97i")}}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1452
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1453 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1454 if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1455 if(y+0<(unsigned)height) dsp->horizontal_compose97i(b1, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1456 if(width>400 && y+0<(unsigned)height){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1457 STOP_TIMER("horizontal_compose97i")}}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1458
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1459 cs->b0=b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1460 cs->b1=b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1461 cs->b2=b4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1462 cs->b3=b5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1463 cs->y += 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1464 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1465
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1466 static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1467 int y = cs->y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1468 DWTELEM *b0= cs->b0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1469 DWTELEM *b1= cs->b1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1470 DWTELEM *b2= cs->b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1471 DWTELEM *b3= cs->b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1472 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1473 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1474
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1475 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1476 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1477 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1478 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1479 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1480 if(width>400){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1481 STOP_TIMER("vertical_compose97i")}}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1482
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1483 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1484 if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1485 if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1486 if(width>400 && b0 <= b2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1487 STOP_TIMER("horizontal_compose97i")}}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1488
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1489 cs->b0=b2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1490 cs->b1=b3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1491 cs->b2=b4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1492 cs->b3=b5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1493 cs->y += 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1494 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1495
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1496 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1497 dwt_compose_t cs;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1498 spatial_compose97i_init(&cs, buffer, height, stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1499 while(cs.y <= height)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1500 spatial_compose97i_dy(&cs, buffer, width, height, stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1501 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1502
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1503 static void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1504 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1505 for(level=decomposition_count-1; level>=0; level--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1506 switch(type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1507 case DWT_97: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1508 case DWT_53: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1509 /* not slicified yet */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1510 case DWT_X: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1511 av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1512 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1513 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1514 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1515
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1516 static void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1517 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1518 for(level=decomposition_count-1; level>=0; level--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1519 switch(type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1520 case DWT_97: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1521 case DWT_53: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1522 /* not slicified yet */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1523 case DWT_X: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1524 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1525 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1526 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1527
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1528 static void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1529 const int support = type==1 ? 3 : 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1530 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1531 if(type==2) return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1532
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1533 for(level=decomposition_count-1; level>=0; level--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1534 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1535 switch(type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1536 case DWT_97: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1537 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1538 case DWT_53: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1539 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1540 case DWT_X: break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1541 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1542 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1543 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1544 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1545
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1546 static void ff_spatial_idwt_buffered_slice(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1547 const int support = type==1 ? 3 : 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1548 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1549 if(type==2) return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1550
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1551 for(level=decomposition_count-1; level>=0; level--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1552 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1553 switch(type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1554 case DWT_97: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1555 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1556 case DWT_53: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1557 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1558 case DWT_X: break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1559 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1560 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1561 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1562 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1563
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1564 static void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1565 if(type==2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1566 int level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1567 for(level=decomposition_count-1; level>=0; level--)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1568 spatial_composeX (buffer, width>>level, height>>level, stride<<level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1569 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1570 dwt_compose_t cs[MAX_DECOMPOSITIONS];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1571 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1572 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1573 for(y=0; y<height; y+=4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1574 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1575 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1576 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1577
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1578 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1579 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1580 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1581 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1582
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1583 if(1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1584 int run=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1585 int runs[w*h];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1586 int run_index=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1587 int max_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1588
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1589 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1590 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1591 int v, p=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1592 int /*ll=0, */l=0, lt=0, t=0, rt=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1593 v= src[x + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1594
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1595 if(y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1596 t= src[x + (y-1)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1597 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1598 lt= src[x - 1 + (y-1)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1599 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1600 if(x + 1 < w){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1601 rt= src[x + 1 + (y-1)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1602 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1603 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1604 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1605 l= src[x - 1 + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1606 /*if(x > 1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1607 if(orientation==1) ll= src[y + (x-2)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1608 else ll= src[x - 2 + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1609 }*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1610 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1611 if(parent){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1612 int px= x>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1613 int py= y>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1614 if(px<b->parent->width && py<b->parent->height)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1615 p= parent[px + py*2*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1616 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1617 if(!(/*ll|*/l|lt|t|rt|p)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1618 if(v){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1619 runs[run_index++]= run;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1620 run=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1621 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1622 run++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1623 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1624 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1625 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1626 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1627 max_index= run_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1628 runs[run_index++]= run;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1629 run_index=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1630 run= runs[run_index++];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1631
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1632 put_symbol2(&s->c, b->state[30], max_index, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1633 if(run_index <= max_index)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1634 put_symbol2(&s->c, b->state[1], run, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1635
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1636 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1637 if(s->c.bytestream_end - s->c.bytestream < w*40){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1638 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1639 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1640 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1641 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1642 int v, p=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1643 int /*ll=0, */l=0, lt=0, t=0, rt=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1644 v= src[x + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1645
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1646 if(y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1647 t= src[x + (y-1)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1648 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1649 lt= src[x - 1 + (y-1)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1650 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1651 if(x + 1 < w){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1652 rt= src[x + 1 + (y-1)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1653 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1654 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1655 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1656 l= src[x - 1 + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1657 /*if(x > 1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1658 if(orientation==1) ll= src[y + (x-2)*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1659 else ll= src[x - 2 + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1660 }*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1661 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1662 if(parent){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1663 int px= x>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1664 int py= y>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1665 if(px<b->parent->width && py<b->parent->height)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1666 p= parent[px + py*2*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1667 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1668 if(/*ll|*/l|lt|t|rt|p){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1669 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1670
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1671 put_rac(&s->c, &b->state[0][context], !!v);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1672 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1673 if(!run){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1674 run= runs[run_index++];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1675
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1676 if(run_index <= max_index)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1677 put_symbol2(&s->c, b->state[1], run, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1678 assert(v);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1679 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1680 run--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1681 assert(!v);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1682 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1683 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1684 if(v){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1685 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1686 int l2= 2*FFABS(l) + (l<0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1687 int t2= 2*FFABS(t) + (t<0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1688
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1689 put_symbol2(&s->c, b->state[context + 2], FFABS(v)-1, context-4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1690 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1691 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1692 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1693 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1694 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1695 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1696 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1697
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1698 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1699 // encode_subband_qtree(s, b, src, parent, stride, orientation);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1700 // encode_subband_z0run(s, b, src, parent, stride, orientation);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1701 return encode_subband_c0run(s, b, src, parent, stride, orientation);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1702 // encode_subband_dzr(s, b, src, parent, stride, orientation);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1703 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1704
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1705 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1706 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1707 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1708 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1709
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1710 if(1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1711 int run, runs;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1712 x_and_coeff *xc= b->x_coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1713 x_and_coeff *prev_xc= NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1714 x_and_coeff *prev2_xc= xc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1715 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1716 x_and_coeff *prev_parent_xc= parent_xc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1717
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1718 runs= get_symbol2(&s->c, b->state[30], 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1719 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1720 else run= INT_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1721
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1722 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1723 int v=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1724 int lt=0, t=0, rt=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1725
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1726 if(y && prev_xc->x == 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1727 rt= prev_xc->coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1728 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1729 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1730 int p=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1731 const int l= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1732
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1733 lt= t; t= rt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1734
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1735 if(y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1736 if(prev_xc->x <= x)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1737 prev_xc++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1738 if(prev_xc->x == x + 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1739 rt= prev_xc->coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1740 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1741 rt=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1742 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1743 if(parent_xc){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1744 if(x>>1 > parent_xc->x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1745 parent_xc++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1746 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1747 if(x>>1 == parent_xc->x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1748 p= parent_xc->coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1749 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1750 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1751 if(/*ll|*/l|lt|t|rt|p){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1752 int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1753
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1754 v=get_rac(&s->c, &b->state[0][context]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1755 if(v){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1756 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1757 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1758
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1759 xc->x=x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1760 (xc++)->coeff= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1761 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1762 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1763 if(!run){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1764 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1765 else run= INT_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1766 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1767 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1768
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1769 xc->x=x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1770 (xc++)->coeff= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1771 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1772 int max_run;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1773 run--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1774 v=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1775
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1776 if(y) max_run= FFMIN(run, prev_xc->x - x - 2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1777 else max_run= FFMIN(run, w-x-1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1778 if(parent_xc)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1779 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1780 x+= max_run;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1781 run-= max_run;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1782 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1783 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1784 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1785 (xc++)->x= w+1; //end marker
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1786 prev_xc= prev2_xc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1787 prev2_xc= xc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1788
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1789 if(parent_xc){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1790 if(y&1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1791 while(parent_xc->x != parent->width+1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1792 parent_xc++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1793 parent_xc++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1794 prev_parent_xc= parent_xc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1795 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1796 parent_xc= prev_parent_xc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1797 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1798 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1799 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1800
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1801 (xc++)->x= w+1; //end marker
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1802 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1803 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1804
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1805 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1806 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1807 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1808 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1809 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1810 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1811 int new_index = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1812
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1813 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1814
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1815 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1816 qadd= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1817 qmul= 1<<QEXPSHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1818 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1819
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1820 /* If we are on the second or later slice, restore our index. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1821 if (start_y != 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1822 new_index = save_state[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1823
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1824
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1825 for(y=start_y; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1826 int x = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1827 int v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1828 DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1829 memset(line, 0, b->width*sizeof(DWTELEM));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1830 v = b->x_coeff[new_index].coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1831 x = b->x_coeff[new_index++].x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1832 while(x < w)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1833 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1834 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1835 register int u= -(v&1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1836 line[x] = (t^u) - u;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1837
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1838 v = b->x_coeff[new_index].coeff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1839 x = b->x_coeff[new_index++].x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1840 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1841 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1842 if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1843 STOP_TIMER("decode_subband")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1844 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1845
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1846 /* Save our variables for the next slice. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1847 save_state[0] = new_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1848
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1849 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1850 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1851
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1852 static void reset_contexts(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1853 int plane_index, level, orientation;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1854
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1855 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1856 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1857 for(orientation=level ? 1:0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1858 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1859 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1860 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1861 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1862 memset(s->header_state, MID_STATE, sizeof(s->header_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1863 memset(s->block_state, MID_STATE, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1864 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1865
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1866 static int alloc_blocks(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1867 int w= -((-s->avctx->width )>>LOG2_MB_SIZE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1868 int h= -((-s->avctx->height)>>LOG2_MB_SIZE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1869
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1870 s->b_width = w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1871 s->b_height= h;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1872
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1873 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1874 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1875 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1876
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1877 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1878 uint8_t *bytestream= d->bytestream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1879 uint8_t *bytestream_start= d->bytestream_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1880 *d= *s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1881 d->bytestream= bytestream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1882 d->bytestream_start= bytestream_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1883 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1884
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1885 //near copy & paste from dsputil, FIXME
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1886 static int pix_sum(uint8_t * pix, int line_size, int w)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1887 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1888 int s, i, j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1889
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1890 s = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1891 for (i = 0; i < w; i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1892 for (j = 0; j < w; j++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1893 s += pix[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1894 pix ++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1895 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1896 pix += line_size - w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1897 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1898 return s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1899 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1900
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1901 //near copy & paste from dsputil, FIXME
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1902 static int pix_norm1(uint8_t * pix, int line_size, int w)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1903 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1904 int s, i, j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1905 uint32_t *sq = squareTbl + 256;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1906
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1907 s = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1908 for (i = 0; i < w; i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1909 for (j = 0; j < w; j ++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1910 s += sq[pix[0]];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1911 pix ++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1912 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1913 pix += line_size - w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1914 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1915 return s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1916 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1917
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1918 static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int ref, int type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1919 const int w= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1920 const int rem_depth= s->block_max_depth - level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1921 const int index= (x + y*w) << rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1922 const int block_w= 1<<rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1923 BlockNode block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1924 int i,j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1925
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1926 block.color[0]= l;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1927 block.color[1]= cb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1928 block.color[2]= cr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1929 block.mx= mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1930 block.my= my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1931 block.ref= ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1932 block.type= type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1933 block.level= level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1934
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1935 for(j=0; j<block_w; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1936 for(i=0; i<block_w; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1937 s->block[index + i + j*w]= block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1938 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1939 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1940 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1941
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1942 static inline void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1943 const int offset[3]= {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1944 y*c-> stride + x,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1945 ((y*c->uvstride + x)>>1),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1946 ((y*c->uvstride + x)>>1),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1947 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1948 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1949 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1950 c->src[0][i]= src [i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1951 c->ref[0][i]= ref [i] + offset[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1952 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1953 assert(!ref_index);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1954 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1955
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1956 static inline void pred_mv(SnowContext *s, int *mx, int *my, int ref,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1957 BlockNode *left, BlockNode *top, BlockNode *tr){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1958 if(s->ref_frames == 1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1959 *mx = mid_pred(left->mx, top->mx, tr->mx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1960 *my = mid_pred(left->my, top->my, tr->my);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1961 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1962 const int *scale = scale_mv_ref[ref];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1963 *mx = mid_pred(left->mx * scale[left->ref] + 128 >>8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1964 top ->mx * scale[top ->ref] + 128 >>8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1965 tr ->mx * scale[tr ->ref] + 128 >>8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1966 *my = mid_pred(left->my * scale[left->ref] + 128 >>8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1967 top ->my * scale[top ->ref] + 128 >>8,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1968 tr ->my * scale[tr ->ref] + 128 >>8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1969 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1970 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1971
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1972 //FIXME copy&paste
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1973 #define P_LEFT P[1]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1974 #define P_TOP P[2]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1975 #define P_TOPRIGHT P[3]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1976 #define P_MEDIAN P[4]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1977 #define P_MV1 P[9]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1978 #define FLAG_QPEL 1 //must be 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1979
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1980 static int encode_q_branch(SnowContext *s, int level, int x, int y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1981 uint8_t p_buffer[1024];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1982 uint8_t i_buffer[1024];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1983 uint8_t p_state[sizeof(s->block_state)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1984 uint8_t i_state[sizeof(s->block_state)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1985 RangeCoder pc, ic;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1986 uint8_t *pbbak= s->c.bytestream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1987 uint8_t *pbbak_start= s->c.bytestream_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1988 int score, score2, iscore, i_len, p_len, block_s, sum;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1989 const int w= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1990 const int h= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1991 const int rem_depth= s->block_max_depth - level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1992 const int index= (x + y*w) << rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1993 const int block_w= 1<<(LOG2_MB_SIZE - level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1994 int trx= (x+1)<<rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1995 int try= (y+1)<<rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1996 BlockNode *left = x ? &s->block[index-1] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1997 BlockNode *top = y ? &s->block[index-w] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1998 BlockNode *right = trx<w ? &s->block[index+1] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1999 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2000 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2001 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2002 int pl = left->color[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2003 int pcb= left->color[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2004 int pcr= left->color[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2005 int pmx, pmy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2006 int mx=0, my=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2007 int l,cr,cb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2008 const int stride= s->current_picture.linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2009 const int uvstride= s->current_picture.linesize[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2010 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2011 s->input_picture.data[1] + (x + y*uvstride)*block_w/2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2012 s->input_picture.data[2] + (x + y*uvstride)*block_w/2};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2013 int P[10][2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2014 int16_t last_mv[3][2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2015 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2016 const int shift= 1+qpel;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2017 MotionEstContext *c= &s->m.me;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2018 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2019 int mx_context= av_log2(2*FFABS(left->mx - top->mx));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2020 int my_context= av_log2(2*FFABS(left->my - top->my));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2021 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2022 int ref, best_ref, ref_score, ref_mx, ref_my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2023
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2024 assert(sizeof(s->block_state) >= 256);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2025 if(s->keyframe){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2026 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2027 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2028 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2029
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2030 // clip predictors / edge ?
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2031
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2032 P_LEFT[0]= left->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2033 P_LEFT[1]= left->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2034 P_TOP [0]= top->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2035 P_TOP [1]= top->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2036 P_TOPRIGHT[0]= tr->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2037 P_TOPRIGHT[1]= tr->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2038
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2039 last_mv[0][0]= s->block[index].mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2040 last_mv[0][1]= s->block[index].my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2041 last_mv[1][0]= right->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2042 last_mv[1][1]= right->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2043 last_mv[2][0]= bottom->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2044 last_mv[2][1]= bottom->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2045
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2046 s->m.mb_stride=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2047 s->m.mb_x=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2048 s->m.mb_y= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2049 s->m.me.skip= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2050
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2051 assert(s->m.me. stride == stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2052 assert(s->m.me.uvstride == uvstride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2053
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2054 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2055 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2056 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2057 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2058
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2059 c->xmin = - x*block_w - 16+2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2060 c->ymin = - y*block_w - 16+2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2061 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2062 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2063
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2064 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2065 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2066 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2067 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2068 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2069 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2070 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2071
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2072 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2073 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2074
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2075 if (!y) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2076 c->pred_x= P_LEFT[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2077 c->pred_y= P_LEFT[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2078 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2079 c->pred_x = P_MEDIAN[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2080 c->pred_y = P_MEDIAN[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2081 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2082
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2083 score= INT_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2084 best_ref= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2085 for(ref=0; ref<s->ref_frames; ref++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2086 init_ref(c, current_data, s->last_picture[ref].data, NULL, block_w*x, block_w*y, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2087
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2088 ref_score= ff_epzs_motion_search(&s->m, &ref_mx, &ref_my, P, 0, /*ref_index*/ 0, last_mv,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2089 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2090
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2091 assert(ref_mx >= c->xmin);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2092 assert(ref_mx <= c->xmax);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2093 assert(ref_my >= c->ymin);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2094 assert(ref_my <= c->ymax);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2095
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2096 ref_score= s->m.me.sub_motion_search(&s->m, &ref_mx, &ref_my, ref_score, 0, 0, level-LOG2_MB_SIZE+4, block_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2097 ref_score= ff_get_mb_score(&s->m, ref_mx, ref_my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2098 ref_score+= 2*av_log2(2*ref)*c->penalty_factor;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2099 if(s->ref_mvs[ref]){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2100 s->ref_mvs[ref][index][0]= ref_mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2101 s->ref_mvs[ref][index][1]= ref_my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2102 s->ref_scores[ref][index]= ref_score;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2103 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2104 if(score > ref_score){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2105 score= ref_score;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2106 best_ref= ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2107 mx= ref_mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2108 my= ref_my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2109 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2110 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2111 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2112
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2113 // subpel search
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2114 pc= s->c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2115 pc.bytestream_start=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2116 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2117 memcpy(p_state, s->block_state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2118
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2119 if(level!=s->block_max_depth)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2120 put_rac(&pc, &p_state[4 + s_context], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2121 put_rac(&pc, &p_state[1 + left->type + top->type], 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2122 if(s->ref_frames > 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2123 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2124 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2125 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2126 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2127 p_len= pc.bytestream - pc.bytestream_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2128 score += (s->lambda2*(p_len*8
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2129 + (pc.outstanding_count - s->c.outstanding_count)*8
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2130 + (-av_log2(pc.range) + av_log2(s->c.range))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2131 ))>>FF_LAMBDA_SHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2132
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2133 block_s= block_w*block_w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2134 sum = pix_sum(current_data[0], stride, block_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2135 l= (sum + block_s/2)/block_s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2136 iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2137
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2138 block_s= block_w*block_w>>2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2139 sum = pix_sum(current_data[1], uvstride, block_w>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2140 cb= (sum + block_s/2)/block_s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2141 // iscore += pix_norm1(&current_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2142 sum = pix_sum(current_data[2], uvstride, block_w>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2143 cr= (sum + block_s/2)/block_s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2144 // iscore += pix_norm1(&current_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2145
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2146 ic= s->c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2147 ic.bytestream_start=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2148 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2149 memcpy(i_state, s->block_state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2150 if(level!=s->block_max_depth)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2151 put_rac(&ic, &i_state[4 + s_context], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2152 put_rac(&ic, &i_state[1 + left->type + top->type], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2153 put_symbol(&ic, &i_state[32], l-pl , 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2154 put_symbol(&ic, &i_state[64], cb-pcb, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2155 put_symbol(&ic, &i_state[96], cr-pcr, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2156 i_len= ic.bytestream - ic.bytestream_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2157 iscore += (s->lambda2*(i_len*8
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2158 + (ic.outstanding_count - s->c.outstanding_count)*8
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2159 + (-av_log2(ic.range) + av_log2(s->c.range))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2160 ))>>FF_LAMBDA_SHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2161
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2162 // assert(score==256*256*256*64-1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2163 assert(iscore < 255*255*256 + s->lambda2*10);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2164 assert(iscore >= 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2165 assert(l>=0 && l<=255);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2166 assert(pl>=0 && pl<=255);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2167
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2168 if(level==0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2169 int varc= iscore >> 8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2170 int vard= score >> 8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2171 if (vard <= 64 || vard < varc)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2172 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2173 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2174 c->scene_change_score+= s->m.qscale;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2175 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2176
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2177 if(level!=s->block_max_depth){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2178 put_rac(&s->c, &s->block_state[4 + s_context], 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2179 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2180 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2181 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2182 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2183 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2184
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2185 if(score2 < score && score2 < iscore)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2186 return score2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2187 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2188
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2189 if(iscore < score){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2190 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2191 memcpy(pbbak, i_buffer, i_len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2192 s->c= ic;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2193 s->c.bytestream_start= pbbak_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2194 s->c.bytestream= pbbak + i_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2195 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0, BLOCK_INTRA);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2196 memcpy(s->block_state, i_state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2197 return iscore;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2198 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2199 memcpy(pbbak, p_buffer, p_len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2200 s->c= pc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2201 s->c.bytestream_start= pbbak_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2202 s->c.bytestream= pbbak + p_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2203 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2204 memcpy(s->block_state, p_state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2205 return score;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2206 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2207 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2208
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2209 static always_inline int same_block(BlockNode *a, BlockNode *b){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2210 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2211 return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2]));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2212 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2213 return !((a->mx - b->mx) | (a->my - b->my) | (a->ref - b->ref) | ((a->type ^ b->type)&BLOCK_INTRA));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2214 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2215 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2216
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2217 static void encode_q_branch2(SnowContext *s, int level, int x, int y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2218 const int w= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2219 const int rem_depth= s->block_max_depth - level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2220 const int index= (x + y*w) << rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2221 int trx= (x+1)<<rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2222 BlockNode *b= &s->block[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2223 BlockNode *left = x ? &s->block[index-1] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2224 BlockNode *top = y ? &s->block[index-w] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2225 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2226 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2227 int pl = left->color[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2228 int pcb= left->color[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2229 int pcr= left->color[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2230 int pmx, pmy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2231 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2232 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 16*!!b->ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2233 int my_context= av_log2(2*FFABS(left->my - top->my)) + 16*!!b->ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2234 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2235
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2236 if(s->keyframe){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2237 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2238 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2239 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2240
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2241 if(level!=s->block_max_depth){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2242 if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2243 put_rac(&s->c, &s->block_state[4 + s_context], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2244 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2245 put_rac(&s->c, &s->block_state[4 + s_context], 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2246 encode_q_branch2(s, level+1, 2*x+0, 2*y+0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2247 encode_q_branch2(s, level+1, 2*x+1, 2*y+0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2248 encode_q_branch2(s, level+1, 2*x+0, 2*y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2249 encode_q_branch2(s, level+1, 2*x+1, 2*y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2250 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2251 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2252 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2253 if(b->type & BLOCK_INTRA){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2254 pred_mv(s, &pmx, &pmy, 0, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2255 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2256 put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2257 put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2258 put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2259 set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, 0, BLOCK_INTRA);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2260 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2261 pred_mv(s, &pmx, &pmy, b->ref, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2262 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2263 if(s->ref_frames > 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2264 put_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], b->ref, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2265 put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2266 put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2267 set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, b->ref, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2268 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2269 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2270
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2271 static void decode_q_branch(SnowContext *s, int level, int x, int y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2272 const int w= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2273 const int rem_depth= s->block_max_depth - level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2274 const int index= (x + y*w) << rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2275 int trx= (x+1)<<rem_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2276 BlockNode *left = x ? &s->block[index-1] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2277 BlockNode *top = y ? &s->block[index-w] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2278 BlockNode *tl = y && x ? &s->block[index-w-1] : left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2279 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2280 int s_context= 2*left->level + 2*top->level + tl->level + tr->level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2281
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2282 if(s->keyframe){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2283 set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, null_block.ref, BLOCK_INTRA);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2284 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2285 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2286
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2287 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2288 int type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2289 int l = left->color[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2290 int cb= left->color[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2291 int cr= left->color[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2292 int mx= mid_pred(left->mx, top->mx, tr->mx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2293 int my= mid_pred(left->my, top->my, tr->my);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2294 int ref = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2295 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2296 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2297 int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2298
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2299 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2300
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2301 if(type){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2302 pred_mv(s, &mx, &my, 0, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2303 l += get_symbol(&s->c, &s->block_state[32], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2304 cb+= get_symbol(&s->c, &s->block_state[64], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2305 cr+= get_symbol(&s->c, &s->block_state[96], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2306 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2307 if(s->ref_frames > 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2308 ref= get_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2309 pred_mv(s, &mx, &my, ref, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2310 mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2311 my+= get_symbol(&s->c, &s->block_state[128 + 32*(my_context + 16*!!ref)], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2312 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2313 set_blocks(s, level, x, y, l, cb, cr, mx, my, ref, type);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2314 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2315 decode_q_branch(s, level+1, 2*x+0, 2*y+0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2316 decode_q_branch(s, level+1, 2*x+1, 2*y+0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2317 decode_q_branch(s, level+1, 2*x+0, 2*y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2318 decode_q_branch(s, level+1, 2*x+1, 2*y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2319 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2320 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2321
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2322 static void encode_blocks(SnowContext *s, int search){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2323 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2324 int w= s->b_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2325 int h= s->b_height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2326
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2327 if(s->avctx->me_method == ME_ITER && !s->keyframe && search)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2328 iterative_me(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2329
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2330 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2331 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2332 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2333 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2334 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2335 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2336 if(s->avctx->me_method == ME_ITER || !search)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2337 encode_q_branch2(s, 0, x, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2338 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2339 encode_q_branch (s, 0, x, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2340 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2341 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2342 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2343
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2344 static void decode_blocks(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2345 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2346 int w= s->b_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2347 int h= s->b_height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2348
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2349 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2350 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2351 decode_q_branch(s, 0, x, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2352 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2353 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2354 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2355
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2356 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){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2357 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2358 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2359 for(y=0; y < b_h+5; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2360 for(x=0; x < b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2361 int a0= src[x ];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2362 int a1= src[x + 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2363 int a2= src[x + 2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2364 int a3= src[x + 3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2365 int a4= src[x + 4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2366 int a5= src[x + 5];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2367 // int am= 9*(a1+a2) - (a0+a3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2368 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2369 // int am= 18*(a2+a3) - 2*(a1+a4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2370 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2371 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2372
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2373 // if(b_w==16) am= 8*(a1+a2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2374
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2375 if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2376 else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2377
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2378 /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2379 if(am&(~255)) am= ~(am>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2380
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2381 tmp[x] = am;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2382
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2383 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2384 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2385 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2386 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2387 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2388 tmp += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2389 src += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2390 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2391 tmp -= (b_h+5)*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2392
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2393 for(y=0; y < b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2394 for(x=0; x < b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2395 int a0= tmp[x + 0*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2396 int a1= tmp[x + 1*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2397 int a2= tmp[x + 2*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2398 int a3= tmp[x + 3*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2399 int a4= tmp[x + 4*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2400 int a5= tmp[x + 5*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2401 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2402 // int am= 18*(a2+a3) - 2*(a1+a4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2403 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2404 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2405
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2406 // if(b_w==16) am= 8*(a1+a2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2407
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2408 if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2409 else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2410
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2411 if(am&(~255)) am= ~(am>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2412
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2413 dst[x] = am;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2414 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2415 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2416 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2417 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2418 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2419 dst += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2420 tmp += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2421 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2422 STOP_TIMER("mc_block")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2423 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2424
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2425 #define mca(dx,dy,b_w)\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2426 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2427 uint8_t tmp[stride*(b_w+5)];\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2428 assert(h==b_w);\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2429 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2430 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2431
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2432 mca( 0, 0,16)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2433 mca( 8, 0,16)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2434 mca( 0, 8,16)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2435 mca( 8, 8,16)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2436 mca( 0, 0,8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2437 mca( 8, 0,8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2438 mca( 0, 8,8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2439 mca( 8, 8,8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2440
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2441 static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2442 if(block->type & BLOCK_INTRA){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2443 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2444 const int color = block->color[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2445 const int color4= color*0x01010101;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2446 if(b_w==32){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2447 for(y=0; y < b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2448 *(uint32_t*)&dst[0 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2449 *(uint32_t*)&dst[4 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2450 *(uint32_t*)&dst[8 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2451 *(uint32_t*)&dst[12+ y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2452 *(uint32_t*)&dst[16+ y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2453 *(uint32_t*)&dst[20+ y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2454 *(uint32_t*)&dst[24+ y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2455 *(uint32_t*)&dst[28+ y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2456 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2457 }else if(b_w==16){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2458 for(y=0; y < b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2459 *(uint32_t*)&dst[0 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2460 *(uint32_t*)&dst[4 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2461 *(uint32_t*)&dst[8 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2462 *(uint32_t*)&dst[12+ y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2463 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2464 }else if(b_w==8){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2465 for(y=0; y < b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2466 *(uint32_t*)&dst[0 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2467 *(uint32_t*)&dst[4 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2468 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2469 }else if(b_w==4){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2470 for(y=0; y < b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2471 *(uint32_t*)&dst[0 + y*stride]= color4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2472 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2473 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2474 for(y=0; y < b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2475 for(x=0; x < b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2476 dst[x + y*stride]= color;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2477 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2478 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2479 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2480 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2481 uint8_t *src= s->last_picture[block->ref].data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2482 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2483 int mx= block->mx*scale;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2484 int my= block->my*scale;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2485 const int dx= mx&15;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2486 const int dy= my&15;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2487 const int tab_index= 3 - (b_w>>2) + (b_w>>4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2488 sx += (mx>>4) - 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2489 sy += (my>>4) - 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2490 src += sx + sy*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2491 if( (unsigned)sx >= w - b_w - 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2492 || (unsigned)sy >= h - b_h - 4){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2493 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2494 src= tmp + MB_SIZE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2495 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2496 // assert(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2497 // assert(!(b_w&(b_w-1)));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2498 assert(b_w>1 && b_h>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2499 assert(tab_index>=0 && tab_index<4 || b_w==32);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2500 if((dx&3) || (dy&3) || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h) || (b_w&(b_w-1)))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2501 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2502 else if(b_w==32){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2503 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2504 for(y=0; y<b_h; y+=16){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2505 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 2 + (y+2)*stride,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2506 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 18 + (y+2)*stride,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2507 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2508 }else if(b_w==b_h)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2509 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 2 + 2*stride,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2510 else if(b_w==2*b_h){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2511 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 2 + 2*stride,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2512 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 2 + b_h + 2*stride,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2513 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2514 assert(2*b_w==b_h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2515 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 2 + 2*stride ,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2516 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 2 + 2*stride+b_w*stride,stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2517 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2518 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2519 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2520
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2521 void ff_snow_inner_add_yblock(uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2522 int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2523 int y, x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2524 DWTELEM * dst;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2525 for(y=0; y<b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2526 //FIXME ugly missue of obmc_stride
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2527 uint8_t *obmc1= obmc + y*obmc_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2528 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2529 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2530 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2531 dst = slice_buffer_get_line(sb, src_y + y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2532 for(x=0; x<b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2533 int v= obmc1[x] * block[3][x + y*src_stride]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2534 +obmc2[x] * block[2][x + y*src_stride]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2535 +obmc3[x] * block[1][x + y*src_stride]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2536 +obmc4[x] * block[0][x + y*src_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2537
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2538 v <<= 8 - LOG2_OBMC_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2539 if(FRAC_BITS != 8){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2540 v += 1<<(7 - FRAC_BITS);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2541 v >>= 8 - FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2542 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2543 if(add){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2544 v += dst[x + src_x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2545 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2546 if(v&(~255)) v= ~(v>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2547 dst8[x + y*src_stride] = v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2548 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2549 dst[x + src_x] -= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2550 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2551 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2552 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2553 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2554
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2555 //FIXME name clenup (b_w, block_w, b_width stuff)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2556 static always_inline void add_yblock(SnowContext *s, int sliced, slice_buffer *sb, DWTELEM *dst, uint8_t *dst8, const uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int offset_dst, int plane_index){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2557 const int b_width = s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2558 const int b_height= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2559 const int b_stride= b_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2560 BlockNode *lt= &s->block[b_x + b_y*b_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2561 BlockNode *rt= lt+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2562 BlockNode *lb= lt+b_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2563 BlockNode *rb= lb+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2564 uint8_t *block[4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2565 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2566 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2567 uint8_t *ptmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2568 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2569
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2570 if(b_x<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2571 lt= rt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2572 lb= rb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2573 }else if(b_x + 1 >= b_width){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2574 rt= lt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2575 rb= lb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2576 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2577 if(b_y<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2578 lt= lb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2579 rt= rb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2580 }else if(b_y + 1 >= b_height){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2581 lb= lt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2582 rb= rt;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2583 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2584
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2585 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2586 obmc -= src_x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2587 b_w += src_x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2588 if(!sliced && !offset_dst)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2589 dst -= src_x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2590 src_x=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2591 }else if(src_x + b_w > w){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2592 b_w = w - src_x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2593 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2594 if(src_y<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2595 obmc -= src_y*obmc_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2596 b_h += src_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2597 if(!sliced && !offset_dst)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2598 dst -= src_y*dst_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2599 src_y=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2600 }else if(src_y + b_h> h){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2601 b_h = h - src_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2602 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2603
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2604 if(b_w<=0 || b_h<=0) return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2605
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2606 assert(src_stride > 2*MB_SIZE + 5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2607 if(!sliced && offset_dst)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2608 dst += src_x + src_y*dst_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2609 dst8+= src_x + src_y*src_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2610 // src += src_x + src_y*src_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2611
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2612 ptmp= tmp + 3*tmp_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2613 block[0]= ptmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2614 ptmp+=tmp_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2615 pred_block(s, block[0], tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2616
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2617 if(same_block(lt, rt)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2618 block[1]= block[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2619 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2620 block[1]= ptmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2621 ptmp+=tmp_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2622 pred_block(s, block[1], tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2623 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2624
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2625 if(same_block(lt, lb)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2626 block[2]= block[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2627 }else if(same_block(rt, lb)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2628 block[2]= block[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2629 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2630 block[2]= ptmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2631 ptmp+=tmp_step;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2632 pred_block(s, block[2], tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2633 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2634
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2635 if(same_block(lt, rb) ){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2636 block[3]= block[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2637 }else if(same_block(rt, rb)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2638 block[3]= block[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2639 }else if(same_block(lb, rb)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2640 block[3]= block[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2641 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2642 block[3]= ptmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2643 pred_block(s, block[3], tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2644 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2645 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2646 for(y=0; y<b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2647 for(x=0; x<b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2648 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2649 if(add) dst[x + y*dst_stride] += v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2650 else dst[x + y*dst_stride] -= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2651 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2652 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2653 for(y=0; y<b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2654 uint8_t *obmc2= obmc + (obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2655 for(x=0; x<b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2656 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2657 if(add) dst[x + y*dst_stride] += v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2658 else dst[x + y*dst_stride] -= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2659 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2660 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2661 for(y=0; y<b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2662 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2663 for(x=0; x<b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2664 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2665 if(add) dst[x + y*dst_stride] += v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2666 else dst[x + y*dst_stride] -= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2667 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2668 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2669 for(y=0; y<b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2670 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2671 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2672 for(x=0; x<b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2673 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2674 if(add) dst[x + y*dst_stride] += v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2675 else dst[x + y*dst_stride] -= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2676 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2677 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2678 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2679 if(sliced){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2680 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2681
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2682 s->dsp.inner_add_yblock(obmc, obmc_stride, block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2683 STOP_TIMER("inner_add_yblock")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2684 }else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2685 for(y=0; y<b_h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2686 //FIXME ugly missue of obmc_stride
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2687 uint8_t *obmc1= obmc + y*obmc_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2688 uint8_t *obmc2= obmc1+ (obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2689 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2690 uint8_t *obmc4= obmc3+ (obmc_stride>>1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2691 for(x=0; x<b_w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2692 int v= obmc1[x] * block[3][x + y*src_stride]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2693 +obmc2[x] * block[2][x + y*src_stride]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2694 +obmc3[x] * block[1][x + y*src_stride]
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2695 +obmc4[x] * block[0][x + y*src_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2696
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2697 v <<= 8 - LOG2_OBMC_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2698 if(FRAC_BITS != 8){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2699 v += 1<<(7 - FRAC_BITS);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2700 v >>= 8 - FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2701 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2702 if(add){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2703 v += dst[x + y*dst_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2704 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2705 if(v&(~255)) v= ~(v>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2706 dst8[x + y*src_stride] = v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2707 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2708 dst[x + y*dst_stride] -= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2709 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2710 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2711 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2712 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2713 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2714
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2715 static always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, DWTELEM * old_buffer, int plane_index, int add, int mb_y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2716 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2717 const int mb_w= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2718 const int mb_h= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2719 int x, y, mb_x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2720 int block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2721 int block_w = plane_index ? block_size/2 : block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2722 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2723 int obmc_stride= plane_index ? block_size : 2*block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2724 int ref_stride= s->current_picture.linesize[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2725 uint8_t *dst8= s->current_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2726 int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2727 int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2728 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2729
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2730 if(s->keyframe || (s->avctx->debug&512)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2731 if(mb_y==mb_h)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2732 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2733
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2734 if(add){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2735 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2736 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2737 // DWTELEM * line = slice_buffer_get_line(sb, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2738 DWTELEM * line = sb->line[y];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2739 for(x=0; x<w; x++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2740 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2741 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2742 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2743 v >>= FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2744 if(v&(~255)) v= ~(v>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2745 dst8[x + y*ref_stride]= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2746 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2747 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2748 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2749 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2750 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2751 // DWTELEM * line = slice_buffer_get_line(sb, y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2752 DWTELEM * line = sb->line[y];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2753 for(x=0; x<w; x++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2754 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2755 line[x] -= 128 << FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2756 // buf[x + y*w]-= 128<<FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2757 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2758 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2759 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2760
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2761 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2762 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2763
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2764 for(mb_x=0; mb_x<=mb_w; mb_x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2765 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2766
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2767 add_yblock(s, 1, sb, old_buffer, dst8, obmc,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2768 block_w*mb_x - block_w/2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2769 block_w*mb_y - block_w/2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2770 block_w, block_w,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2771 w, h,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2772 w, ref_stride, obmc_stride,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2773 mb_x - 1, mb_y - 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2774 add, 0, plane_index);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2775
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2776 STOP_TIMER("add_yblock")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2777 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2778
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2779 STOP_TIMER("predict_slice")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2780 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2781
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2782 static always_inline void predict_slice(SnowContext *s, DWTELEM *buf, int plane_index, int add, int mb_y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2783 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2784 const int mb_w= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2785 const int mb_h= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2786 int x, y, mb_x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2787 int block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2788 int block_w = plane_index ? block_size/2 : block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2789 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2790 const int obmc_stride= plane_index ? block_size : 2*block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2791 int ref_stride= s->current_picture.linesize[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2792 uint8_t *dst8= s->current_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2793 int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2794 int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2795 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2796
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2797 if(s->keyframe || (s->avctx->debug&512)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2798 if(mb_y==mb_h)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2799 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2800
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2801 if(add){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2802 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2803 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2804 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2805 v >>= FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2806 if(v&(~255)) v= ~(v>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2807 dst8[x + y*ref_stride]= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2808 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2809 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2810 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2811 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2812 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2813 buf[x + y*w]-= 128<<FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2814 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2815 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2816 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2817
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2818 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2819 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2820
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2821 for(mb_x=0; mb_x<=mb_w; mb_x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2822 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2823
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2824 add_yblock(s, 0, NULL, buf, dst8, obmc,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2825 block_w*mb_x - block_w/2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2826 block_w*mb_y - block_w/2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2827 block_w, block_w,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2828 w, h,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2829 w, ref_stride, obmc_stride,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2830 mb_x - 1, mb_y - 1,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2831 add, 1, plane_index);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2832
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2833 STOP_TIMER("add_yblock")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2834 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2835
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2836 STOP_TIMER("predict_slice")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2837 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2838
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2839 static always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2840 const int mb_h= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2841 int mb_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2842 for(mb_y=0; mb_y<=mb_h; mb_y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2843 predict_slice(s, buf, plane_index, add, mb_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2844 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2845
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2846 static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2847 int i, x2, y2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2848 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2849 const int block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2850 const int block_w = plane_index ? block_size/2 : block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2851 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2852 const int obmc_stride= plane_index ? block_size : 2*block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2853 const int ref_stride= s->current_picture.linesize[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2854 uint8_t *src= s-> input_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2855 DWTELEM *dst= (DWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2856 const int b_stride = s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2857 const int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2858 const int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2859 int index= mb_x + mb_y*b_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2860 BlockNode *b= &s->block[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2861 BlockNode backup= *b;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2862 int ab=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2863 int aa=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2864
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2865 b->type|= BLOCK_INTRA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2866 b->color[plane_index]= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2867 memset(dst, 0, obmc_stride*obmc_stride*sizeof(DWTELEM));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2868
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2869 for(i=0; i<4; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2870 int mb_x2= mb_x + (i &1) - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2871 int mb_y2= mb_y + (i>>1) - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2872 int x= block_w*mb_x2 + block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2873 int y= block_w*mb_y2 + block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2874
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2875 add_yblock(s, 0, NULL, dst + ((i&1)+(i>>1)*obmc_stride)*block_w, NULL, obmc,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2876 x, y, block_w, block_w, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2877
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2878 for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2879 for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2880 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2881 int obmc_v= obmc[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2882 int d;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2883 if(y<0) obmc_v += obmc[index + block_w*obmc_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2884 if(x<0) obmc_v += obmc[index + block_w];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2885 if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2886 if(x+block_w>w) obmc_v += obmc[index - block_w];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2887 //FIXME precalc this or simplify it somehow else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2888
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2889 d = -dst[index] + (1<<(FRAC_BITS-1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2890 dst[index] = d;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2891 ab += (src[x2 + y2*ref_stride] - (d>>FRAC_BITS)) * obmc_v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2892 aa += obmc_v * obmc_v; //FIXME precalclate this
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2893 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2894 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2895 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2896 *b= backup;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2897
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2898 return clip(((ab<<LOG2_OBMC_MAX) + aa/2)/aa, 0, 255); //FIXME we shouldnt need cliping
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2899 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2900
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2901 static inline int get_block_bits(SnowContext *s, int x, int y, int w){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2902 const int b_stride = s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2903 const int b_height = s->b_height<< s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2904 int index= x + y*b_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2905 BlockNode *b = &s->block[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2906 BlockNode *left = x ? &s->block[index-1] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2907 BlockNode *top = y ? &s->block[index-b_stride] : &null_block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2908 BlockNode *tl = y && x ? &s->block[index-b_stride-1] : left;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2909 BlockNode *tr = y && x+w<b_stride ? &s->block[index-b_stride+w] : tl;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2910 int dmx, dmy;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2911 // int mx_context= av_log2(2*FFABS(left->mx - top->mx));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2912 // int my_context= av_log2(2*FFABS(left->my - top->my));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2913
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2914 if(x<0 || x>=b_stride || y>=b_height)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2915 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2916 /*
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2917 1 0 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2918 01X 1-2 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2919 001XX 3-6 2-3
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2920 0001XXX 7-14 4-7
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2921 00001XXXX 15-30 8-15
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2922 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2923 //FIXME try accurate rate
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2924 //FIXME intra and inter predictors if surrounding blocks arent the same type
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2925 if(b->type & BLOCK_INTRA){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2926 return 3+2*( av_log2(2*FFABS(left->color[0] - b->color[0]))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2927 + av_log2(2*FFABS(left->color[1] - b->color[1]))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2928 + av_log2(2*FFABS(left->color[2] - b->color[2])));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2929 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2930 pred_mv(s, &dmx, &dmy, b->ref, left, top, tr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2931 dmx-= b->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2932 dmy-= b->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2933 return 2*(1 + av_log2(2*FFABS(dmx)) //FIXME kill the 2* can be merged in lambda
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2934 + av_log2(2*FFABS(dmy))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2935 + av_log2(2*b->ref));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2936 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2937 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2938
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2939 static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, const uint8_t *obmc_edged){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2940 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2941 const int block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2942 const int block_w = plane_index ? block_size/2 : block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2943 const int obmc_stride= plane_index ? block_size : 2*block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2944 const int ref_stride= s->current_picture.linesize[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2945 uint8_t *dst= s->current_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2946 uint8_t *src= s-> input_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2947 DWTELEM *pred= (DWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2948 uint8_t cur[ref_stride*2*MB_SIZE]; //FIXME alignment
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2949 uint8_t tmp[ref_stride*(2*MB_SIZE+5)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2950 const int b_stride = s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2951 const int b_height = s->b_height<< s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2952 const int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2953 const int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2954 int distortion;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2955 int rate= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2956 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2957 int sx= block_w*mb_x - block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2958 int sy= block_w*mb_y - block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2959 int x0= FFMAX(0,-sx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2960 int y0= FFMAX(0,-sy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2961 int x1= FFMIN(block_w*2, w-sx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2962 int y1= FFMIN(block_w*2, h-sy);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2963 int i,x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2964
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2965 pred_block(s, cur, tmp, ref_stride, sx, sy, block_w*2, block_w*2, &s->block[mb_x + mb_y*b_stride], plane_index, w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2966
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2967 for(y=y0; y<y1; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2968 const uint8_t *obmc1= obmc_edged + y*obmc_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2969 const DWTELEM *pred1 = pred + y*obmc_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2970 uint8_t *cur1 = cur + y*ref_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2971 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2972 for(x=x0; x<x1; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2973 int v = (cur1[x] * obmc1[x]) << (FRAC_BITS - LOG2_OBMC_MAX);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2974 v = (v + pred1[x]) >> FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2975 if(v&(~255)) v= ~(v>>31);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2976 dst1[x] = v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2977 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2978 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2979
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2980 /* copy the regions where obmc[] = (uint8_t)256 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2981 if(LOG2_OBMC_MAX == 8
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2982 && (mb_x == 0 || mb_x == b_stride-1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2983 && (mb_y == 0 || mb_y == b_height-1)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2984 if(mb_x == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2985 x1 = block_w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2986 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2987 x0 = block_w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2988 if(mb_y == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2989 y1 = block_w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2990 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2991 y0 = block_w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2992 for(y=y0; y<y1; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2993 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2994 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2995
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2996 if(block_w==16){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2997 /* FIXME rearrange dsputil to fit 32x32 cmp functions */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2998 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2999 /* FIXME cmps overlap but don't cover the wavelet's whole support,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3000 * so improving the score of one block is not strictly guaranteed to
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3001 * improve the score of the whole frame, so iterative motion est
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3002 * doesn't always converge. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3003 if(s->avctx->me_cmp == FF_CMP_W97)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3004 distortion = w97_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3005 else if(s->avctx->me_cmp == FF_CMP_W53)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3006 distortion = w53_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3007 else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3008 distortion = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3009 for(i=0; i<4; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3010 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3011 distortion += s->dsp.me_cmp[0](&s->m, src + off, dst + off, ref_stride, 16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3012 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3013 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3014 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3015 assert(block_w==8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3016 distortion = s->dsp.me_cmp[0](&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3017 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3018
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3019 if(plane_index==0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3020 for(i=0; i<4; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3021 /* ..RRr
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3022 * .RXx.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3023 * rxx..
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3024 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3025 rate += get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3026 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3027 if(mb_x == b_stride-2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3028 rate += get_block_bits(s, mb_x + 1, mb_y + 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3029 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3030 return distortion + rate*penalty_factor;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3031 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3032
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3033 static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3034 int i, y2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3035 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3036 const int block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3037 const int block_w = plane_index ? block_size/2 : block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3038 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3039 const int obmc_stride= plane_index ? block_size : 2*block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3040 const int ref_stride= s->current_picture.linesize[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3041 uint8_t *dst= s->current_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3042 uint8_t *src= s-> input_picture.data[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3043 static const DWTELEM zero_dst[4096]; //FIXME
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3044 const int b_stride = s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3045 const int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3046 const int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3047 int distortion= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3048 int rate= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3049 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3050
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3051 for(i=0; i<9; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3052 int mb_x2= mb_x + (i%3) - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3053 int mb_y2= mb_y + (i/3) - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3054 int x= block_w*mb_x2 + block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3055 int y= block_w*mb_y2 + block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3056
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3057 add_yblock(s, 0, NULL, zero_dst, dst, obmc,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3058 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3059
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3060 //FIXME find a cleaner/simpler way to skip the outside stuff
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3061 for(y2= y; y2<0; y2++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3062 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3063 for(y2= h; y2<y+block_w; y2++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3064 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3065 if(x<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3066 for(y2= y; y2<y+block_w; y2++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3067 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3068 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3069 if(x+block_w > w){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3070 for(y2= y; y2<y+block_w; y2++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3071 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3072 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3073
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3074 assert(block_w== 8 || block_w==16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3075 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3076 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3077
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3078 if(plane_index==0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3079 BlockNode *b= &s->block[mb_x+mb_y*b_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3080 int merged= same_block(b,b+1) && same_block(b,b+b_stride) && same_block(b,b+b_stride+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3081
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3082 /* ..RRRr
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3083 * .RXXx.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3084 * .RXXx.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3085 * rxxx.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3086 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3087 if(merged)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3088 rate = get_block_bits(s, mb_x, mb_y, 2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3089 for(i=merged?4:0; i<9; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3090 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3091 rate += get_block_bits(s, mb_x + dxy[i][0], mb_y + dxy[i][1], 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3092 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3093 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3094 return distortion + rate*penalty_factor;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3095 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3096
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3097 static always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, const uint8_t *obmc_edged, int *best_rd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3098 const int b_stride= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3099 BlockNode *block= &s->block[mb_x + mb_y * b_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3100 BlockNode backup= *block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3101 int rd, index, value;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3102
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3103 assert(mb_x>=0 && mb_y>=0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3104 assert(mb_x<b_stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3105
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3106 if(intra){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3107 block->color[0] = p[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3108 block->color[1] = p[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3109 block->color[2] = p[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3110 block->type |= BLOCK_INTRA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3111 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3112 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3113 value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (block->ref<<12);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3114 if(s->me_cache[index] == value)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3115 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3116 s->me_cache[index]= value;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3117
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3118 block->mx= p[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3119 block->my= p[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3120 block->type &= ~BLOCK_INTRA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3121 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3122
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3123 rd= get_block_rd(s, mb_x, mb_y, 0, obmc_edged);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3124
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3125 //FIXME chroma
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3126 if(rd < *best_rd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3127 *best_rd= rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3128 return 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3129 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3130 *block= backup;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3131 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3132 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3133 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3134
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3135 /* special case for int[2] args we discard afterward, fixes compilation prob with gcc 2.95 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3136 static always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, const uint8_t *obmc_edged, int *best_rd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3137 int p[2] = {p0, p1};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3138 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3139 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3140
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3141 static always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3142 const int b_stride= s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3143 BlockNode *block= &s->block[mb_x + mb_y * b_stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3144 BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3145 int rd, index, value;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3146
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3147 assert(mb_x>=0 && mb_y>=0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3148 assert(mb_x<b_stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3149 assert(((mb_x|mb_y)&1) == 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3150
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3151 index= (p0 + 31*p1) & (ME_CACHE_SIZE-1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3152 value= s->me_cache_generation + (p0>>10) + (p1<<6) + (block->ref<<12);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3153 if(s->me_cache[index] == value)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3154 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3155 s->me_cache[index]= value;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3156
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3157 block->mx= p0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3158 block->my= p1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3159 block->ref= ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3160 block->type &= ~BLOCK_INTRA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3161 block[1]= block[b_stride]= block[b_stride+1]= *block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3162
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3163 rd= get_4block_rd(s, mb_x, mb_y, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3164
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3165 //FIXME chroma
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3166 if(rd < *best_rd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3167 *best_rd= rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3168 return 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3169 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3170 block[0]= backup[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3171 block[1]= backup[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3172 block[b_stride]= backup[2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3173 block[b_stride+1]= backup[3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3174 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3175 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3176 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3177
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3178 static void iterative_me(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3179 int pass, mb_x, mb_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3180 const int b_width = s->b_width << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3181 const int b_height= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3182 const int b_stride= b_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3183 int color[3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3184
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3185 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3186 RangeCoder r = s->c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3187 uint8_t state[sizeof(s->block_state)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3188 memcpy(state, s->block_state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3189 for(mb_y= 0; mb_y<s->b_height; mb_y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3190 for(mb_x= 0; mb_x<s->b_width; mb_x++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3191 encode_q_branch(s, 0, mb_x, mb_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3192 s->c = r;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3193 memcpy(s->block_state, state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3194 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3195
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3196 for(pass=0; pass<25; pass++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3197 int change= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3198
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3199 for(mb_y= 0; mb_y<b_height; mb_y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3200 for(mb_x= 0; mb_x<b_width; mb_x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3201 int dia_change, i, j, ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3202 int best_rd= INT_MAX, ref_rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3203 BlockNode backup, ref_b;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3204 const int index= mb_x + mb_y * b_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3205 BlockNode *block= &s->block[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3206 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3207 BlockNode *lb = mb_x ? &s->block[index -1] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3208 BlockNode *rb = mb_x+1<b_width ? &s->block[index +1] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3209 BlockNode *bb = mb_y+1<b_height ? &s->block[index+b_stride ] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3210 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3211 BlockNode *trb= mb_x+1<b_width && mb_y ? &s->block[index-b_stride+1] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3212 BlockNode *blb= mb_x && mb_y+1<b_height ? &s->block[index+b_stride-1] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3213 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->block[index+b_stride+1] : NULL;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3214 const int b_w= (MB_SIZE >> s->block_max_depth);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3215 uint8_t obmc_edged[b_w*2][b_w*2];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3216
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3217 if(pass && (block->type & BLOCK_OPT))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3218 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3219 block->type |= BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3220
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3221 backup= *block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3222
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3223 if(!s->me_cache_generation)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3224 memset(s->me_cache, 0, sizeof(s->me_cache));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3225 s->me_cache_generation += 1<<22;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3226
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3227 //FIXME precalc
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3228 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3229 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3230 memcpy(obmc_edged, obmc_tab[s->block_max_depth], b_w*b_w*4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3231 if(mb_x==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3232 for(y=0; y<b_w*2; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3233 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3234 if(mb_x==b_stride-1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3235 for(y=0; y<b_w*2; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3236 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3237 if(mb_y==0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3238 for(x=0; x<b_w*2; x++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3239 obmc_edged[0][x] += obmc_edged[b_w-1][x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3240 for(y=1; y<b_w; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3241 memcpy(obmc_edged[y], obmc_edged[0], b_w*2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3242 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3243 if(mb_y==b_height-1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3244 for(x=0; x<b_w*2; x++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3245 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3246 for(y=b_w; y<b_w*2-1; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3247 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3248 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3249 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3250
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3251 //skip stuff outside the picture
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3252 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3253 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3254 uint8_t *src= s-> input_picture.data[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3255 uint8_t *dst= s->current_picture.data[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3256 const int stride= s->current_picture.linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3257 const int block_w= MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3258 const int sx= block_w*mb_x - block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3259 const int sy= block_w*mb_y - block_w/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3260 const int w= s->plane[0].width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3261 const int h= s->plane[0].height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3262 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3263
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3264 for(y=sy; y<0; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3265 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3266 for(y=h; y<sy+block_w*2; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3267 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3268 if(sx<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3269 for(y=sy; y<sy+block_w*2; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3270 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3271 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3272 if(sx+block_w*2 > w){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3273 for(y=sy; y<sy+block_w*2; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3274 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3275 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3276 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3277
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3278 // intra(black) = neighbors' contribution to the current block
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3279 for(i=0; i<3; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3280 color[i]= get_dc(s, mb_x, mb_y, i);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3281
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3282 // get previous score (cant be cached due to OBMC)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3283 if(pass > 0 && (block->type&BLOCK_INTRA)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3284 int color0[3]= {block->color[0], block->color[1], block->color[2]};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3285 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3286 }else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3287 check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3288
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3289 ref_b= *block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3290 ref_rd= best_rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3291 for(ref=0; ref < s->ref_frames; ref++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3292 int16_t (*mvr)[2]= &s->ref_mvs[ref][index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3293 if(s->ref_scores[ref][index] > s->ref_scores[ref_b.ref][index]*3/2) //FIXME tune threshold
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3294 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3295 block->ref= ref;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3296 best_rd= INT_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3297
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3298 check_block_inter(s, mb_x, mb_y, mvr[0][0], mvr[0][1], *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3299 check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3300 if(tb)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3301 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3302 if(lb)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3303 check_block_inter(s, mb_x, mb_y, mvr[-1][0], mvr[-1][1], *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3304 if(rb)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3305 check_block_inter(s, mb_x, mb_y, mvr[1][0], mvr[1][1], *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3306 if(bb)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3307 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3308
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3309 /* fullpel ME */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3310 //FIXME avoid subpel interpol / round to nearest integer
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3311 do{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3312 dia_change=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3313 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3314 for(j=0; j<i; j++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3315 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3316 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3317 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3318 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3319 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3320 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3321 }while(dia_change);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3322 /* subpel ME */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3323 do{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3324 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3325 dia_change=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3326 for(i=0; i<8; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3327 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3328 }while(dia_change);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3329 //FIXME or try the standard 2 pass qpel or similar
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3330
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3331 mvr[0][0]= block->mx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3332 mvr[0][1]= block->my;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3333 if(ref_rd > best_rd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3334 ref_rd= best_rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3335 ref_b= *block;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3336 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3337 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3338 best_rd= ref_rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3339 *block= ref_b;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3340 #if 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3341 check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3342 //FIXME RD style color selection
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3343 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3344 if(!same_block(block, &backup)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3345 if(tb ) tb ->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3346 if(lb ) lb ->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3347 if(rb ) rb ->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3348 if(bb ) bb ->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3349 if(tlb) tlb->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3350 if(trb) trb->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3351 if(blb) blb->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3352 if(brb) brb->type &= ~BLOCK_OPT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3353 change ++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3354 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3355 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3356 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3357 av_log(NULL, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3358 if(!change)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3359 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3360 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3361
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3362 if(s->block_max_depth == 1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3363 int change= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3364 for(mb_y= 0; mb_y<b_height; mb_y+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3365 for(mb_x= 0; mb_x<b_width; mb_x+=2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3366 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3367 int best_rd, init_rd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3368 const int index= mb_x + mb_y * b_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3369 BlockNode *b[4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3370
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3371 b[0]= &s->block[index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3372 b[1]= b[0]+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3373 b[2]= b[0]+b_stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3374 b[3]= b[2]+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3375 if(same_block(b[0], b[1]) &&
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3376 same_block(b[0], b[2]) &&
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3377 same_block(b[0], b[3]))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3378 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3379
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3380 if(!s->me_cache_generation)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3381 memset(s->me_cache, 0, sizeof(s->me_cache));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3382 s->me_cache_generation += 1<<22;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3383
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3384 init_rd= best_rd= get_4block_rd(s, mb_x, mb_y, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3385
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3386 //FIXME more multiref search?
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3387 check_4block_inter(s, mb_x, mb_y,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3388 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3389 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3390
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3391 for(i=0; i<4; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3392 if(!(b[i]->type&BLOCK_INTRA))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3393 check_4block_inter(s, mb_x, mb_y, b[i]->mx, b[i]->my, b[i]->ref, &best_rd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3394
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3395 if(init_rd != best_rd)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3396 change++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3397 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3398 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3399 av_log(NULL, AV_LOG_ERROR, "pass:4mv changed:%d\n", change*4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3400 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3401 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3402
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3403 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3404 const int level= b->level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3405 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3406 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3407 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3408 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3409 int x,y, thres1, thres2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3410 // START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3411
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3412 if(s->qlog == LOSSLESS_QLOG) return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3413
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3414 bias= bias ? 0 : (3*qmul)>>3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3415 thres1= ((qmul - bias)>>QEXPSHIFT) - 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3416 thres2= 2*thres1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3417
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3418 if(!bias){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3419 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3420 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3421 int i= src[x + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3422
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3423 if((unsigned)(i+thres1) > thres2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3424 if(i>=0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3425 i<<= QEXPSHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3426 i/= qmul; //FIXME optimize
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3427 src[x + y*stride]= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3428 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3429 i= -i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3430 i<<= QEXPSHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3431 i/= qmul; //FIXME optimize
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3432 src[x + y*stride]= -i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3433 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3434 }else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3435 src[x + y*stride]= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3436 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3437 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3438 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3439 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3440 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3441 int i= src[x + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3442
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3443 if((unsigned)(i+thres1) > thres2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3444 if(i>=0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3445 i<<= QEXPSHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3446 i= (i + bias) / qmul; //FIXME optimize
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3447 src[x + y*stride]= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3448 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3449 i= -i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3450 i<<= QEXPSHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3451 i= (i + bias) / qmul; //FIXME optimize
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3452 src[x + y*stride]= -i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3453 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3454 }else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3455 src[x + y*stride]= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3456 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3457 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3458 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3459 if(level+1 == s->spatial_decomposition_count){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3460 // STOP_TIMER("quantize")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3461 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3462 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3463
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3464 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3465 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3466 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3467 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3468 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3469 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3470 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3471
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3472 if(s->qlog == LOSSLESS_QLOG) return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3473
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3474 for(y=start_y; y<end_y; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3475 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3476 DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3477 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3478 int i= line[x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3479 if(i<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3480 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3481 }else if(i>0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3482 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3483 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3484 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3485 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3486 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3487 STOP_TIMER("dquant")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3488 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3489 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3490
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3491 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3492 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3493 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3494 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3495 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3496 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3497 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3498 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3499
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3500 if(s->qlog == LOSSLESS_QLOG) return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3501
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3502 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3503 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3504 int i= src[x + y*stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3505 if(i<0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3506 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3507 }else if(i>0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3508 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3509 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3510 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3511 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3512 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3513 STOP_TIMER("dquant")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3514 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3515 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3516
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3517 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3518 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3519 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3520 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3521
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3522 for(y=h-1; y>=0; y--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3523 for(x=w-1; x>=0; x--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3524 int i= x + y*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3525
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3526 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3527 if(use_median){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3528 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3529 else src[i] -= src[i - 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3530 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3531 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3532 else src[i] -= src[i - 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3533 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3534 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3535 if(y) src[i] -= src[i - stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3536 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3537 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3538 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3539 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3540
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3541 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3542 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3543 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3544
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3545 // START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3546
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3547 DWTELEM * line;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3548 DWTELEM * prev;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3549
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3550 if (start_y != 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3551 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3552
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3553 for(y=start_y; y<end_y; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3554 prev = line;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3555 // line = slice_buffer_get_line_from_address(sb, src + (y * stride));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3556 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3557 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3558 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3559 if(use_median){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3560 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3561 else line[x] += line[x - 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3562 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3563 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3564 else line[x] += line[x - 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3565 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3566 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3567 if(y) line[x] += prev[x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3568 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3569 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3570 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3571
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3572 // STOP_TIMER("correlate")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3573 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3574
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3575 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3576 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3577 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3578 int x,y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3579
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3580 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3581 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3582 int i= x + y*stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3583
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3584 if(x){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3585 if(use_median){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3586 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3587 else src[i] += src[i - 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3588 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3589 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3590 else src[i] += src[i - 1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3591 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3592 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3593 if(y) src[i] += src[i - stride];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3594 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3595 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3596 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3597 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3598
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3599 static void encode_header(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3600 int plane_index, level, orientation;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3601 uint8_t kstate[32];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3602
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3603 memset(kstate, MID_STATE, sizeof(kstate));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3604
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3605 put_rac(&s->c, kstate, s->keyframe);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3606 if(s->keyframe || s->always_reset)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3607 reset_contexts(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3608 if(s->keyframe){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3609 put_symbol(&s->c, s->header_state, s->version, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3610 put_rac(&s->c, s->header_state, s->always_reset);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3611 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3612 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3613 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3614 put_symbol(&s->c, s->header_state, s->colorspace_type, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3615 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3616 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3617 put_rac(&s->c, s->header_state, s->spatial_scalability);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3618 // put_rac(&s->c, s->header_state, s->rate_scalability);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3619 put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3620
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3621 for(plane_index=0; plane_index<2; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3622 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3623 for(orientation=level ? 1:0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3624 if(orientation==2) continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3625 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3626 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3627 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3628 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3629 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3630 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3631 put_symbol(&s->c, s->header_state, s->qlog, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3632 put_symbol(&s->c, s->header_state, s->mv_scale, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3633 put_symbol(&s->c, s->header_state, s->qbias, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3634 put_symbol(&s->c, s->header_state, s->block_max_depth, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3635 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3636
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3637 static int decode_header(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3638 int plane_index, level, orientation;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3639 uint8_t kstate[32];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3640
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3641 memset(kstate, MID_STATE, sizeof(kstate));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3642
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3643 s->keyframe= get_rac(&s->c, kstate);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3644 if(s->keyframe || s->always_reset)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3645 reset_contexts(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3646 if(s->keyframe){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3647 s->version= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3648 if(s->version>0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3649 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3650 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3651 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3652 s->always_reset= get_rac(&s->c, s->header_state);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3653 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3654 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3655 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3656 s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3657 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3658 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3659 s->spatial_scalability= get_rac(&s->c, s->header_state);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3660 // s->rate_scalability= get_rac(&s->c, s->header_state);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3661 s->max_ref_frames= get_symbol(&s->c, s->header_state, 0)+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3662
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3663 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3664 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3665 for(orientation=level ? 1:0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3666 int q;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3667 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3668 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3669 else q= get_symbol(&s->c, s->header_state, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3670 s->plane[plane_index].band[level][orientation].qlog= q;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3671 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3672 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3673 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3674 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3675
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3676 s->spatial_decomposition_type= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3677 if(s->spatial_decomposition_type > 2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3678 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3679 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3680 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3681
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3682 s->qlog= get_symbol(&s->c, s->header_state, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3683 s->mv_scale= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3684 s->qbias= get_symbol(&s->c, s->header_state, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3685 s->block_max_depth= get_symbol(&s->c, s->header_state, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3686 if(s->block_max_depth > 1 || s->block_max_depth < 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3687 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3688 s->block_max_depth= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3689 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3690 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3691
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3692 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3693 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3694
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3695 static void init_qexp(void){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3696 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3697 double v=128;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3698
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3699 for(i=0; i<QROOT; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3700 qexp[i]= lrintf(v);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3701 v *= pow(2, 1.0 / QROOT);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3702 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3703 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3704
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3705 static int common_init(AVCodecContext *avctx){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3706 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3707 int width, height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3708 int level, orientation, plane_index, dec;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3709 int i, j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3710
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3711 s->avctx= avctx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3712
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3713 dsputil_init(&s->dsp, avctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3714
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3715 #define mcf(dx,dy)\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3716 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3717 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3718 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3719 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3720 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3721 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3722
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3723 mcf( 0, 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3724 mcf( 4, 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3725 mcf( 8, 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3726 mcf(12, 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3727 mcf( 0, 4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3728 mcf( 4, 4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3729 mcf( 8, 4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3730 mcf(12, 4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3731 mcf( 0, 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3732 mcf( 4, 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3733 mcf( 8, 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3734 mcf(12, 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3735 mcf( 0,12)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3736 mcf( 4,12)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3737 mcf( 8,12)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3738 mcf(12,12)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3739
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3740 #define mcfh(dx,dy)\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3741 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3742 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3743 mc_block_hpel ## dx ## dy ## 16;\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3744 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3745 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3746 mc_block_hpel ## dx ## dy ## 8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3747
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3748 mcfh(0, 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3749 mcfh(8, 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3750 mcfh(0, 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3751 mcfh(8, 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3752
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3753 if(!qexp[0])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3754 init_qexp();
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3755
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3756 dec= s->spatial_decomposition_count= 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3757 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3758
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3759 s->chroma_h_shift= 1; //FIXME XXX
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3760 s->chroma_v_shift= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3761
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3762 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3763
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3764 width= s->avctx->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3765 height= s->avctx->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3766
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3767 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3768
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3769 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3770 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3771
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3772 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3773 int w= s->avctx->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3774 int h= s->avctx->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3775
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3776 if(plane_index){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3777 w>>= s->chroma_h_shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3778 h>>= s->chroma_v_shift;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3779 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3780 s->plane[plane_index].width = w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3781 s->plane[plane_index].height= h;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3782 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3783 for(level=s->spatial_decomposition_count-1; level>=0; level--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3784 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3785 SubBand *b= &s->plane[plane_index].band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3786
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3787 b->buf= s->spatial_dwt_buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3788 b->level= level;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3789 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3790 b->width = (w + !(orientation&1))>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3791 b->height= (h + !(orientation>1))>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3792
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3793 b->stride_line = 1 << (s->spatial_decomposition_count - level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3794 b->buf_x_offset = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3795 b->buf_y_offset = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3796
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3797 if(orientation&1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3798 b->buf += (w+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3799 b->buf_x_offset = (w+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3800 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3801 if(orientation>1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3802 b->buf += b->stride>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3803 b->buf_y_offset = b->stride_line >> 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3804 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3805
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3806 if(level)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3807 b->parent= &s->plane[plane_index].band[level-1][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3808 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3809 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3810 w= (w+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3811 h= (h+1)>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3812 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3813 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3814
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3815 for(i=0; i<MAX_REF_FRAMES; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3816 for(j=0; j<MAX_REF_FRAMES; j++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3817 scale_mv_ref[i][j] = 256*(i+1)/(j+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3818
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3819 reset_contexts(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3820 /*
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3821 width= s->width= avctx->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3822 height= s->height= avctx->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3823
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3824 assert(width && height);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3825 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3826 s->avctx->get_buffer(s->avctx, &s->mconly_picture);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3827
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3828 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3829 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3830
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3831 static int qscale2qlog(int qscale){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3832 return rint(QROOT*log(qscale / (float)FF_QP2LAMBDA)/log(2))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3833 + 61*QROOT/8; //<64 >60
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3834 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3835
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3836 static int ratecontrol_1pass(SnowContext *s, AVFrame *pict)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3837 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3838 /* estimate the frame's complexity as a sum of weighted dwt coefs.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3839 * FIXME we know exact mv bits at this point,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3840 * but ratecontrol isn't set up to include them. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3841 uint32_t coef_sum= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3842 int level, orientation, delta_qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3843
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3844 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3845 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3846 SubBand *b= &s->plane[0].band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3847 DWTELEM *buf= b->buf;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3848 const int w= b->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3849 const int h= b->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3850 const int stride= b->stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3851 const int qlog= clip(2*QROOT + b->qlog, 0, QROOT*16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3852 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3853 const int qdiv= (1<<16)/qmul;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3854 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3855 if(orientation==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3856 decorrelate(s, b, buf, stride, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3857 for(y=0; y<h; y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3858 for(x=0; x<w; x++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3859 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3860 if(orientation==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3861 correlate(s, b, buf, stride, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3862 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3863 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3864
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3865 /* ugly, ratecontrol just takes a sqrt again */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3866 coef_sum = (uint64_t)coef_sum * coef_sum >> 16;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3867 assert(coef_sum < INT_MAX);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3868
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3869 if(pict->pict_type == I_TYPE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3870 s->m.current_picture.mb_var_sum= coef_sum;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3871 s->m.current_picture.mc_mb_var_sum= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3872 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3873 s->m.current_picture.mc_mb_var_sum= coef_sum;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3874 s->m.current_picture.mb_var_sum= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3875 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3876
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3877 pict->quality= ff_rate_estimate_qscale(&s->m, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3878 if (pict->quality < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3879 return INT_MIN;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3880 s->lambda= pict->quality * 3/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3881 delta_qlog= qscale2qlog(pict->quality) - s->qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3882 s->qlog+= delta_qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3883 return delta_qlog;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3884 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3885
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3886 static void calculate_vissual_weight(SnowContext *s, Plane *p){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3887 int width = p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3888 int height= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3889 int level, orientation, x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3890
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3891 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3892 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3893 SubBand *b= &p->band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3894 DWTELEM *buf= b->buf;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3895 int64_t error=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3896
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3897 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3898 buf[b->width/2 + b->height/2*b->stride]= 256*256;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3899 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3900 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3901 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3902 int64_t d= s->spatial_dwt_buffer[x + y*width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3903 error += d*d;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3904 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3905 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3906
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3907 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3908 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3909 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3910 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3911 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3912
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3913 static int encode_init(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3914 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3915 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3916 int plane_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3917
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3918 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3919 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3920 "use vstrict=-2 / -strict -2 to use it anyway\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3921 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3922 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3923
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3924 if(avctx->prediction_method == DWT_97
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3925 && (avctx->flags & CODEC_FLAG_QSCALE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3926 && avctx->global_quality == 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3927 av_log(avctx, AV_LOG_ERROR, "the 9/7 wavelet is incompatible with lossless mode\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3928 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3929 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3930
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3931 common_init(avctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3932 alloc_blocks(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3933
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3934 s->version=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3935
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3936 s->m.avctx = avctx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3937 s->m.flags = avctx->flags;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3938 s->m.bit_rate= avctx->bit_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3939
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3940 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3941 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3942 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3943 s->m.obmc_scratchpad= av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3944 h263_encode_init(&s->m); //mv_penalty
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3945
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3946 s->max_ref_frames = FFMAX(FFMIN(avctx->refs, MAX_REF_FRAMES), 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3947
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3948 if(avctx->flags&CODEC_FLAG_PASS1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3949 if(!avctx->stats_out)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3950 avctx->stats_out = av_mallocz(256);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3951 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3952 if((avctx->flags&CODEC_FLAG_PASS2) || !(avctx->flags&CODEC_FLAG_QSCALE)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3953 if(ff_rate_control_init(&s->m) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3954 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3955 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3956 s->pass1_rc= !(avctx->flags & (CODEC_FLAG_QSCALE|CODEC_FLAG_PASS2));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3957
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3958 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3959 calculate_vissual_weight(s, &s->plane[plane_index]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3960 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3961
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3962
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3963 avctx->coded_frame= &s->current_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3964 switch(avctx->pix_fmt){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3965 // case PIX_FMT_YUV444P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3966 // case PIX_FMT_YUV422P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3967 case PIX_FMT_YUV420P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3968 case PIX_FMT_GRAY8:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3969 // case PIX_FMT_YUV411P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3970 // case PIX_FMT_YUV410P:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3971 s->colorspace_type= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3972 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3973 /* case PIX_FMT_RGBA32:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3974 s->colorspace= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3975 break;*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3976 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3977 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3978 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3979 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3980 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3981 s->chroma_h_shift= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3982 s->chroma_v_shift= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3983
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3984 ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3985 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3986
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3987 s->avctx->get_buffer(s->avctx, &s->input_picture);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3988
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3989 if(s->avctx->me_method == ME_ITER){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3990 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3991 int size= s->b_width * s->b_height << 2*s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3992 for(i=0; i<s->max_ref_frames; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3993 s->ref_mvs[i]= av_mallocz(size*sizeof(int16_t[2]));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3994 s->ref_scores[i]= av_mallocz(size*sizeof(uint32_t));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3995 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3996 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3997
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3998 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3999 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4000
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4001 static int frame_start(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4002 AVFrame tmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4003 int w= s->avctx->width; //FIXME round up to x16 ?
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4004 int h= s->avctx->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4005
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4006 if(s->current_picture.data[0]){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4007 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH );
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4008 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4009 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4010 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4011
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4012 tmp= s->last_picture[s->max_ref_frames-1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4013 memmove(s->last_picture+1, s->last_picture, (s->max_ref_frames-1)*sizeof(AVFrame));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4014 s->last_picture[0]= s->current_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4015 s->current_picture= tmp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4016
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4017 if(s->keyframe){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4018 s->ref_frames= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4019 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4020 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4021 for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4022 if(i && s->last_picture[i-1].key_frame)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4023 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4024 s->ref_frames= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4025 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4026
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4027 s->current_picture.reference= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4028 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4029 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4030 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4031 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4032
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4033 s->current_picture.key_frame= s->keyframe;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4034
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4035 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4036 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4037
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4038 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4039 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4040 RangeCoder * const c= &s->c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4041 AVFrame *pict = data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4042 const int width= s->avctx->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4043 const int height= s->avctx->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4044 int level, orientation, plane_index, i, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4045 uint8_t rc_header_bak[sizeof(s->header_state)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4046 uint8_t rc_block_bak[sizeof(s->block_state)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4047
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4048 ff_init_range_encoder(c, buf, buf_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4049 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4050
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4051 for(i=0; i<3; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4052 int shift= !!i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4053 for(y=0; y<(height>>shift); y++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4054 memcpy(&s->input_picture.data[i][y * s->input_picture.linesize[i]],
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4055 &pict->data[i][y * pict->linesize[i]],
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4056 width>>shift);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4057 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4058 s->new_picture = *pict;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4059
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4060 s->m.picture_number= avctx->frame_number;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4061 if(avctx->flags&CODEC_FLAG_PASS2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4062 s->m.pict_type =
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4063 pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4064 s->keyframe= pict->pict_type==FF_I_TYPE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4065 if(!(avctx->flags&CODEC_FLAG_QSCALE)) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4066 pict->quality= ff_rate_estimate_qscale(&s->m, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4067 if (pict->quality < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4068 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4069 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4070 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4071 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4072 s->m.pict_type=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4073 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4074 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4075
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4076 if(s->pass1_rc && avctx->frame_number == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4077 pict->quality= 2*FF_QP2LAMBDA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4078 if(pict->quality){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4079 s->qlog= qscale2qlog(pict->quality);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4080 s->lambda = pict->quality * 3/2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4081 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4082 if(s->qlog < 0 || (!pict->quality && (avctx->flags & CODEC_FLAG_QSCALE))){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4083 s->qlog= LOSSLESS_QLOG;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4084 s->lambda = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4085 }//else keep previous frame's qlog until after motion est
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4086
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4087 frame_start(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4088
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4089 s->m.current_picture_ptr= &s->m.current_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4090 if(pict->pict_type == P_TYPE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4091 int block_width = (width +15)>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4092 int block_height= (height+15)>>4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4093 int stride= s->current_picture.linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4094
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4095 assert(s->current_picture.data[0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4096 assert(s->last_picture[0].data[0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4097
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4098 s->m.avctx= s->avctx;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4099 s->m.current_picture.data[0]= s->current_picture.data[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4100 s->m. last_picture.data[0]= s->last_picture[0].data[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4101 s->m. new_picture.data[0]= s-> input_picture.data[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4102 s->m. last_picture_ptr= &s->m. last_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4103 s->m.linesize=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4104 s->m. last_picture.linesize[0]=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4105 s->m. new_picture.linesize[0]=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4106 s->m.current_picture.linesize[0]= stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4107 s->m.uvlinesize= s->current_picture.linesize[1];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4108 s->m.width = width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4109 s->m.height= height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4110 s->m.mb_width = block_width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4111 s->m.mb_height= block_height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4112 s->m.mb_stride= s->m.mb_width+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4113 s->m.b8_stride= 2*s->m.mb_width+1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4114 s->m.f_code=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4115 s->m.pict_type= pict->pict_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4116 s->m.me_method= s->avctx->me_method;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4117 s->m.me.scene_change_score=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4118 s->m.flags= s->avctx->flags;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4119 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4120 s->m.out_format= FMT_H263;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4121 s->m.unrestricted_mv= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4122
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4123 s->m.lambda = s->lambda;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4124 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4125 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4126
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4127 s->m.dsp= s->dsp; //move
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4128 ff_init_me(&s->m);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4129 s->dsp= s->m.dsp;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4130 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4131
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4132 if(s->pass1_rc){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4133 memcpy(rc_header_bak, s->header_state, sizeof(s->header_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4134 memcpy(rc_block_bak, s->block_state, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4135 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4136
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4137 redo_frame:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4138
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4139 s->m.pict_type = pict->pict_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4140 s->qbias= pict->pict_type == P_TYPE ? 2 : 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4141
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4142 encode_header(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4143 s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4144 encode_blocks(s, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4145 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4146
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4147 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4148 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4149 int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4150 int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4151 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4152 // int bits= put_bits_count(&s->c.pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4153
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4154 if(!(avctx->flags2 & CODEC_FLAG2_MEMC_ONLY)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4155 //FIXME optimize
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4156 if(pict->data[plane_index]) //FIXME gray hack
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4157 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4158 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4159 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4160 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4161 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4162 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4163
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4164 if( plane_index==0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4165 && pict->pict_type == P_TYPE
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4166 && !(avctx->flags&CODEC_FLAG_PASS2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4167 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4168 ff_init_range_encoder(c, buf, buf_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4169 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4170 pict->pict_type= FF_I_TYPE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4171 s->keyframe=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4172 s->current_picture.key_frame=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4173 reset_contexts(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4174 goto redo_frame;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4175 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4176
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4177 if(s->qlog == LOSSLESS_QLOG){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4178 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4179 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4180 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4181 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4182 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4183 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4184
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4185 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4186
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4187 if(s->pass1_rc && plane_index==0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4188 int delta_qlog = ratecontrol_1pass(s, pict);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4189 if (delta_qlog <= INT_MIN)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4190 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4191 if(delta_qlog){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4192 //reordering qlog in the bitstream would eliminate this reset
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4193 ff_init_range_encoder(c, buf, buf_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4194 memcpy(s->header_state, rc_header_bak, sizeof(s->header_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4195 memcpy(s->block_state, rc_block_bak, sizeof(s->block_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4196 encode_header(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4197 encode_blocks(s, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4198 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4199 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4200
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4201 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4202 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4203 SubBand *b= &p->band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4204
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4205 quantize(s, b, b->buf, b->stride, s->qbias);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4206 if(orientation==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4207 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4208 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4209 assert(b->parent==NULL || b->parent->stride == b->stride*2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4210 if(orientation==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4211 correlate(s, b, b->buf, b->stride, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4212 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4213 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4214 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4215
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4216 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4217 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4218 SubBand *b= &p->band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4219
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4220 dequantize(s, b, b->buf, b->stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4221 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4222 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4223
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4224 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4225 if(s->qlog == LOSSLESS_QLOG){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4226 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4227 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4228 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4229 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4230 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4231 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4232 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4233 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4234 STOP_TIMER("pred-conv")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4235 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4236 //ME/MC only
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4237 if(pict->pict_type == I_TYPE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4238 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4239 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4240 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4241 pict->data[plane_index][y*pict->linesize[plane_index] + x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4242 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4243 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4244 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4245 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4246 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4247 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4248 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4249 if(s->avctx->flags&CODEC_FLAG_PSNR){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4250 int64_t error= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4251
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4252 if(pict->data[plane_index]) //FIXME gray hack
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4253 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4254 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4255 int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4256 error += d*d;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4257 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4258 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4259 s->avctx->error[plane_index] += error;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4260 s->current_picture.error[plane_index] = error;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4261 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4262 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4263
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4264 if(s->last_picture[s->max_ref_frames-1].data[0])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4265 avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4266
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4267 s->current_picture.coded_picture_number = avctx->frame_number;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4268 s->current_picture.pict_type = pict->pict_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4269 s->current_picture.quality = pict->quality;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4270 s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4271 s->m.p_tex_bits = s->m.frame_bits - s->m.misc_bits - s->m.mv_bits;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4272 s->m.current_picture.display_picture_number =
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4273 s->m.current_picture.coded_picture_number = avctx->frame_number;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4274 s->m.current_picture.quality = pict->quality;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4275 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4276 if(s->pass1_rc)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4277 if (ff_rate_estimate_qscale(&s->m, 0) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4278 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4279 if(avctx->flags&CODEC_FLAG_PASS1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4280 ff_write_pass1_stats(&s->m);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4281 s->m.last_pict_type = s->m.pict_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4282
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4283 emms_c();
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4284
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4285 return ff_rac_terminate(c);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4286 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4287
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4288 static void common_end(SnowContext *s){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4289 int plane_index, level, orientation, i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4290
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4291 av_freep(&s->spatial_dwt_buffer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4292
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4293 av_freep(&s->m.me.scratchpad);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4294 av_freep(&s->m.me.map);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4295 av_freep(&s->m.me.score_map);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4296 av_freep(&s->m.obmc_scratchpad);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4297
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4298 av_freep(&s->block);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4299
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4300 for(i=0; i<MAX_REF_FRAMES; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4301 av_freep(&s->ref_mvs[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4302 av_freep(&s->ref_scores[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4303 if(s->last_picture[i].data[0])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4304 s->avctx->release_buffer(s->avctx, &s->last_picture[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4305 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4306
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4307 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4308 for(level=s->spatial_decomposition_count-1; level>=0; level--){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4309 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4310 SubBand *b= &s->plane[plane_index].band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4311
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4312 av_freep(&b->x_coeff);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4313 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4314 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4315 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4316 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4317
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4318 static int encode_end(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4319 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4320 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4321
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4322 common_end(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4323 av_free(avctx->stats_out);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4324
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4325 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4326 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4327
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4328 static int decode_init(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4329 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4330 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4331 int block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4332
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4333 avctx->pix_fmt= PIX_FMT_YUV420P;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4334
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4335 common_init(avctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4336
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4337 block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4338 slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 3)) + 1, s->plane[0].width, s->spatial_dwt_buffer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4339
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4340 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4341 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4342
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4343 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4344 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4345 RangeCoder * const c= &s->c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4346 int bytes_read;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4347 AVFrame *picture = data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4348 int level, orientation, plane_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4349
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4350 ff_init_range_decoder(c, buf, buf_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4351 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4352
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4353 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4354 decode_header(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4355 if(!s->block) alloc_blocks(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4356
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4357 frame_start(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4358 //keyframe flag dupliaction mess FIXME
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4359 if(avctx->debug&FF_DEBUG_PICT_INFO)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4360 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4361
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4362 decode_blocks(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4363
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4364 for(plane_index=0; plane_index<3; plane_index++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4365 Plane *p= &s->plane[plane_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4366 int w= p->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4367 int h= p->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4368 int x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4369 int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4370
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4371 if(s->avctx->debug&2048){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4372 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4373 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4374
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4375 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4376 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4377 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4378 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4379 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4380 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4381 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4382
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4383 { START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4384 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4385 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4386 SubBand *b= &p->band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4387 unpack_coeffs(s, b, b->parent, orientation);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4388 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4389 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4390 STOP_TIMER("unpack coeffs");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4391 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4392
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4393 {START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4394 const int mb_h= s->b_height << s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4395 const int block_size = MB_SIZE >> s->block_max_depth;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4396 const int block_w = plane_index ? block_size/2 : block_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4397 int mb_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4398 dwt_compose_t cs[MAX_DECOMPOSITIONS];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4399 int yd=0, yq=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4400 int y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4401 int end_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4402
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4403 ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4404 for(mb_y=0; mb_y<=mb_h; mb_y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4405
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4406 int slice_starty = block_w*mb_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4407 int slice_h = block_w*(mb_y+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4408 if (!(s->keyframe || s->avctx->debug&512)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4409 slice_starty = FFMAX(0, slice_starty - (block_w >> 1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4410 slice_h -= (block_w >> 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4411 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4412
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4413 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4414 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4415 for(level=0; level<s->spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4416 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4417 SubBand *b= &p->band[level][orientation];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4418 int start_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4419 int end_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4420 int our_mb_start = mb_y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4421 int our_mb_end = (mb_y + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4422 const int extra= 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4423 start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra: 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4424 end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4425 if (!(s->keyframe || s->avctx->debug&512)){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4426 start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level)));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4427 end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level)));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4428 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4429 start_y = FFMIN(b->height, start_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4430 end_y = FFMIN(b->height, end_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4431
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4432 if (start_y != end_y){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4433 if (orientation == 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4434 SubBand * correlate_band = &p->band[0][0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4435 int correlate_end_y = FFMIN(b->height, end_y + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4436 int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4437 decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4438 correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4439 dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4440 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4441 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4442 decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4443 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4444 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4445 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4446 STOP_TIMER("decode_subband_slice");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4447 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4448
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4449 { START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4450 for(; yd<slice_h; yd+=4){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4451 ff_spatial_idwt_buffered_slice(&s->dsp, cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4452 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4453 STOP_TIMER("idwt slice");}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4454
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4455
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4456 if(s->qlog == LOSSLESS_QLOG){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4457 for(; yq<slice_h && yq<h; yq++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4458 DWTELEM * line = slice_buffer_get_line(&s->sb, yq);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4459 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4460 line[x] <<= FRAC_BITS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4461 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4462 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4463 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4464
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4465 predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4466
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4467 y = FFMIN(p->height, slice_starty);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4468 end_y = FFMIN(p->height, slice_h);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4469 while(y < end_y)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4470 slice_buffer_release(&s->sb, y++);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4471 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4472
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4473 slice_buffer_flush(&s->sb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4474
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4475 STOP_TIMER("idwt + predict_slices")}
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4476 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4477
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4478 emms_c();
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4479
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4480 if(s->last_picture[s->max_ref_frames-1].data[0])
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4481 avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4482
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4483 if(!(s->avctx->debug&2048))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4484 *picture= s->current_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4485 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4486 *picture= s->mconly_picture;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4487
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4488 *data_size = sizeof(AVFrame);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4489
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4490 bytes_read= c->bytestream - c->bytestream_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4491 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4492
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4493 return bytes_read;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4494 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4495
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4496 static int decode_end(AVCodecContext *avctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4497 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4498 SnowContext *s = avctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4499
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4500 slice_buffer_destroy(&s->sb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4501
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4502 common_end(s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4503
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4504 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4505 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4506
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4507 AVCodec snow_decoder = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4508 "snow",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4509 CODEC_TYPE_VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4510 CODEC_ID_SNOW,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4511 sizeof(SnowContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4512 decode_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4513 NULL,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4514 decode_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4515 decode_frame,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4516 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4517 NULL
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4518 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4519
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4520 #ifdef CONFIG_ENCODERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4521 AVCodec snow_encoder = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4522 "snow",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4523 CODEC_TYPE_VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4524 CODEC_ID_SNOW,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4525 sizeof(SnowContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4526 encode_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4527 encode_frame,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4528 encode_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4529 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4530 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4531
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4532
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4533 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4534 #undef malloc
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4535 #undef free
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4536 #undef printf
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4537
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4538 int main(){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4539 int width=256;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4540 int height=256;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4541 int buffer[2][width*height];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4542 SnowContext s;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4543 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4544 s.spatial_decomposition_count=6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4545 s.spatial_decomposition_type=1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4546
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4547 printf("testing 5/3 DWT\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4548 for(i=0; i<width*height; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4549 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4550
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4551 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4552 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4553
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4554 for(i=0; i<width*height; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4555 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4556
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4557 printf("testing 9/7 DWT\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4558 s.spatial_decomposition_type=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4559 for(i=0; i<width*height; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4560 buffer[0][i]= buffer[1][i]= random()%54321 - 12345;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4561
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4562 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4563 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4564
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4565 for(i=0; i<width*height; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4566 if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4567
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4568 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4569 printf("testing AC coder\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4570 memset(s.header_state, 0, sizeof(s.header_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4571 ff_init_range_encoder(&s.c, buffer[0], 256*256);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4572 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4573
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4574 for(i=-256; i<256; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4575 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4576 put_symbol(&s.c, s.header_state, i*i*i/3*FFABS(i), 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4577 STOP_TIMER("put_symbol")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4578 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4579 ff_rac_terminate(&s.c);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4580
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4581 memset(s.header_state, 0, sizeof(s.header_state));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4582 ff_init_range_decoder(&s.c, buffer[0], 256*256);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4583 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4584
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4585 for(i=-256; i<256; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4586 int j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4587 START_TIMER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4588 j= get_symbol(&s.c, s.header_state, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4589 STOP_TIMER("get_symbol")
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4590 if(j!=i*i*i/3*FFABS(i)) printf("fsck: %d != %d\n", i, j);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4591 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4592 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4593 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4594 int level, orientation, x, y;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4595 int64_t errors[8][4];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4596 int64_t g=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4597
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4598 memset(errors, 0, sizeof(errors));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4599 s.spatial_decomposition_count=3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4600 s.spatial_decomposition_type=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4601 for(level=0; level<s.spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4602 for(orientation=level ? 1 : 0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4603 int w= width >> (s.spatial_decomposition_count-level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4604 int h= height >> (s.spatial_decomposition_count-level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4605 int stride= width << (s.spatial_decomposition_count-level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4606 DWTELEM *buf= buffer[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4607 int64_t error=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4608
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4609 if(orientation&1) buf+=w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4610 if(orientation>1) buf+=stride>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4611
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4612 memset(buffer[0], 0, sizeof(int)*width*height);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4613 buf[w/2 + h/2*stride]= 256*256;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4614 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4615 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4616 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4617 int64_t d= buffer[0][x + y*width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4618 error += d*d;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4619 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8lld ", d);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4620 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4621 if(FFABS(height/2-y)<9 && level==2) printf("\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4622 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4623 error= (int)(sqrt(error)+0.5);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4624 errors[level][orientation]= error;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4625 if(g) g=ff_gcd(g, error);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4626 else g= error;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4627 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4628 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4629 printf("static int const visual_weight[][4]={\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4630 for(level=0; level<s.spatial_decomposition_count; level++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4631 printf(" {");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4632 for(orientation=0; orientation<4; orientation++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4633 printf("%8lld,", errors[level][orientation]/g);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4634 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4635 printf("},\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4636 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4637 printf("};\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4638 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4639 int level=2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4640 int orientation=3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4641 int w= width >> (s.spatial_decomposition_count-level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4642 int h= height >> (s.spatial_decomposition_count-level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4643 int stride= width << (s.spatial_decomposition_count-level);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4644 DWTELEM *buf= buffer[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4645 int64_t error=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4646
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4647 buf+=w;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4648 buf+=stride>>1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4649
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4650 memset(buffer[0], 0, sizeof(int)*width*height);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4651 #if 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4652 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4653 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4654 int tab[4]={0,2,3,1};
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4655 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4656 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4657 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4658 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4659 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4660 for(y=0; y<h; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4661 for(x=0; x<w; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4662 buf[x + y*stride ]=169;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4663 buf[x + y*stride-w]=64;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4664 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4665 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4666 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4667 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4668 for(y=0; y<height; y++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4669 for(x=0; x<width; x++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4670 int64_t d= buffer[0][x + y*width];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4671 error += d*d;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4672 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8lld ", d);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4673 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4674 if(FFABS(height/2-y)<9) printf("\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4675 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4676 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4677
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4678 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4679 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4680 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4681 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4682