[svn] / trunk / xvidcore / src / prediction / mbprediction.h Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/prediction/mbprediction.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 136, Thu Apr 25 06:55:00 2002 UTC revision 139, Thu Apr 25 20:39:02 2002 UTC
# Line 35  Line 35 
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    
# Line 177  Line 284 
284  }  }
285    
286    
287    
288  #endif /* _MBPREDICTION_H_ */  #endif /* _MBPREDICTION_H_ */

Legend:
Removed from v.136  
changed lines
  Added in v.139

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