X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fframe.rs;h=1bf5dec96cfcaec1ad2c5814e82321f308acef18;hb=e6aaad5c5273cd814b5748b7faf3751835a37217;hp=fbdbdf5e391f533e5c75c2fb90b4cd5f11d07248;hpb=6f2630992fe340ad1a122ec10c649f756e478185;p=nihav.git diff --git a/nihav-core/src/frame.rs b/nihav-core/src/frame.rs index fbdbdf5..1bf5dec 100644 --- a/nihav-core/src/frame.rs +++ b/nihav-core/src/frame.rs @@ -65,9 +65,9 @@ impl NAVideoInfo { NAVideoInfo { width: w, height: h, flipped: flip, format: fmt, bits } } /// Returns picture width. - pub fn get_width(&self) -> usize { self.width as usize } + pub fn get_width(&self) -> usize { self.width } /// Returns picture height. - pub fn get_height(&self) -> usize { self.height as usize } + pub fn get_height(&self) -> usize { self.height } /// Returns picture orientation. pub fn is_flipped(&self) -> bool { self.flipped } /// Returns picture pixel format. @@ -271,7 +271,8 @@ impl NAAudioBuffer { impl NAAudioBuffer { /// Constructs a new `NAAudioBuffer` instance. pub fn new_from_buf(info: NAAudioInfo, data: NABufferRef>, chmap: NAChannelMap) -> Self { - let len = data.len(); + let len = data.len() * 8 / chmap.num_channels() / (info.format.bits as usize); + NAAudioBuffer { info, data, chmap, offs: Vec::new(), len, stride: 0, step: 0 } } } @@ -534,12 +535,12 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result = Vec::new(); for i in 0..fmt.get_num_comp() { - if fmt.get_chromaton(i) == None { return Err(AllocatorError::FormatError); } + if fmt.get_chromaton(i).is_none() { return Err(AllocatorError::FormatError); } } let align_mod = ((1 << align) as usize) - 1; - let width = ((vinfo.width as usize) + align_mod) & !align_mod; - let height = ((vinfo.height as usize) + align_mod) & !align_mod; + let width = (vinfo.width + align_mod) & !align_mod; + let height = (vinfo.height + align_mod) & !align_mod; let mut max_depth = 0; let mut all_packed = true; let mut all_bytealigned = true; @@ -561,10 +562,10 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result Result Result = vec![0; new_size]; strides.push(line_sz.unwrap()); @@ -613,7 +614,7 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result { @@ -635,11 +636,12 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result Result { let mut offs: Vec = Vec::new(); if ainfo.format.is_planar() || ((ainfo.format.get_bits() % 8) == 0) { let len = nsamples.checked_mul(ainfo.channels as usize); - if len == None { return Err(AllocatorError::TooLargeDimensions); } + if len.is_none() { return Err(AllocatorError::TooLargeDimensions); } let length = len.unwrap(); let stride; let step; @@ -683,7 +685,7 @@ pub fn alloc_audio_buffer(ainfo: NAAudioInfo, nsamples: usize, chmap: NAChannelM } } else { let len = nsamples.checked_mul(ainfo.channels as usize); - if len == None { return Err(AllocatorError::TooLargeDimensions); } + if len.is_none() { return Err(AllocatorError::TooLargeDimensions); } let length = ainfo.format.get_audio_size(len.unwrap() as u64); let data: Vec = vec![0; length]; let buf: NAAudioBuffer = NAAudioBuffer { data: NABufferRef::new(data), info: ainfo, offs, chmap, len: nsamples, stride: 0, step: 0 }; @@ -745,6 +747,22 @@ impl NAVideoBufferPool { pub fn reset(&mut self) { self.pool.clear(); } + /// Returns the number of frames currently in use. + pub fn get_num_used(&self) -> usize { + self.pool.iter().filter(|el| el.get_num_refs() != 1).count() + } + /// Adds a manually allocated frame to the pool. + pub fn add_frame(&mut self, buf: NAVideoBufferRef) { + self.pool.push(buf); + } + /// Returns current video format (if available). + pub fn get_info(&self) -> Option { + if !self.pool.is_empty() { + Some(self.pool[0].get_info()) + } else { + None + } + } } impl NAVideoBufferPool { @@ -940,6 +958,7 @@ impl NATimeInfo { /// Converts time in given scale into timestamp in given base. #[allow(clippy::collapsible_if)] + #[allow(clippy::collapsible_else_if)] pub fn time_to_ts(time: u64, base: u64, tb_num: u32, tb_den: u32) -> u64 { let tb_num = u64::from(tb_num); let tb_den = u64::from(tb_den); @@ -1015,22 +1034,17 @@ impl NATimeInfo { } /// Time information for specifying durations or seek positions. -#[derive(Clone,Copy,Debug,PartialEq)] +#[derive(Clone,Copy,Debug,PartialEq,Default)] pub enum NATimePoint { /// Time in milliseconds. Milliseconds(u64), /// Stream timestamp. PTS(u64), /// No time information present. + #[default] None, } -impl Default for NATimePoint { - fn default() -> Self { - NATimePoint::None - } -} - impl fmt::Display for NATimePoint { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { @@ -1132,7 +1146,7 @@ impl FromStr for NATimePoint { let mut mval = 0; let mut base = 0; for ch in val.chars() { - if ('0'..='9').contains(&ch) { + if ch.is_ascii_digit() { mval = mval * 10 + u64::from((ch as u8) - b'0'); base += 1; if base > 3 { break; } @@ -1345,6 +1359,10 @@ impl NAStream { } /// Returns stream duration. pub fn get_duration(&self) -> u64 { self.duration } + /// Constructs a new timestamp. + pub fn make_ts(&self, pts: Option, dts: Option, duration: Option) -> NATimeInfo { + NATimeInfo::new(pts, dts, duration, self.tb_num, self.tb_den) + } /// Converts current instance into a reference-counted one. pub fn into_ref(self) -> NAStreamRef { Arc::new(self) } } @@ -1383,14 +1401,14 @@ pub struct NAPacket { impl NAPacket { /// Constructs a new `NAPacket` instance. - pub fn new(str: NAStreamRef, ts: NATimeInfo, kf: bool, vec: Vec) -> Self { + pub fn new(stream: NAStreamRef, ts: NATimeInfo, kf: bool, vec: Vec) -> Self { // let mut vec: Vec = Vec::new(); // vec.resize(size, 0); - NAPacket { stream: str, ts, keyframe: kf, buffer: NABufferRef::new(vec), side_data: Vec::new() } + NAPacket { stream, ts, keyframe: kf, buffer: NABufferRef::new(vec), side_data: Vec::new() } } /// Constructs a new `NAPacket` instance reusing a buffer reference. - pub fn new_from_refbuf(str: NAStreamRef, ts: NATimeInfo, kf: bool, buffer: NABufferRef>) -> Self { - NAPacket { stream: str, ts, keyframe: kf, buffer, side_data: Vec::new() } + pub fn new_from_refbuf(stream: NAStreamRef, ts: NATimeInfo, kf: bool, buffer: NABufferRef>) -> Self { + NAPacket { stream, ts, keyframe: kf, buffer, side_data: Vec::new() } } /// Returns information about the stream packet belongs to. pub fn get_stream(&self) -> NAStreamRef { self.stream.clone() } @@ -1409,8 +1427,8 @@ impl NAPacket { /// Adds side data for a packet. pub fn add_side_data(&mut self, side_data: NASideData) { self.side_data.push(side_data); } /// Assigns packet to a new stream. - pub fn reassign(&mut self, str: NAStreamRef, ts: NATimeInfo) { - self.stream = str; + pub fn reassign(&mut self, stream: NAStreamRef, ts: NATimeInfo) { + self.stream = stream; self.ts = ts; } }