1 use nihav_core::formats;
2 use nihav_core::io::bitreader::*;
3 use nihav_core::io::intcode::*;
4 use nihav_core::frame::*;
5 use nihav_core::codecs::*;
29 impl 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 {
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])
47 (self.width, self.height)
49 let start = br.read(get_slice_start_offset_bits(w, h))? as usize;
52 Ok(RV34SliceHeader{ ftype, quant: q, deblock, pts, width: w, height: h, start, end: 0, set_idx: 0 })
54 fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, _has_top: bool) -> DecoderResult<()> {
57 let code = br.read_code(UintCodeType::Gamma)? as usize;
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);
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;
79 let idx = if ftype == FrameType::P { 0 } else { 1 };
80 Ok(MBInfo { mbtype: RV30_MB_TYPES[idx][code], skip_run: 0, dquant: dq })
82 fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], _mbinfo: &[RV34MBInfo]) -> (MV, MV) {
83 let mb_x = sstate.mb_x;
84 let mb_y = sstate.mb_y;
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];
100 fn quant_dc(&self, _is_intra: bool, q: u8) -> u8 { RV30_QUANT_DC[q as usize] }
103 struct RealVideo30Decoder {
105 info: NACodecInfoRef,
109 impl RealVideo30Decoder {
112 bd: RealVideo30BR::new(),
113 info: NACodecInfoRef::default(),
114 dec: RV34Decoder::new(true, Box::new(RV30DSP::new())),
119 impl NADecoder for RealVideo30Decoder {
120 fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
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));
124 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
126 let edata = info.get_extradata().unwrap();
127 let src: &[u8] = &edata;
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 {
135 self.bd.widths.push ((src[6 + i * 2] as usize) << 2);
136 self.bd.heights.push((src[7 + i * 2] as usize) << 2);
139 self.bd.width = vinfo.get_width();
140 self.bd.height = vinfo.get_height();
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)?;
148 Err(DecoderError::InvalidData)
151 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
152 let src = pkt.get_buffer();
154 let (bufinfo, ftype, pts) = self.dec.parse_frame(supp, src.as_slice(), &mut self.bd)?;
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 } );
164 pub fn get_decoder() -> Box<dyn NADecoder> {
165 Box::new(RealVideo30Decoder::new())
170 use nihav_core::codecs::RegisteredDecoders;
171 use nihav_core::demuxers::RegisteredDemuxers;
172 use nihav_core::test::dec_video::*;
173 use crate::codecs::realmedia_register_all_codecs;
174 use crate::demuxers::realmedia_register_all_demuxers;
177 let mut dmx_reg = RegisteredDemuxers::new();
178 realmedia_register_all_demuxers(&mut dmx_reg);
179 let mut dec_reg = RegisteredDecoders::new();
180 realmedia_register_all_codecs(&mut dec_reg);
182 // test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30"));
183 test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/, &dmx_reg, &dec_reg);
184 // test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30"));
189 const RV30_QUANT_DC: [u8; 32] = [
190 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
191 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25
194 const RV30_MB_TYPES: [[MBType; 6]; 2] = [
195 [ MBType::MBSkip, MBType::MBP16x16, MBType::MBP8x8, MBType::Invalid, MBType::MBIntra, MBType::MBIntra16 ],
196 [ MBType::MBSkip, MBType::MBDirect, MBType::MBForward, MBType::MBBackward, MBType::MBIntra, MBType::MBIntra16 ],
199 const RV30_ITYPE_MAP: [i8; 9*9*2] = [
200 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 0, 0, 3, 3, 0, 1, 2,
201 2, 1, 0, 4, 4, 0, 3, 1, 1, 3, 0, 5, 5, 0, 2, 2, 1, 4,
202 4, 1, 0, 6, 3, 2, 1, 5, 2, 3, 5, 1, 6, 0, 0, 7, 4, 2,
203 2, 4, 3, 3, 6, 1, 1, 6, 7, 0, 0, 8, 5, 2, 4, 3, 2, 5,
204 3, 4, 1, 7, 4, 4, 7, 1, 8, 0, 6, 2, 3, 5, 5, 3, 2, 6,
205 1, 8, 2, 7, 7, 2, 8, 1, 5, 4, 4, 5, 3, 6, 6, 3, 8, 2,
206 4, 6, 5, 5, 6, 4, 2, 8, 7, 3, 3, 7, 6, 5, 5, 6, 7, 4,
207 4, 7, 8, 3, 3, 8, 7, 5, 8, 4, 5, 7, 4, 8, 6, 6, 7, 6,
208 5, 8, 8, 5, 6, 7, 8, 6, 7, 7, 6, 8, 8, 7, 7, 8, 8, 8,
211 const RV30_ITYPE: [i8; 10*10*9] = [
212 0, 9, 9, 9, 9, 9, 9, 9, 9,
213 0, 2, 9, 9, 9, 9, 9, 9, 9,
214 9, 9, 9, 9, 9, 9, 9, 9, 9,
215 2, 0, 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 9, 9, 9, 9, 9, 9, 9, 9, 9,
221 9, 9, 9, 9, 9, 9, 9, 9, 9,
223 0, 1, 9, 9, 9, 9, 9, 9, 9,
224 0, 2, 1, 6, 4, 8, 5, 7, 3,
225 1, 0, 2, 6, 5, 4, 3, 8, 7,
226 2, 8, 0, 1, 7, 4, 3, 6, 5,
227 2, 0, 1, 3, 8, 5, 4, 7, 6,
228 2, 0, 1, 4, 6, 7, 8, 3, 5,
229 0, 1, 5, 2, 6, 3, 8, 4, 7,
230 0, 1, 6, 2, 4, 7, 5, 8, 3,
231 2, 7, 0, 1, 4, 8, 6, 3, 5,
232 2, 8, 0, 1, 7, 3, 4, 5, 6,
234 1, 0, 9, 9, 9, 9, 9, 9, 9,
235 1, 2, 5, 6, 3, 0, 4, 8, 7,
236 1, 6, 2, 5, 3, 0, 4, 8, 7,
237 2, 1, 7, 6, 8, 3, 5, 0, 4,
238 1, 2, 5, 3, 6, 8, 4, 7, 0,
239 1, 6, 2, 0, 4, 5, 8, 7, 3,
240 1, 5, 2, 6, 3, 8, 4, 0, 7,
241 1, 6, 0, 2, 4, 5, 7, 3, 8,
242 2, 1, 7, 6, 0, 8, 5, 4, 3,
243 1, 2, 7, 8, 3, 4, 5, 6, 0,
245 9, 9, 9, 9, 9, 9, 9, 9, 9,
246 0, 2, 1, 8, 7, 6, 5, 4, 3,
247 1, 2, 0, 6, 5, 7, 4, 8, 3,
248 2, 8, 7, 1, 0, 6, 4, 3, 5,
249 2, 0, 8, 1, 3, 7, 5, 4, 6,
250 2, 0, 4, 1, 7, 8, 6, 3, 5,
251 2, 0, 1, 5, 8, 4, 6, 7, 3,
252 2, 0, 6, 1, 4, 7, 8, 5, 3,
253 2, 7, 8, 1, 0, 5, 4, 6, 3,
254 2, 8, 7, 1, 0, 4, 3, 6, 5,
256 9, 9, 9, 9, 9, 9, 9, 9, 9,
257 0, 2, 1, 3, 5, 8, 6, 4, 7,
258 1, 0, 2, 5, 3, 6, 4, 8, 7,
259 2, 8, 1, 0, 3, 5, 7, 6, 4,
260 3, 2, 5, 8, 1, 4, 6, 7, 0,
261 4, 2, 0, 6, 1, 5, 8, 3, 7,
262 5, 3, 1, 2, 8, 6, 4, 0, 7,
263 1, 6, 0, 2, 4, 5, 8, 3, 7,
264 2, 7, 0, 1, 5, 4, 8, 6, 3,
265 2, 8, 3, 5, 1, 0, 7, 6, 4,
267 9, 9, 9, 9, 9, 9, 9, 9, 9,
268 2, 0, 6, 1, 4, 7, 5, 8, 3,
269 1, 6, 2, 0, 4, 5, 3, 7, 8,
270 2, 8, 7, 6, 4, 0, 1, 5, 3,
271 4, 2, 1, 0, 6, 8, 3, 5, 7,
272 4, 2, 6, 0, 1, 5, 7, 8, 3,
273 1, 2, 5, 0, 6, 3, 4, 7, 8,
274 6, 4, 0, 1, 2, 7, 5, 3, 8,
275 2, 7, 4, 6, 0, 1, 8, 5, 3,
276 2, 8, 7, 4, 6, 1, 3, 5, 0,
278 9, 9, 9, 9, 9, 9, 9, 9, 9,
279 5, 1, 2, 3, 6, 8, 0, 4, 7,
280 1, 5, 6, 3, 2, 0, 4, 8, 7,
281 2, 1, 5, 3, 6, 8, 7, 4, 0,
282 5, 3, 1, 2, 6, 8, 4, 7, 0,
283 1, 6, 2, 4, 5, 8, 0, 3, 7,
284 5, 1, 3, 6, 2, 0, 8, 4, 7,
285 1, 6, 5, 2, 0, 4, 3, 7, 8,
286 2, 7, 1, 6, 5, 0, 8, 3, 4,
287 2, 5, 1, 3, 6, 8, 4, 0, 7,
289 9, 9, 9, 9, 9, 9, 9, 9, 9,
290 1, 6, 2, 0, 5, 4, 3, 7, 8,
291 1, 6, 5, 4, 2, 3, 0, 7, 8,
292 2, 1, 6, 7, 4, 8, 5, 3, 0,
293 2, 1, 6, 5, 8, 4, 3, 0, 7,
294 6, 4, 1, 2, 0, 5, 7, 8, 3,
295 1, 6, 5, 2, 3, 0, 4, 8, 7,
296 6, 1, 4, 0, 2, 7, 5, 3, 8,
297 2, 7, 4, 6, 1, 5, 0, 8, 3,
298 2, 1, 6, 8, 4, 7, 3, 5, 0,
300 9, 9, 9, 9, 9, 9, 9, 9, 9,
301 2, 0, 4, 7, 6, 1, 8, 5, 3,
302 6, 1, 2, 0, 4, 7, 5, 8, 3,
303 2, 7, 8, 0, 1, 6, 4, 3, 5,
304 2, 4, 0, 8, 3, 1, 7, 6, 5,
305 4, 2, 7, 0, 6, 1, 8, 5, 3,
306 2, 1, 0, 8, 5, 6, 7, 4, 3,
307 2, 6, 4, 1, 7, 0, 5, 8, 3,
308 2, 7, 4, 0, 8, 6, 1, 5, 3,
309 2, 8, 7, 4, 1, 0, 3, 6, 5,
311 9, 9, 9, 9, 9, 9, 9, 9, 9,
312 2, 0, 8, 1, 3, 4, 6, 5, 7,
313 1, 2, 0, 6, 8, 5, 7, 3, 4,
314 2, 8, 7, 1, 0, 3, 6, 5, 4,
315 8, 3, 2, 5, 1, 0, 4, 7, 6,
316 2, 0, 4, 8, 5, 1, 7, 6, 3,
317 2, 1, 0, 8, 5, 3, 6, 4, 7,
318 2, 1, 6, 0, 8, 4, 5, 7, 3,
319 2, 7, 8, 4, 0, 6, 1, 5, 3,
320 2, 8, 3, 0, 7, 4, 1, 6, 5,