/* ------------------------------------------------------------------ * Copyright (C) 1998-2009 PacketVideo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the License for the specific language governing permissions * and limitations under the License. * ------------------------------------------------------------------- */ /* */ /*********************************************************************************/ /* ** File: rtcp.h ** ** Description: ** This module defines the RTCP class. This class is used to encode and ** decode RTCP packets. Please refer to the RTCP design document for ** details. */ #ifndef RTCP_H #define RTCP_H /* ** Includes */ #ifndef OSCL_MEM_H_INCLUDED #include "oscl_mem.h" #endif #ifndef OSCL_MEDIA_DATA_H #include "oscl_media_data.h" #endif #ifndef RTPRTCP_H #include "rtprtcp.h" #endif /* ** Constants */ const int32 RTCP_BYE_SSRC_ARRAY_SIZE = 31; const int32 RTCP_MAX_REPORT_BLOCKS = 31; // This number determines how many RTCP report blocks are // preallocated and how many are allocated dynamically const uint NUM_PREALLOCATED_RTCP_RR_REPORT_BLOCKS = 1; const uint NUM_PREALLOCATED_RTCP_SR_REPORT_BLOCKS = 1; const uint NUM_PREALLOCATED_RTCP_CHUNK_ITEMS = 1; const uint NUM_PREALLOCATED_RTCP_CHUNKS = 1; // SDES item types const uint8 NULL_RTCP_SDES = 0; const uint8 CNAME_RTCP_SDES = 1; const uint8 USERNAME_RTCP_SDES = 2; const uint8 EMAIL_RTCP_SDES = 3; const uint8 PHONE_RTCP_SDES = 4; const uint8 LOC_RTCP_SDES = 5; const uint8 TOOL_RTCP_SDES = 6; const uint8 NOTE_RTCP_SDES = 7; const uint8 PRIV_RTCP_SDES = 8; // PVSS APP Packet Subtypes const char PVSS_APP_RTCP_NAME[] = "PVSS"; const char PSS0_APP_RTCP_NAME[] = "PSS0"; const uint8 RTCP_NADU_APP_SUBTYPE = 0; const uint16 RTCP_NADU_APP_DEFAULT_PLAYOUT_DELAY = 0xFFFF; const uint16 RTCP_NADU_APP_DEFAULT_NUN = 0; const uint8 DRC_REPORT = 0; const uint8 LOW_BUF_WARNING = 1; const uint8 HIGH_BUF_WARNING = 2; const int16 RTCP_PVSS_APP_MAX_SUPPORTED_SUBTYPE = 2; /* this should always * equal the last value * in the list above. */ /* * The report block is the basic component structure of * the RTCP SR and RR * */ struct RTCP_ReportBlock { uint32 sourceSSRC; uint8 fractionLost; int32 cumulativeNumberOfPacketsLost; uint32 highestSequenceNumberReceived; uint32 interarrivalJitter; uint32 lastSR; uint32 delaySinceLastSR; }; enum RTCPPacketType { SR_RTCP_PACKET, RR_RTCP_PACKET, SDES_RTCP_PACKET, PVSS_APP_RTCP_PACKET, APP_RTCP_PACKET, BYE_RTCP_PACKET, UNKNOWN_RTCP_PACKET }; /* * This structure is used to hold the receiver report (RR) information * */ class RTCP_RR { public: RTCP_RR(uint in_max_report_blocks = RTCP_MAX_REPORT_BLOCKS) : senderSSRC(0), num_report_blocks(0), max_report_blocks(in_max_report_blocks) { additional_reports = NULL; }; ~RTCP_RR() { if (additional_reports) { delete[] additional_reports; } }; OSCL_IMPORT_REF RTCP_ReportBlock* get_report_block(uint index); const RTCP_ReportBlock* read_report_block(uint index) const; bool set_max_report_blocks(uint new_max_report_blocks); bool set_report_block(uint index, const RTCP_ReportBlock& report_block); uint get_num_report_blocks() const { return num_report_blocks; }; uint32 senderSSRC; private: uint num_report_blocks; uint max_report_blocks; RTCP_ReportBlock preallocated_reports[NUM_PREALLOCATED_RTCP_RR_REPORT_BLOCKS]; RTCP_ReportBlock *additional_reports; }; class RTCP_SR { public: RTCP_SR(uint in_max_report_blocks = RTCP_MAX_REPORT_BLOCKS) : senderSSRC(0), num_report_blocks(0), max_report_blocks(in_max_report_blocks) { additional_reports = NULL; }; ~RTCP_SR() { if (additional_reports) { delete[] additional_reports; } }; RTCP_ReportBlock* get_report_block(uint index); const RTCP_ReportBlock* read_report_block(uint index) const; bool set_max_report_blocks(uint new_max_report_blocks); bool set_report_block(uint index, const RTCP_ReportBlock& report_block); uint get_num_report_blocks() const { return num_report_blocks; }; uint32 senderSSRC; uint32 NTP_timestamp_high; uint32 NTP_timestamp_low; uint32 RTP_timestamp; uint32 packet_count; uint32 octet_count; private: uint num_report_blocks; uint max_report_blocks; RTCP_ReportBlock preallocated_reports[NUM_PREALLOCATED_RTCP_SR_REPORT_BLOCKS]; RTCP_ReportBlock *additional_reports; }; struct SDES_item { uint8 type; OsclMemoryFragment content; SDES_item() { type = 0; content.ptr = NULL; content.len = 0; } ~SDES_item() {}; }; class SDES_chunk { public: SDES_chunk(uint32 in_ssrc = 0): ssrc(in_ssrc), max_sdes_items(NUM_PREALLOCATED_RTCP_CHUNK_ITEMS), num_sdes_items(0), chunk_size(0) { additional_items = NULL; }; ~SDES_chunk() { delete[] additional_items; }; uint32 ssrc; void set_max_items(uint num_items); SDES_item* get_item(uint item_index); const SDES_item* read_item(uint item_index) const; uint get_num_items() const { return num_sdes_items; }; bool add_item(const SDES_item& item); uint get_chunk_size() const { return chunk_size; }; private: uint max_sdes_items; uint num_sdes_items; uint chunk_size; SDES_item chunk_items[NUM_PREALLOCATED_RTCP_CHUNK_ITEMS]; SDES_item *additional_items; }; const int32 RTCP_SDES_MAX_NUM_CHUNKS = 32; class RTCP_SDES { public: RTCP_SDES(): chunk_count(0), max_chunks(NUM_PREALLOCATED_RTCP_CHUNKS) { additional_chunks = NULL; }; ~RTCP_SDES() { delete[] additional_chunks; }; void set_max_chunks(uint new_max_chunks); SDES_chunk* get_chunk(uint item_index); const SDES_chunk* read_chunk(uint item_index) const; uint get_num_chunks() const { return chunk_count; }; bool add_chunk(const SDES_chunk& chunk); private: uint chunk_count; uint max_chunks; SDES_chunk chunk_array[NUM_PREALLOCATED_RTCP_CHUNKS]; SDES_chunk* additional_chunks; }; struct RTCP_BYE { uint8 src_count; uint32 ssrc_array[RTCP_BYE_SSRC_ARRAY_SIZE]; OsclMemoryFragment reason_string; }; struct APP_Common { uint32 sendTime; uint32 recvRate; // bits/sec uint32 recvRateInterval; uint32 playbackBufDepth; uint32 highestCtrlMediaSeqNum; uint32 cumulativeBytes; }; struct APP_Extra_DRC { uint16 rebufCount; uint16 missingPackets; uint32 cumulativePacketsReceived; uint32 totalProcessedFrames; uint32 totalSkippedFrames; uint32 cumulativePacketsLost; }; struct APP_Extra_BufLow { uint16 depletionRateInteger; uint16 depletionRateFraction; }; struct APP_Extra_BufHigh { uint16 fillRateInteger; uint16 fillRateFraction; }; struct RTCP_PVSS_APP { uint8 subtype; APP_Common common; union { APP_Extra_DRC extraDRC; APP_Extra_BufLow extraBufLow; APP_Extra_BufHigh extraBufHigh; }; }; struct RTCP_PSS0_APP { uint32 sourcessrc; uint16 playoutdelayinms; uint16 nsn; uint16 nun; uint16 freebufferspace; }; struct RTCP_APP { uint8 subtype; uint32 ssrc; char type[4]; union { RTCP_PVSS_APP pvss_app_data; RTCP_PSS0_APP pss0_app_data; OsclMemoryFragment app_data; // this for APPs other than "PVSS" & "PSS0" }; }; /* ** Classes */ class RTCP_Base { public: RTCP_Base(const uint8 version); OSCL_IMPORT_REF virtual ~RTCP_Base(); protected: uint8 rtcpVersion; }; #endif