aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/modules/video_coding/codecs/test/packet_manipulator_unittest.cc')
-rw-r--r--webrtc/modules/video_coding/codecs/test/packet_manipulator_unittest.cc153
1 files changed, 153 insertions, 0 deletions
diff --git a/webrtc/modules/video_coding/codecs/test/packet_manipulator_unittest.cc b/webrtc/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
new file mode 100644
index 0000000000..ace7bc0507
--- /dev/null
+++ b/webrtc/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2012 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.
+ */
+
+#include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
+
+#include <queue>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
+#include "webrtc/modules/video_coding/codecs/test/predictive_packet_manipulator.h"
+#include "webrtc/test/testsupport/unittest_utils.h"
+#include "webrtc/typedefs.h"
+
+namespace webrtc {
+namespace test {
+
+const double kNeverDropProbability = 0.0;
+const double kAlwaysDropProbability = 1.0;
+const int kBurstLength = 1;
+
+class PacketManipulatorTest: public PacketRelatedTest {
+ protected:
+ PacketReader packet_reader_;
+ EncodedImage image_;
+ NetworkingConfig drop_config_;
+ NetworkingConfig no_drop_config_;
+
+ PacketManipulatorTest() {
+ image_._buffer = packet_data_;
+ image_._length = kPacketDataLength;
+ image_._size = kPacketDataLength;
+
+ drop_config_.packet_size_in_bytes = kPacketSizeInBytes;
+ drop_config_.packet_loss_probability = kAlwaysDropProbability;
+ drop_config_.packet_loss_burst_length = kBurstLength;
+ drop_config_.packet_loss_mode = kUniform;
+
+ no_drop_config_.packet_size_in_bytes = kPacketSizeInBytes;
+ no_drop_config_.packet_loss_probability = kNeverDropProbability;
+ no_drop_config_.packet_loss_burst_length = kBurstLength;
+ no_drop_config_.packet_loss_mode = kUniform;
+ }
+
+ virtual ~PacketManipulatorTest() {}
+
+ void SetUp() {
+ PacketRelatedTest::SetUp();
+ }
+
+ void TearDown() {
+ PacketRelatedTest::TearDown();
+ }
+
+ void VerifyPacketLoss(int expected_nbr_packets_dropped,
+ int actual_nbr_packets_dropped,
+ size_t expected_packet_data_length,
+ uint8_t* expected_packet_data,
+ EncodedImage& actual_image) {
+ EXPECT_EQ(expected_nbr_packets_dropped, actual_nbr_packets_dropped);
+ EXPECT_EQ(expected_packet_data_length, image_._length);
+ EXPECT_EQ(0, memcmp(expected_packet_data, actual_image._buffer,
+ expected_packet_data_length));
+ }
+};
+
+TEST_F(PacketManipulatorTest, Constructor) {
+ PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
+}
+
+TEST_F(PacketManipulatorTest, DropNone) {
+ PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
+ int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
+ VerifyPacketLoss(0, nbr_packets_dropped, kPacketDataLength,
+ packet_data_, image_);
+}
+
+TEST_F(PacketManipulatorTest, UniformDropNoneSmallFrame) {
+ size_t data_length = 400; // smaller than the packet size
+ image_._length = data_length;
+ PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
+ int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
+
+ VerifyPacketLoss(0, nbr_packets_dropped, data_length,
+ packet_data_, image_);
+}
+
+TEST_F(PacketManipulatorTest, UniformDropAll) {
+ PacketManipulatorImpl manipulator(&packet_reader_, drop_config_, false);
+ int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
+ VerifyPacketLoss(kPacketDataNumberOfPackets, nbr_packets_dropped,
+ 0, packet_data_, image_);
+}
+
+// Use our customized test class to make the second packet being lost
+TEST_F(PacketManipulatorTest, UniformDropSinglePacket) {
+ drop_config_.packet_loss_probability = 0.5;
+ PredictivePacketManipulator manipulator(&packet_reader_, drop_config_);
+ manipulator.AddRandomResult(1.0);
+ manipulator.AddRandomResult(0.3); // less than 0.5 will cause packet loss
+ manipulator.AddRandomResult(1.0);
+
+ // Execute the test target method:
+ int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
+
+ // Since we setup the predictive packet manipulator, it will throw away the
+ // second packet. The third packet is also lost because when we have lost one,
+ // the remains shall also be discarded (in the current implementation).
+ VerifyPacketLoss(2, nbr_packets_dropped, kPacketSizeInBytes, packet1_,
+ image_);
+}
+
+// Use our customized test class to make the second packet being lost
+TEST_F(PacketManipulatorTest, BurstDropNinePackets) {
+ // Create a longer packet data structure (10 packets)
+ const int kNbrPackets = 10;
+ const size_t kDataLength = kPacketSizeInBytes * kNbrPackets;
+ uint8_t data[kDataLength];
+ uint8_t* data_pointer = data;
+ // Fill with 0s, 1s and so on to be able to easily verify which were dropped:
+ for (int i = 0; i < kNbrPackets; ++i) {
+ memset(data_pointer + i * kPacketSizeInBytes, i, kPacketSizeInBytes);
+ }
+ // Overwrite the defaults from the test fixture:
+ image_._buffer = data;
+ image_._length = kDataLength;
+ image_._size = kDataLength;
+
+ drop_config_.packet_loss_probability = 0.5;
+ drop_config_.packet_loss_burst_length = 5;
+ drop_config_.packet_loss_mode = kBurst;
+ PredictivePacketManipulator manipulator(&packet_reader_, drop_config_);
+ manipulator.AddRandomResult(1.0);
+ manipulator.AddRandomResult(0.3); // less than 0.5 will cause packet loss
+ for (int i = 0; i < kNbrPackets - 2; ++i) {
+ manipulator.AddRandomResult(1.0);
+ }
+
+ // Execute the test target method:
+ int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
+
+ // Should discard every packet after the first one.
+ VerifyPacketLoss(9, nbr_packets_dropped, kPacketSizeInBytes, data, image_);
+}
+
+} // namespace test
+} // namespace webrtc