mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-01-09 10:45:27 +00:00
rav1enc: Simplify code
Sending a `None` frame is equivalent to calling `flush()` so no need to do both.
This commit is contained in:
parent
1019374324
commit
b90a670de0
1 changed files with 60 additions and 69 deletions
|
@ -124,83 +124,76 @@ impl Context {
|
||||||
|
|
||||||
fn send_frame(
|
fn send_frame(
|
||||||
&mut self,
|
&mut self,
|
||||||
in_frame: Option<(u32, &gst_video::VideoFrameRef<&gst::BufferRef>)>,
|
frame_number: u32,
|
||||||
|
in_frame: &gst_video::VideoFrameRef<&gst::BufferRef>,
|
||||||
force_keyframe: bool,
|
force_keyframe: bool,
|
||||||
) -> Result<(), data::EncoderStatus> {
|
) -> Result<(), data::EncoderStatus> {
|
||||||
match self {
|
match self {
|
||||||
Context::Eight(ref mut context) => {
|
Context::Eight(ref mut context) => {
|
||||||
if let Some((frame_number, in_frame)) = in_frame {
|
let mut enc_frame = context.new_frame();
|
||||||
let mut enc_frame = context.new_frame();
|
enc_frame.planes[0].copy_from_raw_u8(
|
||||||
enc_frame.planes[0].copy_from_raw_u8(
|
in_frame.plane_data(0).unwrap(),
|
||||||
in_frame.plane_data(0).unwrap(),
|
in_frame.plane_stride()[0] as usize,
|
||||||
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,
|
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) => {
|
Context::Sixteen(ref mut context) => {
|
||||||
if let Some((frame_number, in_frame)) = in_frame {
|
let mut enc_frame = context.new_frame();
|
||||||
let mut enc_frame = context.new_frame();
|
enc_frame.planes[0].copy_from_raw_u8(
|
||||||
enc_frame.planes[0].copy_from_raw_u8(
|
in_frame.plane_data(0).unwrap(),
|
||||||
in_frame.plane_data(0).unwrap(),
|
in_frame.plane_stride()[0] as usize,
|
||||||
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,
|
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();
|
let mut state_guard = self.state.lock().unwrap();
|
||||||
if let Some(ref mut state) = *state_guard {
|
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();
|
state.context.flush();
|
||||||
self.output_frames(element, state)?;
|
self.output_frames(element, state)?;
|
||||||
}
|
}
|
||||||
|
@ -936,7 +926,8 @@ impl VideoEncoderImpl for Rav1Enc {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
match state.context.send_frame(
|
match state.context.send_frame(
|
||||||
Some((frame.system_frame_number(), &in_frame)),
|
frame.system_frame_number(),
|
||||||
|
&in_frame,
|
||||||
frame
|
frame
|
||||||
.flags()
|
.flags()
|
||||||
.contains(gst_video::VideoCodecFrameFlags::FORCE_KEYFRAME),
|
.contains(gst_video::VideoCodecFrameFlags::FORCE_KEYFRAME),
|
||||||
|
|
Loading…
Reference in a new issue