00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <math.h>
00004 #include "common.h"
00005 #include "options.h"
00006 #include "bitstream.h"
00007 #include "availbits.h"
00008 #include "encode_new.h"
00009
00010 #define NUMTABLES 5
00011 int vbrstats_new[15] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
00012
00013
00014
00015
00016 static int step_index[9][16] = {
00017 {0, 1, 3, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17},
00018 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,17},
00019 {0, 1, 2, 3, 4, 5, 6,17, 0, 0, 0, 0, 0, 0, 0, 0},
00020 {0, 1, 2, 17,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
00021 {0, 1, 2, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16},
00022 {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
00023
00024 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15},
00025 {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
00026 {0, 1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
00027 };
00028
00029 static int nbal[9] = {4, 4, 3, 2, 4, 3, 4, 3, 2};
00030
00031
00032
00033
00034 static int steps[18] = {0, 3, 5, 7, 9, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535};
00035
00036 static int steps2n[18]={0, 2, 4, 4, 8, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};
00037
00038 static int bits[18] = {0, 5, 7, 3, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
00039
00040
00041 static int group[18] = {0, 1, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
00042
00043
00044
00045
00046
00047
00048 static int table_sblimit[5] = {27, 30, 8, 12, 30};
00049
00050
00051
00052
00053
00054 static int line[5][SBLIMIT] = {
00055
00056 {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1,-1,-1,-1},
00057 {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,-1,-1},
00058 {4, 4, 5, 5, 5, 5, 5, 5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
00059 {4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
00060
00061 {6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
00062 };
00063
00064
00065 double scalefactor[64] = {
00066 2.00000000000000, 1.58740105196820, 1.25992104989487,
00067 1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,
00068 0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,
00069 0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,
00070 0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,
00071 0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,
00072 0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,
00073 0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,
00074 0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,
00075 0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,
00076 0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,
00077 0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,
00078 0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,
00079 0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,
00080 0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,
00081 0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,
00082 1E-20
00083 };
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 static double SNR[18] = { 0.00, 7.00, 11.00, 16.00, 20.84,
00097 25.28, 31.59, 37.75, 43.84,
00098 49.89, 55.93, 61.96, 67.98, 74.01,
00099 80.03, 86.05, 92.01, 98.01
00100 };
00101
00102 int tablenum=0;
00103
00104 int encode_init(frame_info *frame) {
00105 int ws, bsp, br_per_ch, sfrq;
00106
00107 bsp = frame->header->bitrate_index;
00108 br_per_ch = bitrate[frame->header->version][bsp] / frame->nch;
00109 ws = frame->header->sampling_frequency;
00110 sfrq = s_freq[frame->header->version][ws];
00111
00112 if (frame->header->version == MPEG_AUDIO_ID) {
00113 if ((sfrq == 48 && br_per_ch >= 56)
00114 || (br_per_ch >= 56 && br_per_ch <= 80))
00115 tablenum = 0;
00116 else if (sfrq != 48 && br_per_ch >= 96)
00117 tablenum = 1;
00118 else if (sfrq != 32 && br_per_ch <= 48)
00119 tablenum = 2;
00120 else
00121 tablenum = 3;
00122 } else {
00123 tablenum = 4;
00124 }
00125 fprintf(stdout,"encode_init: using tablenum %i with sblimit %i\n",tablenum, table_sblimit[tablenum]);
00126
00127 #define DUMPTABLESx
00128 #ifdef DUMPTABLES
00129 {
00130 int tablenumber,j,sblimit, sb;
00131 fprintf(stdout,"Tables B.21,b,c,d from ISO11172 and the LSF table from ISO13818\n");
00132 for (tablenumber=0;tablenumber<NUMTABLES;tablenumber++) {
00133
00134 fprintf(stdout,"Tablenum %i\n",tablenumber);
00135 fprintf(stdout,"sb nbal ");
00136 for (j=0;j<16;j++)
00137 fprintf(stdout,"%6i ",j);
00138 fprintf(stdout,"\n");
00139 fprintf(stdout,"-----------------------------------------------------------------------------------------------------------------------\n");
00140
00141 sblimit = table_sblimit[tablenumber];
00142 for (sb=0;sb<SBLIMIT;sb++) {
00143 int thisline = line[tablenumber][sb];
00144 fprintf(stdout,"%2i %4i ",sb,nbal[thisline]);
00145 if (nbal[thisline] != 0)
00146 for (j=0; j<(1<<nbal[thisline]); j++)
00147 fprintf(stdout,"%6i ", steps[ step_index[thisline][j] ]);
00148 fprintf(stdout,"\n");
00149 }
00150 fprintf(stdout,"\n");
00151 }
00152 exit(0);
00153 }
00154 #endif
00155 return (table_sblimit[tablenum]);
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 void scalefactor_calc_new (double sb_sample[][3][SCALE_BLOCK][SBLIMIT],
00180 unsigned int sf_index[][3][SBLIMIT], int nch,
00181 int sblimit)
00182 {
00183
00184
00185
00186
00187
00188
00189 int ch, gr;
00190
00191
00192 for (ch = nch; ch--;)
00193 for (gr = 3; gr--;) {
00194 int sb;
00195 for (sb = sblimit; sb--;) {
00196 int j;
00197 unsigned int l;
00198 register double temp;
00199 unsigned int scale_fac;
00200
00201
00202
00203 register double cur_max = fabs (sb_sample[ch][gr][SCALE_BLOCK - 1][sb]);
00204 for (j = SCALE_BLOCK - 1; j--;) {
00205 if ((temp = fabs (sb_sample[ch][gr][j][sb])) > cur_max)
00206 cur_max = temp;
00207 }
00208
00209
00210 for (l = 16, scale_fac = 32; l; l >>= 1) {
00211 if (cur_max <= scalefactor[scale_fac])
00212 scale_fac += l;
00213 else
00214 scale_fac -= l;
00215 }
00216 if (cur_max > scalefactor[scale_fac])
00217 scale_fac--;
00218 sf_index[ch][gr][sb] = scale_fac;
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 }
00229 }
00230 }
00231 INLINE double mod (double a)
00232 {
00233 return (a > 0) ? a : -a;
00234 }
00235
00236
00237 void combine_LR_new (double sb_sample[2][3][SCALE_BLOCK][SBLIMIT],
00238 double joint_sample[3][SCALE_BLOCK][SBLIMIT], int sblimit) {
00239 int sb, sample, gr;
00240
00241 for (sb = 0; sb < sblimit; ++sb)
00242 for (sample = 0; sample < SCALE_BLOCK; ++sample)
00243 for (gr = 0; gr < 3; ++gr)
00244 joint_sample[gr][sample][sb] =
00245 .5 * (sb_sample[0][gr][sample][sb] + sb_sample[1][gr][sample][sb]);
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 void find_sf_max (unsigned int sf_index[2][3][SBLIMIT], frame_info * frame,
00261 double sf_max[2][SBLIMIT])
00262 {
00263 int sb, gr, ch;
00264 int lowest_sf_index;
00265 int nch = frame->nch;
00266 int sblimit = frame->sblimit;
00267
00268 for (ch = 0; ch < nch; ch++)
00269 for (sb = 0; sb < sblimit; sb++) {
00270 for (gr = 1, lowest_sf_index = sf_index[ch][0][sb]; gr < 3; gr++)
00271 if (lowest_sf_index > sf_index[ch][gr][sb])
00272 lowest_sf_index = sf_index[ch][gr][sb];
00273 sf_max[ch][sb] = multiple[lowest_sf_index];
00274 }
00275 for (sb = sblimit; sb < SBLIMIT; sb++)
00276 sf_max[0][sb] = sf_max[1][sb] = 1E-20;
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 void sf_transmission_pattern (unsigned int sf_index[2][3][SBLIMIT],
00289 unsigned int sf_selectinfo[2][SBLIMIT],
00290 frame_info * frame)
00291 {
00292 int nch = frame->nch;
00293 int sblimit = frame->sblimit;
00294 int dscf[2];
00295 int class[2], i, j, k;
00296 static int pattern[5][5] = { {0x123, 0x122, 0x122, 0x133, 0x123},
00297 {0x113, 0x111, 0x111, 0x444, 0x113},
00298 {0x111, 0x111, 0x111, 0x333, 0x113},
00299 {0x222, 0x222, 0x222, 0x333, 0x123},
00300 {0x123, 0x122, 0x122, 0x133, 0x123}
00301 };
00302
00303 for (k = 0; k < nch; k++)
00304 for (i = 0; i < sblimit; i++) {
00305 dscf[0] = (sf_index[k][0][i] - sf_index[k][1][i]);
00306 dscf[1] = (sf_index[k][1][i] - sf_index[k][2][i]);
00307 for (j = 0; j < 2; j++) {
00308 if (dscf[j] <= -3)
00309 class[j] = 0;
00310 else if (dscf[j] > -3 && dscf[j] < 0)
00311 class[j] = 1;
00312 else if (dscf[j] == 0)
00313 class[j] = 2;
00314 else if (dscf[j] > 0 && dscf[j] < 3)
00315 class[j] = 3;
00316 else
00317 class[j] = 4;
00318 }
00319 switch (pattern[class[0]][class[1]]) {
00320 case 0x123:
00321 sf_selectinfo[k][i] = 0;
00322 break;
00323 case 0x122:
00324 sf_selectinfo[k][i] = 3;
00325 sf_index[k][2][i] = sf_index[k][1][i];
00326 break;
00327 case 0x133:
00328 sf_selectinfo[k][i] = 3;
00329 sf_index[k][1][i] = sf_index[k][2][i];
00330 break;
00331 case 0x113:
00332 sf_selectinfo[k][i] = 1;
00333 sf_index[k][1][i] = sf_index[k][0][i];
00334 break;
00335 case 0x111:
00336 sf_selectinfo[k][i] = 2;
00337 sf_index[k][1][i] = sf_index[k][2][i] = sf_index[k][0][i];
00338 break;
00339 case 0x222:
00340 sf_selectinfo[k][i] = 2;
00341 sf_index[k][0][i] = sf_index[k][2][i] = sf_index[k][1][i];
00342 break;
00343 case 0x333:
00344 sf_selectinfo[k][i] = 2;
00345 sf_index[k][0][i] = sf_index[k][1][i] = sf_index[k][2][i];
00346 break;
00347 case 0x444:
00348 sf_selectinfo[k][i] = 2;
00349 if (sf_index[k][0][i] > sf_index[k][2][i])
00350 sf_index[k][0][i] = sf_index[k][2][i];
00351 sf_index[k][1][i] = sf_index[k][2][i] = sf_index[k][0][i];
00352 }
00353 }
00354 }
00355
00356 void write_header (frame_info * frame, Bit_stream_struc * bs)
00357 {
00358 frame_header *header = frame->header;
00359
00360 putbits (bs, 0xfff, 12);
00361 put1bit (bs, header->version);
00362 putbits (bs, 4 - header->lay, 2);
00363 put1bit (bs, !header->error_protection);
00364 putbits (bs, header->bitrate_index, 4);
00365 putbits (bs, header->sampling_frequency, 2);
00366 put1bit (bs, header->padding);
00367 put1bit (bs, header->extension);
00368 putbits (bs, header->mode, 2);
00369 putbits (bs, header->mode_ext, 2);
00370 put1bit (bs, header->copyright);
00371 put1bit (bs, header->original);
00372 putbits (bs, header->emphasis, 2);
00373 }
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 void write_bit_alloc (unsigned int bit_alloc[2][SBLIMIT],
00384 frame_info * frame, Bit_stream_struc * bs)
00385 {
00386 int sb, ch;
00387 int nch = frame->nch;
00388 int sblimit = frame->sblimit;
00389 int jsbound = frame->jsbound;
00390
00391 for (sb = 0; sb < sblimit; sb++) {
00392 if (sb < jsbound) {
00393 for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ch++)
00394 putbits (bs, bit_alloc[ch][sb], nbal[ line[tablenum][sb] ]);
00395 }
00396 else
00397 putbits (bs, bit_alloc[0][sb], nbal[ line[tablenum][sb] ]);
00398 }
00399 }
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 void write_scalefactors (unsigned int bit_alloc[2][SBLIMIT],
00414 unsigned int sf_selectinfo[2][SBLIMIT],
00415 unsigned int sf_index[2][3][SBLIMIT], frame_info * frame,
00416 Bit_stream_struc * bs)
00417 {
00418 int nch = frame->nch;
00419 int sblimit = frame->sblimit;
00420 int sb, gr, ch;
00421
00422
00423 for (sb = 0; sb < sblimit; sb++)
00424 for (ch = 0; ch < nch; ch++)
00425 if (bit_alloc[ch][sb])
00426 putbits (bs, sf_selectinfo[ch][sb], 2);
00427
00428 for (sb = 0; sb < sblimit; sb++)
00429 for (ch = 0; ch < nch; ch++)
00430 if (bit_alloc[ch][sb])
00431 switch (sf_selectinfo[ch][sb]) {
00432 case 0:
00433 for (gr = 0; gr < 3; gr++)
00434 putbits (bs, sf_index[ch][gr][sb], 6);
00435 break;
00436 case 1:
00437 case 3:
00438 putbits (bs, sf_index[ch][0][sb], 6);
00439 putbits (bs, sf_index[ch][2][sb], 6);
00440 break;
00441 case 2:
00442 putbits (bs, sf_index[ch][0][sb], 6);
00443 }
00444 }
00445
00446
00447
00448 static double a[18] = {
00449 0,
00450 0.750000000, 0.625000000, 0.875000000, 0.562500000, 0.937500000,
00451 0.968750000, 0.984375000, 0.992187500, 0.996093750, 0.998046875,
00452 0.999023438, 0.999511719, 0.999755859, 0.999877930, 0.999938965,
00453 0.999969482, 0.999984741
00454 };
00455
00456 static double b[18] = {
00457 0,
00458 -0.250000000, -0.375000000, -0.125000000, -0.437500000, -0.062500000,
00459 -0.031250000, -0.015625000, -0.007812500, -0.003906250, -0.001953125,
00460 -0.000976563, -0.000488281, -0.000244141, -0.000122070, -0.000061035,
00461 -0.000030518, -0.000015259
00462 };
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479 void
00480 subband_quantization_new (unsigned int sf_index[2][3][SBLIMIT],
00481 double sb_samples[2][3][SCALE_BLOCK][SBLIMIT],
00482 unsigned int j_scale[3][SBLIMIT],
00483 double j_samps[3][SCALE_BLOCK][SBLIMIT],
00484 unsigned int bit_alloc[2][SBLIMIT],
00485 unsigned int sbband[2][3][SCALE_BLOCK][SBLIMIT],
00486 frame_info * frame)
00487 {
00488 int sb, j, ch, gr, qnt_coeff_index, sig;
00489 int nch = frame->nch;
00490 int sblimit = frame->sblimit;
00491 int jsbound = frame->jsbound;
00492 double d;
00493
00494 for (gr = 0; gr < 3; gr++)
00495 for (j = 0; j < SCALE_BLOCK; j++)
00496 for (sb = 0; sb < sblimit; sb++)
00497 for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ch++)
00498
00499 if (bit_alloc[ch][sb]) {
00500
00501 if (nch == 2 && sb >= jsbound)
00502 d = j_samps[gr][j][sb] / scalefactor[j_scale[gr][sb]];
00503 else
00504 d = sb_samples[ch][gr][j][sb] / scalefactor[sf_index[ch][gr][sb]];
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 {
00517
00518 int index = line[tablenum][sb];
00519
00520
00521 qnt_coeff_index = step_index[index][bit_alloc[ch][sb]];
00522 }
00523 d = d * a[qnt_coeff_index] + b[qnt_coeff_index];
00524
00525
00526 if (d >= 0)
00527 sig = 1;
00528 else {
00529 sig = 0;
00530 d += 1.0;
00531 }
00532
00533 sbband[ch][gr][j][sb] = (unsigned int) (d * (double)steps2n[qnt_coeff_index]);
00534
00535
00536
00537 if (sig)
00538 sbband[ch][gr][j][sb] |= steps2n[qnt_coeff_index];
00539 }
00540
00541
00542 for (ch = 0; ch < nch; ch++)
00543 for (gr = 0; gr < 3; gr++)
00544 for (sb = 0; sb < SCALE_BLOCK; sb++)
00545 for (j = sblimit; j < SBLIMIT; j++)
00546 sbband[ch][gr][sb][j] = 0;
00547 }
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560 void write_samples_new (unsigned int sbband[2][3][SCALE_BLOCK][SBLIMIT],
00561 unsigned int bit_alloc[2][SBLIMIT],
00562 frame_info * frame, Bit_stream_struc * bs)
00563 {
00564 unsigned int temp;
00565 unsigned int sb, j, ch, gr, x, y;
00566 int nch = frame->nch;
00567 int sblimit = frame->sblimit;
00568 int jsbound = frame->jsbound;
00569
00570 for (gr = 0; gr < 3; gr++)
00571 for (j = 0; j < SCALE_BLOCK; j += 3)
00572 for (sb = 0; sb < sblimit; sb++)
00573 for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ch++)
00574
00575 if (bit_alloc[ch][sb]) {
00576 int thisline = line[tablenum][sb];
00577 int thisstep_index = step_index[thisline][bit_alloc[ch][sb]];
00578
00579 if (group[thisstep_index] == 3) {
00580
00581 for (x = 0; x < 3; x++) {
00582 putbits (bs, sbband[ch][gr][j + x][sb], bits[thisstep_index]);
00583 }
00584 } else {
00585
00586
00587
00588
00589
00590
00591 y = steps[thisstep_index];
00592 temp =
00593 sbband[ch][gr][j][sb] + sbband[ch][gr][j + 1][sb] * y +
00594 sbband[ch][gr][j + 2][sb] * y * y;
00595 putbits (bs, temp, bits[thisstep_index]);
00596 }
00597 }
00598 }
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634 int bits_for_nonoise_new (double SMR[2][SBLIMIT],
00635 unsigned int scfsi[2][SBLIMIT], frame_info * frame, float min_mnr,
00636 unsigned int bit_alloc[2][SBLIMIT])
00637 {
00638 int sb, ch, ba;
00639 int nch = frame->nch;
00640 int sblimit = frame->sblimit;
00641 int jsbound = frame->jsbound;
00642 int req_bits = 0, bbal = 0, berr = 0, banc = 32;
00643 int maxAlloc, sel_bits, sc_bits, smp_bits;
00644 static int sfsPerScfsi[] = { 3, 2, 1, 2 };
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654 if (frame->header->error_protection)
00655 berr = 16;
00656 else
00657 berr = 0;
00658
00659
00660
00661
00662 for (sb = 0; sb < jsbound; ++sb)
00663 bbal += nch * nbal[ line[tablenum][sb] ];
00664 for (sb = jsbound; sb < sblimit; ++sb)
00665 bbal += nbal[ line[tablenum][sb] ];
00666 req_bits = banc + bbal + berr;
00667
00668 for (sb = 0; sb < sblimit; ++sb)
00669 for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ++ch) {
00670 int thisline = line[tablenum][sb];
00671
00672
00673 maxAlloc = (1 << nbal[ line[tablenum][sb] ]) -1;
00674 sel_bits = sc_bits = smp_bits = 0;
00675
00676
00677 for (ba = 0; ba < maxAlloc - 1; ++ba) {
00678 int thisstep_index = step_index[thisline][ba];
00679 if ((SNR[thisstep_index] - SMR[ch][sb]) >= min_mnr)
00680 break;
00681 }
00682 if (nch == 2 && sb >= jsbound)
00683 for (; ba < maxAlloc - 1; ++ba) {
00684 int thisstep_index = step_index[thisline][ba];
00685 if ((SNR[thisstep_index] - SMR[1-ch][sb]) >= min_mnr)
00686 break;
00687 }
00688 if (ba > 0) {
00689
00690 int thisstep_index = step_index[thisline][ba];
00691 smp_bits = SCALE_BLOCK * group[thisstep_index] * bits[thisstep_index];
00692
00693 sel_bits = 2;
00694 sc_bits = 6 * sfsPerScfsi[scfsi[ch][sb]];
00695 if (nch == 2 && sb >= jsbound) {
00696
00697 sel_bits += 2;
00698 sc_bits += 6 * sfsPerScfsi[scfsi[1 - ch][sb]];
00699 }
00700 req_bits += smp_bits + sel_bits + sc_bits;
00701 }
00702 bit_alloc[ch][sb] = ba;
00703 }
00704 return req_bits;
00705 }
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733 void main_bit_allocation_new (double SMR[2][SBLIMIT],
00734 unsigned int scfsi[2][SBLIMIT],
00735 unsigned int bit_alloc[2][SBLIMIT], int *adb,
00736 frame_info * frame, options * glopts)
00737 {
00738 int noisy_sbs;
00739 int mode, mode_ext, lay;
00740 int rq_db;
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752 int vbrlimits[2][3][2] = {
00753
00754 { {6, 10},
00755 {3, 10},
00756 {6, 10}},
00757
00758 { {10, 14},
00759 {7, 14},
00760 {10, 14}}
00761 };
00762
00763 static int init = 0;
00764 static int lower = 10, upper = 10;
00765 static int bitrateindextobits[15] =
00766 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
00767 int guessindex = 0;
00768
00769 if (init == 0) {
00770 int nch = 2;
00771 int sfreq;
00772 frame_header *header = frame->header;
00773 init++;
00774 if (header->version == 0) {
00775
00776 lower = 1;
00777 upper = 14;
00778 } else {
00779 if (frame->actual_mode == MPG_MD_MONO)
00780 nch = 1;
00781 sfreq = header->sampling_frequency;
00782 lower = vbrlimits[nch-1][sfreq][0];
00783 upper = vbrlimits[nch-1][sfreq][1];
00784 }
00785 if (glopts->verbosity > 2)
00786 fprintf (stdout, "VBR bitrate index limits [%i -> %i]\n", lower, upper);
00787
00788 {
00789
00790
00791
00792 int brindex;
00793 frame_header *header = frame->header;
00794 for (brindex = lower; brindex <= upper; brindex++) {
00795 bitrateindextobits[brindex] =
00796 (int) (1152.0 / s_freq[header->version][header->sampling_frequency]) *
00797 ((double) bitrate[header->version][brindex]);
00798 }
00799 }
00800
00801 }
00802
00803 if ((mode = frame->actual_mode) == MPG_MD_JOINT_STEREO) {
00804 frame->header->mode = MPG_MD_STEREO;
00805 frame->header->mode_ext = 0;
00806 frame->jsbound = frame->sblimit;
00807 if ((rq_db = bits_for_nonoise_new (SMR, scfsi, frame, 0, bit_alloc)) > *adb) {
00808 frame->header->mode = MPG_MD_JOINT_STEREO;
00809 mode_ext = 4;
00810 lay = frame->header->lay;
00811 do {
00812 --mode_ext;
00813 frame->jsbound = js_bound (mode_ext);
00814 rq_db = bits_for_nonoise_new (SMR, scfsi, frame, 0, bit_alloc);
00815 }
00816 while ((rq_db > *adb) && (mode_ext > 0));
00817 frame->header->mode_ext = mode_ext;
00818 }
00819 }
00820
00821
00822 if (glopts->vbr == FALSE) {
00823
00824 noisy_sbs = a_bit_allocation_new (SMR, scfsi, bit_alloc, adb, frame);
00825 } else {
00826
00827 frame->header->bitrate_index = lower;
00828 *adb = available_bits (frame->header, glopts);
00829 {
00830 int brindex;
00831 int found = FALSE;
00832
00833
00834 int req =
00835 bits_for_nonoise_new (SMR, scfsi, frame, glopts->vbrlevel, bit_alloc);
00836
00837
00838
00839 for (brindex = lower; brindex <= upper; brindex++) {
00840 if (bitrateindextobits[brindex] > req) {
00841
00842
00843
00844
00845
00846
00847 guessindex = brindex;
00848 found = TRUE;
00849 break;
00850 }
00851 }
00852
00853 if (found == FALSE)
00854 guessindex = upper;
00855 }
00856
00857 frame->header->bitrate_index = guessindex;
00858 *adb = available_bits (frame->header, glopts);
00859
00860
00861 vbrstats_new[frame->header->bitrate_index]++;
00862
00863 if (glopts->verbosity > 2) {
00864
00865 static int count = 0;
00866 int i;
00867 if ((count++ % 1000) == 0) {
00868 for (i = 1; i < 15; i++)
00869 fprintf (stdout, "%4i ", vbrstats_new[i]);
00870 fprintf (stdout, "\n");
00871 }
00872
00873
00874 if (glopts->verbosity > 5)
00875 fprintf (stdout,
00876 "> bitrate index %2i has %i bits available to encode the %i bits\n",
00877 frame->header->bitrate_index, *adb,
00878 bits_for_nonoise_new (SMR, scfsi, frame,
00879 glopts->vbrlevel, bit_alloc));
00880
00881 }
00882
00883 noisy_sbs =
00884 VBR_bit_allocation_new (SMR, scfsi, bit_alloc, adb, frame, glopts);
00885 }
00886 }
00887
00888 void VBR_maxmnr_new (double mnr[2][SBLIMIT], char used[2][SBLIMIT], int sblimit,
00889 int nch, int *min_sb, int *min_ch, options * glopts)
00890 {
00891 int sb, ch;
00892 double small;
00893
00894 small = 999999.0;
00895 *min_sb = -1;
00896 *min_ch = -1;
00897
00898 #define NEWBITx
00899 #ifdef NEWBIT
00900
00901 for (ch=0;ch<nch;ch++)
00902 for (sb=0;sb<sblimit;sb++)
00903 if (mnr[ch][sb] < glopts->vbrlevel) {
00904 *min_sb = sb;
00905 *min_ch = ch;
00906
00907
00908 return;
00909 }
00910 #endif
00911
00912
00913 for (ch = 0; ch < nch; ++ch)
00914 for (sb = 0; sb < sblimit; sb++)
00915 if (used[ch][sb] != 2 && small > mnr[ch][sb]) {
00916 small = mnr[ch][sb];
00917 *min_sb = sb;
00918 *min_ch = ch;
00919 }
00920
00921 }
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934 int VBR_bit_allocation_new (double SMR[2][SBLIMIT],
00935 unsigned int scfsi[2][SBLIMIT],
00936 unsigned int bit_alloc[2][SBLIMIT], int *adb,
00937 frame_info * frame, options *glopts)
00938 {
00939 int sb, min_ch, min_sb, oth_ch, ch, increment, scale, seli, ba;
00940 int bspl, bscf, bsel, ad, bbal = 0;
00941 double mnr[2][SBLIMIT];
00942 char used[2][SBLIMIT];
00943 int nch = frame->nch;
00944 int sblimit = frame->sblimit;
00945 int jsbound = frame->jsbound;
00946
00947 static char init = 0;
00948 static int banc = 32, berr = 0;
00949 static int sfsPerScfsi[] = { 3, 2, 1, 2 };
00950
00951 int thisstep_index;
00952
00953 if (!init) {
00954 init = 1;
00955 if (frame->header->error_protection)
00956 berr = 16;
00957 }
00958
00959
00960 for (sb = 0; sb < sblimit; sb++)
00961 bbal += nch * nbal[ line[tablenum][sb] ];
00962 *adb -= bbal + berr + banc;
00963 ad = *adb;
00964
00965 for (sb = 0; sb < sblimit; sb++)
00966 for (ch = 0; ch < nch; ch++) {
00967 mnr[ch][sb] = SNR[0] - SMR[ch][sb];
00968 bit_alloc[ch][sb] = 0;
00969 used[ch][sb] = 0;
00970 }
00971 bspl = bscf = bsel = 0;
00972
00973 do {
00974
00975 VBR_maxmnr_new (mnr, used, sblimit, nch, &min_sb, &min_ch, glopts);
00976
00977 if (min_sb > -1) {
00978 int thisline = line[tablenum][min_sb]; {
00979
00980 int nextstep_index = step_index[thisline][bit_alloc[min_ch][min_sb]+1];
00981 increment = SCALE_BLOCK * group[nextstep_index] * bits[nextstep_index];
00982 }
00983 if (used[min_ch][min_sb]) {
00984
00985
00986 thisstep_index = step_index[thisline][bit_alloc[min_ch][min_sb]];
00987 increment -= SCALE_BLOCK * group[thisstep_index] * bits[thisstep_index];
00988 }
00989
00990
00991 oth_ch = 1 - min_ch;
00992 if (used[min_ch][min_sb])
00993 scale = seli = 0;
00994 else {
00995 seli = 2;
00996 scale = 6 * sfsPerScfsi[scfsi[min_ch][min_sb]];
00997 if (nch == 2 && min_sb >= jsbound) {
00998
00999 seli += 2;
01000 scale += 6 * sfsPerScfsi[scfsi[oth_ch][min_sb]];
01001 }
01002 }
01003
01004
01005
01006 if (ad >= bspl + bscf + bsel + seli + scale + increment) {
01007
01008 ba = ++bit_alloc[min_ch][min_sb];
01009 bspl += increment;
01010 bscf += scale;
01011 bsel += seli;
01012 used[min_ch][min_sb] = 1;
01013 thisstep_index = step_index[thisline][ba];
01014 mnr[min_ch][min_sb] = SNR[thisstep_index] - SMR[min_ch][min_sb];
01015
01016 if (ba >= (1 << nbal[ line[tablenum][min_sb] ]) -1 )
01017 used[min_ch][min_sb] = 2;
01018 } else
01019 used[min_ch][min_sb] = 2;
01020 }
01021 }
01022 while (min_sb > -1);
01023
01024
01025 ad -= bspl + bscf + bsel;
01026 *adb = ad;
01027 for (ch = 0; ch < nch; ch++)
01028 for (sb = sblimit; sb < SBLIMIT; sb++)
01029 bit_alloc[ch][sb] = 0;
01030
01031 return 0;
01032 }
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061 void maxmnr_new (double mnr[2][SBLIMIT], char used[2][SBLIMIT], int sblimit,
01062 int nch, int *min_sb, int *min_ch)
01063 {
01064 int sb, ch;
01065 double small;
01066
01067 small = 999999.0;
01068 *min_sb = -1;
01069 *min_ch = -1;
01070 for (ch = 0; ch < nch; ++ch)
01071 for (sb = 0; sb < sblimit; sb++)
01072 if (used[ch][sb] != 2 && small > mnr[ch][sb]) {
01073 small = mnr[ch][sb];
01074 *min_sb = sb;
01075 *min_ch = ch;
01076 }
01077 }
01078 int a_bit_allocation_new (double SMR[2][SBLIMIT],
01079 unsigned int scfsi[2][SBLIMIT],
01080 unsigned int bit_alloc[2][SBLIMIT], int *adb,
01081 frame_info * frame)
01082 {
01083 int sb, min_ch, min_sb, oth_ch, ch, increment, scale, seli, ba;
01084 int bspl, bscf, bsel, ad, bbal = 0;
01085 double mnr[2][SBLIMIT];
01086 char used[2][SBLIMIT];
01087 int nch = frame->nch;
01088 int sblimit = frame->sblimit;
01089 int jsbound = frame->jsbound;
01090
01091 static char init = 0;
01092 static int banc = 32, berr = 0;
01093 static int sfsPerScfsi[] = { 3, 2, 1, 2 };
01094
01095 int thisstep_index;
01096
01097 if (!init) {
01098 init = 1;
01099 if (frame->header->error_protection)
01100 berr = 16;
01101 }
01102
01103 for (sb = 0; sb < jsbound; sb++)
01104 bbal += nch * nbal[ line[tablenum][sb] ];
01105 for (sb = jsbound; sb < sblimit; sb++)
01106 bbal += nbal[ line[tablenum][sb] ];
01107 *adb -= bbal + berr + banc;
01108 ad = *adb;
01109
01110 for (sb = 0; sb < sblimit; sb++)
01111 for (ch = 0; ch < nch; ch++) {
01112 mnr[ch][sb] = SNR[0] - SMR[ch][sb];
01113 bit_alloc[ch][sb] = 0;
01114 used[ch][sb] = 0;
01115 }
01116 bspl = bscf = bsel = 0;
01117
01118 do {
01119
01120 maxmnr_new (mnr, used, sblimit, nch, &min_sb, &min_ch);
01121
01122 if (min_sb > -1) {
01123 int thisline = line[tablenum][min_sb]; {
01124
01125 int nextstep_index = step_index[thisline][bit_alloc[min_ch][min_sb]+1];
01126 increment = SCALE_BLOCK * group[nextstep_index] * bits[nextstep_index];
01127 }
01128 if (used[min_ch][min_sb]) {
01129
01130
01131 thisstep_index = step_index[thisline][bit_alloc[min_ch][min_sb]];
01132 increment -= SCALE_BLOCK * group[thisstep_index] * bits[thisstep_index];
01133 }
01134
01135
01136 oth_ch = 1 - min_ch;
01137 if (used[min_ch][min_sb])
01138 scale = seli = 0;
01139 else {
01140 seli = 2;
01141 scale = 6 * sfsPerScfsi[scfsi[min_ch][min_sb]];
01142 if (nch == 2 && min_sb >= jsbound) {
01143
01144 seli += 2;
01145 scale += 6 * sfsPerScfsi[scfsi[oth_ch][min_sb]];
01146 }
01147 }
01148
01149
01150
01151 if (ad >= bspl + bscf + bsel + seli + scale + increment) {
01152
01153 ba = ++bit_alloc[min_ch][min_sb];
01154 bspl += increment;
01155 bscf += scale;
01156 bsel += seli;
01157 used[min_ch][min_sb] = 1;
01158 thisstep_index = step_index[thisline][ba];
01159 mnr[min_ch][min_sb] = SNR[thisstep_index] - SMR[min_ch][min_sb];
01160
01161 if (ba >= (1 << nbal[ line[tablenum][min_sb] ]) -1 )
01162 used[min_ch][min_sb] = 2;
01163 } else
01164 used[min_ch][min_sb] = 2;
01165
01166 if (min_sb >= jsbound && nch == 2) {
01167
01168 ba = bit_alloc[oth_ch][min_sb] = bit_alloc[min_ch][min_sb];
01169 used[oth_ch][min_sb] = used[min_ch][min_sb];
01170 thisstep_index = step_index[thisline][ba];
01171 mnr[oth_ch][min_sb] = SNR[thisstep_index] - SMR[oth_ch][min_sb];
01172
01173 }
01174
01175 }
01176 }
01177 while (min_sb > -1);
01178
01179
01180 ad -= bspl + bscf + bsel;
01181 *adb = ad;
01182 for (ch = 0; ch < nch; ch++)
01183 for (sb = sblimit; sb < SBLIMIT; sb++)
01184 bit_alloc[ch][sb] = 0;
01185
01186 return 0;
01187 }
01188