aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2019-04-30 15:54:06 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2019-04-30 15:54:06 +0200
commit3fc28ece6664a34af9b7f6a52dbf8a8809fa9204 (patch)
tree696e5ad69db2abf1cdb2340143956f64702f65fa
parentcbc3c7a23f8d41c9cb395252a6b795817b5aec96 (diff)
downloadnihav-3fc28ece6664a34af9b7f6a52dbf8a8809fa9204.tar.gz
switch NABufferType to use refs for video buffers
-rw-r--r--nihav-core/src/codecs/mod.rs32
-rw-r--r--nihav-core/src/frame.rs33
-rw-r--r--nihav-duck/src/codecs/truemotion1.rs20
-rw-r--r--nihav-realmedia/src/codecs/rv3040.rs4
-rw-r--r--nihav-realmedia/src/codecs/rv60.rs2
5 files changed, 48 insertions, 43 deletions
diff --git a/nihav-core/src/codecs/mod.rs b/nihav-core/src/codecs/mod.rs
index 692269e..4f81d9e 100644
--- a/nihav-core/src/codecs/mod.rs
+++ b/nihav-core/src/codecs/mod.rs
@@ -45,7 +45,7 @@ impl From<AllocatorError> for DecoderError {
#[allow(dead_code)]
pub struct HAMShuffler {
- lastframe: Option<NAVideoBuffer<u8>>,
+ lastframe: Option<NAVideoBufferRef<u8>>,
}
impl HAMShuffler {
@@ -54,21 +54,21 @@ impl HAMShuffler {
#[allow(dead_code)]
pub fn clear(&mut self) { self.lastframe = None; }
#[allow(dead_code)]
- pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+ pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
self.lastframe = Some(buf);
}
#[allow(dead_code)]
- pub fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn clone_ref(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref mut frm) = self.lastframe {
let newfrm = frm.copy_buffer();
- *frm = newfrm.clone();
- Some(newfrm)
+ *frm = newfrm.clone().into_ref();
+ Some(newfrm.into_ref())
} else {
None
}
}
#[allow(dead_code)]
- pub fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_output_frame(&mut self) -> Option<NAVideoBufferRef<u8>> {
match self.lastframe {
Some(ref frm) => Some(frm.clone()),
None => None,
@@ -82,7 +82,7 @@ impl Default for HAMShuffler {
#[allow(dead_code)]
pub struct IPShuffler {
- lastframe: Option<NAVideoBuffer<u8>>,
+ lastframe: Option<NAVideoBufferRef<u8>>,
}
impl IPShuffler {
@@ -91,11 +91,11 @@ impl IPShuffler {
#[allow(dead_code)]
pub fn clear(&mut self) { self.lastframe = None; }
#[allow(dead_code)]
- pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+ pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
self.lastframe = Some(buf);
}
#[allow(dead_code)]
- pub fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_ref(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref frm) = self.lastframe {
Some(frm.clone())
} else {
@@ -110,8 +110,8 @@ impl Default for IPShuffler {
#[allow(dead_code)]
pub struct IPBShuffler {
- lastframe: Option<NAVideoBuffer<u8>>,
- nextframe: Option<NAVideoBuffer<u8>>,
+ lastframe: Option<NAVideoBufferRef<u8>>,
+ nextframe: Option<NAVideoBufferRef<u8>>,
}
impl IPBShuffler {
@@ -120,12 +120,12 @@ impl IPBShuffler {
#[allow(dead_code)]
pub fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
#[allow(dead_code)]
- pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+ pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
mem::swap(&mut self.lastframe, &mut self.nextframe);
self.lastframe = Some(buf);
}
#[allow(dead_code)]
- pub fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_lastref(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref frm) = self.lastframe {
Some(frm.clone())
} else {
@@ -133,7 +133,7 @@ impl IPBShuffler {
}
}
#[allow(dead_code)]
- pub fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_nextref(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref frm) = self.nextframe {
Some(frm.clone())
} else {
@@ -141,7 +141,7 @@ impl IPBShuffler {
}
}
#[allow(dead_code)]
- pub fn get_b_fwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_b_fwdref(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref frm) = self.nextframe {
Some(frm.clone())
} else {
@@ -149,7 +149,7 @@ impl IPBShuffler {
}
}
#[allow(dead_code)]
- pub fn get_b_bwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_b_bwdref(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref frm) = self.lastframe {
Some(frm.clone())
} else {
diff --git a/nihav-core/src/frame.rs b/nihav-core/src/frame.rs
index d219ee4..789088a 100644
--- a/nihav-core/src/frame.rs
+++ b/nihav-core/src/frame.rs
@@ -134,8 +134,13 @@ impl<T: Clone> NAVideoBuffer<T> {
pub fn get_dimensions(&self, idx: usize) -> (usize, usize) {
get_plane_size(&self.info, idx)
}
+ pub fn into_ref(self) -> NABufferRef<Self> {
+ NABufferRef::new(self)
+ }
}
+pub type NAVideoBufferRef<T> = NABufferRef<NAVideoBuffer<T>>;
+
#[derive(Clone)]
pub struct NAAudioBuffer<T> {
info: NAAudioInfo,
@@ -173,10 +178,10 @@ impl NAAudioBuffer<u8> {
#[derive(Clone)]
pub enum NABufferType {
- Video (NAVideoBuffer<u8>),
- Video16 (NAVideoBuffer<u16>),
- Video32 (NAVideoBuffer<u32>),
- VideoPacked(NAVideoBuffer<u8>),
+ Video (NAVideoBufferRef<u8>),
+ Video16 (NAVideoBufferRef<u16>),
+ Video32 (NAVideoBufferRef<u32>),
+ VideoPacked(NAVideoBufferRef<u8>),
AudioU8 (NAAudioBuffer<u8>),
AudioI16 (NAAudioBuffer<i16>),
AudioI32 (NAAudioBuffer<i32>),
@@ -209,20 +214,20 @@ impl NABufferType {
_ => None,
}
}
- pub fn get_vbuf(&self) -> Option<NAVideoBuffer<u8>> {
+ pub fn get_vbuf(&self) -> Option<NAVideoBufferRef<u8>> {
match *self {
NABufferType::Video(ref vb) => Some(vb.clone()),
NABufferType::VideoPacked(ref vb) => Some(vb.clone()),
_ => None,
}
}
- pub fn get_vbuf16(&self) -> Option<NAVideoBuffer<u16>> {
+ pub fn get_vbuf16(&self) -> Option<NAVideoBufferRef<u16>> {
match *self {
NABufferType::Video16(ref vb) => Some(vb.clone()),
_ => None,
}
}
- pub fn get_vbuf32(&self) -> Option<NAVideoBuffer<u32>> {
+ pub fn get_vbuf32(&self) -> Option<NAVideoBufferRef<u32>> {
match *self {
NABufferType::Video32(ref vb) => Some(vb.clone()),
_ => None,
@@ -350,7 +355,7 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType,
let mut data: Vec<u8> = Vec::with_capacity(new_size.unwrap());
data.resize(new_size.unwrap(), 0);
let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video(buf))
+ Ok(NABufferType::Video(buf.into_ref()))
} else if !all_packed {
for i in 0..fmt.get_num_comp() {
let ochr = fmt.get_chromaton(i);
@@ -375,17 +380,17 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType,
let mut data: Vec<u8> = Vec::with_capacity(new_size);
data.resize(new_size, 0);
let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video(buf))
+ Ok(NABufferType::Video(buf.into_ref()))
} else if max_depth <= 16 {
let mut data: Vec<u16> = Vec::with_capacity(new_size);
data.resize(new_size, 0);
let buf: NAVideoBuffer<u16> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video16(buf))
+ Ok(NABufferType::Video16(buf.into_ref()))
} else {
let mut data: Vec<u32> = Vec::with_capacity(new_size);
data.resize(new_size, 0);
let buf: NAVideoBuffer<u32> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video32(buf))
+ Ok(NABufferType::Video32(buf.into_ref()))
}
} else if all_bytealigned || unfit_elem_size {
let elem_sz = fmt.get_elem_size();
@@ -398,7 +403,7 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType,
data.resize(new_size, 0);
strides.push(line_sz.unwrap());
let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::VideoPacked(buf))
+ Ok(NABufferType::VideoPacked(buf.into_ref()))
} else {
let elem_sz = fmt.get_elem_size();
let new_sz = width.checked_mul(height);
@@ -410,14 +415,14 @@ pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType,
data.resize(new_size, 0);
strides.push(width);
let buf: NAVideoBuffer<u16> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video16(buf))
+ Ok(NABufferType::Video16(buf.into_ref()))
},
4 => {
let mut data: Vec<u32> = Vec::with_capacity(new_size);
data.resize(new_size, 0);
strides.push(width);
let buf: NAVideoBuffer<u32> = NAVideoBuffer { data: NABufferRef::new(data), info: vinfo, offs: offs, strides: strides };
- Ok(NABufferType::Video32(buf))
+ Ok(NABufferType::Video32(buf.into_ref()))
},
_ => unreachable!(),
}
diff --git a/nihav-duck/src/codecs/truemotion1.rs b/nihav-duck/src/codecs/truemotion1.rs
index b8edd4e..c205b3c 100644
--- a/nihav-duck/src/codecs/truemotion1.rs
+++ b/nihav-duck/src/codecs/truemotion1.rs
@@ -129,27 +129,27 @@ impl Default for DeltaTables {
}
struct FrameBuf {
- last16: Option<NAVideoBuffer<u16>>,
- last24: Option<NAVideoBuffer<u8>>,
+ last16: Option<NAVideoBufferRef<u16>>,
+ last24: Option<NAVideoBufferRef<u8>>,
}
impl FrameBuf {
- fn set16(&mut self, buf: NAVideoBuffer<u16>) { self.last16 = Some(buf); }
- fn set24(&mut self, buf: NAVideoBuffer<u8>) { self.last24 = Some(buf); }
- fn get16(&mut self) -> Option<NAVideoBuffer<u16>> {
+ fn set16(&mut self, buf: NAVideoBufferRef<u16>) { self.last16 = Some(buf); }
+ fn set24(&mut self, buf: NAVideoBufferRef<u8>) { self.last24 = Some(buf); }
+ fn get16(&mut self) -> Option<NAVideoBufferRef<u16>> {
if let Some(ref mut frm) = self.last16 {
let newfrm = frm.copy_buffer();
- *frm = newfrm.clone();
- Some(newfrm)
+ *frm = newfrm.clone().into_ref();
+ Some(newfrm.into_ref())
} else {
None
}
}
- fn get24(&mut self) -> Option<NAVideoBuffer<u8>> {
+ fn get24(&mut self) -> Option<NAVideoBufferRef<u8>> {
if let Some(ref mut frm) = self.last24 {
let newfrm = frm.copy_buffer();
- *frm = newfrm.clone();
- Some(newfrm)
+ *frm = newfrm.clone().into_ref();
+ Some(newfrm.into_ref())
} else {
None
}
diff --git a/nihav-realmedia/src/codecs/rv3040.rs b/nihav-realmedia/src/codecs/rv3040.rs
index d517cac..adde678 100644
--- a/nihav-realmedia/src/codecs/rv3040.rs
+++ b/nihav-realmedia/src/codecs/rv3040.rs
@@ -1,5 +1,5 @@
use nihav_core::formats::YUV420_FORMAT;
-use nihav_core::frame::{NABufferType, NAVideoInfo, NAVideoBuffer, FrameType, alloc_video_buffer};
+use nihav_core::frame::{NABufferType, NAVideoInfo, NAVideoBuffer, NAVideoBufferRef, FrameType, alloc_video_buffer};
use nihav_core::codecs::{MV, ZERO_MV, DecoderError, DecoderResult, IPBShuffler};
use nihav_core::io::bitreader::{BitReader,BitReaderMode};
use nihav_core::io::intcode::*;
@@ -767,7 +767,7 @@ pub struct RV34Decoder {
ratio2: u32,
is_b: bool,
mbinfo: Vec<RV34MBInfo>,
- avg_buf: NAVideoBuffer<u8>,
+ avg_buf: NAVideoBufferRef<u8>,
base_ts: u64,
}
diff --git a/nihav-realmedia/src/codecs/rv60.rs b/nihav-realmedia/src/codecs/rv60.rs
index 82dce04..f064861 100644
--- a/nihav-realmedia/src/codecs/rv60.rs
+++ b/nihav-realmedia/src/codecs/rv60.rs
@@ -614,7 +614,7 @@ struct RealVideo60Decoder {
dsp: RV60DSP,
ipred: IntraPredContext,
- avg_buf: NAVideoBuffer<u8>,
+ avg_buf: NAVideoBufferRef<u8>,
y_coeffs: [i16; 16 * 16],
u_coeffs: [i16; 8 * 8],