[svn] / trunk / xvidcore / src / motion / motion_comp.c Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/motion/motion_comp.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 437 - (view) (download)

1 : chl 430 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Motion Compensation module -
5 :     *
6 :     * Copyright(C) 2002 Michael Militzer <michael@xvid.org>
7 :     * Copyright(C) 2002 Edouard Gomez <ed.gomez@wanadoo.fr>
8 :     * Copyright(C) 2002 Christoph Lampert <gruel@web.de>
9 :     *
10 :     * This program is an implementation of a part of one or more MPEG-4
11 :     * Video tools as specified in ISO/IEC 14496-2 standard. Those intending
12 :     * to use this software module in hardware or software products are
13 :     * advised that its use may infringe existing patents or copyrights, and
14 :     * any such use would be at such party's own risk. The original
15 :     * developer of this software module and his/her company, and subsequent
16 :     * editors and their companies, will have no liability for use of this
17 :     * software or modifications or derivatives thereof.
18 :     *
19 :     * This program is free software; you can redistribute it and/or modify
20 :     * it under the terms of the GNU General Public License as published by
21 :     * the Free Software Foundation; either version 2 of the License, or
22 :     * (at your option) any later version.
23 :     *
24 :     * This program is distributed in the hope that it will be useful,
25 :     * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 :     * GNU General Public License for more details.
28 :     *
29 :     * You should have received a copy of the GNU General Public License
30 :     * along with this program; if not, write to the Free Software
31 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 :     *
33 :     *************************************************************************/
34 : suxen_drol 118
35 : Isibaar 3 #include "../encoder.h"
36 :     #include "../utils/mbfunctions.h"
37 :     #include "../image/interpolate8x8.h"
38 :     #include "../utils/timer.h"
39 : suxen_drol 118 #include "motion.h"
40 : Isibaar 3
41 :     #define ABS(X) (((X)>0)?(X):-(X))
42 :     #define SIGN(X) (((X)>0)?1:-1)
43 :    
44 : edgomez 195 static __inline void
45 :     compensate8x8_halfpel(int16_t * const dct_codes,
46 :     uint8_t * const cur,
47 :     const uint8_t * const ref,
48 :     const uint8_t * const refh,
49 :     const uint8_t * const refv,
50 :     const uint8_t * const refhv,
51 :     const uint32_t x,
52 :     const uint32_t y,
53 :     const int32_t dx,
54 :     const int dy,
55 :     const uint32_t stride)
56 : Isibaar 3 {
57 : edgomez 195 int32_t ddx, ddy;
58 : Isibaar 3
59 : edgomez 195 switch (((dx & 1) << 1) + (dy & 1)) // ((dx%2)?2:0)+((dy%2)?1:0)
60 :     {
61 :     case 0:
62 :     ddx = dx / 2;
63 :     ddy = dy / 2;
64 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
65 : Isibaar 209 ref + (int) ((y + ddy) * stride + x + ddx), stride);
66 : Isibaar 3 break;
67 :    
68 : edgomez 195 case 1:
69 :     ddx = dx / 2;
70 :     ddy = (dy - 1) / 2;
71 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
72 : Isibaar 209 refv + (int) ((y + ddy) * stride + x + ddx), stride);
73 : Isibaar 3 break;
74 :    
75 : edgomez 195 case 2:
76 :     ddx = (dx - 1) / 2;
77 :     ddy = dy / 2;
78 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
79 : Isibaar 209 refh + (int) ((y + ddy) * stride + x + ddx), stride);
80 : Isibaar 3 break;
81 :    
82 : edgomez 195 default: // case 3:
83 :     ddx = (dx - 1) / 2;
84 :     ddy = (dy - 1) / 2;
85 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
86 : Isibaar 209 refhv + (int) ((y + ddy) * stride + x + ddx), stride);
87 : Isibaar 3 break;
88 : edgomez 195 }
89 : Isibaar 3 }
90 :    
91 :    
92 :    
93 : edgomez 195 void
94 :     MBMotionCompensation(MACROBLOCK * const mb,
95 :     const uint32_t i,
96 :     const uint32_t j,
97 :     const IMAGE * const ref,
98 :     const IMAGE * const refh,
99 :     const IMAGE * const refv,
100 :     const IMAGE * const refhv,
101 :     IMAGE * const cur,
102 :     int16_t * dct_codes,
103 :     const uint32_t width,
104 :     const uint32_t height,
105 :     const uint32_t edged_width,
106 :     const uint32_t rounding)
107 : Isibaar 3 {
108 :     static const uint32_t roundtab[16] =
109 :     { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 };
110 :    
111 :    
112 : edgomez 195 if (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q) {
113 : Isibaar 3 int32_t dx = mb->mvs[0].x;
114 :     int32_t dy = mb->mvs[0].y;
115 :    
116 : edgomez 195 compensate8x8_halfpel(&dct_codes[0 * 64], cur->y, ref->y, refh->y,
117 :     refv->y, refhv->y, 16 * i, 16 * j, dx, dy,
118 :     edged_width);
119 :     compensate8x8_halfpel(&dct_codes[1 * 64], cur->y, ref->y, refh->y,
120 :     refv->y, refhv->y, 16 * i + 8, 16 * j, dx, dy,
121 :     edged_width);
122 :     compensate8x8_halfpel(&dct_codes[2 * 64], cur->y, ref->y, refh->y,
123 :     refv->y, refhv->y, 16 * i, 16 * j + 8, dx, dy,
124 :     edged_width);
125 :     compensate8x8_halfpel(&dct_codes[3 * 64], cur->y, ref->y, refh->y,
126 :     refv->y, refhv->y, 16 * i + 8, 16 * j + 8, dx,
127 :     dy, edged_width);
128 : Isibaar 3
129 :     dx = (dx & 3) ? (dx >> 1) | 1 : dx / 2;
130 :     dy = (dy & 3) ? (dy >> 1) | 1 : dy / 2;
131 :    
132 : suxen_drol 152 /* uv-image-based compensation */
133 : chl 437
134 : edgomez 195 interpolate8x8_switch(refv->u, ref->u, 8 * i, 8 * j, dx, dy,
135 :     edged_width / 2, rounding);
136 :     transfer_8to16sub(&dct_codes[4 * 64],
137 :     cur->u + 8 * j * edged_width / 2 + 8 * i,
138 :     refv->u + 8 * j * edged_width / 2 + 8 * i,
139 :     edged_width / 2);
140 : Isibaar 3
141 : edgomez 195 interpolate8x8_switch(refv->v, ref->v, 8 * i, 8 * j, dx, dy,
142 :     edged_width / 2, rounding);
143 :     transfer_8to16sub(&dct_codes[5 * 64],
144 :     cur->v + 8 * j * edged_width / 2 + 8 * i,
145 :     refv->v + 8 * j * edged_width / 2 + 8 * i,
146 :     edged_width / 2);
147 : chl 437
148 : edgomez 195 } else // mode == MODE_INTER4V
149 : Isibaar 3 {
150 :     int32_t sum, dx, dy;
151 :    
152 : edgomez 195 compensate8x8_halfpel(&dct_codes[0 * 64], cur->y, ref->y, refh->y,
153 :     refv->y, refhv->y, 16 * i, 16 * j, mb->mvs[0].x,
154 :     mb->mvs[0].y, edged_width);
155 :     compensate8x8_halfpel(&dct_codes[1 * 64], cur->y, ref->y, refh->y,
156 :     refv->y, refhv->y, 16 * i + 8, 16 * j,
157 :     mb->mvs[1].x, mb->mvs[1].y, edged_width);
158 :     compensate8x8_halfpel(&dct_codes[2 * 64], cur->y, ref->y, refh->y,
159 :     refv->y, refhv->y, 16 * i, 16 * j + 8,
160 :     mb->mvs[2].x, mb->mvs[2].y, edged_width);
161 :     compensate8x8_halfpel(&dct_codes[3 * 64], cur->y, ref->y, refh->y,
162 :     refv->y, refhv->y, 16 * i + 8, 16 * j + 8,
163 :     mb->mvs[3].x, mb->mvs[3].y, edged_width);
164 : Isibaar 3
165 :     sum = mb->mvs[0].x + mb->mvs[1].x + mb->mvs[2].x + mb->mvs[3].x;
166 : edgomez 195 dx = (sum ? SIGN(sum) *
167 :     (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2) : 0);
168 : Isibaar 3
169 :     sum = mb->mvs[0].y + mb->mvs[1].y + mb->mvs[2].y + mb->mvs[3].y;
170 : edgomez 195 dy = (sum ? SIGN(sum) *
171 :     (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2) : 0);
172 : Isibaar 3
173 :     /* uv-block-based compensation */
174 : edgomez 195 interpolate8x8_switch(refv->u, ref->u, 8 * i, 8 * j, dx, dy,
175 :     edged_width / 2, rounding);
176 :     transfer_8to16sub(&dct_codes[4 * 64],
177 :     cur->u + 8 * j * edged_width / 2 + 8 * i,
178 :     refv->u + 8 * j * edged_width / 2 + 8 * i,
179 :     edged_width / 2);
180 : Isibaar 3
181 : edgomez 195 interpolate8x8_switch(refv->v, ref->v, 8 * i, 8 * j, dx, dy,
182 :     edged_width / 2, rounding);
183 :     transfer_8to16sub(&dct_codes[5 * 64],
184 :     cur->v + 8 * j * edged_width / 2 + 8 * i,
185 :     refv->v + 8 * j * edged_width / 2 + 8 * i,
186 :     edged_width / 2);
187 : Isibaar 3 }
188 :     }

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