//used in decodeTable3
        static int MAPCDSF_decodeTable3Sub0(MaiBitReader mbr0, ManagedPointer<short> buf_to_read, uint num_to_read, MaiAT3PlusCoreDecoderSearchTableDes huff_table_now)
        {
            int rs = 0;

            if (huff_table_now.uk3 == 1)
            {
                uint tcounter0 = 0;
                for (uint b0 = 0; b0 < (num_to_read >> (huff_table_now.uk4)); b0++)
                {
                    uint group_value = MAPCDSF_getHuffValue(huff_table_now, mbr0);

                    for (uint b1 = 0; b1 < huff_table_now.uk2; b1++)
                    {
                        uint value_now = (uint)(group_value >> (int)((huff_table_now.uk2 - b1 - 1) * huff_table_now.uk6));
                        value_now &= huff_table_now.mask;

                        if (0 == huff_table_now.uk5)
                        {
                            if ((value_now & ( 1 << (huff_table_now.uk6 - 1) )) != 0 )
                                buf_to_read[tcounter0++] = (short)(value_now | ( ~( ( 1 << (huff_table_now.uk6) ) - 1 ) ));
                            else
                                buf_to_read[tcounter0++] = (short)(value_now);
                        }
                        else
                        {
                            if ( ((value_now != 0) && (mbr0.getWithI32Buffer(1) != 0)) )
                                buf_to_read[tcounter0++] = (short)(((short)(value_now)) * (-1));
                            else
                                buf_to_read[tcounter0++] = (short)(value_now);
                        }
                    }
                }
            }
            else if (huff_table_now.uk3 > 1)
            {
                uint tcounter0 = 0;
                for (uint b0 = 0; b0 < (num_to_read >> (huff_table_now.uk4)); b0 += huff_table_now.uk3)
                {
                    uint l320 = (uint)mbr0.getWithI32Buffer(1);
                    if (0 == l320)
                    {
                        for (uint b1 = 0; b1 < huff_table_now.uk3 * huff_table_now.uk2; b1++)
                        {
                            buf_to_read[tcounter0++] = 0;
                        }
                    }
                    else for (uint b2 = 0; b2 < huff_table_now.uk3; b2++)
                    {
                        uint group_value = MAPCDSF_getHuffValue(huff_table_now, mbr0);

                        for (uint b1 = 0; b1 < huff_table_now.uk2; b1++)
                        {
                            uint value_now = (uint)(group_value >> (int)((huff_table_now.uk2 - b1 - 1) * huff_table_now.uk6));
                            value_now &= huff_table_now.mask;

                            if (0 == huff_table_now.uk5)
                            {
                                if ((value_now & ( 1 << (huff_table_now.uk6 - 1) )) != 0 )
                                    buf_to_read[tcounter0++] = (short)(value_now | ( ~( ( 1 << (huff_table_now.uk6) ) - 1 ) ));
                                else
                                    buf_to_read[tcounter0++] = (short)(value_now);
                            }
                            else
                            {
                                if ( ((value_now!= 0) && (mbr0.getWithI32Buffer(1)!= 0))  )
                                    buf_to_read[tcounter0++] = (short)(((short)(value_now)) * (-1));
                                else
                                    buf_to_read[tcounter0++] = (short)(value_now);
                            }
                        }
                    }
                }
            }
            else
            {
                rs = -20;
            }

            return rs;
        }
 //ushort *table0, byte *table1, uint max_len,  MaiBitReader mbr0)
 static uint MAPCDSF_getHuffValue(MaiAT3PlusCoreDecoderSearchTableDes huff_table, MaiBitReader mbr0)
 {
     uint value = (uint)mbr0.getWithI32Buffer((int)huff_table.max_bit_len, false);
     value = huff_table.table1[value];
     mbr0.getWithI32Buffer(huff_table.table0[value * 2 + 1]);
     return value;
 }
        int DecodeTable3(MaiBitReader mbr0, MaiAt3PlusCoreDecoderChnInfo[] chnInfos, uint chns)
        {
            int rs = 0;

            for (uint a0 = 0; a0 < chns; a0++)
            {
                for (uint a1 = 0; a1 < 0x800; a1++)
                {
                    chnInfos[a0].Table3[a1] = 0;
                }
                for (uint a1 = 0; a1 < 0x5; a1++)
                {
                    chnInfos[a0].Table4[a1] = 0x0F;
                }

                for (uint a1 = 0; a1 < chnInfos[0].JointChnInfo.NumBandSplitedUsed; a1++)
                {
                    if (chnInfos[a0].Table0[a1] == 0)
                    {
                        for (uint a2 = 0; a2 < MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_bind_table1[a1]; a2++)
                        {
                            chnInfos[a0].Table3[MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_bind_table0[a1] + a2] = 0;
                        }
                    }
                    else
                    {
                        uint atmp0 = 0;

                        if (0 == chnInfos[a0].JointChnInfo.Var90)
                        {
                            atmp0 = MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_bind_table2[
                                (chnInfos[a0].Var1034 * 7 + chnInfos[a0].Table0[a1]) * 4 +
                                chnInfos[a0].Table2[a1]]; //tmp4 5 6
                        }
                        else
                        {
                            atmp0 = chnInfos[a0].Table2[a1];
                        }

                        MaiAT3PlusCoreDecoderSearchTableDes huffTableNow =
                            MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_huff_table3[
                                (chnInfos[a0].Var1034 * 8 + atmp0) * 7 + chnInfos[a0].Table0[a1]]; //tmp5 6

                        MAPCDSF_decodeTable3Sub0(mbr0,
                                                 chnInfos[a0].Table3
                                                 .GetPointer((int)MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_bind_table0[a1]),
                                                 MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_bind_table1[a1], huffTableNow);
                    }
                }

                if (chnInfos[0].JointChnInfo.NumBandSplitedUsed > 2)
                {
                    for (uint a1 = 0;
                         a1 < (uint)(MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_band_num_table1[
                                         MaiAT3PlusCoreDecoder_StaticData.MAPCDSD_band_num_table0[
                                             chnInfos[0].JointChnInfo.NumBandSplitedUsed] + 1] + 1);
                         a1++)
                    {
                        chnInfos[a0].Table4[a1] = (uint)mbr0.GetWithI32Buffer(4);
                    }
                }
            }

            if (chns == 2)
            {
                MAPCDSF_readPackTable0(mbr0, chnInfos[0].JointChnInfo.Table48,
                                       chnInfos[0].JointChnInfo.NumBandUsed);
                MAPCDSF_readPackTable0(mbr0, chnInfos[0].JointChnInfo.Table00,
                                       chnInfos[0].JointChnInfo.NumBandUsed);
            }


            return(rs);
        }