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 "structs.h"
12 #include "bandwidth_estimator.h"
13 #include "entropy_coding.h"
14 #include "codec.h"
15
16
17 int
WebRtcIsac_EstimateBandwidth(BwEstimatorstr * bwest_str,Bitstr * streamdata,size_t packet_size,uint16_t rtp_seq_number,uint32_t send_ts,uint32_t arr_ts,enum IsacSamplingRate encoderSampRate,enum IsacSamplingRate decoderSampRate)18 WebRtcIsac_EstimateBandwidth(
19 BwEstimatorstr* bwest_str,
20 Bitstr* streamdata,
21 size_t packet_size,
22 uint16_t rtp_seq_number,
23 uint32_t send_ts,
24 uint32_t arr_ts,
25 enum IsacSamplingRate encoderSampRate,
26 enum IsacSamplingRate decoderSampRate)
27 {
28 int16_t index;
29 int16_t frame_samples;
30 uint32_t sendTimestampIn16kHz;
31 uint32_t arrivalTimestampIn16kHz;
32 uint32_t diffSendTime;
33 uint32_t diffArrivalTime;
34 int err;
35
36 /* decode framelength and BW estimation */
37 err = WebRtcIsac_DecodeFrameLen(streamdata, &frame_samples);
38 if(err < 0) // error check
39 {
40 return err;
41 }
42 err = WebRtcIsac_DecodeSendBW(streamdata, &index);
43 if(err < 0) // error check
44 {
45 return err;
46 }
47
48 /* UPDATE ESTIMATES FROM OTHER SIDE */
49 err = WebRtcIsac_UpdateUplinkBwImpl(bwest_str, index, encoderSampRate);
50 if(err < 0)
51 {
52 return err;
53 }
54
55 // We like BWE to work at 16 kHz sampling rate,
56 // therefore, we have to change the timestamps accordingly.
57 // translate the send timestamp if required
58 diffSendTime = (uint32_t)((uint32_t)send_ts -
59 (uint32_t)bwest_str->senderTimestamp);
60 bwest_str->senderTimestamp = send_ts;
61
62 diffArrivalTime = (uint32_t)((uint32_t)arr_ts -
63 (uint32_t)bwest_str->receiverTimestamp);
64 bwest_str->receiverTimestamp = arr_ts;
65
66 if(decoderSampRate == kIsacSuperWideband)
67 {
68 diffArrivalTime = (uint32_t)diffArrivalTime >> 1;
69 diffSendTime = (uint32_t)diffSendTime >> 1;
70 }
71
72 // arrival timestamp in 16 kHz
73 arrivalTimestampIn16kHz = (uint32_t)((uint32_t)
74 bwest_str->prev_rec_arr_ts + (uint32_t)diffArrivalTime);
75 // send timestamp in 16 kHz
76 sendTimestampIn16kHz = (uint32_t)((uint32_t)
77 bwest_str->prev_rec_send_ts + (uint32_t)diffSendTime);
78
79 err = WebRtcIsac_UpdateBandwidthEstimator(bwest_str, rtp_seq_number,
80 (frame_samples * 1000) / FS, sendTimestampIn16kHz,
81 arrivalTimestampIn16kHz, packet_size);
82 // error check
83 if(err < 0)
84 {
85 return err;
86 }
87
88 return 0;
89 }
90