Commit fc7b5a87 authored by Pin-chih Lin's avatar Pin-chih Lin Committed by Commit Bot

video_encode_accelerator: add initial_framerate to initial Config

Currently on VideoEncodeAccelerator::Initialize() deafult framerate is
always used to initialize encoder. As we have profile and level of H.264
encoding in initial Config, framerate should be also adjustable on
initialization for the client to configure a supportable parameter set
under the limit of of profile/level.

BUG=871154
TEST=build and deploy chrome on eve
TEST=build and run video_encoder_accelerator_unittest on eve

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: Ifd6e33ada82d44c0e1b46f56856caeec9600e139
Reviewed-on: https://chromium-review.googlesource.com/1163592Reviewed-by: default avatarDan Sanders <sandersd@chromium.org>
Reviewed-by: default avatarPawel Osciak <posciak@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Pin-chih Lin <johnylin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#582510}
parent a2a107d7
...@@ -250,7 +250,9 @@ bool V4L2VideoEncodeAccelerator::Initialize(const Config& config, ...@@ -250,7 +250,9 @@ bool V4L2VideoEncodeAccelerator::Initialize(const Config& config,
return false; return false;
} }
RequestEncodingParametersChange(config.initial_bitrate, kInitialFramerate); RequestEncodingParametersChange(
config.initial_bitrate,
config.initial_framerate.value_or(kDefaultFramerate));
encoder_state_ = kInitialized; encoder_state_ = kInitialized;
......
...@@ -91,7 +91,7 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator ...@@ -91,7 +91,7 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
}; };
enum { enum {
kInitialFramerate = 30, kDefaultFramerate = 30,
// These are rather subjectively tuned. // These are rather subjectively tuned.
kInputBufferCount = 2, kInputBufferCount = 2,
kOutputBufferCount = 2, kOutputBufferCount = 2,
......
...@@ -296,8 +296,10 @@ void VaapiVideoEncodeAccelerator::InitializeTask(const Config& config) { ...@@ -296,8 +296,10 @@ void VaapiVideoEncodeAccelerator::InitializeTask(const Config& config) {
// TODO(johnylin): pass |config.h264_output_level| to H264Encoder. // TODO(johnylin): pass |config.h264_output_level| to H264Encoder.
// https://crbug.com/863327 // https://crbug.com/863327
if (!encoder_->Initialize(config.input_visible_size, config.output_profile, if (!encoder_->Initialize(
config.initial_bitrate, kDefaultFramerate)) { config.input_visible_size, config.output_profile,
config.initial_bitrate,
config.initial_framerate.value_or(kDefaultFramerate))) {
NOTIFY_ERROR(kInvalidArgumentError, "Failed initializing encoder"); NOTIFY_ERROR(kInvalidArgumentError, "Failed initializing encoder");
return; return;
} }
......
...@@ -1478,14 +1478,9 @@ VEAClient::VEAClient(TestStream* test_stream, ...@@ -1478,14 +1478,9 @@ VEAClient::VEAClient(TestStream* test_stream,
// Helper function to create VEA. // Helper function to create VEA.
static std::unique_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator( static std::unique_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator(
VideoPixelFormat input_format, const VideoEncodeAccelerator::Config& config,
const gfx::Size& input_visible_size,
VideoCodecProfile output_profile,
uint32_t initial_bitrate,
VideoEncodeAccelerator::Client* client, VideoEncodeAccelerator::Client* client,
const gpu::GpuPreferences& gpu_preferences) { const gpu::GpuPreferences& gpu_preferences) {
const VideoEncodeAccelerator::Config config(input_format, input_visible_size,
output_profile, initial_bitrate);
if (g_fake_encoder) { if (g_fake_encoder) {
std::unique_ptr<VideoEncodeAccelerator> encoder( std::unique_ptr<VideoEncodeAccelerator> encoder(
new FakeVideoEncodeAccelerator( new FakeVideoEncodeAccelerator(
...@@ -1508,9 +1503,10 @@ void VEAClient::CreateEncoder() { ...@@ -1508,9 +1503,10 @@ void VEAClient::CreateEncoder() {
DVLOG(1) << "Profile: " << test_stream_->requested_profile DVLOG(1) << "Profile: " << test_stream_->requested_profile
<< ", initial bitrate: " << requested_bitrate_; << ", initial bitrate: " << requested_bitrate_;
encoder_ = CreateVideoEncodeAccelerator( const VideoEncodeAccelerator::Config config(
kInputFormat, test_stream_->visible_size, test_stream_->requested_profile, kInputFormat, test_stream_->visible_size, test_stream_->requested_profile,
requested_bitrate_, this, gpu::GpuPreferences()); requested_bitrate_, requested_framerate_);
encoder_ = CreateVideoEncodeAccelerator(config, this, gpu::GpuPreferences());
if (!encoder_) { if (!encoder_) {
LOG(ERROR) << "Failed creating a VideoEncodeAccelerator."; LOG(ERROR) << "Failed creating a VideoEncodeAccelerator.";
SetState(CS_ERROR); SetState(CS_ERROR);
...@@ -2128,9 +2124,10 @@ void SimpleVEAClientBase::CreateEncoder() { ...@@ -2128,9 +2124,10 @@ void SimpleVEAClientBase::CreateEncoder() {
LOG_ASSERT(g_env->test_streams_.size()); LOG_ASSERT(g_env->test_streams_.size());
gfx::Size visible_size(width_, height_); gfx::Size visible_size(width_, height_);
encoder_ = CreateVideoEncodeAccelerator( const VideoEncodeAccelerator::Config config(
kInputFormat, visible_size, g_env->test_streams_[0]->requested_profile, kInputFormat, visible_size, g_env->test_streams_[0]->requested_profile,
bitrate_, this, gpu::GpuPreferences()); bitrate_, fps_);
encoder_ = CreateVideoEncodeAccelerator(config, this, gpu::GpuPreferences());
if (!encoder_) { if (!encoder_) {
LOG(ERROR) << "Failed creating a VideoEncodeAccelerator."; LOG(ERROR) << "Failed creating a VideoEncodeAccelerator.";
SetState(CS_ERROR); SetState(CS_ERROR);
......
...@@ -49,6 +49,8 @@ struct VideoEncodeAcceleratorConfig { ...@@ -49,6 +49,8 @@ struct VideoEncodeAcceleratorConfig {
gfx.mojom.Size input_visible_size; gfx.mojom.Size input_visible_size;
VideoCodecProfile output_profile; VideoCodecProfile output_profile;
uint32 initial_bitrate; uint32 initial_bitrate;
uint32 initial_framerate;
bool has_initial_framerate; // Whether or not config has initial framerate
uint8 h264_output_level; uint8 h264_output_level;
bool has_h264_output_level; // Whether or not config has H264 output level bool has_h264_output_level; // Whether or not config has H264 output level
}; };
......
...@@ -133,6 +133,11 @@ bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, ...@@ -133,6 +133,11 @@ bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView,
if (!input.ReadOutputProfile(&output_profile)) if (!input.ReadOutputProfile(&output_profile))
return false; return false;
base::Optional<uint32_t> initial_framerate;
if (input.has_initial_framerate()) {
initial_framerate = input.initial_framerate();
}
base::Optional<uint8_t> h264_output_level; base::Optional<uint8_t> h264_output_level;
if (input.has_h264_output_level()) { if (input.has_h264_output_level()) {
h264_output_level = input.h264_output_level(); h264_output_level = input.h264_output_level();
...@@ -140,7 +145,7 @@ bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, ...@@ -140,7 +145,7 @@ bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView,
*output = media::VideoEncodeAccelerator::Config( *output = media::VideoEncodeAccelerator::Config(
input_format, input_visible_size, output_profile, input.initial_bitrate(), input_format, input_visible_size, output_profile, input.initial_bitrate(),
h264_output_level); initial_framerate, h264_output_level);
return true; return true;
} }
......
...@@ -98,6 +98,16 @@ struct StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, ...@@ -98,6 +98,16 @@ struct StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView,
return input.initial_bitrate; return input.initial_bitrate;
} }
static uint32_t initial_framerate(
const media::VideoEncodeAccelerator::Config& input) {
return input.initial_framerate.value_or(0);
}
static bool has_initial_framerate(
const media::VideoEncodeAccelerator::Config& input) {
return input.initial_framerate.has_value();
}
static uint8_t h264_output_level( static uint8_t h264_output_level(
const media::VideoEncodeAccelerator::Config& input) { const media::VideoEncodeAccelerator::Config& input) {
return input.h264_output_level.value_or(0); return input.h264_output_level.value_or(0);
......
...@@ -35,11 +35,13 @@ VideoEncodeAccelerator::Config::Config( ...@@ -35,11 +35,13 @@ VideoEncodeAccelerator::Config::Config(
const gfx::Size& input_visible_size, const gfx::Size& input_visible_size,
VideoCodecProfile output_profile, VideoCodecProfile output_profile,
uint32_t initial_bitrate, uint32_t initial_bitrate,
base::Optional<uint32_t> initial_framerate,
base::Optional<uint8_t> h264_output_level) base::Optional<uint8_t> h264_output_level)
: input_format(input_format), : input_format(input_format),
input_visible_size(input_visible_size), input_visible_size(input_visible_size),
output_profile(output_profile), output_profile(output_profile),
initial_bitrate(initial_bitrate), initial_bitrate(initial_bitrate),
initial_framerate(initial_framerate),
h264_output_level(h264_output_level) {} h264_output_level(h264_output_level) {}
VideoEncodeAccelerator::Config::~Config() = default; VideoEncodeAccelerator::Config::~Config() = default;
...@@ -51,6 +53,10 @@ std::string VideoEncodeAccelerator::Config::AsHumanReadableString() const { ...@@ -51,6 +53,10 @@ std::string VideoEncodeAccelerator::Config::AsHumanReadableString() const {
VideoPixelFormatToString(input_format).c_str(), VideoPixelFormatToString(input_format).c_str(),
input_visible_size.ToString().c_str(), input_visible_size.ToString().c_str(),
GetProfileName(output_profile).c_str(), initial_bitrate); GetProfileName(output_profile).c_str(), initial_bitrate);
if (initial_framerate) {
str += base::StringPrintf(", initial_framerate: %u",
initial_framerate.value());
}
if (h264_output_level) { if (h264_output_level) {
str += base::StringPrintf(", h264_output_level: %u", str += base::StringPrintf(", h264_output_level: %u",
h264_output_level.value()); h264_output_level.value());
......
...@@ -102,6 +102,7 @@ class MEDIA_EXPORT VideoEncodeAccelerator { ...@@ -102,6 +102,7 @@ class MEDIA_EXPORT VideoEncodeAccelerator {
const gfx::Size& input_visible_size, const gfx::Size& input_visible_size,
VideoCodecProfile output_profile, VideoCodecProfile output_profile,
uint32_t initial_bitrate, uint32_t initial_bitrate,
base::Optional<uint32_t> initial_framerate = base::nullopt,
base::Optional<uint8_t> h264_output_level = base::nullopt); base::Optional<uint8_t> h264_output_level = base::nullopt);
~Config(); ~Config();
...@@ -122,6 +123,10 @@ class MEDIA_EXPORT VideoEncodeAccelerator { ...@@ -122,6 +123,10 @@ class MEDIA_EXPORT VideoEncodeAccelerator {
// Initial bitrate of encoded output stream in bits per second. // Initial bitrate of encoded output stream in bits per second.
uint32_t initial_bitrate; uint32_t initial_bitrate;
// Initial encoding framerate in frames per second. This is optional and
// VideoEncodeAccelerator should use default framerate if not given.
base::Optional<uint32_t> initial_framerate;
// Codec level of encoded output stream for H264 only. This value should // Codec level of encoded output stream for H264 only. This value should
// be aligned to the H264 standard definition of SPS.level_idc. The only // be aligned to the H264 standard definition of SPS.level_idc. The only
// exception is in Main and Baseline profile we still use // exception is in Main and Baseline profile we still use
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment