1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Use of this source code is governed by a BSD-style license
5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  that can be found in the LICENSE file in the root of the source
6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  tree. An additional intellectual property rights grant can be found
7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  in the file PATENTS.  All contributing project authors may
8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  be found in the AUTHORS file in the root of the source tree.
9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * decode_bwe.c
13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * This C file contains the internal decode bandwidth estimate function.
15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "bandwidth_estimator.h"
20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "codec.h"
21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "entropy_coding.h"
22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "structs.h"
23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint WebRtcIsacfix_EstimateBandwidth(BwEstimatorstr *bwest_str,
28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                    Bitstr_dec  *streamdata,
29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                    WebRtc_Word32  packet_size,
30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                    WebRtc_UWord16 rtp_seq_number,
31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                    WebRtc_UWord32 send_ts,
32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                    WebRtc_UWord32 arr_ts)
33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{
34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 index;
35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 frame_samples;
36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int err;
37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* decode framelength */
39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  err = WebRtcIsacfix_DecodeFrameLen(streamdata, &frame_samples);
40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* error check */
41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (err<0) {
42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    return err;
43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* decode BW estimation */
46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  err = WebRtcIsacfix_DecodeSendBandwidth(streamdata, &index);
47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* error check */
48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (err<0) {
49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    return err;
50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Update BWE with received data */
53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  err = WebRtcIsacfix_UpdateUplinkBwImpl(
54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      bwest_str,
55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      rtp_seq_number,
56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      (WebRtc_UWord16)WEBRTC_SPL_UDIV(WEBRTC_SPL_UMUL(frame_samples,1000), FS),
57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      send_ts,
58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      arr_ts,
59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      (WebRtc_Word16) packet_size,  /* in bytes */
60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      index);
61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* error check */
63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (err<0) {
64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    return err;
65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Succesful */
68a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  return 0;
69a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}
70