Parent Directory
|
Revision Log
Revision 1.1.2.6 - (view) (download)
1 : | edgomez | 1.1.2.3 | /***************************************************************************** |
2 : | chl | 1.1.2.1 | * |
3 : | edgomez | 1.1.2.3 | * XVID MPEG-4 VIDEO CODEC |
4 : | * - GMC interpolation module header - | ||
5 : | chl | 1.1.2.1 | * |
6 : | edgomez | 1.1.2.3 | * Copyright(C) 2002-2003 Pascal Massimino <skal@planet-d.net> |
7 : | chl | 1.1.2.1 | * |
8 : | edgomez | 1.1.2.3 | * This program is free software ; you can redistribute it and/or modify |
9 : | * it under the terms of the GNU General Public License as published by | ||
10 : | * the Free Software Foundation ; either version 2 of the License, or | ||
11 : | * (at your option) any later version. | ||
12 : | * | ||
13 : | * This program is distributed in the hope that it will be useful, | ||
14 : | * but WITHOUT ANY WARRANTY ; without even the implied warranty of | ||
15 : | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 : | * GNU General Public License for more details. | ||
17 : | * | ||
18 : | * You should have received a copy of the GNU General Public License | ||
19 : | * along with this program ; if not, write to the Free Software | ||
20 : | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 : | * | ||
22 : | edgomez | 1.1.2.5 | * $Id$ |
23 : | edgomez | 1.1.2.3 | * |
24 : | ****************************************************************************/ | ||
25 : | chl | 1.1.2.1 | |
26 : | #include "../portab.h" | ||
27 : | #include "../global.h" | ||
28 : | |||
29 : | /* This is borrowed from decoder.c */ | ||
30 : | edgomez | 1.1.2.3 | static __inline int |
31 : | gmc_sanitize(int value, int quarterpel, int fcode) | ||
32 : | chl | 1.1.2.1 | { |
33 : | int length = 1 << (fcode+4); | ||
34 : | |||
35 : | edgomez | 1.1.2.5 | #if 0 |
36 : | if (quarterpel) value *= 2; | ||
37 : | #endif | ||
38 : | chl | 1.1.2.1 | |
39 : | if (value < -length) | ||
40 : | return -length; | ||
41 : | else if (value >= length) | ||
42 : | return length-1; | ||
43 : | else return value; | ||
44 : | } | ||
45 : | |||
46 : | |||
47 : | /* And this is borrowed from bitstream.c until we find a common solution */ | ||
48 : | static uint32_t __inline | ||
49 : | log2bin(uint32_t value) | ||
50 : | { | ||
51 : | /* Changed by Chenm001 */ | ||
52 : | #if !defined(_MSC_VER) | ||
53 : | int n = 0; | ||
54 : | |||
55 : | while (value) { | ||
56 : | syskin | 1.1.2.2 | value >>= 1; |
57 : | n++; | ||
58 : | chl | 1.1.2.1 | } |
59 : | return n; | ||
60 : | #else | ||
61 : | __asm { | ||
62 : | syskin | 1.1.2.2 | bsr eax, value |
63 : | inc eax | ||
64 : | chl | 1.1.2.1 | } |
65 : | #endif | ||
66 : | } | ||
67 : | /* 16*sizeof(int) -> 1 or 2 cachelines */ | ||
68 : | /* table lookup might be faster! (still to be benchmarked) */ | ||
69 : | |||
70 : | /* | ||
71 : | edgomez | 1.1.2.6 | static int log2bin_table[16] = |
72 : | chl | 1.1.2.1 | { 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4}; |
73 : | */ | ||
74 : | edgomez | 1.1.2.6 | /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ |
75 : | chl | 1.1.2.1 | |
76 : | #define RDIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) | ||
77 : | #define RSHIFT(a,b) ( (a)>0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) | ||
78 : | |||
79 : | #define MLT(i) (((16-(i))<<16) + (i)) | ||
80 : | edgomez | 1.1.2.6 | static const uint32_t MTab[16] = { |
81 : | chl | 1.1.2.1 | MLT( 0), MLT( 1), MLT( 2), MLT( 3), MLT( 4), MLT( 5), MLT( 6), MLT( 7), |
82 : | MLT( 8), MLT( 9), MLT(10), MLT(11), MLT(12), MLT(13), MLT(14), MLT(15) | ||
83 : | }; | ||
84 : | #undef MLT | ||
85 : | |||
86 : | |||
87 : | edgomez | 1.1.2.5 | /* ************************************************************ |
88 : | * Pts = 2 or 3 | ||
89 : | * | ||
90 : | * Warning! *src is the global frame pointer (that is: adress | ||
91 : | * of pixel 0,0), not the macroblock one. | ||
92 : | * Conversely, *dst is the macroblock top-left adress. | ||
93 : | */ | ||
94 : | chl | 1.1.2.1 | |
95 : | void Predict_16x16_C(const NEW_GMC_DATA * const This, | ||
96 : | syskin | 1.1.2.2 | uint8_t *dst, const uint8_t *src, |
97 : | int dststride, int srcstride, int x, int y, int rounding); | ||
98 : | chl | 1.1.2.1 | |
99 : | void Predict_8x8_C(const NEW_GMC_DATA * const This, | ||
100 : | syskin | 1.1.2.2 | uint8_t *uDst, const uint8_t *uSrc, |
101 : | uint8_t *vDst, const uint8_t *vSrc, | ||
102 : | int dststride, int srcstride, int x, int y, int rounding); | ||
103 : | chl | 1.1.2.1 | |
104 : | syskin | 1.1.2.2 | void get_average_mv_C(const NEW_GMC_DATA * const Dsp, VECTOR * const mv, |
105 : | int x, int y, int qpel); | ||
106 : | chl | 1.1.2.1 | |
107 : | edgomez | 1.1.2.5 | /* ************************************************************ |
108 : | * simplified version for 1 warp point | ||
109 : | */ | ||
110 : | chl | 1.1.2.1 | |
111 : | void Predict_1pt_16x16_C(const NEW_GMC_DATA * const This, | ||
112 : | edgomez | 1.1.2.6 | uint8_t *Dst, const uint8_t *Src, |
113 : | syskin | 1.1.2.2 | int dststride, int srcstride, int x, int y, int rounding); |
114 : | chl | 1.1.2.1 | |
115 : | void Predict_1pt_8x8_C(const NEW_GMC_DATA * const This, | ||
116 : | syskin | 1.1.2.2 | uint8_t *uDst, const uint8_t *uSrc, |
117 : | uint8_t *vDst, const uint8_t *vSrc, | ||
118 : | int dststride, int srcstride, int x, int y, int rounding); | ||
119 : | chl | 1.1.2.1 | |
120 : | syskin | 1.1.2.2 | void get_average_mv_1pt_C(const NEW_GMC_DATA * const Dsp, VECTOR * const mv, |
121 : | int x, int y, int qpel); | ||
122 : | chl | 1.1.2.1 | |
123 : | edgomez | 1.1.2.5 | /* ************************************************************* |
124 : | * Warning! It's Accuracy being passed, not 'resolution'! | ||
125 : | */ | ||
126 : | chl | 1.1.2.1 | |
127 : | syskin | 1.1.2.2 | void generate_GMCparameters(int nb_pts, const int accuracy, |
128 : | const WARPPOINTS *const pts, | ||
129 : | const int width, const int height, | ||
130 : | NEW_GMC_DATA *const gmc); | ||
131 : | chl | 1.1.2.1 | |
132 : | edgomez | 1.1.2.5 | /* ******************************************************************* |
133 : | */ | ||
134 : | chl | 1.1.2.1 | |
135 : | void | ||
136 : | edgomez | 1.1.2.5 | generate_GMCimage( const NEW_GMC_DATA *const gmc_data, /* [input] precalculated data */ |
137 : | const IMAGE *const pRef, /* [input] */ | ||
138 : | chl | 1.1.2.1 | const int mb_width, |
139 : | const int mb_height, | ||
140 : | const int stride, | ||
141 : | const int stride2, | ||
142 : | edgomez | 1.1.2.5 | const int fcode, /* [input] some parameters... */ |
143 : | const int32_t quarterpel, /* [input] for rounding avgMV */ | ||
144 : | const int reduced_resolution, /* [input] ignored */ | ||
145 : | const int32_t rounding, /* [input] for rounding image data */ | ||
146 : | MACROBLOCK *const pMBs, /* [output] average motion vectors */ | ||
147 : | IMAGE *const pGMC); /* [output] full warped image */ | ||
148 : | chl | 1.1.2.1 |
No admin address has been configured | ViewVC Help |
Powered by ViewVC 1.0.4 |