• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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