GremlinVideo audio decoder
[nihav.git] / nihav-realmedia / src / codecs / rv30.rs
1 use std::rc::Rc;
2 use std::cell::RefCell;
3 use nihav_core::formats;
4 use nihav_core::io::bitreader::*;
5 use nihav_core::io::intcode::*;
6 use nihav_core::frame::*;
7 use nihav_core::codecs::*;
8 use super::rv3040::*;
9 use super::rv30dsp::*;
10
11 struct RealVideo30BR {
12 rpr_bits: u8,
13 width: usize,
14 height: usize,
15 widths: Vec<usize>,
16 heights: Vec<usize>,
17 }
18
19 impl RealVideo30BR {
20 fn new() -> Self {
21 RealVideo30BR {
22 rpr_bits: 0,
23 width: 0,
24 height: 0,
25 widths: Vec::new(),
26 heights: Vec::new(),
27 }
28 }
29 }
30
31 impl RV34BitstreamDecoder for RealVideo30BR {
32 fn decode_slice_header(&mut self, br: &mut BitReader, _old_w: usize, _old_h: usize) -> DecoderResult<RV34SliceHeader> {
33 if br.read(3)? != 0 { return Err(DecoderError::InvalidData); }
34 let ft_idx = br.read(2)?;
35 let ftype = match ft_idx {
36 0|1 => FrameType::I,
37 2 => FrameType::P,
38 _ => FrameType::B,
39 };
40 if br.read(1)? != 0 { return Err(DecoderError::InvalidData); }
41 let q = br.read(5)? as u8;
42 let deblock = !br.read_bool()?;
43 let pts = br.read(13)? as u16;
44 let rpr = br.read(self.rpr_bits)? as usize;
45 let (w, h) = if rpr != 0 {
46 validate!(rpr < self.widths.len());
47 (self.widths[rpr], self.heights[rpr])
48 } else {
49 (self.width, self.height)
50 };
51 let start = br.read(get_slice_start_offset_bits(w, h))? as usize;
52 br.skip(1)?;
53
54 Ok(RV34SliceHeader{ ftype: ftype, quant: q, deblock: deblock, pts: pts, width: w, height: h, start: start, end: 0, set_idx: 0 })
55 }
56 fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, _has_top: bool) -> DecoderResult<()> {
57 for _ in 0..4 {
58 for x in 0..2 {
59 let code = br.read_code(UintCodeType::Gamma)? as usize;
60 validate!(code < 81);
61 for k in 0..2 {
62 let new = RV30_ITYPE_MAP[code * 2 + k] as usize;
63 let top = (types[pos + x * 2 + k - tstride] + 1) as usize;
64 let left = (types[pos + x * 2 + k - 1] + 1) as usize;
65 types[pos + x * 2 + k] = RV30_ITYPE[top * 90 + left * 9 + new];
66 validate!(types[pos + x * 2 + k] != 9);
67 }
68 }
69 pos += tstride;
70 }
71 Ok(())
72 }
73 fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, _mbtype: MBType) -> DecoderResult<MBInfo> {
74 let mut code = br.read_code(UintCodeType::Gamma)? as usize;
75 let mut dq = false;
76 validate!(code < 11);
77 if code > 5 {
78 code -= 6;
79 dq = true;
80 }
81 let idx = if ftype == FrameType::P { 0 } else { 1 };
82 Ok(MBInfo { mbtype: RV30_MB_TYPES[idx][code], skip_run: 0, dquant: dq })
83 }
84 fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], _mbinfo: &Vec<RV34MBInfo>) -> (MV, MV) {
85 let mb_x = sstate.mb_x;
86 let mb_y = sstate.mb_y;
87 let mv_f;
88 let mv_b;
89 match mbtype {
90 MBType::MBForward | MBType::MBBackward => {
91 let mv_pred = mvi.pred_mb_mv(mb_x, mb_y, true, sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl);
92 mv_f = mv_pred + mvs[0];
93 mv_b = mv_f;
94 },
95 _ => {
96 mv_f = ZERO_MV;
97 mv_b = ZERO_MV;
98 },
99 };
100 (mv_f, mv_b)
101 }
102 fn quant_dc(&self, _is_intra: bool, q: u8) -> u8 { RV30_QUANT_DC[q as usize] }
103 }
104
105 struct RealVideo30Decoder {
106 bd: RealVideo30BR,
107 info: Rc<NACodecInfo>,
108 dec: RV34Decoder,
109 }
110
111 impl RealVideo30Decoder {
112 fn new() -> Self {
113 RealVideo30Decoder{
114 bd: RealVideo30BR::new(),
115 info: Rc::new(DUMMY_CODEC_INFO),
116 dec: RV34Decoder::new(true, Box::new(RV30DSP::new())),
117 }
118 }
119 }
120
121 impl NADecoder for RealVideo30Decoder {
122 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
123 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
124 let fmt = formats::YUV420_FORMAT;
125 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt));
126 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
127
128 let edata = info.get_extradata().unwrap();
129 let src: &[u8] = &edata;
130
131 if src.len() < 2 { return Err(DecoderError::InvalidData); }
132 let num_rpr = (src[1] & 7) as usize;
133 if src.len() < num_rpr * 2 + 8 { return Err(DecoderError::ShortData); }
134 self.bd.rpr_bits = ((num_rpr >> 1) + 1) as u8;
135 if self.bd.rpr_bits > 3 { self.bd.rpr_bits = 3; }
136 for i in 0..num_rpr+1 {
137 self.bd.widths.push ((src[6 + i * 2] as usize) << 2);
138 self.bd.heights.push((src[7 + i * 2] as usize) << 2);
139 }
140
141 self.bd.width = vinfo.get_width();
142 self.bd.height = vinfo.get_height();
143 Ok(())
144 } else {
145 println!("???");
146 Err(DecoderError::InvalidData)
147 }
148 }
149 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
150 let src = pkt.get_buffer();
151
152 let (bufinfo, ftype, pts) = self.dec.parse_frame(src.as_slice(), &mut self.bd)?;
153
154 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
155 frm.set_keyframe(ftype == FrameType::I);
156 frm.set_pts(Some(pts));
157 frm.set_frame_type(ftype);//if ftype == FrameType::B { FrameType::Skip } else { ftype } );
158 Ok(Rc::new(RefCell::new(frm)))
159 }
160 }
161
162 pub fn get_decoder() -> Box<NADecoder> {
163 Box::new(RealVideo30Decoder::new())
164 }
165
166 #[cfg(test)]
167 mod test {
168 use crate::test::dec_video::test_file_decoding;
169 #[test]
170 fn test_rv30() {
171 // test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30"));
172 test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/);
173 // test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30"));
174 //panic!("end");
175 }
176 }
177
178 const RV30_QUANT_DC: [u8; 32] = [
179 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
180 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25
181 ];
182
183 const RV30_MB_TYPES: [[MBType; 6]; 2] = [
184 [ MBType::MBSkip, MBType::MBP16x16, MBType::MBP8x8, MBType::Invalid, MBType::MBIntra, MBType::MBIntra16 ],
185 [ MBType::MBSkip, MBType::MBDirect, MBType::MBForward, MBType::MBBackward, MBType::MBIntra, MBType::MBIntra16 ],
186 ];
187
188 const RV30_ITYPE_MAP: [i8; 9*9*2] = [
189 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 0, 0, 3, 3, 0, 1, 2,
190 2, 1, 0, 4, 4, 0, 3, 1, 1, 3, 0, 5, 5, 0, 2, 2, 1, 4,
191 4, 1, 0, 6, 3, 2, 1, 5, 2, 3, 5, 1, 6, 0, 0, 7, 4, 2,
192 2, 4, 3, 3, 6, 1, 1, 6, 7, 0, 0, 8, 5, 2, 4, 3, 2, 5,
193 3, 4, 1, 7, 4, 4, 7, 1, 8, 0, 6, 2, 3, 5, 5, 3, 2, 6,
194 1, 8, 2, 7, 7, 2, 8, 1, 5, 4, 4, 5, 3, 6, 6, 3, 8, 2,
195 4, 6, 5, 5, 6, 4, 2, 8, 7, 3, 3, 7, 6, 5, 5, 6, 7, 4,
196 4, 7, 8, 3, 3, 8, 7, 5, 8, 4, 5, 7, 4, 8, 6, 6, 7, 6,
197 5, 8, 8, 5, 6, 7, 8, 6, 7, 7, 6, 8, 8, 7, 7, 8, 8, 8,
198 ];
199
200 const RV30_ITYPE: [i8; 10*10*9] = [
201 0, 9, 9, 9, 9, 9, 9, 9, 9,
202 0, 2, 9, 9, 9, 9, 9, 9, 9,
203 9, 9, 9, 9, 9, 9, 9, 9, 9,
204 2, 0, 9, 9, 9, 9, 9, 9, 9,
205 9, 9, 9, 9, 9, 9, 9, 9, 9,
206 9, 9, 9, 9, 9, 9, 9, 9, 9,
207 9, 9, 9, 9, 9, 9, 9, 9, 9,
208 9, 9, 9, 9, 9, 9, 9, 9, 9,
209 9, 9, 9, 9, 9, 9, 9, 9, 9,
210 9, 9, 9, 9, 9, 9, 9, 9, 9,
211
212 0, 1, 9, 9, 9, 9, 9, 9, 9,
213 0, 2, 1, 6, 4, 8, 5, 7, 3,
214 1, 0, 2, 6, 5, 4, 3, 8, 7,
215 2, 8, 0, 1, 7, 4, 3, 6, 5,
216 2, 0, 1, 3, 8, 5, 4, 7, 6,
217 2, 0, 1, 4, 6, 7, 8, 3, 5,
218 0, 1, 5, 2, 6, 3, 8, 4, 7,
219 0, 1, 6, 2, 4, 7, 5, 8, 3,
220 2, 7, 0, 1, 4, 8, 6, 3, 5,
221 2, 8, 0, 1, 7, 3, 4, 5, 6,
222
223 1, 0, 9, 9, 9, 9, 9, 9, 9,
224 1, 2, 5, 6, 3, 0, 4, 8, 7,
225 1, 6, 2, 5, 3, 0, 4, 8, 7,
226 2, 1, 7, 6, 8, 3, 5, 0, 4,
227 1, 2, 5, 3, 6, 8, 4, 7, 0,
228 1, 6, 2, 0, 4, 5, 8, 7, 3,
229 1, 5, 2, 6, 3, 8, 4, 0, 7,
230 1, 6, 0, 2, 4, 5, 7, 3, 8,
231 2, 1, 7, 6, 0, 8, 5, 4, 3,
232 1, 2, 7, 8, 3, 4, 5, 6, 0,
233
234 9, 9, 9, 9, 9, 9, 9, 9, 9,
235 0, 2, 1, 8, 7, 6, 5, 4, 3,
236 1, 2, 0, 6, 5, 7, 4, 8, 3,
237 2, 8, 7, 1, 0, 6, 4, 3, 5,
238 2, 0, 8, 1, 3, 7, 5, 4, 6,
239 2, 0, 4, 1, 7, 8, 6, 3, 5,
240 2, 0, 1, 5, 8, 4, 6, 7, 3,
241 2, 0, 6, 1, 4, 7, 8, 5, 3,
242 2, 7, 8, 1, 0, 5, 4, 6, 3,
243 2, 8, 7, 1, 0, 4, 3, 6, 5,
244
245 9, 9, 9, 9, 9, 9, 9, 9, 9,
246 0, 2, 1, 3, 5, 8, 6, 4, 7,
247 1, 0, 2, 5, 3, 6, 4, 8, 7,
248 2, 8, 1, 0, 3, 5, 7, 6, 4,
249 3, 2, 5, 8, 1, 4, 6, 7, 0,
250 4, 2, 0, 6, 1, 5, 8, 3, 7,
251 5, 3, 1, 2, 8, 6, 4, 0, 7,
252 1, 6, 0, 2, 4, 5, 8, 3, 7,
253 2, 7, 0, 1, 5, 4, 8, 6, 3,
254 2, 8, 3, 5, 1, 0, 7, 6, 4,
255
256 9, 9, 9, 9, 9, 9, 9, 9, 9,
257 2, 0, 6, 1, 4, 7, 5, 8, 3,
258 1, 6, 2, 0, 4, 5, 3, 7, 8,
259 2, 8, 7, 6, 4, 0, 1, 5, 3,
260 4, 2, 1, 0, 6, 8, 3, 5, 7,
261 4, 2, 6, 0, 1, 5, 7, 8, 3,
262 1, 2, 5, 0, 6, 3, 4, 7, 8,
263 6, 4, 0, 1, 2, 7, 5, 3, 8,
264 2, 7, 4, 6, 0, 1, 8, 5, 3,
265 2, 8, 7, 4, 6, 1, 3, 5, 0,
266
267 9, 9, 9, 9, 9, 9, 9, 9, 9,
268 5, 1, 2, 3, 6, 8, 0, 4, 7,
269 1, 5, 6, 3, 2, 0, 4, 8, 7,
270 2, 1, 5, 3, 6, 8, 7, 4, 0,
271 5, 3, 1, 2, 6, 8, 4, 7, 0,
272 1, 6, 2, 4, 5, 8, 0, 3, 7,
273 5, 1, 3, 6, 2, 0, 8, 4, 7,
274 1, 6, 5, 2, 0, 4, 3, 7, 8,
275 2, 7, 1, 6, 5, 0, 8, 3, 4,
276 2, 5, 1, 3, 6, 8, 4, 0, 7,
277
278 9, 9, 9, 9, 9, 9, 9, 9, 9,
279 1, 6, 2, 0, 5, 4, 3, 7, 8,
280 1, 6, 5, 4, 2, 3, 0, 7, 8,
281 2, 1, 6, 7, 4, 8, 5, 3, 0,
282 2, 1, 6, 5, 8, 4, 3, 0, 7,
283 6, 4, 1, 2, 0, 5, 7, 8, 3,
284 1, 6, 5, 2, 3, 0, 4, 8, 7,
285 6, 1, 4, 0, 2, 7, 5, 3, 8,
286 2, 7, 4, 6, 1, 5, 0, 8, 3,
287 2, 1, 6, 8, 4, 7, 3, 5, 0,
288
289 9, 9, 9, 9, 9, 9, 9, 9, 9,
290 2, 0, 4, 7, 6, 1, 8, 5, 3,
291 6, 1, 2, 0, 4, 7, 5, 8, 3,
292 2, 7, 8, 0, 1, 6, 4, 3, 5,
293 2, 4, 0, 8, 3, 1, 7, 6, 5,
294 4, 2, 7, 0, 6, 1, 8, 5, 3,
295 2, 1, 0, 8, 5, 6, 7, 4, 3,
296 2, 6, 4, 1, 7, 0, 5, 8, 3,
297 2, 7, 4, 0, 8, 6, 1, 5, 3,
298 2, 8, 7, 4, 1, 0, 3, 6, 5,
299
300 9, 9, 9, 9, 9, 9, 9, 9, 9,
301 2, 0, 8, 1, 3, 4, 6, 5, 7,
302 1, 2, 0, 6, 8, 5, 7, 3, 4,
303 2, 8, 7, 1, 0, 3, 6, 5, 4,
304 8, 3, 2, 5, 1, 0, 4, 7, 6,
305 2, 0, 4, 8, 5, 1, 7, 6, 3,
306 2, 1, 0, 8, 5, 3, 6, 4, 7,
307 2, 1, 6, 0, 8, 4, 5, 7, 3,
308 2, 7, 8, 4, 0, 6, 1, 5, 3,
309 2, 8, 3, 0, 7, 4, 1, 6, 5,
310 ];