Skip to content

Instantly share code, notes, and snippets.

@hcs64
Created March 6, 2014 16:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hcs64/9393705 to your computer and use it in GitHub Desktop.
Save hcs64/9393705 to your computer and use it in GitHub Desktop.
// first byte
if (_mod_packets)
{
// need to rebuild packet type and window info
if (!mode_blockflag)
{
throw Parse_error_str("didn't load mode_blockflag");
}
// OUT: 1 bit packet type (0 == audio)
Bit_uint<1> packet_type(0);
os << packet_type;
Bit_uintv * mode_number_p = 0;
Bit_uintv * remainder_p = 0;
{
// collect mode number from first byte
Bit_stream ss(_infile);
// IN/OUT: N bit mode number (max 6 bits)
mode_number_p = new Bit_uintv(mode_bits);
ss >> *mode_number_p;
os << *mode_number_p;
// IN: remaining bits of first (input) byte
remainder_p = new Bit_uintv(8-mode_bits);
ss >> *remainder_p;
}
if (mode_blockflag[*mode_number_p])
{
// long window, peek at next frame
_infile.seekg(next_offset);
bool next_blockflag = false;
if (next_offset + packet_header_size <= _data_offset + _data_size)
{
// mod_packets always goes with 6-byte headers
Packet audio_packet(_infile, next_offset, _little_endian, _no_granule);
uint32_t next_packet_size = audio_packet.size();
if (next_packet_size > 0)
{
_infile.seekg(audio_packet.offset());
Bit_stream ss(_infile);
Bit_uintv next_mode_number(mode_bits);
ss >> next_mode_number;
next_blockflag = mode_blockflag[next_mode_number];
}
}
// OUT: previous window type bit
Bit_uint<1> prev_window_type(prev_blockflag);
os << prev_window_type;
// OUT: next window type bit
Bit_uint<1> next_window_type(next_blockflag);
os << next_window_type;
// fix seek for rest of stream
_infile.seekg(offset + 1);
}
prev_blockflag = mode_blockflag[*mode_number_p];
delete mode_number_p;
// OUT: remaining bits of first (input) byte
os << *remainder_p;
delete remainder_p;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment