Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Unified Diff: content/common/gpu/media/video_encode_accelerator_unittest.cc

Issue 942693003: veatest: fix keyframe verification test. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/media/video_encode_accelerator_unittest.cc
diff --git a/content/common/gpu/media/video_encode_accelerator_unittest.cc b/content/common/gpu/media/video_encode_accelerator_unittest.cc
index 18054a18752835e938142be1e9cedf39f7a24b02..73e319afb47afa7875fd62a7416e127e45f98118 100644
--- a/content/common/gpu/media/video_encode_accelerator_unittest.cc
+++ b/content/common/gpu/media/video_encode_accelerator_unittest.cc
@@ -494,9 +494,7 @@ scoped_ptr<StreamValidator> StreamValidator::Create(
const FrameFoundCallback& frame_cb) {
scoped_ptr<StreamValidator> validator;
- if (g_fake_encoder) {
- validator.reset(NULL);
- } else if (IsH264(profile)) {
+ if (IsH264(profile)) {
validator.reset(new H264Validator(frame_cb));
} else if (IsVP8(profile)) {
validator.reset(new VP8Validator(frame_cb));
@@ -633,8 +631,11 @@ class VEAClient : public VideoEncodeAccelerator::Client {
// Request a keyframe every keyframe_period_ frames.
const unsigned int keyframe_period_;
- // Frame number for which we requested a keyframe.
- unsigned int keyframe_requested_at_;
+ // Number of keyframes requested by now.
+ unsigned int num_keyframes_requested_;
+
+ // Next keyframe expected before next_keyframe_at_ + kMaxKeyframeDelay.
+ unsigned int next_keyframe_at_;
// True if we are asking encoder for a particular bitrate.
bool force_bitrate_;
@@ -696,7 +697,7 @@ VEAClient::VEAClient(TestStream* test_stream,
: state_(CS_CREATED),
test_stream_(test_stream),
note_(note),
- next_input_id_(1),
+ next_input_id_(0),
next_output_buffer_id_(0),
pos_in_input_stream_(0),
num_required_input_buffers_(0),
@@ -707,7 +708,8 @@ VEAClient::VEAClient(TestStream* test_stream,
seen_keyframe_in_this_buffer_(false),
save_to_file_(save_to_file),
keyframe_period_(keyframe_period),
- keyframe_requested_at_(kMaxFrameNum),
+ num_keyframes_requested_(0),
+ next_keyframe_at_(kMaxFrameNum),
force_bitrate_(force_bitrate),
current_requested_bitrate_(0),
current_framerate_(0),
@@ -721,12 +723,13 @@ VEAClient::VEAClient(TestStream* test_stream,
if (keyframe_period_)
CHECK_LT(kMaxKeyframeDelay, keyframe_period_);
- validator_ = StreamValidator::Create(
- test_stream_->requested_profile,
- base::Bind(&VEAClient::HandleEncodedFrame, base::Unretained(this)));
-
-
- CHECK(g_fake_encoder || validator_.get());
+ // Fake encoder produces an invalid stream, so skip validating it.
+ if (!g_fake_encoder) {
+ validator_ = StreamValidator::Create(
+ test_stream_->requested_profile,
+ base::Bind(&VEAClient::HandleEncodedFrame, base::Unretained(this)));
+ CHECK(validator_);
+ }
if (save_to_file_) {
CHECK(!test_stream_->out_filename.empty());
@@ -1050,8 +1053,8 @@ void VEAClient::FeedEncoderWithOneInput() {
bool force_keyframe = false;
if (keyframe_period_ && next_input_id_ % keyframe_period_ == 0) {
- keyframe_requested_at_ = next_input_id_;
force_keyframe = true;
+ ++num_keyframes_requested_;
}
scoped_refptr<media::VideoFrame> video_frame =
@@ -1087,12 +1090,6 @@ bool VEAClient::HandleEncodedFrame(bool keyframe) {
++num_frames_since_last_check_;
last_frame_ready_time_ = base::TimeTicks::Now();
- if (keyframe) {
- // Got keyframe, reset keyframe detection regardless of whether we
- // got a frame in time or not.
- keyframe_requested_at_ = kMaxFrameNum;
- seen_keyframe_in_this_buffer_ = true;
- }
// Because the keyframe behavior requirements are loose, we give
// the encoder more freedom here. It could either deliver a keyframe
@@ -1104,7 +1101,14 @@ bool VEAClient::HandleEncodedFrame(bool keyframe) {
// earlier than we requested one (in time), and not later than
// kMaxKeyframeDelay frames after the frame, for which we requested
// it, comes back encoded.
- EXPECT_LE(num_encoded_frames_, keyframe_requested_at_ + kMaxKeyframeDelay);
+ EXPECT_LE(num_encoded_frames_, next_keyframe_at_ + kMaxKeyframeDelay);
+
+ if (keyframe) {
+ if (num_keyframes_requested_ > 0)
+ --num_keyframes_requested_;
+ next_keyframe_at_ += keyframe_period_;
+ seen_keyframe_in_this_buffer_ = true;
+ }
if (num_encoded_frames_ == num_frames_to_encode_ / 2) {
VerifyStreamProperties();
@@ -1152,6 +1156,14 @@ void VEAClient::VerifyStreamProperties() {
current_requested_bitrate_,
kBitrateTolerance * current_requested_bitrate_);
}
+
+ // All requested keyframes should've been provided. Allow the last requested
+ // frame to remain undelivered if we haven't reached the maximum frame number
+ // by which it should have arrived.
+ if (num_encoded_frames_ < next_keyframe_at_ + kMaxKeyframeDelay)
+ EXPECT_LE(num_keyframes_requested_, 1UL);
+ else
+ EXPECT_EQ(num_keyframes_requested_, 0UL);
}
void VEAClient::WriteIvfFileHeader() {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698