audio/mp3: Move t_mpeg1_side_info to Go

This commit is contained in:
Hajime Hoshi 2017-06-17 07:44:12 +09:00
parent d30f025d85
commit a0af1595de
6 changed files with 83 additions and 113 deletions

View File

@ -18,7 +18,6 @@ package mp3
// #include "pdmp3.h"
//
// extern t_mpeg1_side_info g_side_info;
// extern t_mpeg1_header g_frame_header;
import "C"
@ -39,16 +38,16 @@ func init() {
func requantizeProcessLong(gr, ch, is_pos, sfb int) {
sf_mult := 0.5
if C.g_side_info.scalefac_scale[gr][ch] != 0 {
if theMPEG1SideInfo.scalefac_scale[gr][ch] != 0 {
sf_mult = 1.0
}
tmp1 := 1.0
// https://github.com/technosaurus/PDMP3/issues/4
if sfb < 21 {
pf_x_pt := float64(C.g_side_info.preflag[gr][ch]) * pretab[sfb]
pf_x_pt := float64(theMPEG1SideInfo.preflag[gr][ch]) * pretab[sfb]
tmp1 = math.Pow(2.0, -(sf_mult * (float64(theMPEG1MainData.scalefac_l[gr][ch][sfb]) + pf_x_pt)))
}
tmp2 := math.Pow(2.0, 0.25*(float64(C.g_side_info.global_gain[gr][ch])-210))
tmp2 := math.Pow(2.0, 0.25*(float64(theMPEG1SideInfo.global_gain[gr][ch])-210))
tmp3 := 0.0
if theMPEG1MainData.is[gr][ch][is_pos] < 0.0 {
tmp3 = -powtab34[int(-theMPEG1MainData.is[gr][ch][is_pos])]
@ -60,7 +59,7 @@ func requantizeProcessLong(gr, ch, is_pos, sfb int) {
func requantizeProcessShort(gr, ch, is_pos, sfb, win int) {
sf_mult := 0.5
if C.g_side_info.scalefac_scale[gr][ch] != 0 {
if theMPEG1SideInfo.scalefac_scale[gr][ch] != 0 {
sf_mult = 1.0
}
tmp1 := 1.0
@ -68,8 +67,8 @@ func requantizeProcessShort(gr, ch, is_pos, sfb, win int) {
if sfb < 12 {
tmp1 = math.Pow(2.0, -(sf_mult * float64(theMPEG1MainData.scalefac_s[gr][ch][sfb][win])))
}
tmp2 := math.Pow(2.0, 0.25*(float64(C.g_side_info.global_gain[gr][ch])-210.0-
8.0*float64(C.g_side_info.subblock_gain[gr][ch][win])))
tmp2 := math.Pow(2.0, 0.25*(float64(theMPEG1SideInfo.global_gain[gr][ch])-210.0-
8.0*float64(theMPEG1SideInfo.subblock_gain[gr][ch][win])))
tmp3 := 0.0
if theMPEG1MainData.is[gr][ch][is_pos] < 0 {
tmp3 = -powtab34[int(-theMPEG1MainData.is[gr][ch][is_pos])]
@ -105,10 +104,10 @@ func l3Requantize(gr int, ch int) {
/* Setup sampling frequency index */
sfreq := C.g_frame_header.sampling_frequency
/* Determine type of block to process */
if (C.g_side_info.win_switch_flag[gr][ch] == 1) && (C.g_side_info.block_type[gr][ch] == 2) { /* Short blocks */
if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) && (theMPEG1SideInfo.block_type[gr][ch] == 2) { /* Short blocks */
/* Check if the first two subbands
*(=2*18 samples = 8 long or 3 short sfb's) uses long blocks */
if C.g_side_info.mixed_block_flag[gr][ch] != 0 { /* 2 longbl. sb first */
if theMPEG1SideInfo.mixed_block_flag[gr][ch] != 0 { /* 2 longbl. sb first */
/* First process the 2 long block subbands at the start */
sfb := 0
next_sfb := sfBandIndicesSet[sfreq].l[sfb+1]
@ -125,7 +124,7 @@ func l3Requantize(gr int, ch int) {
win_len := sfBandIndicesSet[sfreq].s[sfb+1] -
sfBandIndicesSet[sfreq].s[sfb]
for i := 36; i < int(C.g_side_info.count1[gr][ch]); /* i++ done below! */ {
for i := 36; i < int(theMPEG1SideInfo.count1[gr][ch]); /* i++ done below! */ {
/* Check if we're into the next scalefac band */
if i == next_sfb { /* Yes */
sfb++
@ -146,7 +145,7 @@ func l3Requantize(gr int, ch int) {
next_sfb := sfBandIndicesSet[sfreq].s[sfb+1] * 3
win_len := sfBandIndicesSet[sfreq].s[sfb+1] -
sfBandIndicesSet[sfreq].s[sfb]
for i := 0; i < int(C.g_side_info.count1[gr][ch]); /* i++ done below! */ {
for i := 0; i < int(theMPEG1SideInfo.count1[gr][ch]); /* i++ done below! */ {
/* Check if we're into the next scalefac band */
if i == next_sfb {
sfb++
@ -165,7 +164,7 @@ func l3Requantize(gr int, ch int) {
} else { /* Only long blocks */
sfb := 0
next_sfb := sfBandIndicesSet[sfreq].l[sfb+1]
for i := 0; i < int(C.g_side_info.count1[gr][ch]); i++ {
for i := 0; i < int(theMPEG1SideInfo.count1[gr][ch]); i++ {
if i == next_sfb {
sfb++
next_sfb = sfBandIndicesSet[sfreq].l[sfb+1]
@ -180,12 +179,12 @@ func l3Reorder(gr int, ch int) {
sfreq := C.g_frame_header.sampling_frequency /* Setup sampling freq index */
/* Only reorder short blocks */
if (C.g_side_info.win_switch_flag[gr][ch] == 1) && (C.g_side_info.block_type[gr][ch] == 2) { /* Short blocks */
if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) && (theMPEG1SideInfo.block_type[gr][ch] == 2) { /* Short blocks */
/* Check if the first two subbands
*(=2*18 samples = 8 long or 3 short sfb's) uses long blocks */
sfb := 0
/* 2 longbl. sb first */
if C.g_side_info.mixed_block_flag[gr][ch] != 0 {
if theMPEG1SideInfo.mixed_block_flag[gr][ch] != 0 {
sfb = 3
}
next_sfb := sfBandIndicesSet[sfreq].s[sfb+1] * 3
@ -202,7 +201,7 @@ func l3Reorder(gr int, ch int) {
theMPEG1MainData.is[gr][ch][3*sfBandIndicesSet[sfreq].s[sfb]+j] = re[j]
}
/* Check if this band is above the rzero region,if so we're done */
if C.uint(i) >= C.g_side_info.count1[gr][ch] {
if i >= theMPEG1SideInfo.count1[gr][ch] {
return
}
sfb++
@ -290,10 +289,10 @@ func l3Stereo(gr int) {
if (C.g_frame_header.mode_extension & 0x2) != 0 {
/* Determine how many frequency lines to transform */
i := 0
if C.g_side_info.count1[gr][0] > C.g_side_info.count1[gr][1] {
if theMPEG1SideInfo.count1[gr][0] > theMPEG1SideInfo.count1[gr][1] {
i = 1
}
max_pos := int(C.g_side_info.count1[gr][i])
max_pos := int(theMPEG1SideInfo.count1[gr][i])
/* Do the actual processing */
const invSqrt2 = math.Sqrt2 / 2
for i := 0; i < max_pos; i++ {
@ -311,28 +310,28 @@ func l3Stereo(gr int) {
* band on or above count1 frequency line. N.B.: Intensity stereo coding is
* only done for higher subbands, but logic is here for lower subbands. */
/* Determine type of block to process */
if (C.g_side_info.win_switch_flag[gr][0] == 1) &&
(C.g_side_info.block_type[gr][0] == 2) { /* Short blocks */
if (theMPEG1SideInfo.win_switch_flag[gr][0] == 1) &&
(theMPEG1SideInfo.block_type[gr][0] == 2) { /* Short blocks */
/* Check if the first two subbands
*(=2*18 samples = 8 long or 3 short sfb's) uses long blocks */
if C.g_side_info.mixed_block_flag[gr][0] != 0 { /* 2 longbl. sb first */
if theMPEG1SideInfo.mixed_block_flag[gr][0] != 0 { /* 2 longbl. sb first */
for sfb := 0; sfb < 8; sfb++ { /* First process 8 sfb's at start */
/* Is this scale factor band above count1 for the right channel? */
if C.unsigned(sfBandIndicesSet[sfreq].l[sfb]) >= C.g_side_info.count1[gr][1] {
if sfBandIndicesSet[sfreq].l[sfb] >= theMPEG1SideInfo.count1[gr][1] {
stereoProcessIntensityLong(int(gr), int(sfb))
}
}
/* And next the remaining bands which uses short blocks */
for sfb := 3; sfb < 12; sfb++ {
/* Is this scale factor band above count1 for the right channel? */
if C.unsigned(sfBandIndicesSet[sfreq].s[sfb])*3 >= C.g_side_info.count1[gr][1] {
if sfBandIndicesSet[sfreq].s[sfb]*3 >= theMPEG1SideInfo.count1[gr][1] {
stereoProcessIntensityShort(int(gr), int(sfb)) /* intensity stereo processing */
}
}
} else { /* Only short blocks */
for sfb := 0; sfb < 12; sfb++ {
/* Is this scale factor band above count1 for the right channel? */
if C.unsigned(sfBandIndicesSet[sfreq].s[sfb])*3 >= C.g_side_info.count1[gr][1] {
if sfBandIndicesSet[sfreq].s[sfb]*3 >= theMPEG1SideInfo.count1[gr][1] {
stereoProcessIntensityShort(int(gr), int(sfb)) /* intensity stereo processing */
}
}
@ -340,7 +339,7 @@ func l3Stereo(gr int) {
} else { /* Only long blocks */
for sfb := 0; sfb < 21; sfb++ {
/* Is this scale factor band above count1 for the right channel? */
if C.unsigned(sfBandIndicesSet[sfreq].l[sfb]) >= C.g_side_info.count1[gr][1] {
if sfBandIndicesSet[sfreq].l[sfb] >= theMPEG1SideInfo.count1[gr][1] {
/* Perform the intensity stereo processing */
stereoProcessIntensityLong(int(gr), int(sfb))
}
@ -356,16 +355,16 @@ var (
func l3Antialias(gr int, ch int) {
/* No antialiasing is done for short blocks */
if (C.g_side_info.win_switch_flag[gr][ch] == 1) &&
(C.g_side_info.block_type[gr][ch] == 2) &&
(C.g_side_info.mixed_block_flag[gr][ch]) == 0 {
if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) &&
(theMPEG1SideInfo.block_type[gr][ch] == 2) &&
(theMPEG1SideInfo.mixed_block_flag[gr][ch]) == 0 {
return
}
/* Setup the limit for how many subbands to transform */
sblim := 32
if (C.g_side_info.win_switch_flag[gr][ch] == 1) &&
(C.g_side_info.block_type[gr][ch] == 2) &&
(C.g_side_info.mixed_block_flag[gr][ch] == 1) {
if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) &&
(theMPEG1SideInfo.block_type[gr][ch] == 2) &&
(theMPEG1SideInfo.mixed_block_flag[gr][ch] == 1) {
sblim = 2
}
/* Do the actual antialiasing */
@ -386,9 +385,9 @@ var store = [2][32][18]float32{}
func l3HybridSynthesis(gr int, ch int) {
for sb := 0; sb < 32; sb++ { /* Loop through all 32 subbands */
/* Determine blocktype for this subband */
bt := int(C.g_side_info.block_type[gr][ch])
if (C.g_side_info.win_switch_flag[gr][ch] == 1) &&
(C.g_side_info.mixed_block_flag[gr][ch] == 1) && (sb < 2) {
bt := int(theMPEG1SideInfo.block_type[gr][ch])
if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) &&
(theMPEG1SideInfo.mixed_block_flag[gr][ch] == 1) && (sb < 2) {
bt = 0
}
/* Do the inverse modified DCT and windowing */

View File

@ -19,7 +19,6 @@ package mp3
// #include "pdmp3.h"
//
// extern t_mpeg1_header g_frame_header;
// extern t_mpeg1_side_info g_side_info;
import "C"
import (
@ -64,7 +63,7 @@ func readMainL3() error {
* frames that should be used. This buffer is later accessed by the
* getMainBits function in the same way as the side info is.
*/
if err := getMainData(main_data_size, int(C.g_side_info.main_data_begin)); err != nil {
if err := getMainData(main_data_size, int(theMPEG1SideInfo.main_data_begin)); err != nil {
/* This could be due to not enough data in reservoir */
return err
}
@ -72,10 +71,10 @@ func readMainL3() error {
for ch := 0; ch < nch; ch++ {
part_2_start := getMainPos()
/* Number of bits in the bitstream for the bands */
slen1 := mpeg1_scalefac_sizes[C.g_side_info.scalefac_compress[gr][ch]][0]
slen2 := mpeg1_scalefac_sizes[C.g_side_info.scalefac_compress[gr][ch]][1]
if (C.g_side_info.win_switch_flag[gr][ch] != 0) && (C.g_side_info.block_type[gr][ch] == 2) {
if C.g_side_info.mixed_block_flag[gr][ch] != 0 {
slen1 := mpeg1_scalefac_sizes[theMPEG1SideInfo.scalefac_compress[gr][ch]][0]
slen2 := mpeg1_scalefac_sizes[theMPEG1SideInfo.scalefac_compress[gr][ch]][1]
if (theMPEG1SideInfo.win_switch_flag[gr][ch] != 0) && (theMPEG1SideInfo.block_type[gr][ch] == 2) {
if theMPEG1SideInfo.mixed_block_flag[gr][ch] != 0 {
for sfb := 0; sfb < 8; sfb++ {
theMPEG1MainData.scalefac_l[gr][ch][sfb] = getMainBits(slen1)
}
@ -103,44 +102,44 @@ func readMainL3() error {
}
} else { /* block_type == 0 if winswitch == 0 */
/* Scale factor bands 0-5 */
if (C.g_side_info.scfsi[ch][0] == 0) || (gr == 0) {
if (theMPEG1SideInfo.scfsi[ch][0] == 0) || (gr == 0) {
for sfb := 0; sfb < 6; sfb++ {
theMPEG1MainData.scalefac_l[gr][ch][sfb] = getMainBits(slen1)
}
} else if (C.g_side_info.scfsi[ch][0] == 1) && (gr == 1) {
} else if (theMPEG1SideInfo.scfsi[ch][0] == 1) && (gr == 1) {
/* Copy scalefactors from granule 0 to granule 1 */
for sfb := 0; sfb < 6; sfb++ {
theMPEG1MainData.scalefac_l[1][ch][sfb] = theMPEG1MainData.scalefac_l[0][ch][sfb]
}
}
/* Scale factor bands 6-10 */
if (C.g_side_info.scfsi[ch][1] == 0) || (gr == 0) {
if (theMPEG1SideInfo.scfsi[ch][1] == 0) || (gr == 0) {
for sfb := 6; sfb < 11; sfb++ {
theMPEG1MainData.scalefac_l[gr][ch][sfb] = getMainBits(slen1)
}
} else if (C.g_side_info.scfsi[ch][1] == 1) && (gr == 1) {
} else if (theMPEG1SideInfo.scfsi[ch][1] == 1) && (gr == 1) {
/* Copy scalefactors from granule 0 to granule 1 */
for sfb := 6; sfb < 11; sfb++ {
theMPEG1MainData.scalefac_l[1][ch][sfb] = theMPEG1MainData.scalefac_l[0][ch][sfb]
}
}
/* Scale factor bands 11-15 */
if (C.g_side_info.scfsi[ch][2] == 0) || (gr == 0) {
if (theMPEG1SideInfo.scfsi[ch][2] == 0) || (gr == 0) {
for sfb := 11; sfb < 16; sfb++ {
theMPEG1MainData.scalefac_l[gr][ch][sfb] = getMainBits(slen2)
}
} else if (C.g_side_info.scfsi[ch][2] == 1) && (gr == 1) {
} else if (theMPEG1SideInfo.scfsi[ch][2] == 1) && (gr == 1) {
/* Copy scalefactors from granule 0 to granule 1 */
for sfb := 11; sfb < 16; sfb++ {
theMPEG1MainData.scalefac_l[1][ch][sfb] = theMPEG1MainData.scalefac_l[0][ch][sfb]
}
}
/* Scale factor bands 16-20 */
if (C.g_side_info.scfsi[ch][3] == 0) || (gr == 0) {
if (theMPEG1SideInfo.scfsi[ch][3] == 0) || (gr == 0) {
for sfb := 16; sfb < 21; sfb++ {
theMPEG1MainData.scalefac_l[gr][ch][sfb] = getMainBits(slen2)
}
} else if (C.g_side_info.scfsi[ch][3] == 1) && (gr == 1) {
} else if (theMPEG1SideInfo.scfsi[ch][3] == 1) && (gr == 1) {
/* Copy scalefactors from granule 0 to granule 1 */
for sfb := 16; sfb < 21; sfb++ {
theMPEG1MainData.scalefac_l[1][ch][sfb] = theMPEG1MainData.scalefac_l[0][ch][sfb]

View File

@ -60,7 +60,6 @@ g_sampling_frequency[3] = { 44100 * Hz,48000 * Hz,32000 * Hz };
unsigned synth_init = 1;
t_mpeg1_header g_frame_header;
t_mpeg1_side_info g_side_info; /* < 100 words */
#ifdef DEBUG
static void dmp_fr(t_mpeg1_header *hdr){

View File

@ -47,30 +47,5 @@ typedef struct { /* MPEG1 Layer 1-3 frame header */
unsigned emphasis; /* 2 bits */
}
t_mpeg1_header;
typedef struct { /* MPEG1 Layer 3 Side Information : [2][2] means [gr][ch] */
unsigned main_data_begin; /* 9 bits */
unsigned private_bits; /* 3 bits in mono,5 in stereo */
unsigned scfsi[2][4]; /* 1 bit */
unsigned part2_3_length[2][2]; /* 12 bits */
unsigned big_values[2][2]; /* 9 bits */
unsigned global_gain[2][2]; /* 8 bits */
unsigned scalefac_compress[2][2]; /* 4 bits */
unsigned win_switch_flag[2][2]; /* 1 bit */
/* if(win_switch_flag[][]) */ //use a union dammit
unsigned block_type[2][2]; /* 2 bits */
unsigned mixed_block_flag[2][2]; /* 1 bit */
unsigned table_select[2][2][3]; /* 5 bits */
unsigned subblock_gain[2][2][3]; /* 3 bits */
/* else */
/* table_select[][][] */
unsigned region0_count[2][2]; /* 4 bits */
unsigned region1_count[2][2]; /* 3 bits */
/* end */
unsigned preflag[2][2]; /* 1 bit */
unsigned scalefac_scale[2][2]; /* 1 bit */
unsigned count1table_select[2][2];/* 1 bit */
unsigned count1[2][2]; /* Not in file,calc. by huff.dec.! */
}
t_mpeg1_side_info;
#endif

View File

@ -18,7 +18,6 @@ package mp3
// #include "pdmp3.h"
//
// extern t_mpeg1_side_info g_side_info;
// extern t_mpeg1_header g_frame_header;
import "C"
@ -171,37 +170,37 @@ func readHeader() error {
func readHuffman(part_2_start, gr, ch int) error {
/* Check that there is any data to decode. If not,zero the array. */
if C.g_side_info.part2_3_length[gr][ch] == 0 {
if theMPEG1SideInfo.part2_3_length[gr][ch] == 0 {
for is_pos := 0; is_pos < 576; is_pos++ {
theMPEG1MainData.is[gr][ch][is_pos] = 0.0
}
return nil
}
/* Calculate bit_pos_end which is the index of the last bit for this part. */
bit_pos_end := part_2_start + int(C.g_side_info.part2_3_length[gr][ch]) - 1
bit_pos_end := part_2_start + int(theMPEG1SideInfo.part2_3_length[gr][ch]) - 1
/* Determine region boundaries */
region_1_start := 0
region_2_start := 0
if (C.g_side_info.win_switch_flag[gr][ch] == 1) && (C.g_side_info.block_type[gr][ch] == 2) {
if (theMPEG1SideInfo.win_switch_flag[gr][ch] == 1) && (theMPEG1SideInfo.block_type[gr][ch] == 2) {
region_1_start = 36 /* sfb[9/3]*3=36 */
region_2_start = 576 /* No Region2 for short block case. */
} else {
sfreq := C.g_frame_header.sampling_frequency
region_1_start =
sfBandIndicesSet[sfreq].l[C.g_side_info.region0_count[gr][ch]+1]
sfBandIndicesSet[sfreq].l[theMPEG1SideInfo.region0_count[gr][ch]+1]
region_2_start =
sfBandIndicesSet[sfreq].l[C.g_side_info.region0_count[gr][ch]+
C.g_side_info.region1_count[gr][ch]+2]
sfBandIndicesSet[sfreq].l[theMPEG1SideInfo.region0_count[gr][ch]+
theMPEG1SideInfo.region1_count[gr][ch]+2]
}
/* Read big_values using tables according to region_x_start */
for is_pos := 0; is_pos < int(C.g_side_info.big_values[gr][ch])*2; is_pos++ {
for is_pos := 0; is_pos < int(theMPEG1SideInfo.big_values[gr][ch])*2; is_pos++ {
table_num := 0
if is_pos < region_1_start {
table_num = int(C.g_side_info.table_select[gr][ch][0])
table_num = int(theMPEG1SideInfo.table_select[gr][ch][0])
} else if is_pos < region_2_start {
table_num = int(C.g_side_info.table_select[gr][ch][1])
table_num = int(theMPEG1SideInfo.table_select[gr][ch][1])
} else {
table_num = int(C.g_side_info.table_select[gr][ch][2])
table_num = int(theMPEG1SideInfo.table_select[gr][ch][2])
}
/* Get next Huffman coded words */
x, y, _, _, err := huffmanDecode(table_num)
@ -214,8 +213,8 @@ func readHuffman(part_2_start, gr, ch int) error {
theMPEG1MainData.is[gr][ch][is_pos] = float32(y)
}
/* Read small values until is_pos = 576 or we run out of huffman data */
table_num := int(C.g_side_info.count1table_select[gr][ch]) + 32
is_pos := int(C.g_side_info.big_values[gr][ch]) * 2
table_num := int(theMPEG1SideInfo.count1table_select[gr][ch]) + 32
is_pos := int(theMPEG1SideInfo.big_values[gr][ch]) * 2
for ; (is_pos <= 572) && (getMainPos() <= bit_pos_end); is_pos++ {
/* Get next Huffman coded words */
x, y, v, w, err := huffmanDecode(table_num)
@ -245,7 +244,7 @@ func readHuffman(part_2_start, gr, ch int) error {
is_pos -= 4
}
/* Setup count1 which is the index of the first sample in the rzero reg. */
C.g_side_info.count1[gr][ch] = C.unsigned(is_pos)
theMPEG1SideInfo.count1[gr][ch] = is_pos
/* Zero out the last part if necessary */
for ; /* is_pos comes from last for-loop */ is_pos < 576; is_pos++ {
theMPEG1MainData.is[gr][ch][is_pos] = 0.0

View File

@ -19,7 +19,6 @@ package mp3
// #include "pdmp3.h"
//
// extern t_mpeg1_header g_frame_header;
// extern t_mpeg1_side_info g_side_info;
import "C"
import (
@ -74,54 +73,54 @@ func readAudioL3() error {
}
/* Parse audio data */
/* Pointer to where we should start reading main data */
C.g_side_info.main_data_begin = C.uint(getSideBits(9))
theMPEG1SideInfo.main_data_begin = getSideBits(9)
/* Get private bits. Not used for anything. */
if C.g_frame_header.mode == C.mpeg1_mode_single_channel {
C.g_side_info.private_bits = C.uint(getSideBits(5))
theMPEG1SideInfo.private_bits = getSideBits(5)
} else {
C.g_side_info.private_bits = C.uint(getSideBits(3))
theMPEG1SideInfo.private_bits = getSideBits(3)
}
/* Get scale factor selection information */
for ch := 0; ch < nch; ch++ {
for scfsi_band := 0; scfsi_band < 4; scfsi_band++ {
C.g_side_info.scfsi[ch][scfsi_band] = C.uint(getSideBits(1))
theMPEG1SideInfo.scfsi[ch][scfsi_band] = getSideBits(1)
}
}
/* Get the rest of the side information */
for gr := 0; gr < 2; gr++ {
for ch := 0; ch < nch; ch++ {
C.g_side_info.part2_3_length[gr][ch] = C.uint(getSideBits(12))
C.g_side_info.big_values[gr][ch] = C.uint(getSideBits(9))
C.g_side_info.global_gain[gr][ch] = C.uint(getSideBits(8))
C.g_side_info.scalefac_compress[gr][ch] = C.uint(getSideBits(4))
C.g_side_info.win_switch_flag[gr][ch] = C.uint(getSideBits(1))
if C.g_side_info.win_switch_flag[gr][ch] == 1 {
C.g_side_info.block_type[gr][ch] = C.uint(getSideBits(2))
C.g_side_info.mixed_block_flag[gr][ch] = C.uint(getSideBits(1))
theMPEG1SideInfo.part2_3_length[gr][ch] = getSideBits(12)
theMPEG1SideInfo.big_values[gr][ch] = getSideBits(9)
theMPEG1SideInfo.global_gain[gr][ch] = getSideBits(8)
theMPEG1SideInfo.scalefac_compress[gr][ch] = getSideBits(4)
theMPEG1SideInfo.win_switch_flag[gr][ch] = getSideBits(1)
if theMPEG1SideInfo.win_switch_flag[gr][ch] == 1 {
theMPEG1SideInfo.block_type[gr][ch] = getSideBits(2)
theMPEG1SideInfo.mixed_block_flag[gr][ch] = getSideBits(1)
for region := 0; region < 2; region++ {
C.g_side_info.table_select[gr][ch][region] = C.uint(getSideBits(5))
theMPEG1SideInfo.table_select[gr][ch][region] = getSideBits(5)
}
for window := 0; window < 3; window++ {
C.g_side_info.subblock_gain[gr][ch][window] = C.uint(getSideBits(3))
theMPEG1SideInfo.subblock_gain[gr][ch][window] = getSideBits(3)
}
if (C.g_side_info.block_type[gr][ch] == 2) && (C.g_side_info.mixed_block_flag[gr][ch] == 0) {
C.g_side_info.region0_count[gr][ch] = 8 /* Implicit */
if (theMPEG1SideInfo.block_type[gr][ch] == 2) && (theMPEG1SideInfo.mixed_block_flag[gr][ch] == 0) {
theMPEG1SideInfo.region0_count[gr][ch] = 8 /* Implicit */
} else {
C.g_side_info.region0_count[gr][ch] = 7 /* Implicit */
theMPEG1SideInfo.region0_count[gr][ch] = 7 /* Implicit */
}
/* The standard is wrong on this!!! */ /* Implicit */
C.g_side_info.region1_count[gr][ch] = 20 - C.g_side_info.region0_count[gr][ch]
theMPEG1SideInfo.region1_count[gr][ch] = 20 - theMPEG1SideInfo.region0_count[gr][ch]
} else {
for region := 0; region < 3; region++ {
C.g_side_info.table_select[gr][ch][region] = C.uint(getSideBits(5))
theMPEG1SideInfo.table_select[gr][ch][region] = getSideBits(5)
}
C.g_side_info.region0_count[gr][ch] = C.uint(getSideBits(4))
C.g_side_info.region1_count[gr][ch] = C.uint(getSideBits(3))
C.g_side_info.block_type[gr][ch] = 0 /* Implicit */
theMPEG1SideInfo.region0_count[gr][ch] = getSideBits(4)
theMPEG1SideInfo.region1_count[gr][ch] = getSideBits(3)
theMPEG1SideInfo.block_type[gr][ch] = 0 /* Implicit */
}
C.g_side_info.preflag[gr][ch] = C.uint(getSideBits(1))
C.g_side_info.scalefac_scale[gr][ch] = C.uint(getSideBits(1))
C.g_side_info.count1table_select[gr][ch] = C.uint(getSideBits(1))
theMPEG1SideInfo.preflag[gr][ch] = getSideBits(1)
theMPEG1SideInfo.scalefac_scale[gr][ch] = getSideBits(1)
theMPEG1SideInfo.count1table_select[gr][ch] = getSideBits(1)
}
}
return nil