video: Moved individual decoders to software video backend

This commit is contained in:
= 2022-08-26 00:46:54 +02:00 committed by Mike Welsh
parent bf242bfb09
commit f0013bdec8
13 changed files with 45 additions and 40 deletions

14
Cargo.lock generated
View File

@ -3062,17 +3062,12 @@ dependencies = [
"futures", "futures",
"gc-arena", "gc-arena",
"generational-arena", "generational-arena",
"h263-rs",
"h263-rs-yuv",
"indexmap", "indexmap",
"instant", "instant",
"log", "log",
"lzma-rs", "lzma-rs",
"minimp3", "minimp3",
"nellymoser-rs", "nellymoser-rs",
"nihav_codec_support",
"nihav_core",
"nihav_duck",
"num-derive", "num-derive",
"num-traits", "num-traits",
"percent-encoding", "percent-encoding",
@ -3112,6 +3107,7 @@ dependencies = [
"rfd", "rfd",
"ruffle_core", "ruffle_core",
"ruffle_render_wgpu", "ruffle_render_wgpu",
"ruffle_video_software",
"url", "url",
"webbrowser", "webbrowser",
"winapi", "winapi",
@ -3233,7 +3229,14 @@ dependencies = [
name = "ruffle_video_software" name = "ruffle_video_software"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"flate2",
"generational-arena", "generational-arena",
"h263-rs",
"h263-rs-yuv",
"log",
"nihav_codec_support",
"nihav_core",
"nihav_duck",
"ruffle_render", "ruffle_render",
"ruffle_video", "ruffle_video",
"swf", "swf",
@ -3256,6 +3259,7 @@ dependencies = [
"ruffle_render_canvas", "ruffle_render_canvas",
"ruffle_render_webgl", "ruffle_render_webgl",
"ruffle_render_wgpu", "ruffle_render_wgpu",
"ruffle_video_software",
"ruffle_web_common", "ruffle_web_common",
"serde", "serde",
"thiserror", "thiserror",

View File

@ -38,16 +38,11 @@ rand = { version = "0.8.5", features = ["std", "small_rng"], default-features =
serde = { version = "1.0.144", features = ["derive"] } serde = { version = "1.0.144", features = ["derive"] }
serde_json = { version = "1.0", features = ["preserve_order"] } serde_json = { version = "1.0", features = ["preserve_order"] }
nellymoser-rs = { git = "https://github.com/ruffle-rs/nellymoser", rev = "4a33521c29a918950df8ae9fe07e527ac65553f5", optional = true } nellymoser-rs = { git = "https://github.com/ruffle-rs/nellymoser", rev = "4a33521c29a918950df8ae9fe07e527ac65553f5", optional = true }
h263-rs = { git = "https://github.com/ruffle-rs/h263-rs", rev = "023e14c73e565c4c778d41f66cfbac5ece6419b2", optional = true }
h263-rs-yuv = { git = "https://github.com/ruffle-rs/h263-rs", rev = "023e14c73e565c4c778d41f66cfbac5ece6419b2", optional = true }
regress = "0.4" regress = "0.4"
flash-lso = { git = "https://github.com/ruffle-rs/rust-flash-lso", rev = "19fecd07b9888c4bdaa66771c468095783b52bed" } flash-lso = { git = "https://github.com/ruffle-rs/rust-flash-lso", rev = "19fecd07b9888c4bdaa66771c468095783b52bed" }
lzma-rs = {version = "0.2.0", optional = true } lzma-rs = {version = "0.2.0", optional = true }
dasp = { git = "https://github.com/RustAudio/dasp", rev = "f05a703", features = ["interpolate", "interpolate-linear", "signal"], optional = true } dasp = { git = "https://github.com/RustAudio/dasp", rev = "f05a703", features = ["interpolate", "interpolate-linear", "signal"], optional = true }
symphonia = { version = "0.5.1", default-features = false, features = ["mp3"], optional = true } symphonia = { version = "0.5.1", default-features = false, features = ["mp3"], optional = true }
nihav_core = { git = "https://github.com/ruffle-rs/nihav-vp6", rev = "9416fcc9fc8aab8f4681aa9093b42922214abbd3", optional = true }
nihav_codec_support = { git = "https://github.com/ruffle-rs/nihav-vp6", rev = "9416fcc9fc8aab8f4681aa9093b42922214abbd3", optional = true }
nihav_duck = { git = "https://github.com/ruffle-rs/nihav-vp6", rev = "9416fcc9fc8aab8f4681aa9093b42922214abbd3", optional = true }
[target.'cfg(not(target_family = "wasm"))'.dependencies.futures] [target.'cfg(not(target_family = "wasm"))'.dependencies.futures]
version = "0.3.24" version = "0.3.24"
@ -57,9 +52,6 @@ version = "0.4.32"
[features] [features]
default = [] default = []
h263 = ["h263-rs", "h263-rs-yuv"]
vp6 = ["nihav_core", "nihav_codec_support", "nihav_duck", "h263-rs-yuv"]
screenvideo = []
lzma = ["lzma-rs", "swf/lzma"] lzma = ["lzma-rs", "swf/lzma"]
wasm-bindgen = [ "instant/wasm-bindgen" ] wasm-bindgen = [ "instant/wasm-bindgen" ]
avm_debug = [] avm_debug = []

View File

@ -1,5 +1,3 @@
//! Video decoder backends //! Video decoder backends
mod software;
pub use ruffle_video_software::backend::SoftwareVideoBackend; pub use ruffle_video_software::backend::SoftwareVideoBackend;

View File

@ -1,8 +0,0 @@
#[cfg(feature = "h263")]
pub mod h263;
#[cfg(feature = "vp6")]
pub mod vp6;
#[cfg(feature = "screenvideo")]
pub mod screen;

View File

@ -1,3 +0,0 @@
//! Pure software video decoding backend.
pub mod decoders;

View File

@ -11,6 +11,7 @@ clap = { version = "3.2.18", features = ["derive"] }
cpal = "0.14.0" cpal = "0.14.0"
ruffle_core = { path = "../core", features = ["audio", "minimp3", "nellymoser"] } ruffle_core = { path = "../core", features = ["audio", "minimp3", "nellymoser"] }
ruffle_render_wgpu = { path = "../render/wgpu", features = ["clap"] } ruffle_render_wgpu = { path = "../render/wgpu", features = ["clap"] }
ruffle_video_software = { path = "../video/software", optional = true }
env_logger = { version = "0.9", default-features = false, features = ["humantime"] } env_logger = { version = "0.9", default-features = false, features = ["humantime"] }
generational-arena = "0.2.8" generational-arena = "0.2.8"
log = "0.4" log = "0.4"
@ -30,14 +31,12 @@ winapi = "0.3.9"
embed-resource = "1" embed-resource = "1"
[features] [features]
default = ["h263", "vp6", "screenvideo"] default = ["software_video"]
# core features # core features
avm_debug = ["ruffle_core/avm_debug"] avm_debug = ["ruffle_core/avm_debug"]
h263 = ["ruffle_core/h263"]
lzma = ["ruffle_core/lzma"] lzma = ["ruffle_core/lzma"]
vp6 = ["ruffle_core/vp6"] software_video = ["ruffle_video_software"]
screenvideo = ["ruffle_core/screenvideo"]
# wgpu features # wgpu features
render_debug_labels = ["ruffle_render_wgpu/render_debug_labels"] render_debug_labels = ["ruffle_render_wgpu/render_debug_labels"]

View File

@ -11,3 +11,17 @@ ruffle_video = { path = ".." }
swf = { path = "../../swf" } swf = { path = "../../swf" }
generational-arena = "0.2.8" generational-arena = "0.2.8"
thiserror = "1.0" thiserror = "1.0"
flate2 = "1.0.24"
log = "0.4"
h263-rs = { git = "https://github.com/ruffle-rs/h263-rs", rev = "023e14c73e565c4c778d41f66cfbac5ece6419b2", optional = true }
h263-rs-yuv = { git = "https://github.com/ruffle-rs/h263-rs", rev = "023e14c73e565c4c778d41f66cfbac5ece6419b2", optional = true }
nihav_core = { git = "https://github.com/ruffle-rs/nihav-vp6", rev = "9416fcc9fc8aab8f4681aa9093b42922214abbd3", optional = true }
nihav_codec_support = { git = "https://github.com/ruffle-rs/nihav-vp6", rev = "9416fcc9fc8aab8f4681aa9093b42922214abbd3", optional = true }
nihav_duck = { git = "https://github.com/ruffle-rs/nihav-vp6", rev = "9416fcc9fc8aab8f4681aa9093b42922214abbd3", optional = true }
[features]
default = ["h263", "vp6", "screenvideo"]
h263 = ["h263-rs", "h263-rs-yuv"]
vp6 = ["nihav_core", "nihav_codec_support", "nihav_duck", "h263-rs-yuv"]
screenvideo = []

View File

@ -39,13 +39,13 @@ impl VideoBackend for SoftwareVideoBackend {
) -> Result<VideoStreamHandle, Error> { ) -> Result<VideoStreamHandle, Error> {
let decoder: Box<dyn VideoDecoder> = match codec { let decoder: Box<dyn VideoDecoder> = match codec {
#[cfg(feature = "h263")] #[cfg(feature = "h263")]
VideoCodec::H263 => Box::new(h263::H263Decoder::new()), VideoCodec::H263 => Box::new(crate::decoder::h263::H263Decoder::new()),
#[cfg(feature = "vp6")] #[cfg(feature = "vp6")]
VideoCodec::Vp6 => Box::new(vp6::Vp6Decoder::new(false, size)), VideoCodec::Vp6 => Box::new(crate::decoder::vp6::Vp6Decoder::new(false, size)),
#[cfg(feature = "vp6")] #[cfg(feature = "vp6")]
VideoCodec::Vp6WithAlpha => Box::new(vp6::Vp6Decoder::new(true, size)), VideoCodec::Vp6WithAlpha => Box::new(crate::decoder::vp6::Vp6Decoder::new(true, size)),
#[cfg(feature = "screenvideo")] #[cfg(feature = "screenvideo")]
VideoCodec::ScreenVideo => Box::new(screen::ScreenVideoDecoder::new()), VideoCodec::ScreenVideo => Box::new(crate::decoder::screen::ScreenVideoDecoder::new()),
other => return Err(Error::UnsupportedCodec(other)), other => return Err(Error::UnsupportedCodec(other)),
}; };
let stream = VideoStream::new(decoder); let stream = VideoStream::new(decoder);

View File

@ -1,6 +1,15 @@
use ruffle_video::error::Error; use ruffle_video::error::Error;
use ruffle_video::frame::{DecodedFrame, EncodedFrame, FrameDependency}; use ruffle_video::frame::{DecodedFrame, EncodedFrame, FrameDependency};
#[cfg(feature = "h263")]
pub mod h263;
#[cfg(feature = "vp6")]
pub mod vp6;
#[cfg(feature = "screenvideo")]
pub mod screen;
/// Trait for video decoders. /// Trait for video decoders.
/// This should be implemented for each video codec. /// This should be implemented for each video codec.
pub trait VideoDecoder { pub trait VideoDecoder {

View File

@ -1,9 +1,9 @@
use crate::decoder::VideoDecoder;
use h263_rs::parser::H263Reader; use h263_rs::parser::H263Reader;
use h263_rs::{DecoderOption, H263State, PictureTypeCode}; use h263_rs::{DecoderOption, H263State, PictureTypeCode};
use h263_rs_yuv::bt601::yuv420_to_rgba; use h263_rs_yuv::bt601::yuv420_to_rgba;
use ruffle_video::error::Error; use ruffle_video::error::Error;
use ruffle_video::frame::{DecodedFrame, EncodedFrame, FrameDependency}; use ruffle_video::frame::{DecodedFrame, EncodedFrame, FrameDependency};
use ruffle_video_software::decoder::VideoDecoder;
#[derive(thiserror::Error, Debug)] #[derive(thiserror::Error, Debug)]
pub enum H263Error { pub enum H263Error {

View File

@ -1,8 +1,8 @@
// This module is heavily based on flashsv.rs from NihAV, // This module is heavily based on flashsv.rs from NihAV,
// written by Kostya Shishkov, with permission. // written by Kostya Shishkov, with permission.
use crate::decoder::VideoDecoder;
use ruffle_video::error::Error; use ruffle_video::error::Error;
use ruffle_video_software::decoder::VideoDecoder;
use flate2::Decompress; use flate2::Decompress;
use ruffle_video::frame::{DecodedFrame, EncodedFrame, FrameDependency}; use ruffle_video::frame::{DecodedFrame, EncodedFrame, FrameDependency};

View File

@ -1,5 +1,5 @@
use crate::decoder::VideoDecoder;
use ruffle_video::error::Error; use ruffle_video::error::Error;
use ruffle_video_software::decoder::VideoDecoder;
use h263_rs_yuv::bt601::yuv420_to_rgba; use h263_rs_yuv::bt601::yuv420_to_rgba;

View File

@ -18,7 +18,6 @@ default = ["canvas", "console_error_panic_hook", "console_log", "webgl"]
# core features # core features
avm_debug = ["ruffle_core/avm_debug"] avm_debug = ["ruffle_core/avm_debug"]
h263 = ["ruffle_core/h263"]
lzma = ["ruffle_core/lzma"] lzma = ["ruffle_core/lzma"]
# web features # web features
@ -36,6 +35,7 @@ ruffle_render_canvas = { path = "../render/canvas", optional = true }
ruffle_web_common = { path = "common" } ruffle_web_common = { path = "common" }
ruffle_render_webgl = { path = "../render/webgl", optional = true } ruffle_render_webgl = { path = "../render/webgl", optional = true }
ruffle_render_wgpu = { path = "../render/wgpu", optional = true } ruffle_render_wgpu = { path = "../render/wgpu", optional = true }
ruffle_video_software = { path = "../video/software" }
url = "2.2.2" url = "2.2.2"
wasm-bindgen = { version = "=0.2.82", features = ["serde-serialize"] } wasm-bindgen = { version = "=0.2.82", features = ["serde-serialize"] }
wasm-bindgen-futures = "0.4.32" wasm-bindgen-futures = "0.4.32"
@ -48,7 +48,7 @@ base64 = "0.13.0"
[dependencies.ruffle_core] [dependencies.ruffle_core]
path = "../core" path = "../core"
default-features = false default-features = false
features = ["h263", "vp6", "screenvideo", "symphonia", "wasm-bindgen", "audio", "nellymoser"] features = ["audio", "nellymoser", "symphonia", "wasm-bindgen"]
[dependencies.web-sys] [dependencies.web-sys]
version = "0.3.58" version = "0.3.58"