1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2d7a71d0719251db2a31b71a9d6e9fef4f60ba778andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
113e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#ifndef WEBRTC_MODULES_AUDIO_CODING_TEST_CHANNEL_H_
123e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#define WEBRTC_MODULES_AUDIO_CODING_TEST_CHANNEL_H_
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <stdio.h>
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
163e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
17ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/include/module_common_types.h"
18a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org#include "webrtc/typedefs.h"
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
20554ae1ad4ed3e6d1d9d807f15324d2f875888d23tina.legrand@webrtc.orgnamespace webrtc {
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
22a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.orgclass CriticalSectionWrapper;
23a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define MAX_NUM_PAYLOADS   50
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define MAX_NUM_FRAMESIZES  6
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
27c2d69d3229329ebc74e9b559bb1154695246b47dturaj@webrtc.org// TODO(turajs): Write constructor for this structure.
28d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgstruct ACMTestFrameSizeStats {
29d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint16_t frameSizeSample;
304591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t maxPayloadLen;
31d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint32_t numPackets;
32d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint64_t totalPayloadLenByte;
33d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint64_t totalEncodedSamples;
34d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  double rateBitPerSec;
35d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  double usageLenSec;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
38c2d69d3229329ebc74e9b559bb1154695246b47dturaj@webrtc.org// TODO(turajs): Write constructor for this structure.
39d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgstruct ACMTestPayloadStats {
40d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool newPacket;
41d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int16_t payloadType;
424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t lastPayloadLenByte;
43d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint32_t lastTimestamp;
44d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  ACMTestFrameSizeStats frameSizeStats[MAX_NUM_FRAMESIZES];
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
47d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgclass Channel : public AudioPacketizationCallback {
48d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org public:
49d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
50d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Channel(int16_t chID = -1);
51d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  ~Channel();
52d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
5314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int32_t SendData(FrameType frameType,
5414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   uint8_t payloadType,
5514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   uint32_t timeStamp,
5614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const uint8_t* payloadData,
5714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   size_t payloadSize,
5814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                   const RTPFragmentationHeader* fragmentation) override;
59d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
60d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  void RegisterReceiverACM(AudioCodingModule *acm);
61d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
62d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  void ResetStats();
63d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
64d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int16_t Stats(CodecInst& codecInst, ACMTestPayloadStats& payloadStats);
65d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
66d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  void Stats(uint32_t* numPackets);
67d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
68d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org  void Stats(uint8_t* payloadType, uint32_t* payloadLenByte);
69d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
70d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  void PrintStats(CodecInst& codecInst);
71d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
72d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  void SetIsStereo(bool isStereo) {
73d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _isStereo = isStereo;
74d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
75d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
76d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint32_t LastInTimestamp();
77d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
78d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  void SetFECTestWithPacketLoss(bool usePacketLoss) {
79d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _useFECTestWithPacketLoss = usePacketLoss;
80d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
81d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
82d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  double BitRate();
83d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
84a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  void set_send_timestamp(uint32_t new_send_ts) {
85a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org    external_send_timestamp_ = new_send_ts;
86a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  }
87a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org
88a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  void set_sequence_number(uint16_t new_sequence_number) {
89a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org    external_sequence_number_ = new_sequence_number;
90a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  }
91a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org
92a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  void set_num_packets_to_drop(int new_num_packets_to_drop) {
93a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org    num_packets_to_drop_ = new_num_packets_to_drop;
94a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  }
95a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org
96d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org private:
974591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  void CalcStatistics(WebRtcRTPHeader& rtpInfo, size_t payloadSize);
98d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
99d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule* _receiverACM;
100d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint16_t _seqNo;
101d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // 60msec * 32 sample(max)/msec * 2 description (maybe) * 2 bytes/sample
102d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint8_t _payloadData[60 * 32 * 2 * 2];
103d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
104d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CriticalSectionWrapper* _channelCritSect;
105d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  FILE* _bitStreamFile;
106d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool _saveBitStream;
107d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int16_t _lastPayloadType;
108d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  ACMTestPayloadStats _payloadStats[MAX_NUM_PAYLOADS];
109d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool _isStereo;
110d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  WebRtcRTPHeader _rtpInfo;
111d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool _leftChannel;
112d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint32_t _lastInTimestamp;
1130561716ae262461eaa3fe5291f4626c76822108aminyue@webrtc.org  bool _useLastFrameSize;
1140561716ae262461eaa3fe5291f4626c76822108aminyue@webrtc.org  uint32_t _lastFrameSizeSample;
115d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // FEC Test variables
116d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int16_t _packetLoss;
117d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool _useFECTestWithPacketLoss;
118d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint64_t _beginTime;
119d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint64_t _totalBytes;
120a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org
121a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  // External timing info, defaulted to -1. Only used if they are
122a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  // non-negative.
123a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  int64_t external_send_timestamp_;
124a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  int32_t external_sequence_number_;
125a305e9612afb9feac6bdbced512beb3a2557c3e2turaj@webrtc.org  int num_packets_to_drop_;
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
128d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org}  // namespace webrtc
129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1303e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_CHANNEL_H_
131