void ac3_reader_c::read_headers() { try { int tag_size_start = skip_id3v2_tag(*m_in); int tag_size_end = id3_tag_present_at_end(*m_in); if (0 > tag_size_start) tag_size_start = 0; if (0 < tag_size_end) m_size -= tag_size_end; size_t init_read_len = std::min(m_size - tag_size_start, static_cast<uint64_t>(AC3_READ_SIZE)); if (m_in->read(m_chunk->get_buffer(), init_read_len) != init_read_len) throw mtx::input::header_parsing_x(); m_in->setFilePointer(tag_size_start, seek_beginning); ac3::parser_c parser; parser.add_bytes(m_chunk->get_buffer(), init_read_len); if (!parser.frame_available()) throw mtx::input::header_parsing_x(); m_ac3header = parser.get_frame(); } catch (mtx::mm_io::exception &) { throw mtx::input::open_x(); } m_ti.m_id = 0; // ID for this track. show_demuxer_info(); }
void truehd_reader_c::read_headers() { try { int tag_size_start = skip_id3v2_tag(*m_in); int tag_size_end = id3_tag_present_at_end(*m_in); if (0 > tag_size_start) tag_size_start = 0; if (0 < tag_size_end) m_size -= tag_size_end; size_t init_read_len = std::min(m_size - tag_size_start, static_cast<uint64_t>(TRUEHD_READ_SIZE)); if (m_in->read(m_chunk->get_buffer(), init_read_len) != init_read_len) throw mtx::input::header_parsing_x(); m_in->setFilePointer(tag_size_start, seek_beginning); truehd_parser_c parser; parser.add_data(m_chunk->get_buffer(), init_read_len); auto found_truehd = false; auto found_ac3 = false; while (parser.frame_available() && (!found_truehd || !found_ac3)) { auto frame = parser.get_next_frame(); if (frame->is_ac3()) { if (!found_ac3) { found_ac3 = true; m_ac3_header = frame->m_ac3_header; } continue; } if (!frame->is_sync()) continue; m_header = frame; found_truehd = true; } m_ti.m_id = 0; // ID for this track. show_demuxer_info(); } catch (mtx::mm_io::exception &) { throw mtx::input::open_x(); } }
void aac_reader_c::read_headers() { try { int tag_size_start = skip_id3v2_tag(*m_in); int tag_size_end = id3_tag_present_at_end(*m_in); if (0 > tag_size_start) tag_size_start = 0; if (0 < tag_size_end) m_size -= tag_size_end; size_t init_read_len = std::min(m_size - tag_size_start, static_cast<uint64_t>(INITCHUNKSIZE)); if (m_in->read(m_chunk, init_read_len) != init_read_len) throw mtx::input::header_parsing_x(); m_in->setFilePointer(tag_size_start, seek_beginning); if (find_aac_header(*m_chunk, init_read_len, &m_aacheader, m_emphasis_present) < 0) throw mtx::input::header_parsing_x(); guess_adts_version(); m_ti.m_id = 0; // ID for this track. int detected_profile = m_aacheader.profile; if (24000 >= m_aacheader.sample_rate) m_aacheader.profile = AAC_PROFILE_SBR; if ( (map_has_key(m_ti.m_all_aac_is_sbr, 0) && m_ti.m_all_aac_is_sbr[ 0]) || (map_has_key(m_ti.m_all_aac_is_sbr, -1) && m_ti.m_all_aac_is_sbr[-1])) m_aacheader.profile = AAC_PROFILE_SBR; if ( (map_has_key(m_ti.m_all_aac_is_sbr, 0) && !m_ti.m_all_aac_is_sbr[ 0]) || (map_has_key(m_ti.m_all_aac_is_sbr, -1) && !m_ti.m_all_aac_is_sbr[-1])) m_aacheader.profile = detected_profile; if ( map_has_key(m_ti.m_all_aac_is_sbr, 0) || map_has_key(m_ti.m_all_aac_is_sbr, -1)) m_sbr_status_set = true; } catch (...) { throw mtx::input::open_x(); } show_demuxer_info(); }
void tta_reader_c::read_headers() { if (g_identifying) return; try { int tag_size = skip_id3v2_tag(*m_in); if (0 > tag_size) mxerror_fn(m_ti.m_fname, boost::format(Y("tta_reader: tag_size < 0 in the c'tor. %1%\n")) % BUGMSG); m_size -= tag_size; if (m_in->read(&header, sizeof(tta_file_header_t)) != sizeof(tta_file_header_t)) mxerror_fn(m_ti.m_fname, Y("The file header is too short.\n")); uint64_t seek_sum = m_in->getFilePointer() + 4 - tag_size; m_size -= id3_tag_present_at_end(*m_in); uint32_t seek_point; do { seek_point = m_in->read_uint32_le(); seek_sum += seek_point + 4; seek_points.push_back(seek_point); } while (seek_sum < m_size); mxverb(2, boost::format("tta: ch %1% bps %2% sr %3% dl %4% seek_sum %5% size %6% num %7%\n") % get_uint16_le(&header.channels) % get_uint16_le(&header.bits_per_sample) % get_uint32_le(&header.sample_rate) % get_uint32_le(&header.data_length) % seek_sum % m_size % seek_points.size()); if (seek_sum != m_size) mxerror_fn(m_ti.m_fname, Y("The seek table in this TTA file seems to be broken.\n")); m_in->skip(4); pos = 0; m_ti.m_id = 0; // ID for this track. } catch (...) { throw mtx::input::open_x(); } show_demuxer_info(); }