1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 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_RTP_RTCP_TEST_BWESTANDALONE_TESTSENDERRECEIVER_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTSENDERRECEIVER_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
15cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
16cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/test/channel_transport/udp_transport.h"
17cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/typedefs.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass TestLoadGenerator;
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper;
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper;
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper;
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing namespace webrtc;
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MAX_BITRATE_KBPS 50000
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass SendRecCB
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
34b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void OnOnNetworkChanged(const uint32_t bitrateTarget,
35b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint8_t fractionLost,
36b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint16_t roundTripTimeMs,
37b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint16_t bwEstimateKbitMin,
38b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint16_t bwEstimateKbitMax) = 0;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~SendRecCB() {};
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass TestSenderReceiver : public RtpFeedback, public RtpData, public UdpTransportData, public RtpVideoFeedback
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TestSenderReceiver (void);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ~TestSenderReceiver (void);
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetCallback (SendRecCB *cb) { _sendRecCB = cb; };
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
54b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t Start();
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
56b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t Stop();
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool ProcLoop();
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /////////////////////////////////////////////
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Receiver methods
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t InitReceiver (const uint16_t rtpPort,
64b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                          const uint16_t rtcpPort = 0,
65b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                          const int8_t payloadType = 127);
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t ReceiveBitrateKbps ();
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t SetPacketTimeout(const uint32_t timeoutMS);
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool timeOutTriggered () { return (_timeOut); };
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Inherited from RtpFeedback
748f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org    virtual int32_t OnInitializeDecoder(
758f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const int32_t id,
768f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const int8_t payloadType,
778f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const int8_t payloadName[RTP_PAYLOAD_NAME_SIZE],
788f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const uint32_t frequency,
798f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const uint8_t channels,
808f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const uint32_t rate) OVERRIDE {
818f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org      return 0;
828f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org    }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void OnPacketTimeout(const int32_t id);
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
86b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void OnReceivedPacket(const int32_t id,
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  const RtpRtcpPacketType packetType);
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void OnPeriodicDeadOrAlive(const int32_t id,
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       const RTPAliveType alive) {};
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
928f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org    virtual void OnIncomingSSRCChanged(const int32_t id,
938f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                       const uint32_t SSRC) OVERRIDE {}
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
958f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org    virtual void OnIncomingCSRCChanged(const int32_t id,
968f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                       const uint32_t CSRC,
978f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                       const bool added) OVERRIDE {}
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Inherited from RtpData
1018f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org    virtual int32_t OnReceivedPayloadData(
1028f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const uint8_t* payloadData,
1038f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const uint16_t payloadSize,
1048f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org        const webrtc::WebRtcRTPHeader* rtpHeader) OVERRIDE;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Inherited from UdpTransportData
108b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void IncomingRTPPacket(const int8_t* incomingRtpPacket,
1098f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                   const int32_t rtpPacketLength,
1108f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                   const int8_t* fromIP,
1118f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                   const uint16_t fromPort) OVERRIDE;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void IncomingRTCPPacket(const int8_t* incomingRtcpPacket,
1148f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                    const int32_t rtcpPacketLength,
1158f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                    const int8_t* fromIP,
1168f32b7902e97cbd04d2606b8a90987342692b5f8henrikg@webrtc.org                                    const uint16_t fromPort) OVERRIDE;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /////////////////////////////////
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Sender methods
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t InitSender (const uint32_t startBitrateKbps,
124b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                        const int8_t* ipAddr,
125b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                        const uint16_t rtpPort,
126b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                        const uint16_t rtcpPort = 0,
127b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                        const int8_t payloadType = 127);
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
129b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t SendOutgoingData(const uint32_t timeStamp,
130b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint8_t* payloadData,
131b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint32_t payloadSize,
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        const webrtc::FrameType frameType = webrtc::kVideoFrameDelta);
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int32_t SetLoadGenerator(TestLoadGenerator *generator);
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
136b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    uint32_t BitrateSent() { return (_rtp->BitrateSent()); };
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Inherited from RtpVideoFeedback
140b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void OnReceivedIntraFrameRequest(const int32_t id,
141b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org        const uint8_t message = 0) {};
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
143b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    virtual void OnNetworkChanged(const int32_t id,
144b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                                  const uint32_t minBitrateBps,
145b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                                  const uint32_t maxBitrateBps,
146b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                                  const uint8_t fractionLost,
147b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                                  const uint16_t roundTripTimeMs,
148b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                                  const uint16_t bwEstimateKbitMin,
149b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org                                  const uint16_t bwEstimateKbitMax);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    RtpRtcp* _rtp;
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    UdpTransport* _transport;
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::CriticalSectionWrapper* _critSect;
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::EventWrapper *_eventPtr;
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::ThreadWrapper* _procThread;
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _running;
158b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int8_t _payloadType;
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    TestLoadGenerator* _loadGenerator;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _isSender;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _isReceiver;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _timeOut;
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SendRecCB * _sendRecCB;
164b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    uint32_t _lastBytesReceived;
165b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org    int64_t _lastTime;
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTSENDERRECEIVER_H_
170