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 crate::test::dec_video::test_file_decoding;
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"));
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
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 ],
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,