35 |
int32_t iDcScaler, |
int32_t iDcScaler, |
36 |
int16_t predictors[8]); |
int16_t predictors[8]); |
37 |
|
|
38 |
|
/* get_pmvdata returns the median predictor and nothing else */ |
39 |
|
|
40 |
|
static __inline VECTOR get_pmv(const MACROBLOCK * const pMBs, |
41 |
|
const uint32_t x, const uint32_t y, |
42 |
|
const uint32_t x_dim, |
43 |
|
const uint32_t block) |
44 |
|
{ |
45 |
|
|
46 |
|
int xin1, xin2, xin3; |
47 |
|
int yin1, yin2, yin3; |
48 |
|
int vec1, vec2, vec3; |
49 |
|
VECTOR lneigh,tneigh,trneigh; /* left neighbour, top neighbour, topright neighbour */ |
50 |
|
VECTOR median; |
51 |
|
|
52 |
|
static VECTOR zeroMV = {0,0}; |
53 |
|
uint32_t index = x + y * x_dim; |
54 |
|
// zeroMV.x = zeroMV.y = 0; |
55 |
|
|
56 |
|
// first row (special case) |
57 |
|
if (y == 0 && (block == 0 || block == 1)) |
58 |
|
{ |
59 |
|
if ((x == 0) && (block == 0)) // first column, first block |
60 |
|
{ |
61 |
|
return zeroMV; |
62 |
|
} |
63 |
|
if (block == 1) // second block; has only a left neighbour |
64 |
|
{ |
65 |
|
return pMBs[index].mvs[0]; |
66 |
|
} |
67 |
|
else /* block==0, but x!=0, so again, there is a left neighbour*/ |
68 |
|
{ |
69 |
|
return pMBs[index-1].mvs[1]; |
70 |
|
} |
71 |
|
} |
72 |
|
|
73 |
|
/* |
74 |
|
MODE_INTER, vm18 page 48 |
75 |
|
MODE_INTER4V vm18 page 51 |
76 |
|
|
77 |
|
(x,y-1) (x+1,y-1) |
78 |
|
[ | ] [ | ] |
79 |
|
[ 2 | 3 ] [ 2 | ] |
80 |
|
|
81 |
|
(x-1,y) (x,y) (x+1,y) |
82 |
|
[ | 1 ] [ 0 | 1 ] [ 0 | ] |
83 |
|
[ | 3 ] [ 2 | 3 ] [ | ] |
84 |
|
*/ |
85 |
|
|
86 |
|
switch (block) |
87 |
|
{ |
88 |
|
case 0: |
89 |
|
xin1 = x - 1; yin1 = y; vec1 = 1; /* left */ |
90 |
|
xin2 = x; yin2 = y - 1; vec2 = 2; /* top */ |
91 |
|
xin3 = x + 1; yin3 = y - 1; vec3 = 2; /* top right */ |
92 |
|
break; |
93 |
|
case 1: |
94 |
|
xin1 = x; yin1 = y; vec1 = 0; |
95 |
|
xin2 = x; yin2 = y - 1; vec2 = 3; |
96 |
|
xin3 = x + 1; yin3 = y - 1; vec3 = 2; |
97 |
|
break; |
98 |
|
case 2: |
99 |
|
xin1 = x - 1; yin1 = y; vec1 = 3; |
100 |
|
xin2 = x; yin2 = y; vec2 = 0; |
101 |
|
xin3 = x; yin3 = y; vec3 = 1; |
102 |
|
break; |
103 |
|
default: |
104 |
|
xin1 = x; yin1 = y; vec1 = 2; |
105 |
|
xin2 = x; yin2 = y; vec2 = 0; |
106 |
|
xin3 = x; yin3 = y; vec3 = 1; |
107 |
|
} |
108 |
|
|
109 |
|
|
110 |
|
if (xin1 < 0 || /* yin1 < 0 || */ xin1 >= (int32_t)x_dim) |
111 |
|
{ |
112 |
|
lneigh = zeroMV; |
113 |
|
} |
114 |
|
else |
115 |
|
{ |
116 |
|
lneigh = pMBs[xin1 + yin1 * x_dim].mvs[vec1]; |
117 |
|
} |
118 |
|
|
119 |
|
if (xin2 < 0 || /* yin2 < 0 || */ xin2 >= (int32_t)x_dim) |
120 |
|
{ |
121 |
|
tneigh = zeroMV; |
122 |
|
} |
123 |
|
else |
124 |
|
{ |
125 |
|
tneigh = pMBs[xin2 + yin2 * x_dim].mvs[vec2]; |
126 |
|
} |
127 |
|
|
128 |
|
if (xin3 < 0 || /* yin3 < 0 || */ xin3 >= (int32_t)x_dim) |
129 |
|
{ |
130 |
|
trneigh = zeroMV; |
131 |
|
} |
132 |
|
else |
133 |
|
{ |
134 |
|
trneigh = pMBs[xin3 + yin3 * x_dim].mvs[vec3]; |
135 |
|
} |
136 |
|
|
137 |
|
// median,minimum |
138 |
|
|
139 |
|
median.x = MIN(MAX(lneigh.x, tneigh.x), MIN(MAX(tneigh.x, trneigh.x), MAX(lneigh.x, trneigh.x))); |
140 |
|
median.y = MIN(MAX(lneigh.y, tneigh.y), MIN(MAX(tneigh.y, trneigh.y), MAX(lneigh.y, trneigh.y))); |
141 |
|
return median; |
142 |
|
} |
143 |
|
|
144 |
|
|
145 |
/* This is somehow a copy of get_pmv, but returning all MVs and Minimum SAD |
/* This is somehow a copy of get_pmv, but returning all MVs and Minimum SAD |
146 |
instead of only Median MV */ |
instead of only Median MV */ |
147 |
|
|
284 |
} |
} |
285 |
|
|
286 |
|
|
287 |
|
|
288 |
#endif /* _MBPREDICTION_H_ */ |
#endif /* _MBPREDICTION_H_ */ |