/*
 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.h"

#include "webrtc/base/checks.h"
#include "webrtc/modules/rtp_rtcp/source/byte_io.h"

namespace webrtc {
namespace rtcp {
// VoIP Metrics Report Block (RFC 3611).
//
//     0                   1                   2                   3
//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//  0 |     BT=7      |   reserved    |       block length = 8        |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//  4 |                        SSRC of source                         |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//  8 |   loss rate   | discard rate  | burst density |  gap density  |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 12 |       burst duration          |         gap duration          |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 16 |     round trip delay          |       end system delay        |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 20 | signal level  |  noise level  |     RERL      |     Gmin      |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 24 |   R factor    | ext. R factor |    MOS-LQ     |    MOS-CQ     |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 28 |   RX config   |   reserved    |          JB nominal           |
//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 32 |          JB maximum           |          JB abs max           |
// 36 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
VoipMetric::VoipMetric() : ssrc_(0) {
  memset(&voip_metric_, 0, sizeof(voip_metric_));
}

void VoipMetric::Parse(const uint8_t* buffer) {
  RTC_DCHECK(buffer[0] == kBlockType);
  // reserved = buffer[1];
  RTC_DCHECK(ByteReader<uint16_t>::ReadBigEndian(&buffer[2]) == kBlockLength);
  ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]);
  voip_metric_.lossRate = buffer[8];
  voip_metric_.discardRate = buffer[9];
  voip_metric_.burstDensity = buffer[10];
  voip_metric_.gapDensity = buffer[11];
  voip_metric_.burstDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[12]);
  voip_metric_.gapDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[14]);
  voip_metric_.roundTripDelay =
      ByteReader<uint16_t>::ReadBigEndian(&buffer[16]);
  voip_metric_.endSystemDelay =
      ByteReader<uint16_t>::ReadBigEndian(&buffer[18]);
  voip_metric_.signalLevel = buffer[20];
  voip_metric_.noiseLevel = buffer[21];
  voip_metric_.RERL = buffer[22];
  voip_metric_.Gmin = buffer[23];
  voip_metric_.Rfactor = buffer[24];
  voip_metric_.extRfactor = buffer[25];
  voip_metric_.MOSLQ = buffer[26];
  voip_metric_.MOSCQ = buffer[27];
  voip_metric_.RXconfig = buffer[28];
  // reserved = buffer[29];
  voip_metric_.JBnominal = ByteReader<uint16_t>::ReadBigEndian(&buffer[30]);
  voip_metric_.JBmax = ByteReader<uint16_t>::ReadBigEndian(&buffer[32]);
  voip_metric_.JBabsMax = ByteReader<uint16_t>::ReadBigEndian(&buffer[34]);
}

void VoipMetric::Create(uint8_t* buffer) const {
  const uint8_t kReserved = 0;
  buffer[0] = kBlockType;
  buffer[1] = kReserved;
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], kBlockLength);
  ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], ssrc_);
  buffer[8] = voip_metric_.lossRate;
  buffer[9] = voip_metric_.discardRate;
  buffer[10] = voip_metric_.burstDensity;
  buffer[11] = voip_metric_.gapDensity;
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[12], voip_metric_.burstDuration);
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[14], voip_metric_.gapDuration);
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[16],
                                       voip_metric_.roundTripDelay);
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[18],
                                       voip_metric_.endSystemDelay);
  buffer[20] = voip_metric_.signalLevel;
  buffer[21] = voip_metric_.noiseLevel;
  buffer[22] = voip_metric_.RERL;
  buffer[23] = voip_metric_.Gmin;
  buffer[24] = voip_metric_.Rfactor;
  buffer[25] = voip_metric_.extRfactor;
  buffer[26] = voip_metric_.MOSLQ;
  buffer[27] = voip_metric_.MOSCQ;
  buffer[28] = voip_metric_.RXconfig;
  buffer[29] = kReserved;
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[30], voip_metric_.JBnominal);
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[32], voip_metric_.JBmax);
  ByteWriter<uint16_t>::WriteBigEndian(&buffer[34], voip_metric_.JBabsMax);
}

}  // namespace rtcp
}  // namespace webrtc
