protected static bool GetCRC( MpegFrame frame, int[] rateTable, int[][] allocLookupTable, bool readScfsiBits, ref uint crc) { // ugh... we basically have to re-implement the allocation logic here. // keep up with how many active subbands we need to read selection info for var scfsiBits = 0; // only read as many subbands as we actually need; pay attention to the intensity stereo subbands var subbandCount = rateTable.Length; var jsbound = subbandCount; if (frame.ChannelMode == MpegChannelMode.JointStereo) { jsbound = frame.ChannelModeExtension * 4 + 4; } // read the full stereo subbands var channels = frame.ChannelMode == MpegChannelMode.Mono ? 1 : 2; var sb = 0; for (; sb < jsbound; sb++) { var bits = allocLookupTable[rateTable[sb]][0]; for (int ch = 0; ch < channels; ch++) { var alloc = frame.ReadBits(bits); if (alloc > 0) { scfsiBits += 2; } MpegFrame.UpdateCRC(alloc, bits, ref crc); } } // read the intensity stereo subbands for (; sb < subbandCount; sb++) { var bits = allocLookupTable[rateTable[sb]][0]; var alloc = frame.ReadBits(bits); if (alloc > 0) { scfsiBits += channels * 2; } MpegFrame.UpdateCRC(alloc, bits, ref crc); } // finally, read the scalefac selection bits if (readScfsiBits) { while (scfsiBits >= 2) { MpegFrame.UpdateCRC(frame.ReadBits(2), 2, ref crc); scfsiBits -= 2; } } return(true); }