X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-core%2Fsrc%2Fframe.rs;h=af7b498e92811b1acd1c3697482b32e14aacd46f;hp=789088a47d4445e91662565fb314661b3d1aa86d;hb=01613464323864a655c994820d3c43df1954e3b2;hpb=3fc28ece6664a34af9b7f6a52dbf8a8809fa9204 diff --git a/nihav-core/src/frame.rs b/nihav-core/src/frame.rs index 789088a..af7b498 100644 --- a/nihav-core/src/frame.rs +++ b/nihav-core/src/frame.rs @@ -484,49 +484,89 @@ pub fn copy_buffer(buf: NABufferType) -> NABufferType { buf.clone() } -pub struct NABufferPool { - pool: Vec>, +pub struct NAVideoBufferPool { + pool: Vec>, max_len: usize, + add_len: usize, } -impl NABufferPool { +impl NAVideoBufferPool { pub fn new(max_len: usize) -> Self { Self { pool: Vec::with_capacity(max_len), max_len, + add_len: 0, } } + pub fn set_dec_bufs(&mut self, add_len: usize) { + self.add_len = add_len; + } + pub fn get_free(&mut self) -> Option> { + for e in self.pool.iter() { + if e.get_num_refs() == 1 { + return Some(e.clone()); + } + } + None + } + pub fn get_copy(&mut self, rbuf: &NAVideoBufferRef) -> Option> { + let res = self.get_free(); + if res.is_none() { + return None; + } + let mut dbuf = res.unwrap(); + dbuf.data.copy_from_slice(&rbuf.data); + Some(dbuf) + } + pub fn reset(&mut self) { + self.pool.truncate(0); + } +} + +impl NAVideoBufferPool { pub fn prealloc_video(&mut self, vinfo: NAVideoInfo, align: u8) -> Result<(), AllocatorError> { - let nbufs = self.max_len - self.pool.len(); + let nbufs = self.max_len + self.add_len - self.pool.len(); for _ in 0..nbufs { - let buf = alloc_video_buffer(vinfo.clone(), align)?; - self.pool.push(NABufferRef::new(buf)); + let vbuf = alloc_video_buffer(vinfo.clone(), align)?; + if let NABufferType::Video(buf) = vbuf { + self.pool.push(buf); + } else if let NABufferType::VideoPacked(buf) = vbuf { + self.pool.push(buf); + } else { + return Err(AllocatorError::FormatError); + } } Ok(()) } - pub fn prealloc_audio(&mut self, ainfo: NAAudioInfo, nsamples: usize, chmap: NAChannelMap) -> Result<(), AllocatorError> { - let nbufs = self.max_len - self.pool.len(); +} + +impl NAVideoBufferPool { + pub fn prealloc_video(&mut self, vinfo: NAVideoInfo, align: u8) -> Result<(), AllocatorError> { + let nbufs = self.max_len + self.add_len - self.pool.len(); for _ in 0..nbufs { - let buf = alloc_audio_buffer(ainfo.clone(), nsamples, chmap.clone())?; - self.pool.push(NABufferRef::new(buf)); + let vbuf = alloc_video_buffer(vinfo.clone(), align)?; + if let NABufferType::Video16(buf) = vbuf { + self.pool.push(buf); + } else { + return Err(AllocatorError::FormatError); + } } Ok(()) } - pub fn add(&mut self, buf: NABufferType) -> bool { - if self.pool.len() < self.max_len { - self.pool.push(NABufferRef::new(buf)); - true - } else { - false - } - } - pub fn get_free(&mut self) -> Option> { - for e in self.pool.iter() { - if e.get_num_refs() == 1 { - return Some(e.clone()); +} + +impl NAVideoBufferPool { + pub fn prealloc_video(&mut self, vinfo: NAVideoInfo, align: u8) -> Result<(), AllocatorError> { + let nbufs = self.max_len + self.add_len - self.pool.len(); + for _ in 0..nbufs { + let vbuf = alloc_video_buffer(vinfo.clone(), align)?; + if let NABufferType::Video32(buf) = vbuf { + self.pool.push(buf); + } else { + return Err(AllocatorError::FormatError); } } - None + Ok(()) } }