Home | History | Annotate | Download | only in test
      1 /*
      2  *  Copyright (c) 2014 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 "webrtc/test/rtcp_packet_parser.h"
     12 
     13 namespace webrtc {
     14 namespace test {
     15 
     16 RtcpPacketParser::RtcpPacketParser() {}
     17 
     18 RtcpPacketParser::~RtcpPacketParser() {}
     19 
     20 void RtcpPacketParser::Parse(const void *data, int len) {
     21   const uint8_t* packet = static_cast<const uint8_t*>(data);
     22   RTCPUtility::RTCPParserV2 parser(packet, len, true);
     23   for (RTCPUtility::RTCPPacketTypes type = parser.Begin();
     24       type != RTCPUtility::kRtcpNotValidCode;
     25       type = parser.Iterate()) {
     26     switch (type) {
     27       case RTCPUtility::kRtcpSrCode:
     28         sender_report_.Set(parser.Packet().SR);
     29         break;
     30       case RTCPUtility::kRtcpRrCode:
     31         receiver_report_.Set(parser.Packet().RR);
     32         break;
     33       case RTCPUtility::kRtcpReportBlockItemCode:
     34         report_block_.Set(parser.Packet().ReportBlockItem);
     35         ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC];
     36         break;
     37       case RTCPUtility::kRtcpSdesCode:
     38         sdes_.Set();
     39         break;
     40       case RTCPUtility::kRtcpSdesChunkCode:
     41         sdes_chunk_.Set(parser.Packet().CName);
     42         break;
     43       case RTCPUtility::kRtcpByeCode:
     44         bye_.Set(parser.Packet().BYE);
     45         break;
     46       case RTCPUtility::kRtcpAppCode:
     47         app_.Set(parser.Packet().APP);
     48         break;
     49       case RTCPUtility::kRtcpAppItemCode:
     50         app_item_.Set(parser.Packet().APP);
     51         break;
     52       case RTCPUtility::kRtcpExtendedIjCode:
     53         ij_.Set();
     54         break;
     55       case RTCPUtility::kRtcpExtendedIjItemCode:
     56         ij_item_.Set(parser.Packet().ExtendedJitterReportItem);
     57         break;
     58       case RTCPUtility::kRtcpPsfbPliCode:
     59         pli_.Set(parser.Packet().PLI);
     60         break;
     61       case RTCPUtility::kRtcpPsfbSliCode:
     62         sli_.Set(parser.Packet().SLI);
     63         break;
     64       case RTCPUtility::kRtcpPsfbSliItemCode:
     65         sli_item_.Set(parser.Packet().SLIItem);
     66         break;
     67       case RTCPUtility::kRtcpPsfbRpsiCode:
     68         rpsi_.Set(parser.Packet().RPSI);
     69         break;
     70       case RTCPUtility::kRtcpPsfbFirCode:
     71         fir_.Set(parser.Packet().FIR);
     72         break;
     73       case RTCPUtility::kRtcpPsfbFirItemCode:
     74         fir_item_.Set(parser.Packet().FIRItem);
     75         break;
     76       case RTCPUtility::kRtcpRtpfbNackCode:
     77         nack_.Set(parser.Packet().NACK);
     78         nack_item_.Clear();
     79         break;
     80       case RTCPUtility::kRtcpRtpfbNackItemCode:
     81         nack_item_.Set(parser.Packet().NACKItem);
     82         break;
     83       case RTCPUtility::kRtcpPsfbAppCode:
     84         psfb_app_.Set(parser.Packet().PSFBAPP);
     85         break;
     86       case RTCPUtility::kRtcpPsfbRembItemCode:
     87         remb_item_.Set(parser.Packet().REMBItem);
     88         break;
     89       case RTCPUtility::kRtcpRtpfbTmmbrCode:
     90         tmmbr_.Set(parser.Packet().TMMBR);
     91         break;
     92       case RTCPUtility::kRtcpRtpfbTmmbrItemCode:
     93         tmmbr_item_.Set(parser.Packet().TMMBRItem);
     94         break;
     95       case RTCPUtility::kRtcpRtpfbTmmbnCode:
     96         tmmbn_.Set(parser.Packet().TMMBN);
     97         tmmbn_items_.Clear();
     98         break;
     99       case RTCPUtility::kRtcpRtpfbTmmbnItemCode:
    100         tmmbn_items_.Set(parser.Packet().TMMBNItem);
    101         break;
    102       case RTCPUtility::kRtcpXrHeaderCode:
    103         xr_header_.Set(parser.Packet().XR);
    104         dlrr_items_.Clear();
    105         break;
    106       case RTCPUtility::kRtcpXrReceiverReferenceTimeCode:
    107         rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem);
    108         break;
    109       case RTCPUtility::kRtcpXrDlrrReportBlockCode:
    110         dlrr_.Set();
    111         break;
    112       case RTCPUtility::kRtcpXrDlrrReportBlockItemCode:
    113         dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem);
    114         break;
    115       case RTCPUtility::kRtcpXrVoipMetricCode:
    116         voip_metric_.Set(parser.Packet().XRVOIPMetricItem);
    117         break;
    118       default:
    119         break;
    120     }
    121   }
    122 }
    123 
    124 uint64_t Rpsi::PictureId() const {
    125   assert(num_packets_ > 0);
    126   uint16_t num_bytes = rpsi_.NumberOfValidBits / 8;
    127   assert(num_bytes > 0);
    128   uint64_t picture_id = 0;
    129   for (uint16_t i = 0; i < num_bytes - 1; ++i) {
    130     picture_id += (rpsi_.NativeBitString[i] & 0x7f);
    131     picture_id <<= 7;
    132   }
    133   picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f);
    134   return picture_id;
    135 }
    136 
    137 }  // namespace test
    138 }  // namespace webrtc
    139