let frm = ret.unwrap();
dec_ctx.reorderer.add_frame(frm);
while let Some(frm) = dec_ctx.reorderer.get_frame() {
- if !encoder.encode_frame(dst_id, frm, &transcoder.scale_opts, &mut transcoder.queue) {
- break;
+ match encoder.encode_frame(dst_id, frm, &transcoder.scale_opts, &mut transcoder.queue) {
+ Ok(true) => {},
+ Ok(false) => break,
+ Err(err) => {
+ println!("encoder error {err:?}");
+ break 'main_loop;
+ }
}
}
} else {
break;
}
}
- /*'reord_flush_loop:*/ for stream in ism.iter() {
+ 'reord_flush_loop: for stream in ism.iter() {
let src_id = stream.get_num();
if let OutputMode::Encode(dst_id, ref mut encoder) = transcoder.encoders[src_id] {
if let Some(ref mut dec_ctx) = transcoder.decoders[src_id] {
while let Some(frm) = dec_ctx.reorderer.get_last_frames() {
- if !encoder.encode_frame(dst_id, frm, &transcoder.scale_opts, &mut transcoder.queue) {
- break;
+ match encoder.encode_frame(dst_id, frm, &transcoder.scale_opts, &mut transcoder.queue) {
+ Ok(true) => {},
+ Ok(false) => break,
+ Err(err) => {
+ println!("encoder error {err:?}");
+ break 'reord_flush_loop;
+ }
}
}
}
}
pub trait EncoderInterface {
- fn encode_frame(&mut self, dst_id: u32, frm: NAFrameRef, scale_opts: &[(String, String)], queue: &mut OutputQueue) -> bool;
+ fn encode_frame(&mut self, dst_id: u32, frm: NAFrameRef, scale_opts: &[(String, String)], queue: &mut OutputQueue) -> EncoderResult<bool>;
fn flush(&mut self, queue: &mut OutputQueue) -> EncoderResult<()>;
fn get_packet(&mut self) -> EncoderResult<Option<NAPacket>>;
}
}
impl EncoderInterface for AudioEncodeContext {
- fn encode_frame(&mut self, dst_id: u32, frm: NAFrameRef, _scale_opts: &[(String, String)], queue: &mut OutputQueue) -> bool {
+ fn encode_frame(&mut self, dst_id: u32, frm: NAFrameRef, _scale_opts: &[(String, String)], queue: &mut OutputQueue) -> EncoderResult<bool> {
let buf = frm.get_buffer();
let cbuf = if let NABufferType::None = buf {
buf
} else if let Some(ref mut acvt) = self.cvt {
if !acvt.queue_frame(buf, frm.get_time_information()) {
println!("error converting audio for stream {}", dst_id);
- return false;
+ return Ok(false);
}
while let Some(ofrm) = acvt.get_frame(frm.get_info().clone()) {
if self.encoder.encode(&ofrm).is_err() {
- return false;
+ return Ok(false);
}
while let Ok(Some(pkt)) = self.encoder.get_packet() {
queue.queue_packet(pkt);
}
}
- return true;
+ return Ok(true);
} else {
buf
};
let cfrm = NAFrame::new(frm.get_time_information(), frm.frame_type, frm.key, frm.get_info(), cbuf);
- self.encoder.encode(&cfrm).unwrap();
+ self.encoder.encode(&cfrm)?;
while let Ok(Some(pkt)) = self.encoder.get_packet() {
queue.queue_packet(pkt);
}
- true
+ Ok(true)
}
fn flush(&mut self, queue: &mut OutputQueue) -> EncoderResult<()> {
self.encoder.flush()?;
}
impl EncoderInterface for VideoEncodeContext {
- fn encode_frame(&mut self, dst_id: u32, frm: NAFrameRef, scale_opts: &[(String, String)], queue: &mut OutputQueue) -> bool {
+ fn encode_frame(&mut self, dst_id: u32, frm: NAFrameRef, scale_opts: &[(String, String)], queue: &mut OutputQueue) -> EncoderResult<bool> {
let buf = frm.get_buffer();
let cbuf = if let NABufferType::None = buf {
if (self.encoder.get_capabilities() & ENC_CAPS_SKIPFRAME) == 0 {
if let NABufferType::None = self.scaler_buf {
println!("encoder does not support skip frames, skipping");
- return true;
+ return Ok(true);
} else {
self.scaler_buf.clone()
}
let ret = NAScale::new_with_options(cur_ifmt, ofmt, scale_opts);
if ret.is_err() {
println!("error re-initialising scaler for {} -> {}", cur_ifmt, ofmt);
- return false;
+ return Err(EncoderError::InvalidParameters);
}
*scaler = ret.unwrap();
}
let ret = scaler.convert(&buf, &mut self.scaler_buf);
if ret.is_err() {
println!("error converting frame for encoding stream {dst_id}");
- return false;
+ return Err(EncoderError::Bug);
}
self.scaler_buf.clone()
} else {
let mut had_frame = false;
while cur_ts >= cur_lts {
cfrm.ts.pts = Some(cur_lts);
- self.encoder.encode(&cfrm).unwrap();
+ self.encoder.encode(&cfrm)?;
while let Ok(Some(pkt)) = self.encoder.get_packet() {
queue.queue_packet(pkt);
}
}
}
if !converted {
- self.encoder.encode(&cfrm).unwrap();
+ self.encoder.encode(&cfrm)?;
while let Ok(Some(pkt)) = self.encoder.get_packet() {
queue.queue_packet(pkt);
}
}
- true
+ Ok(true)
}
fn flush(&mut self, queue: &mut OutputQueue) -> EncoderResult<()> {
self.encoder.flush()?;