- let buf = frm.get_buffer();
- let cbuf = match cvt {
- OutputConvert::None => buf,
- OutputConvert::Video(ref mut scaler, ref mut dbuf) => {
- let cur_ifmt = get_scale_fmt_from_pic(&buf);
- let last_ifmt = scaler.get_in_fmt();
- if cur_ifmt != last_ifmt {
- let ofmt = scaler.get_out_fmt();
- let ret = NAScale::new(cur_ifmt, ofmt);
- if ret.is_err() {
- println!("error re-initialising scaler for {} -> {}", cur_ifmt, ofmt);
- break;
- }
- *scaler = ret.unwrap();
- }
- let ret = scaler.convert(&buf, dbuf);
- if ret.is_err() {
- println!("error converting frame for encoding");
- break;
- }
- dbuf.clone()
- },
- OutputConvert::Audio(ref dinfo, ref dchmap) => {
- let ret = convert_audio_frame(&buf, dinfo, dchmap);
- if ret.is_err() {
- println!("error converting audio for stream {}", dst_id);
- break;
- }
- ret.unwrap()
- },
- };
- let cfrm = NAFrame::new(frm.get_time_information(), frm.frame_type, frm.key, frm.get_info(), cbuf);
- encoder.encode(&cfrm).unwrap();
- while let Ok(Some(pkt)) = encoder.get_packet() {
- if transcoder.end != NATimePoint::None && !pkt.ts.less_than(transcoder.end) { break 'main_loop; }
- mux.mux_frame(pkt).unwrap();
+ reorderer.add_frame(frm);
+ while let Some(frm) = reorderer.get_frame() {
+ if !encode_frame(dst_id, encoder, cvt, frm) {
+ break;
+ }
+ while let Ok(Some(pkt)) = encoder.get_packet() {
+ if transcoder.end != NATimePoint::None && !pkt.ts.less_than(transcoder.end) { break 'main_loop; }
+ mux.mux_frame(pkt).unwrap();
+ }