Mercurial > libavcodec.hg
annotate cabac.c @ 8130:c45366b01126 libavcodec
ARM: fix j_rev_dct_ARM
This is a bugfix for ARMv4 assembly implementation of 'j_rev_dct'
function.
The problem was in the incorrect partially empty row detection. Even
if the first two coefficients in the row were nonzero, it handled this
just like the case with only the first nonzero coefficient.
Now this function produces exactly the same output as the stripped
down reference C version of 'j_rev_dct' (with the nested checks like
'if (d6) { if (d2) { ...' always evaluated as true, avoiding shortcut
branches).
author | mru |
---|---|
date | Wed, 12 Nov 2008 20:23:36 +0000 |
parents | f7cbb7733146 |
children | e9d9d946f213 |
rev | line source |
---|---|
1287 | 1 /* |
2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder | |
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1287 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1287 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1287 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1287 | 20 */ |
21 | |
22 /** | |
23 * @file cabac.c | |
24 * Context Adaptive Binary Arithmetic Coder. | |
25 */ | |
26 | |
27 #include <string.h> | |
28 | |
6763 | 29 #include "libavutil/common.h" |
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2323
diff
changeset
|
30 #include "bitstream.h" |
1287 | 31 #include "cabac.h" |
32 | |
3991
72bae00a317f
make lps_range a global table its constant anyway (saves 1 addition for accessing it)
michael
parents:
3984
diff
changeset
|
33 static const uint8_t lps_range[64][4]= { |
1287 | 34 {128,176,208,240}, {128,167,197,227}, {128,158,187,216}, {123,150,178,205}, |
35 {116,142,169,195}, {111,135,160,185}, {105,128,152,175}, {100,122,144,166}, | |
36 { 95,116,137,158}, { 90,110,130,150}, { 85,104,123,142}, { 81, 99,117,135}, | |
37 { 77, 94,111,128}, { 73, 89,105,122}, { 69, 85,100,116}, { 66, 80, 95,110}, | |
38 { 62, 76, 90,104}, { 59, 72, 86, 99}, { 56, 69, 81, 94}, { 53, 65, 77, 89}, | |
39 { 51, 62, 73, 85}, { 48, 59, 69, 80}, { 46, 56, 66, 76}, { 43, 53, 63, 72}, | |
40 { 41, 50, 59, 69}, { 39, 48, 56, 65}, { 37, 45, 54, 62}, { 35, 43, 51, 59}, | |
41 { 33, 41, 48, 56}, { 32, 39, 46, 53}, { 30, 37, 43, 50}, { 29, 35, 41, 48}, | |
42 { 27, 33, 39, 45}, { 26, 31, 37, 43}, { 24, 30, 35, 41}, { 23, 28, 33, 39}, | |
43 { 22, 27, 32, 37}, { 21, 26, 30, 35}, { 20, 24, 29, 33}, { 19, 23, 27, 31}, | |
44 { 18, 22, 26, 30}, { 17, 21, 25, 28}, { 16, 20, 23, 27}, { 15, 19, 22, 25}, | |
45 { 14, 18, 21, 24}, { 14, 17, 20, 23}, { 13, 16, 19, 22}, { 12, 15, 18, 21}, | |
46 { 12, 14, 17, 20}, { 11, 14, 16, 19}, { 11, 13, 15, 18}, { 10, 12, 15, 17}, | |
47 { 10, 12, 14, 16}, { 9, 11, 13, 15}, { 9, 11, 12, 14}, { 8, 10, 12, 14}, | |
48 { 8, 9, 11, 13}, { 7, 9, 11, 12}, { 7, 9, 10, 12}, { 7, 8, 10, 11}, | |
49 { 6, 8, 9, 11}, { 6, 7, 9, 10}, { 6, 7, 8, 9}, { 2, 2, 2, 2}, | |
50 }; | |
51 | |
4014
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
52 uint8_t ff_h264_mlps_state[4*64]; |
4039 | 53 uint8_t ff_h264_lps_range[4*2*64]; |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
54 uint8_t ff_h264_lps_state[2*64]; |
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
55 uint8_t ff_h264_mps_state[2*64]; |
3991
72bae00a317f
make lps_range a global table its constant anyway (saves 1 addition for accessing it)
michael
parents:
3984
diff
changeset
|
56 |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
57 static const uint8_t mps_state[64]= { |
1287 | 58 1, 2, 3, 4, 5, 6, 7, 8, |
59 9,10,11,12,13,14,15,16, | |
60 17,18,19,20,21,22,23,24, | |
61 25,26,27,28,29,30,31,32, | |
62 33,34,35,36,37,38,39,40, | |
63 41,42,43,44,45,46,47,48, | |
64 49,50,51,52,53,54,55,56, | |
65 57,58,59,60,61,62,62,63, | |
66 }; | |
67 | |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
68 static const uint8_t lps_state[64]= { |
1287 | 69 0, 0, 1, 2, 2, 4, 4, 5, |
70 6, 7, 8, 9, 9,11,11,12, | |
71 13,13,15,15,16,16,18,18, | |
72 19,19,21,21,22,22,23,24, | |
73 24,25,26,26,27,27,28,29, | |
74 29,30,30,30,31,32,32,33, | |
75 33,33,34,34,35,35,35,36, | |
76 36,36,37,37,37,38,38,63, | |
77 }; | |
4024
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
78 #if 0 |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
79 const uint8_t ff_h264_norm_shift_old[128]= { |
3964 | 80 7,6,5,5,4,4,4,4,3,3,3,3,3,3,3,3, |
2323 | 81 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, |
82 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, | |
83 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, | |
3964 | 84 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
85 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |
86 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |
87 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | |
2323 | 88 }; |
4024
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
89 #endif |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
90 const uint8_t ff_h264_norm_shift[512]= { |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
91 9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
92 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
93 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
94 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
95 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
96 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
97 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
98 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
99 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
100 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
101 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
102 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
103 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
104 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
105 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
106 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
107 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
108 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
109 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
110 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
111 }; |
2323 | 112 |
1287 | 113 /** |
114 * | |
115 * @param buf_size size of buf in bits | |
116 */ | |
117 void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){ | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1300
diff
changeset
|
118 init_put_bits(&c->pb, buf, buf_size); |
1287 | 119 |
120 c->low= 0; | |
121 c->range= 0x1FE; | |
122 c->outstanding_count= 0; | |
123 #ifdef STRICT_LIMITS | |
124 c->sym_count =0; | |
125 #endif | |
2967 | 126 |
1287 | 127 c->pb.bit_left++; //avoids firstBitFlag |
128 } | |
129 | |
130 /** | |
131 * | |
132 * @param buf_size size of buf in bits | |
133 */ | |
2024
f65d87bfdd5a
some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents:
1908
diff
changeset
|
134 void ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size){ |
2967 | 135 c->bytestream_start= |
1287 | 136 c->bytestream= buf; |
2116 | 137 c->bytestream_end= buf + buf_size; |
1287 | 138 |
2323 | 139 #if CABAC_BITS == 16 |
140 c->low = (*c->bytestream++)<<18; | |
141 c->low+= (*c->bytestream++)<<10; | |
142 #else | |
143 c->low = (*c->bytestream++)<<10; | |
144 #endif | |
145 c->low+= ((*c->bytestream++)<<2) + 2; | |
4024
d550343b5dac
shift CABACContext.range right, this reduces the number of shifts needed in get_cabac() and is slightly faster on P3 (and should be much faster on P4 as the P4 except the more recent variants lacks an integer shifter and so shifts have ~10 times longer latency then simple operations like adds)
michael
parents:
4014
diff
changeset
|
146 c->range= 0x1FE; |
1287 | 147 } |
148 | |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
149 void ff_init_cabac_states(CABACContext *c){ |
1287 | 150 int i, j; |
2967 | 151 |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
152 for(i=0; i<64; i++){ |
1287 | 153 for(j=0; j<4; j++){ //FIXME check if this is worth the 1 shift we save |
4039 | 154 ff_h264_lps_range[j*2*64+2*i+0]= |
155 ff_h264_lps_range[j*2*64+2*i+1]= lps_range[i][j]; | |
1287 | 156 } |
157 | |
4014
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
158 ff_h264_mlps_state[128+2*i+0]= |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
159 ff_h264_mps_state[2*i+0]= 2*mps_state[i]+0; |
4014
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
160 ff_h264_mlps_state[128+2*i+1]= |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
161 ff_h264_mps_state[2*i+1]= 2*mps_state[i]+1; |
1287 | 162 |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1522
diff
changeset
|
163 if( i ){ |
3984 | 164 #ifdef BRANCHLESS_CABAC_DECODER |
4014
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
165 ff_h264_mlps_state[128-2*i-1]= 2*lps_state[i]+0; |
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
166 ff_h264_mlps_state[128-2*i-2]= 2*lps_state[i]+1; |
3974 | 167 }else{ |
4014
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
168 ff_h264_mlps_state[128-2*i-1]= 1; |
b2582438effe
dehack *ps_state indexing in the branchless decoder
michael
parents:
3993
diff
changeset
|
169 ff_h264_mlps_state[128-2*i-2]= 0; |
3974 | 170 #else |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
171 ff_h264_lps_state[2*i+0]= 2*lps_state[i]+0; |
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
172 ff_h264_lps_state[2*i+1]= 2*lps_state[i]+1; |
1287 | 173 }else{ |
3993
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
174 ff_h264_lps_state[2*i+0]= 1; |
8b7c59b7af01
make state transition tables global as they are constant and the code is slightly faster that way
michael
parents:
3991
diff
changeset
|
175 ff_h264_lps_state[2*i+1]= 0; |
3974 | 176 #endif |
1287 | 177 } |
178 } | |
179 } | |
180 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
5934
diff
changeset
|
181 #ifdef TEST |
5380
389366aa3458
Fix the self tests which are contained in some codecs and are using random().
takis
parents:
5215
diff
changeset
|
182 #undef random |
1287 | 183 #define SIZE 10240 |
2420 | 184 |
185 #include "avcodec.h" | |
6171
1c0477262c72
Fix test program compilation: Add missing #include and update the call
diego
parents:
6164
diff
changeset
|
186 #include "cabac.h" |
2420 | 187 |
5934 | 188 int main(void){ |
1287 | 189 CABACContext c; |
190 uint8_t b[9*SIZE]; | |
1290 | 191 uint8_t r[9*SIZE]; |
1287 | 192 int i; |
1290 | 193 uint8_t state[10]= {0}; |
2967 | 194 |
1287 | 195 ff_init_cabac_encoder(&c, b, SIZE); |
6171
1c0477262c72
Fix test program compilation: Add missing #include and update the call
diego
parents:
6164
diff
changeset
|
196 ff_init_cabac_states(&c); |
2967 | 197 |
1287 | 198 for(i=0; i<SIZE; i++){ |
1290 | 199 r[i]= random()%7; |
1287 | 200 } |
2967 | 201 |
1287 | 202 for(i=0; i<SIZE; i++){ |
203 START_TIMER | |
1290 | 204 put_cabac_bypass(&c, r[i]&1); |
1287 | 205 STOP_TIMER("put_cabac_bypass") |
206 } | |
2967 | 207 |
1287 | 208 for(i=0; i<SIZE; i++){ |
209 START_TIMER | |
1290 | 210 put_cabac(&c, state, r[i]&1); |
1287 | 211 STOP_TIMER("put_cabac") |
212 } | |
213 | |
1290 | 214 for(i=0; i<SIZE; i++){ |
215 START_TIMER | |
216 put_cabac_u(&c, state, r[i], 6, 3, i&1); | |
217 STOP_TIMER("put_cabac_u") | |
2967 | 218 } |
1290 | 219 |
220 for(i=0; i<SIZE; i++){ | |
221 START_TIMER | |
1298 | 222 put_cabac_ueg(&c, state, r[i], 3, 0, 1, 2); |
1290 | 223 STOP_TIMER("put_cabac_ueg") |
2967 | 224 } |
225 | |
1287 | 226 put_cabac_terminate(&c, 1); |
2967 | 227 |
1287 | 228 ff_init_cabac_decoder(&c, b, SIZE); |
2967 | 229 |
1290 | 230 memset(state, 0, sizeof(state)); |
2967 | 231 |
1287 | 232 for(i=0; i<SIZE; i++){ |
233 START_TIMER | |
1290 | 234 if( (r[i]&1) != get_cabac_bypass(&c) ) |
2420 | 235 av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i); |
1287 | 236 STOP_TIMER("get_cabac_bypass") |
237 } | |
2967 | 238 |
1287 | 239 for(i=0; i<SIZE; i++){ |
240 START_TIMER | |
1290 | 241 if( (r[i]&1) != get_cabac(&c, state) ) |
2420 | 242 av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i); |
1287 | 243 STOP_TIMER("get_cabac") |
244 } | |
2420 | 245 #if 0 |
1290 | 246 for(i=0; i<SIZE; i++){ |
247 START_TIMER | |
248 if( r[i] != get_cabac_u(&c, state, (i&1) ? 6 : 7, 3, i&1) ) | |
2420 | 249 av_log(NULL, AV_LOG_ERROR, "CABAC unary (truncated) binarization failure at %d\n", i); |
1290 | 250 STOP_TIMER("get_cabac_u") |
251 } | |
252 | |
253 for(i=0; i<SIZE; i++){ | |
254 START_TIMER | |
255 if( r[i] != get_cabac_ueg(&c, state, 3, 0, 1, 2)) | |
2420 | 256 av_log(NULL, AV_LOG_ERROR, "CABAC unary (truncated) binarization failure at %d\n", i); |
1290 | 257 STOP_TIMER("get_cabac_ueg") |
258 } | |
2420 | 259 #endif |
1287 | 260 if(!get_cabac_terminate(&c)) |
2420 | 261 av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n"); |
2967 | 262 |
1287 | 263 return 0; |
264 } | |
265 | |
6164
ecaf5226e9b0
Consistently use TEST as the preprocessor condition to enable test code.
diego
parents:
5934
diff
changeset
|
266 #endif /* TEST */ |