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
18 WebRtcIsac_EstimateBandwidth(
19     BwEstimatorstr*           bwest_str,
20     Bitstr*                   streamdata,
21     WebRtc_Word32               packet_size,
22     WebRtc_UWord16              rtp_seq_number,
23     WebRtc_UWord32              send_ts,
24     WebRtc_UWord32              arr_ts,
25     enum IsacSamplingRate encoderSampRate,
26     enum IsacSamplingRate decoderSampRate)
27 {
28   WebRtc_Word16  index;
29   WebRtc_Word16  frame_samples;
30   WebRtc_UWord32 sendTimestampIn16kHz;
31   WebRtc_UWord32 arrivalTimestampIn16kHz;
32   WebRtc_UWord32 diffSendTime;
33   WebRtc_UWord32 diffArrivalTime;
34   int err;
35 
36   /* decode framelength and BW estimation */
37   err = WebRtcIsac_DecodeFrameLen(streamdata, &frame_samples);
38   if(err < 0)  // error check
WebRtcIsac_DecodeLb(float * signal_out,ISACLBDecStruct * ISACdecLB_obj,WebRtc_Word16 * current_framesamples,WebRtc_Word16 isRCUPayload)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 = (WebRtc_UWord32)((WebRtc_UWord32)send_ts -
59                                   (WebRtc_UWord32)bwest_str->senderTimestamp);
60   bwest_str->senderTimestamp = send_ts;
61 
62   diffArrivalTime = (WebRtc_UWord32)((WebRtc_UWord32)arr_ts -
63                                      (WebRtc_UWord32)bwest_str->receiverTimestamp);
64   bwest_str->receiverTimestamp = arr_ts;
65 
66   if(decoderSampRate == kIsacSuperWideband)
67   {
68     diffArrivalTime = (WebRtc_UWord32)diffArrivalTime >> 1;
69     diffSendTime = (WebRtc_UWord32)diffSendTime >> 1;
70   }
71   // arrival timestamp in 16 kHz
72   arrivalTimestampIn16kHz = (WebRtc_UWord32)((WebRtc_UWord32)
73                                              bwest_str->prev_rec_arr_ts + (WebRtc_UWord32)diffArrivalTime);
74   // send timestamp in 16 kHz
75   sendTimestampIn16kHz = (WebRtc_UWord32)((WebRtc_UWord32)
76                                           bwest_str->prev_rec_send_ts + (WebRtc_UWord32)diffSendTime);
77 
78   err = WebRtcIsac_UpdateBandwidthEstimator(bwest_str, rtp_seq_number,
79                                             (frame_samples * 1000) / FS, sendTimestampIn16kHz,
80                                             arrivalTimestampIn16kHz, packet_size);
81   // error check
82   if(err < 0)
83   {
84     return err;
85   }
86 
87   return 0;
88 }
89