diff --git a/branches/2.0/doubango/bindings/java/android/tiscali.sh b/branches/2.0/doubango/bindings/java/android/tiscali.sh index 86d76cd2..6bd6153e 100644 --- a/branches/2.0/doubango/bindings/java/android/tiscali.sh +++ b/branches/2.0/doubango/bindings/java/android/tiscali.sh @@ -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 diff --git a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_denoise.c b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_denoise.c index 73020aa8..54ff8643 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_denoise.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_denoise.c @@ -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) { diff --git a/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj b/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj index e7b10bee..ec50912c 100644 --- a/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj +++ b/branches/2.0/doubango/tinyDAV/tinyDAV.vcproj @@ -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" diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h index 563529c8..40f2848f 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_header.h @@ -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; diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h index 7b175291..42b6a95f 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_packet.h @@ -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 diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h index fa559173..7c5626bb 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_report_sdes.h @@ -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 diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h new file mode 100644 index 00000000..03446407 --- /dev/null +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_chunck.h @@ -0,0 +1,53 @@ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* 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*/ diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h index 3c06e26e..97e2e67d 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp/rtcp/trtp_rtcp_sdes_item.h @@ -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 diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c index a231ef73..7aa95f81 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_header.c @@ -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(sizeversion = 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 diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c index 8c375393..273673b4 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_packet.c @@ -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){ diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c index afa946f1..070221e2 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_report_sdes.c @@ -18,4 +18,94 @@ * You should have received a copy of the GNU General Public License * along with DOUBANGO. * -*/ \ No newline at end of file +*/ +#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(sizeheader->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; diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c new file mode 100644 index 00000000..7af4443b --- /dev/null +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_chunck.c @@ -0,0 +1,140 @@ +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* 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(sizessrc_or_csrc = tnet_ntohl_2(pdata); + pdata+=4; + while(pdataitems, &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; diff --git a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c index 189bfc19..05ac3c09 100644 --- a/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c +++ b/branches/2.0/doubango/tinyRTP/src/rtcp/trtp_rtcp_sdes_item.c @@ -27,6 +27,8 @@ #include "tsk_memory.h" #include "tsk_debug.h" +#include /* 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; diff --git a/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj b/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj index 31d36225..159f7bda 100644 --- a/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj +++ b/branches/2.0/doubango/tinyRTP/tinyRTP.vcproj @@ -242,6 +242,10 @@ RelativePath=".\src\rtcp\trtp_rtcp_report_xr.c" > + + @@ -332,6 +336,10 @@ RelativePath=".\include\tinyrtp\rtcp\trtp_rtcp_report_xr.h" > + +