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 #include <stdlib.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <math.h>
15
16 #include "modules/audio_coding/codecs/isac/main/util/utility.h"
17
18 /* function for reading audio data from PCM file */
19 int
readframe(short * data,FILE * inp,int length)20 readframe(
21 short* data,
22 FILE* inp,
23 int length)
24 {
25 short k, rlen, status = 0;
26 unsigned char* ptrUChar;
27 ptrUChar = (unsigned char*)data;
28
29 rlen = (short)fread(data, sizeof(short), length, inp);
30 if (rlen < length) {
31 for (k = rlen; k < length; k++)
32 data[k] = 0;
33 status = 1;
34 }
35
36 // Assuming that our PCM files are written in Intel machines
37 for(k = 0; k < length; k++)
38 {
39 data[k] = (short)ptrUChar[k<<1] | ((((short)ptrUChar[(k<<1) + 1]) << 8) & 0xFF00);
40 }
41
42 return status;
43 }
44
45 short
readSwitch(int argc,char * argv[],char * strID)46 readSwitch(
47 int argc,
48 char* argv[],
49 char* strID)
50 {
51 short n;
52 for(n = 0; n < argc; n++)
53 {
54 if(strcmp(argv[n], strID) == 0)
55 {
56 return 1;
57 }
58 }
59 return 0;
60 }
61
62 double
readParamDouble(int argc,char * argv[],char * strID,double defaultVal)63 readParamDouble(
64 int argc,
65 char* argv[],
66 char* strID,
67 double defaultVal)
68 {
69 double returnVal = defaultVal;
70 short n;
71 for(n = 0; n < argc; n++)
72 {
73 if(strcmp(argv[n], strID) == 0)
74 {
75 n++;
76 if(n < argc)
77 {
78 returnVal = atof(argv[n]);
79 }
80 break;
81 }
82 }
83 return returnVal;
84 }
85
86 int
readParamInt(int argc,char * argv[],char * strID,int defaultVal)87 readParamInt(
88 int argc,
89 char* argv[],
90 char* strID,
91 int defaultVal)
92 {
93 int returnVal = defaultVal;
94 short n;
95 for(n = 0; n < argc; n++)
96 {
97 if(strcmp(argv[n], strID) == 0)
98 {
99 n++;
100 if(n < argc)
101 {
102 returnVal = atoi(argv[n]);
103 }
104 break;
105 }
106 }
107 return returnVal;
108 }
109
110 int
readParamString(int argc,char * argv[],char * strID,char * stringParam,int maxSize)111 readParamString(
112 int argc,
113 char* argv[],
114 char* strID,
115 char* stringParam,
116 int maxSize)
117 {
118 int paramLenght = 0;
119 short n;
120 for(n = 0; n < argc; n++)
121 {
122 if(strcmp(argv[n], strID) == 0)
123 {
124 n++;
125 if(n < argc)
126 {
127 strncpy(stringParam, argv[n], maxSize);
128 paramLenght = (int)strlen(argv[n]);
129 }
130 break;
131 }
132 }
133 return paramLenght;
134 }
135
136 void
get_arrival_time(int current_framesamples,size_t packet_size,int bottleneck,BottleNeckModel * BN_data,short senderSampFreqHz,short receiverSampFreqHz)137 get_arrival_time(
138 int current_framesamples, /* samples */
139 size_t packet_size, /* bytes */
140 int bottleneck, /* excluding headers; bits/s */
141 BottleNeckModel* BN_data,
142 short senderSampFreqHz,
143 short receiverSampFreqHz)
144 {
145 unsigned int travelTimeMs;
146 const int headerSizeByte = 35;
147
148 int headerRate;
149
150 BN_data->whenPackGeneratedMs += (current_framesamples / (senderSampFreqHz / 1000));
151
152 headerRate = headerSizeByte * 8 * senderSampFreqHz / current_framesamples; /* bits/s */
153
154 /* everything in samples */
155 BN_data->sample_count = BN_data->sample_count + current_framesamples;
156
157 //travelTimeMs = ((packet_size + HeaderSize) * 8 * sampFreqHz) /
158 // (bottleneck + HeaderRate)
159 travelTimeMs = (unsigned int)floor((double)((packet_size + headerSizeByte) * 8 * 1000)
160 / (double)(bottleneck + headerRate) + 0.5);
161
162 if(BN_data->whenPrevPackLeftMs > BN_data->whenPackGeneratedMs)
163 {
164 BN_data->whenPrevPackLeftMs += travelTimeMs;
165 }
166 else
167 {
168 BN_data->whenPrevPackLeftMs = BN_data->whenPackGeneratedMs +
169 travelTimeMs;
170 }
171
172 BN_data->arrival_time = (BN_data->whenPrevPackLeftMs *
173 (receiverSampFreqHz / 1000));
174
175 // if (BN_data->arrival_time < BN_data->sample_count)
176 // BN_data->arrival_time = BN_data->sample_count;
177
178 BN_data->rtp_number++;
179 }
180