Commit 0e848977 authored by Kostya Shishkov's avatar Kostya Shishkov

Move function for reading whole specified amount of data from RTSP

demuxer into more common place.

Originally committed as revision 19087 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 989b7181
...@@ -149,6 +149,20 @@ int url_read(URLContext *h, unsigned char *buf, int size) ...@@ -149,6 +149,20 @@ int url_read(URLContext *h, unsigned char *buf, int size)
return ret; return ret;
} }
int url_read_complete(URLContext *h, unsigned char *buf, int size)
{
int ret, len;
len = 0;
while (len < size) {
ret = url_read(h, buf+len, size-len);
if (ret < 1)
return ret;
len += ret;
}
return len;
}
int url_write(URLContext *h, unsigned char *buf, int size) int url_write(URLContext *h, unsigned char *buf, int size)
{ {
int ret; int ret;
......
...@@ -69,6 +69,7 @@ int url_open_protocol (URLContext **puc, struct URLProtocol *up, ...@@ -69,6 +69,7 @@ int url_open_protocol (URLContext **puc, struct URLProtocol *up,
const char *filename, int flags); const char *filename, int flags);
int url_open(URLContext **h, const char *filename, int flags); int url_open(URLContext **h, const char *filename, int flags);
int url_read(URLContext *h, unsigned char *buf, int size); int url_read(URLContext *h, unsigned char *buf, int size);
int url_read_complete(URLContext *h, unsigned char *buf, int size);
int url_write(URLContext *h, unsigned char *buf, int size); int url_write(URLContext *h, unsigned char *buf, int size);
int64_t url_seek(URLContext *h, int64_t pos, int whence); int64_t url_seek(URLContext *h, int64_t pos, int whence);
int url_close(URLContext *h); int url_close(URLContext *h);
......
...@@ -703,20 +703,6 @@ void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf) ...@@ -703,20 +703,6 @@ void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf)
} }
} }
static int url_readbuf(URLContext *h, unsigned char *buf, int size)
{
int ret, len;
len = 0;
while (len < size) {
ret = url_read(h, buf+len, size-len);
if (ret < 1)
return ret;
len += ret;
}
return len;
}
/* skip a RTP/TCP interleaved packet */ /* skip a RTP/TCP interleaved packet */
static void rtsp_skip_packet(AVFormatContext *s) static void rtsp_skip_packet(AVFormatContext *s)
{ {
...@@ -724,7 +710,7 @@ static void rtsp_skip_packet(AVFormatContext *s) ...@@ -724,7 +710,7 @@ static void rtsp_skip_packet(AVFormatContext *s)
int ret, len, len1; int ret, len, len1;
uint8_t buf[1024]; uint8_t buf[1024];
ret = url_readbuf(rt->rtsp_hd, buf, 3); ret = url_read_complete(rt->rtsp_hd, buf, 3);
if (ret != 3) if (ret != 3)
return; return;
len = AV_RB16(buf + 1); len = AV_RB16(buf + 1);
...@@ -736,7 +722,7 @@ static void rtsp_skip_packet(AVFormatContext *s) ...@@ -736,7 +722,7 @@ static void rtsp_skip_packet(AVFormatContext *s)
len1 = len; len1 = len;
if (len1 > sizeof(buf)) if (len1 > sizeof(buf))
len1 = sizeof(buf); len1 = sizeof(buf);
ret = url_readbuf(rt->rtsp_hd, buf, len1); ret = url_read_complete(rt->rtsp_hd, buf, len1);
if (ret != len1) if (ret != len1)
return; return;
len -= len1; len -= len1;
...@@ -782,7 +768,7 @@ rtsp_read_reply (AVFormatContext *s, RTSPMessageHeader *reply, ...@@ -782,7 +768,7 @@ rtsp_read_reply (AVFormatContext *s, RTSPMessageHeader *reply,
for(;;) { for(;;) {
q = buf; q = buf;
for(;;) { for(;;) {
ret = url_readbuf(rt->rtsp_hd, &ch, 1); ret = url_read_complete(rt->rtsp_hd, &ch, 1);
#ifdef DEBUG_RTP_TCP #ifdef DEBUG_RTP_TCP
dprintf(s, "ret=%d c=%02x [%c]\n", ret, ch, ch); dprintf(s, "ret=%d c=%02x [%c]\n", ret, ch, ch);
#endif #endif
...@@ -829,7 +815,7 @@ rtsp_read_reply (AVFormatContext *s, RTSPMessageHeader *reply, ...@@ -829,7 +815,7 @@ rtsp_read_reply (AVFormatContext *s, RTSPMessageHeader *reply,
if (content_length > 0) { if (content_length > 0) {
/* leave some room for a trailing '\0' (useful for simple parsing) */ /* leave some room for a trailing '\0' (useful for simple parsing) */
content = av_malloc(content_length + 1); content = av_malloc(content_length + 1);
(void)url_readbuf(rt->rtsp_hd, content, content_length); (void)url_read_complete(rt->rtsp_hd, content, content_length);
content[content_length] = '\0'; content[content_length] = '\0';
} }
if (content_ptr) if (content_ptr)
...@@ -1329,7 +1315,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, ...@@ -1329,7 +1315,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
break; break;
/* XXX: parse message */ /* XXX: parse message */
} }
ret = url_readbuf(rt->rtsp_hd, buf, 3); ret = url_read_complete(rt->rtsp_hd, buf, 3);
if (ret != 3) if (ret != 3)
return -1; return -1;
id = buf[0]; id = buf[0];
...@@ -1340,7 +1326,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, ...@@ -1340,7 +1326,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
if (len > buf_size || len < 12) if (len > buf_size || len < 12)
goto redo; goto redo;
/* get the data */ /* get the data */
ret = url_readbuf(rt->rtsp_hd, buf, len); ret = url_read_complete(rt->rtsp_hd, buf, len);
if (ret != len) if (ret != len)
return -1; return -1;
if (rt->transport == RTSP_TRANSPORT_RDT && if (rt->transport == RTSP_TRANSPORT_RDT &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment