Fix all clippy warnings: dead code, match patterns, type complexity, docs
- Remove unused pes_buf field from M2tsStream and unused TS_PACKET/BD_TS_PACKET constants - Replace match-with-single-pattern with if let (3 instances in drive/mod.rs) - Replace match-can-be-? with ? operator for scsi::open call - Add type aliases PesSetup and MkvHeaderResult to reduce type complexity - Collapse identical if/else branches in tsmux.rs build_pes_header - Use RangeInclusive::contains instead of manual range checks - Make WriteSeek trait pub (was pub(crate) but leaked through pub fn) - Remove empty line after doc comment in disc.rs - Fix doc list item indentation in scsi/linux.rs (12 instances)
This commit is contained in:
+4
-16
@@ -428,10 +428,9 @@ impl Drive {
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Normal read
|
// Normal read
|
||||||
match self.scsi.as_mut().execute(
|
if let Ok(result) = self.scsi.as_mut().execute(
|
||||||
&cdb, crate::scsi::DataDirection::FromDevice, buf, timeout_ms,
|
&cdb, crate::scsi::DataDirection::FromDevice, buf, timeout_ms,
|
||||||
) {
|
) {
|
||||||
Ok(result) => {
|
|
||||||
if self.recovery_bytes_remaining > 0 {
|
if self.recovery_bytes_remaining > 0 {
|
||||||
let bytes_read = count as u64 * 2048;
|
let bytes_read = count as u64 * 2048;
|
||||||
self.recovery_bytes_remaining =
|
self.recovery_bytes_remaining =
|
||||||
@@ -442,8 +441,6 @@ impl Drive {
|
|||||||
}
|
}
|
||||||
return Ok(result.bytes_transferred);
|
return Ok(result.bytes_transferred);
|
||||||
}
|
}
|
||||||
Err(_) => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Phase 1: gentle — sleep 30s, retry. 5 times.
|
// Phase 1: gentle — sleep 30s, retry. 5 times.
|
||||||
self.set_speed(0);
|
self.set_speed(0);
|
||||||
@@ -451,15 +448,12 @@ impl Drive {
|
|||||||
for _ in 0..5 {
|
for _ in 0..5 {
|
||||||
std::thread::sleep(std::time::Duration::from_secs(30));
|
std::thread::sleep(std::time::Duration::from_secs(30));
|
||||||
|
|
||||||
match self.scsi.as_mut().execute(
|
if let Ok(result) = self.scsi.as_mut().execute(
|
||||||
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
||||||
) {
|
) {
|
||||||
Ok(result) => {
|
|
||||||
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
||||||
return Ok(result.bytes_transferred);
|
return Ok(result.bytes_transferred);
|
||||||
}
|
}
|
||||||
Err(_) => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Phase 2: fresh start — close, reset, open, init.
|
// Phase 2: fresh start — close, reset, open, init.
|
||||||
@@ -467,10 +461,7 @@ impl Drive {
|
|||||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||||
let _ = crate::scsi::reset(&device);
|
let _ = crate::scsi::reset(&device);
|
||||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||||
self.scsi = match crate::scsi::open(&device) {
|
self.scsi = crate::scsi::open(&device)?;
|
||||||
Ok(s) => s,
|
|
||||||
Err(e) => return Err(e),
|
|
||||||
};
|
|
||||||
let _ = self.init();
|
let _ = self.init();
|
||||||
let _ = self.wait_ready();
|
let _ = self.wait_ready();
|
||||||
self.set_speed(0);
|
self.set_speed(0);
|
||||||
@@ -479,15 +470,12 @@ impl Drive {
|
|||||||
for _ in 0..5 {
|
for _ in 0..5 {
|
||||||
std::thread::sleep(std::time::Duration::from_secs(30));
|
std::thread::sleep(std::time::Duration::from_secs(30));
|
||||||
|
|
||||||
match self.scsi.as_mut().execute(
|
if let Ok(result) = self.scsi.as_mut().execute(
|
||||||
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
||||||
) {
|
) {
|
||||||
Ok(result) => {
|
|
||||||
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
||||||
return Ok(result.bytes_transferred);
|
return Ok(result.bytes_transferred);
|
||||||
}
|
}
|
||||||
Err(_) => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Both phases failed.
|
// Both phases failed.
|
||||||
|
|||||||
@@ -166,7 +166,6 @@ impl DiscStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set SCSI read timeout (default 30s).
|
/// Set SCSI read timeout (default 30s).
|
||||||
|
|
||||||
fn new(drive: Drive, title: DiscTitle, mode: ReadMode, max_batch: u16) -> Self {
|
fn new(drive: Drive, title: DiscTitle, mode: ReadMode, max_batch: u16) -> Self {
|
||||||
// Set up PES demux from title stream PIDs
|
// Set up PES demux from title stream PIDs
|
||||||
let mut pids = Vec::new();
|
let mut pids = Vec::new();
|
||||||
|
|||||||
+3
-5
@@ -7,6 +7,8 @@ use super::{meta, ts, IOStream, ReadSeek};
|
|||||||
use crate::disc::{DiscTitle, Stream as DiscStream};
|
use crate::disc::{DiscTitle, Stream as DiscStream};
|
||||||
use std::io::{self, Read, Seek, SeekFrom, Write};
|
use std::io::{self, Read, Seek, SeekFrom, Write};
|
||||||
|
|
||||||
|
type PesSetup = (Vec<u16>, Vec<(u16, Box<dyn super::codec::CodecParser>)>, Vec<(u16, usize)>);
|
||||||
|
|
||||||
/// Size of initial scan buffer for PMT/stream detection.
|
/// Size of initial scan buffer for PMT/stream detection.
|
||||||
const SCAN_SIZE: usize = 1024 * 1024;
|
const SCAN_SIZE: usize = 1024 * 1024;
|
||||||
|
|
||||||
@@ -32,7 +34,6 @@ pub struct M2tsStream {
|
|||||||
parsers: Vec<(u16, Box<dyn super::codec::CodecParser>)>,
|
parsers: Vec<(u16, Box<dyn super::codec::CodecParser>)>,
|
||||||
pending_frames: std::collections::VecDeque<crate::pes::PesFrame>,
|
pending_frames: std::collections::VecDeque<crate::pes::PesFrame>,
|
||||||
pid_to_track: Vec<(u16, usize)>,
|
pid_to_track: Vec<(u16, usize)>,
|
||||||
pes_buf: Vec<u8>,
|
|
||||||
pes_eof: bool,
|
pes_eof: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,12 +52,11 @@ impl M2tsStream {
|
|||||||
parsers: Vec::new(),
|
parsers: Vec::new(),
|
||||||
pending_frames: std::collections::VecDeque::new(),
|
pending_frames: std::collections::VecDeque::new(),
|
||||||
pid_to_track: Vec::new(),
|
pid_to_track: Vec::new(),
|
||||||
pes_buf: Vec::new(),
|
|
||||||
pes_eof: false,
|
pes_eof: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_pes(streams: &[DiscStream]) -> (Vec<u16>, Vec<(u16, Box<dyn super::codec::CodecParser>)>, Vec<(u16, usize)>) {
|
fn setup_pes(streams: &[DiscStream]) -> PesSetup {
|
||||||
let mut pids = Vec::new();
|
let mut pids = Vec::new();
|
||||||
let mut parsers: Vec<(u16, Box<dyn super::codec::CodecParser>)> = Vec::new();
|
let mut parsers: Vec<(u16, Box<dyn super::codec::CodecParser>)> = Vec::new();
|
||||||
let mut pid_to_track = Vec::new();
|
let mut pid_to_track = Vec::new();
|
||||||
@@ -104,7 +104,6 @@ impl M2tsStream {
|
|||||||
parsers,
|
parsers,
|
||||||
pending_frames: std::collections::VecDeque::new(),
|
pending_frames: std::collections::VecDeque::new(),
|
||||||
pid_to_track,
|
pid_to_track,
|
||||||
pes_buf: vec![0u8; 192 * 1024],
|
|
||||||
pes_eof: false,
|
pes_eof: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -144,7 +143,6 @@ impl M2tsStream {
|
|||||||
parsers,
|
parsers,
|
||||||
pending_frames: std::collections::VecDeque::new(),
|
pending_frames: std::collections::VecDeque::new(),
|
||||||
pid_to_track,
|
pid_to_track,
|
||||||
pes_buf: vec![0u8; 192 * 1024],
|
|
||||||
pes_eof: false,
|
pes_eof: false,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ use super::lookahead::{LookaheadBuffer, LookaheadState, DEFAULT_LOOKAHEAD_SIZE};
|
|||||||
use super::mkv::{MkvMuxer, MkvTrack};
|
use super::mkv::{MkvMuxer, MkvTrack};
|
||||||
use super::ts::TsDemuxer;
|
use super::ts::TsDemuxer;
|
||||||
use super::{ebml, IOStream, ReadSeek, WriteSeek};
|
use super::{ebml, IOStream, ReadSeek, WriteSeek};
|
||||||
|
|
||||||
|
type MkvHeaderResult = io::Result<(crate::disc::DiscTitle, Vec<(u16, Vec<u8>)>)>;
|
||||||
use crate::disc::*;
|
use crate::disc::*;
|
||||||
use std::io::{self, Read, Seek, SeekFrom, Write};
|
use std::io::{self, Read, Seek, SeekFrom, Write};
|
||||||
|
|
||||||
@@ -462,7 +464,7 @@ fn write_pes(
|
|||||||
/// Returns (DiscTitle, codec_privates: Vec<(track_number, codec_private_bytes)>)
|
/// Returns (DiscTitle, codec_privates: Vec<(track_number, codec_private_bytes)>)
|
||||||
fn parse_mkv_header(
|
fn parse_mkv_header(
|
||||||
r: &mut (impl Read + Seek),
|
r: &mut (impl Read + Seek),
|
||||||
) -> io::Result<(DiscTitle, Vec<(u16, Vec<u8>)>)> {
|
) -> MkvHeaderResult {
|
||||||
let mut title = String::new();
|
let mut title = String::new();
|
||||||
let mut duration_ms = 0.0f64;
|
let mut duration_ms = 0.0f64;
|
||||||
let mut ts_scale: u64 = 1_000_000;
|
let mut ts_scale: u64 = 1_000_000;
|
||||||
|
|||||||
+1
-1
@@ -79,5 +79,5 @@ pub trait IOStream: Read + Write {
|
|||||||
pub(crate) trait ReadSeek: Read + Seek {}
|
pub(crate) trait ReadSeek: Read + Seek {}
|
||||||
impl<T: Read + Seek> ReadSeek for T {}
|
impl<T: Read + Seek> ReadSeek for T {}
|
||||||
|
|
||||||
pub(crate) trait WriteSeek: Write + Seek {}
|
pub trait WriteSeek: Write + Seek {}
|
||||||
impl<T: Write + Seek> WriteSeek for T {}
|
impl<T: Write + Seek> WriteSeek for T {}
|
||||||
|
|||||||
+2
-8
@@ -8,8 +8,6 @@ use std::io::{self, Write};
|
|||||||
|
|
||||||
const SYNC_BYTE: u8 = 0x47;
|
const SYNC_BYTE: u8 = 0x47;
|
||||||
const TS_PAYLOAD: usize = 184;
|
const TS_PAYLOAD: usize = 184;
|
||||||
const TS_PACKET: usize = 188;
|
|
||||||
const BD_TS_PACKET: usize = 192;
|
|
||||||
|
|
||||||
pub struct TsMuxer<W: Write> {
|
pub struct TsMuxer<W: Write> {
|
||||||
writer: W,
|
writer: W,
|
||||||
@@ -112,14 +110,10 @@ impl<W: Write> TsMuxer<W> {
|
|||||||
/// Build a PES packet header for a BD stream.
|
/// Build a PES packet header for a BD stream.
|
||||||
fn build_pes_header(pid: u16, pts_90k: u64, data_len: usize) -> Vec<u8> {
|
fn build_pes_header(pid: u16, pts_90k: u64, data_len: usize) -> Vec<u8> {
|
||||||
// Determine stream_id from PID range
|
// Determine stream_id from PID range
|
||||||
let stream_id: u8 = if pid >= 0x1011 && pid <= 0x101F {
|
let stream_id: u8 = if (0x1011..=0x101F).contains(&pid) {
|
||||||
0xE0 // video
|
0xE0 // video
|
||||||
} else if pid >= 0x1100 && pid <= 0x111F {
|
|
||||||
0xBD // audio (private stream 1)
|
|
||||||
} else if pid >= 0x1200 && pid <= 0x121F {
|
|
||||||
0xBD // PGS subtitle
|
|
||||||
} else {
|
} else {
|
||||||
0xBD // default
|
0xBD // audio, PGS subtitle, or default (private stream 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
let pes_data_len = data_len + 8; // 3 header bytes + 5 PTS bytes + data
|
let pes_data_len = data_len + 8; // 3 header bytes + 5 PTS bytes + data
|
||||||
|
|||||||
+2
-2
@@ -96,9 +96,9 @@ impl SgIoTransport {
|
|||||||
/// 6. **TUR** — TEST UNIT READY (CDB 0x00) with 3s timeout. If the
|
/// 6. **TUR** — TEST UNIT READY (CDB 0x00) with 3s timeout. If the
|
||||||
/// drive responds, it's in a good state.
|
/// drive responds, it's in a good state.
|
||||||
/// 7. **escalate** — if TUR fails:
|
/// 7. **escalate** — if TUR fails:
|
||||||
/// a. SG_SCSI_RESET (device level) — kernel sends a SCSI
|
/// - SG_SCSI_RESET (device level) — kernel sends a SCSI
|
||||||
/// bus reset to the device, clearing all firmware state.
|
/// bus reset to the device, clearing all firmware state.
|
||||||
/// b. STOP + START UNIT (CDB 0x1B) — power-cycles the
|
/// - STOP + START UNIT (CDB 0x1B) — power-cycles the
|
||||||
/// drive's logical unit, like pressing the eject button
|
/// drive's logical unit, like pressing the eject button
|
||||||
/// and reinserting.
|
/// and reinserting.
|
||||||
/// 8. **close** — release the fd. Drive is clean, nobody holds it.
|
/// 8. **close** — release the fd. Drive is clean, nobody holds it.
|
||||||
|
|||||||
Reference in New Issue
Block a user