Update v2.0

This commit is contained in:
bossiel 2011-03-30 09:55:42 +00:00
parent c91cf1bf1a
commit 35ac2972ae
14 changed files with 579 additions and 25 deletions

View File

@ -7,8 +7,8 @@ export _BT=static
for IS_NEON in no yes
do
for project in tinySAK tinyNET tinyHTTP tinyXCAP tinyIPSec tinySMS tinySIGCOMP tinySDP tinyRTP tinyMSRP tinyMEDIA tinyDAV tinySIP
#for project in tinyDAV
#for project in tinySAK tinyNET tinyHTTP tinyXCAP tinyIPSec tinySMS tinySIGCOMP tinySDP tinyRTP tinyMSRP tinyMEDIA tinyDAV tinySIP
for project in tinyDAV
do
echo -e building "$project with parameters: $@ NEON=$IS_NEON $WIPHONE_PARAMS\n"
make PROJECT=$project clean

View File

@ -34,7 +34,7 @@
#include "tsk_memory.h"
#include "tsk_debug.h"
#define ECHO_TAIL 10
#define ECHO_TAIL 20
int tdav_speex_denoise_open(tmedia_denoise_t* self, uint32_t frame_size, uint32_t sampling_rate, tsk_bool_t denoise, float agc_level, tsk_bool_t aec, tsk_bool_t vad)
{

View File

@ -122,7 +122,7 @@
Name="VCCLCompilerTool"
EnableIntrinsicFunctions="false"
AdditionalIncludeDirectories=""$(PSDK_DIR)include";"$(DXSDK_DIR)include";..\thirdparties\win32\include;include;..\tinyMSRP\include;..\tinyRTP\include;..\tinyMEDIA\include;..\tinySDP\include;..\tinyNET\src;..\tinyDSHOW\include;..\tinySAK\src;..\thirdparties\win32\include\BroadVoice16\bvcommon;..\thirdparties\win32\include\BroadVoice16\bv16"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYDAV_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFOS;HAVE_G729=0;HAVE_BV16=0;HAVE_OPENCORE_AMR=1;HAVE_ILBC=1;HAVE_LIBGSM=1;HAVE_TINYDSHOW=1;HAVE_DSOUND_H=1;HAVE_WAVE_API=0;HAVE_FFMPEG=1;HAVE_SPEEX_DSP=1;HAVE_SPEEX_JB=1;HAVE_LIB_SPEEX=1;FLIP_ENCODED_PICT=1;FLIP_DECODED_PICT=1;G192BITSTREAM=0;_WIN32_WINNT=0x0501"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYDAV_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFOS;HAVE_G729=0;HAVE_BV16=0;HAVE_OPENCORE_AMR=1;HAVE_ILBC=0;HAVE_LIBGSM=1;HAVE_TINYDSHOW=1;HAVE_DSOUND_H=1;HAVE_WAVE_API=0;HAVE_FFMPEG=1;HAVE_SPEEX_DSP=1;HAVE_SPEEX_JB=1;HAVE_LIB_SPEEX=1;FLIP_ENCODED_PICT=1;FLIP_DECODED_PICT=1;G192BITSTREAM=0;_WIN32_WINNT=0x0501"
RuntimeLibrary="2"
EnableFunctionLevelLinking="false"
UsePrecompiledHeader="0"

View File

@ -27,7 +27,8 @@
#include "tsk_buffer.h"
#include "tsk_list.h"
#define TRTP_RTCP_HEADER_SIZE 4
#define TRTP_RTCP_HEADER_SIZE 4
#define TRTP_RTCP_HEADER_VERSION_DEFAULT 2
TRTP_BEGIN_DECLS
@ -51,6 +52,7 @@ TINYRTP_API trtp_rtcp_header_t* trtp_rtcp_header_create(uint8_t version, uint8_t
TINYRTP_API tsk_buffer_t* trtp_rtcp_header_serialize(const trtp_rtcp_header_t *self);
TINYRTP_API int trtp_rtcp_header_serialize_2(const trtp_rtcp_header_t *self, uint8_t output[TRTP_RTCP_HEADER_SIZE]);
TINYRTP_API trtp_rtcp_header_t* trtp_rtcp_header_deserialize(const void *data, tsk_size_t size);
TINYRTP_API int trtp_rtcp_header_deserialize_2(trtp_rtcp_header_t** self, const void *data, tsk_size_t size);
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_header_def_t;

View File

@ -53,7 +53,10 @@ trtp_rtcp_packet_t;
typedef tsk_list_t trtp_rtcp_packets_L_t; /**< List of @ref trtp_rtcp_packet_t elements */
TINYRTP_API int trtp_rtcp_packet_init(trtp_rtcp_packet_t* self, uint8_t version, uint8_t padding, uint8_t rc, trtp_rtcp_packet_type_t type, uint16_t length);
int trtp_rtcp_packet_init_header(trtp_rtcp_packet_t* self, const void* data, tsk_size_t size);
TINYRTP_API trtp_rtcp_packet_t* trtp_rtcp_packet_deserialize(const void* data, tsk_size_t size);
TINYRTP_API int trtp_rtcp_packet_set_length(trtp_rtcp_packet_t* self, uint16_t length);
tsk_size_t trtp_rtcp_packet_get_size(trtp_rtcp_packet_t* self);
TINYRTP_API int trtp_rtcp_packet_deinit(trtp_rtcp_packet_t* self);
TRTP_END_DECLS

View File

@ -24,8 +24,25 @@
#include "tinyrtp_config.h"
#include "tinyrtp/rtcp/trtp_rtcp_packet.h"
#include "tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h"
TRTP_BEGIN_DECLS
/* RFC 3550 6.5 SDES: Source Description RTCP Packet */
typedef struct trtp_rtcp_report_sdes_s
{
TRTP_DECLARE_RTCP_PACKET;
trtp_rtcp_sdes_chuncks_L_t* chuncks;
}
trtp_rtcp_report_sdes_t;
#define TRTP_RTCP_REPORT_SDES(self) ((trtp_rtcp_report_sdes_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_report_sdes_def_t;
typedef tsk_list_t trtp_rtcp_report_sdess_L_t; /**< List of @ref trtp_rtcp_report_sdes_t elements */
trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create_null();
trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_deserialize(const void* data, tsk_size_t size);
int trtp_rtcp_report_sdes_parse_payload(trtp_rtcp_report_sdes_t* self, const void* payload, tsk_size_t size);
TRTP_END_DECLS

View File

@ -0,0 +1,53 @@
/*
* Copyright (C) 2010-2011 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
#ifndef TINYRTP_RTCP_SDES_CHUNCK_H
#define TINYRTP_RTCP_SDES_CHUNCK_H
#include "tinyrtp_config.h"
#include "tinyrtp/rtcp/trtp_rtcp_sdes_item.h"
#define TRTP_RTCP_SDES_CHUNCK_MIN_SIZE 4
#define TRTP_RTCP_SDES_CHUNCK_SSRC_OR_CSRC_SIZE 4
TRTP_BEGIN_DECLS
typedef struct trtp_rtcp_sdes_chunck_s
{
TSK_DECLARE_OBJECT;
uint32_t ssrc_or_csrc;
trtp_rtcp_sdes_items_L_t* items;
}
trtp_rtcp_sdes_chunck_t;
#define TRTP_RTCP_SDES_CHUNCK(self) ((trtp_rtcp_sdes_chunck_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_chunck_def_t;
typedef tsk_list_t trtp_rtcp_sdes_chuncks_L_t; /**< List of @ref trtp_rtcp_sdes_item_t elements */
trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create_null();
trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create(uint32_t ssrc_or_csrc);
trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_deserialize(const void* data, tsk_size_t size);
tsk_size_t trtp_rtcp_sdes_chunck_get_size(trtp_rtcp_sdes_chunck_t* self);
TRTP_END_DECLS
#endif /*TINYRTP_RTCP_SDES_CHUNCK_H*/

View File

@ -59,12 +59,14 @@ typedef struct trtp_rtcp_sdes_item_s
}
trtp_rtcp_sdes_item_t;
#define TRTP_RTCP_SDES_ITEM(self) ((trtp_rtcp_sdes_item_t*)(self))
#define TRTP_DECLARE_RTCP_SDES_ITEM trtp_rtcp_sdes_item_t __sdes_item__
typedef tsk_list_t trtp_rtcp_sdes_items_L_t; /**< List of @ref trtp_rtcp_sdes_item_t elements */
int trtp_rtcp_sdes_item_init(trtp_rtcp_sdes_item_t* self, uint8_t version, uint8_t padding, trtp_rtcp_sdes_item_type_t type, uint16_t length);
trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_create(uint8_t version, uint8_t padding, trtp_rtcp_sdes_item_type_t type, uint16_t length);
trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_deserialize(const void* data, tsk_size_t size);
tsk_buffer_t* trtp_rtcp_sdes_item_serialize(trtp_rtcp_sdes_item_t* self);
tsk_size_t trtp_rtcp_sdes_item_get_size(trtp_rtcp_sdes_item_t* self);
// RFC 3550 6.5.1 CNAME: Canonical End-Point Identifier SDES Item
typedef struct trtp_rtcp_sdes_item_cname_s
@ -73,10 +75,11 @@ typedef struct trtp_rtcp_sdes_item_cname_s
char* cname;
}
trtp_rtcp_sdes_item_cname_t;
#define TRTP_RTCP_SDES_ITEM_CNAME(self) ((trtp_rtcp_sdes_item_cname_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_cname_def_t;
trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create_null();
trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create(const char* cname);
tsk_size_t trtp_rtcp_sdes_item_cname_get_size(trtp_rtcp_sdes_item_cname_t* self);
// RFC 3550 6.5.2 NAME: User Name SDES Item
typedef struct trtp_rtcp_sdes_item_name_s
@ -85,9 +88,11 @@ typedef struct trtp_rtcp_sdes_item_name_s
char* name;
}
trtp_rtcp_sdes_item_name_t;
#define TRTP_RTCP_SDES_ITEM_NAME(self) ((trtp_rtcp_sdes_item_name_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_name_def_t;
trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create_null();
trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create(const char* name);
tsk_size_t trtp_rtcp_sdes_item_name_get_size(trtp_rtcp_sdes_item_name_t* self);
// RFC 3550 6.5.3 EMAIL: Electronic Mail Address SDES Item
typedef struct trtp_rtcp_sdes_item_email_s
@ -96,9 +101,11 @@ typedef struct trtp_rtcp_sdes_item_email_s
char* email;
}
trtp_rtcp_sdes_item_email_t;
#define TRTP_RTCP_SDES_ITEM_EMAIL(self) ((trtp_rtcp_sdes_item_email_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_email_def_t;
trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create_null();
trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create(const char* email);
tsk_size_t trtp_rtcp_sdes_item_email_get_size(trtp_rtcp_sdes_item_email_t* self);
// RFC 3550 6.5.4 PHONE: Phone Number SDES Item
typedef struct trtp_rtcp_sdes_item_phone_s
@ -107,9 +114,11 @@ typedef struct trtp_rtcp_sdes_item_phone_s
char* phone;
}
trtp_rtcp_sdes_item_phone_t;
#define TRTP_RTCP_SDES_ITEM_PHONE(self) ((trtp_rtcp_sdes_item_phone_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_phone_def_t;
trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create_null();
trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create(const char* phone);
tsk_size_t trtp_rtcp_sdes_item_phone_get_size(trtp_rtcp_sdes_item_phone_t* self);
// RFC 3550 6.5.5 LOC: Geographic User Location SDES Item
typedef struct trtp_rtcp_sdes_item_loc_s
@ -118,9 +127,11 @@ typedef struct trtp_rtcp_sdes_item_loc_s
char* loc;
}
trtp_rtcp_sdes_item_loc_t;
#define TRTP_RTCP_SDES_ITEM_LOC(self) ((trtp_rtcp_sdes_item_loc_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_loc_def_t;
trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create_null();
trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create(const char* loc);
tsk_size_t trtp_rtcp_sdes_item_loc_get_size(trtp_rtcp_sdes_item_loc_t* self);
// RFC 3550 6.5.6 TOOL: Application or Tool Name SDES Item
typedef struct trtp_rtcp_sdes_item_tool_s
@ -129,8 +140,11 @@ typedef struct trtp_rtcp_sdes_item_tool_s
char* tool;
}
trtp_rtcp_sdes_item_tool_t;
#define TRTP_RTCP_SDES_ITEM_TOOL(self) ((trtp_rtcp_sdes_item_tool_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_tool_def_t;
trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create_null();
trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create(const char* tool);
tsk_size_t trtp_rtcp_sdes_item_tool_get_size(trtp_rtcp_sdes_item_tool_t* self);
// RFC 3550 6.5.7 NOTE: Notice/Status SDES Item
typedef struct trtp_rtcp_sdes_item_note_s
@ -139,9 +153,12 @@ typedef struct trtp_rtcp_sdes_item_note_s
char* note;
}
trtp_rtcp_sdes_item_note_t;
#define TRTP_RTCP_SDES_ITEM_NOTE(self) ((trtp_rtcp_sdes_item_note_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_note_def_t;
trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create_null();
trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create(const char* note);
tsk_size_t trtp_rtcp_sdes_item_note_get_size(trtp_rtcp_sdes_item_note_t* self);
// RFC 3550 6.5.8 PRIV: Private Extensions SDES Item
typedef struct trtp_rtcp_sdes_item_priv_s
@ -150,9 +167,11 @@ typedef struct trtp_rtcp_sdes_item_priv_s
tsk_buffer_t* priv;
}
trtp_rtcp_sdes_item_priv_t;
#define TRTP_RTCP_SDES_ITEM_PRIV(self) ((trtp_rtcp_sdes_item_priv_t*)(self))
TINYRTP_GEXTERN const tsk_object_def_t *trtp_rtcp_sdes_item_priv_def_t;
trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create_null();
trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create(const void* data, tsk_size_t size);
tsk_size_t trtp_rtcp_sdes_item_priv_get_size(trtp_rtcp_sdes_item_priv_t* self);
TRTP_END_DECLS

