Path: blob/main/src/lwjgl/java/javazoom/jl/decoder/Header.java
8650 views
/*1* 11/19/04 : 1.0 moved to LGPL.2* VBRI header support added, E.B [email protected]3*4* 12/04/03 : VBR (XING) header support added, E.B [email protected]5*6* 02/13/99 : Java Conversion by JavaZOOM , E.B [email protected]7*8* Declarations for MPEG header class9* A few layer III, MPEG-2 LSF, and seeking modifications made by Jeff Tsay.10* Last modified : 04/19/9711*12* @(#) header.h 1.7, last edit: 6/15/94 16:55:3313* @(#) Copyright (C) 1993, 1994 Tobias Bading ([email protected])14* @(#) Berlin University of Technology15*-----------------------------------------------------------------------16* This program is free software; you can redistribute it and/or modify17* it under the terms of the GNU Library General Public License as published18* by the Free Software Foundation; either version 2 of the License, or19* (at your option) any later version.20*21* This program is distributed in the hope that it will be useful,22* but WITHOUT ANY WARRANTY; without even the implied warranty of23* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the24* GNU Library General Public License for more details.25*26* You should have received a copy of the GNU Library General Public27* License along with this program; if not, write to the Free Software28* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.29*----------------------------------------------------------------------30*/31package javazoom.jl.decoder;3233/**34* Class for extracting information from a frame header.35*/36public final class Header37{38public static final int[][] frequencies =39{{22050, 24000, 16000, 1},40{44100, 48000, 32000, 1},41{11025, 12000, 8000, 1}}; // SZD: MPEG254243/**44* Constant for MPEG-2 LSF version45*/46public static final int MPEG2_LSF = 0;47public static final int MPEG25_LSF = 2; // SZD4849/**50* Constant for MPEG-1 version51*/52public static final int MPEG1 = 1;5354public static final int STEREO = 0;55public static final int JOINT_STEREO = 1;56public static final int DUAL_CHANNEL = 2;57public static final int SINGLE_CHANNEL = 3;58public static final int FOURTYFOUR_POINT_ONE = 0;59public static final int FOURTYEIGHT=1;60public static final int THIRTYTWO=2;6162private int h_layer, h_protection_bit, h_bitrate_index,63h_padding_bit, h_mode_extension;64private int h_version;65private int h_mode;66private int h_sample_frequency;67private int h_number_of_subbands, h_intensity_stereo_bound;68private boolean h_copyright, h_original;69// VBR support added by E.B70private double[] h_vbr_time_per_frame = {-1, 384, 1152, 1152};71private boolean h_vbr;72private int h_vbr_frames;73private int h_vbr_scale;74private int h_vbr_bytes;75private byte[] h_vbr_toc;7677private byte syncmode = Bitstream.INITIAL_SYNC;78private Crc16 crc;7980public short checksum;81public int framesize;82public int nSlots;8384private int _headerstring = -1; // E.B8586Header()87{88}89public String toString()90{91StringBuilder buffer = new StringBuilder(200);92buffer.append("Layer ");93buffer.append(layer_string());94buffer.append(" frame ");95buffer.append(mode_string());96buffer.append(' ');97buffer.append(version_string());98if (!checksums())99buffer.append(" no");100buffer.append(" checksums");101buffer.append(' ');102buffer.append(sample_frequency_string());103buffer.append(',');104buffer.append(' ');105buffer.append(bitrate_string());106107String s = buffer.toString();108return s;109}110111/**112* Read a 32-bit header from the bitstream.113*/114void read_header(Bitstream stream, Crc16[] crcp) throws BitstreamException115{116int headerstring;117int channel_bitrate;118boolean sync = false;119do120{121headerstring = stream.syncHeader(syncmode);122_headerstring = headerstring; // E.B123if (syncmode == Bitstream.INITIAL_SYNC)124{125h_version = ((headerstring >>> 19) & 1);126if (((headerstring >>> 20) & 1) == 0) // SZD: MPEG2.5 detection127if (h_version == MPEG2_LSF)128h_version = MPEG25_LSF;129else130throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR);131if ((h_sample_frequency = ((headerstring >>> 10) & 3)) == 3)132{133throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR);134}135}136h_layer = 4 - (headerstring >>> 17) & 3;137h_protection_bit = (headerstring >>> 16) & 1;138h_bitrate_index = (headerstring >>> 12) & 0xF;139h_padding_bit = (headerstring >>> 9) & 1;140h_mode = ((headerstring >>> 6) & 3);141h_mode_extension = (headerstring >>> 4) & 3;142if (h_mode == JOINT_STEREO)143h_intensity_stereo_bound = (h_mode_extension << 2) + 4;144else145h_intensity_stereo_bound = 0; // should never be used146if (((headerstring >>> 3) & 1) == 1)147h_copyright = true;148if (((headerstring >>> 2) & 1) == 1)149h_original = true;150// calculate number of subbands:151if (h_layer == 1)152h_number_of_subbands = 32;153else154{155channel_bitrate = h_bitrate_index;156// calculate bitrate per channel:157if (h_mode != SINGLE_CHANNEL)158if (channel_bitrate == 4)159channel_bitrate = 1;160else161channel_bitrate -= 4;162if ((channel_bitrate == 1) || (channel_bitrate == 2))163if (h_sample_frequency == THIRTYTWO)164h_number_of_subbands = 12;165else166h_number_of_subbands = 8;167else if ((h_sample_frequency == FOURTYEIGHT) || ((channel_bitrate >= 3) && (channel_bitrate <= 5)))168h_number_of_subbands = 27;169else170h_number_of_subbands = 30;171}172if (h_intensity_stereo_bound > h_number_of_subbands)173h_intensity_stereo_bound = h_number_of_subbands;174// calculate framesize and nSlots175calculate_framesize();176// read framedata:177int framesizeloaded = stream.read_frame_data(framesize);178if ((framesize >=0) && (framesizeloaded != framesize))179{180// Data loaded does not match to expected framesize,181// it might be an ID3v1 TAG. (Fix 11/17/04).182throw stream.newBitstreamException(Bitstream.INVALIDFRAME);183}184if (stream.isSyncCurrentPosition(syncmode))185{186if (syncmode == Bitstream.INITIAL_SYNC)187{188syncmode = Bitstream.STRICT_SYNC;189stream.set_syncword(headerstring & 0xFFF80CC0);190}191sync = true;192}193else194{195stream.unreadFrame();196}197}198while (!sync);199stream.parse_frame();200if (h_protection_bit == 0)201{202// frame contains a crc checksum203checksum = (short) stream.get_bits(16);204if (crc == null)205crc = new Crc16();206crc.add_bits(headerstring, 16);207crcp[0] = crc;208}209else210crcp[0] = null;211if (h_sample_frequency == FOURTYFOUR_POINT_ONE)212{213/*214if (offset == null)215{216int max = max_number_of_frames(stream);217offset = new int[max];218for(int i=0; i<max; i++) offset[i] = 0;219}220// E.B : Investigate more221int cf = stream.current_frame();222int lf = stream.last_frame();223if ((cf > 0) && (cf == lf))224{225offset[cf] = offset[cf-1] + h_padding_bit;226}227else228{229offset[0] = h_padding_bit;230}231*/232}233}234235/**236* Parse frame to extract optional VBR frame.237*238* @param firstframe239* @author E.B ([email protected])240*/241void parseVBR(byte[] firstframe) throws BitstreamException242{243// Trying Xing header.244String xing = "Xing";245byte tmp[] = new byte[4];246int offset = 0;247// Compute "Xing" offset depending on MPEG version and channels.248if (h_version == MPEG1)249{250if (h_mode == SINGLE_CHANNEL) offset=21-4;251else offset=36-4;252}253else254{255if (h_mode == SINGLE_CHANNEL) offset=13-4;256else offset = 21-4;257}258try259{260System.arraycopy(firstframe, offset, tmp, 0, 4);261// Is "Xing" ?262if (xing.equals(new String(tmp)))263{264//Yes.265h_vbr = true;266h_vbr_frames = -1;267h_vbr_bytes = -1;268h_vbr_scale = -1;269h_vbr_toc = new byte[100];270271int length = 4;272// Read flags.273byte flags[] = new byte[4];274System.arraycopy(firstframe, offset + length, flags, 0, flags.length);275length += flags.length;276// Read number of frames (if available).277if ((flags[3] & (byte) (1 << 0)) != 0)278{279System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);280h_vbr_frames = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF;281length += 4;282}283// Read size (if available).284if ((flags[3] & (byte) (1 << 1)) != 0)285{286System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);287h_vbr_bytes = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF;288length += 4;289}290// Read TOC (if available).291if ((flags[3] & (byte) (1 << 2)) != 0)292{293System.arraycopy(firstframe, offset + length, h_vbr_toc, 0, h_vbr_toc.length);294length += h_vbr_toc.length;295}296// Read scale (if available).297if ((flags[3] & (byte) (1 << 3)) != 0)298{299System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);300h_vbr_scale = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF;301length += 4;302}303//System.out.println("VBR:"+xing+" Frames:"+ h_vbr_frames +" Size:"+h_vbr_bytes);304}305}306catch (ArrayIndexOutOfBoundsException e)307{308throw new BitstreamException("XingVBRHeader Corrupted",e);309}310311// Trying VBRI header.312String vbri = "VBRI";313offset = 36-4;314try315{316System.arraycopy(firstframe, offset, tmp, 0, 4);317// Is "VBRI" ?318if (vbri.equals(new String(tmp)))319{320//Yes.321h_vbr = true;322h_vbr_frames = -1;323h_vbr_bytes = -1;324h_vbr_scale = -1;325h_vbr_toc = new byte[100];326// Bytes.327int length = 4 + 6;328System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);329h_vbr_bytes = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF;330length += 4;331// Frames.332System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);333h_vbr_frames = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF;334length += 4;335//System.out.println("VBR:"+vbri+" Frames:"+ h_vbr_frames +" Size:"+h_vbr_bytes);336// TOC337// TODO338}339}340catch (ArrayIndexOutOfBoundsException e)341{342throw new BitstreamException("VBRIVBRHeader Corrupted",e);343}344}345346// Functions to query header contents:347/**348* Returns version.349*/350public int version() { return h_version; }351352/**353* Returns Layer ID.354*/355public int layer() { return h_layer; }356357/**358* Returns bitrate index.359*/360public int bitrate_index() { return h_bitrate_index; }361362/**363* Returns Sample Frequency.364*/365public int sample_frequency() { return h_sample_frequency; }366367/**368* Returns Frequency.369*/370public int frequency() {return frequencies[h_version][h_sample_frequency];}371372/**373* Returns Mode.374*/375public int mode() { return h_mode; }376377/**378* Returns Protection bit.379*/380public boolean checksums()381{382if (h_protection_bit == 0) return true;383else return false;384}385386/**387* Returns Copyright.388*/389public boolean copyright() { return h_copyright; }390391/**392* Returns Original.393*/394public boolean original() { return h_original; }395396/**397* Return VBR.398*399* @return true if VBR header is found400*/401public boolean vbr() { return h_vbr; }402403/**404* Return VBR scale.405*406* @return scale of -1 if not available407*/408public int vbr_scale() { return h_vbr_scale; }409410/**411* Return VBR TOC.412*413* @return vbr toc ot null if not available414*/415public byte[] vbr_toc() { return h_vbr_toc; }416417/**418* Returns Checksum flag.419* Compares computed checksum with stream checksum.420*/421public boolean checksum_ok () { return (checksum == crc.checksum()); }422423// Seeking and layer III stuff424/**425* Returns Layer III Padding bit.426*/427public boolean padding()428{429if (h_padding_bit == 0) return false;430else return true;431}432433/**434* Returns Slots.435*/436public int slots() { return nSlots; }437438/**439* Returns Mode Extension.440*/441public int mode_extension() { return h_mode_extension; }442443// E.B -> private to public444public static final int bitrates[][][] = {445{{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,446112000, 128000, 144000, 160000, 176000, 192000 ,224000, 256000, 0},447{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,44856000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0},449{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,45056000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}},451452{{0 /*free format*/, 32000, 64000, 96000, 128000, 160000, 192000,453224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000, 0},454{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,455112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000, 0},456{0 /*free format*/, 32000, 40000, 48000, 56000, 64000, 80000,45796000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 0}},458// SZD: MPEG2.5459{{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,460112000, 128000, 144000, 160000, 176000, 192000 ,224000, 256000, 0},461{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,46256000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0},463{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,46456000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}},465466};467468// E.B -> private to public469/**470* Calculate Frame size.471*472* Calculates framesize in bytes excluding header size.473*/474public int calculate_framesize()475{476477if (h_layer == 1)478{479framesize = (12 * bitrates[h_version][0][h_bitrate_index]) /480frequencies[h_version][h_sample_frequency];481if (h_padding_bit != 0 ) framesize++;482framesize <<= 2; // one slot is 4 bytes long483nSlots = 0;484}485else486{487framesize = (144 * bitrates[h_version][h_layer - 1][h_bitrate_index]) /488frequencies[h_version][h_sample_frequency];489if (h_version == MPEG2_LSF || h_version == MPEG25_LSF) framesize >>= 1; // SZD490if (h_padding_bit != 0) framesize++;491// Layer III slots492if (h_layer == 3)493{494if (h_version == MPEG1)495{496nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 17 : 32) // side info size497- ((h_protection_bit!=0) ? 0 : 2) // CRC size498- 4; // header size499}500else501{ // MPEG-2 LSF, SZD: MPEG-2.5 LSF502nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 9 : 17) // side info size503- ((h_protection_bit!=0) ? 0 : 2) // CRC size504- 4; // header size505}506}507else508{509nSlots = 0;510}511}512framesize -= 4; // subtract header size513return framesize;514}515516/**517* Returns the maximum number of frames in the stream.518*519* @param streamsize520* @return number of frames521*/522public int max_number_of_frames(int streamsize) // E.B523{524if (h_vbr == true) return h_vbr_frames;525else526{527if ((framesize + 4 - h_padding_bit) == 0) return 0;528else return(streamsize / (framesize + 4 - h_padding_bit));529}530}531532/**533* Returns the maximum number of frames in the stream.534*535* @param streamsize536* @return number of frames537*/538public int min_number_of_frames(int streamsize) // E.B539{540if (h_vbr == true) return h_vbr_frames;541else542{543if ((framesize + 5 - h_padding_bit) == 0) return 0;544else return(streamsize / (framesize + 5 - h_padding_bit));545}546}547548549/**550* Returns ms/frame.551*552* @return milliseconds per frame553*/554public float ms_per_frame() // E.B555{556if (h_vbr == true)557{558double tpf = h_vbr_time_per_frame[layer()] / frequency();559if ((h_version == MPEG2_LSF) || (h_version == MPEG25_LSF)) tpf /= 2;560return ((float) (tpf * 1000));561}562else563{564float ms_per_frame_array[][] = {{8.707483f, 8.0f, 12.0f},565{26.12245f, 24.0f, 36.0f},566{26.12245f, 24.0f, 36.0f}};567return(ms_per_frame_array[h_layer-1][h_sample_frequency]);568}569}570571/**572* Returns total ms.573*574* @param streamsize575* @return total milliseconds576*/577public float total_ms(int streamsize) // E.B578{579return(max_number_of_frames(streamsize) * ms_per_frame());580}581582/**583* Returns synchronized header.584*/585public int getSyncHeader() // E.B586{587return _headerstring;588}589590// functions which return header informations as strings:591/**592* Return Layer version.593*/594public String layer_string()595{596switch (h_layer)597{598case 1:599return "I";600case 2:601return "II";602case 3:603return "III";604}605return null;606}607608// E.B -> private to public609public static final String bitrate_str[][][] = {610{{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s",611"80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s",612"160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s",613"forbidden"},614{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",615"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",616"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",617"forbidden"},618{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",619"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",620"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",621"forbidden"}},622623{{"free format", "32 kbit/s", "64 kbit/s", "96 kbit/s", "128 kbit/s",624"160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "288 kbit/s",625"320 kbit/s", "352 kbit/s", "384 kbit/s", "416 kbit/s", "448 kbit/s",626"forbidden"},627{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s",628"80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s",629"192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s", "384 kbit/s",630"forbidden"},631{"free format", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s",632"64 kbit/s", "80 kbit/s" , "96 kbit/s", "112 kbit/s", "128 kbit/s",633"160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s",634"forbidden"}},635// SZD: MPEG2.5636{{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s",637"80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s",638"160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s",639"forbidden"},640{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",641"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",642"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",643"forbidden"},644{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",645"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",646"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",647"forbidden"}},648};649650/**651* Return Bitrate.652*653* @return bitrate in bps654*/655public String bitrate_string()656{657if (h_vbr == true)658{659return Integer.toString(bitrate()/1000)+" kb/s";660}661else return bitrate_str[h_version][h_layer - 1][h_bitrate_index];662}663664/**665* Return Bitrate.666*667* @return bitrate in bps and average bitrate for VBR header668*/669public int bitrate()670{671if (h_vbr == true)672{673return ((int) ((h_vbr_bytes * 8) / (ms_per_frame() * h_vbr_frames)))*1000;674}675else return bitrates[h_version][h_layer - 1][h_bitrate_index];676}677678/**679* Return Instant Bitrate.680* Bitrate for VBR is not constant.681*682* @return bitrate in bps683*/684public int bitrate_instant()685{686return bitrates[h_version][h_layer - 1][h_bitrate_index];687}688689/**690* Returns Frequency691*692* @return frequency string in kHz693*/694public String sample_frequency_string()695{696switch (h_sample_frequency)697{698case THIRTYTWO:699if (h_version == MPEG1)700return "32 kHz";701else if (h_version == MPEG2_LSF)702return "16 kHz";703else // SZD704return "8 kHz";705case FOURTYFOUR_POINT_ONE:706if (h_version == MPEG1)707return "44.1 kHz";708else if (h_version == MPEG2_LSF)709return "22.05 kHz";710else // SZD711return "11.025 kHz";712case FOURTYEIGHT:713if (h_version == MPEG1)714return "48 kHz";715else if (h_version == MPEG2_LSF)716return "24 kHz";717else // SZD718return "12 kHz";719}720return(null);721}722723/**724* Returns Mode.725*/726public String mode_string()727{728switch (h_mode)729{730case STEREO:731return "Stereo";732case JOINT_STEREO:733return "Joint stereo";734case DUAL_CHANNEL:735return "Dual channel";736case SINGLE_CHANNEL:737return "Single channel";738}739return null;740}741742/**743* Returns Version.744*745* @return MPEG-1 or MPEG-2 LSF or MPEG-2.5 LSF746*/747public String version_string()748{749switch (h_version)750{751case MPEG1:752return "MPEG-1";753case MPEG2_LSF:754return "MPEG-2 LSF";755case MPEG25_LSF: // SZD756return "MPEG-2.5 LSF";757}758return(null);759}760761/**762* Returns the number of subbands in the current frame.763*764* @return number of subbands765*/766public int number_of_subbands() {return h_number_of_subbands;}767768/**769* Returns Intensity Stereo.770* (Layer II joint stereo only).771* Returns the number of subbands which are in stereo mode,772* subbands above that limit are in intensity stereo mode.773*774* @return intensity775*/776public int intensity_stereo_bound() {return h_intensity_stereo_bound;}777}778779780