1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdlib.h>
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <math.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "utility.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* function for reading audio data from PCM file */
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgreadframe(
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short* data,
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FILE*  inp,
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int    length)
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short k, rlen, status = 0;
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	unsigned char* ptrUChar;
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	ptrUChar = (unsigned char*)data;
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    rlen = (short)fread(data, sizeof(short), length, inp);
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (rlen < length) {
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (k = rlen; k < length; k++)
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            data[k] = 0;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        status = 1;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	// Assuming that our PCM files are written in Intel machines
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	for(k = 0; k < length; k++)
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		data[k] = (short)ptrUChar[k<<1] | ((((short)ptrUChar[(k<<1) + 1]) << 8) & 0xFF00);
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return status;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgshort
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgreadSwitch(
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int   argc,
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* argv[],
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* strID)
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short n;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for(n = 0; n < argc; n++)
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if(strcmp(argv[n], strID) == 0)
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return 1;
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgdouble
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgreadParamDouble(
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int    argc,
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char*  argv[],
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char*  strID,
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double defaultVal)
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double returnVal = defaultVal;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short n;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for(n = 0; n < argc; n++)
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if(strcmp(argv[n], strID) == 0)
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            n++;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if(n < argc)
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                returnVal = atof(argv[n]);
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return returnVal;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgreadParamInt(
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int   argc,
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* argv[],
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* strID,
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int   defaultVal)
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int returnVal = defaultVal;
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short n;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for(n = 0; n < argc; n++)
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if(strcmp(argv[n], strID) == 0)
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            n++;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if(n < argc)
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                returnVal = atoi(argv[n]);
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return returnVal;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgreadParamString(
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int   argc,
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* argv[],
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* strID,
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char* stringParam,
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int   maxSize)
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int paramLenght = 0;
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short n;
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for(n = 0; n < argc; n++)
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if(strcmp(argv[n], strID) == 0)
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            n++;
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if(n < argc)
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                strncpy(stringParam, argv[n], maxSize);
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                paramLenght = (int)strlen(argv[n]);
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return paramLenght;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgget_arrival_time(
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int              current_framesamples,   /* samples */
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int              packet_size,            /* bytes */
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int              bottleneck,             /* excluding headers; bits/s */
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    BottleNeckModel* BN_data,
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short            senderSampFreqHz,
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    short            receiverSampFreqHz)
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int travelTimeMs;
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	const int headerSizeByte = 35;
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int headerRate;
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    BN_data->whenPackGeneratedMs += (current_framesamples / (senderSampFreqHz / 1000));
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	headerRate = headerSizeByte * 8 * senderSampFreqHz / current_framesamples;     /* bits/s */
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* everything in samples */
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data->sample_count = BN_data->sample_count + current_framesamples;
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //travelTimeMs = ((packet_size + HeaderSize) * 8 * sampFreqHz) /
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //    (bottleneck + HeaderRate)
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    travelTimeMs = (unsigned int)floor((double)((packet_size + headerSizeByte) * 8 * 1000)
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        / (double)(bottleneck + headerRate) + 0.5);
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if(BN_data->whenPrevPackLeftMs > BN_data->whenPackGeneratedMs)
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        BN_data->whenPrevPackLeftMs += travelTimeMs;
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        BN_data->whenPrevPackLeftMs = BN_data->whenPackGeneratedMs +
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            travelTimeMs;
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    BN_data->arrival_time = (BN_data->whenPrevPackLeftMs *
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        (receiverSampFreqHz / 1000));
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//	if (BN_data->arrival_time < BN_data->sample_count)
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//		BN_data->arrival_time = BN_data->sample_count;
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data->rtp_number++;
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
179