// Try to guess if the MPEG4 header contains the emphasis field (2 bits) void aac_reader_c::guess_adts_version() { aac_header_t tmp_aacheader; m_emphasis_present = false; // Due to the checks we do have an ADTS header at 0. find_aac_header(*m_chunk, INITCHUNKSIZE, &tmp_aacheader, m_emphasis_present); if (tmp_aacheader.id != 0) // MPEG2 return; // Now make some sanity checks on the size field. if (tmp_aacheader.bytes > 8192) { m_emphasis_present = true; // Looks like it's borked. return; } // Looks ok so far. See if the next ADTS is right behind this packet. int pos = find_aac_header(m_chunk->get_buffer() + tmp_aacheader.bytes, INITCHUNKSIZE - tmp_aacheader.bytes, &tmp_aacheader, m_emphasis_present); if (0 != pos) // Not ok - what do we do now? m_emphasis_present = true; }
int mpeg_ts_track_c::new_stream_a_aac() { add_pes_payload_to_probe_data(); if (0 > find_aac_header(m_probe_data->get_buffer(), m_probe_data->get_size(), &m_aac_header, false)) return FILE_STATUS_MOREDATA; mxdebug_if(reader.m_debug_aac, boost::format("first AAC header: %1%\n") % m_aac_header.to_string()); a_channels = m_aac_header.channels; a_sample_rate = m_aac_header.sample_rate; return 0; }
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(); }