/** * Creates an {@code AudioFrame} object based on the given header field. If the header field * contains invalid values, result is <b>null</b>. * * @param bits the header bit field * @return the {@code AudioFrame} */ private static AudioFrame createHeader(HeaderBitField bits) { if (bits.get(21, 23) != 7) { return null; } int mpegVer = bits.get(19, 20); int layer = bits.get(17, 18); int bitRateCode = bits.get(12, 15); int sampleRateCode = bits.get(10, 11); int padding = bits.get(9); if (mpegVer == 1 || layer == 0 || bitRateCode == 0 || bitRateCode == 15 || sampleRateCode == 3) { // invalid header values return null; } int bitRate = calculateBitRate(mpegVer, layer, bitRateCode); int sampleRate = calculateSampleRate(mpegVer, sampleRateCode); int length = calculateFrameLength(layer, bitRate, sampleRate, padding); float duration = calculateDuration(layer, sampleRate); int channels = calculateChannels(bits.get(6, 7)); return new AudioFrame(mpegVer, layer, bitRate, sampleRate, channels, length, duration); }