00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "libavutil/common.h"
00023 #include "bitstream.h"
00024 #include "mpegvideo.h"
00025 #include "h264data.h"
00026
00036 static uint8_t *h264_write_nal_unit(int nal_ref_idc, int nal_unit_type, uint8_t *dest, int *destsize,
00037 PutBitContext *b2)
00038 {
00039 PutBitContext b;
00040 int i, destpos, rbsplen, escape_count;
00041 uint8_t *rbsp;
00042
00043 if (nal_unit_type != NAL_END_STREAM)
00044 put_bits(b2,1,1);
00045
00046
00047 align_put_bits(b2);
00048 rbsplen = put_bits_count(b2)/8;
00049 flush_put_bits(b2);
00050 rbsp = b2->buf;
00051
00052 init_put_bits(&b,dest,*destsize);
00053
00054 put_bits(&b,16,0);
00055 put_bits(&b,16,0x01);
00056
00057 put_bits(&b,1,0);
00058 put_bits(&b,2,nal_ref_idc);
00059 put_bits(&b,5,nal_unit_type);
00060
00061 flush_put_bits(&b);
00062
00063 destpos = 5;
00064 escape_count= 0;
00065
00066 for (i=0; i<rbsplen; i+=2)
00067 {
00068 if (rbsp[i]) continue;
00069 if (i>0 && rbsp[i-1]==0)
00070 i--;
00071 if (i+2<rbsplen && rbsp[i+1]==0 && rbsp[i+2]<=3)
00072 {
00073 escape_count++;
00074 i+=2;
00075 }
00076 }
00077
00078 if(escape_count==0)
00079 {
00080 if(dest+destpos != rbsp)
00081 {
00082 memcpy(dest+destpos, rbsp, rbsplen);
00083 *destsize -= (rbsplen+destpos);
00084 }
00085 return dest+rbsplen+destpos;
00086 }
00087
00088 if(rbsplen + escape_count + 1> *destsize)
00089 {
00090 av_log(NULL, AV_LOG_ERROR, "Destination buffer too small!\n");
00091 return NULL;
00092 }
00093
00094
00095 for (i = 0 ; i < rbsplen ; i++)
00096 {
00097 if (i + 2 < rbsplen && (rbsp[i] == 0 && rbsp[i+1] == 0 && rbsp[i+2] < 4))
00098 {
00099 dest[destpos++] = rbsp[i++];
00100 dest[destpos++] = rbsp[i];
00101 dest[destpos++] = 0x03;
00102 }
00103 else
00104 dest[destpos++] = rbsp[i];
00105 }
00106 *destsize -= destpos;
00107 return dest+destpos;
00108 }
00109
00110 static const uint8_t pict_type_to_golomb[7] = {-1, 2, 0, 1, -1, 4, 3};
00111
00112 static const uint8_t intra4x4_cbp_to_golomb[48] = {
00113 3, 29, 30, 17, 31, 18, 37, 8, 32, 38, 19, 9, 20, 10, 11, 2,
00114 16, 33, 34, 21, 35, 22, 39, 4, 36, 40, 23, 5, 24, 6, 7, 1,
00115 41, 42, 43, 25, 44, 26, 46, 12, 45, 47, 27, 13, 28, 14, 15, 0
00116 };
00117
00118 static const uint8_t inter_cbp_to_golomb[48] = {
00119 0, 2, 3, 7, 4, 8, 17, 13, 5, 18, 9, 14, 10, 15, 16, 11,
00120 1, 32, 33, 36, 34, 37, 44, 40, 35, 45, 38, 41, 39, 42, 43, 19,
00121 6, 24, 25, 20, 26, 21, 46, 28, 27, 47, 22, 29, 23, 30, 31, 12
00122 };
00123
00124 #define QUANT_SHIFT 22
00125
00126 static const int quant_coeff[52][16] = {
00127 { 419430, 258111, 419430, 258111, 258111, 167772, 258111, 167772, 419430, 258111, 419430, 258111, 258111, 167772, 258111, 167772,},
00128 { 381300, 239675, 381300, 239675, 239675, 149131, 239675, 149131, 381300, 239675, 381300, 239675, 239675, 149131, 239675, 149131,},
00129 { 322639, 209715, 322639, 209715, 209715, 134218, 209715, 134218, 322639, 209715, 322639, 209715, 209715, 134218, 209715, 134218,},
00130 { 299593, 186414, 299593, 186414, 186414, 116711, 186414, 116711, 299593, 186414, 299593, 186414, 186414, 116711, 186414, 116711,},
00131 { 262144, 167772, 262144, 167772, 167772, 107374, 167772, 107374, 262144, 167772, 262144, 167772, 167772, 107374, 167772, 107374,},
00132 { 233017, 145889, 233017, 145889, 145889, 92564, 145889, 92564, 233017, 145889, 233017, 145889, 145889, 92564, 145889, 92564,},
00133 { 209715, 129056, 209715, 129056, 129056, 83886, 129056, 83886, 209715, 129056, 209715, 129056, 129056, 83886, 129056, 83886,},
00134 { 190650, 119837, 190650, 119837, 119837, 74565, 119837, 74565, 190650, 119837, 190650, 119837, 119837, 74565, 119837, 74565,},
00135 { 161319, 104858, 161319, 104858, 104858, 67109, 104858, 67109, 161319, 104858, 161319, 104858, 104858, 67109, 104858, 67109,},
00136 { 149797, 93207, 149797, 93207, 93207, 58356, 93207, 58356, 149797, 93207, 149797, 93207, 93207, 58356, 93207, 58356,},
00137 { 131072, 83886, 131072, 83886, 83886, 53687, 83886, 53687, 131072, 83886, 131072, 83886, 83886, 53687, 83886, 53687,},
00138 { 116508, 72944, 116508, 72944, 72944, 46282, 72944, 46282, 116508, 72944, 116508, 72944, 72944, 46282, 72944, 46282,},
00139 { 104858, 64528, 104858, 64528, 64528, 41943, 64528, 41943, 104858, 64528, 104858, 64528, 64528, 41943, 64528, 41943,},
00140 { 95325, 59919, 95325, 59919, 59919, 37283, 59919, 37283, 95325, 59919, 95325, 59919, 59919, 37283, 59919, 37283,},
00141 { 80660, 52429, 80660, 52429, 52429, 33554, 52429, 33554, 80660, 52429, 80660, 52429, 52429, 33554, 52429, 33554,},
00142 { 74898, 46603, 74898, 46603, 46603, 29178, 46603, 29178, 74898, 46603, 74898, 46603, 46603, 29178, 46603, 29178,},
00143 { 65536, 41943, 65536, 41943, 41943, 26844, 41943, 26844, 65536, 41943, 65536, 41943, 41943, 26844, 41943, 26844,},
00144 { 58254, 36472, 58254, 36472, 36472, 23141, 36472, 23141, 58254, 36472, 58254, 36472, 36472, 23141, 36472, 23141,},
00145 { 52429, 32264, 52429, 32264, 32264, 20972, 32264, 20972, 52429, 32264, 52429, 32264, 32264, 20972, 32264, 20972,},
00146 { 47663, 29959, 47663, 29959, 29959, 18641, 29959, 18641, 47663, 29959, 47663, 29959, 29959, 18641, 29959, 18641,},
00147 { 40330, 26214, 40330, 26214, 26214, 16777, 26214, 16777, 40330, 26214, 40330, 26214, 26214, 16777, 26214, 16777,},
00148 { 37449, 23302, 37449, 23302, 23302, 14589, 23302, 14589, 37449, 23302, 37449, 23302, 23302, 14589, 23302, 14589,},
00149 { 32768, 20972, 32768, 20972, 20972, 13422, 20972, 13422, 32768, 20972, 32768, 20972, 20972, 13422, 20972, 13422,},
00150 { 29127, 18236, 29127, 18236, 18236, 11570, 18236, 11570, 29127, 18236, 29127, 18236, 18236, 11570, 18236, 11570,},
00151 { 26214, 16132, 26214, 16132, 16132, 10486, 16132, 10486, 26214, 16132, 26214, 16132, 16132, 10486, 16132, 10486,},
00152 { 23831, 14980, 23831, 14980, 14980, 9321, 14980, 9321, 23831, 14980, 23831, 14980, 14980, 9321, 14980, 9321,},
00153 { 20165, 13107, 20165, 13107, 13107, 8389, 13107, 8389, 20165, 13107, 20165, 13107, 13107, 8389, 13107, 8389,},
00154 { 18725, 11651, 18725, 11651, 11651, 7294, 11651, 7294, 18725, 11651, 18725, 11651, 11651, 7294, 11651, 7294,},
00155 { 16384, 10486, 16384, 10486, 10486, 6711, 10486, 6711, 16384, 10486, 16384, 10486, 10486, 6711, 10486, 6711,},
00156 { 14564, 9118, 14564, 9118, 9118, 5785, 9118, 5785, 14564, 9118, 14564, 9118, 9118, 5785, 9118, 5785,},
00157 { 13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243, 13107, 8066, 13107, 8066, 8066, 5243, 8066, 5243,},
00158 { 11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660, 11916, 7490, 11916, 7490, 7490, 4660, 7490, 4660,},
00159 { 10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194, 10082, 6554, 10082, 6554, 6554, 4194, 6554, 4194,},
00160 { 9362, 5825, 9362, 5825, 5825, 3647, 5825, 3647, 9362, 5825, 9362, 5825, 5825, 3647, 5825, 3647,},
00161 { 8192, 5243, 8192, 5243, 5243, 3355, 5243, 3355, 8192, 5243, 8192, 5243, 5243, 3355, 5243, 3355,},
00162 { 7282, 4559, 7282, 4559, 4559, 2893, 4559, 2893, 7282, 4559, 7282, 4559, 4559, 2893, 4559, 2893,},
00163 { 6554, 4033, 6554, 4033, 4033, 2621, 4033, 2621, 6554, 4033, 6554, 4033, 4033, 2621, 4033, 2621,},
00164 { 5958, 3745, 5958, 3745, 3745, 2330, 3745, 2330, 5958, 3745, 5958, 3745, 3745, 2330, 3745, 2330,},
00165 { 5041, 3277, 5041, 3277, 3277, 2097, 3277, 2097, 5041, 3277, 5041, 3277, 3277, 2097, 3277, 2097,},
00166 { 4681, 2913, 4681, 2913, 2913, 1824, 2913, 1824, 4681, 2913, 4681, 2913, 2913, 1824, 2913, 1824,},
00167 { 4096, 2621, 4096, 2621, 2621, 1678, 2621, 1678, 4096, 2621, 4096, 2621, 2621, 1678, 2621, 1678,},
00168 { 3641, 2280, 3641, 2280, 2280, 1446, 2280, 1446, 3641, 2280, 3641, 2280, 2280, 1446, 2280, 1446,},
00169 { 3277, 2016, 3277, 2016, 2016, 1311, 2016, 1311, 3277, 2016, 3277, 2016, 2016, 1311, 2016, 1311,},
00170 { 2979, 1872, 2979, 1872, 1872, 1165, 1872, 1165, 2979, 1872, 2979, 1872, 1872, 1165, 1872, 1165,},
00171 { 2521, 1638, 2521, 1638, 1638, 1049, 1638, 1049, 2521, 1638, 2521, 1638, 1638, 1049, 1638, 1049,},
00172 { 2341, 1456, 2341, 1456, 1456, 912, 1456, 912, 2341, 1456, 2341, 1456, 1456, 912, 1456, 912,},
00173 { 2048, 1311, 2048, 1311, 1311, 839, 1311, 839, 2048, 1311, 2048, 1311, 1311, 839, 1311, 839,},
00174 { 1820, 1140, 1820, 1140, 1140, 723, 1140, 723, 1820, 1140, 1820, 1140, 1140, 723, 1140, 723,},
00175 { 1638, 1008, 1638, 1008, 1008, 655, 1008, 655, 1638, 1008, 1638, 1008, 1008, 655, 1008, 655,},
00176 { 1489, 936, 1489, 936, 936, 583, 936, 583, 1489, 936, 1489, 936, 936, 583, 936, 583,},
00177 { 1260, 819, 1260, 819, 819, 524, 819, 524, 1260, 819, 1260, 819, 819, 524, 819, 524,},
00178 { 1170, 728, 1170, 728, 728, 456, 728, 456, 1170, 728, 1170, 728, 728, 456, 728, 456,},
00179 };
00180
00181
00182
00183 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale,
00184 int intra, int separate_dc)
00185 {
00186 int i;
00187 const int * const quant_3Btable = quant_coeff[qscale];
00188 const int bias = intra ? (1 << QUANT_SHIFT) / 3 : (1 << QUANT_SHIFT) / 6;
00189 const unsigned int threshold1 = (1 << QUANT_SHIFT) - bias - 1;
00190 const unsigned int threshold2 = (threshold1 << 1);
00191 int last_non_zero;
00192
00193 if (separate_dc) {
00194 if (qscale <= 18) {
00195
00196 const int dc_bias = intra ? (1 << (QUANT_SHIFT - 2)) / 3 : (1 << (QUANT_SHIFT - 2)) / 6;
00197 const unsigned int dc_threshold1 = (1 << (QUANT_SHIFT - 2)) - dc_bias - 1;
00198 const unsigned int dc_threshold2 = (dc_threshold1 << 1);
00199
00200 int level = block[0]*quant_coeff[qscale+18][0];
00201 if (((unsigned)(level + dc_threshold1)) > dc_threshold2) {
00202 if (level > 0) {
00203 level = (dc_bias + level) >> (QUANT_SHIFT - 2);
00204 block[0] = level;
00205 } else {
00206 level = (dc_bias - level) >> (QUANT_SHIFT - 2);
00207 block[0] = -level;
00208 }
00209
00210 } else {
00211 block[0] = 0;
00212 }
00213 } else {
00214 const int dc_bias = intra ? (1 << (QUANT_SHIFT + 1)) / 3 : (1 << (QUANT_SHIFT + 1)) / 6;
00215 const unsigned int dc_threshold1 = (1 << (QUANT_SHIFT + 1)) - dc_bias - 1;
00216 const unsigned int dc_threshold2 = (dc_threshold1 << 1);
00217
00218 int level = block[0]*quant_table[0];
00219 if (((unsigned)(level + dc_threshold1)) > dc_threshold2) {
00220 if (level > 0) {
00221 level = (dc_bias + level) >> (QUANT_SHIFT + 1);
00222 block[0] = level;
00223 } else {
00224 level = (dc_bias - level) >> (QUANT_SHIFT + 1);
00225 block[0] = -level;
00226 }
00227
00228 } else {
00229 block[0] = 0;
00230 }
00231 }
00232 last_non_zero = 0;
00233 i = 1;
00234 } else {
00235 last_non_zero = -1;
00236 i = 0;
00237 }
00238
00239 for (; i < 16; i++) {
00240 const int j = scantable[i];
00241 int level = block[j]*quant_table[j];
00242
00243
00244
00245 if (((unsigned)(level + threshold1)) > threshold2) {
00246 if (level > 0) {
00247 level = (bias + level) >> QUANT_SHIFT;
00248 block[j] = level;
00249 } else {
00250 level = (bias - level) >> QUANT_SHIFT;
00251 block[j] = -level;
00252 }
00253 last_non_zero = i;
00254 } else {
00255 block[j] = 0;
00256 }
00257 }
00258
00259 return last_non_zero;
00260 }