Mercurial > libavcodec.hg
annotate h264enc.c @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | a9780299ef48 |
children |
rev | line source |
---|---|
4291 | 1 /* |
2 * H.264 encoder | |
3 * | |
7803 | 4 * This file is part of FFmpeg. |
5 * | |
4291 | 6 * FFmpeg is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2.1 of the License, or (at your option) any later version. | |
10 * | |
11 * FFmpeg is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with FFmpeg; if not, write to the Free Software | |
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
19 */ | |
20 | |
21 | |
6763 | 22 #include "libavutil/common.h" |
9428 | 23 #include "get_bits.h" |
4291 | 24 #include "mpegvideo.h" |
25 #include "h264data.h" | |
26 | |
27 /** | |
28 * Write out the provided data into a NAL unit. | |
29 * @param nal_ref_idc NAL reference IDC | |
30 * @param nal_unit_type NAL unit payload type | |
31 * @param dest the target buffer, dst+1 == src is allowed as a special case | |
32 * @param destsize the length of the dst array | |
33 * @param b2 the data which should be escaped | |
11556 | 34 * @return pointer to current position in the output buffer or NULL if an error occurred |
4291 | 35 */ |
36 static uint8_t *h264_write_nal_unit(int nal_ref_idc, int nal_unit_type, uint8_t *dest, int *destsize, | |
37 PutBitContext *b2) | |
38 { | |
39 PutBitContext b; | |
40 int i, destpos, rbsplen, escape_count; | |
41 uint8_t *rbsp; | |
42 | |
43 if (nal_unit_type != NAL_END_STREAM) | |
44 put_bits(b2,1,1); // rbsp_stop_bit | |
45 | |
46 // Align b2 on a byte boundary | |
47 align_put_bits(b2); | |
48 rbsplen = put_bits_count(b2)/8; | |
49 flush_put_bits(b2); | |
50 rbsp = b2->buf; | |
51 | |
52 init_put_bits(&b,dest,*destsize); | |
53 | |
54 put_bits(&b,16,0); | |
55 put_bits(&b,16,0x01); | |
56 | |
57 put_bits(&b,1,0); // forbidden zero bit | |
58 put_bits(&b,2,nal_ref_idc); // nal_ref_idc | |
59 put_bits(&b,5,nal_unit_type); // nal_unit_type | |
60 | |
61 flush_put_bits(&b); | |
62 | |
63 destpos = 5; | |
64 escape_count= 0; | |
65 | |
66 for (i=0; i<rbsplen; i+=2) | |
67 { | |
68 if (rbsp[i]) continue; | |
69 if (i>0 && rbsp[i-1]==0) | |
70 i--; | |
71 if (i+2<rbsplen && rbsp[i+1]==0 && rbsp[i+2]<=3) | |
72 { | |
73 escape_count++; | |
74 i+=2; | |
75 } | |
76 } | |
77 | |
78 if(escape_count==0) | |
79 { | |
80 if(dest+destpos != rbsp) | |
81 { | |
82 memcpy(dest+destpos, rbsp, rbsplen); | |
83 *destsize -= (rbsplen+destpos); | |
84 } | |
85 return dest+rbsplen+destpos; | |
86 } | |
87 | |
88 if(rbsplen + escape_count + 1> *destsize) | |
89 { | |
90 av_log(NULL, AV_LOG_ERROR, "Destination buffer too small!\n"); | |
91 return NULL; | |
92 } | |
93 | |
94 // this should be damn rare (hopefully) | |
95 for (i = 0 ; i < rbsplen ; i++) | |
96 { | |
97 if (i + 2 < rbsplen && (rbsp[i] == 0 && rbsp[i+1] == 0 && rbsp[i+2] < 4)) | |
98 { | |
99 dest[destpos++] = rbsp[i++]; | |
100 dest[destpos++] = rbsp[i]; | |
101 dest[destpos++] = 0x03; // emulation prevention byte | |
102 } | |
103 else | |
104 dest[destpos++] = rbsp[i]; | |
105 } | |
106 *destsize -= destpos; | |
107 return dest+destpos; | |
108 } | |
109 | |
8189
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
110 static const uint8_t pict_type_to_golomb[7] = {-1, 2, 0, 1, -1, 4, 3}; |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
111 |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
112 static const uint8_t intra4x4_cbp_to_golomb[48] = { |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
113 3, 29, 30, 17, 31, 18, 37, 8, 32, 38, 19, 9, 20, 10, 11, 2, |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
114 16, 33, 34, 21, 35, 22, 39, 4, 36, 40, 23, 5, 24, 6, 7, 1, |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
115 41, 42, 43, 25, 44, 26, 46, 12, 45, 47, 27, 13, 28, 14, 15, 0 |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
116 }; |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
117 |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
118 static const uint8_t inter_cbp_to_golomb[48] = { |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
119 0, 2, 3, 7, 4, 8, 17, 13, 5, 18, 9, 14, 10, 15, 16, 11, |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
120 1, 32, 33, 36, 34, 37, 44, 40, 35, 45, 38, 41, 39, 42, 43, 19, |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
121 6, 24, 25, 20, 26, 21, 46, 28, 27, 47, 22, 29, 23, 30, 31, 12 |
9915843e67e2
Move H.264 tables that are only useful for encoding to h264enc.c.
diego
parents:
7803
diff
changeset
|
122 }; |
8216
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
123 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
124 #define QUANT_SHIFT 22 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
125 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
126 static const int quant_coeff[52][16] = { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
127 { 419430, 258111, 419430, 258111, 258111, 167772, 258111, 167772, 419430, 258111, 419430, 258111, 258111, 167772, 258111, 167772,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
128 { 381300, 239675, 381300, 239675, 239675, 149131, 239675, 149131, 381300, 239675, 381300, 239675, 239675, 149131, 239675, 149131,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
129 { 322639, 209715, 322639, 209715, 209715, 134218, 209715, 134218, 322639, 209715, 322639, 209715, 209715, 134218, 209715, 134218,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
130 { 299593, 186414, 299593, 186414, 186414, 116711, 186414, 116711, 299593, 186414, 299593, 186414, 186414, 116711, 186414, 116711,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
131 { 262144, 167772, 262144, 167772, 167772, 107374, 167772, 107374, 262144, 167772, 262144, 167772, 167772, 107374, 167772, 107374,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
132 { 233017, 145889, 233017, 145889, 145889, 92564, 145889, 92564, 233017, 145889, 233017, 145889, 145889, 92564, 145889, 92564,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
133 { 209715, 129056, 209715, 129056, 129056, 83886, 129056, 83886, 209715, 129056, 209715, 129056, 129056, 83886, 129056, 83886,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
134 { 190650, 119837, 190650, 119837, 119837, 74565, 119837, 74565, 190650, 119837, 190650, 119837, 119837, 74565, 119837, 74565,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
135 { 161319, 104858, 161319, 104858, 104858, 67109, 104858, 67109, 161319, 104858, 161319, 104858, 104858, 67109, 104858, 67109,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
136 { 149797, 93207, 149797, 93207, 93207, 58356, 93207, 58356, 149797, 93207, 149797, 93207, 93207, 58356, 93207, 58356,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
137 { 131072, 83886, 131072, 83886, 83886, 53687, 83886, 53687, 131072, 83886, 131072, 83886, 83886, 53687, 83886, 53687,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
138 { 116508, 72944, 116508, 72944, 72944, 46282, 72944, 46282, 116508, 72944, 116508, 72944, 72944, 46282, 72944, 46282,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
139 { 104858, 64528, 104858, 64528, 64528, 41943, 64528, 41943, 104858, 64528, 104858, 64528, 64528, 41943, 64528, 41943,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
140 { 95325, 59919, 95325, 59919, 59919, 37283, 59919, 37283, 95325, 59919, 95325, 59919, 59919, 37283, 59919, 37283,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
141 { 80660, 52429, 80660, 52429, 52429, 33554, 52429, 33554, 80660, 52429, 80660, 52429, 52429, 33554, 52429, 33554,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
142 { 74898, 46603, 74898, 46603, 46603, 29178, 46603, 29178, 74898, 46603, 74898, 46603, 46603, 29178, 46603, 29178,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
143 { 65536, 41943, 65536, 41943, 41943, 26844, 41943, 26844, 65536, 41943, 65536, 41943, 41943, 26844, 41943, 26844,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
144 { 58254, 36472, 58254, 36472, 36472, 23141, 36472, 23141, 58254, 36472, 58254, 36472, 36472, 23141, 36472, 23141,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
145 { 52429, 32264, 52429, 32264, 32264, 20972, 32264, 20972, 52429, 32264, 52429, 32264, 32264, 20972, 32264, 20972,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
146 { 47663, 29959, 47663, 29959, 29959, 18641, 29959, 18641, 47663, 29959, 47663, 29959, 29959, 18641, 29959, 18641,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
147 { 40330, 26214, 40330, 26214, 26214, 16777, 26214, 16777, 40330, 26214, 40330, 26214, 26214, 16777, 26214, 16777,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
148 { 37449, 23302, 37449, 23302, 23302, 14589, 23302, 14589, 37449, 23302, 37449, 23302, 23302, 14589, 23302, 14589,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
149 { 32768, 20972, 32768, 20972, 20972, 13422, 20972, 13422, 32768, 20972, 32768, 20972, 20972, 13422, 20972, 13422,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
150 { 29127, 18236, 29127, 18236, 18236, 11570, 18236, 11570, 29127, 18236, 29127, 18236, 18236, 11570, 18236, 11570,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
151 { 26214, 16132, 26214, 16132, 16132, 10486, 16132, 10486, 26214, 16132, 26214, 16132, 16132, 10486, 16132, 10486,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
152 { 23831, 14980, 23831, 14980, 14980, 9321, 14980, 9321, 23831, 14980, 23831, 14980, 14980, 9321, 14980, 9321,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
153 { 20165, 13107, 20165, 13107, 13107, 8389, 13107, 8389, 20165, 13107, 20165, 13107, 13107, 8389, 13107, 8389,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
154 { 18725, 11651, 18725, 11651, 11651, 7294, 11651, 7294, 18725, 11651, 18725, 11651, 11651, 7294, 11651, 7294,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
155 { 16384, 10486, 16384, 10486, 10486, 6711, 10486, 6711, 16384, 10486, 16384, 10486, 10486, 6711, 10486, 6711,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
156 { 14564, 9118, 14564, 9118, 9118, 5785, 9118, 5785, 14564, 9118, 14564, 9118, 9118, 5785, 9118, 5785,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
157 { 13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243, 13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
158 { 11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660, 11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
159 { 10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194, 10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
160 { 9362, 5825, 9362, 5825, 5825, 3647, 5825, 3647, 9362, 5825, 9362, 5825, 5825, 3647, 5825, 3647,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
161 { 8192, 5243, 8192, 5243, 5243, 3355, 5243, 3355, 8192, 5243, 8192, 5243, 5243, 3355, 5243, 3355,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
162 { 7282, 4559, 7282, 4559, 4559, 2893, 4559, 2893, 7282, 4559, 7282, 4559, 4559, 2893, 4559, 2893,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
163 { 6554, 4033, 6554, 4033, 4033, 2621, 4033, 2621, 6554, 4033, 6554, 4033, 4033, 2621, 4033, 2621,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
164 { 5958, 3745, 5958, 3745, 3745, 2330, 3745, 2330, 5958, 3745, 5958, 3745, 3745, 2330, 3745, 2330,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
165 { 5041, 3277, 5041, 3277, 3277, 2097, 3277, 2097, 5041, 3277, 5041, 3277, 3277, 2097, 3277, 2097,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
166 { 4681, 2913, 4681, 2913, 2913, 1824, 2913, 1824, 4681, 2913, 4681, 2913, 2913, 1824, 2913, 1824,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
167 { 4096, 2621, 4096, 2621, 2621, 1678, 2621, 1678, 4096, 2621, 4096, 2621, 2621, 1678, 2621, 1678,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
168 { 3641, 2280, 3641, 2280, 2280, 1446, 2280, 1446, 3641, 2280, 3641, 2280, 2280, 1446, 2280, 1446,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
169 { 3277, 2016, 3277, 2016, 2016, 1311, 2016, 1311, 3277, 2016, 3277, 2016, 2016, 1311, 2016, 1311,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
170 { 2979, 1872, 2979, 1872, 1872, 1165, 1872, 1165, 2979, 1872, 2979, 1872, 1872, 1165, 1872, 1165,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
171 { 2521, 1638, 2521, 1638, 1638, 1049, 1638, 1049, 2521, 1638, 2521, 1638, 1638, 1049, 1638, 1049,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
172 { 2341, 1456, 2341, 1456, 1456, 912, 1456, 912, 2341, 1456, 2341, 1456, 1456, 912, 1456, 912,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
173 { 2048, 1311, 2048, 1311, 1311, 839, 1311, 839, 2048, 1311, 2048, 1311, 1311, 839, 1311, 839,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
174 { 1820, 1140, 1820, 1140, 1140, 723, 1140, 723, 1820, 1140, 1820, 1140, 1140, 723, 1140, 723,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
175 { 1638, 1008, 1638, 1008, 1008, 655, 1008, 655, 1638, 1008, 1638, 1008, 1008, 655, 1008, 655,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
176 { 1489, 936, 1489, 936, 936, 583, 936, 583, 1489, 936, 1489, 936, 936, 583, 936, 583,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
177 { 1260, 819, 1260, 819, 819, 524, 819, 524, 1260, 819, 1260, 819, 819, 524, 819, 524,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
178 { 1170, 728, 1170, 728, 728, 456, 728, 456, 1170, 728, 1170, 728, 728, 456, 728, 456,}, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
179 }; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
180 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
181 //FIXME need to check that this does not overflow signed 32 bit for low qp, I am not sure, it's very close |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
182 //FIXME check that gcc inlines this (and optimizes intra & separate_dc stuff away) |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
183 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
184 int intra, int separate_dc) |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
185 { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
186 int i; |
11564 | 187 const int * const quant_table = quant_coeff[qscale]; |
8216
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
188 const int bias = intra ? (1 << QUANT_SHIFT) / 3 : (1 << QUANT_SHIFT) / 6; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
189 const unsigned int threshold1 = (1 << QUANT_SHIFT) - bias - 1; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
190 const unsigned int threshold2 = (threshold1 << 1); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
191 int last_non_zero; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
192 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
193 if (separate_dc) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
194 if (qscale <= 18) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
195 //avoid overflows |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
196 const int dc_bias = intra ? (1 << (QUANT_SHIFT - 2)) / 3 : (1 << (QUANT_SHIFT - 2)) / 6; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
197 const unsigned int dc_threshold1 = (1 << (QUANT_SHIFT - 2)) - dc_bias - 1; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
198 const unsigned int dc_threshold2 = (dc_threshold1 << 1); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
199 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
200 int level = block[0]*quant_coeff[qscale+18][0]; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
201 if (((unsigned)(level + dc_threshold1)) > dc_threshold2) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
202 if (level > 0) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
203 level = (dc_bias + level) >> (QUANT_SHIFT - 2); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
204 block[0] = level; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
205 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
206 level = (dc_bias - level) >> (QUANT_SHIFT - 2); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
207 block[0] = -level; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
208 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
209 // last_non_zero = i; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
210 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
211 block[0] = 0; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
212 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
213 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
214 const int dc_bias = intra ? (1 << (QUANT_SHIFT + 1)) / 3 : (1 << (QUANT_SHIFT + 1)) / 6; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
215 const unsigned int dc_threshold1 = (1 << (QUANT_SHIFT + 1)) - dc_bias - 1; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
216 const unsigned int dc_threshold2 = (dc_threshold1 << 1); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
217 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
218 int level = block[0]*quant_table[0]; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
219 if (((unsigned)(level + dc_threshold1)) > dc_threshold2) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
220 if (level > 0) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
221 level = (dc_bias + level) >> (QUANT_SHIFT + 1); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
222 block[0] = level; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
223 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
224 level = (dc_bias - level) >> (QUANT_SHIFT + 1); |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
225 block[0] = -level; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
226 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
227 // last_non_zero = i; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
228 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
229 block[0] = 0; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
230 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
231 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
232 last_non_zero = 0; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
233 i = 1; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
234 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
235 last_non_zero = -1; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
236 i = 0; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
237 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
238 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
239 for (; i < 16; i++) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
240 const int j = scantable[i]; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
241 int level = block[j]*quant_table[j]; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
242 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
243 // if ( bias+level >= (1 << (QMAT_SHIFT - 3)) |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
244 // || bias-level >= (1 << (QMAT_SHIFT - 3))) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
245 if (((unsigned)(level + threshold1)) > threshold2) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
246 if (level > 0) { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
247 level = (bias + level) >> QUANT_SHIFT; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
248 block[j] = level; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
249 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
250 level = (bias - level) >> QUANT_SHIFT; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
251 block[j] = -level; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
252 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
253 last_non_zero = i; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
254 } else { |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
255 block[j] = 0; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
256 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
257 } |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
258 |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
259 return last_non_zero; |
018299720403
Move encoder-specific quantize_c and related tables to the H.264 encoder.
diego
parents:
8189
diff
changeset
|
260 } |