1 /*
2  * Copyright 2008-2014 Arsen Chaloyan
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * $Id: mrcp_session_descriptor.h 2136 2014-07-04 06:33:36Z achaloyan@gmail.com $
17  */
18 
19 #ifndef MRCP_SESSION_DESCRIPTOR_H
20 #define MRCP_SESSION_DESCRIPTOR_H
21 
22 /**
23  * @file mrcp_session_descriptor.h
24  * @brief MRCP Session Descriptor
25  */
26 
27 #include "mpf_rtp_descriptor.h"
28 #include "mrcp_sig_types.h"
29 
30 APT_BEGIN_EXTERN_C
31 
32 /** MRCP session status */
33 typedef enum {
34 	MRCP_SESSION_STATUS_OK,                   /**< OK */
35 	MRCP_SESSION_STATUS_NO_SUCH_RESOURCE,     /**< no such resource found */
36 	MRCP_SESSION_STATUS_UNACCEPTABLE_RESOURCE,/**< resource exists, but no implementation (plugin) found */
37 	MRCP_SESSION_STATUS_UNAVAILABLE_RESOURCE, /**< resource exists, but is temporary unavailable */
38 	MRCP_SESSION_STATUS_ERROR                 /**< internal error occurred */
39 } mrcp_session_status_e;
40 
41 /** MRCP session descriptor */
42 struct mrcp_session_descriptor_t {
43 	/** SDP origin */
44 	apt_str_t             origin;
45 	/** Session level IP address */
46 	apt_str_t             ip;
47 	/** Session level external (NAT) IP address */
48 	apt_str_t             ext_ip;
49 	/** Session level resource name (MRCPv1 only) */
50 	apt_str_t             resource_name;
51 	/** Resource state (MRCPv1 only) */
52 	apt_bool_t            resource_state;
53 	/** Session status */
54 	mrcp_session_status_e status;
55 	/** Response code (SIP for MRCPv2 and RTSP for MRCPv1) */
56 	int                   response_code;
57 
58 	/** MRCP control media array (mrcp_control_descriptor_t) */
59 	apr_array_header_t   *control_media_arr;
60 	/** Audio media array (mpf_rtp_media_descriptor_t) */
61 	apr_array_header_t   *audio_media_arr;
62 	/** Video media array (mpf_rtp_media_descriptor_t) */
63 	apr_array_header_t   *video_media_arr;
64 };
65 
66 /** Create session descriptor  */
67 MRCP_DECLARE(mrcp_session_descriptor_t*) mrcp_session_descriptor_create(apr_pool_t *pool);
68 
mrcp_session_media_count_get(const mrcp_session_descriptor_t * descriptor)69 static APR_INLINE apr_size_t mrcp_session_media_count_get(const mrcp_session_descriptor_t *descriptor)
70 {
71 	return descriptor->control_media_arr->nelts + descriptor->audio_media_arr->nelts + descriptor->video_media_arr->nelts;
72 }
73 
mrcp_session_control_media_add(mrcp_session_descriptor_t * descriptor,void * media)74 static APR_INLINE apr_size_t mrcp_session_control_media_add(mrcp_session_descriptor_t *descriptor, void *media)
75 {
76 	APR_ARRAY_PUSH(descriptor->control_media_arr,void*) = media;
77 	return mrcp_session_media_count_get(descriptor) - 1;
78 }
79 
mrcp_session_control_media_get(const mrcp_session_descriptor_t * descriptor,apr_size_t id)80 static APR_INLINE void* mrcp_session_control_media_get(const mrcp_session_descriptor_t *descriptor, apr_size_t id)
81 {
82 	if((int)id >= descriptor->control_media_arr->nelts) {
83 		return NULL;
84 	}
85 	return APR_ARRAY_IDX(descriptor->control_media_arr,id,void*);
86 }
87 
mrcp_session_control_media_set(mrcp_session_descriptor_t * descriptor,apr_size_t id,void * media)88 static APR_INLINE apt_bool_t mrcp_session_control_media_set(mrcp_session_descriptor_t *descriptor, apr_size_t id, void *media)
89 {
90 	if((int)id >= descriptor->control_media_arr->nelts) {
91 		return FALSE;
92 	}
93 	APR_ARRAY_IDX(descriptor->control_media_arr,id,void*) = media;
94 	return TRUE;
95 }
96 
97 
mrcp_session_audio_media_add(mrcp_session_descriptor_t * descriptor,mpf_rtp_media_descriptor_t * media)98 static APR_INLINE apr_size_t mrcp_session_audio_media_add(mrcp_session_descriptor_t *descriptor, mpf_rtp_media_descriptor_t *media)
99 {
100 	APR_ARRAY_PUSH(descriptor->audio_media_arr,mpf_rtp_media_descriptor_t*) = media;
101 	return mrcp_session_media_count_get(descriptor) - 1;
102 }
103 
mrcp_session_audio_media_get(const mrcp_session_descriptor_t * descriptor,apr_size_t id)104 static APR_INLINE mpf_rtp_media_descriptor_t* mrcp_session_audio_media_get(const mrcp_session_descriptor_t *descriptor, apr_size_t id)
105 {
106 	if((int)id >= descriptor->audio_media_arr->nelts) {
107 		return NULL;
108 	}
109 	return APR_ARRAY_IDX(descriptor->audio_media_arr,id,mpf_rtp_media_descriptor_t*);
110 }
111 
mrcp_session_audio_media_set(const mrcp_session_descriptor_t * descriptor,apr_size_t id,mpf_rtp_media_descriptor_t * media)112 static APR_INLINE apt_bool_t mrcp_session_audio_media_set(const mrcp_session_descriptor_t *descriptor, apr_size_t id, mpf_rtp_media_descriptor_t* media)
113 {
114 	if((int)id >= descriptor->audio_media_arr->nelts) {
115 		return FALSE;
116 	}
117 	APR_ARRAY_IDX(descriptor->audio_media_arr,id,mpf_rtp_media_descriptor_t*) = media;
118 	return TRUE;
119 }
120 
121 
mrcp_session_video_media_add(mrcp_session_descriptor_t * descriptor,mpf_rtp_media_descriptor_t * media)122 static APR_INLINE apr_size_t mrcp_session_video_media_add(mrcp_session_descriptor_t *descriptor, mpf_rtp_media_descriptor_t *media)
123 {
124 	APR_ARRAY_PUSH(descriptor->video_media_arr,mpf_rtp_media_descriptor_t*) = media;
125 	return mrcp_session_media_count_get(descriptor) - 1;
126 }
127 
mrcp_session_video_media_get(const mrcp_session_descriptor_t * descriptor,apr_size_t id)128 static APR_INLINE mpf_rtp_media_descriptor_t* mrcp_session_video_media_get(const mrcp_session_descriptor_t *descriptor, apr_size_t id)
129 {
130 	if((int)id >= descriptor->video_media_arr->nelts) {
131 		return NULL;
132 	}
133 	return APR_ARRAY_IDX(descriptor->video_media_arr,id,mpf_rtp_media_descriptor_t*);
134 }
135 
mrcp_session_video_media_set(mrcp_session_descriptor_t * descriptor,apr_size_t id,mpf_rtp_media_descriptor_t * media)136 static APR_INLINE apt_bool_t mrcp_session_video_media_set(mrcp_session_descriptor_t *descriptor, apr_size_t id, mpf_rtp_media_descriptor_t* media)
137 {
138 	if((int)id >= descriptor->video_media_arr->nelts) {
139 		return FALSE;
140 	}
141 	APR_ARRAY_IDX(descriptor->video_media_arr,id,mpf_rtp_media_descriptor_t*) = media;
142 	return TRUE;
143 }
144 
145 /** Get session status phrase  */
146 MRCP_DECLARE(const char*) mrcp_session_status_phrase_get(mrcp_session_status_e status);
147 
148 APT_END_EXTERN_C
149 
150 #endif /* MRCP_SESSION_DESCRIPTOR_H */
151