[svn] / branches / dev-api-4 / xvidcore / src / motion / motion_comp.c Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/motion/motion_comp.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 677 - (view) (download)
Original Path: trunk/xvidcore/src/motion/motion_comp.c

1 : chl 430 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Motion Compensation module -
5 :     *
6 : edgomez 605 * Copyright(C) 2002 Peter Ross <pross@xvid.org>
7 : chl 430 *
8 : edgomez 652 * This file is part of XviD, a free MPEG-4 video encoder/decoder
9 : chl 430 *
10 : edgomez 652 * XviD is free software; you can redistribute it and/or modify it
11 :     * under the terms of the GNU General Public License as published by
12 : chl 430 * the Free Software Foundation; either version 2 of the License, or
13 :     * (at your option) any later version.
14 :     *
15 :     * This program is distributed in the hope that it will be useful,
16 :     * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 :     * GNU General Public License for more details.
19 :     *
20 :     * You should have received a copy of the GNU General Public License
21 :     * along with this program; if not, write to the Free Software
22 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 :     *
24 : edgomez 652 * Under section 8 of the GNU General Public License, the copyright
25 :     * holders of XVID explicitly forbid distribution in the following
26 :     * countries:
27 :     *
28 :     * - Japan
29 :     * - United States of America
30 :     *
31 :     * Linking XviD statically or dynamically with other modules is making a
32 :     * combined work based on XviD. Thus, the terms and conditions of the
33 :     * GNU General Public License cover the whole combination.
34 :     *
35 :     * As a special exception, the copyright holders of XviD give you
36 :     * permission to link XviD with independent modules that communicate with
37 :     * XviD solely through the VFW1.1 and DShow interfaces, regardless of the
38 :     * license terms of these independent modules, and to copy and distribute
39 :     * the resulting combined work under terms of your choice, provided that
40 :     * every copy of the combined work is accompanied by a complete copy of
41 :     * the source code of XviD (the version of XviD used to produce the
42 :     * combined work), being distributed under the terms of the GNU General
43 :     * Public License plus this exception. An independent module is a module
44 :     * which is not derived from or based on XviD.
45 :     *
46 :     * Note that people who make modified versions of XviD are not obligated
47 :     * to grant this special exception for their modified versions; it is
48 :     * their choice whether to do so. The GNU General Public License gives
49 :     * permission to release a modified version without this exception; this
50 :     * exception also makes it possible to release a modified version which
51 :     * carries forward this exception.
52 :     *
53 : edgomez 677 * $Id: motion_comp.c,v 1.16 2002-11-26 23:44:10 edgomez Exp $
54 : edgomez 652 *
55 : chl 430 *************************************************************************/
56 : suxen_drol 118
57 : Isibaar 3 #include "../encoder.h"
58 :     #include "../utils/mbfunctions.h"
59 :     #include "../image/interpolate8x8.h"
60 :     #include "../utils/timer.h"
61 : suxen_drol 118 #include "motion.h"
62 : Isibaar 3
63 :     #define ABS(X) (((X)>0)?(X):-(X))
64 :     #define SIGN(X) (((X)>0)?1:-1)
65 :    
66 : edgomez 195 static __inline void
67 :     compensate8x8_halfpel(int16_t * const dct_codes,
68 :     uint8_t * const cur,
69 :     const uint8_t * const ref,
70 :     const uint8_t * const refh,
71 :     const uint8_t * const refv,
72 :     const uint8_t * const refhv,
73 :     const uint32_t x,
74 :     const uint32_t y,
75 :     const int32_t dx,
76 :     const int dy,
77 :     const uint32_t stride)
78 : Isibaar 3 {
79 : edgomez 195 int32_t ddx, ddy;
80 : Isibaar 3
81 : edgomez 677 switch (((dx & 1) << 1) + (dy & 1)) /* ((dx%2)?2:0)+((dy%2)?1:0) */
82 : edgomez 195 {
83 :     case 0:
84 :     ddx = dx / 2;
85 :     ddy = dy / 2;
86 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
87 : Isibaar 209 ref + (int) ((y + ddy) * stride + x + ddx), stride);
88 : Isibaar 3 break;
89 :    
90 : edgomez 195 case 1:
91 :     ddx = dx / 2;
92 :     ddy = (dy - 1) / 2;
93 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
94 : Isibaar 209 refv + (int) ((y + ddy) * stride + x + ddx), stride);
95 : Isibaar 3 break;
96 :    
97 : edgomez 195 case 2:
98 :     ddx = (dx - 1) / 2;
99 :     ddy = dy / 2;
100 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
101 : Isibaar 209 refh + (int) ((y + ddy) * stride + x + ddx), stride);
102 : Isibaar 3 break;
103 :    
104 : edgomez 677 default: /* case 3: */
105 : edgomez 195 ddx = (dx - 1) / 2;
106 :     ddy = (dy - 1) / 2;
107 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
108 : Isibaar 209 refhv + (int) ((y + ddy) * stride + x + ddx), stride);
109 : Isibaar 3 break;
110 : edgomez 195 }
111 : Isibaar 3 }
112 :    
113 :    
114 :    
115 : edgomez 195 void
116 :     MBMotionCompensation(MACROBLOCK * const mb,
117 :     const uint32_t i,
118 :     const uint32_t j,
119 :     const IMAGE * const ref,
120 :     const IMAGE * const refh,
121 :     const IMAGE * const refv,
122 :     const IMAGE * const refhv,
123 :     IMAGE * const cur,
124 :     int16_t * dct_codes,
125 :     const uint32_t width,
126 :     const uint32_t height,
127 :     const uint32_t edged_width,
128 :     const uint32_t rounding)
129 : Isibaar 3 {
130 :     static const uint32_t roundtab[16] =
131 :     { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 };
132 :    
133 :    
134 : edgomez 195 if (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q) {
135 : Isibaar 3 int32_t dx = mb->mvs[0].x;
136 :     int32_t dy = mb->mvs[0].y;
137 :    
138 : edgomez 195 compensate8x8_halfpel(&dct_codes[0 * 64], cur->y, ref->y, refh->y,
139 :     refv->y, refhv->y, 16 * i, 16 * j, dx, dy,
140 :     edged_width);
141 :     compensate8x8_halfpel(&dct_codes[1 * 64], cur->y, ref->y, refh->y,
142 :     refv->y, refhv->y, 16 * i + 8, 16 * j, dx, dy,
143 :     edged_width);
144 :     compensate8x8_halfpel(&dct_codes[2 * 64], cur->y, ref->y, refh->y,
145 :     refv->y, refhv->y, 16 * i, 16 * j + 8, dx, dy,
146 :     edged_width);
147 :     compensate8x8_halfpel(&dct_codes[3 * 64], cur->y, ref->y, refh->y,
148 :     refv->y, refhv->y, 16 * i + 8, 16 * j + 8, dx,
149 :     dy, edged_width);
150 : Isibaar 3
151 :     dx = (dx & 3) ? (dx >> 1) | 1 : dx / 2;
152 :     dy = (dy & 3) ? (dy >> 1) | 1 : dy / 2;
153 :    
154 : suxen_drol 152 /* uv-image-based compensation */
155 : chl 437
156 : edgomez 195 interpolate8x8_switch(refv->u, ref->u, 8 * i, 8 * j, dx, dy,
157 :     edged_width / 2, rounding);
158 :     transfer_8to16sub(&dct_codes[4 * 64],
159 :     cur->u + 8 * j * edged_width / 2 + 8 * i,
160 :     refv->u + 8 * j * edged_width / 2 + 8 * i,
161 :     edged_width / 2);
162 : Isibaar 3
163 : edgomez 195 interpolate8x8_switch(refv->v, ref->v, 8 * i, 8 * j, dx, dy,
164 :     edged_width / 2, rounding);
165 :     transfer_8to16sub(&dct_codes[5 * 64],
166 :     cur->v + 8 * j * edged_width / 2 + 8 * i,
167 :     refv->v + 8 * j * edged_width / 2 + 8 * i,
168 :     edged_width / 2);
169 : chl 437
170 : edgomez 677 } else /* mode == MODE_INTER4V */
171 : Isibaar 3 {
172 :     int32_t sum, dx, dy;
173 :    
174 : edgomez 195 compensate8x8_halfpel(&dct_codes[0 * 64], cur->y, ref->y, refh->y,
175 :     refv->y, refhv->y, 16 * i, 16 * j, mb->mvs[0].x,
176 :     mb->mvs[0].y, edged_width);
177 :     compensate8x8_halfpel(&dct_codes[1 * 64], cur->y, ref->y, refh->y,
178 :     refv->y, refhv->y, 16 * i + 8, 16 * j,
179 :     mb->mvs[1].x, mb->mvs[1].y, edged_width);
180 :     compensate8x8_halfpel(&dct_codes[2 * 64], cur->y, ref->y, refh->y,
181 :     refv->y, refhv->y, 16 * i, 16 * j + 8,
182 :     mb->mvs[2].x, mb->mvs[2].y, edged_width);
183 :     compensate8x8_halfpel(&dct_codes[3 * 64], cur->y, ref->y, refh->y,
184 :     refv->y, refhv->y, 16 * i + 8, 16 * j + 8,
185 :     mb->mvs[3].x, mb->mvs[3].y, edged_width);
186 : Isibaar 3
187 :     sum = mb->mvs[0].x + mb->mvs[1].x + mb->mvs[2].x + mb->mvs[3].x;
188 : edgomez 195 dx = (sum ? SIGN(sum) *
189 :     (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2) : 0);
190 : Isibaar 3
191 :     sum = mb->mvs[0].y + mb->mvs[1].y + mb->mvs[2].y + mb->mvs[3].y;
192 : edgomez 195 dy = (sum ? SIGN(sum) *
193 :     (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2) : 0);
194 : Isibaar 3
195 :     /* uv-block-based compensation */
196 : edgomez 195 interpolate8x8_switch(refv->u, ref->u, 8 * i, 8 * j, dx, dy,
197 :     edged_width / 2, rounding);
198 :     transfer_8to16sub(&dct_codes[4 * 64],
199 :     cur->u + 8 * j * edged_width / 2 + 8 * i,
200 :     refv->u + 8 * j * edged_width / 2 + 8 * i,
201 :     edged_width / 2);
202 : Isibaar 3
203 : edgomez 195 interpolate8x8_switch(refv->v, ref->v, 8 * i, 8 * j, dx, dy,
204 :     edged_width / 2, rounding);
205 :     transfer_8to16sub(&dct_codes[5 * 64],
206 :     cur->v + 8 * j * edged_width / 2 + 8 * i,
207 :     refv->v + 8 * j * edged_width / 2 + 8 * i,
208 :     edged_width / 2);
209 : Isibaar 3 }
210 :     }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4