aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/audio_coding/test/utility.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/modules/audio_coding/test/utility.cc')
-rw-r--r--webrtc/modules/audio_coding/test/utility.cc303
1 files changed, 303 insertions, 0 deletions
diff --git a/webrtc/modules/audio_coding/test/utility.cc b/webrtc/modules/audio_coding/test/utility.cc
new file mode 100644
index 0000000000..89368bce51
--- /dev/null
+++ b/webrtc/modules/audio_coding/test/utility.cc
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "utility.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webrtc/common.h"
+#include "webrtc/common_types.h"
+#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
+#include "webrtc/modules/audio_coding/acm2/acm_common_defs.h"
+
+#define NUM_CODECS_WITH_FIXED_PAYLOAD_TYPE 13
+
+namespace webrtc {
+
+ACMTestTimer::ACMTestTimer()
+ : _msec(0),
+ _sec(0),
+ _min(0),
+ _hour(0) {
+ return;
+}
+
+ACMTestTimer::~ACMTestTimer() {
+ return;
+}
+
+void ACMTestTimer::Reset() {
+ _msec = 0;
+ _sec = 0;
+ _min = 0;
+ _hour = 0;
+ return;
+}
+void ACMTestTimer::Tick10ms() {
+ _msec += 10;
+ Adjust();
+ return;
+}
+
+void ACMTestTimer::Tick1ms() {
+ _msec++;
+ Adjust();
+ return;
+}
+
+void ACMTestTimer::Tick100ms() {
+ _msec += 100;
+ Adjust();
+ return;
+}
+
+void ACMTestTimer::Tick1sec() {
+ _sec++;
+ Adjust();
+ return;
+}
+
+void ACMTestTimer::CurrentTimeHMS(char* currTime) {
+ sprintf(currTime, "%4lu:%02u:%06.3f", _hour, _min,
+ (double) _sec + (double) _msec / 1000.);
+ return;
+}
+
+void ACMTestTimer::CurrentTime(unsigned long& h, unsigned char& m,
+ unsigned char& s, unsigned short& ms) {
+ h = _hour;
+ m = _min;
+ s = _sec;
+ ms = _msec;
+ return;
+}
+
+void ACMTestTimer::Adjust() {
+ unsigned int n;
+ if (_msec >= 1000) {
+ n = _msec / 1000;
+ _msec -= (1000 * n);
+ _sec += n;
+ }
+ if (_sec >= 60) {
+ n = _sec / 60;
+ _sec -= (n * 60);
+ _min += n;
+ }
+ if (_min >= 60) {
+ n = _min / 60;
+ _min -= (n * 60);
+ _hour += n;
+ }
+}
+
+int16_t ChooseCodec(CodecInst& codecInst) {
+
+ PrintCodecs();
+ //AudioCodingModule* tmpACM = AudioCodingModule::Create(0);
+ uint8_t noCodec = AudioCodingModule::NumberOfCodecs();
+ int8_t codecID;
+ bool outOfRange = false;
+ char myStr[15] = "";
+ do {
+ printf("\nChoose a codec [0]: ");
+ EXPECT_TRUE(fgets(myStr, 10, stdin) != NULL);
+ codecID = atoi(myStr);
+ if ((codecID < 0) || (codecID >= noCodec)) {
+ printf("\nOut of range.\n");
+ outOfRange = true;
+ }
+ } while (outOfRange);
+
+ CHECK_ERROR(AudioCodingModule::Codec((uint8_t )codecID, &codecInst));
+ return 0;
+}
+
+void PrintCodecs() {
+ uint8_t noCodec = AudioCodingModule::NumberOfCodecs();
+
+ CodecInst codecInst;
+ printf("No Name [Hz] [bps]\n");
+ for (uint8_t codecCntr = 0; codecCntr < noCodec; codecCntr++) {
+ AudioCodingModule::Codec(codecCntr, &codecInst);
+ printf("%2d- %-18s %5d %6d\n", codecCntr, codecInst.plname,
+ codecInst.plfreq, codecInst.rate);
+ }
+
+}
+
+CircularBuffer::CircularBuffer(uint32_t len)
+ : _buff(NULL),
+ _idx(0),
+ _buffIsFull(false),
+ _calcAvg(false),
+ _calcVar(false),
+ _sum(0),
+ _sumSqr(0) {
+ _buff = new double[len];
+ if (_buff == NULL) {
+ _buffLen = 0;
+ } else {
+ for (uint32_t n = 0; n < len; n++) {
+ _buff[n] = 0;
+ }
+ _buffLen = len;
+ }
+}
+
+CircularBuffer::~CircularBuffer() {
+ if (_buff != NULL) {
+ delete[] _buff;
+ _buff = NULL;
+ }
+}
+
+void CircularBuffer::Update(const double newVal) {
+ assert(_buffLen > 0);
+
+ // store the value that is going to be overwritten
+ double oldVal = _buff[_idx];
+ // record the new value
+ _buff[_idx] = newVal;
+ // increment the index, to point to where we would
+ // write next
+ _idx++;
+ // it is a circular buffer, if we are at the end
+ // we have to cycle to the beginning
+ if (_idx >= _buffLen) {
+ // flag that the buffer is filled up.
+ _buffIsFull = true;
+ _idx = 0;
+ }
+
+ // Update
+
+ if (_calcAvg) {
+ // for the average we have to update
+ // the sum
+ _sum += (newVal - oldVal);
+ }
+
+ if (_calcVar) {
+ // to calculate variance we have to update
+ // the sum of squares
+ _sumSqr += (double) (newVal - oldVal) * (double) (newVal + oldVal);
+ }
+}
+
+void CircularBuffer::SetArithMean(bool enable) {
+ assert(_buffLen > 0);
+
+ if (enable && !_calcAvg) {
+ uint32_t lim;
+ if (_buffIsFull) {
+ lim = _buffLen;
+ } else {
+ lim = _idx;
+ }
+ _sum = 0;
+ for (uint32_t n = 0; n < lim; n++) {
+ _sum += _buff[n];
+ }
+ }
+ _calcAvg = enable;
+}
+
+void CircularBuffer::SetVariance(bool enable) {
+ assert(_buffLen > 0);
+
+ if (enable && !_calcVar) {
+ uint32_t lim;
+ if (_buffIsFull) {
+ lim = _buffLen;
+ } else {
+ lim = _idx;
+ }
+ _sumSqr = 0;
+ for (uint32_t n = 0; n < lim; n++) {
+ _sumSqr += _buff[n] * _buff[n];
+ }
+ }
+ _calcAvg = enable;
+}
+
+int16_t CircularBuffer::ArithMean(double& mean) {
+ assert(_buffLen > 0);
+
+ if (_buffIsFull) {
+
+ mean = _sum / (double) _buffLen;
+ return 0;
+ } else {
+ if (_idx > 0) {
+ mean = _sum / (double) _idx;
+ return 0;
+ } else {
+ return -1;
+ }
+
+ }
+}
+
+int16_t CircularBuffer::Variance(double& var) {
+ assert(_buffLen > 0);
+
+ if (_buffIsFull) {
+ var = _sumSqr / (double) _buffLen;
+ return 0;
+ } else {
+ if (_idx > 0) {
+ var = _sumSqr / (double) _idx;
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+}
+
+bool FixedPayloadTypeCodec(const char* payloadName) {
+ char fixPayloadTypeCodecs[NUM_CODECS_WITH_FIXED_PAYLOAD_TYPE][32] = { "PCMU",
+ "PCMA", "GSM", "G723", "DVI4", "LPC", "PCMA", "G722", "QCELP", "CN",
+ "MPA", "G728", "G729" };
+
+ for (int n = 0; n < NUM_CODECS_WITH_FIXED_PAYLOAD_TYPE; n++) {
+ if (!STR_CASE_CMP(payloadName, fixPayloadTypeCodecs[n])) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void VADCallback::Reset() {
+ memset(_numFrameTypes, 0, sizeof(_numFrameTypes));
+}
+
+VADCallback::VADCallback() {
+ memset(_numFrameTypes, 0, sizeof(_numFrameTypes));
+}
+
+void VADCallback::PrintFrameTypes() {
+ printf("kEmptyFrame......... %d\n", _numFrameTypes[kEmptyFrame]);
+ printf("kAudioFrameSpeech... %d\n", _numFrameTypes[kAudioFrameSpeech]);
+ printf("kAudioFrameCN....... %d\n", _numFrameTypes[kAudioFrameCN]);
+ printf("kVideoFrameKey...... %d\n", _numFrameTypes[kVideoFrameKey]);
+ printf("kVideoFrameDelta.... %d\n", _numFrameTypes[kVideoFrameDelta]);
+}
+
+int32_t VADCallback::InFrameType(FrameType frame_type) {
+ _numFrameTypes[frame_type]++;
+ return 0;
+}
+
+} // namespace webrtc