X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fframe.rs;h=4e317fe3e76edc36d02bdb95ee4aa48c3fbe14c1;hb=b3247252f111872574c1aa3dc993f11d8aa66282;hp=67f17272c941e029cdf907c10231ccc08e8b44fe;hpb=fdf4b0701abb464e70e396351790e2203f4a9ae5;p=nihav.git diff --git a/nihav-core/src/frame.rs b/nihav-core/src/frame.rs index 67f1727..4e317fe 100644 --- a/nihav-core/src/frame.rs +++ b/nihav-core/src/frame.rs @@ -2,7 +2,7 @@ use std::cmp::max; //use std::collections::HashMap; use std::fmt; -use std::sync::Arc; +pub use std::sync::Arc; pub use crate::formats::*; pub use crate::refs::*; @@ -182,6 +182,21 @@ impl NAVideoBuffer { pub fn into_ref(self) -> NABufferRef { NABufferRef::new(self) } + + fn print_contents(&self, datatype: &str) { + println!("{} video buffer size {}", datatype, self.data.len()); + println!(" format {}", self.info); + print!(" offsets:"); + for off in self.offs.iter() { + print!(" {}", *off); + } + println!(); + print!(" strides:"); + for stride in self.strides.iter() { + print!(" {}", *stride); + } + println!(); + } } /// A specialised type for reference-counted `NAVideoBuffer`. @@ -230,6 +245,17 @@ impl NAAudioBuffer { } /// Return the length of frame in samples. pub fn get_length(&self) -> usize { self.len } + + fn print_contents(&self, datatype: &str) { + println!("Audio buffer with {} data, stride {}, step {}", datatype, self.stride, self.step); + println!(" format {}", self.info); + println!(" channel map {}", self.chmap); + print!(" offsets:"); + for off in self.offs.iter() { + print!(" {}", *off); + } + println!(); + } } impl NAAudioBuffer { @@ -399,6 +425,22 @@ impl NABufferType { _ => None, } } + /// Prints internal buffer layout. + pub fn print_buffer_metadata(&self) { + match *self { + NABufferType::Video(ref buf) => buf.print_contents("8-bit"), + NABufferType::Video16(ref buf) => buf.print_contents("16-bit"), + NABufferType::Video32(ref buf) => buf.print_contents("32-bit"), + NABufferType::VideoPacked(ref buf) => buf.print_contents("packed"), + NABufferType::AudioU8(ref buf) => buf.print_contents("8-bit unsigned integer"), + NABufferType::AudioI16(ref buf) => buf.print_contents("16-bit integer"), + NABufferType::AudioI32(ref buf) => buf.print_contents("32-bit integer"), + NABufferType::AudioF32(ref buf) => buf.print_contents("32-bit float"), + NABufferType::AudioPacked(ref buf) => buf.print_contents("packed"), + NABufferType::Data(ref buf) => { println!("Data buffer, len = {}", buf.len()); }, + NABufferType::None => { println!("No buffer"); }, + }; + } } const NA_SIMPLE_VFRAME_COMPONENTS: usize = 4; @@ -815,21 +857,6 @@ pub const DUMMY_CODEC_INFO: NACodecInfo = NACodecInfo { properties: NACodecTypeInfo::None, extradata: None }; -/// A list of accepted option values. -#[derive(Debug,Clone)] -pub enum NAValue { - /// Empty value. - None, - /// Integer value. - Int(i32), - /// Long integer value. - Long(i64), - /// String value. - String(String), - /// Binary data value. - Data(Arc>), -} - /// A list of recognized frame types. #[derive(Debug,Clone,Copy,PartialEq)] #[allow(dead_code)] @@ -1125,6 +1152,18 @@ impl fmt::Display for NAStream { } } +/// Side data that may accompany demuxed data. +#[derive(Clone)] +pub enum NASideData { + /// Palette information. + /// + /// This side data contains a flag signalling that palette has changed since previous time and a reference to the current palette. + /// Palette is stored in 8-bit RGBA format. + Palette(bool, Arc<[u8; 1024]>), + /// Generic user data. + UserData(Arc>), +} + /// Packet with compressed data. #[allow(dead_code)] pub struct NAPacket { @@ -1135,6 +1174,8 @@ pub struct NAPacket { /// Keyframe flag. pub keyframe: bool, // options: HashMap>, + /// Packet side data (e.g. palette for paletted formats). + pub side_data: Vec, } impl NAPacket { @@ -1142,7 +1183,7 @@ impl NAPacket { pub fn new(str: 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) } + NAPacket { stream: str, ts, keyframe: kf, buffer: NABufferRef::new(vec), side_data: Vec::new() } } /// Returns information about the stream packet belongs to. pub fn get_stream(&self) -> NAStreamRef { self.stream.clone() } @@ -1158,6 +1199,13 @@ impl NAPacket { pub fn is_keyframe(&self) -> bool { self.keyframe } /// Returns a reference to packet data. pub fn get_buffer(&self) -> NABufferRef> { self.buffer.clone() } + /// 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; + self.ts = ts; + } } impl Drop for NAPacket {