+ let ret_eparams = ret_eparams.unwrap();
+
+//todo check for params mismatch
+ let cvt = match (&oopts.enc_params.format, &ret_eparams.format) {
+ (NACodecTypeInfo::Video(svinfo), NACodecTypeInfo::Video(dvinfo)) => {
+ if svinfo == dvinfo {
+ OutputConvert::None
+ } else {
+ let ofmt = ScaleInfo { fmt: dvinfo.format, width: dvinfo.width, height: dvinfo.height };
+ let ret = NAScale::new_with_options(ofmt, ofmt, &self.scale_opts);
+ if ret.is_err() {
+ println!("cannot create scaler");
+ return false;
+ }
+ let scaler = ret.unwrap();
+ let ret = alloc_video_buffer(*dvinfo, 4);
+ if ret.is_err() {
+ println!("cannot create scaler buffer");
+ return false;
+ }
+ let cvt_buf = ret.unwrap();
+ OutputConvert::Video(scaler, cvt_buf)
+ }
+ },
+ (NACodecTypeInfo::Audio(sainfo), NACodecTypeInfo::Audio(dainfo)) => {
+ if sainfo == dainfo {
+ OutputConvert::None
+ } else {
+ let dchmap = match dainfo.channels {
+ 1 => NAChannelMap::from_ms_mapping(0x4),
+ 2 => NAChannelMap::from_ms_mapping(0x3),
+ _ => {
+println!("can't generate default channel map for {} channels", dainfo.channels);
+ return false;
+ },
+ };
+//todo channelmap
+ let acvt = AudioConverter::new(sainfo, dainfo, dchmap);
+ OutputConvert::Audio(acvt)
+ }
+ },
+ _ => OutputConvert::None,
+ };
+ let ret = encoder.init(out_id, ret_eparams);
+ if ret.is_err() {
+ println!("error initialising encoder");
+ return false;
+ }
+ out_sm.add_stream_ref(ret.unwrap());
+ self.encoders.push(OutputMode::Encode(out_id, encoder, cvt));
+ self.ostr_opts.push(oopts);