switch to hgaiser's patched ffmpeg_next

(Also patches places where we accidentally were relying on the ffmpeg_the_third crate instead of the re-exported name. Oops)

This will allow for hardware encoding fun in a bit.. :)
This commit is contained in:
Lily Tsuru 2024-10-06 03:54:22 -04:00
parent f388eb32b2
commit 45a8d60e7a
5 changed files with 43 additions and 29 deletions

41
server/Cargo.lock generated
View file

@ -296,29 +296,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]] [[package]]
name = "ffmpeg-sys-the-third" name = "ffmpeg-next"
version = "2.0.0+ffmpeg-7.0" version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/hgaiser/rust-ffmpeg?branch=codec-context-settable#d0619becf37f3ac463d344002dd353f8aed2a21f"
checksum = "a82bfdb0a7925996707f0a7dc37b2f3251ff5a15d26e78c586adb60c240dedc5" dependencies = [
"bitflags",
"ffmpeg-sys-next",
"libc",
]
[[package]]
name = "ffmpeg-sys-next"
version = "7.0.0"
source = "git+https://github.com/hgaiser/rust-ffmpeg-sys?branch=cuda#c684bec7a322d7531648d7fc3b559970a7673806"
dependencies = [ dependencies = [
"bindgen", "bindgen",
"cc", "cc",
"libc", "libc",
"num_cpus",
"pkg-config", "pkg-config",
"vcpkg", "vcpkg",
] ]
[[package]]
name = "ffmpeg-the-third"
version = "2.0.1+ffmpeg-7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4aa99eb55979d5c1db3b0b7a807a5e50dda07f5f6c2dbc6e9b50c205f611646"
dependencies = [
"bitflags",
"ffmpeg-sys-the-third",
"libc",
]
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.33" version = "1.0.33"
@ -700,6 +699,16 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]
[[package]] [[package]]
name = "object" name = "object"
version = "0.36.4" version = "0.36.4"
@ -1308,7 +1317,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"axum", "axum",
"ffmpeg-the-third", "ffmpeg-next",
"futures", "futures",
"futures-util", "futures-util",
"rand", "rand",

View file

@ -17,9 +17,14 @@ futures = "0.3"
futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] } futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] }
# ffmpeg # ffmpeg
ffmpeg-the-third = "2.0.1" ffmpeg = { version = "7.0.0", package = "ffmpeg-next" }
# misc stuff # misc stuff
rand = "0.8.5" rand = "0.8.5"
serde = "1.0.209" serde = "1.0.209"
serde_json = "1.0.128" serde_json = "1.0.128"
[patch.crates-io]
ffmpeg = { version = "7.0.0", package = "ffmpeg-next", git = "https://github.com/hgaiser/rust-ffmpeg", branch = "codec-context-settable" }
ffmpeg-sys-next = { version = "7.0.0", git = "https://github.com/hgaiser/rust-ffmpeg-sys", branch = "cuda" }

View file

@ -143,8 +143,8 @@ async fn main() -> anyhow::Result<()> {
// make a new frame for the encoder // make a new frame for the encoder
{ {
let mut lk_frame = frame_clone.lock().expect("Couldn't lock frame"); let mut lk_frame = frame_clone.lock().expect("Couldn't lock frame");
*lk_frame = Some(ffmpeg_the_third::frame::Video::new( *lk_frame = Some(ffmpeg::frame::Video::new(
ffmpeg_the_third::format::Pixel::BGRA, ffmpeg::format::Pixel::BGRA,
size.clone().width, size.clone().width,
size.clone().height, size.clone().height,
)); ));

View file

@ -19,11 +19,11 @@ pub enum EncodeThreadOutput {
} }
#[inline] #[inline]
fn set_frame_flags(frame: &mut ffmpeg_the_third::Frame, force_keyframe: bool) { fn set_frame_flags(frame: &mut ffmpeg::Frame, force_keyframe: bool) {
unsafe { unsafe {
if force_keyframe { if force_keyframe {
(*frame.as_mut_ptr()).pict_type = ffmpeg::sys::AVPictureType::AV_PICTURE_TYPE_I; (*frame.as_mut_ptr()).pict_type = ffmpeg::sys::AVPictureType::AV_PICTURE_TYPE_I;
(*frame.as_mut_ptr()).flags = ffmpeg_the_third::sys::AV_FRAME_FLAG_KEY; (*frame.as_mut_ptr()).flags = ffmpeg::sys::AV_FRAME_FLAG_KEY;
(*frame.as_mut_ptr()).key_frame = 1; (*frame.as_mut_ptr()).key_frame = 1;
} else { } else {
(*frame.as_mut_ptr()).pict_type = ffmpeg::sys::AVPictureType::AV_PICTURE_TYPE_NONE; (*frame.as_mut_ptr()).pict_type = ffmpeg::sys::AVPictureType::AV_PICTURE_TYPE_NONE;
@ -40,7 +40,6 @@ fn encoder_thread_main(
) { ) {
let mut packet = ffmpeg::Packet::empty(); let mut packet = ffmpeg::Packet::empty();
let mut encoder: Option<H264Encoder> = None; let mut encoder: Option<H264Encoder> = None;
let mut sws = None; let mut sws = None;
@ -59,17 +58,17 @@ fn encoder_thread_main(
force_keyframe = false; force_keyframe = false;
} }
yuv_frame = Some(ffmpeg_the_third::frame::Video::new( yuv_frame = Some(ffmpeg::frame::Video::new(
ffmpeg_the_third::format::Pixel::YUV420P, ffmpeg::format::Pixel::YUV420P,
size.clone().width, size.clone().width,
size.clone().height, size.clone().height,
)); ));
sws = Some( sws = Some(
ffmpeg_the_third::software::converter( ffmpeg::software::converter(
size.clone().into(), size.clone().into(),
ffmpeg_the_third::format::Pixel::BGRA, ffmpeg::format::Pixel::BGRA,
ffmpeg_the_third::format::Pixel::YUV420P, ffmpeg::format::Pixel::YUV420P,
) )
.expect("Failed to create SWS conversion context"), .expect("Failed to create SWS conversion context"),
); );
@ -156,7 +155,7 @@ fn encoder_thread_main(
} }
pub fn encoder_thread_spawn( pub fn encoder_thread_spawn(
frame: &Arc<Mutex<Option<ffmpeg_the_third::frame::Video>>>, frame: &Arc<Mutex<Option<ffmpeg::frame::Video>>>,
) -> ( ) -> (
mpsc::Receiver<EncodeThreadOutput>, mpsc::Receiver<EncodeThreadOutput>,
mpsc::Sender<EncodeThreadInput>, mpsc::Sender<EncodeThreadInput>,

View file

@ -3,6 +3,7 @@ pub mod h264_encoder;
//pub mod lc_muxer; //pub mod lc_muxer;
/// Re-export of `ffmpeg_the_third` crate in an infinitely less obtuse name. /// Re-export of `ffmpeg_the_third` crate in an infinitely less obtuse name.
pub use ffmpeg_the_third as ffmpeg; pub use ffmpeg as ffmpeg;
pub use encoder_thread::*; pub use encoder_thread::*;