blob: c0bf7f307bd2eb201dc96f303f7b96bdca586b93 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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 CHANNEL_H
12#define CHANNEL_H
13
14#include <stdio.h>
15
16#include "audio_coding_module.h"
17#include "critical_section_wrapper.h"
18#include "rw_lock_wrapper.h"
turaj@webrtc.orgc454fab2012-12-13 22:46:43 +000019#include "webrtc/modules/interface/module_common_types.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
tina.legrand@webrtc.org554ae1a2011-12-16 10:09:04 +000021namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000022
23#define MAX_NUM_PAYLOADS 50
24#define MAX_NUM_FRAMESIZES 6
25
26
27struct ACMTestFrameSizeStats
28{
pbos@webrtc.org0946a562013-04-09 00:28:06 +000029 uint16_t frameSizeSample;
30 int16_t maxPayloadLen;
31 uint32_t numPackets;
32 uint64_t totalPayloadLenByte;
33 uint64_t totalEncodedSamples;
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +000034 double rateBitPerSec;
35 double usageLenSec;
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000036
niklase@google.com470e71d2011-07-07 08:21:25 +000037};
38
39struct ACMTestPayloadStats
40{
41 bool newPacket;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000042 int16_t payloadType;
43 int16_t lastPayloadLenByte;
44 uint32_t lastTimestamp;
niklase@google.com470e71d2011-07-07 08:21:25 +000045 ACMTestFrameSizeStats frameSizeStats[MAX_NUM_FRAMESIZES];
46};
47
niklase@google.com470e71d2011-07-07 08:21:25 +000048class Channel: public AudioPacketizationCallback
49{
50public:
51
52 Channel(
pbos@webrtc.org0946a562013-04-09 00:28:06 +000053 int16_t chID = -1);
niklase@google.com470e71d2011-07-07 08:21:25 +000054 ~Channel();
55
pbos@webrtc.org0946a562013-04-09 00:28:06 +000056 int32_t SendData(
niklase@google.com470e71d2011-07-07 08:21:25 +000057 const FrameType frameType,
pbos@webrtc.org0946a562013-04-09 00:28:06 +000058 const uint8_t payloadType,
59 const uint32_t timeStamp,
60 const uint8_t* payloadData,
61 const uint16_t payloadSize,
niklase@google.com470e71d2011-07-07 08:21:25 +000062 const RTPFragmentationHeader* fragmentation);
63
64 void RegisterReceiverACM(
65 AudioCodingModule *acm);
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000066
niklase@google.com470e71d2011-07-07 08:21:25 +000067 void ResetStats();
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000068
pbos@webrtc.org0946a562013-04-09 00:28:06 +000069 int16_t Stats(
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +000070 CodecInst& codecInst,
niklase@google.com470e71d2011-07-07 08:21:25 +000071 ACMTestPayloadStats& payloadStats);
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000072
niklase@google.com470e71d2011-07-07 08:21:25 +000073 void Stats(
pbos@webrtc.org0946a562013-04-09 00:28:06 +000074 uint32_t* numPackets);
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000075
niklase@google.com470e71d2011-07-07 08:21:25 +000076 void Stats(
pbos@webrtc.org0946a562013-04-09 00:28:06 +000077 uint8_t* payloadLenByte,
78 uint32_t* payloadType);
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000079
niklase@google.com470e71d2011-07-07 08:21:25 +000080 void PrintStats(
81 CodecInst& codecInst);
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000082
niklase@google.com470e71d2011-07-07 08:21:25 +000083 void SetIsStereo(bool isStereo)
84 {
85 _isStereo = isStereo;
86 }
87
pbos@webrtc.org0946a562013-04-09 00:28:06 +000088 uint32_t LastInTimestamp();
andrew@webrtc.orgd7a71d02012-08-01 01:40:02 +000089
niklase@google.com470e71d2011-07-07 08:21:25 +000090 void SetFECTestWithPacketLoss(bool usePacketLoss)
91 {
92 _useFECTestWithPacketLoss = usePacketLoss;
93 }
94
95 double BitRate();
96
97private:
98 void CalcStatistics(
tina.legrand@webrtc.org554ae1a2011-12-16 10:09:04 +000099 WebRtcRTPHeader& rtpInfo,
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000100 uint16_t payloadSize);
niklase@google.com470e71d2011-07-07 08:21:25 +0000101
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +0000102 AudioCodingModule* _receiverACM;
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000103 uint16_t _seqNo;
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +0000104 // 60msec * 32 sample(max)/msec * 2 description (maybe) * 2 bytes/sample
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000105 uint8_t _payloadData[60 * 32 * 2 * 2];
niklase@google.com470e71d2011-07-07 08:21:25 +0000106
107 CriticalSectionWrapper* _channelCritSect;
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +0000108 FILE* _bitStreamFile;
109 bool _saveBitStream;
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000110 int16_t _lastPayloadType;
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +0000111 ACMTestPayloadStats _payloadStats[MAX_NUM_PAYLOADS];
112 bool _isStereo;
113 WebRtcRTPHeader _rtpInfo;
114 bool _leftChannel;
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000115 uint32_t _lastInTimestamp;
niklase@google.com470e71d2011-07-07 08:21:25 +0000116 // FEC Test variables
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000117 int16_t _packetLoss;
tina.legrand@webrtc.org2e096922011-08-18 06:20:30 +0000118 bool _useFECTestWithPacketLoss;
pbos@webrtc.org0946a562013-04-09 00:28:06 +0000119 uint64_t _beginTime;
120 uint64_t _totalBytes;
niklase@google.com470e71d2011-07-07 08:21:25 +0000121};
122
tina.legrand@webrtc.org554ae1a2011-12-16 10:09:04 +0000123} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000124
125#endif