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