]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Add url_get_file_handle(), which is used to get the file descriptor
authorrbultje <rbultje@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Tue, 3 Mar 2009 17:04:51 +0000 (17:04 +0000)
committerrbultje <rbultje@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Tue, 3 Mar 2009 17:04:51 +0000 (17:04 +0000)
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.

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@17779 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavformat/avio.c
libavformat/avio.h
libavformat/file.c
libavformat/http.c
libavformat/rtpdec.h
libavformat/rtpproto.c
libavformat/rtsp.c
libavformat/tcp.c
libavformat/udp.c

index 011bc8808b08deace1aa8c86ca28c90cfd756fe0..b7d3c23ac8866fec166425ef074dbbb6700fd570 100644 (file)
@@ -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;
index d15491155956f9803648300cee3ad8973cb0d164..be02b06f606b0f9247875669585c16c326c19d27 100644 (file)
@@ -77,6 +77,15 @@ int url_close(URLContext *h);
 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
@@ -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 */
index cdf0b08d5bab178683f8e33906ef6cf4c3f2bae4..bec991ae44dc544b9d7a31b324acf6faafeb451a 100644 (file)
@@ -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,
 };
index 039ef7bbc56e80ba194fd17375fdd7ebb554c746..d904e7a1e81c839ad3deea244abd4fed6fd1a6b6 100644 (file)
@@ -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,
 };
index c5350e746abe14c1ba064d4bcc31c82aa3c5183e..1a243f89c853147f44381e34f78390fd7aae8c84 100644 (file)
@@ -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...
index 610a7f78590f7af30453cfb097c8126cfff50d72..9d80ddf0a7be7722006b2df0f38ca97b5af8f875 100644 (file)
@@ -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,
 };
index 7c9242d01f01b478b14a3b323d59bcc52add8170..578ee2413f5cead131addfb414e35f7d7673623e 100644 (file)
@@ -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) {
index b81ab93cfc374a694dcd8f6c4432b59b6f947f21..b7983e7c9899c327a5d50a11c522172c2bdab445 100644 (file)
@@ -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,
 };
index 70d0e2b38c99a9034f401945e1ed341c966a6355..a89de0080ade88802eff9ce0253817f4067993e2 100644 (file)
@@ -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,
 };