View File

@ -101,27 +101,36 @@ int trtp_rtcp_header_serialize_2(const trtp_rtcp_header_t *self, uint8_t output[
trtp_rtcp_header_t* trtp_rtcp_header_deserialize(const void *data, tsk_size_t size)
{
trtp_rtcp_header_t* header = tsk_null;
const uint8_t* pdata = (uint8_t*)data;
if(!data || size != TRTP_RTCP_HEADER_SIZE){
TSK_DEBUG_ERROR("Invalid parameter");
return tsk_null;
if(trtp_rtcp_header_deserialize_2(&header, data, size)){
TSK_DEBUG_ERROR("Failed to deserialize the rtcp header");
TSK_OBJECT_SAFE_FREE(header);
}
if((header = trtp_rtcp_header_create_null())){
header->version = pdata[0]>>6;
header->padding = (pdata[0]>>5)&0x01;
header->rc = pdata[0]&0x1f;
header->type = (enum trtp_rtcp_packet_type_e)pdata[1];
header->length = tnet_ntohs_2(&pdata[2]);
}
else{
TSK_DEBUG_ERROR("Failed to create new object");
return tsk_null;
}
return header;
}
int trtp_rtcp_header_deserialize_2(trtp_rtcp_header_t** self, const void *data, tsk_size_t size)
{
const uint8_t* pdata = (uint8_t*)data;
if(!self || !data || !size){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
if(size<TRTP_RTCP_HEADER_SIZE){
TSK_DEBUG_ERROR("%u is too short", size);
return -2;
}
if(!*self && !(*self = trtp_rtcp_header_create_null())){
TSK_DEBUG_ERROR("Failed to create new rtcp header");
return -3;
}
(*self)->version = pdata[0]>>6;
(*self)->padding = (pdata[0]>>5)&0x01;
(*self)->rc = pdata[0]&0x1f;
(*self)->type = (enum trtp_rtcp_packet_type_e)pdata[1];
(*self)->length = tnet_ntohs_2(&pdata[2]);
return 0;
}
//=================================================================================================
// RTCP header object definition

View File

@ -22,6 +22,7 @@
#include "tinyrtp/rtcp/trtp_rtcp_packet.h"
#include "tinyrtp/rtcp/trtp_rtcp_header.h"
#include "tinyrtp/rtcp/trtp_rtcp_report_sdes.h"
#include "tsk_debug.h"
@ -44,6 +45,85 @@ int trtp_rtcp_packet_init(trtp_rtcp_packet_t* self, uint8_t version, uint8_t pad
return 0;
}
int trtp_rtcp_packet_init_header(trtp_rtcp_packet_t* self, const void* data, tsk_size_t size)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return trtp_rtcp_header_deserialize_2(&self->header, data, size);
}
// @NotImplemented
trtp_rtcp_packet_t* trtp_rtcp_packet_deserialize(const void* data, tsk_size_t size)
{
trtp_rtcp_packet_t* packet = tsk_null;
trtp_rtcp_header_t* header = tsk_null;
const uint8_t* pdata = (const uint8_t*)data;
if(data || !size){
TSK_DEBUG_ERROR("Invalid parameter");
return tsk_null;
}
if(trtp_rtcp_header_deserialize_2(&header, data, size)){
TSK_DEBUG_ERROR("failed to derialize rtcp header");
goto bail;
}
TSK_DEBUG_ERROR("Not Implemented");
pdata += TRTP_RTCP_HEADER_SIZE;
size -= TRTP_RTCP_HEADER_SIZE;
switch(header->type){
case trtp_rtcp_packet_type_sr:
break;
case trtp_rtcp_packet_type_rr:
break;
case trtp_rtcp_packet_type_sdes:
if((packet = (trtp_rtcp_packet_t*)trtp_rtcp_report_sdes_create_null())){
packet->header = tsk_object_ref(header);
if(!(trtp_rtcp_report_sdes_parse_payload(TRTP_RTCP_REPORT_SDES(packet),(const void*)pdata,size))){
TSK_DEBUG_ERROR("Failed to parse data");
goto bail;
}
}
break;
case trtp_rtcp_packet_type_bye:
break;
case trtp_rtcp_packet_type_app:
break;
default:
TSK_DEBUG_ERROR("%d is not a valid packet type", header->type);
goto bail;
}
bail:
TSK_OBJECT_SAFE_FREE(header);
return packet;
}
// @NotImplemented
tsk_size_t trtp_rtcp_packet_get_size(trtp_rtcp_packet_t* self)
{
if(!self || !self->header){
TSK_DEBUG_ERROR("Invalid parameter");
return 0;
}
TSK_DEBUG_ERROR("Not implemented");
switch(self->header->type){
case trtp_rtcp_packet_type_sr:
return 0;
case trtp_rtcp_packet_type_rr:
return 0;
case trtp_rtcp_packet_type_sdes:
return 0;
case trtp_rtcp_packet_type_bye:
return 0;
case trtp_rtcp_packet_type_app:
return 0;
default:
TSK_DEBUG_ERROR("%d is not a valid packet type", self->header->type);
return 0;
}
}
int trtp_rtcp_packet_set_length(trtp_rtcp_packet_t* self, uint16_t length)
{
if(self && self->header){

View File

@ -18,4 +18,94 @@
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
*/
#include "tinyrtp/rtcp/trtp_rtcp_report_sdes.h"
#include "tinyrtp/rtcp/trtp_rtcp_header.h"
#include "tsk_debug.h"
/*
6.5 SDES: Source Description RTCP Packet
0 1 2
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| SC | PT=SDES=202 | length |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk | SSRC/CSRC_1 |
1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk | SSRC/CSRC_2 |
2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
*/
trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_create_null()
{
return tsk_object_new(trtp_rtcp_report_sdes_def_t);
}
// @NotImplemented
trtp_rtcp_report_sdes_t* trtp_rtcp_report_sdes_deserialize(const void* data, tsk_size_t size)
{
trtp_rtcp_report_sdes_t* packet = tsk_null;
const uint8_t* pdata = (const uint8_t*)data;
if(!data || !size){
TSK_DEBUG_ERROR("Invalid parameter");
return tsk_null;
}
if(size<TRTP_RTCP_HEADER_SIZE){
TSK_DEBUG_ERROR("%u is too short", size);
return tsk_null;
}
TSK_DEBUG_ERROR("Not implemented");
return packet;
}
int trtp_rtcp_report_sdes_parse_payload(trtp_rtcp_report_sdes_t* self, const void* payload, tsk_size_t size)
{
if(!self || !payload || !size){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return 0;
}
//
// Object definition
//
static tsk_object_t* trtp_rtcp_report_sdes_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_report_sdes_t *packet = self;
if(packet){
// init self
TRTP_RTCP_PACKET(packet)->header->type = trtp_rtcp_packet_type_sdes;
TRTP_RTCP_PACKET(packet)->header->version = TRTP_RTCP_HEADER_VERSION_DEFAULT;
packet->chuncks = tsk_list_create();
// init base
}
return self;
}
static tsk_object_t* trtp_rtcp_report_sdes_dtor(tsk_object_t * self)
{
trtp_rtcp_report_sdes_t *packet = self;
if(packet){
// deinit base
trtp_rtcp_packet_deinit(TRTP_RTCP_PACKET(packet));
// deinit self
TSK_OBJECT_SAFE_FREE(packet->chuncks);
}
return self;
}
static const tsk_object_def_t trtp_rtcp_report_sdes_def_s =
{
sizeof(trtp_rtcp_report_sdes_t),
trtp_rtcp_report_sdes_ctor,
trtp_rtcp_report_sdes_dtor,
tsk_null,
};
const tsk_object_def_t *trtp_rtcp_report_sdes_def_t = &trtp_rtcp_report_sdes_def_s;

View File

@ -0,0 +1,140 @@
/*
* Copyright (C) 2010-2011 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
*/
#include "tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h"
#include "tnet_endianness.h"
#include "tsk_debug.h"
/*
Each chunk consists of an SSRC/CSRC identifier followed by a list of
zero or more items, which carry information about the SSRC/CSRC.
Each chunk starts on a 32-bit boundary. Each item consists of an 8-
bit type field, an 8-bit octet count describing the length of the
text (thus, not including this two-octet header), and the text
itself. Note that the text can be no longer than 255 octets, but
this is consistent with the need to limit RTCP bandwidth consumption.
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| SSRC/CSRC_1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
*/
trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create_null()
{
return tsk_object_new(trtp_rtcp_sdes_chunck_def_t);
}
trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_create(uint32_t ssrc_or_csrc)
{
trtp_rtcp_sdes_chunck_t* chunck;
if((chunck = trtp_rtcp_sdes_chunck_create_null())){
chunck->ssrc_or_csrc = ssrc_or_csrc;
}
return chunck;
}
trtp_rtcp_sdes_chunck_t* trtp_rtcp_sdes_chunck_deserialize(const void* data, tsk_size_t size)
{
trtp_rtcp_sdes_chunck_t* chunck = tsk_null;
const uint8_t* pdata = (uint8_t*)data;
const uint8_t* pend;
if(!data || !size){
TSK_DEBUG_ERROR("Invalid parameter");
return tsk_null;
}
if(size<TRTP_RTCP_SDES_CHUNCK_MIN_SIZE){
TSK_DEBUG_ERROR("%u is too short to contain SDES_CHUNCK", size);
return tsk_null;
}
pend = (pdata+size);
if((chunck = trtp_rtcp_sdes_chunck_create_null())){
trtp_rtcp_sdes_item_t* item;
// SSRC/CSRC
chunck->ssrc_or_csrc = tnet_ntohl_2(pdata);
pdata+=4;
while(pdata<pend){
if((item = trtp_rtcp_sdes_item_deserialize(pdata, (pend-pdata)))){
tsk_list_push_back_data(chunck->items, &item);
pdata+=trtp_rtcp_sdes_item_get_size(item);
}
else{
TSK_DEBUG_ERROR("Failed to deserialize sdes item");
break;
}
}
}
else{
TSK_DEBUG_ERROR("Failed to create new sdes_chunck object");
return tsk_null;
}
return chunck;
}
tsk_size_t trtp_rtcp_sdes_chunck_get_size(trtp_rtcp_sdes_chunck_t* self)
{
tsk_size_t size = TRTP_RTCP_SDES_CHUNCK_SSRC_OR_CSRC_SIZE;
const tsk_list_item_t* item;
if(self){
TSK_DEBUG_ERROR("Invalid parameter");
return 0;
}
tsk_list_foreach(item, self->items){
size+=trtp_rtcp_sdes_item_get_size(TRTP_RTCP_SDES_ITEM(item->data));
}
if(size%4){//Each chunk starts on a 32-bit boundary
size += (4-size%4);
}
return size;
}
//
// Object definition
//
static tsk_object_t* trtp_rtcp_sdes_chunck_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_chunck_t *chunck = self;
if(chunck){
chunck->items = tsk_list_create();
}
return self;
}
static tsk_object_t* trtp_rtcp_sdes_chunck_dtor(tsk_object_t * self)
{
trtp_rtcp_sdes_chunck_t *chunck = self;
if(chunck){
TSK_OBJECT_SAFE_FREE(chunck->items);
}
return self;
}
static const tsk_object_def_t trtp_rtcp_sdes_chunck_def_s =
{
sizeof(trtp_rtcp_sdes_chunck_t),
trtp_rtcp_sdes_chunck_ctor,
trtp_rtcp_sdes_chunck_dtor,
tsk_null,
};
const tsk_object_def_t *trtp_rtcp_sdes_chunck_def_t = &trtp_rtcp_sdes_chunck_def_s;

View File

@ -27,6 +27,8 @@
#include "tsk_memory.h"
#include "tsk_debug.h"
#include <string.h> /* strlen() */
static trtp_rtcp_sdes_item_t* _trtp_rtcp_sdes_item_create_null(trtp_rtcp_sdes_item_type_t type)
{
switch(type){
@ -107,9 +109,39 @@ trtp_rtcp_sdes_item_t* trtp_rtcp_sdes_item_deserialize(const void* data, tsk_siz
TSK_DEBUG_ERROR("%hu is invalid as header length", header.length);
return tsk_null;
}
pdata+=TRTP_RTCP_SDES_HEADER_SIZE;
// create item
if((item = trtp_rtcp_sdes_item_create(header.version, header.padding, header.type, header.length))){
// FIXME: To be completed...
switch(item->header.type){
case trtp_rtcp_sdes_item_type_end:
default:
TSK_DEBUG_ERROR("%d is not a valid SDES type", item->header.type);
break;
case trtp_rtcp_sdes_item_type_cname:
TRTP_RTCP_SDES_ITEM_CNAME(item)->cname = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_name:
TRTP_RTCP_SDES_ITEM_NAME(item)->name = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_email:
TRTP_RTCP_SDES_ITEM_EMAIL(item)->email = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_phone:
TRTP_RTCP_SDES_ITEM_PHONE(item)->phone = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_loc:
TRTP_RTCP_SDES_ITEM_LOC(item)->loc = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_tool:
TRTP_RTCP_SDES_ITEM_TOOL(item)->tool = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_note:
TRTP_RTCP_SDES_ITEM_NOTE(item)->note = tsk_strndup((const char*)pdata, item->header.length);
break;
case trtp_rtcp_sdes_item_type_priv:
TRTP_RTCP_SDES_ITEM_PRIV(item)->priv = tsk_buffer_create(pdata, item->header.length);
break;
}
}
return item;
@ -125,6 +157,35 @@ tsk_buffer_t* trtp_rtcp_sdes_item_serialize(trtp_rtcp_sdes_item_t* self)
return buffer;
}
tsk_size_t trtp_rtcp_sdes_item_get_size(trtp_rtcp_sdes_item_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return 0;
}
switch(self->header.type){
case trtp_rtcp_sdes_item_type_end:
default:
TSK_DEBUG_ERROR("%d is not a valid SDES type", self->header.type);
return 0;
case trtp_rtcp_sdes_item_type_cname:
return trtp_rtcp_sdes_item_cname_get_size(TRTP_RTCP_SDES_ITEM_CNAME(self));
case trtp_rtcp_sdes_item_type_name:
return trtp_rtcp_sdes_item_name_get_size(TRTP_RTCP_SDES_ITEM_NAME(self));
case trtp_rtcp_sdes_item_type_email:
return trtp_rtcp_sdes_item_email_get_size(TRTP_RTCP_SDES_ITEM_EMAIL(self));
case trtp_rtcp_sdes_item_type_phone:
return trtp_rtcp_sdes_item_phone_get_size(TRTP_RTCP_SDES_ITEM_PHONE(self));
case trtp_rtcp_sdes_item_type_loc:
return trtp_rtcp_sdes_item_loc_get_size(TRTP_RTCP_SDES_ITEM_LOC(self));
case trtp_rtcp_sdes_item_type_tool:
return trtp_rtcp_sdes_item_tool_get_size(TRTP_RTCP_SDES_ITEM_TOOL(self));
case trtp_rtcp_sdes_item_type_note:
return trtp_rtcp_sdes_item_note_get_size(TRTP_RTCP_SDES_ITEM_NOTE(self));
case trtp_rtcp_sdes_item_type_priv:
return trtp_rtcp_sdes_item_priv_get_size(TRTP_RTCP_SDES_ITEM_PRIV(self));
}
}
/* RFC 3550 6.5.1 CNAME: Canonical End-Point Identifier SDES Item
@ -148,6 +209,15 @@ trtp_rtcp_sdes_item_cname_t* trtp_rtcp_sdes_item_cname_create(const char* cname)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_cname_get_size(trtp_rtcp_sdes_item_cname_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->cname);
}
static tsk_object_t* trtp_rtcp_sdes_item_cname_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_cname_t *item = self;
@ -195,6 +265,15 @@ trtp_rtcp_sdes_item_name_t* trtp_rtcp_sdes_item_name_create(const char* name)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_name_get_size(trtp_rtcp_sdes_item_name_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->name);
}
static tsk_object_t* trtp_rtcp_sdes_item_name_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_name_t *item = self;
@ -243,6 +322,15 @@ trtp_rtcp_sdes_item_email_t* trtp_rtcp_sdes_item_email_create(const char* email)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_email_get_size(trtp_rtcp_sdes_item_email_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->email);
}
static tsk_object_t* trtp_rtcp_sdes_item_email_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_email_t *item = self;
@ -291,6 +379,15 @@ trtp_rtcp_sdes_item_phone_t* trtp_rtcp_sdes_item_phone_create(const char* phone)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_phone_get_size(trtp_rtcp_sdes_item_phone_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->phone);
}
static tsk_object_t* trtp_rtcp_sdes_item_phone_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_phone_t *item = self;
@ -338,6 +435,15 @@ trtp_rtcp_sdes_item_loc_t* trtp_rtcp_sdes_item_loc_create(const char* loc)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_loc_get_size(trtp_rtcp_sdes_item_loc_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->loc);
}
static tsk_object_t* trtp_rtcp_sdes_item_loc_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_loc_t *item = self;
@ -385,6 +491,15 @@ trtp_rtcp_sdes_item_tool_t* trtp_rtcp_sdes_item_tool_create(const char * tool)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_tool_get_size(trtp_rtcp_sdes_item_tool_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->tool);
}
static tsk_object_t* trtp_rtcp_sdes_item_tool_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_tool_t *item = self;
@ -432,6 +547,15 @@ trtp_rtcp_sdes_item_note_t* trtp_rtcp_sdes_item_note_create(const char* note)
return item;
}
tsk_size_t trtp_rtcp_sdes_item_note_get_size(trtp_rtcp_sdes_item_note_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return TRTP_RTCP_SDES_HEADER_SIZE + tsk_strlen(self->note);
}
static tsk_object_t* trtp_rtcp_sdes_item_note_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_note_t *item = self;
@ -481,6 +605,15 @@ trtp_rtcp_sdes_item_priv_t* trtp_rtcp_sdes_item_priv_create(const void* data, ts
return item;
}
tsk_size_t trtp_rtcp_sdes_item_priv_get_size(trtp_rtcp_sdes_item_priv_t* self)
{
if(!self){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
return self->priv ? TRTP_RTCP_SDES_HEADER_SIZE + self->priv->size : TRTP_RTCP_SDES_HEADER_SIZE;
}
static tsk_object_t* trtp_rtcp_sdes_item_priv_ctor(tsk_object_t * self, va_list * app)
{
trtp_rtcp_sdes_item_priv_t *item = self;

View File

@ -242,6 +242,10 @@
RelativePath=".\src\rtcp\trtp_rtcp_report_xr.c"
>
</File>
<File
RelativePath=".\src\rtcp\trtp_rtcp_sdes_chunck.c"
>
</File>
<File
RelativePath=".\src\rtcp\trtp_rtcp_sdes_item.c"
>
@ -332,6 +336,10 @@
RelativePath=".\include\tinyrtp\rtcp\trtp_rtcp_report_xr.h"
>
</File>
<File
RelativePath=".\include\tinyrtp\rtcp\trtp_rtcp_sdes_chunck.h"
>
</File>
<File
RelativePath=".\include\tinyrtp\rtcp\trtp_rtcp_sdes_item.h"
>