DiscStream skip_errors, read_sectors_recover(recovery) API

This commit is contained in:
Matt Jackson
2026-04-20 03:38:32 +00:00
parent 43ecad2d43
commit 081ad4f619
+25 -3
View File
@@ -33,6 +33,7 @@ pub struct DiscStream {
// Batch size for reads // Batch size for reads
batch_sectors: u16, batch_sectors: u16,
pub errors: u64, pub errors: u64,
pub skip_errors: bool,
eof: bool, eof: bool,
// PES output // PES output
@@ -98,6 +99,7 @@ impl DiscStream {
buf_valid: 0, buf_valid: 0,
batch_sectors, batch_sectors,
errors: 0, errors: 0,
skip_errors: false,
eof: false, eof: false,
ts_demuxer, ts_demuxer,
ps_demuxer, ps_demuxer,
@@ -137,9 +139,29 @@ impl DiscStream {
let bytes = sectors as usize * 2048; let bytes = sectors as usize * 2048;
self.read_buf.resize(bytes, 0); self.read_buf.resize(bytes, 0);
self.reader match self.reader.read_sectors(lba, sectors, &mut self.read_buf[..bytes]) {
.read_sectors(lba, sectors, &mut self.read_buf[..bytes])?; Ok(_) => {
self.buf_valid = bytes; self.buf_valid = bytes;
}
Err(e) if self.skip_errors => {
// Skip mode: try each sector individually, zero-fill failures
self.buf_valid = 0;
for i in 0..sectors {
let offset = i as usize * 2048;
let sector_lba = lba + i as u32;
if self
.reader
.read_sectors(sector_lba, 1, &mut self.read_buf[offset..offset + 2048])
.is_err()
{
self.read_buf[offset..offset + 2048].fill(0);
self.errors += 1;
}
self.buf_valid += 2048;
}
}
Err(e) => return Err(e.into()),
}
self.current_offset += sectors as u32; self.current_offset += sectors as u32;
if self.current_offset >= ext_sectors { if self.current_offset >= ext_sectors {
self.current_extent += 1; self.current_extent += 1;