00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "MP3InternalsHuffman.hh"
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <stdlib.h>
00025
00026 MP3HuffmanEncodingInfo
00027 ::MP3HuffmanEncodingInfo(Boolean includeDecodedValues) {
00028 if (includeDecodedValues) {
00029 decodedValues = new unsigned[(SBLIMIT*SSLIMIT + 1)*4];
00030 } else {
00031 decodedValues = NULL;
00032 }
00033 }
00034
00035 MP3HuffmanEncodingInfo::~MP3HuffmanEncodingInfo() {
00036 delete[] decodedValues;
00037 }
00038
00039
00040
00041 static unsigned debugCount = 0;
00042
00043 #define TRUNC_FAVORa
00044
00045 void updateSideInfoForHuffman(MP3SideInfo& sideInfo, Boolean isMPEG2,
00046 unsigned char const* mainDataPtr,
00047 unsigned p23L0, unsigned p23L1,
00048 unsigned& part23Length0a,
00049 unsigned& part23Length0aTruncation,
00050 unsigned& part23Length0b,
00051 unsigned& part23Length0bTruncation,
00052 unsigned& part23Length1a,
00053 unsigned& part23Length1aTruncation,
00054 unsigned& part23Length1b,
00055 unsigned& part23Length1bTruncation) {
00056 int i, j;
00057 unsigned sfLength, origTotABsize, adjustment;
00058 MP3SideInfo::gr_info_s_t* gr;
00059
00060
00061
00062
00063 MP3HuffmanEncodingInfo hei;
00064
00065 ++debugCount;
00066 #ifdef DEBUG
00067 fprintf(stderr, "usifh-start: p23L0: %d, p23L1: %d\n", p23L0, p23L1);
00068 #endif
00069
00070
00071 {
00072 gr = &(sideInfo.ch[0].gr[0]);
00073 origTotABsize = gr->part2_3_length;
00074
00075 MP3HuffmanDecode(gr, isMPEG2, mainDataPtr, 0, origTotABsize, sfLength, hei);
00076
00077
00078 #ifdef DEBUG
00079 fprintf(stderr, "usifh-0: %d, %d:%d, %d:%d, %d:%d, %d:%d, %d:%d\n",
00080 hei.numSamples,
00081 sfLength/8, sfLength%8,
00082 hei.reg1Start/8, hei.reg1Start%8,
00083 hei.reg2Start/8, hei.reg2Start%8,
00084 hei.bigvalStart/8, hei.bigvalStart%8,
00085 origTotABsize/8, origTotABsize%8);
00086 #ifdef undef
00087 {
00088 unsigned k;
00089 for (k = 0; k < hei.numSamples; ++k) {
00090 fprintf(stderr, " %d:%d",
00091 hei.allBitOffsets[k]/8, hei.allBitOffsets[k]%8);
00092 }
00093 fprintf(stderr, "\n");
00094 }
00095 #endif
00096 #endif
00097 if (p23L0 < sfLength) {
00098
00099 p23L1 += p23L0;
00100 p23L0 = 0;
00101 }
00102
00103 part23Length0a = hei.bigvalStart;
00104 part23Length0b = origTotABsize - hei.bigvalStart;
00105 part23Length0aTruncation = part23Length0bTruncation = 0;
00106 if (origTotABsize > p23L0) {
00107
00108 unsigned truncation = origTotABsize - p23L0;
00109 #ifdef TRUNC_FAIRLY
00110 part23Length0aTruncation = (truncation*(part23Length0a-sfLength))
00111 /(origTotABsize-sfLength);
00112 part23Length0bTruncation = truncation - part23Length0aTruncation;
00113 #endif
00114 #ifdef TRUNC_FAVORa
00115 part23Length0bTruncation
00116 = (truncation > part23Length0b) ? part23Length0b : truncation;
00117 part23Length0aTruncation = truncation - part23Length0bTruncation;
00118 #endif
00119 #ifdef TRUNC_FAVORb
00120 part23Length0aTruncation = (truncation > part23Length0a-sfLength)
00121 ? (part23Length0a-sfLength) : truncation;
00122 part23Length0bTruncation = truncation - part23Length0aTruncation;
00123 #endif
00124 }
00125
00126 part23Length0a -= part23Length0aTruncation;
00127 part23Length0b -= part23Length0bTruncation;
00128 #ifdef DEBUG
00129 fprintf(stderr, "usifh-0: interim sizes: %d (%d), %d (%d)\n",
00130 part23Length0a, part23Length0aTruncation,
00131 part23Length0b, part23Length0bTruncation);
00132 #endif
00133
00134
00135 for (i = 0; i < (int)hei.numSamples; ++i) {
00136 if (hei.allBitOffsets[i] == part23Length0a) break;
00137 else if (hei.allBitOffsets[i] > part23Length0a) {--i; break;}
00138 }
00139 if (i < 0) {
00140 i = 0; adjustment = 0;
00141 } else {
00142 adjustment = part23Length0a - hei.allBitOffsets[i];
00143 }
00144 #ifdef DEBUG
00145 fprintf(stderr, "%d usifh-0: adjustment 1: %d\n", debugCount, adjustment);
00146 #endif
00147 part23Length0a -= adjustment;
00148 part23Length0aTruncation += adjustment;
00149
00150 if (part23Length0bTruncation < adjustment) {
00151 p23L1 += (adjustment - part23Length0bTruncation);
00152 adjustment = part23Length0bTruncation;
00153 }
00154 part23Length0b += adjustment;
00155 part23Length0bTruncation -= adjustment;
00156 for (j = i; j < (int)hei.numSamples; ++j) {
00157 if (hei.allBitOffsets[j]
00158 == part23Length0a + part23Length0aTruncation + part23Length0b)
00159 break;
00160 else if (hei.allBitOffsets[j]
00161 > part23Length0a + part23Length0aTruncation + part23Length0b)
00162 {--j; break;}
00163 }
00164 if (j < 0) {
00165 j = 0; adjustment = 0;
00166 } else {
00167 adjustment = part23Length0a+part23Length0aTruncation+part23Length0b
00168 - hei.allBitOffsets[j];
00169 }
00170 #ifdef DEBUG
00171 fprintf(stderr, "%d usifh-0: adjustment 2: %d\n", debugCount, adjustment);
00172 #endif
00173 if (adjustment > part23Length0b) adjustment = part23Length0b;
00174 part23Length0b -= adjustment;
00175 part23Length0bTruncation += adjustment;
00176
00177 p23L1 += adjustment;
00178
00179 if (part23Length0aTruncation > 0) {
00180
00181 gr->big_values = i;
00182 }
00183 }
00184
00185
00186
00187 if (isMPEG2) {
00188 part23Length1a = part23Length1b = 0;
00189 part23Length1aTruncation = part23Length1bTruncation = 0;
00190 } else {
00191 unsigned granule1Offset
00192 = origTotABsize + sideInfo.ch[1].gr[0].part2_3_length;
00193
00194 gr = &(sideInfo.ch[0].gr[1]);
00195 origTotABsize = gr->part2_3_length;
00196
00197 MP3HuffmanDecode(gr, isMPEG2, mainDataPtr, granule1Offset,
00198 origTotABsize, sfLength, hei);
00199
00200
00201 #ifdef DEBUG
00202 fprintf(stderr, "usifh-1: %d, %d:%d, %d:%d, %d:%d, %d:%d, %d:%d\n",
00203 hei.numSamples,
00204 sfLength/8, sfLength%8,
00205 hei.reg1Start/8, hei.reg1Start%8,
00206 hei.reg2Start/8, hei.reg2Start%8,
00207 hei.bigvalStart/8, hei.bigvalStart%8,
00208 origTotABsize/8, origTotABsize%8);
00209 #ifdef undef
00210 {
00211 unsigned k;
00212 for (k = 0; k < hei.numSamples; ++k) {
00213 fprintf(stderr, " %d:%d",
00214 hei.allBitOffsets[k]/8, hei.allBitOffsets[k]%8);
00215 }
00216 fprintf(stderr, "\n");
00217 }
00218 #endif
00219 #endif
00220 if (p23L1 < sfLength) {
00221
00222 p23L1 = 0;
00223 }
00224
00225 part23Length1a = hei.bigvalStart;
00226 part23Length1b = origTotABsize - hei.bigvalStart;
00227 part23Length1aTruncation = part23Length1bTruncation = 0;
00228 if (origTotABsize > p23L1) {
00229
00230 unsigned truncation = origTotABsize - p23L1;
00231 #ifdef TRUNC_FAIRLY
00232 part23Length1aTruncation = (truncation*(part23Length1a-sfLength))
00233 /(origTotABsize-sfLength);
00234 part23Length1bTruncation = truncation - part23Length1aTruncation;
00235 #endif
00236 #ifdef TRUNC_FAVORa
00237 part23Length1bTruncation
00238 = (truncation > part23Length1b) ? part23Length1b : truncation;
00239 part23Length1aTruncation = truncation - part23Length1bTruncation;
00240 #endif
00241 #ifdef TRUNC_FAVORb
00242 part23Length1aTruncation = (truncation > part23Length1a-sfLength)
00243 ? (part23Length1a-sfLength) : truncation;
00244 part23Length1bTruncation = truncation - part23Length1aTruncation;
00245 #endif
00246 }
00247
00248 part23Length1a -= part23Length1aTruncation;
00249 part23Length1b -= part23Length1bTruncation;
00250 #ifdef DEBUG
00251 fprintf(stderr, "usifh-1: interim sizes: %d (%d), %d (%d)\n",
00252 part23Length1a, part23Length1aTruncation,
00253 part23Length1b, part23Length1bTruncation);
00254 #endif
00255
00256
00257 for (i = 0; i < (int)hei.numSamples; ++i) {
00258 if (hei.allBitOffsets[i] == part23Length1a) break;
00259 else if (hei.allBitOffsets[i] > part23Length1a) {--i; break;}
00260 }
00261 if (i < 0) {
00262 i = 0; adjustment = 0;
00263 } else {
00264 adjustment = part23Length1a - hei.allBitOffsets[i];
00265 }
00266 #ifdef DEBUG
00267 fprintf(stderr, "%d usifh-1: adjustment 0: %d\n", debugCount, adjustment);
00268 #endif
00269 part23Length1a -= adjustment;
00270 part23Length1aTruncation += adjustment;
00271
00272 if (part23Length1bTruncation < adjustment) {
00273 adjustment = part23Length1bTruncation;
00274 }
00275 part23Length1b += adjustment;
00276 part23Length1bTruncation -= adjustment;
00277 for (j = i; j < (int)hei.numSamples; ++j) {
00278 if (hei.allBitOffsets[j]
00279 == part23Length1a + part23Length1aTruncation + part23Length1b)
00280 break;
00281 else if (hei.allBitOffsets[j]
00282 > part23Length1a + part23Length1aTruncation + part23Length1b)
00283 {--j; break;}
00284 }
00285 if (j < 0) {
00286 j = 0; adjustment = 0;
00287 } else {
00288 adjustment = part23Length1a+part23Length1aTruncation+part23Length1b
00289 - hei.allBitOffsets[j];
00290 }
00291 #ifdef DEBUG
00292 fprintf(stderr, "%d usifh-1: adjustment 1: %d\n", debugCount, adjustment);
00293 #endif
00294 if (adjustment > part23Length1b) adjustment = part23Length1b;
00295 part23Length1b -= adjustment;
00296 part23Length1bTruncation += adjustment;
00297
00298 if (part23Length1aTruncation > 0) {
00299
00300 gr->big_values = i;
00301 }
00302 }
00303 #ifdef DEBUG
00304 fprintf(stderr, "usifh-end, new vals: %d (%d), %d (%d), %d (%d), %d (%d)\n",
00305 part23Length0a, part23Length0aTruncation,
00306 part23Length0b, part23Length0bTruncation,
00307 part23Length1a, part23Length1aTruncation,
00308 part23Length1b, part23Length1bTruncation);
00309 #endif
00310 }
00311
00312 static void rsf_getline(char* line, unsigned max, unsigned char**fi) {
00313 unsigned i;
00314 for (i = 0; i < max; ++i) {
00315 line[i] = *(*fi)++;
00316 if (line[i] == '\n') {
00317 line[i++] = '\0';
00318 return;
00319 }
00320 }
00321 line[i] = '\0';
00322 }
00323
00324 static void rsfscanf(unsigned char **fi, unsigned int* v) {
00325 while (sscanf((char*)*fi, "%x", v) == 0) {
00326
00327 while (*(*fi)++ != '\0') {}
00328 }
00329
00330
00331 while (*(*fi) <= ' ') ++(*fi);
00332
00333
00334 while (*(*fi) > ' ') ++(*fi);
00335 }
00336
00337 #define HUFFBITS unsigned long int
00338 #define SIZEOF_HUFFBITS 4
00339 #define HTN 34
00340 #define MXOFF 250
00341
00342 struct huffcodetab {
00343 char tablename[3];
00344 unsigned int xlen;
00345 unsigned int ylen;
00346 unsigned int linbits;
00347 unsigned int linmax;
00348 int ref;
00349 HUFFBITS *table;
00350 unsigned char *hlen;
00351 unsigned char(*val)[2];
00352 unsigned int treelen;
00353 };
00354
00355 static struct huffcodetab rsf_ht[HTN];
00356
00357
00358
00359
00360 static int read_decoder_table(unsigned char* fi) {
00361 int n,i,nn,t;
00362 unsigned int v0,v1;
00363 char command[100],line[100];
00364 for (n=0;n<HTN;n++) {
00365 rsf_ht[n].table = NULL;
00366 rsf_ht[n].hlen = NULL;
00367
00368
00369 do {
00370 rsf_getline(line,99,&fi);
00371 } while ((line[0] == '#') || (line[0] < ' '));
00372
00373 sscanf(line,"%s %s %u %u %u %u",command,rsf_ht[n].tablename,
00374 &rsf_ht[n].treelen, &rsf_ht[n].xlen, &rsf_ht[n].ylen, &rsf_ht[n].linbits);
00375 if (strcmp(command,".end")==0)
00376 return n;
00377 else if (strcmp(command,".table")!=0) {
00378 #ifdef DEBUG
00379 fprintf(stderr,"huffman table %u data corrupted\n",n);
00380 #endif
00381 return -1;
00382 }
00383 rsf_ht[n].linmax = (1<<rsf_ht[n].linbits)-1;
00384
00385 sscanf(rsf_ht[n].tablename,"%u",&nn);
00386 if (nn != n) {
00387 #ifdef DEBUG
00388 fprintf(stderr,"wrong table number %u\n",n);
00389 #endif
00390 return(-2);
00391 }
00392 do {
00393 rsf_getline(line,99,&fi);
00394 } while ((line[0] == '#') || (line[0] < ' '));
00395
00396 sscanf(line,"%s %u",command,&t);
00397 if (strcmp(command,".reference")==0) {
00398 rsf_ht[n].ref = t;
00399 rsf_ht[n].val = rsf_ht[t].val;
00400 rsf_ht[n].treelen = rsf_ht[t].treelen;
00401 if ( (rsf_ht[n].xlen != rsf_ht[t].xlen) ||
00402 (rsf_ht[n].ylen != rsf_ht[t].ylen) ) {
00403 #ifdef DEBUG
00404 fprintf(stderr,"wrong table %u reference\n",n);
00405 #endif
00406 return (-3);
00407 };
00408 while ((line[0] == '#') || (line[0] < ' ') ) {
00409 rsf_getline(line,99,&fi);
00410 }
00411 }
00412 else if (strcmp(command,".treedata")==0) {
00413 rsf_ht[n].ref = -1;
00414 rsf_ht[n].val = (unsigned char (*)[2])
00415 new unsigned char[2*(rsf_ht[n].treelen)];
00416 if ((rsf_ht[n].val == NULL) && ( rsf_ht[n].treelen != 0 )){
00417 #ifdef DEBUG
00418 fprintf(stderr, "heaperror at table %d\n",n);
00419 #endif
00420 exit (-10);
00421 }
00422 for (i=0;(unsigned)i<rsf_ht[n].treelen; i++) {
00423 rsfscanf(&fi, &v0);
00424 rsfscanf(&fi, &v1);
00425
00426 rsf_ht[n].val[i][0]=(unsigned char)v0;
00427 rsf_ht[n].val[i][1]=(unsigned char)v1;
00428 }
00429 rsf_getline(line,99,&fi);
00430 }
00431 else {
00432 #ifdef DEBUG
00433 fprintf(stderr,"huffman decodertable error at table %d\n",n);
00434 #endif
00435 }
00436 }
00437 return n;
00438 }
00439
00440 static void initialize_huffman() {
00441 static Boolean huffman_initialized = False;
00442
00443 if (huffman_initialized) return;
00444
00445 if (read_decoder_table(huffdec) != HTN) {
00446 #ifdef DEBUG
00447 fprintf(stderr,"decoder table read error\n");
00448 #endif
00449 exit(4);
00450 }
00451 huffman_initialized = True;
00452 }
00453
00454 static unsigned char const slen[2][16] = {
00455 {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
00456 {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
00457 };
00458
00459 static unsigned char const stab[3][6][4] = {
00460 { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} ,
00461 { 7, 7, 7,0 } , { 6, 6, 6,3 } , { 8, 8,5,0} } ,
00462 { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} ,
00463 {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } ,
00464 { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} ,
00465 { 6,15,12,0 } , { 6,12, 9,6 } , { 6,18,9,0} }
00466 };
00467
00468 static unsigned rsf_get_scale_factors_1(MP3SideInfo::gr_info_s_t *gr_info) {
00469 int numbits;
00470 int num0 = slen[0][gr_info->scalefac_compress];
00471 int num1 = slen[1][gr_info->scalefac_compress];
00472
00473 if (gr_info->block_type == 2)
00474 {
00475 numbits = (num0 + num1) * 18;
00476
00477 if (gr_info->mixed_block_flag) {
00478 numbits -= num0;
00479 }
00480 }
00481 else
00482 {
00483 int scfsi = gr_info->scfsi;
00484
00485 if(scfsi < 0) {
00486 numbits = (num0 + num1) * 10 + num0;
00487 }
00488 else {
00489 numbits = 0;
00490 if(!(scfsi & 0x8)) {
00491 numbits += num0 * 6;
00492 }
00493 else {
00494 }
00495
00496 if(!(scfsi & 0x4)) {
00497 numbits += num0 * 5;
00498 }
00499 else {
00500 }
00501
00502 if(!(scfsi & 0x2)) {
00503 numbits += num1 * 5;
00504 }
00505 else {
00506 }
00507
00508 if(!(scfsi & 0x1)) {
00509 numbits += num1 * 5;
00510 }
00511 else {
00512 }
00513 }
00514 }
00515
00516 return numbits;
00517 }
00518
00519 extern unsigned n_slen2[];
00520 extern unsigned i_slen2[];
00521
00522 static unsigned rsf_get_scale_factors_2(MP3SideInfo::gr_info_s_t *gr_info) {
00523 unsigned char const* pnt;
00524 int i;
00525 unsigned int slen;
00526 int n = 0;
00527 int numbits = 0;
00528
00529 #ifdef undef
00530 if(i_stereo)
00531 slen = i_slen2[gr_info->scalefac_compress>>1];
00532 else
00533 #endif
00534 slen = n_slen2[gr_info->scalefac_compress];
00535
00536 gr_info->preflag = (slen>>15) & 0x1;
00537
00538 n = 0;
00539 if( gr_info->block_type == 2 ) {
00540 n++;
00541 if(gr_info->mixed_block_flag)
00542 n++;
00543 }
00544
00545 pnt = stab[n][(slen>>12)&0x7];
00546
00547 for(i=0;i<4;i++) {
00548 int num = slen & 0x7;
00549 slen >>= 3;
00550 numbits += pnt[i] * num;
00551 }
00552
00553 return numbits;
00554 }
00555
00556 static unsigned getScaleFactorsLength(MP3SideInfo::gr_info_s_t* gr,
00557 Boolean isMPEG2) {
00558 return isMPEG2 ? rsf_get_scale_factors_2(gr)
00559 : rsf_get_scale_factors_1(gr);
00560 }
00561
00562 static int rsf_huffman_decoder(BitVector& bv,
00563 struct huffcodetab const* h,
00564 int* x, int* y, int* v, int* w);
00565
00566 void MP3HuffmanDecode(MP3SideInfo::gr_info_s_t* gr, int isMPEG2,
00567 unsigned char const* fromBasePtr,
00568 unsigned fromBitOffset, unsigned fromLength,
00569 unsigned& scaleFactorsLength,
00570 MP3HuffmanEncodingInfo& hei) {
00571 unsigned i;
00572 int x, y, v, w;
00573 struct huffcodetab *h;
00574 BitVector bv((unsigned char*)fromBasePtr, fromBitOffset, fromLength);
00575
00576
00577 scaleFactorsLength = getScaleFactorsLength(gr, isMPEG2);
00578 bv.skipBits(scaleFactorsLength);
00579
00580 initialize_huffman();
00581
00582 hei.reg1Start = hei.reg2Start = hei.numSamples = 0;
00583
00584
00585 if (gr->big_values < gr->region1start + gr->region2start) {
00586 gr->big_values = gr->region1start + gr->region2start;
00587 }
00588 for (i = 0; i < gr->big_values; ++i) {
00589 if (i < gr->region1start) {
00590
00591 h = &rsf_ht[gr->table_select[0]];
00592 } else if (i < gr->region2start) {
00593
00594 h = &rsf_ht[gr->table_select[1]];
00595 if (hei.reg1Start == 0) {
00596 hei.reg1Start = bv.curBitIndex();
00597 }
00598 } else {
00599
00600 h = &rsf_ht[gr->table_select[2]];
00601 if (hei.reg2Start == 0) {
00602 hei.reg2Start = bv.curBitIndex();
00603 }
00604 }
00605
00606 hei.allBitOffsets[i] = bv.curBitIndex();
00607 rsf_huffman_decoder(bv, h, &x, &y, &v, &w);
00608 if (hei.decodedValues != NULL) {
00609
00610 unsigned* ptr = &hei.decodedValues[4*i];
00611 ptr[0] = x; ptr[1] = y; ptr[2] = v; ptr[3] = w;
00612 }
00613 }
00614 hei.bigvalStart = bv.curBitIndex();
00615
00616
00617 h = &rsf_ht[gr->count1table_select+32];
00618 while (bv.curBitIndex() < bv.totNumBits() && i < SSLIMIT*SBLIMIT) {
00619 hei.allBitOffsets[i] = bv.curBitIndex();
00620 rsf_huffman_decoder(bv, h, &x, &y, &v, &w);
00621 if (hei.decodedValues != NULL) {
00622
00623 unsigned* ptr = &hei.decodedValues[4*i];
00624 ptr[0] = x; ptr[1] = y; ptr[2] = v; ptr[3] = w;
00625 }
00626 ++i;
00627 }
00628
00629 hei.allBitOffsets[i] = bv.curBitIndex();
00630 hei.numSamples = i;
00631 }
00632
00633 HUFFBITS dmask = 1 << (SIZEOF_HUFFBITS*8-1);
00634 unsigned int hs = SIZEOF_HUFFBITS*8;
00635
00636
00637 static int rsf_huffman_decoder(BitVector& bv,
00638 struct huffcodetab const* h,
00639 int *x,
00640 int *y,
00641 int* v, int* w) {
00642 HUFFBITS level;
00643 unsigned point = 0;
00644 int error = 1;
00645 level = dmask;
00646 *x = *y = *v = *w = 0;
00647 if (h->val == NULL) return 2;
00648
00649
00650 if (h->treelen == 0) return 0;
00651
00652
00653
00654 do {
00655 if (h->val[point][0]==0) {
00656 *x = h->val[point][1] >> 4;
00657 *y = h->val[point][1] & 0xf;
00658
00659 error = 0;
00660 break;
00661 }
00662 if (bv.get1Bit()) {
00663 while (h->val[point][1] >= MXOFF) point += h->val[point][1];
00664 point += h->val[point][1];
00665 }
00666 else {
00667 while (h->val[point][0] >= MXOFF) point += h->val[point][0];
00668 point += h->val[point][0];
00669 }
00670 level >>= 1;
00671 } while (level || (point < h->treelen) );
00673
00674
00675
00676 if (error) {
00677 printf("Illegal Huffman code in data.\n");
00678 *x = ((h->xlen-1) << 1);
00679 *y = ((h->ylen-1) << 1);
00680 }
00681
00682
00683
00684 if (h->tablename[0] == '3'
00685 && (h->tablename[1] == '2' || h->tablename[1] == '3')) {
00686 *v = (*y>>3) & 1;
00687 *w = (*y>>2) & 1;
00688 *x = (*y>>1) & 1;
00689 *y = *y & 1;
00690
00691 if (*v)
00692 if (bv.get1Bit() == 1) *v = -*v;
00693 if (*w)
00694 if (bv.get1Bit() == 1) *w = -*w;
00695 if (*x)
00696 if (bv.get1Bit() == 1) *x = -*x;
00697 if (*y)
00698 if (bv.get1Bit() == 1) *y = -*y;
00699 }
00700
00701
00702
00703 else {
00704 if (h->linbits)
00705 if ((h->xlen-1) == (unsigned)*x)
00706 *x += bv.getBits(h->linbits);
00707 if (*x)
00708 if (bv.get1Bit() == 1) *x = -*x;
00709 if (h->linbits)
00710 if ((h->ylen-1) == (unsigned)*y)
00711 *y += bv.getBits(h->linbits);
00712 if (*y)
00713 if (bv.get1Bit() == 1) *y = -*y;
00714 }
00715
00716 return error;
00717 }
00718
00719 #ifdef DO_HUFFMAN_ENCODING
00720 inline int getNextSample(unsigned char const*& fromPtr) {
00721 int sample
00722 #ifdef FOUR_BYTE_SAMPLES
00723 = (fromPtr[0]<<24) | (fromPtr[1]<<16) | (fromPtr[2]<<8) | fromPtr[3];
00724 #else
00725 #ifdef TWO_BYTE_SAMPLES
00726 = (fromPtr[0]<<8) | fromPtr[1];
00727 #else
00728
00729 = fromPtr[0];
00730 #endif
00731 #endif
00732 fromPtr += BYTES_PER_SAMPLE_VALUE;
00733 return sample;
00734 }
00735
00736 static void rsf_huffman_encoder(BitVector& bv,
00737 struct huffcodetab* h,
00738 int x, int y, int v, int w);
00739
00740 unsigned MP3HuffmanEncode(MP3SideInfo::gr_info_s_t const* gr,
00741 unsigned char const* fromPtr,
00742 unsigned char* toPtr, unsigned toBitOffset,
00743 unsigned numHuffBits) {
00744 unsigned i;
00745 struct huffcodetab *h;
00746 int x, y, v, w;
00747 BitVector bv(toPtr, toBitOffset, numHuffBits);
00748
00749 initialize_huffman();
00750
00751
00752 unsigned big_values = gr->big_values;
00753 if (big_values < gr->region1start + gr->region2start) {
00754 big_values = gr->region1start + gr->region2start;
00755 }
00756 for (i = 0; i < big_values; ++i) {
00757 if (i < gr->region1start) {
00758
00759 h = &rsf_ht[gr->table_select[0]];
00760 } else if (i < gr->region2start) {
00761
00762 h = &rsf_ht[gr->table_select[1]];
00763 } else {
00764
00765 h = &rsf_ht[gr->table_select[2]];
00766 }
00767
00768 x = getNextSample(fromPtr);
00769 y = getNextSample(fromPtr);
00770 v = getNextSample(fromPtr);
00771 w = getNextSample(fromPtr);
00772 rsf_huffman_encoder(bv, h, x, y, v, w);
00773 }
00774
00775
00776 h = &rsf_ht[gr->count1table_select+32];
00777 while (bv.curBitIndex() < bv.totNumBits() && i < SSLIMIT*SBLIMIT) {
00778 x = getNextSample(fromPtr);
00779 y = getNextSample(fromPtr);
00780 v = getNextSample(fromPtr);
00781 w = getNextSample(fromPtr);
00782 rsf_huffman_encoder(bv, h, x, y, v, w);
00783 ++i;
00784 }
00785
00786 return i;
00787 }
00788
00789 static Boolean lookupHuffmanTableEntry(struct huffcodetab const* h,
00790 HUFFBITS bits, unsigned bitsLength,
00791 unsigned char& xy) {
00792 unsigned point = 0;
00793 unsigned mask = 1;
00794 unsigned numBitsTestedSoFar = 0;
00795 do {
00796 if (h->val[point][0]==0) {
00797 xy = h->val[point][1];
00798 if (h->hlen[xy] == 0) {
00799 h->table[xy] = bits;
00800 h->hlen[xy] = bitsLength;
00801 return True;
00802 } else {
00803 return False;
00804 }
00805 }
00806
00807 if (numBitsTestedSoFar++ == bitsLength) {
00808
00809 return False;
00810 }
00811 if (bits&mask) {
00812 while (h->val[point][1] >= MXOFF) point += h->val[point][1];
00813 point += h->val[point][1];
00814 } else {
00815 while (h->val[point][0] >= MXOFF) point += h->val[point][0];
00816 point += h->val[point][0];
00817 }
00818 mask <<= 1;
00819 } while (mask || (point < h->treelen));
00820
00821 return False;
00822 }
00823
00824 static void buildHuffmanEncodingTable(struct huffcodetab* h) {
00825 h->table = new unsigned long[256];
00826 h->hlen = new unsigned char[256];
00827 if (h->table == NULL || h->hlen == NULL) { h->table = NULL; return; }
00828 for (unsigned i = 0; i < 256; ++i) {
00829 h->table[i] = 0; h->hlen[i] = 0;
00830 }
00831
00832
00833 unsigned maxNumEntries = h->xlen * h->ylen;
00834 unsigned numEntries = 0;
00835 unsigned powerOf2 = 1;
00836 for (unsigned bitsLength = 1;
00837 bitsLength <= 8*SIZEOF_HUFFBITS; ++bitsLength) {
00838 powerOf2 *= 2;
00839 for (HUFFBITS bits = 0; bits < powerOf2; ++bits) {
00840
00841 unsigned char xy;
00842 if (lookupHuffmanTableEntry(h, bits, bitsLength, xy)) {
00843 ++numEntries;
00844 if (numEntries == maxNumEntries) return;
00845 }
00846 }
00847 }
00848 #ifdef DEBUG
00849 fprintf(stderr, "Didn't find enough entries!\n");
00850 #endif
00851 }
00852
00853 static void lookupXYandPutBits(BitVector& bv, struct huffcodetab const* h,
00854 unsigned char xy) {
00855 HUFFBITS bits = h->table[xy];
00856 unsigned bitsLength = h->hlen[xy];
00857
00858
00859 while (bitsLength-- > 0) {
00860 bv.put1Bit(bits&0x00000001);
00861 bits >>= 1;
00862 }
00863 }
00864
00865 static void putLinbits(BitVector& bv, struct huffcodetab const* h,
00866 HUFFBITS bits) {
00867 bv.putBits(bits, h->linbits);
00868 }
00869
00870 static void rsf_huffman_encoder(BitVector& bv,
00871 struct huffcodetab* h,
00872 int x, int y, int v, int w) {
00873 if (h->val == NULL) return;
00874
00875
00876 if (h->treelen == 0) return;
00877
00878 if (h->table == NULL) {
00879
00880 buildHuffmanEncodingTable(h);
00881 if (h->table == NULL) return;
00882 }
00883
00884 Boolean xIsNeg = False, yIsNeg = False, vIsNeg = False, wIsNeg = False;
00885 unsigned char xy;
00886
00887 #ifdef FOUR_BYTE_SAMPLES
00888 #else
00889 #ifdef TWO_BYTE_SAMPLES
00890
00891 if (x&0x8000) x |= 0xFFFF0000;
00892 if (y&0x8000) y |= 0xFFFF0000;
00893 if (v&0x8000) v |= 0xFFFF0000;
00894 if (w&0x8000) w |= 0xFFFF0000;
00895 #else
00896
00897
00898 if (x&0x80) x |= 0xFFFFFF00;
00899 if (y&0x80) y |= 0xFFFFFF00;
00900 if (v&0x80) v |= 0xFFFFFF00;
00901 if (w&0x80) w |= 0xFFFFFF00;
00902 #endif
00903 #endif
00904
00905 if (h->tablename[0] == '3'
00906 && (h->tablename[1] == '2' || h->tablename[1] == '3')) {
00907 if (x < 0) { xIsNeg = True; x = -x; }
00908 if (y < 0) { yIsNeg = True; y = -y; }
00909 if (v < 0) { vIsNeg = True; v = -v; }
00910 if (w < 0) { wIsNeg = True; w = -w; }
00911
00912
00913 if (x>1 || y>1 || v>1 || w>1) {
00914 #ifdef DEBUG
00915 fprintf(stderr, "rsf_huffman_encoder quad sanity check fails: %x,%x,%x,%x\n", x, y, v, w);
00916 #endif
00917 }
00918
00919 xy = (v<<3)|(w<<2)|(x<<1)|y;
00920 lookupXYandPutBits(bv, h, xy);
00921
00922 if (v) bv.put1Bit(vIsNeg);
00923 if (w) bv.put1Bit(wIsNeg);
00924 if (x) bv.put1Bit(xIsNeg);
00925 if (y) bv.put1Bit(yIsNeg);
00926 } else {
00927
00928 if (v != 0 || w != 0) {
00929 #ifdef DEBUG
00930 fprintf(stderr, "rsf_huffman_encoder dual sanity check 1 fails: %x,%x,%x,%x\n", x, y, v, w);
00931 #endif
00932 }
00933
00934 if (x < 0) { xIsNeg = True; x = -x; }
00935 if (y < 0) { yIsNeg = True; y = -y; }
00936
00937
00938 if (x > 255 || y > 255) {
00939 #ifdef DEBUG
00940 fprintf(stderr, "rsf_huffman_encoder dual sanity check 2 fails: %x,%x,%x,%x\n", x, y, v, w);
00941 #endif
00942 }
00943
00944 int xl1 = h->xlen-1;
00945 int yl1 = h->ylen-1;
00946 unsigned linbitsX = 0; unsigned linbitsY = 0;
00947
00948 if (((x < xl1) || (xl1 == 0)) && (y < yl1)) {
00949
00950 xy = (x<<4)|y;
00951 lookupXYandPutBits(bv, h, xy);
00952 if (x) bv.put1Bit(xIsNeg);
00953 if (y) bv.put1Bit(yIsNeg);
00954 } else if (x >= xl1) {
00955 linbitsX = (unsigned)(x - xl1);
00956 if (linbitsX > h->linmax) {
00957 #ifdef DEBUG
00958 fprintf(stderr,"warning: Huffman X table overflow\n");
00959 #endif
00960 linbitsX = h->linmax;
00961 };
00962
00963 if (y >= yl1) {
00964 xy = (xl1<<4)|yl1;
00965 lookupXYandPutBits(bv, h, xy);
00966 linbitsY = (unsigned)(y - yl1);
00967 if (linbitsY > h->linmax) {
00968 #ifdef DEBUG
00969 fprintf(stderr,"warning: Huffman Y table overflow\n");
00970 #endif
00971 linbitsY = h->linmax;
00972 };
00973
00974 if (h->linbits) putLinbits(bv, h, linbitsX);
00975 if (x) bv.put1Bit(xIsNeg);
00976 if (h->linbits) putLinbits(bv, h, linbitsY);
00977 if (y) bv.put1Bit(yIsNeg);
00978 } else {
00979 xy = (xl1<<4)|y;
00980 lookupXYandPutBits(bv, h, xy);
00981 if (h->linbits) putLinbits(bv, h, linbitsX);
00982 if (x) bv.put1Bit(xIsNeg);
00983 if (y) bv.put1Bit(yIsNeg);
00984 }
00985 } else {
00986 xy = (x<<4)|yl1;
00987 lookupXYandPutBits(bv, h, xy);
00988 linbitsY = y-yl1;
00989 if (linbitsY > h->linmax) {
00990 #ifdef DEBUG
00991 fprintf(stderr,"warning: Huffman Y table overflow\n");
00992 #endif
00993 linbitsY = h->linmax;
00994 };
00995 if (x) bv.put1Bit(xIsNeg);
00996 if (h->linbits) putLinbits(bv, h, linbitsY);
00997 if (y) bv.put1Bit(yIsNeg);
00998 }
00999 }
01000 }
01001 #endif
01002
01003 #ifdef undef
01004
01005
01006
01007 FILE *OpenTableFile(name)
01008 char *name;
01009 {
01010 char fulname[80];
01011 FILE *f;
01012
01013 fulname[0] = '\0';
01014
01015 strcat(fulname, name);
01016 if( (f=fopen(fulname,"r"))==NULL ) {
01017 fprintf(stderr,"OpenTable: could not find %s\n", fulname);
01018 }
01019
01020
01021 {
01022 FILE *testfd = fopen("rsf_hufftab.c", "w");
01023 unsigned char buf[100];
01024 unsigned i;
01025 for (i = 0; i < 100; ++i) buf[i] = '\0';
01026 while (fgets(buf, 100, f) != NULL) {
01027 unsigned j;
01028 for (j = 0; buf[j] != '\0'; ++j) {
01029 fprintf(testfd, "0x%02x, ", buf[j]);
01030 }
01031 for (i = 0; i < 100; ++i) buf[i] = '\0';
01032 }
01033 fclose(testfd);
01034 exit(0);
01035 }
01036
01037 return f;
01038 }
01039 #endif