core/frame: set correct duration for newly constructed audio buffer
[nihav.git] / nihav-core / src / frame.rs
index 0fcdbcaa7526845f74ced9303431f7872d50e1c5..792bfb41953ee9915e9200a93e764ff51dc2b1c0 100644 (file)
@@ -112,17 +112,11 @@ impl NACodecTypeInfo {
     }
     /// Reports whether the current stream is video stream.
     pub fn is_video(&self) -> bool {
-        match *self {
-            NACodecTypeInfo::Video(_) => true,
-            _ => false,
-        }
+        matches!(*self, NACodecTypeInfo::Video(_))
     }
     /// Reports whether the current stream is audio stream.
     pub fn is_audio(&self) -> bool {
-        match *self {
-            NACodecTypeInfo::Audio(_) => true,
-            _ => false,
-        }
+        matches!(*self, NACodecTypeInfo::Audio(_))
     }
 }
 
@@ -150,6 +144,10 @@ pub struct NAVideoBuffer<T> {
 }
 
 impl<T: Clone> NAVideoBuffer<T> {
+    /// Constructs video buffer from the provided components.
+    pub fn from_raw_parts(info: NAVideoInfo, data: NABufferRef<Vec<T>>, offs: Vec<usize>, strides: Vec<usize>) -> Self {
+        Self { info, data, offs, strides }
+    }
     /// Returns the component offset (0 for all unavailable offsets).
     pub fn get_offset(&self, idx: usize) -> usize {
         if idx >= self.offs.len() { 0 }
@@ -164,7 +162,7 @@ impl<T: Clone> NAVideoBuffer<T> {
     /// Returns the number of components in picture format.
     pub fn get_num_components(&self) -> usize { self.offs.len() }
     /// Creates a copy of current `NAVideoBuffer`.
-    pub fn copy_buffer(&mut self) -> Self {
+    pub fn copy_buffer(&self) -> Self {
         let mut data: Vec<T> = Vec::with_capacity(self.data.len());
         data.clone_from(self.data.as_ref());
         let mut offs: Vec<usize> = Vec::with_capacity(self.offs.len());
@@ -273,7 +271,8 @@ impl<T: Clone> NAAudioBuffer<T> {
 impl NAAudioBuffer<u8> {
     /// Constructs a new `NAAudioBuffer` instance.
     pub fn new_from_buf(info: NAAudioInfo, data: NABufferRef<Vec<u8>>, 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 }
     }
 }
@@ -386,6 +385,17 @@ impl NABufferType {
             _ => 0,
         }
     }
+    /// Truncates audio frame duration if possible.
+    pub fn truncate_audio(&mut self, len: usize) {
+        match *self {
+            NABufferType::AudioU8(ref mut ab)     => ab.truncate(len),
+            NABufferType::AudioI16(ref mut ab)    => ab.truncate(len),
+            NABufferType::AudioI32(ref mut ab)    => ab.truncate(len),
+            NABufferType::AudioF32(ref mut ab)    => ab.truncate(len),
+            NABufferType::AudioPacked(ref mut ab) => ab.truncate(len),
+            _ => {},
+        };
+    }
     /// Returns the distance between starts of two channels.
     pub fn get_audio_stride(&self) -> usize {
         match *self {
@@ -545,10 +555,7 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType,
         }
         max_depth = max(max_depth, chr.get_depth());
     }
-    let unfit_elem_size = match fmt.get_elem_size() {
-            2 | 4 => false,
-            _ => true,
-        };
+    let unfit_elem_size = !matches!(fmt.get_elem_size(), 2 | 4);
 
 //todo semi-packed like NV12
     if fmt.is_paletted() {
@@ -737,7 +744,7 @@ impl<T:Copy> NAVideoBufferPool<T> {
     }
     /// Clears the pool from all frames.
     pub fn reset(&mut self) {
-        self.pool.truncate(0);
+        self.pool.clear();
     }
 }
 
@@ -812,11 +819,7 @@ pub type NACodecInfoRef = Arc<NACodecInfo>;
 impl NACodecInfo {
     /// Constructs a new instance of `NACodecInfo`.
     pub fn new(name: &'static str, p: NACodecTypeInfo, edata: Option<Vec<u8>>) -> Self {
-        let extradata = match edata {
-            None => None,
-            Some(vec) => Some(Arc::new(vec)),
-        };
-        NACodecInfo { name, properties: p, extradata }
+        NACodecInfo { name, properties: p, extradata: edata.map(Arc::new) }
     }
     /// Constructs a new reference-counted instance of `NACodecInfo`.
     pub fn new_ref(name: &'static str, p: NACodecTypeInfo, edata: Option<Arc<Vec<u8>>>) -> Self {
@@ -1130,7 +1133,7 @@ impl FromStr for NATimePoint {
                             let mut mval = 0;
                             let mut base = 0;
                             for ch in val.chars() {
-                                if ch >= '0' && ch <= '9' {
+                                if ('0'..='9').contains(&ch) {
                                     mval = mval * 10 + u64::from((ch as u8) - b'0');
                                     base += 1;
                                     if base > 3 { break; }
@@ -1342,7 +1345,11 @@ impl NAStream {
         self.tb_den = d;
     }
     /// Returns stream duration.
-    pub fn get_duration(&self) -> usize { self.num }
+    pub fn get_duration(&self) -> u64 { self.duration }
+    /// Constructs a new timestamp.
+    pub fn make_ts(&self, pts: Option<u64>, dts: Option<u64>, duration: Option<u64>) -> 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) }
 }
@@ -1429,6 +1436,37 @@ impl fmt::Display for NAPacket {
     }
 }
 
+/// Packet with a piece of data for a raw stream.
+pub struct NARawData {
+    stream:         NAStreamRef,
+    buffer:         NABufferRef<Vec<u8>>,
+}
+
+impl NARawData {
+    /// Constructs a new `NARawData` instance.
+    pub fn new(stream: NAStreamRef, vec: Vec<u8>) -> Self {
+        Self { stream, buffer: NABufferRef::new(vec) }
+    }
+    /// Constructs a new `NARawData` instance reusing a buffer reference.
+    pub fn new_from_refbuf(stream: NAStreamRef, buffer: NABufferRef<Vec<u8>>) -> Self {
+        Self { stream, buffer }
+    }
+    /// Returns information about the stream this data belongs to.
+    pub fn get_stream(&self) -> NAStreamRef { self.stream.clone() }
+    /// Returns a reference to packet data.
+    pub fn get_buffer(&self) -> NABufferRef<Vec<u8>> { self.buffer.clone() }
+    /// Assigns raw data to a new stream.
+    pub fn reassign(&mut self, stream: NAStreamRef) {
+        self.stream = stream;
+    }
+}
+
+impl fmt::Display for NARawData {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "[raw data for {} size {}]", self.stream, self.buffer.len())
+    }
+}
+
 #[cfg(test)]
 mod test {
     use super::*;