int netmaskFromIP(const struct sockaddr* in) { int mask = 0; if (in->sa_family == AF_INET6) { auto in6 = (struct sockaddr_in6*)in; for (size_t i = 0; i < 16; i++) { mask += addBits(in6->sin6_addr.s6_addr[i]); } } else { auto in4 = (struct sockaddr_in*)in; auto address = reinterpret_cast<char*>(&in4->sin_addr.s_addr); for (size_t i = 0; i < 4; i++) { mask += addBits(address[i]); } } return mask; }
int L3_huffman_coder_count1( BitHolder **pph, struct huffcodetab *h, int v, int w, int x, int y ) { HUFFBITS huffbits; unsigned int signv, signw, signx, signy, p; int len; int totalBits = 0; signv = abs_and_sign( &v ); signw = abs_and_sign( &w ); signx = abs_and_sign( &x ); signy = abs_and_sign( &y ); p = v + (w << 1) + (x << 2) + (y << 3); huffbits = h->table[p]; len = h->hlen[ p ]; addBits( *pph, huffbits, len ); totalBits += len; if ( v ) { addBits( *pph, signv, 1 ); totalBits += 1; } if ( w ) { addBits( *pph, signw, 1 ); totalBits += 1; } if ( x ) { addBits( *pph, signx, 1 ); totalBits += 1; } if ( y ) { addBits( *pph, signy, 1 ); totalBits += 1; } return totalBits; }
static void write_ancillary_data( char *theData, int lengthInBits ) { /* */ int bytesToSend = lengthInBits / 8; int remainingBits = lengthInBits % 8; unsigned wrd; int i; userFrameDataPH->nrEntries = 0; for ( i = 0; i < bytesToSend; i++ ) { wrd = theData[i]; addBits( userFrameDataPH, wrd, 8 ); } if ( remainingBits ) { /* right-justify remaining bits */ wrd = theData[bytesToSend] >> (8 - remainingBits); addBits( userFrameDataPH, wrd, remainingBits ); } }
/* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, as well as the definitions of the side information on pages 26 and 27. */ static void Huffmancodebits( BitHolder **pph, int *ix, gr_info *gi ) { int L3_huffman_coder_count1( BitHolder **pph, struct huffcodetab *h, int v, int w, int x, int y ); int bigv_bitcount( int ix[576], gr_info *cod_info ); int region1Start; int region2Start; int i, bigvalues, count1End; int v, w, x, y, bits, cbits, xbits, stuffingBits; unsigned int code, ext; struct huffcodetab *h; int bvbits, c1bits, tablezeros, r0, r1, r2, rt, *pr; int bitsWritten = 0; tablezeros = 0; r0 = r1 = r2 = 0; /* 1: Write the bigvalues */ bigvalues = gi->big_values * 2; if ( bigvalues ) { if ( !(gi->mixed_block_flag) && gi->window_switching_flag && (gi->block_type == 2) ) { /* Three short blocks */ /* Within each scalefactor band, data is given for successive time windows, beginning with window 0 and ending with window 2. Within each window, the quantized values are then arranged in order of increasing frequency... */ int sfb, window, line, start, end; I192_3 *ix_s; int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency].s[0]; ix_s = (I192_3 *) ix; region1Start = 12; region2Start = 576; for ( sfb = 0; sfb < 13; sfb++ ) { unsigned tableindex = 100; start = scalefac[ sfb ]; end = scalefac[ sfb+1 ]; if ( start < region1Start ) tableindex = gi->table_select[ 0 ]; else tableindex = gi->table_select[ 1 ]; /* assert( tableindex < 32 ); */ for ( window = 0; window < 3; window++ ) for ( line = start; line < end; line += 2 ) { x = (*ix_s)[line][window]; y = (*ix_s)[line + 1][window]; /* assert( idx < 576 ); assert( idx >= 0 ); */ bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits ); addBits( *pph, code, cbits ); addBits( *pph, ext, xbits ); bitsWritten += bits; } } } else if ( gi->mixed_block_flag && gi->block_type == 2 ) { /* Mixed blocks long, short */ int sfb, window, line, start, end; unsigned tableindex; I192_3 *ix_s; int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency].s[0]; ix_s = (I192_3 *) ix; /* Write the long block region */ tableindex = gi->table_select[0]; if ( tableindex ) for ( i = 0; i < 36; i += 2 ) { x = ix[i]; y = ix[i + 1]; bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits ); addBits( *pph, code, cbits ); addBits( *pph, ext, xbits ); bitsWritten += bits; } /* Write the short block region */ tableindex = gi->table_select[ 1 ]; /* assert( tableindex < 32 ); */ for ( sfb = 3; sfb < 13; sfb++ ) { start = scalefac[ sfb ]; end = scalefac[ sfb+1 ]; for ( window = 0; window < 3; window++ ) for ( line = start; line < end; line += 2 ) { x = (*ix_s)[line][window]; y = (*ix_s)[line + 1][window]; bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits ); addBits( *pph, code, cbits ); addBits( *pph, ext, xbits ); bitsWritten += bits; } } } else { /* Long blocks */ int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency].l[0]; unsigned scalefac_index = 100; if ( gi->mixed_block_flag ) { region1Start = 36; region2Start = 576; } else { scalefac_index = gi->region0_count + 1; region1Start = scalefac[ scalefac_index ]; scalefac_index += gi->region1_count + 1; region2Start = scalefac[ scalefac_index ]; } for ( i = 0; i < bigvalues; i += 2 ) { unsigned tableindex = 100; /* get table pointer */ if ( i < region1Start ) { tableindex = gi->table_select[0]; pr = &r0; } else if ( i < region2Start ) { tableindex = gi->table_select[1]; pr = &r1; } else { tableindex = gi->table_select[2]; pr = &r2; } /* assert( tableindex < 32 ); */ h = &ht[ tableindex ]; /* get huffman code */ x = ix[i]; y = ix[i + 1]; if ( tableindex ) { bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits ); addBits( *pph, code, cbits ); addBits( *pph, ext, xbits ); bitsWritten += rt = bits; *pr += rt; } else { tablezeros += 1; *pr = 0; } } } } bvbits = bitsWritten; /* 2: Write count1 area */ h = &ht[gi->count1table_select + 32]; count1End = bigvalues + (gi->count1 * 4); for ( i = bigvalues; i < count1End; i += 4 ) { v = ix[i]; w = ix[i+1]; x = ix[i+2]; y = ix[i+3]; bitsWritten += L3_huffman_coder_count1( pph, h, v, w, x, y ); } c1bits = bitsWritten - bvbits; if ( (stuffingBits = gi->part2_3_length - gi->part2_length - bitsWritten) ) { int stuffingWords = stuffingBits / 32; int remainingBits = stuffingBits % 32; /* assert( stuffingBits > 0 ); */ /* Due to the nature of the Huffman code tables, we will pad with ones */ while ( stuffingWords-- ) addBits( *pph, ~0, 32 ); if ( remainingBits ) addBits( *pph, ~0, remainingBits ); bitsWritten += stuffingBits; } }
static int encodeSideInfo( III_side_info_t *si ) { int gr, ch, scfsi_band, region, window, bits_sent, mode_gr; layer *info = fr_ps->header; mode_gr = 2; headerPH->nrEntries = 0; addBits( headerPH, 0xfff, 12 ); addBits( headerPH, 1, 1 ); addBits( headerPH, 4 - info->lay, 2 ); addBits( headerPH, !info->error_protection, 1 ); addBits( headerPH, info->bitrate_index, 4 ); addBits( headerPH, info->sampling_frequency, 2 ); addBits( headerPH, info->padding, 1 ); addBits( headerPH, info->extension, 1 ); addBits( headerPH, info->mode, 2 ); addBits( headerPH, info->mode_ext, 2 ); addBits( headerPH, info->copyright, 1 ); addBits( headerPH, info->original, 1 ); addBits( headerPH, info->emphasis, 2 ); bits_sent = 32; if ( info->error_protection ) { addBits( headerPH, 0, 16 ); /* Just a dummy add. Real CRC calculated & inserted in writeSideInfo() */ bits_sent += 16; } frameSIPH->nrEntries = 0; for (ch = 0; ch < stereo; ch++ ) channelSIPH[ch]->nrEntries = 0; for ( gr = 0; gr < 2; gr++ ) for ( ch = 0; ch < stereo; ch++ ) spectrumSIPH[gr][ch]->nrEntries = 0; addBits( frameSIPH, si->main_data_begin, 9 ); if ( stereo == 2 ) addBits( frameSIPH, si->private_bits, 3 ); else addBits( frameSIPH, si->private_bits, 5 ); for ( ch = 0; ch < stereo; ch++ ) for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ ) { BitHolder **pph = &channelSIPH[ch]; addBits( *pph, si->scfsi[ch][scfsi_band], 1 ); } for ( gr = 0; gr < 2; gr++ ) for ( ch = 0; ch < stereo; ch++ ) { BitHolder **pph = &spectrumSIPH[gr][ch]; gr_info *gi = &(si->gr[gr].ch[ch].tt); addBits( *pph, gi->part2_3_length, 12 ); addBits( *pph, gi->big_values, 9 ); addBits( *pph, gi->global_gain, 8 ); addBits( *pph, gi->scalefac_compress, 4 ); addBits( *pph, gi->window_switching_flag, 1 ); if ( gi->window_switching_flag ) { addBits( *pph, gi->block_type, 2 ); addBits( *pph, gi->mixed_block_flag, 1 ); for ( region = 0; region < 2; region++ ) addBits( *pph, gi->table_select[region], 5 ); for ( window = 0; window < 3; window++ ) addBits( *pph, gi->subblock_gain[window], 3 ); } else { /* assert( gi->block_type == 0 ); */ for ( region = 0; region < 3; region++ ) addBits( *pph, gi->table_select[region], 5 ); addBits( *pph, gi->region0_count, 4 ); addBits( *pph, gi->region1_count, 3 ); } addBits( *pph, gi->preflag, 1 ); addBits( *pph, gi->scalefac_scale, 1 ); addBits( *pph, gi->count1table_select, 1 ); } if ( stereo == 2 ) bits_sent += 256; else bits_sent += 136; return bits_sent; }
static void encodeMainData( int l3_enc[2][2][576], III_side_info_t *si, III_scalefac_t *scalefac ) { int gr, ch, sfb, window, mode_gr; mode_gr = 2; for ( gr = 0; gr < mode_gr; gr++ ) for ( ch = 0; ch < stereo; ch++ ) scaleFactorsPH[gr][ch]->nrEntries = 0; for ( gr = 0; gr < mode_gr; gr++ ) for ( ch = 0; ch < stereo; ch++ ) codedDataPH[gr][ch]->nrEntries = 0; for ( gr = 0; gr < 2; gr++ ) { for ( ch = 0; ch < stereo; ch++ ) { BitHolder **pph = &scaleFactorsPH[gr][ch]; gr_info *gi = &(si->gr[gr].ch[ch].tt); unsigned slen1 = slen1_tab[ gi->scalefac_compress ]; unsigned slen2 = slen2_tab[ gi->scalefac_compress ]; int *ix = &l3_enc[gr][ch][0]; if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) ) { if ( gi->mixed_block_flag ) { for ( sfb = 0; sfb < 8; sfb++ ) addBits( *pph, scalefac->l[gr][ch][sfb], slen1 ); for ( sfb = 3; sfb < 6; sfb++ ) for ( window = 0; window < 3; window++ ) addBits( *pph, scalefac->s[gr][ch][sfb][window], slen1 ); for ( sfb = 6; sfb < 12; sfb++ ) for ( window = 0; window < 3; window++ ) addBits( *pph, scalefac->s[gr][ch][sfb][window], slen2 ); } else { for ( sfb = 0; sfb < 6; sfb++ ) for ( window = 0; window < 3; window++ ) addBits( *pph, scalefac->s[gr][ch][sfb][window], slen1 ); for ( sfb = 6; sfb < 12; sfb++ ) for ( window = 0; window < 3; window++ ) addBits( *pph, scalefac->s[gr][ch][sfb][window], slen2 ); } } else { if ( (gr == 0) || (si->scfsi[ch][0] == 0) ) for ( sfb = 0; sfb < 6; sfb++ ) addBits( *pph, scalefac->l[gr][ch][sfb], slen1 ); if ( (gr == 0) || (si->scfsi[ch][1] == 0) ) for ( sfb = 6; sfb < 11; sfb++ ) addBits( *pph, scalefac->l[gr][ch][sfb], slen1 ); if ( (gr == 0) || (si->scfsi[ch][2] == 0) ) for ( sfb = 11; sfb < 16; sfb++ ) addBits( *pph, scalefac->l[gr][ch][sfb], slen2 ); if ( (gr == 0) || (si->scfsi[ch][3] == 0) ) for ( sfb = 16; sfb < 21; sfb++ ) addBits( *pph, scalefac->l[gr][ch][sfb], slen2 ); } Huffmancodebits( &codedDataPH[gr][ch], ix, gi ); } /* for ch */ } /* for gr */ } /* main_data */