mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-06 10:32:10 +00:00
fc891cea82
The virtio video decoder device is currently only available under very drastic conditions: a build linked against libvda (a ChromeOS-only library that needs the cros chroot to be built and linked against), and a ChromeOS-flavored Chrome instance running alongside crosvm, so the browser can provide the video decoding service through Mojo. This makes the decoder device very difficult to develop on for non-Chromies, and also for Chromies actually since they will always need a DUT to test it on. This patch introduces an alternative decoder backend based on ffmpeg's libraries that performs decoding on the host's CPU. It supports both guest pages and virtio objects as target, and can be considered a reliable and predictable way to test the decoder in any environment. We introduce our own ffmpeg bindings after a quick state of the art revealed that the existing ones were all unsuitable, either for technical or licensing reasons. Doing so is also not a big effort and does not add any new external crate dependency to crosvm. BUG=b:169295147 TEST=cargo test --features "video-decoder,ffmpeg" -p devices ffmpeg TEST=v4l2r's simple_decoder example decodes test-25fps.h264 properly with the following command: ./simple_decoder test-25fps.h264 /dev/video0 --input_format h264 --save test-25fps.nv12 TEST=ARCVM Android youtube plays videos correctly when the ffmpeg backend is used. Change-Id: Ic9c586193f7939f2a3fe59d009c3666585a8bbc7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3026355 Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Alexandre Courbot <acourbot@chromium.org> Reviewed-by: Keiichi Watanabe <keiichiw@chromium.org>
225 lines
5.8 KiB
TOML
225 lines
5.8 KiB
TOML
[package]
|
|
name = "crosvm"
|
|
version = "0.1.0"
|
|
authors = ["The Chromium OS Authors"]
|
|
edition = "2021"
|
|
default-run = "crosvm"
|
|
# b:223855233
|
|
resolver = "1"
|
|
|
|
[[bin]]
|
|
name = "crosvm"
|
|
path = "src/main.rs"
|
|
|
|
[[bin]]
|
|
name = "crosvm-direct"
|
|
path = "src/main.rs"
|
|
required-features = [ "direct" ]
|
|
|
|
[profile.release]
|
|
panic = 'abort'
|
|
overflow-checks = true
|
|
|
|
[profile.release-test]
|
|
inherits = 'release'
|
|
panic = 'unwind'
|
|
|
|
# Reproduces the options used when building crosvm for Chrome OS.
|
|
[profile.chromeos]
|
|
inherits = "release"
|
|
opt-level = "s"
|
|
|
|
# Enables LTO to further reduce the size of the binary.
|
|
[profile.lto]
|
|
inherits = "chromeos"
|
|
lto = true
|
|
|
|
# We currently need to exclude some crates from the workspace to allow
|
|
# these crates to be independently built by portage. These crates will
|
|
# eventually be moved into separate repositories.
|
|
# The only workspace members that need to be explicitly specified here are those
|
|
# that are not dependencies of the crosvm root crate.
|
|
[workspace]
|
|
members = [
|
|
"aarch64",
|
|
"acpi_tables",
|
|
"arch",
|
|
"argh_helpers",
|
|
"base",
|
|
"bit_field",
|
|
"broker_ipc",
|
|
"cros_async",
|
|
"crosvm-fuzz",
|
|
"crosvm_control",
|
|
"crosvm_plugin",
|
|
"devices",
|
|
"disk",
|
|
"fuse",
|
|
"gpu_display",
|
|
"hypervisor",
|
|
"integration_tests",
|
|
"io_uring",
|
|
"kernel_cmdline",
|
|
"kernel_loader",
|
|
"kvm",
|
|
"kvm_sys",
|
|
"linux_input_sys",
|
|
"media/ffmpeg",
|
|
"media/libvda",
|
|
"net_sys",
|
|
"net_util",
|
|
"power_monitor",
|
|
"protos",
|
|
"qcow_utils",
|
|
"resources",
|
|
"rutabaga_gfx",
|
|
"serde_keyvalue",
|
|
"tpm2",
|
|
"tpm2-sys",
|
|
"usb_sys",
|
|
"usb_util",
|
|
"vfio_sys",
|
|
"vhost",
|
|
"virtio_sys",
|
|
"vm_control",
|
|
"vm_memory",
|
|
"x86_64",
|
|
"third_party/vmm_vhost",
|
|
]
|
|
exclude = [
|
|
"common/assertions",
|
|
"common/audio_streams",
|
|
"common/balloon_control",
|
|
"common/cros-fuzz",
|
|
"common/cros_async",
|
|
"common/cros_asyncv2",
|
|
"common/data_model",
|
|
"common/io_uring",
|
|
"common/p9",
|
|
"common/sync",
|
|
"tube_transporter",
|
|
"win_util",
|
|
"tools/examples/baremetal"
|
|
]
|
|
|
|
[features]
|
|
all-linux = [
|
|
# TODO(b/203105868): Enable remaining features on linux builds.
|
|
"composite-disk",
|
|
"default",
|
|
"gdb",
|
|
"tpm",
|
|
"virgl_renderer_next",
|
|
"virgl_renderer",
|
|
"x",
|
|
]
|
|
win64 = []
|
|
audio = ["devices/audio"]
|
|
audio_cras = ["devices/audio_cras"]
|
|
chromeos = ["base/chromeos", "audio_cras", "devices/chromeos"]
|
|
composite-disk = ["protos/composite-disk", "protobuf", "disk/composite-disk"]
|
|
default = ["audio", "gpu", "usb"]
|
|
default-no-sandbox = []
|
|
direct = ["devices/direct", "arch/direct", "x86_64/direct"]
|
|
ffmpeg = ["devices/ffmpeg"]
|
|
gdb = ["gdbstub", "gdbstub_arch", "arch/gdb", "vm_control/gdb", "x86_64/gdb"]
|
|
gfxstream = ["devices/gfxstream"]
|
|
gpu = ["devices/gpu"]
|
|
haxm = ["hypervisor/haxm"]
|
|
libvda = ["devices/libvda"]
|
|
linux-armhf = [
|
|
"composite-disk",
|
|
"default",
|
|
"gdb",
|
|
"tpm",
|
|
]
|
|
linux-x86_64 = ["all-linux", "plugin"]
|
|
linux-aarch64 = ["all-linux"]
|
|
plugin = ["protos/plugin", "crosvm_plugin", "kvm", "kvm_sys", "protobuf"]
|
|
plugin-render-server = []
|
|
power-monitor-powerd = ["arch/power-monitor-powerd"]
|
|
slirp = ["devices/slirp"]
|
|
tpm = ["devices/tpm"]
|
|
usb = ["devices/usb"]
|
|
video-decoder = ["devices/video-decoder"]
|
|
video-encoder = ["devices/video-encoder"]
|
|
virgl_renderer = ["devices/virgl_renderer"]
|
|
virgl_renderer_next = ["rutabaga_gfx/virgl_renderer_next"]
|
|
wl-dmabuf = ["devices/minigbm"]
|
|
x = ["devices/x"]
|
|
|
|
[dependencies]
|
|
anyhow = "1.0.32"
|
|
arch = { path = "arch" }
|
|
argh = "0.1"
|
|
argh_helpers = { path = "argh_helpers" }
|
|
assertions = { path = "common/assertions" }
|
|
audio_streams = "*"
|
|
base = "*"
|
|
bit_field = { path = "bit_field" }
|
|
broker_ipc = { path = "broker_ipc" }
|
|
cfg-if = "1.0.0"
|
|
crosvm_plugin = { path = "crosvm_plugin", optional = true }
|
|
data_model = "*"
|
|
devices = { path = "devices" }
|
|
disk = { path = "disk" }
|
|
enumn = "0.1.0"
|
|
gdbstub = { version = "0.6.1", optional = true }
|
|
gdbstub_arch = { version = "0.2.2", optional = true }
|
|
rutabaga_gfx = { path = "rutabaga_gfx"}
|
|
hypervisor = { path = "hypervisor" }
|
|
kernel_cmdline = { path = "kernel_cmdline" }
|
|
kernel_loader = { path = "kernel_loader" }
|
|
kvm = { path = "kvm", optional = true }
|
|
kvm_sys = { path = "kvm_sys", optional = true }
|
|
libc = "0.2.93"
|
|
libcras = "*"
|
|
# Compile out trace statements in release builds
|
|
log = { version = "0", features = ["release_max_level_debug"]}
|
|
metrics = { path = "metrics" }
|
|
minijail = "*" # provided by ebuild
|
|
net_util = { path = "net_util" }
|
|
p9 = "*"
|
|
protobuf = { version = "2.3", optional = true }
|
|
protos = { path = "protos", optional = true }
|
|
remain = "*"
|
|
resources = { path = "resources" }
|
|
scudo = { version = "0.1", optional = true }
|
|
serde_json = "*"
|
|
serde_keyvalue = { path = "serde_keyvalue" }
|
|
sync = { path = "common/sync" }
|
|
tempfile = "3"
|
|
terminal_size = "0.1.17"
|
|
thiserror = { version = "1.0.20" }
|
|
uuid = { version = "0.8.2" }
|
|
vhost = { path = "vhost" }
|
|
vm_control = { path = "vm_control" }
|
|
acpi_tables = { path = "acpi_tables" }
|
|
vm_memory = { path = "vm_memory" }
|
|
|
|
[target.'cfg(target_arch = "x86_64")'.dependencies]
|
|
x86_64 = { path = "x86_64" }
|
|
|
|
[target.'cfg(any(target_arch = "aarch64", target_arch = "arm"))'.dependencies]
|
|
aarch64 = { path = "aarch64" }
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
tube_transporter = { path = "tube_transporter" }
|
|
|
|
[dev-dependencies]
|
|
base = "*"
|
|
lazy_static = "*"
|
|
|
|
[patch.crates-io]
|
|
assertions = { path = "common/assertions" }
|
|
audio_streams = { path = "common/audio_streams" }
|
|
base = { path = "base" }
|
|
cros_async = { path = "cros_async" }
|
|
cros_fuzz = { path = "common/cros-fuzz" } # ignored by ebuild
|
|
data_model = { path = "common/data_model" }
|
|
libcras = { path = "libcras_stub" } # ignored by ebuild
|
|
p9 = { path = "common/p9" } # ignored by ebuild
|
|
sync = { path = "common/sync" }
|
|
system_api = { path = "system_api_stub" } # ignored by ebuild
|
|
wire_format_derive = { path = "common/p9/wire_format_derive" } # ignored by ebuild
|
|
minijail = { path = "third_party/minijail/rust/minijail" } # ignored by ebuild
|