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