comparison libmpdemux/realrtsp/rtsp_session.c @ 18792:6a015ba5bf45

move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
author ben
date Fri, 23 Jun 2006 19:30:15 +0000
parents 2518f4341587
children be9e036d38ad
comparison
equal deleted inserted replaced
18791:72e6908f0347 18792:6a015ba5bf45
50 50
51 /* 51 /*
52 #define LOG 52 #define LOG
53 */ 53 */
54 54
55 #define BUF_SIZE 4096
56 #define HEADER_SIZE 4096
57
58 struct rtsp_session_s { 55 struct rtsp_session_s {
59
60 rtsp_t *s; 56 rtsp_t *s;
61 57 struct real_rtsp_session_t* real_session;
62 /* receive buffer */
63 uint8_t *recv;
64 int recv_size;
65 int recv_read;
66
67 /* header buffer */
68 uint8_t header[HEADER_SIZE];
69 int header_len;
70 int header_read;
71
72 }; 58 };
73 59
74 //rtsp_session_t *rtsp_session_start(char *mrl) { 60 //rtsp_session_t *rtsp_session_start(char *mrl) {
75 rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host, int port, int *redir, uint32_t bandwidth) { 61 rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host, int port, int *redir, uint32_t bandwidth) {
76 62
77 rtsp_session_t *rtsp_session=malloc(sizeof(rtsp_session_t)); 63 rtsp_session_t *rtsp_session = NULL;
78 char *server; 64 char *server;
79 char *mrl_line = NULL; 65 char *mrl_line = NULL;
80 rmff_header_t *h; 66 rmff_header_t *h;
81 67
82 rtsp_session->recv = xbuffer_init(BUF_SIZE); 68 rtsp_session = malloc (sizeof (rtsp_session_t));
83 69 rtsp_session->s = NULL;
70 rtsp_session->real_session = NULL;
71
84 //connect: 72 //connect:
85 *redir = 0; 73 *redir = 0;
86 74
87 /* connect to server */ 75 /* connect to server */
88 rtsp_session->s=rtsp_connect(fd,*mrl,path,host,port,NULL); 76 rtsp_session->s=rtsp_connect(fd,*mrl,path,host,port,NULL);
89 if (!rtsp_session->s) 77 if (!rtsp_session->s)
90 { 78 {
91 printf("rtsp_session: failed to connect to server %s\n", path); 79 printf("rtsp_session: failed to connect to server %s\n", path);
92 rtsp_session->recv = xbuffer_free(rtsp_session->recv);
93 free(rtsp_session); 80 free(rtsp_session);
94 return NULL; 81 return NULL;
95 } 82 }
96 83
97 /* looking for server type */ 84 /* looking for server type */
126 // goto connect; /* *shudder* i made a design mistake somewhere */ 113 // goto connect; /* *shudder* i made a design mistake somewhere */
127 } else 114 } else
128 { 115 {
129 printf("rtsp_session: session can not be established.\n"); 116 printf("rtsp_session: session can not be established.\n");
130 rtsp_close(rtsp_session->s); 117 rtsp_close(rtsp_session->s);
131 rtsp_session->recv = xbuffer_free(rtsp_session->recv); 118 free (server);
132 free(rtsp_session); 119 free(rtsp_session);
133 return NULL; 120 return NULL;
134 } 121 }
135 } 122 }
136 123
137 rtsp_session->header_len=rmff_dump_header(h,rtsp_session->header,1024); 124 rtsp_session->real_session = init_real_rtsp_session ();
138 125 rtsp_session->real_session->header_len =
139 rtsp_session->recv = xbuffer_copyin(rtsp_session->recv, 0, rtsp_session->header, rtsp_session->header_len); 126 rmff_dump_header (h, (char *) rtsp_session->real_session->header, 1024);
140 rtsp_session->recv_size = rtsp_session->header_len; 127
141 rtsp_session->recv_read = 0; 128 rtsp_session->real_session->recv =
142 129 xbuffer_copyin (rtsp_session->real_session->recv, 0,
130 rtsp_session->real_session->header,
131 rtsp_session->real_session->header_len);
132
133 rtsp_session->real_session->recv_size =
134 rtsp_session->real_session->header_len;
135 rtsp_session->real_session->recv_read = 0;
143 } else 136 } else
144 { 137 {
145 printf("rtsp_session: Not a Real server. Server type is '%s'.\n",server); 138 printf("rtsp_session: Not a Real server. Server type is '%s'.\n",server);
146 rtsp_close(rtsp_session->s); 139 rtsp_close(rtsp_session->s);
147 free(server); 140 free(server);
148 rtsp_session->recv = xbuffer_free(rtsp_session->recv);
149 free(rtsp_session); 141 free(rtsp_session);
150 return NULL; 142 return NULL;
151 } 143 }
152 free(server); 144 free(server);
153 145
154 return rtsp_session; 146 return rtsp_session;
155 } 147 }
156 148
157 int rtsp_session_read (rtsp_session_t *this, char *data, int len) { 149 int rtsp_session_read (rtsp_session_t *this, char *data, int len) {
158 150
151 if (this->real_session) {
159 int to_copy=len; 152 int to_copy=len;
160 char *dest=data; 153 char *dest=data;
161 char *source=this->recv + this->recv_read; 154 char *source =
162 int fill=this->recv_size - this->recv_read; 155 (char *) (this->real_session->recv + this->real_session->recv_read);
156 int fill = this->real_session->recv_size - this->real_session->recv_read;
163 157
164 if (len < 0) return 0; 158 if (len < 0) return 0;
165 while (to_copy > fill) { 159 while (to_copy > fill) {
166 160
167 memcpy(dest, source, fill); 161 memcpy(dest, source, fill);
168 to_copy -= fill; 162 to_copy -= fill;
169 dest += fill; 163 dest += fill;
170 this->recv_read = 0; 164 this->real_session->recv_read = 0;
171 this->recv_size = real_get_rdt_chunk (this->s, (char **)&(this->recv)); 165 this->real_session->recv_size =
172 if (this->recv_size < 0) 166 real_get_rdt_chunk (this->s, (char **)&(this->real_session->recv));
167 if (this->real_session->recv_size < 0)
173 return -1; 168 return -1;
174 source = this->recv; 169 source = (char *) this->real_session->recv;
175 fill = this->recv_size; 170 fill = this->real_session->recv_size;
176 171
177 if (this->recv_size == 0) { 172 if (this->real_session->recv_size == 0) {
178 #ifdef LOG 173 #ifdef LOG
179 printf ("librtsp: %d of %d bytes provided\n", len-to_copy, len); 174 printf ("librtsp: %d of %d bytes provided\n", len-to_copy, len);
180 #endif 175 #endif
181 return len-to_copy; 176 return len-to_copy;
182 } 177 }
183 } 178 }
184 179
185 memcpy(dest, source, to_copy); 180 memcpy(dest, source, to_copy);
186 this->recv_read += to_copy; 181 this->real_session->recv_read += to_copy;
187 182
188 #ifdef LOG 183 #ifdef LOG
189 printf ("librtsp: %d bytes provided\n", len); 184 printf ("librtsp: %d bytes provided\n", len);
190 #endif 185 #endif
191 186
192 return len; 187 return len;
188 }
189
190 return 0;
193 } 191 }
194 192
195 int rtsp_session_peek_header(rtsp_session_t *this, char *buf, int maxsize) { 193 int rtsp_session_peek_header(rtsp_session_t *this, char *buf, int maxsize) {
196 194
197 int len; 195 int len;
198 196
199 len = (this->header_len < maxsize) ? this->header_len : maxsize; 197 if (this->real_session)
200 198 {
201 memcpy(buf, this->header, len); 199 len = (this->real_session->header_len < maxsize)
200 ? this->real_session->header_len : maxsize;
201
202 memcpy(buf, this->real_session->header, len);
202 return len; 203 return len;
204 }
205
206 return 0;
203 } 207 }
204 208
205 void rtsp_session_end(rtsp_session_t *session) { 209 void rtsp_session_end(rtsp_session_t *session) {
206 210
207 rtsp_close(session->s); 211 rtsp_close(session->s);
208 session->recv = xbuffer_free(session->recv); 212 if (session->real_session)
213 free_real_rtsp_session (session->real_session);
209 free(session); 214 free(session);
210 } 215 }