DiscStream skip_errors, read_sectors_recover(recovery) API
This commit is contained in:
+24
-2
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user