diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2022-02-06 22:47:36 +0300 |
---|---|---|
committer | Sebastian Dröge <slomo@coaxion.net> | 2022-02-07 10:30:57 +0300 |
commit | d3d483d0b5dc162e5fe0028075a64bb078bd0950 (patch) | |
tree | 1fb853625f19383398dc6c370d43be8a5c978cb0 /video/rav1e | |
parent | 76545672011a5439cca0de0878c6de165037302d (diff) |
rav1enc: Simplify code
Sending a `None` frame is equivalent to calling `flush()` so no need to
do both.
Diffstat (limited to 'video/rav1e')
-rw-r--r-- | video/rav1e/src/rav1enc/imp.rs | 129 |
1 files changed, 60 insertions, 69 deletions
diff --git a/video/rav1e/src/rav1enc/imp.rs b/video/rav1e/src/rav1enc/imp.rs index 5cc29e9f..9d3eaf11 100644 --- a/video/rav1e/src/rav1enc/imp.rs +++ b/video/rav1e/src/rav1enc/imp.rs @@ -124,83 +124,76 @@ impl Context { fn send_frame( &mut self, - in_frame: Option<(u32, &gst_video::VideoFrameRef<&gst::BufferRef>)>, + frame_number: u32, + in_frame: &gst_video::VideoFrameRef<&gst::BufferRef>, force_keyframe: bool, ) -> Result<(), data::EncoderStatus> { match self { Context::Eight(ref mut context) => { - if let Some((frame_number, in_frame)) = in_frame { - let mut enc_frame = context.new_frame(); - enc_frame.planes[0].copy_from_raw_u8( - in_frame.plane_data(0).unwrap(), - in_frame.plane_stride()[0] as usize, + let mut enc_frame = context.new_frame(); + enc_frame.planes[0].copy_from_raw_u8( + in_frame.plane_data(0).unwrap(), + in_frame.plane_stride()[0] as usize, + 1, + ); + + if in_frame.n_planes() > 1 { + enc_frame.planes[1].copy_from_raw_u8( + in_frame.plane_data(1).unwrap(), + in_frame.plane_stride()[1] as usize, + 1, + ); + enc_frame.planes[2].copy_from_raw_u8( + in_frame.plane_data(2).unwrap(), + in_frame.plane_stride()[2] as usize, 1, ); - - if in_frame.n_planes() > 1 { - enc_frame.planes[1].copy_from_raw_u8( - in_frame.plane_data(1).unwrap(), - in_frame.plane_stride()[1] as usize, - 1, - ); - enc_frame.planes[2].copy_from_raw_u8( - in_frame.plane_data(2).unwrap(), - in_frame.plane_stride()[2] as usize, - 1, - ); - } - - context.send_frame(( - enc_frame, - Some(rav1e::data::FrameParameters { - frame_type_override: if force_keyframe { - rav1e::prelude::FrameTypeOverride::Key - } else { - rav1e::prelude::FrameTypeOverride::No - }, - opaque: Some(rav1e::prelude::Opaque::new(frame_number)), - }), - )) - } else { - context.send_frame(None) } + + context.send_frame(( + enc_frame, + Some(rav1e::data::FrameParameters { + frame_type_override: if force_keyframe { + rav1e::prelude::FrameTypeOverride::Key + } else { + rav1e::prelude::FrameTypeOverride::No + }, + opaque: Some(rav1e::prelude::Opaque::new(frame_number)), + }), + )) } Context::Sixteen(ref mut context) => { - if let Some((frame_number, in_frame)) = in_frame { - let mut enc_frame = context.new_frame(); - enc_frame.planes[0].copy_from_raw_u8( - in_frame.plane_data(0).unwrap(), - in_frame.plane_stride()[0] as usize, + let mut enc_frame = context.new_frame(); + enc_frame.planes[0].copy_from_raw_u8( + in_frame.plane_data(0).unwrap(), + in_frame.plane_stride()[0] as usize, + 2, + ); + + if in_frame.n_planes() > 1 { + enc_frame.planes[1].copy_from_raw_u8( + in_frame.plane_data(1).unwrap(), + in_frame.plane_stride()[1] as usize, + 2, + ); + enc_frame.planes[2].copy_from_raw_u8( + in_frame.plane_data(2).unwrap(), + in_frame.plane_stride()[2] as usize, 2, ); - - if in_frame.n_planes() > 1 { - enc_frame.planes[1].copy_from_raw_u8( - in_frame.plane_data(1).unwrap(), - in_frame.plane_stride()[1] as usize, - 2, - ); - enc_frame.planes[2].copy_from_raw_u8( - in_frame.plane_data(2).unwrap(), - in_frame.plane_stride()[2] as usize, - 2, - ); - } - - context.send_frame(( - enc_frame, - Some(rav1e::data::FrameParameters { - frame_type_override: if force_keyframe { - rav1e::prelude::FrameTypeOverride::Key - } else { - rav1e::prelude::FrameTypeOverride::No - }, - opaque: Some(rav1e::prelude::Opaque::new(frame_number)), - }), - )) - } else { - context.send_frame(None) } + + context.send_frame(( + enc_frame, + Some(rav1e::data::FrameParameters { + frame_type_override: if force_keyframe { + rav1e::prelude::FrameTypeOverride::Key + } else { + rav1e::prelude::FrameTypeOverride::No + }, + opaque: Some(rav1e::prelude::Opaque::new(frame_number)), + }), + )) } } } @@ -895,9 +888,6 @@ impl VideoEncoderImpl for Rav1Enc { let mut state_guard = self.state.lock().unwrap(); if let Some(ref mut state) = *state_guard { - if let Err(data::EncoderStatus::Failure) = state.context.send_frame(None, false) { - return Err(gst::FlowError::Error); - } state.context.flush(); self.output_frames(element, state)?; } @@ -936,7 +926,8 @@ impl VideoEncoderImpl for Rav1Enc { })?; match state.context.send_frame( - Some((frame.system_frame_number(), &in_frame)), + frame.system_frame_number(), + &in_frame, frame .flags() .contains(gst_video::VideoCodecFrameFlags::FORCE_KEYFRAME), |