int aac_reader_c::find_valid_headers(mm_io_c &in, int64_t probe_range, int num_headers) { try { in.setFilePointer(0, seek_beginning); memory_cptr buf = memory_c::alloc(probe_range); int num_read = in.read(buf->get_buffer(), probe_range); in.setFilePointer(0, seek_beginning); return find_consecutive_aac_headers(buf->get_buffer(), num_read, num_headers); } catch (...) { return -1; } }
bool truehd_reader_c::find_valid_headers(mm_io_c &in, int64_t probe_range, int num_headers) { try { memory_cptr buf(memory_c::alloc(probe_range)); in.setFilePointer(0, seek_beginning); skip_id3v2_tag(in); int num_read = in.read(buf->get_buffer(), probe_range); truehd_parser_c parser; parser.add_data(buf->get_buffer(), num_read); int num_sync_frames = 0; while (parser.frame_available()) { truehd_frame_cptr frame = parser.get_next_frame(); if (frame->is_sync()) ++num_sync_frames; } return num_sync_frames >= num_headers; } catch (...) { return false; } }
int ac3_reader_c::find_valid_headers(mm_io_c &in, int64_t probe_range, int num_headers) { try { memory_cptr buf(memory_c::alloc(probe_range)); in.setFilePointer(0, seek_beginning); skip_id3v2_tag(in); ac3::parser_c parser; int num_read = in.read(buf->get_buffer(), probe_range); int pos = parser.find_consecutive_frames(buf->get_buffer(), num_read, num_headers); in.setFilePointer(0, seek_beginning); return pos; } catch (...) { return -1; } }
dts_reader_c::chunks_t dts_reader_c::scan_chunks(mm_io_c &in) { static auto s_debug = debugging_option_c{"dts_reader|dts_reader_chunks"}; auto chunks = chunks_t{}; try { auto const file_size = static_cast<uint64_t>(in.get_size()); in.setFilePointer(0, seek_beginning); auto type = static_cast<chunk_type_e>(in.read_uint64_be()); if (type != chunk_type_e::dtshdhdr) { chunks.emplace_back(chunk_type_e::strmdata, 0ull, file_size); return chunks; } auto next_chunk_start = 0ull; while (next_chunk_start < (file_size - 16)) { in.setFilePointer(next_chunk_start); type = static_cast<chunk_type_e>(in.read_uint64_be()); auto data_size = std::min<uint64_t>(in.read_uint64_be(), file_size - next_chunk_start - 16); chunks.emplace_back(type, next_chunk_start + 16, data_size); next_chunk_start = chunks.back().data_end; } } catch (mtx::mm_io::exception &) { } if (s_debug) for (auto const &chunk : chunks) mxinfo(boost::format("DTS chunk type %|1$16x| at %2% data size %3% data end %4%\n") % static_cast<uint64_t>(chunk.type) % (chunk.data_start - 16) % chunk.data_size % chunk.data_end); return chunks; }