-use std::rc::Rc;
-use std::cell::RefCell;
use nihav_core::io::bitreader::*;
use nihav_core::io::codebook::*;
use nihav_core::formats;
}
struct RealVideo20Decoder {
- info: Rc<NACodecInfo>,
+ info: NACodecInfoRef,
dec: H263BaseDecoder,
tables: Tables,
w: usize,
impl RV20SliceInfo {
fn new(ftype: Type, seq: u32, qscale: u8, mb_x: usize, mb_y: usize, mb_pos: usize, w: usize, h: usize) -> Self {
- RV20SliceInfo { ftype: ftype, seq: seq, qscale: qscale, mb_x: mb_x, mb_y: mb_y, mb_pos: mb_pos, w: w, h: h }
+ RV20SliceInfo { ftype, seq, qscale, mb_x, mb_y, mb_pos, w, h }
}
}
}
RealVideo20BR {
br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE),
- tables: tables,
+ tables,
num_slices: nslices,
slice_no: 0,
slice_off: slice_offs,
w: width,
h: height,
- mb_w: mb_w,
- mb_h: mb_h,
+ mb_w,
+ mb_h,
mb_pos_bits: mbpb,
- minor_ver: minor_ver,
- rpr: rpr,
+ minor_ver,
+ rpr,
}
}
let scan = match acpred {
ACPredMode::Hor => H263_SCAN_V,
ACPredMode::Ver => H263_SCAN_H,
- _ => H263_ZIGZAG,
+ _ => &ZIGZAG,
};
let rl_cb = if sstate.is_iframe { &self.tables.aic_rl_cb } else { &self.tables.rl_cb };
let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
let tables = Tables {
- intra_mcbpc_cb: intra_mcbpc_cb,
- inter_mcbpc_cb: inter_mcbpc_cb,
- mbtype_b_cb: mbtype_b_cb,
- cbpy_cb: cbpy_cb,
- cbpc_b_cb: cbpc_b_cb,
- rl_cb: rl_cb,
- aic_rl_cb: aic_rl_cb,
- mv_cb: mv_cb,
+ intra_mcbpc_cb,
+ inter_mcbpc_cb,
+ mbtype_b_cb,
+ cbpy_cb,
+ cbpc_b_cb,
+ rl_cb,
+ aic_rl_cb,
+ mv_cb,
};
RealVideo20Decoder{
- info: Rc::new(DUMMY_CODEC_INFO),
+ info: NACodecInfoRef::default(),
dec: H263BaseDecoder::new_b_frames(false),
- tables: tables,
+ tables,
w: 0,
h: 0,
minor_ver: 0,
impl NADecoder for RealVideo20Decoder {
#[allow(unused_variables)]
- fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
+ fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
let w = vinfo.get_width();
let h = vinfo.get_height();
let fmt = formats::YUV420_FORMAT;
let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
- self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
+ self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
self.w = w;
self.h = h;
Err(DecoderError::InvalidData)
}
}
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
+ fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
let src = pkt.get_buffer();
let mut ibr = RealVideo20BR::new(&src, &self.tables, self.w, self.h, self.minor_ver, self.rpr);
let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
frm.set_keyframe(self.dec.is_intra());
frm.set_frame_type(self.dec.get_frame_type());
- Ok(Rc::new(RefCell::new(frm)))
+ Ok(frm.into_ref())
+ }
+ fn flush(&mut self) {
+ self.dec.flush();
}
}
MBB{ blocks: 65536, bits: 14 },
];
-pub fn get_decoder() -> Box<NADecoder> {
+pub fn get_decoder() -> Box<dyn NADecoder + Send> {
Box::new(RealVideo20Decoder::new())
}
#[cfg(test)]
mod test {
- use crate::test::dec_video::test_file_decoding;
+ use nihav_core::codecs::RegisteredDecoders;
+ use nihav_core::demuxers::RegisteredDemuxers;
+ use nihav_core::test::dec_video::*;
+ use crate::codecs::realmedia_register_all_codecs;
+ use crate::demuxers::realmedia_register_all_demuxers;
#[test]
fn test_rv20() {
- test_file_decoding("realmedia", "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm", /*None*/Some(3000), true, false, None/*Some("rv20")*/);
+ let mut dmx_reg = RegisteredDemuxers::new();
+ realmedia_register_all_demuxers(&mut dmx_reg);
+ let mut dec_reg = RegisteredDecoders::new();
+ realmedia_register_all_codecs(&mut dec_reg);
+
+ test_file_decoding("realmedia", "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm", /*None*/Some(3000), true, false, None/*Some("rv20")*/, &dmx_reg, &dec_reg);
// test_file_decoding("realmedia", "assets/RV/rv20_cook_640x352_realproducer_plus_8.51.rm", /*None*/Some(1000), true, false, Some("rv20"));
}
}