Add counter to the end of FakeEncoder frames in order to make them unique.

Bug: none
Change-Id: Ia5dccbe1868cc3fda5693d7e13eac21f75a08b83
Reviewed-on: https://webrtc-review.googlesource.com/c/109582
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25536}
This commit is contained in:
Per Kjellander
2018-11-06 11:01:06 +01:00
committed by Commit Bot
parent c572ff3c71
commit 17fc7e2320
2 changed files with 19 additions and 3 deletions

View File

@ -23,7 +23,7 @@
namespace webrtc {
namespace test {
namespace {
const int kKeyframeSizeFactor = 5;
// Inverse of proportion of frames assigned to each temporal layer for all
@ -35,12 +35,22 @@ const int kTemporalLayerRateFactor[4][4] = {
{8, 8, 4, 2}, // 1/8 + 1/8 + 1/4 + 1/2
};
void WriteCounter(unsigned char* payload, uint32_t counter) {
payload[0] = (counter & 0x00FF);
payload[1] = (counter & 0xFF00) >> 8;
payload[2] = (counter & 0xFF0000) >> 16;
payload[3] = (counter & 0xFF000000) >> 24;
}
}; // namespace
FakeEncoder::FakeEncoder(Clock* clock)
: clock_(clock),
callback_(nullptr),
configured_input_framerate_(-1),
max_target_bitrate_kbps_(-1),
pending_keyframe_(true),
counter_(0),
debt_bytes_(0) {
// Generate some arbitrary not-all-zero data
for (size_t i = 0; i < sizeof(encoded_buffer_); ++i) {
@ -80,6 +90,7 @@ int32_t FakeEncoder::Encode(const VideoFrame& input_image,
int framerate;
VideoCodecMode mode;
bool keyframe;
uint32_t counter;
{
rtc::CritScope cs(&crit_sect_);
max_framerate = config_.maxFramerate;
@ -97,13 +108,14 @@ int32_t FakeEncoder::Encode(const VideoFrame& input_image,
}
keyframe = pending_keyframe_;
pending_keyframe_ = false;
counter = counter_++;
}
FrameInfo frame_info =
NextFrame(frame_types, keyframe, num_simulcast_streams, target_bitrate,
simulcast_streams, framerate);
for (uint8_t i = 0; i < frame_info.layers.size(); ++i) {
constexpr int kMinPayLoadLength = 10;
constexpr int kMinPayLoadLength = 14;
if (frame_info.layers[i].size < kMinPayLoadLength) {
// Drop this temporal layer.
continue;
@ -114,7 +126,10 @@ int32_t FakeEncoder::Encode(const VideoFrame& input_image,
specifics.codecType = kVideoCodecGeneric;
std::unique_ptr<uint8_t[]> encoded_buffer(
new uint8_t[frame_info.layers[i].size]);
memcpy(encoded_buffer.get(), encoded_buffer_, frame_info.layers[i].size);
memcpy(encoded_buffer.get(), encoded_buffer_,
frame_info.layers[i].size - 4);
// Write a counter to the image to make each frame unique.
WriteCounter(encoded_buffer.get() + frame_info.layers[i].size - 4, counter);
EncodedImage encoded(encoded_buffer.get(), frame_info.layers[i].size,
sizeof(encoded_buffer_));
encoded.SetTimestamp(input_image.timestamp());

View File

@ -79,6 +79,7 @@ class FakeEncoder : public VideoEncoder {
int configured_input_framerate_ RTC_GUARDED_BY(crit_sect_);
int max_target_bitrate_kbps_ RTC_GUARDED_BY(crit_sect_);
bool pending_keyframe_ RTC_GUARDED_BY(crit_sect_);
uint32_t counter_ RTC_GUARDED_BY(crit_sect_);
rtc::CriticalSection crit_sect_;
uint8_t encoded_buffer_[100000];