1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_ 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 143f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdlib.h> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h" 17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/packet_reader.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace test { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Which mode the packet loss shall be performed according to. 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum PacketLossMode { 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Drops packets with a configured probability independently for each packet 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kUniform, 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Drops packets similar to uniform but when a packet is being dropped, 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // the number of lost packets in a row is equal to the configured burst 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // length. 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kBurst 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns a string representation of the enum value. 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* PacketLossModeToStr(PacketLossMode e); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Contains configurations related to networking and simulation of 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// scenarios caused by network interference. 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct NetworkingConfig { 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NetworkingConfig() 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org : packet_size_in_bytes(1500), max_payload_size_in_bytes(1440), 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet_loss_mode(kUniform), packet_loss_probability(0.0), 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org packet_loss_burst_length(1) { 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Packet size in bytes. Default: 1500 bytes. 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int packet_size_in_bytes; 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Encoder specific setting of maximum size in bytes of each payload. 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Default: 1440 bytes. 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int max_payload_size_in_bytes; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Packet loss mode. Two different packet loss models are supported: 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // uniform or burst. This setting has no effect unless 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // packet_loss_probability is >0. 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Default: uniform. 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PacketLossMode packet_loss_mode; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Packet loss probability. A value between 0.0 and 1.0 that defines the 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // probability of a packet being lost. 0.1 means 10% and so on. 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Default: 0 (no loss). 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double packet_loss_probability; 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Packet loss burst length. Defines how many packets will be lost in a burst 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // when a packet has been decided to be lost. Must be >=1. Default: 1. 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int packet_loss_burst_length; 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Class for simulating packet loss on the encoded frame data. 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// When a packet loss has occurred in a frame, the remaining data in that 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// frame is lost (even if burst length is only a single packet). 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(kjellander): Support discarding only individual packets in the frame 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// when CL 172001 has been submitted. This also requires a correct 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// fragmentation header to be passed to the decoder. 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// To get a repeatable packet drop pattern, re-initialize the random seed 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// using InitializeRandomSeed before each test run. 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass PacketManipulator { 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~PacketManipulator() {} 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Manipulates the data of the encoded_image to simulate parts being lost 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // during transport. 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // If packets are dropped from frame data, the completedFrame field will be 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // set to false. 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Returns the number of packets being dropped. 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ManipulatePackets(webrtc::EncodedImage* encoded_image) = 0; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass PacketManipulatorImpl : public PacketManipulator { 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PacketManipulatorImpl(PacketReader* packet_reader, 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const NetworkingConfig& config, 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool verbose); 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~PacketManipulatorImpl(); 956907050ca37893b5c668f9264c3af2f71f2617b8pbos@webrtc.org virtual int ManipulatePackets(webrtc::EncodedImage* encoded_image) OVERRIDE; 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void InitializeRandomSeed(unsigned int seed); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Returns a uniformly distributed random value between 0.0 and 1.0 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual double RandomUniform(); 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PacketReader* packet_reader_; 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const NetworkingConfig& config_; 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Used to simulate a burst over several frames. 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int active_burst_packets_; 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper* critsect_; 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int random_seed_; 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool verbose_; 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace test 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_ 114