Created
March 6, 2014 16:35
-
-
Save hcs64/9393705 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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