blob: a2abaa25f36641f2d06dd7f75e81a0db1b682fab [file] [log] [blame]
/* ------------------------------------------------------------------
* 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_encoder.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_ENCODER_H
#define RTCP_ENCODER_H
/*
** Includes
*/
#ifndef OSCL_TYPES_H_INCLUDED
#include "oscl_types.h"
#endif
#ifndef OSCL_BIN_STREAM_H_INCLUDED
#include "oscl_bin_stream.h"
#endif
#ifndef RTCP_H
#include "rtcp.h"
#endif
/*
** Constants
*/
const int32 RTCP_ENCODER_MAX_CNAME_SIZE = 255;
/*
** Classes
*/
/*
** This class is used to encode and
** decode RTCP packets. Please refer to the RTCP design document for
** details.
*/
class RTCP_Encoder : public RTCP_Base
{
public:
typedef enum
{
RTCP_SUCCESS,
FAIL,
OUTPUT_TRUNCATED,
INVALID_PAD_LENGTH
} Error_t;
OSCL_IMPORT_REF RTCP_Encoder(const uint8 * cname = NULL,
int32 cname_length = 0,
const uint32 ssrc = 0,
const uint8 version = DEFAULT_RTPRTCP_VERSION);
~RTCP_Encoder() {};
void SetSSRC(uint32 new_ssrc)
{
SSRC = new_ssrc;
};
void setCName(const uint8 * cname,
int32 cname_length);
/*
** Description:
** This is a convenience function to put together the
** typical compound RTCP containing an RR, an SDES, and
** optionally an APP packet. Set the APP packet to NULL
** to skip it.
**
** The output_buffer is an input/output parameter. It should
** be initialized to the memory location and size of the buffer
** where the data should be written. When the function returns
** it will contains the ptr to the buffer and the actual size
** written unless there was not enough room (i.e., return status
** is OUTPUT_TRUNCATED). In that case, the ptr will be NULL, and
** the size will be size required to write everything.
*/
OSCL_IMPORT_REF Error_t EncodeCompoundRR(const RTCP_RR& rr_packet,
OsclMemoryFragment& output_buffer,
const RTCP_APP* app_packet,
uint8 pad_length = 0);
/*
** Description:
** This is a convenience function to put together the
** typical compound RTCP containing an SR and an SDES,
**
** Behavior is similar to EncodeCompoundRR above.
*/
Error_t EncodeCompoundSR(const RTCP_SR& sr_packet,
OsclMemoryFragment& output_buffer,
uint8 pad_length = 0);
Error_t EncodeRR(const RTCP_RR& rr_packet,
OsclMemoryFragment& output_buffer,
uint8 pad_length = 0);
Error_t EncodeSR(const RTCP_SR& sr_packet,
OsclMemoryFragment& output_buffer,
uint8 pad_length = 0);
Error_t EncodeBYE(const RTCP_BYE& bye_packet,
OsclMemoryFragment& output_buffer,
uint8 pad_length = 0);
Error_t EncodeAPP(const RTCP_APP& app_packet,
OsclMemoryFragment& output_buffer,
uint8 pad_length = 0);
Error_t EncodeSDES(const RTCP_SDES& sdes_packet,
OsclMemoryFragment& output_buffer,
uint8 pad_length = 0);
int32 GetEncodedSize(const RTCP_RR& rr_packet);
int32 GetEncodedSize(const RTCP_SR& sr_packet);
int32 GetEncodedSize(const RTCP_SDES& sdes_packet);
int32 GetEncodedSize(const RTCP_APP& app_packet);
private:
uint8 cName[RTCP_ENCODER_MAX_CNAME_SIZE];
uint8 cName_length;
uint32 SSRC;
Error_t EncodeReportBlock(OsclBinOStreamBigEndian & outStream,/* Input
* stream
* reference
*/
const RTCP_ReportBlock* report
);
Error_t output_rtcp_header(uint8 packet_type,
uint8 count_field,
uint16 size,
OsclBinOStreamBigEndian& outStream,
bool pad_bit);
Error_t EncodeSDESItem(OsclBinOStreamBigEndian& outStream,
const SDES_item* item_ptr);
Error_t EncodeSDESChunk(OsclBinOStreamBigEndian& outStream,
const SDES_chunk* chunk_ptr);
};
#endif