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