Reland In GenericEncoder enable timing frames for encoders with internal source
The original cl broke some downstream project because some internal source encoders do not call OnBitrateChanged on GenericEncoder. Bug: webrtc:9058 Change-Id: I7841c65059fb4fc9e1ab9754bb1d232ce660a990 Reviewed-on: https://webrtc-review.googlesource.com/66342 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22733}
This commit is contained in:

committed by
Commit Bot

parent
9917c4a780
commit
764aeb7758
@ -13,6 +13,7 @@
|
||||
#include "modules/video_coding/encoded_frame.h"
|
||||
#include "modules/video_coding/generic_encoder.h"
|
||||
#include "modules/video_coding/include/video_coding_defines.h"
|
||||
#include "rtc_base/fakeclock.h"
|
||||
#include "test/gtest.h"
|
||||
|
||||
namespace webrtc {
|
||||
@ -208,6 +209,46 @@ TEST(TestVCMEncodedFrameCallback, NoTimingFrameIfNoEncodeStartTime) {
|
||||
EXPECT_FALSE(sink.WasTimingFrame());
|
||||
}
|
||||
|
||||
TEST(TestVCMEncodedFrameCallback, AdjustsCaptureTimeForInternalSourceEncoder) {
|
||||
rtc::ScopedFakeClock clock;
|
||||
clock.SetTimeMicros(1234567);
|
||||
EncodedImage image;
|
||||
CodecSpecificInfo codec_specific;
|
||||
const int64_t kEncodeStartDelayMs = 2;
|
||||
const int64_t kEncodeFinishDelayMs = 10;
|
||||
int64_t timestamp = 1;
|
||||
image._length = 500;
|
||||
image.capture_time_ms_ = timestamp;
|
||||
image._timeStamp = static_cast<uint32_t>(timestamp * 90);
|
||||
codec_specific.codecType = kVideoCodecGeneric;
|
||||
codec_specific.codecSpecific.generic.simulcast_idx = 0;
|
||||
FakeEncodedImageCallback sink;
|
||||
VCMEncodedFrameCallback callback(&sink, nullptr);
|
||||
callback.SetInternalSource(true);
|
||||
VideoCodec::TimingFrameTriggerThresholds thresholds;
|
||||
thresholds.delay_ms = 1; // Make all frames timing frames.
|
||||
callback.SetTimingFramesThresholds(thresholds);
|
||||
callback.OnTargetBitrateChanged(500, 0);
|
||||
|
||||
// Verify a single frame without encode timestamps isn't a timing frame.
|
||||
callback.OnEncodedImage(image, &codec_specific, nullptr);
|
||||
EXPECT_FALSE(sink.WasTimingFrame());
|
||||
|
||||
// New frame, but this time with encode timestamps set in timing_.
|
||||
// This should be a timing frame.
|
||||
image.capture_time_ms_ = ++timestamp;
|
||||
image._timeStamp = static_cast<uint32_t>(timestamp * 90);
|
||||
image.timing_.encode_start_ms = timestamp + kEncodeStartDelayMs;
|
||||
image.timing_.encode_finish_ms = timestamp + kEncodeFinishDelayMs;
|
||||
callback.OnEncodedImage(image, &codec_specific, nullptr);
|
||||
EXPECT_TRUE(sink.WasTimingFrame());
|
||||
// Frame is captured kEncodeFinishDelayMs before it's encoded, so restored
|
||||
// capture timestamp should be kEncodeFinishDelayMs in the past.
|
||||
EXPECT_EQ(
|
||||
sink.GetLastCaptureTimestamp(),
|
||||
clock.TimeNanos() / rtc::kNumNanosecsPerMillisec - kEncodeFinishDelayMs);
|
||||
}
|
||||
|
||||
TEST(TestVCMEncodedFrameCallback, NotifiesAboutDroppedFrames) {
|
||||
EncodedImage image;
|
||||
CodecSpecificInfo codec_specific;
|
||||
|
Reference in New Issue
Block a user