Logo Search packages:      
Sourcecode: libjlayer-java version File versions  Download package

void javazoom::jl::decoder::Header::read_header ( Bitstream  stream,
Crc16[]  crcp 
) throws BitstreamException [inline, package]

Read a 32-bit header from the bitstream.

Definition at line 115 of file Header.java.

References javazoom::jl::decoder::Crc16::add_bits(), calculate_framesize(), and MPEG2_LSF.

Referenced by javazoom::jl::decoder::Bitstream::nextFrame().

      {
            int headerstring;
            int channel_bitrate;
            boolean sync = false;
            do
            {
                  headerstring = stream.syncHeader(syncmode);
                  _headerstring = headerstring; // E.B
                  if (syncmode == Bitstream.INITIAL_SYNC)
                  {
                        h_version = ((headerstring >>> 19) & 1);
                        if (((headerstring >>> 20) & 1) == 0) // SZD: MPEG2.5 detection
                              if (h_version == MPEG2_LSF)
                                    h_version = MPEG25_LSF;
                              else
                                    throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR);
                        if ((h_sample_frequency = ((headerstring >>> 10) & 3)) == 3)
                        {
                              throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR);
                        }
                  }
                  h_layer = 4 - (headerstring >>> 17) & 3;
                  h_protection_bit = (headerstring >>> 16) & 1;
                  h_bitrate_index = (headerstring >>> 12) & 0xF;
                  h_padding_bit = (headerstring >>> 9) & 1;
                  h_mode = ((headerstring >>> 6) & 3);
                  h_mode_extension = (headerstring >>> 4) & 3;
                  if (h_mode == JOINT_STEREO)
                        h_intensity_stereo_bound = (h_mode_extension << 2) + 4;
                  else
                        h_intensity_stereo_bound = 0; // should never be used
                  if (((headerstring >>> 3) & 1) == 1)
                        h_copyright = true;
                  if (((headerstring >>> 2) & 1) == 1)
                        h_original = true;
                  // calculate number of subbands:
                  if (h_layer == 1)
                        h_number_of_subbands = 32;
                  else
                  {
                        channel_bitrate = h_bitrate_index;
                        // calculate bitrate per channel:
                        if (h_mode != SINGLE_CHANNEL)
                              if (channel_bitrate == 4)
                                    channel_bitrate = 1;
                              else
                                    channel_bitrate -= 4;
                        if ((channel_bitrate == 1) || (channel_bitrate == 2))
                              if (h_sample_frequency == THIRTYTWO)
                                    h_number_of_subbands = 12;
                              else
                                    h_number_of_subbands = 8;
                        else if ((h_sample_frequency == FOURTYEIGHT) || ((channel_bitrate >= 3) && (channel_bitrate <= 5)))
                              h_number_of_subbands = 27;
                        else
                              h_number_of_subbands = 30;
                  }
                  if (h_intensity_stereo_bound > h_number_of_subbands)
                        h_intensity_stereo_bound = h_number_of_subbands;
                  // calculate framesize and nSlots
                  calculate_framesize();
                  // read framedata:
                  int framesizeloaded = stream.read_frame_data(framesize);
                  if ((framesize >=0) && (framesizeloaded != framesize))
                  {
                        // Data loaded does not match to expected framesize,
                        // it might be an ID3v1 TAG. (Fix 11/17/04).
                        throw stream.newBitstreamException(Bitstream.INVALIDFRAME);
                  }
                  if (stream.isSyncCurrentPosition(syncmode))
                  {
                        if (syncmode == Bitstream.INITIAL_SYNC)
                        {
                              syncmode = Bitstream.STRICT_SYNC;
                              stream.set_syncword(headerstring & 0xFFF80CC0);
                        }
                        sync = true;
                  }
                  else
                  {
                        stream.unreadFrame();
                  }
            }
            while (!sync);
            stream.parse_frame();
            if (h_protection_bit == 0)
            {
                  // frame contains a crc checksum
                  checksum = (short) stream.get_bits(16);
                  if (crc == null)
                        crc = new Crc16();
                  crc.add_bits(headerstring, 16);
                  crcp[0] = crc;
            }
            else
                  crcp[0] = null;
            if (h_sample_frequency == FOURTYFOUR_POINT_ONE)
            {
                  /*
                        if (offset == null)
                    {
                          int max = max_number_of_frames(stream);
                          offset = new int[max];
                       for(int i=0; i<max; i++) offset[i] = 0;
                    }
                    // E.B : Investigate more
                    int cf = stream.current_frame();
                    int lf = stream.last_frame();
                    if ((cf > 0) && (cf == lf))
                    {
                           offset[cf] = offset[cf-1] + h_padding_bit;
                    }
                    else
                    {
                               offset[0] = h_padding_bit;
                    }
                  */
            }
      }


Generated by  Doxygen 1.6.0   Back to index