crosvm/libvda/tests/encode_tests.rs
David Staessens f1dd5afb9a virtio: video: Add support for configuring the bitrate mode to encoder.
This CL adds support for the VIRTIO_VIDEO_CONTROL_BITRATE_MODE control
to the crosvm encoder. This control allows configuring the bitrate
mode used to encode a video.

Possible values are:
- VIRTIO_VIDEO_BITRATE_MODE_VBR (Variable bitrate)
- VIRTIO_VIDEO_BITRATE_MODE_CBR (Constant bitrate)

BUG=b:190336806,b:181514834
TEST=tast run DUT arc.VideoEncodeAccel.h264_192p_i420_vm

Cq-Depend: chromium:2946469
Change-Id: Ic8461e746884620cd426c1b562724e4120fe2129
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2944317
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: David Staessens <dstaessens@chromium.org>
Reviewed-by: Keiichi Watanabe <keiichiw@chromium.org>
Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
2021-07-29 03:52:27 +00:00

115 lines
3.3 KiB
Rust

// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Integration tests using LibVDA fake encode implementation.
use libvda::encode::*;
use libvda::*;
fn create_vea_instance() -> VeaInstance {
VeaInstance::new(VeaImplType::Fake).expect("failed to create VeaInstance")
}
fn create_config() -> Config {
Config {
input_format: PixelFormat::YV12,
input_visible_height: 320,
input_visible_width: 192,
output_profile: Profile::H264ProfileBaseline,
bitrate: Bitrate {
mode: BitrateMode::CBR,
target: 100,
peak: 0,
},
initial_framerate: None,
h264_output_level: None,
}
}
#[test]
fn test_create_instance() {
let instance = create_vea_instance();
let caps = instance.get_capabilities();
assert_ne!(caps.input_formats.len(), 0);
assert_ne!(caps.output_formats.len(), 0);
}
#[test]
fn test_initialize_encode_session() {
let instance = create_vea_instance();
let config = create_config();
let _session = instance
.open_session(config)
.expect("failed to open a session");
}
#[test]
fn test_encode_and_get_buffer_back() {
let instance = create_vea_instance();
let config = create_config();
let mut session = instance
.open_session(config)
.expect("failed to open a session");
// Call encode() with dummy arguments.
let fake_input_buffer_id = 12345;
let fake_planes = vec![];
session
.encode(
fake_input_buffer_id,
1, // fd
&fake_planes, // planes
0, // timestamp
false, // force_keyframe
)
.expect("failed to send an encode request");
// Since we are using the fake backend, we should get back
// the input buffer right away.
match session.read_event() {
Ok(Event::ProcessedInputBuffer(returned_input_buffer_id)) => {
assert_eq!(fake_input_buffer_id, returned_input_buffer_id);
}
Ok(event) => panic!("Obtained event is not ProcessedInputBuffer but {:?}", event),
Err(msg) => panic!(msg),
}
}
#[test]
fn test_use_output_buffer_and_get_buffer_back() {
let instance = create_vea_instance();
let config = create_config();
let mut session = instance
.open_session(config)
.expect("failed to open a session");
// Call use_output_buffer with dummy arguments.
let fake_output_buffer_id = 12345;
session
.use_output_buffer(
fake_output_buffer_id,
2, // fd
0, // offset
0, // size
)
.expect("failed to send use_output_buffer request");
// Since we are using the fake backend, we should get back
// the input buffer right away.
match session.read_event() {
Ok(Event::ProcessedOutputBuffer {
output_buffer_id: returned_output_buffer_id,
..
}) => {
assert_eq!(fake_output_buffer_id, returned_output_buffer_id);
}
Ok(event) => panic!(
"Obtained event is not ProcessedOutputBuffer but {:?}",
event
),
Err(msg) => panic!(msg),
}
}