Mercurial > libavformat.hg
changeset 4640:b34d9614b887 libavformat
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.
author | rbultje |
---|---|
date | Tue, 03 Mar 2009 17:04:51 +0000 |
parents | 70321467b4f9 |
children | aa5dcae3f210 |
files | avio.c avio.h file.c http.c rtpdec.h rtpproto.c rtsp.c tcp.c udp.c |
diffstat | 9 files changed, 61 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/avio.c Tue Mar 03 16:53:04 2009 +0000 +++ b/avio.c Tue Mar 03 17:04:51 2009 +0000 @@ -206,6 +206,13 @@ 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;
--- a/avio.h Tue Mar 03 16:53:04 2009 +0000 +++ b/avio.h Tue Mar 03 17:04:51 2009 +0000 @@ -78,6 +78,15 @@ 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 @@ 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 @@ /* 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 */
--- a/file.c Tue Mar 03 16:53:04 2009 +0000 +++ b/file.c Tue Mar 03 17:04:51 2009 +0000 @@ -82,6 +82,11 @@ 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 @@ file_write, file_seek, file_close, + .url_get_file_handle = file_get_handle, }; /* pipe protocol */ @@ -120,4 +126,5 @@ pipe_open, file_read, file_write, + .url_get_file_handle = file_get_handle, };
--- a/http.c Tue Mar 03 16:53:04 2009 +0000 +++ b/http.c Tue Mar 03 17:04:51 2009 +0000 @@ -345,6 +345,13 @@ 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 @@ http_write, http_seek, http_close, + .url_get_file_handle = http_get_file_handle, };
--- a/rtpdec.h Tue Mar 03 16:53:04 2009 +0000 +++ b/rtpdec.h Tue Mar 03 17:04:51 2009 +0000 @@ -69,7 +69,9 @@ 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...
--- a/rtpproto.c Tue Mar 03 16:53:04 2009 +0000 +++ b/rtpproto.c Tue Mar 03 17:04:51 2009 +0000 @@ -169,8 +169,8 @@ /* 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 @@ 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 @@ *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 @@ rtp_write, NULL, /* seek */ rtp_close, + .url_get_file_handle = rtp_get_file_handle, };
--- a/rtsp.c Tue Mar 03 16:53:04 2009 +0000 +++ b/rtsp.c Tue Mar 03 17:04:51 2009 +0000 @@ -1305,7 +1305,7 @@ 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 @@ 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 @@ 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) {
--- a/tcp.c Tue Mar 03 16:53:04 2009 +0000 +++ b/tcp.c Tue Mar 03 17:04:51 2009 +0000 @@ -181,6 +181,12 @@ 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 @@ tcp_write, NULL, /* seek */ tcp_close, + .url_get_file_handle = tcp_get_file_handle, };
--- a/udp.c Tue Mar 03 16:53:04 2009 +0000 +++ b/udp.c Tue Mar 03 17:04:51 2009 +0000 @@ -326,6 +326,9 @@ * 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 @@ udp_write, NULL, /* seek */ udp_close, + .url_get_file_handle = udp_get_file_handle, };