]> git.nihav.org Git - nihav.git/blame - nihav-realmedia/src/codecs/rv30.rs
vp5: fix chroma MV
[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
e07387c7 52 Ok(RV34SliceHeader{ ftype, quant: q, deblock, pts, width: w, height: h, start, end: 0, set_idx: 0 })
47527732
KS
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 }
e07387c7 82 fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], _mbinfo: &[RV34MBInfo]) -> (MV, MV) {
47527732
KS
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 {
3c69ce1b 120 fn init(&mut self, supp: &mut NADecoderSupport, 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; }
e07387c7 134 for i in 0..=num_rpr {
47527732
KS
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();
3c69ce1b
KS
141
142 supp.pool_u8.set_dec_bufs(3);
143 supp.pool_u8.prealloc_video(NAVideoInfo::new(self.bd.width, self.bd.height, false, fmt), 4)?;
144
47527732
KS
145 Ok(())
146 } else {
147println!("???");
148 Err(DecoderError::InvalidData)
149 }
150 }
3c69ce1b 151 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
47527732
KS
152 let src = pkt.get_buffer();
153
3c69ce1b 154 let (bufinfo, ftype, pts) = self.dec.parse_frame(supp, src.as_slice(), &mut self.bd)?;
47527732
KS
155
156 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
157 frm.set_keyframe(ftype == FrameType::I);
158 frm.set_pts(Some(pts));
159 frm.set_frame_type(ftype);//if ftype == FrameType::B { FrameType::Skip } else { ftype } );
171860fc 160 Ok(frm.into_ref())
47527732 161 }
f9be4e75
KS
162 fn flush(&mut self) {
163 self.dec.flush();
164 }
47527732
KS
165}
166
08a1fab7 167pub fn get_decoder() -> Box<dyn NADecoder + Send> {
47527732
KS
168 Box::new(RealVideo30Decoder::new())
169}
170
171#[cfg(test)]
172mod test {
3167c45c
KS
173 use nihav_core::codecs::RegisteredDecoders;
174 use nihav_core::demuxers::RegisteredDemuxers;
175 use nihav_core::test::dec_video::*;
176 use crate::codecs::realmedia_register_all_codecs;
177 use crate::demuxers::realmedia_register_all_demuxers;
47527732
KS
178 #[test]
179 fn test_rv30() {
3167c45c
KS
180 let mut dmx_reg = RegisteredDemuxers::new();
181 realmedia_register_all_demuxers(&mut dmx_reg);
182 let mut dec_reg = RegisteredDecoders::new();
183 realmedia_register_all_codecs(&mut dec_reg);
184
47527732 185// test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30"));
3167c45c 186 test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/, &dmx_reg, &dec_reg);
47527732
KS
187// test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30"));
188//panic!("end");
189 }
190}
191
192const RV30_QUANT_DC: [u8; 32] = [
193 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
194 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25
195];
196
197const RV30_MB_TYPES: [[MBType; 6]; 2] = [
198 [ MBType::MBSkip, MBType::MBP16x16, MBType::MBP8x8, MBType::Invalid, MBType::MBIntra, MBType::MBIntra16 ],
199 [ MBType::MBSkip, MBType::MBDirect, MBType::MBForward, MBType::MBBackward, MBType::MBIntra, MBType::MBIntra16 ],
200];
201
202const RV30_ITYPE_MAP: [i8; 9*9*2] = [
203 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 0, 0, 3, 3, 0, 1, 2,
204 2, 1, 0, 4, 4, 0, 3, 1, 1, 3, 0, 5, 5, 0, 2, 2, 1, 4,
205 4, 1, 0, 6, 3, 2, 1, 5, 2, 3, 5, 1, 6, 0, 0, 7, 4, 2,
206 2, 4, 3, 3, 6, 1, 1, 6, 7, 0, 0, 8, 5, 2, 4, 3, 2, 5,
207 3, 4, 1, 7, 4, 4, 7, 1, 8, 0, 6, 2, 3, 5, 5, 3, 2, 6,
208 1, 8, 2, 7, 7, 2, 8, 1, 5, 4, 4, 5, 3, 6, 6, 3, 8, 2,
209 4, 6, 5, 5, 6, 4, 2, 8, 7, 3, 3, 7, 6, 5, 5, 6, 7, 4,
210 4, 7, 8, 3, 3, 8, 7, 5, 8, 4, 5, 7, 4, 8, 6, 6, 7, 6,
211 5, 8, 8, 5, 6, 7, 8, 6, 7, 7, 6, 8, 8, 7, 7, 8, 8, 8,
212];
213
214const RV30_ITYPE: [i8; 10*10*9] = [
215 0, 9, 9, 9, 9, 9, 9, 9, 9,
216 0, 2, 9, 9, 9, 9, 9, 9, 9,
217 9, 9, 9, 9, 9, 9, 9, 9, 9,
218 2, 0, 9, 9, 9, 9, 9, 9, 9,
219 9, 9, 9, 9, 9, 9, 9, 9, 9,
220 9, 9, 9, 9, 9, 9, 9, 9, 9,
221 9, 9, 9, 9, 9, 9, 9, 9, 9,
222 9, 9, 9, 9, 9, 9, 9, 9, 9,
223 9, 9, 9, 9, 9, 9, 9, 9, 9,
224 9, 9, 9, 9, 9, 9, 9, 9, 9,
225
226 0, 1, 9, 9, 9, 9, 9, 9, 9,
227 0, 2, 1, 6, 4, 8, 5, 7, 3,
228 1, 0, 2, 6, 5, 4, 3, 8, 7,
229 2, 8, 0, 1, 7, 4, 3, 6, 5,
230 2, 0, 1, 3, 8, 5, 4, 7, 6,
231 2, 0, 1, 4, 6, 7, 8, 3, 5,
232 0, 1, 5, 2, 6, 3, 8, 4, 7,
233 0, 1, 6, 2, 4, 7, 5, 8, 3,
234 2, 7, 0, 1, 4, 8, 6, 3, 5,
235 2, 8, 0, 1, 7, 3, 4, 5, 6,
236
237 1, 0, 9, 9, 9, 9, 9, 9, 9,
238 1, 2, 5, 6, 3, 0, 4, 8, 7,
239 1, 6, 2, 5, 3, 0, 4, 8, 7,
240 2, 1, 7, 6, 8, 3, 5, 0, 4,
241 1, 2, 5, 3, 6, 8, 4, 7, 0,
242 1, 6, 2, 0, 4, 5, 8, 7, 3,
243 1, 5, 2, 6, 3, 8, 4, 0, 7,
244 1, 6, 0, 2, 4, 5, 7, 3, 8,
245 2, 1, 7, 6, 0, 8, 5, 4, 3,
246 1, 2, 7, 8, 3, 4, 5, 6, 0,
247
248 9, 9, 9, 9, 9, 9, 9, 9, 9,
249 0, 2, 1, 8, 7, 6, 5, 4, 3,
250 1, 2, 0, 6, 5, 7, 4, 8, 3,
251 2, 8, 7, 1, 0, 6, 4, 3, 5,
252 2, 0, 8, 1, 3, 7, 5, 4, 6,
253 2, 0, 4, 1, 7, 8, 6, 3, 5,
254 2, 0, 1, 5, 8, 4, 6, 7, 3,
255 2, 0, 6, 1, 4, 7, 8, 5, 3,
256 2, 7, 8, 1, 0, 5, 4, 6, 3,
257 2, 8, 7, 1, 0, 4, 3, 6, 5,
258
259 9, 9, 9, 9, 9, 9, 9, 9, 9,
260 0, 2, 1, 3, 5, 8, 6, 4, 7,
261 1, 0, 2, 5, 3, 6, 4, 8, 7,
262 2, 8, 1, 0, 3, 5, 7, 6, 4,
263 3, 2, 5, 8, 1, 4, 6, 7, 0,
264 4, 2, 0, 6, 1, 5, 8, 3, 7,
265 5, 3, 1, 2, 8, 6, 4, 0, 7,
266 1, 6, 0, 2, 4, 5, 8, 3, 7,
267 2, 7, 0, 1, 5, 4, 8, 6, 3,
268 2, 8, 3, 5, 1, 0, 7, 6, 4,
269
270 9, 9, 9, 9, 9, 9, 9, 9, 9,
271 2, 0, 6, 1, 4, 7, 5, 8, 3,
272 1, 6, 2, 0, 4, 5, 3, 7, 8,
273 2, 8, 7, 6, 4, 0, 1, 5, 3,
274 4, 2, 1, 0, 6, 8, 3, 5, 7,
275 4, 2, 6, 0, 1, 5, 7, 8, 3,
276 1, 2, 5, 0, 6, 3, 4, 7, 8,
277 6, 4, 0, 1, 2, 7, 5, 3, 8,
278 2, 7, 4, 6, 0, 1, 8, 5, 3,
279 2, 8, 7, 4, 6, 1, 3, 5, 0,
280
281 9, 9, 9, 9, 9, 9, 9, 9, 9,
282 5, 1, 2, 3, 6, 8, 0, 4, 7,
283 1, 5, 6, 3, 2, 0, 4, 8, 7,
284 2, 1, 5, 3, 6, 8, 7, 4, 0,
285 5, 3, 1, 2, 6, 8, 4, 7, 0,
286 1, 6, 2, 4, 5, 8, 0, 3, 7,
287 5, 1, 3, 6, 2, 0, 8, 4, 7,
288 1, 6, 5, 2, 0, 4, 3, 7, 8,
289 2, 7, 1, 6, 5, 0, 8, 3, 4,
290 2, 5, 1, 3, 6, 8, 4, 0, 7,
291
292 9, 9, 9, 9, 9, 9, 9, 9, 9,
293 1, 6, 2, 0, 5, 4, 3, 7, 8,
294 1, 6, 5, 4, 2, 3, 0, 7, 8,
295 2, 1, 6, 7, 4, 8, 5, 3, 0,
296 2, 1, 6, 5, 8, 4, 3, 0, 7,
297 6, 4, 1, 2, 0, 5, 7, 8, 3,
298 1, 6, 5, 2, 3, 0, 4, 8, 7,
299 6, 1, 4, 0, 2, 7, 5, 3, 8,
300 2, 7, 4, 6, 1, 5, 0, 8, 3,
301 2, 1, 6, 8, 4, 7, 3, 5, 0,
302
303 9, 9, 9, 9, 9, 9, 9, 9, 9,
304 2, 0, 4, 7, 6, 1, 8, 5, 3,
305 6, 1, 2, 0, 4, 7, 5, 8, 3,
306 2, 7, 8, 0, 1, 6, 4, 3, 5,
307 2, 4, 0, 8, 3, 1, 7, 6, 5,
308 4, 2, 7, 0, 6, 1, 8, 5, 3,
309 2, 1, 0, 8, 5, 6, 7, 4, 3,
310 2, 6, 4, 1, 7, 0, 5, 8, 3,
311 2, 7, 4, 0, 8, 6, 1, 5, 3,
312 2, 8, 7, 4, 1, 0, 3, 6, 5,
313
314 9, 9, 9, 9, 9, 9, 9, 9, 9,
315 2, 0, 8, 1, 3, 4, 6, 5, 7,
316 1, 2, 0, 6, 8, 5, 7, 3, 4,
317 2, 8, 7, 1, 0, 3, 6, 5, 4,
318 8, 3, 2, 5, 1, 0, 4, 7, 6,
319 2, 0, 4, 8, 5, 1, 7, 6, 3,
320 2, 1, 0, 8, 5, 3, 6, 4, 7,
321 2, 1, 6, 0, 8, 4, 5, 7, 3,
322 2, 7, 8, 4, 0, 6, 1, 5, 3,
323 2, 8, 3, 0, 7, 4, 1, 6, 5,
324];