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::*;
11 struct RealVideo30BR {
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 {
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])
49 (self.width, self.height)
51 let start = br.read(get_slice_start_offset_bits(w, h))? as usize;
54 Ok(RV34SliceHeader{ ftype: ftype, quant: q, deblock: deblock, pts: pts, width: w, height: h, start: start, end: 0, set_idx: 0 })
56 fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, _has_top: bool) -> DecoderResult<()> {
59 let code = br.read_code(UintCodeType::Gamma)? as usize;
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);
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;
81 let idx = if ftype == FrameType::P { 0 } else { 1 };
82 Ok(MBInfo { mbtype: RV30_MB_TYPES[idx][code], skip_run: 0, dquant: dq })
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;
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];
102 fn quant_dc(&self, _is_intra: bool, q: u8) -> u8 { RV30_QUANT_DC[q as usize] }
105 struct RealVideo30Decoder {
107 info: Rc<NACodecInfo>,
111 impl RealVideo30Decoder {
114 bd: RealVideo30BR::new(),
115 info: Rc::new(DUMMY_CODEC_INFO),
116 dec: RV34Decoder::new(true, Box::new(RV30DSP::new())),
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()));
128 let edata = info.get_extradata().unwrap();
129 let src: &[u8] = &edata;
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);
141 self.bd.width = vinfo.get_width();
142 self.bd.height = vinfo.get_height();
146 Err(DecoderError::InvalidData)
149 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
150 let src = pkt.get_buffer();
152 let (bufinfo, ftype, pts) = self.dec.parse_frame(src.as_slice(), &mut self.bd)?;
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)))
162 pub fn get_decoder() -> Box<NADecoder> {
163 Box::new(RealVideo30Decoder::new())
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;
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);
180 // test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30"));
181 test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/, &dmx_reg, &dec_reg);
182 // test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30"));
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
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 ],
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,