[cvs] / xvidcore / src / motion / gmc.h Repository:
ViewVC logotype

Diff of /xvidcore/src/motion/gmc.h

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

revision 1.1, Sat Jun 28 15:54:16 2003 UTC revision 1.2, Mon Mar 22 22:36:24 2004 UTC
# Line 0  Line 1 
1    /*****************************************************************************
2     *
3     *  XVID MPEG-4 VIDEO CODEC
4     *  - GMC interpolation module header -
5     *
6     *  Copyright(C) 2002-2003 Pascal Massimino <skal@planet-d.net>
7     *
8     *  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     * $Id$
23     *
24     ****************************************************************************/
25    
26    #include "../portab.h"
27    #include "../global.h"
28    
29    /* This is borrowed from        decoder.c   */
30    static __inline int
31    gmc_sanitize(int value, int quarterpel, int fcode)
32    {
33            int length = 1 << (fcode+4);
34    
35    #if 0
36            if (quarterpel) value *= 2;
37    #endif
38    
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            value >>= 1;
57            n++;
58      }
59      return n;
60    #else
61      __asm {
62            bsr eax, value
63            inc eax
64      }
65    #endif
66    }
67    /* 16*sizeof(int) -> 1 or 2 cachelines */
68    /* table lookup might be faster!  (still to be benchmarked) */
69    
70    /*
71    static int log2bin_table[16] =
72            { 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4};
73    */
74    /*      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 */
75    
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    static const uint32_t MTab[16] = {
81      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    /* ************************************************************
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    
95    void Predict_16x16_C(const NEW_GMC_DATA * const This,
96                                             uint8_t *dst, const uint8_t *src,
97                                             int dststride, int srcstride, int x, int y, int rounding);
98    
99    void Predict_8x8_C(const NEW_GMC_DATA * const This,
100                                       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    
104    void get_average_mv_C(const NEW_GMC_DATA * const Dsp, VECTOR * const mv,
105                                              int x, int y, int qpel);
106    
107    /* ************************************************************
108     * simplified version for 1 warp point
109     */
110    
111    void Predict_1pt_16x16_C(const NEW_GMC_DATA * const This,
112                                                     uint8_t *Dst, const uint8_t *Src,
113                                                     int dststride, int srcstride, int x, int y, int rounding);
114    
115    void Predict_1pt_8x8_C(const NEW_GMC_DATA * const This,
116                                               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    
120    void get_average_mv_1pt_C(const NEW_GMC_DATA * const Dsp, VECTOR * const mv,
121                                                      int x, int y, int qpel);
122    
123    /* *************************************************************
124     * Warning! It's Accuracy being passed, not 'resolution'!
125     */
126    
127    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    
132    /* *******************************************************************
133     */
134    
135    void
136    generate_GMCimage(      const NEW_GMC_DATA *const gmc_data, /* [input] precalculated data */
137                                            const IMAGE *const pRef,                /* [input] */
138                                            const int mb_width,
139                                            const int mb_height,
140                                            const int stride,
141                                            const int stride2,
142                                            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    

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

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