[svn] / trunk / xvidcore / src / bitstream / cbp.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/bitstream/cbp.c

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

revision 3, Fri Mar 8 02:46:11 2002 UTC revision 912, Sun Mar 9 12:00:58 2003 UTC
# Line 3  Line 3 
3    
4  cbpFuncPtr calc_cbp;  cbpFuncPtr calc_cbp;
5    
6  uint32_t calc_cbp_c(const int16_t codes[6][64])  /*
7     * Returns a field of bits that indicates non zero ac blocks
8     * for this macro block
9     */
10    
11    /* naive C */
12    uint32_t
13    calc_cbp_plain(const int16_t codes[6 * 64])
14  {  {
15      uint32_t i, j;          int i, j;
16      uint32_t cbp = 0;      uint32_t cbp = 0;
17    
18      for (i = 0; i < 6; i++) {      for (i = 0; i < 6; i++) {
19                  for (j = 1; j < 64/4; j+=4) {                  for (j=1; j<64;j++) {
20                          if (codes[i][j]  |codes[i][j+1]|                          if (codes[64*i+j]) {
                                 codes[i][j+2]|codes[i][j+3]) {  
21                                  cbp |= 1 << (5 - i);                                  cbp |= 1 << (5 - i);
22                                  break;                                  break;
23                          }                          }
# Line 19  Line 25 
25      }      }
26      return cbp;      return cbp;
27  }  }
28    
29    /* optimized C */
30    uint32_t
31    calc_cbp_c(const int16_t codes[6 * 64])
32    {
33            unsigned int i=6;
34            uint32_t cbp = 0;
35    
36    /* uses fixed relation: 4*codes = 1*codes64 */
37    /* if prototype is changed (e.g. from int16_t to something like int32) this routine
38       has to be changed! */
39    
40            do  {
41                    uint64_t *codes64 = (uint64_t*)codes;   /* the compiler doesn't really make this */
42                    uint32_t *codes32 = (uint32_t*)codes;   /* variables, just "addressing modes" */
43    
44                    cbp += cbp;
45            if (codes[1] || codes32[1]) {
46                            cbp++;
47                    }
48            else if (codes64[1] | codes64[2] | codes64[3]) {
49                            cbp++;
50                    }
51            else if (codes64[4] | codes64[5] | codes64[6] | codes64[7]) {
52                            cbp++;
53                    }
54            else if (codes64[8] | codes64[9] | codes64[10] | codes64[11]) {
55                            cbp++;
56                    }
57            else if (codes64[12] | codes64[13] | codes64[14] | codes64[15]) {
58                            cbp++;
59                    }
60                    codes += 64;
61                    i--;
62        } while (i != 0);
63    
64            return cbp;
65    }
66    
67    
68    
69    
70    /* older code maybe better on some plattforms? */
71    #if (0==1)
72            for (i = 5; i >= 0; i--) {
73                    if (codes[1] | codes[2] | codes[3])
74                            cbp |= 1 << i;
75                    else {
76                            for (j = 4; j <= 56; j+=4)      /* [60],[61],[62],[63] are last */
77                                    if (codes[j] | codes[j+1] | codes[j+2] | codes[j+3]) {
78                                    cbp |= 1 << i;
79                                    break;
80                            }
81                    }
82                    codes += 64;
83            }
84    
85            return cbp;
86    #endif

Legend:
Removed from v.3  
changed lines
  Added in v.912

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