1 use nihav_codec_support::data::GenericCache;
2 use super::vpcommon::*;
4 pub enum VPTreeDef<T: Copy> {
9 pub trait VPTreeReader {
10 fn read_tree<T:Copy>(&mut self, tree_def: &[VPTreeDef<T>], tree_prob: &[u8]) -> T;
13 impl<'a> VPTreeReader for BoolCoder<'a> {
14 fn read_tree<T:Copy>(&mut self, tree_def: &[VPTreeDef<T>], tree_prob: &[u8]) -> T {
18 let bit = self.read_prob(tree_prob[idx >> 1]);
19 match tree_def[idx + (bit as usize)] {
20 VPTreeDef::Value(v) => return v,
21 VPTreeDef::Index(ix) => { idx = ix as usize; },
28 #[derive(Clone,Copy,PartialEq,Debug)]
36 //sub-block prediction modes
47 impl Default for PredMode {
48 fn default() -> Self { PredMode::DCPred }
52 pub fn to_b_mode(self) -> Self {
53 if self == PredMode::DCPred {
59 pub fn to_b_index(self) -> usize {
61 PredMode::DCPred => 0,
62 PredMode::TMPred => 1,
65 PredMode::LDPred => 4,
66 PredMode::RDPred => 5,
67 PredMode::VRPred => 6,
68 PredMode::VLPred => 7,
69 PredMode::HDPred => 8,
70 PredMode::HUPred => 9,
76 #[derive(Clone,Copy,PartialEq)]
92 pub fn expand_token(bc: &mut BoolCoder, token: DCTToken) -> i16 {
95 DCTToken::Zero => return 0,
96 DCTToken::One => return if bc.read_bool() { -1 } else { 1 },
97 DCTToken::Two => return if bc.read_bool() { -2 } else { 2 },
98 DCTToken::Three => return if bc.read_bool() { -3 } else { 3 },
99 DCTToken::Four => return if bc.read_bool() { -4 } else { 4 },
100 DCTToken::Cat1 => cat = 0,
101 DCTToken::Cat2 => cat = 1,
102 DCTToken::Cat3 => cat = 2,
103 DCTToken::Cat4 => cat = 3,
104 DCTToken::Cat5 => cat = 4,
105 DCTToken::Cat6 => cat = 5,
109 let add_probs = &VP56_COEF_ADD_PROBS[cat];
110 for prob in add_probs.iter() {
111 if *prob == 128 { break; }
112 add = (add << 1) | (bc.read_prob(*prob) as i16);
114 let sign = bc.read_bool();
115 let level = VP56_COEF_BASE[cat] + add;
123 #[derive(Clone,Copy,Debug,PartialEq)]
124 pub enum MVSplitMode {
131 #[derive(Clone,Copy,Debug,PartialEq)]
139 pub struct PredCache {
140 pub y_pred: GenericCache<u8>,
141 pub u_pred: GenericCache<u8>,
142 pub v_pred: GenericCache<u8>,
143 pub y2_pred: GenericCache<u8>,
144 pub y_pred_left: [u8; 4],
145 pub u_pred_left: [u8; 2],
146 pub v_pred_left: [u8; 2],
147 pub y2_pred_left: u8,
151 pub fn new() -> Self {
153 y_pred: GenericCache::new(1, 1, 0),
154 u_pred: GenericCache::new(1, 1, 0),
155 v_pred: GenericCache::new(1, 1, 0),
156 y2_pred: GenericCache::new(1, 1, 0),
163 pub fn resize(&mut self, mb_w: usize) {
164 self.y_pred = GenericCache::new(4, mb_w * 4 + 1, 0);
165 self.u_pred = GenericCache::new(2, mb_w * 2 + 1, 0);
166 self.v_pred = GenericCache::new(2, mb_w * 2 + 1, 0);
167 self.y2_pred = GenericCache::new(1, mb_w + 1, 0);
169 pub fn reset(&mut self) {
173 self.y2_pred.reset();
174 self.y_pred_left = [0; 4];
175 self.u_pred_left = [0; 2];
176 self.v_pred_left = [0; 2];
177 self.y2_pred_left = 0;
179 pub fn update_row(&mut self) {
180 self.y_pred.update_row();
181 self.u_pred.update_row();
182 self.v_pred.update_row();
183 self.y2_pred.update_row();
187 pub const Y_MODE_TREE: &[VPTreeDef<PredMode>] = &[
188 VPTreeDef::Value(PredMode::DCPred), VPTreeDef::Index(2),
189 VPTreeDef::Index(4), VPTreeDef::Index(6),
190 VPTreeDef::Value(PredMode::VPred), VPTreeDef::Value(PredMode::HPred),
191 VPTreeDef::Value(PredMode::TMPred), VPTreeDef::Value(PredMode::BPred),
193 pub const KF_Y_MODE_TREE: &[VPTreeDef<PredMode>] = &[
194 VPTreeDef::Value(PredMode::BPred), VPTreeDef::Index(2),
195 VPTreeDef::Index(4), VPTreeDef::Index(6),
196 VPTreeDef::Value(PredMode::DCPred), VPTreeDef::Value(PredMode::VPred),
197 VPTreeDef::Value(PredMode::HPred), VPTreeDef::Value(PredMode::TMPred),
199 pub const UV_MODE_TREE: &[VPTreeDef<PredMode>] = &[
200 VPTreeDef::Value(PredMode::DCPred), VPTreeDef::Index(2),
201 VPTreeDef::Value(PredMode::VPred), VPTreeDef::Index(4),
202 VPTreeDef::Value(PredMode::HPred), VPTreeDef::Value(PredMode::TMPred)
204 pub const B_MODE_TREE: &[VPTreeDef<PredMode>] = &[
205 VPTreeDef::Value(PredMode::DCPred), VPTreeDef::Index(2),
206 VPTreeDef::Value(PredMode::TMPred), VPTreeDef::Index(4),
207 VPTreeDef::Value(PredMode::VPred), VPTreeDef::Index(6),
208 VPTreeDef::Index(8), VPTreeDef::Index(12),
209 VPTreeDef::Value(PredMode::HPred), VPTreeDef::Index(10),
210 VPTreeDef::Value(PredMode::RDPred), VPTreeDef::Value(PredMode::VRPred),
211 VPTreeDef::Value(PredMode::LDPred), VPTreeDef::Index(14),
212 VPTreeDef::Value(PredMode::VLPred), VPTreeDef::Index(16),
213 VPTreeDef::Value(PredMode::HDPred), VPTreeDef::Value(PredMode::HUPred)
216 pub const FEATURE_TREE: &[VPTreeDef<usize>] = &[
217 VPTreeDef::Index(2), VPTreeDef::Index(4),
218 VPTreeDef::Value(0), VPTreeDef::Value(1),
219 VPTreeDef::Value(2), VPTreeDef::Value(3)
222 pub const COEF_TREE: &[VPTreeDef<DCTToken>] = &[
223 VPTreeDef::Value(DCTToken::EOB), VPTreeDef::Index(2),
224 VPTreeDef::Value(DCTToken::Zero), VPTreeDef::Index(4),
225 VPTreeDef::Value(DCTToken::One), VPTreeDef::Index(6),
226 VPTreeDef::Index(8), VPTreeDef::Index(12),
227 VPTreeDef::Value(DCTToken::Two), VPTreeDef::Index(10),
228 VPTreeDef::Value(DCTToken::Three), VPTreeDef::Value(DCTToken::Four),
229 VPTreeDef::Index(14), VPTreeDef::Index(16),
230 VPTreeDef::Value(DCTToken::Cat1), VPTreeDef::Value(DCTToken::Cat2),
231 VPTreeDef::Index(18), VPTreeDef::Index(20),
232 VPTreeDef::Value(DCTToken::Cat3), VPTreeDef::Value(DCTToken::Cat4),
233 VPTreeDef::Value(DCTToken::Cat5), VPTreeDef::Value(DCTToken::Cat6)
236 pub const MV_REF_TREE: &[VPTreeDef<VPMBType>] = &[
237 VPTreeDef::Value(VPMBType::InterNoMV), VPTreeDef::Index(2),
238 VPTreeDef::Value(VPMBType::InterNearest), VPTreeDef::Index(4),
239 VPTreeDef::Value(VPMBType::InterNear), VPTreeDef::Index(6),
240 VPTreeDef::Value(VPMBType::InterMV), VPTreeDef::Value(VPMBType::InterFourMV)
242 pub const SMALL_MV_TREE: &[VPTreeDef<i16>] = &[
243 VPTreeDef::Index(2), VPTreeDef::Index(8),
244 VPTreeDef::Index(4), VPTreeDef::Index(6),
245 VPTreeDef::Value(0), VPTreeDef::Value(1),
246 VPTreeDef::Value(2), VPTreeDef::Value(3),
247 VPTreeDef::Index(10), VPTreeDef::Index(12),
248 VPTreeDef::Value(4), VPTreeDef::Value(5),
249 VPTreeDef::Value(6), VPTreeDef::Value(7)
251 pub const MV_SPLIT_MODE_TREE: &[VPTreeDef<MVSplitMode>] = &[
252 VPTreeDef::Value(MVSplitMode::Sixteenths), VPTreeDef::Index(2),
253 VPTreeDef::Value(MVSplitMode::Quarters), VPTreeDef::Index(4),
254 VPTreeDef::Value(MVSplitMode::TopBottom), VPTreeDef::Value(MVSplitMode::LeftRight)
256 pub const SUB_MV_REF_TREE: &[VPTreeDef<SubMVRef>] = &[
257 VPTreeDef::Value(SubMVRef::Left), VPTreeDef::Index(2),
258 VPTreeDef::Value(SubMVRef::Above), VPTreeDef::Index(4),
259 VPTreeDef::Value(SubMVRef::Zero), VPTreeDef::Value(SubMVRef::New)