webrtc_m130/modules/video_coding/protection_bitrate_calculator_unittest.cc

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

101 lines
3.6 KiB
C++
Raw Normal View History

/*
* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
Revert "Revert "Revert "Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback""" This reverts commit 718d8631b0294a8bdc56366b68c51e2f04cd0c9e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Revert "Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback"" > > This reverts commit 53d901332c2eb43cad0da5768c6f7a8c4aeb9590. > > Reason for revert: root cause has been found and will be addressed in the patch.The root cause was protection_bitrate_calculator_ is now destructed before worker_queue_, and worker_queue_ may contain tasks which involves protection_bitrate_calculator_, so they need to be destructed in the opposite order. > That was not an issue since before this cl we didn't allocate protection_bitrate_calculator_ on the heap. > > Original change's description: > > Revert "Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback" > > > > This reverts commit e58e91b6d143ef847f8df24b19de4ba98cdb6f72. > > > > Reason for revert: Breaks downstream project b/70848177 > > > > Original change's description: > > > Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback > > > > > > Bug: webrtc:8656 > > > Change-Id: Iab4f6ab8997cb082762218afc8580e9985ac2522 > > > Reviewed-on: https://webrtc-review.googlesource.com/33010 > > > Commit-Queue: Ying Wang <yinwa@webrtc.org> > > > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > > > Cr-Commit-Position: refs/heads/master@{#21348} > > > > TBR=stefan@webrtc.org,philipel@webrtc.org,yinwa@webrtc.org > > > > Change-Id: Ic186ba78be429bd1046ceac15051a3382b6ffc4f > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Bug: webrtc:8656 > > Reviewed-on: https://webrtc-review.googlesource.com/35080 > > Commit-Queue: Lu Liu <lliuu@webrtc.org> > > Reviewed-by: Lu Liu <lliuu@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#21374} > > TBR=stefan@webrtc.org,philipel@webrtc.org,lliuu@webrtc.org,yujo@chromium.org,yinwa@webrtc.org > > Change-Id: Ie2b5a2a2ead0f20ac67c1ea9b8d192af66bddf8d > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:8656 > Reviewed-on: https://webrtc-review.googlesource.com/35320 > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > Reviewed-by: Ying Wang <yinwa@webrtc.org> > Commit-Queue: Ying Wang <yinwa@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#21409} TBR=stefan@webrtc.org,philipel@webrtc.org,lliuu@webrtc.org,yujo@chromium.org,yinwa@webrtc.org Change-Id: I9773aaa942054dcfbab6002a5d713ab3526b0534 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:8656 Reviewed-on: https://webrtc-review.googlesource.com/35700 Reviewed-by: Ying Wang <yinwa@webrtc.org> Commit-Queue: Ying Wang <yinwa@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21410}
2017-12-21 12:26:19 +00:00
#include "modules/video_coding/protection_bitrate_calculator.h"
#include "system_wrappers/include/clock.h"
#include "test/gtest.h"
namespace webrtc {
static const int kCodecBitrateBps = 100000;
class ProtectionBitrateCalculatorTest : public ::testing::Test {
protected:
enum {
kSampleRate = 90000 // RTP timestamps per second.
};
class ProtectionCallback : public VCMProtectionCallback {
public:
int ProtectionRequest(const FecProtectionParams* delta_params,
const FecProtectionParams* key_params,
uint32_t* sent_video_rate_bps,
uint32_t* sent_nack_rate_bps,
uint32_t* sent_fec_rate_bps) override {
*sent_video_rate_bps = kCodecBitrateBps;
*sent_nack_rate_bps = nack_rate_bps_;
*sent_fec_rate_bps = fec_rate_bps_;
return 0;
}
uint32_t fec_rate_bps_ = 0;
uint32_t nack_rate_bps_ = 0;
};
// Note: simulated clock starts at 1 seconds, since parts of webrtc use 0 as
// a special case (e.g. frame rate in media optimization).
ProtectionBitrateCalculatorTest()
: clock_(1000), media_opt_(&clock_, &protection_callback_) {}
SimulatedClock clock_;
ProtectionCallback protection_callback_;
Revert "Revert "Revert "Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback""" This reverts commit 718d8631b0294a8bdc56366b68c51e2f04cd0c9e. Reason for revert: <INSERT REASONING HERE> Original change's description: > Revert "Revert "Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback"" > > This reverts commit 53d901332c2eb43cad0da5768c6f7a8c4aeb9590. > > Reason for revert: root cause has been found and will be addressed in the patch.The root cause was protection_bitrate_calculator_ is now destructed before worker_queue_, and worker_queue_ may contain tasks which involves protection_bitrate_calculator_, so they need to be destructed in the opposite order. > That was not an issue since before this cl we didn't allocate protection_bitrate_calculator_ on the heap. > > Original change's description: > > Revert "Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback" > > > > This reverts commit e58e91b6d143ef847f8df24b19de4ba98cdb6f72. > > > > Reason for revert: Breaks downstream project b/70848177 > > > > Original change's description: > > > Add ProtectionBitrateCalculator as an abstract class. ProtectionBitrateCalculatorDefault implements ProtectionBitrateCalculator. Register VideoSendStream to packet feedback > > > > > > Bug: webrtc:8656 > > > Change-Id: Iab4f6ab8997cb082762218afc8580e9985ac2522 > > > Reviewed-on: https://webrtc-review.googlesource.com/33010 > > > Commit-Queue: Ying Wang <yinwa@webrtc.org> > > > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > > > Cr-Commit-Position: refs/heads/master@{#21348} > > > > TBR=stefan@webrtc.org,philipel@webrtc.org,yinwa@webrtc.org > > > > Change-Id: Ic186ba78be429bd1046ceac15051a3382b6ffc4f > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Bug: webrtc:8656 > > Reviewed-on: https://webrtc-review.googlesource.com/35080 > > Commit-Queue: Lu Liu <lliuu@webrtc.org> > > Reviewed-by: Lu Liu <lliuu@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#21374} > > TBR=stefan@webrtc.org,philipel@webrtc.org,lliuu@webrtc.org,yujo@chromium.org,yinwa@webrtc.org > > Change-Id: Ie2b5a2a2ead0f20ac67c1ea9b8d192af66bddf8d > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:8656 > Reviewed-on: https://webrtc-review.googlesource.com/35320 > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > Reviewed-by: Ying Wang <yinwa@webrtc.org> > Commit-Queue: Ying Wang <yinwa@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#21409} TBR=stefan@webrtc.org,philipel@webrtc.org,lliuu@webrtc.org,yujo@chromium.org,yinwa@webrtc.org Change-Id: I9773aaa942054dcfbab6002a5d713ab3526b0534 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:8656 Reviewed-on: https://webrtc-review.googlesource.com/35700 Reviewed-by: Ying Wang <yinwa@webrtc.org> Commit-Queue: Ying Wang <yinwa@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21410}
2017-12-21 12:26:19 +00:00
ProtectionBitrateCalculator media_opt_;
};
TEST_F(ProtectionBitrateCalculatorTest, ProtectsUsingFecBitrate) {
static const uint32_t kMaxBitrateBps = 130000;
media_opt_.SetProtectionMethod(true /*enable_fec*/, false /* enable_nack */);
media_opt_.SetEncodingData(640, 480, 1, 1000);
// Using 10% of codec bitrate for FEC.
protection_callback_.fec_rate_bps_ = kCodecBitrateBps / 10;
uint32_t target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 0, 0);
EXPECT_GT(target_bitrate, 0u);
EXPECT_GT(kMaxBitrateBps, target_bitrate);
// Using as much for codec bitrate as fec rate, new target rate should share
// both equally, but only be half of max (since that ceiling should be hit).
protection_callback_.fec_rate_bps_ = kCodecBitrateBps;
target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 128, 100);
EXPECT_EQ(kMaxBitrateBps / 2, target_bitrate);
}
TEST_F(ProtectionBitrateCalculatorTest, ProtectsUsingNackBitrate) {
static const uint32_t kMaxBitrateBps = 130000;
media_opt_.SetProtectionMethod(false /*enable_fec*/, true /* enable_nack */);
media_opt_.SetEncodingData(640, 480, 1, 1000);
uint32_t target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 0, 0);
EXPECT_EQ(kMaxBitrateBps, target_bitrate);
// Using as much for codec bitrate as nack rate, new target rate should share
// both equally, but only be half of max (since that ceiling should be hit).
protection_callback_.nack_rate_bps_ = kMaxBitrateBps;
target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 128, 100);
EXPECT_EQ(kMaxBitrateBps / 2, target_bitrate);
}
TEST_F(ProtectionBitrateCalculatorTest, NoProtection) {
static const uint32_t kMaxBitrateBps = 130000;
media_opt_.SetProtectionMethod(false /*enable_fec*/, false /* enable_nack */);
media_opt_.SetEncodingData(640, 480, 1, 1000);
uint32_t target_bitrate =
media_opt_.SetTargetRates(kMaxBitrateBps, 30, 128, 100);
EXPECT_EQ(kMaxBitrateBps, target_bitrate);
}
} // namespace webrtc