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