/*
 *  Copyright (c) 2014 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/test/rtcp_packet_parser.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace webrtc {
namespace test {

using namespace RTCPUtility;

RtcpPacketParser::RtcpPacketParser() {}

RtcpPacketParser::~RtcpPacketParser() {}

void RtcpPacketParser::Parse(const void *data, size_t len) {
  const uint8_t* packet = static_cast<const uint8_t*>(data);
  RTCPUtility::RTCPParserV2 parser(packet, len, true);
  EXPECT_TRUE(parser.IsValid());
  for (RTCPUtility::RTCPPacketTypes type = parser.Begin();
       type != RTCPPacketTypes::kInvalid; type = parser.Iterate()) {
    switch (type) {
      case RTCPPacketTypes::kSr:
        sender_report_.Set(parser.Packet().SR);
        break;
      case RTCPPacketTypes::kRr:
        receiver_report_.Set(parser.Packet().RR);
        break;
      case RTCPPacketTypes::kReportBlockItem:
        report_block_.Set(parser.Packet().ReportBlockItem);
        ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC];
        break;
      case RTCPPacketTypes::kSdes:
        sdes_.Set();
        break;
      case RTCPPacketTypes::kSdesChunk:
        sdes_chunk_.Set(parser.Packet().CName);
        break;
      case RTCPPacketTypes::kBye:
        bye_.Set(parser.Packet().BYE);
        break;
      case RTCPPacketTypes::kApp:
        app_.Set(parser.Packet().APP);
        break;
      case RTCPPacketTypes::kAppItem:
        app_item_.Set(parser.Packet().APP);
        break;
      case RTCPPacketTypes::kExtendedIj:
        ij_.Set();
        break;
      case RTCPPacketTypes::kExtendedIjItem:
        ij_item_.Set(parser.Packet().ExtendedJitterReportItem);
        break;
      case RTCPPacketTypes::kPsfbPli:
        pli_.Set(parser.Packet().PLI);
        break;
      case RTCPPacketTypes::kPsfbSli:
        sli_.Set(parser.Packet().SLI);
        break;
      case RTCPPacketTypes::kPsfbSliItem:
        sli_item_.Set(parser.Packet().SLIItem);
        break;
      case RTCPPacketTypes::kPsfbRpsiItem:
        rpsi_.Set(parser.Packet().RPSI);
        break;
      case RTCPPacketTypes::kPsfbFir:
        fir_.Set(parser.Packet().FIR);
        break;
      case RTCPPacketTypes::kPsfbFirItem:
        fir_item_.Set(parser.Packet().FIRItem);
        break;
      case RTCPPacketTypes::kRtpfbNack:
        nack_.Set(parser.Packet().NACK);
        nack_item_.Clear();
        break;
      case RTCPPacketTypes::kRtpfbNackItem:
        nack_item_.Set(parser.Packet().NACKItem);
        break;
      case RTCPPacketTypes::kPsfbApp:
        psfb_app_.Set(parser.Packet().PSFBAPP);
        break;
      case RTCPPacketTypes::kPsfbRembItem:
        remb_item_.Set(parser.Packet().REMBItem);
        break;
      case RTCPPacketTypes::kRtpfbTmmbr:
        tmmbr_.Set(parser.Packet().TMMBR);
        break;
      case RTCPPacketTypes::kRtpfbTmmbrItem:
        tmmbr_item_.Set(parser.Packet().TMMBRItem);
        break;
      case RTCPPacketTypes::kRtpfbTmmbn:
        tmmbn_.Set(parser.Packet().TMMBN);
        tmmbn_items_.Clear();
        break;
      case RTCPPacketTypes::kRtpfbTmmbnItem:
        tmmbn_items_.Set(parser.Packet().TMMBNItem);
        break;
      case RTCPPacketTypes::kXrHeader:
        xr_header_.Set(parser.Packet().XR);
        dlrr_items_.Clear();
        break;
      case RTCPPacketTypes::kXrReceiverReferenceTime:
        rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem);
        break;
      case RTCPPacketTypes::kXrDlrrReportBlock:
        dlrr_.Set();
        break;
      case RTCPPacketTypes::kXrDlrrReportBlockItem:
        dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem);
        break;
      case RTCPPacketTypes::kXrVoipMetric:
        voip_metric_.Set(parser.Packet().XRVOIPMetricItem);
        break;
      default:
        break;
    }
  }
}

uint64_t Rpsi::PictureId() const {
  assert(num_packets_ > 0);
  uint16_t num_bytes = rpsi_.NumberOfValidBits / 8;
  assert(num_bytes > 0);
  uint64_t picture_id = 0;
  for (uint16_t i = 0; i < num_bytes - 1; ++i) {
    picture_id += (rpsi_.NativeBitString[i] & 0x7f);
    picture_id <<= 7;
  }
  picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f);
  return picture_id;
}

}  // namespace test
}  // namespace webrtc
