mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-18 07:48:14 +00:00
RFC sdp: Initial SDP creation
* Added additional fields to ast_sdp_options. * Re-organized ast_sdp. * Updated field names to correspond to RFC4566 terminology. * Created allocs/frees for SDP children. * Created getters/setters for SDP children where appropriate. * Added ast_sdp_create_from_state. * Refactored res_sdp_translator_pjmedia for changes. Change-Id: Iefbd877af7f5a4d3c74deead1bff8802661b0d48
This commit is contained in:
107
main/sdp_state.c
107
main/sdp_state.c
@@ -20,9 +20,10 @@
|
||||
#include "asterisk/sdp_state.h"
|
||||
#include "asterisk/sdp_options.h"
|
||||
#include "asterisk/sdp_translator.h"
|
||||
#include "asterisk/sdp_priv.h"
|
||||
#include "asterisk/vector.h"
|
||||
#include "asterisk/utils.h"
|
||||
|
||||
#include "../include/asterisk/sdp.h"
|
||||
#include "asterisk/stream.h"
|
||||
|
||||
enum ast_sdp_state_machine {
|
||||
@@ -77,13 +78,12 @@ struct ast_sdp_state {
|
||||
struct ast_sdp_options *options;
|
||||
/*! Translator that puts SDPs into the expected representation */
|
||||
struct ast_sdp_translator *translator;
|
||||
/*! RTP instance for each media stream */
|
||||
AST_VECTOR(, struct ast_rtp_instance *) rtp;
|
||||
/*! The current state machine state that we are in */
|
||||
enum ast_sdp_state_machine state;
|
||||
};
|
||||
|
||||
struct ast_sdp_state *ast_sdp_state_alloc(struct ast_stream_topology *streams, struct ast_sdp_options *options)
|
||||
struct ast_sdp_state *ast_sdp_state_alloc(struct ast_stream_topology *streams,
|
||||
struct ast_sdp_options *options)
|
||||
{
|
||||
struct ast_sdp_state *sdp_state;
|
||||
|
||||
@@ -94,7 +94,7 @@ struct ast_sdp_state *ast_sdp_state_alloc(struct ast_stream_topology *streams, s
|
||||
|
||||
sdp_state->options = options;
|
||||
|
||||
sdp_state->translator = ast_sdp_translator_new(ast_sdp_options_get_repr(sdp_state->options));
|
||||
sdp_state->translator = ast_sdp_translator_new(ast_sdp_options_get_impl(sdp_state->options));
|
||||
if (!sdp_state->translator) {
|
||||
ast_sdp_state_free(sdp_state);
|
||||
return NULL;
|
||||
@@ -126,18 +126,23 @@ void ast_sdp_state_free(struct ast_sdp_state *sdp_state)
|
||||
ast_sdp_translator_free(sdp_state->translator);
|
||||
}
|
||||
|
||||
struct ast_rtp_instance *ast_sdp_state_get_rtp_instance(struct ast_sdp_state *sdp_state, int stream_index)
|
||||
struct ast_rtp_instance *ast_sdp_state_get_rtp_instance(
|
||||
const struct ast_sdp_state *sdp_state, int stream_index)
|
||||
{
|
||||
struct ast_stream *stream;
|
||||
|
||||
ast_assert(sdp_state != NULL);
|
||||
|
||||
if (stream_index >= AST_VECTOR_SIZE(&sdp_state->rtp)) {
|
||||
stream = ast_stream_topology_get_stream(sdp_state->local_capabilities, stream_index);
|
||||
if (!stream) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return AST_VECTOR_GET(&sdp_state->rtp, stream_index);
|
||||
return (struct ast_rtp_instance *)ast_stream_get_data(stream, AST_STREAM_DATA_RTP_INSTANCE);
|
||||
}
|
||||
|
||||
struct ast_stream_topology *ast_sdp_state_get_joint_topology(struct ast_sdp_state *sdp_state)
|
||||
const struct ast_stream_topology *ast_sdp_state_get_joint_topology(
|
||||
const struct ast_sdp_state *sdp_state)
|
||||
{
|
||||
ast_assert(sdp_state != NULL);
|
||||
if (sdp_state->state == SDP_STATE_NEGOTIATED) {
|
||||
@@ -147,6 +152,23 @@ struct ast_stream_topology *ast_sdp_state_get_joint_topology(struct ast_sdp_stat
|
||||
}
|
||||
}
|
||||
|
||||
const struct ast_stream_topology *ast_sdp_state_get_local_topology(
|
||||
const struct ast_sdp_state *sdp_state)
|
||||
{
|
||||
ast_assert(sdp_state != NULL);
|
||||
|
||||
return sdp_state->local_capabilities;
|
||||
}
|
||||
|
||||
const struct ast_sdp_options *ast_sdp_state_get_options(
|
||||
const struct ast_sdp_state *sdp_state)
|
||||
{
|
||||
ast_assert(sdp_state != NULL);
|
||||
|
||||
return sdp_state->options;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int merge_sdps(struct ast_sdp_state *sdp_state)
|
||||
{
|
||||
ast_assert(sdp_state->local_sdp != NULL);
|
||||
@@ -169,37 +191,38 @@ static int merge_sdps(struct ast_sdp_state *sdp_state)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
const void *ast_sdp_state_get_local(struct ast_sdp_state *sdp_state)
|
||||
const struct ast_sdp *ast_sdp_state_get_local_sdp(struct ast_sdp_state *sdp_state)
|
||||
{
|
||||
struct ast_sdp *sdp;
|
||||
|
||||
ast_assert(sdp_state != NULL);
|
||||
|
||||
/*TODO Create RTP instances based on local topology and SDP options (if not already created) */
|
||||
/*TODO Create local SDP based on local topology, SDP options, and RTP ports (if not already created) */
|
||||
if (!sdp_state->local_sdp) {
|
||||
sdp_state->local_sdp = ast_sdp_create_from_state(sdp_state);
|
||||
}
|
||||
|
||||
switch (sdp_state->state) {
|
||||
case SDP_STATE_INITIAL:
|
||||
sdp_state->state = SDP_STATE_OFFERER;
|
||||
/* Fall through */
|
||||
case SDP_STATE_OFFERER:
|
||||
default:
|
||||
sdp = sdp_state->local_sdp;
|
||||
break;
|
||||
case SDP_STATE_ANSWERER:
|
||||
sdp_state->state = SDP_STATE_NEGOTIATED;
|
||||
merge_sdps(sdp_state);
|
||||
/* Fall through */
|
||||
case SDP_STATE_NEGOTIATED:
|
||||
sdp = sdp_state->joint_sdp;
|
||||
break;
|
||||
return sdp_state->local_sdp;
|
||||
}
|
||||
|
||||
const void *ast_sdp_state_get_local_sdp_impl(struct ast_sdp_state *sdp_state)
|
||||
{
|
||||
const struct ast_sdp *sdp = ast_sdp_state_get_local_sdp(sdp_state);
|
||||
|
||||
if (!sdp) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ast_sdp_translator_from_sdp(sdp_state->translator, sdp);
|
||||
}
|
||||
|
||||
int ast_sdp_state_set_remote(struct ast_sdp_state *sdp_state, void *remote)
|
||||
void ast_sdp_state_set_remote_sdp(struct ast_sdp_state *sdp_state, struct ast_sdp *sdp)
|
||||
{
|
||||
ast_assert(sdp_state != NULL);
|
||||
|
||||
sdp_state->remote_sdp = sdp;
|
||||
}
|
||||
|
||||
int ast_sdp_state_set_remote_sdp_from_impl(struct ast_sdp_state *sdp_state, void *remote)
|
||||
{
|
||||
struct ast_sdp *sdp;
|
||||
|
||||
@@ -210,29 +233,7 @@ int ast_sdp_state_set_remote(struct ast_sdp_state *sdp_state, void *remote)
|
||||
return -1;
|
||||
}
|
||||
|
||||
sdp_state->remote_sdp = remote;
|
||||
/* TODO Convert the remote SDP into a topology and store that in
|
||||
* sdp_state->remote_capabilities
|
||||
*/
|
||||
|
||||
switch (sdp_state->state) {
|
||||
case SDP_STATE_ANSWERER:
|
||||
default:
|
||||
break;
|
||||
case SDP_STATE_INITIAL:
|
||||
sdp_state->state = SDP_STATE_ANSWERER;
|
||||
break;
|
||||
case SDP_STATE_OFFERER:
|
||||
sdp_state->state = SDP_STATE_NEGOTIATED;
|
||||
/* Fall through */
|
||||
case SDP_STATE_NEGOTIATED:
|
||||
/* If state is already negotiated, and we receive a new
|
||||
* remote SDP, we need to re-create the joint SDP and joint
|
||||
* capabilities
|
||||
*/
|
||||
merge_sdps(sdp_state);
|
||||
break;
|
||||
}
|
||||
sdp_state->remote_sdp = sdp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user