Mercurial > mplayer.hg
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 } |