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; } }
bool mpeg_es_reader_c::read_frame(M2VParser &parser, mm_io_c &in, int64_t max_size) { auto af_buffer = memory_c::alloc(READ_SIZE); auto buffer = af_buffer->get_buffer(); int bytes_probed = 0; while (true) { auto state = parser.GetState(); if (MPV_PARSER_STATE_FRAME == state) return true; if ((MPV_PARSER_STATE_EOS == state) || (MPV_PARSER_STATE_ERROR == state)) return false; assert(MPV_PARSER_STATE_NEED_DATA == state); if ((max_size != -1) && (bytes_probed > max_size)) return false; int bytes_read = in.read(buffer, std::min<int>(parser.GetFreeBufferSpace(), READ_SIZE)); if (!bytes_read) return false; bytes_probed += bytes_read; parser.WriteData(buffer, bytes_read); parser.SetEOS(); } }
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; } }
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; } }
bool mpeg_es_reader_c::read_frame(M2VParser &parser, mm_io_c &in, int64_t max_size) { int bytes_probed; bytes_probed = 0; while (true) { int state; state = parser.GetState(); if (MPV_PARSER_STATE_NEED_DATA == state) { if ((max_size != -1) && (bytes_probed > max_size)) return false; int bytes_to_read = (parser.GetFreeBufferSpace() < READ_SIZE) ? parser.GetFreeBufferSpace() : READ_SIZE; unsigned char *buffer = new unsigned char[bytes_to_read]; int bytes_read = in.read(buffer, bytes_to_read); if (0 == bytes_read) { delete [] buffer; break; } bytes_probed += bytes_read; parser.WriteData(buffer, bytes_read); parser.SetEOS(); delete [] buffer; } else if (MPV_PARSER_STATE_FRAME == state) return true; else if ((MPV_PARSER_STATE_EOS == state) || (MPV_PARSER_STATE_ERROR == state)) return false; } return false; }