Home | History | Annotate | Download | only in source
      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
     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