]>
Commit | Line | Data |
---|---|---|
5641dccf KS |
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::*; | |
47527732 KS |
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 { | |
3167c45c KS |
168 | use nihav_core::codecs::RegisteredDecoders; |
169 | use nihav_core::demuxers::RegisteredDemuxers; | |
170 | use nihav_core::test::dec_video::*; | |
171 | use crate::codecs::realmedia_register_all_codecs; | |
172 | use crate::demuxers::realmedia_register_all_demuxers; | |
47527732 KS |
173 | #[test] |
174 | fn test_rv30() { | |
3167c45c KS |
175 | let mut dmx_reg = RegisteredDemuxers::new(); |
176 | realmedia_register_all_demuxers(&mut dmx_reg); | |
177 | let mut dec_reg = RegisteredDecoders::new(); | |
178 | realmedia_register_all_codecs(&mut dec_reg); | |
179 | ||
47527732 | 180 | // test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30")); |
3167c45c | 181 | test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/, &dmx_reg, &dec_reg); |
47527732 KS |
182 | // test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30")); |
183 | //panic!("end"); | |
184 | } | |
185 | } | |
186 | ||
187 | const RV30_QUANT_DC: [u8; 32] = [ | |
188 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
189 | 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25 | |
190 | ]; | |
191 | ||
192 | const RV30_MB_TYPES: [[MBType; 6]; 2] = [ | |
193 | [ MBType::MBSkip, MBType::MBP16x16, MBType::MBP8x8, MBType::Invalid, MBType::MBIntra, MBType::MBIntra16 ], | |
194 | [ MBType::MBSkip, MBType::MBDirect, MBType::MBForward, MBType::MBBackward, MBType::MBIntra, MBType::MBIntra16 ], | |
195 | ]; | |
196 | ||
197 | const RV30_ITYPE_MAP: [i8; 9*9*2] = [ | |
198 | 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 0, 0, 3, 3, 0, 1, 2, | |
199 | 2, 1, 0, 4, 4, 0, 3, 1, 1, 3, 0, 5, 5, 0, 2, 2, 1, 4, | |
200 | 4, 1, 0, 6, 3, 2, 1, 5, 2, 3, 5, 1, 6, 0, 0, 7, 4, 2, | |
201 | 2, 4, 3, 3, 6, 1, 1, 6, 7, 0, 0, 8, 5, 2, 4, 3, 2, 5, | |
202 | 3, 4, 1, 7, 4, 4, 7, 1, 8, 0, 6, 2, 3, 5, 5, 3, 2, 6, | |
203 | 1, 8, 2, 7, 7, 2, 8, 1, 5, 4, 4, 5, 3, 6, 6, 3, 8, 2, | |
204 | 4, 6, 5, 5, 6, 4, 2, 8, 7, 3, 3, 7, 6, 5, 5, 6, 7, 4, | |
205 | 4, 7, 8, 3, 3, 8, 7, 5, 8, 4, 5, 7, 4, 8, 6, 6, 7, 6, | |
206 | 5, 8, 8, 5, 6, 7, 8, 6, 7, 7, 6, 8, 8, 7, 7, 8, 8, 8, | |
207 | ]; | |
208 | ||
209 | const RV30_ITYPE: [i8; 10*10*9] = [ | |
210 | 0, 9, 9, 9, 9, 9, 9, 9, 9, | |
211 | 0, 2, 9, 9, 9, 9, 9, 9, 9, | |
212 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
213 | 2, 0, 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 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
219 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
220 | ||
221 | 0, 1, 9, 9, 9, 9, 9, 9, 9, | |
222 | 0, 2, 1, 6, 4, 8, 5, 7, 3, | |
223 | 1, 0, 2, 6, 5, 4, 3, 8, 7, | |
224 | 2, 8, 0, 1, 7, 4, 3, 6, 5, | |
225 | 2, 0, 1, 3, 8, 5, 4, 7, 6, | |
226 | 2, 0, 1, 4, 6, 7, 8, 3, 5, | |
227 | 0, 1, 5, 2, 6, 3, 8, 4, 7, | |
228 | 0, 1, 6, 2, 4, 7, 5, 8, 3, | |
229 | 2, 7, 0, 1, 4, 8, 6, 3, 5, | |
230 | 2, 8, 0, 1, 7, 3, 4, 5, 6, | |
231 | ||
232 | 1, 0, 9, 9, 9, 9, 9, 9, 9, | |
233 | 1, 2, 5, 6, 3, 0, 4, 8, 7, | |
234 | 1, 6, 2, 5, 3, 0, 4, 8, 7, | |
235 | 2, 1, 7, 6, 8, 3, 5, 0, 4, | |
236 | 1, 2, 5, 3, 6, 8, 4, 7, 0, | |
237 | 1, 6, 2, 0, 4, 5, 8, 7, 3, | |
238 | 1, 5, 2, 6, 3, 8, 4, 0, 7, | |
239 | 1, 6, 0, 2, 4, 5, 7, 3, 8, | |
240 | 2, 1, 7, 6, 0, 8, 5, 4, 3, | |
241 | 1, 2, 7, 8, 3, 4, 5, 6, 0, | |
242 | ||
243 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
244 | 0, 2, 1, 8, 7, 6, 5, 4, 3, | |
245 | 1, 2, 0, 6, 5, 7, 4, 8, 3, | |
246 | 2, 8, 7, 1, 0, 6, 4, 3, 5, | |
247 | 2, 0, 8, 1, 3, 7, 5, 4, 6, | |
248 | 2, 0, 4, 1, 7, 8, 6, 3, 5, | |
249 | 2, 0, 1, 5, 8, 4, 6, 7, 3, | |
250 | 2, 0, 6, 1, 4, 7, 8, 5, 3, | |
251 | 2, 7, 8, 1, 0, 5, 4, 6, 3, | |
252 | 2, 8, 7, 1, 0, 4, 3, 6, 5, | |
253 | ||
254 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
255 | 0, 2, 1, 3, 5, 8, 6, 4, 7, | |
256 | 1, 0, 2, 5, 3, 6, 4, 8, 7, | |
257 | 2, 8, 1, 0, 3, 5, 7, 6, 4, | |
258 | 3, 2, 5, 8, 1, 4, 6, 7, 0, | |
259 | 4, 2, 0, 6, 1, 5, 8, 3, 7, | |
260 | 5, 3, 1, 2, 8, 6, 4, 0, 7, | |
261 | 1, 6, 0, 2, 4, 5, 8, 3, 7, | |
262 | 2, 7, 0, 1, 5, 4, 8, 6, 3, | |
263 | 2, 8, 3, 5, 1, 0, 7, 6, 4, | |
264 | ||
265 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
266 | 2, 0, 6, 1, 4, 7, 5, 8, 3, | |
267 | 1, 6, 2, 0, 4, 5, 3, 7, 8, | |
268 | 2, 8, 7, 6, 4, 0, 1, 5, 3, | |
269 | 4, 2, 1, 0, 6, 8, 3, 5, 7, | |
270 | 4, 2, 6, 0, 1, 5, 7, 8, 3, | |
271 | 1, 2, 5, 0, 6, 3, 4, 7, 8, | |
272 | 6, 4, 0, 1, 2, 7, 5, 3, 8, | |
273 | 2, 7, 4, 6, 0, 1, 8, 5, 3, | |
274 | 2, 8, 7, 4, 6, 1, 3, 5, 0, | |
275 | ||
276 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
277 | 5, 1, 2, 3, 6, 8, 0, 4, 7, | |
278 | 1, 5, 6, 3, 2, 0, 4, 8, 7, | |
279 | 2, 1, 5, 3, 6, 8, 7, 4, 0, | |
280 | 5, 3, 1, 2, 6, 8, 4, 7, 0, | |
281 | 1, 6, 2, 4, 5, 8, 0, 3, 7, | |
282 | 5, 1, 3, 6, 2, 0, 8, 4, 7, | |
283 | 1, 6, 5, 2, 0, 4, 3, 7, 8, | |
284 | 2, 7, 1, 6, 5, 0, 8, 3, 4, | |
285 | 2, 5, 1, 3, 6, 8, 4, 0, 7, | |
286 | ||
287 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
288 | 1, 6, 2, 0, 5, 4, 3, 7, 8, | |
289 | 1, 6, 5, 4, 2, 3, 0, 7, 8, | |
290 | 2, 1, 6, 7, 4, 8, 5, 3, 0, | |
291 | 2, 1, 6, 5, 8, 4, 3, 0, 7, | |
292 | 6, 4, 1, 2, 0, 5, 7, 8, 3, | |
293 | 1, 6, 5, 2, 3, 0, 4, 8, 7, | |
294 | 6, 1, 4, 0, 2, 7, 5, 3, 8, | |
295 | 2, 7, 4, 6, 1, 5, 0, 8, 3, | |
296 | 2, 1, 6, 8, 4, 7, 3, 5, 0, | |
297 | ||
298 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
299 | 2, 0, 4, 7, 6, 1, 8, 5, 3, | |
300 | 6, 1, 2, 0, 4, 7, 5, 8, 3, | |
301 | 2, 7, 8, 0, 1, 6, 4, 3, 5, | |
302 | 2, 4, 0, 8, 3, 1, 7, 6, 5, | |
303 | 4, 2, 7, 0, 6, 1, 8, 5, 3, | |
304 | 2, 1, 0, 8, 5, 6, 7, 4, 3, | |
305 | 2, 6, 4, 1, 7, 0, 5, 8, 3, | |
306 | 2, 7, 4, 0, 8, 6, 1, 5, 3, | |
307 | 2, 8, 7, 4, 1, 0, 3, 6, 5, | |
308 | ||
309 | 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
310 | 2, 0, 8, 1, 3, 4, 6, 5, 7, | |
311 | 1, 2, 0, 6, 8, 5, 7, 3, 4, | |
312 | 2, 8, 7, 1, 0, 3, 6, 5, 4, | |
313 | 8, 3, 2, 5, 1, 0, 4, 7, 6, | |
314 | 2, 0, 4, 8, 5, 1, 7, 6, 3, | |
315 | 2, 1, 0, 8, 5, 3, 6, 4, 7, | |
316 | 2, 1, 6, 0, 8, 4, 5, 7, 3, | |
317 | 2, 7, 8, 4, 0, 6, 1, 5, 3, | |
318 | 2, 8, 3, 0, 7, 4, 1, 6, 5, | |
319 | ]; |