1 use super::ivibr::{IVICodebook,IVI_CB_ZERO,RVMap,IVI_ZERO_RVMAP,IVI_RVMAPS};
3 pub fn clip8(a: i16) -> u8 {
5 else if a > 255 { 255 }
9 #[derive(Debug,Clone,Copy,PartialEq)]
10 pub enum IVIFrameType {
22 pub fn is_intra(self) -> bool {
23 (self == IVIFrameType::Intra) || (self == IVIFrameType::Intra1)
25 pub fn is_null(self) -> bool {
26 (self == IVIFrameType::NULL) || (self == IVIFrameType::NULL2)
28 pub fn is_bidir(self) -> bool {
29 self == IVIFrameType::Bidir
34 pub struct PictureHeader {
35 pub ftype: IVIFrameType,
40 pub transparent: bool,
41 pub luma_bands: usize,
42 pub chroma_bands: usize,
47 pub fn new(ftype: IVIFrameType, width: usize, height: usize, slice_w: usize, slice_h: usize, transparent: bool, luma_bands: usize, chroma_bands: usize, in_q: bool) -> Self {
50 width: width, height: height, slice_w: slice_w, slice_h: slice_h,
51 transparent: transparent,
52 luma_bands: luma_bands, chroma_bands: chroma_bands,
56 pub fn new_null(ftype: IVIFrameType) -> Self {
59 width: 0, height: 0, slice_w: 0, slice_h: 0,
61 luma_bands: 0, chroma_bands: 0,
67 #[derive(Debug,Clone,Copy,PartialEq)]
73 #[derive(Debug,Clone,Copy,PartialEq)]
80 #[derive(Debug,Clone,Copy,PartialEq)]
81 pub enum IVITransformType {
88 pub type TrFunc = fn (&mut [i32; 64]);
89 pub type TrFuncDC = fn (&mut [i32; 64], i32);
91 impl IVITransformType {
92 pub fn is_8x8(&self) -> bool {
94 IVITransformType::Haar (ref sz, _) => { *sz == TSize::T8x8 },
95 IVITransformType::Slant(ref sz, _) => { *sz == TSize::T8x8 },
96 IVITransformType::DCT (ref sz, _) => { *sz == TSize::T8x8 },
97 IVITransformType::None (ref sz) => { *sz == TSize::T8x8 },
100 pub fn is_2d(&self) -> bool {
102 IVITransformType::Haar (_, ref dir) => { *dir == TDir::TwoD },
103 IVITransformType::Slant(_, ref dir) => { *dir == TDir::TwoD },
104 IVITransformType::DCT (_, ref dir) => { *dir == TDir::TwoD },
112 pub struct TxParams4x4 {
113 pub quant_intra: &'static [u16; 16],
114 pub quant_inter: &'static [u16; 16],
115 pub scan: &'static [usize; 16],
119 pub fn new(quant_intra: &'static [u16; 16], quant_inter: &'static [u16; 16], scan: &'static [usize; 16]) -> Self {
121 quant_intra: quant_intra, quant_inter: quant_inter, scan: scan,
128 pub struct TxParams8x8 {
129 pub quant_intra: &'static [u16; 64],
130 pub quant_inter: &'static [u16; 64],
131 pub scan: &'static [usize; 64],
135 pub fn new(quant_intra: &'static [u16; 64], quant_inter: &'static [u16; 64], scan: &'static [usize; 64]) -> Self {
137 quant_intra: quant_intra, quant_inter: quant_inter, scan: scan,
144 Transform4(TxParams4x4),
145 Transform8(TxParams8x8),
149 pub const CORR_MAP_SIZE: usize = 122;
152 pub struct BandHeader {
159 pub inherit_mv: bool,
160 pub has_qdelta: bool,
161 pub inherit_qd: bool,
163 pub blk_cb: IVICodebook,
165 pub tr: IVITransformType,
170 pub fn new(plane_no: usize, band_no: usize, mb_size: usize, blk_size: usize, halfpel: bool, inherit_mv: bool, has_qdelta: bool, inherit_qd: bool, quant: u32, rvmap_idx: usize, num_corr: usize, corr_map: [u8; CORR_MAP_SIZE], blk_cb: IVICodebook, tr: IVITransformType, ttype: TxType) -> Self {
171 let mut rvmap = IVI_RVMAPS[rvmap_idx].clone();
172 for i in 0..num_corr {
173 let pos1 = corr_map[i * 2 + 0] as usize;
174 let pos2 = corr_map[i * 2 + 1] as usize;
175 let t = rvmap.runtab[pos1];
176 rvmap.runtab[pos1] = rvmap.runtab[pos2];
177 rvmap.runtab[pos2] = t;
178 let t = rvmap.valtab[pos1];
179 rvmap.valtab[pos1] = rvmap.valtab[pos2];
180 rvmap.valtab[pos2] = t;
183 plane_no: plane_no, band_no: band_no,
184 empty: false, halfpel: halfpel,
185 inherit_mv: inherit_mv,
186 has_qdelta: has_qdelta, inherit_qd: inherit_qd, quant: quant,
187 mb_size: mb_size, blk_size: blk_size,
188 rvmap: rvmap, blk_cb: blk_cb,
189 tr: tr, ttype: ttype,
192 pub fn new_empty(plane_no: usize, band_no: usize) -> Self {
194 plane_no: plane_no, band_no: band_no,
195 empty: true, halfpel: true,
196 inherit_mv: false, has_qdelta: false, inherit_qd: false, quant: 0,
197 mb_size: 0, blk_size: 0,
198 rvmap: IVI_ZERO_RVMAP, blk_cb: IVI_CB_ZERO,
199 tr: IVITransformType::None(TSize::T8x8), ttype: TxType::None,
204 #[derive(Debug,Clone,Copy,PartialEq)]
212 #[derive(Clone,Copy)]
227 pub fn new(x: usize, y: usize) -> Self {
229 mtype: MBType::Intra,
249 pub fn new(pos_x: usize, pos_y: usize, w: usize, h: usize) -> Self {
251 pos_x: pos_x, pos_y: pos_y, w: w, h: h,
252 mb_w: 0, mb_h: 0, mb: Vec::new(),
257 pub const IVI_ZIGZAG: [usize; 64] = [
258 0, 1, 8, 16, 9, 2, 3, 10,
259 17, 24, 32, 25, 18, 11, 4, 5,
260 12, 19, 26, 33, 40, 48, 41, 34,
261 27, 20, 13, 6, 7, 14, 21, 28,
262 35, 42, 49, 56, 57, 50, 43, 36,
263 29, 22, 15, 23, 30, 37, 44, 51,
264 58, 59, 52, 45, 38, 31, 39, 46,
265 53, 60, 61, 54, 47, 55, 62, 63
267 pub const IVI_SCAN_8X8_VER: [usize; 64] = [
268 0, 8, 16, 24, 32, 40, 48, 56,
269 1, 9, 17, 25, 33, 41, 49, 57,
270 2, 10, 18, 26, 34, 42, 50, 58,
271 3, 11, 19, 27, 35, 43, 51, 59,
272 4, 12, 20, 28, 36, 44, 52, 60,
273 5, 13, 21, 29, 37, 45, 53, 61,
274 6, 14, 22, 30, 38, 46, 54, 62,
275 7, 15, 23, 31, 39, 47, 55, 63
277 pub const IVI_SCAN_8X8_HOR: [usize; 64] = [
278 0, 1, 2, 3, 4, 5, 6, 7,
279 8, 9, 10, 11, 12, 13, 14, 15,
280 16, 17, 18, 19, 20, 21, 22, 23,
281 24, 25, 26, 27, 28, 29, 30, 31,
282 32, 33, 34, 35, 36, 37, 38, 39,
283 40, 41, 42, 43, 44, 45, 46, 47,
284 48, 49, 50, 51, 52, 53, 54, 55,
285 56, 57, 58, 59, 60, 61, 62, 63
287 pub const IVI_SCAN_4X4: [usize; 16] = [ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 ];