1/*
2 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTSENDERRECEIVER_H_
12#define WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTSENDERRECEIVER_H_
13
14#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
15#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
16#include "webrtc/test/channel_transport/udp_transport.h"
17#include "webrtc/typedefs.h"
18
19class TestLoadGenerator;
20namespace webrtc {
21class CriticalSectionWrapper;
22class EventWrapper;
23class ThreadWrapper;
24}
25
26using namespace webrtc;
27
28#define MAX_BITRATE_KBPS 50000
29
30
31class SendRecCB
32{
33public:
34    virtual void OnOnNetworkChanged(const uint32_t bitrateTarget,
35        const uint8_t fractionLost,
36        const uint16_t roundTripTimeMs,
37        const uint16_t bwEstimateKbitMin,
38        const uint16_t bwEstimateKbitMax) = 0;
39
40    virtual ~SendRecCB() {};
41};
42
43
44class TestSenderReceiver : public RtpFeedback, public RtpData, public UdpTransportData, public RtpVideoFeedback
45{
46
47public:
48    TestSenderReceiver (void);
49
50    ~TestSenderReceiver (void);
51
52    void SetCallback (SendRecCB *cb) { _sendRecCB = cb; };
53
54    int32_t Start();
55
56    int32_t Stop();
57
58    bool ProcLoop();
59
60    /////////////////////////////////////////////
61    // Receiver methods
62
63    int32_t InitReceiver (const uint16_t rtpPort,
64                          const uint16_t rtcpPort = 0,
65                          const int8_t payloadType = 127);
66
67    int32_t ReceiveBitrateKbps ();
68
69    int32_t SetPacketTimeout(const uint32_t timeoutMS);
70
71    bool timeOutTriggered () { return (_timeOut); };
72
73    // Inherited from RtpFeedback
74    virtual int32_t OnInitializeDecoder(
75        const int32_t id,
76        const int8_t payloadType,
77        const int8_t payloadName[RTP_PAYLOAD_NAME_SIZE],
78        const uint32_t frequency,
79        const uint8_t channels,
80        const uint32_t rate) OVERRIDE {
81      return 0;
82    }
83
84    virtual void OnPacketTimeout(const int32_t id);
85
86    virtual void OnReceivedPacket(const int32_t id,
87                                  const RtpRtcpPacketType packetType);
88
89    virtual void OnPeriodicDeadOrAlive(const int32_t id,
90                                       const RTPAliveType alive) {};
91
92    virtual void OnIncomingSSRCChanged(const int32_t id,
93                                       const uint32_t SSRC) OVERRIDE {}
94
95    virtual void OnIncomingCSRCChanged(const int32_t id,
96                                       const uint32_t CSRC,
97                                       const bool added) OVERRIDE {}
98
99
100    // Inherited from RtpData
101    virtual int32_t OnReceivedPayloadData(
102        const uint8_t* payloadData,
103        const uint16_t payloadSize,
104        const webrtc::WebRtcRTPHeader* rtpHeader) OVERRIDE;
105
106
107    // Inherited from UdpTransportData
108    virtual void IncomingRTPPacket(const int8_t* incomingRtpPacket,
109                                   const int32_t rtpPacketLength,
110                                   const int8_t* fromIP,
111                                   const uint16_t fromPort) OVERRIDE;
112
113    virtual void IncomingRTCPPacket(const int8_t* incomingRtcpPacket,
114                                    const int32_t rtcpPacketLength,
115                                    const int8_t* fromIP,
116                                    const uint16_t fromPort) OVERRIDE;
117
118
119
120    /////////////////////////////////
121    // Sender methods
122
123    int32_t InitSender (const uint32_t startBitrateKbps,
124                        const int8_t* ipAddr,
125                        const uint16_t rtpPort,
126                        const uint16_t rtcpPort = 0,
127                        const int8_t payloadType = 127);
128
129    int32_t SendOutgoingData(const uint32_t timeStamp,
130        const uint8_t* payloadData,
131        const uint32_t payloadSize,
132        const webrtc::FrameType frameType = webrtc::kVideoFrameDelta);
133
134    int32_t SetLoadGenerator(TestLoadGenerator *generator);
135
136    uint32_t BitrateSent() { return (_rtp->BitrateSent()); };
137
138
139    // Inherited from RtpVideoFeedback
140    virtual void OnReceivedIntraFrameRequest(const int32_t id,
141        const uint8_t message = 0) {};
142
143    virtual void OnNetworkChanged(const int32_t id,
144                                  const uint32_t minBitrateBps,
145                                  const uint32_t maxBitrateBps,
146                                  const uint8_t fractionLost,
147                                  const uint16_t roundTripTimeMs,
148                                  const uint16_t bwEstimateKbitMin,
149                                  const uint16_t bwEstimateKbitMax);
150
151private:
152    RtpRtcp* _rtp;
153    UdpTransport* _transport;
154    webrtc::CriticalSectionWrapper* _critSect;
155    webrtc::EventWrapper *_eventPtr;
156    webrtc::ThreadWrapper* _procThread;
157    bool _running;
158    int8_t _payloadType;
159    TestLoadGenerator* _loadGenerator;
160    bool _isSender;
161    bool _isReceiver;
162    bool _timeOut;
163    SendRecCB * _sendRecCB;
164    uint32_t _lastBytesReceived;
165    int64_t _lastTime;
166
167};
168
169#endif // WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTSENDERRECEIVER_H_
170