summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2009-03-03 17:04:51 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2009-03-03 17:04:51 +0000
commitf0a80394645ce436307d3d458878689411a44ba7 (patch)
tree78da33e8ec44b8767300dcf5fca4b3e6213fbdd4 /libavformat
parent2fea965070a96a04a46513cc524ac4cfcf622fd8 (diff)
Add url_get_file_handle(), which is used to get the file descriptor
associated with the I/O handle (e.g. the fd returned by open()). See "[RFC] rtsp.c EOF support" thread. There were previously some URI-specific implementations of the same idea, e.g. rtp_get_file_handles() and udp_get_file_handle(). All of these are deprecated by this patch and will be removed at the next major API bump. Originally committed as revision 17779 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/avio.c7
-rw-r--r--libavformat/avio.h12
-rw-r--r--libavformat/file.c7
-rw-r--r--libavformat/http.c8
-rw-r--r--libavformat/rtpdec.h2
-rw-r--r--libavformat/rtpproto.c13
-rw-r--r--libavformat/rtsp.c6
-rw-r--r--libavformat/tcp.c7
-rw-r--r--libavformat/udp.c4
9 files changed, 61 insertions, 5 deletions
diff --git a/libavformat/avio.c b/libavformat/avio.c
index 011bc8808b..b7d3c23ac8 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -206,6 +206,13 @@ int64_t url_filesize(URLContext *h)
return size;
}
+int url_get_file_handle(URLContext *h)
+{
+ if (!h->prot->url_get_file_handle)
+ return -1;
+ return h->prot->url_get_file_handle(h);
+}
+
int url_get_max_packet_size(URLContext *h)
{
return h->max_packet_size;
diff --git a/libavformat/avio.h b/libavformat/avio.h
index d154911559..be02b06f60 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -78,6 +78,15 @@ int url_exist(const char *filename);
int64_t url_filesize(URLContext *h);
/**
+ * Return the file descriptor associated with this URL. For RTP, this
+ * will return only the RTP file descriptor, not the RTCP file descriptor.
+ * To get both, use rtp_get_file_handles().
+ *
+ * @return the file descriptor associated with this URL, or <0 on error.
+ */
+int url_get_file_handle(URLContext *h);
+
+/**
* Return the maximum packet size associated to packetized file
* handle. If the file is not packetized (stream like HTTP or file on
* disk), then 0 is returned.
@@ -144,6 +153,7 @@ typedef struct URLProtocol {
int (*url_read_pause)(URLContext *h, int pause);
int64_t (*url_read_seek)(URLContext *h, int stream_index,
int64_t timestamp, int flags);
+ int (*url_get_file_handle)(URLContext *h);
} URLProtocol;
#if LIBAVFORMAT_VERSION_MAJOR < 53
@@ -389,6 +399,8 @@ void init_checksum(ByteIOContext *s,
/* udp.c */
int udp_set_remote_url(URLContext *h, const char *uri);
int udp_get_local_port(URLContext *h);
+#if (LIBAVFORMAT_VERSION_MAJOR <= 52)
int udp_get_file_handle(URLContext *h);
+#endif
#endif /* AVFORMAT_AVIO_H */
diff --git a/libavformat/file.c b/libavformat/file.c
index cdf0b08d5b..bec991ae44 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -82,6 +82,11 @@ static int file_close(URLContext *h)
return close(fd);
}
+static int file_get_handle(URLContext *h)
+{
+ return (int) h->priv_data;
+}
+
URLProtocol file_protocol = {
"file",
file_open,
@@ -89,6 +94,7 @@ URLProtocol file_protocol = {
file_write,
file_seek,
file_close,
+ .url_get_file_handle = file_get_handle,
};
/* pipe protocol */
@@ -120,4 +126,5 @@ URLProtocol pipe_protocol = {
pipe_open,
file_read,
file_write,
+ .url_get_file_handle = file_get_handle,
};
diff --git a/libavformat/http.c b/libavformat/http.c
index 039ef7bbc5..d904e7a1e8 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -345,6 +345,13 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence)
return off;
}
+static int
+http_get_file_handle(URLContext *h)
+{
+ HTTPContext *s = h->priv_data;
+ return url_get_file_handle(s->hd);
+}
+
URLProtocol http_protocol = {
"http",
http_open,
@@ -352,4 +359,5 @@ URLProtocol http_protocol = {
http_write,
http_seek,
http_close,
+ .url_get_file_handle = http_get_file_handle,
};
diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h
index c5350e746a..1a243f89c8 100644
--- a/libavformat/rtpdec.h
+++ b/libavformat/rtpdec.h
@@ -69,7 +69,9 @@ void rtp_parse_close(RTPDemuxContext *s);
int rtp_get_local_port(URLContext *h);
int rtp_set_remote_url(URLContext *h, const char *uri);
+#if (LIBAVFORMAT_VERSION_MAJOR <= 52)
void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd);
+#endif
/**
* some rtp servers assume client is dead if they don't hear from them...
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 610a7f7859..9d80ddf0a7 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -169,8 +169,8 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
/* just to ease handle access. XXX: need to suppress direct handle
access */
- s->rtp_fd = udp_get_file_handle(s->rtp_hd);
- s->rtcp_fd = udp_get_file_handle(s->rtcp_hd);
+ s->rtp_fd = url_get_file_handle(s->rtp_hd);
+ s->rtcp_fd = url_get_file_handle(s->rtcp_hd);
h->max_packet_size = url_get_max_packet_size(s->rtp_hd);
h->is_streamed = 1;
@@ -296,6 +296,7 @@ int rtp_get_local_port(URLContext *h)
return udp_get_local_port(s->rtp_hd);
}
+#if (LIBAVFORMAT_VERSION_MAJOR <= 52)
/**
* Return the rtp and rtcp file handles for select() usage to wait for
* several RTP streams at the same time.
@@ -309,6 +310,13 @@ void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd)
*prtp_fd = s->rtp_fd;
*prtcp_fd = s->rtcp_fd;
}
+#endif
+
+static int rtp_get_file_handle(URLContext *h)
+{
+ RTPContext *s = h->priv_data;
+ return s->rtp_fd;
+}
URLProtocol rtp_protocol = {
"rtp",
@@ -317,4 +325,5 @@ URLProtocol rtp_protocol = {
rtp_write,
NULL, /* seek */
rtp_close,
+ .url_get_file_handle = rtp_get_file_handle,
};
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 7c9242d01f..578ee2413f 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -1305,7 +1305,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
RTSPState *rt = s->priv_data;
RTSPStream *rtsp_st;
fd_set rfds;
- int fd1, fd2, fd_max, n, i, ret;
+ int fd1, fd_max, n, i, ret;
struct timeval tv;
for(;;) {
@@ -1318,7 +1318,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
if (rtsp_st->rtp_handle) {
/* currently, we cannot probe RTCP handle because of
* blocking restrictions */
- rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
+ fd1 = url_get_file_handle(rtsp_st->rtp_handle);
if (fd1 > fd_max)
fd_max = fd1;
FD_SET(fd1, &rfds);
@@ -1331,7 +1331,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
for(i = 0; i < rt->nb_rtsp_streams; i++) {
rtsp_st = rt->rtsp_streams[i];
if (rtsp_st->rtp_handle) {
- rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
+ fd1 = url_get_file_handle(rtsp_st->rtp_handle);
if (FD_ISSET(fd1, &rfds)) {
ret = url_read(rtsp_st->rtp_handle, buf, buf_size);
if (ret > 0) {
diff --git a/libavformat/tcp.c b/libavformat/tcp.c
index b81ab93cfc..b7983e7c98 100644
--- a/libavformat/tcp.c
+++ b/libavformat/tcp.c
@@ -181,6 +181,12 @@ static int tcp_close(URLContext *h)
return 0;
}
+static int tcp_get_file_handle(URLContext *h)
+{
+ TCPContext *s = h->priv_data;
+ return s->fd;
+}
+
URLProtocol tcp_protocol = {
"tcp",
tcp_open,
@@ -188,4 +194,5 @@ URLProtocol tcp_protocol = {
tcp_write,
NULL, /* seek */
tcp_close,
+ .url_get_file_handle = tcp_get_file_handle,
};
diff --git a/libavformat/udp.c b/libavformat/udp.c
index 70d0e2b38c..a89de0080a 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -326,6 +326,9 @@ int udp_get_local_port(URLContext *h)
* streams at the same time.
* @param h media file context
*/
+#if (LIBAVFORMAT_VERSION_MAJOR >= 53)
+static
+#endif
int udp_get_file_handle(URLContext *h)
{
UDPContext *s = h->priv_data;
@@ -528,4 +531,5 @@ URLProtocol udp_protocol = {
udp_write,
NULL, /* seek */
udp_close,
+ .url_get_file_handle = udp_get_file_handle,
};