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