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/trunktags/v0.6
| @@ -206,6 +206,13 @@ int64_t url_filesize(URLContext *h) | |||||
| return size; | 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) | int url_get_max_packet_size(URLContext *h) | ||||
| { | { | ||||
| return h->max_packet_size; | return h->max_packet_size; | ||||
| @@ -77,6 +77,15 @@ int url_close(URLContext *h); | |||||
| int url_exist(const char *filename); | int url_exist(const char *filename); | ||||
| int64_t url_filesize(URLContext *h); | 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 | * Return the maximum packet size associated to packetized file | ||||
| * handle. If the file is not packetized (stream like HTTP or file on | * 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); | int (*url_read_pause)(URLContext *h, int pause); | ||||
| int64_t (*url_read_seek)(URLContext *h, int stream_index, | int64_t (*url_read_seek)(URLContext *h, int stream_index, | ||||
| int64_t timestamp, int flags); | int64_t timestamp, int flags); | ||||
| int (*url_get_file_handle)(URLContext *h); | |||||
| } URLProtocol; | } URLProtocol; | ||||
| #if LIBAVFORMAT_VERSION_MAJOR < 53 | #if LIBAVFORMAT_VERSION_MAJOR < 53 | ||||
| @@ -389,6 +399,8 @@ void init_checksum(ByteIOContext *s, | |||||
| /* udp.c */ | /* udp.c */ | ||||
| int udp_set_remote_url(URLContext *h, const char *uri); | int udp_set_remote_url(URLContext *h, const char *uri); | ||||
| int udp_get_local_port(URLContext *h); | int udp_get_local_port(URLContext *h); | ||||
| #if (LIBAVFORMAT_VERSION_MAJOR <= 52) | |||||
| int udp_get_file_handle(URLContext *h); | int udp_get_file_handle(URLContext *h); | ||||
| #endif | |||||
| #endif /* AVFORMAT_AVIO_H */ | #endif /* AVFORMAT_AVIO_H */ | ||||
| @@ -82,6 +82,11 @@ static int file_close(URLContext *h) | |||||
| return close(fd); | return close(fd); | ||||
| } | } | ||||
| static int file_get_handle(URLContext *h) | |||||
| { | |||||
| return (int) h->priv_data; | |||||
| } | |||||
| URLProtocol file_protocol = { | URLProtocol file_protocol = { | ||||
| "file", | "file", | ||||
| file_open, | file_open, | ||||
| @@ -89,6 +94,7 @@ URLProtocol file_protocol = { | |||||
| file_write, | file_write, | ||||
| file_seek, | file_seek, | ||||
| file_close, | file_close, | ||||
| .url_get_file_handle = file_get_handle, | |||||
| }; | }; | ||||
| /* pipe protocol */ | /* pipe protocol */ | ||||
| @@ -120,4 +126,5 @@ URLProtocol pipe_protocol = { | |||||
| pipe_open, | pipe_open, | ||||
| file_read, | file_read, | ||||
| file_write, | file_write, | ||||
| .url_get_file_handle = file_get_handle, | |||||
| }; | }; | ||||
| @@ -345,6 +345,13 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence) | |||||
| return off; | 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 = { | URLProtocol http_protocol = { | ||||
| "http", | "http", | ||||
| http_open, | http_open, | ||||
| @@ -352,4 +359,5 @@ URLProtocol http_protocol = { | |||||
| http_write, | http_write, | ||||
| http_seek, | http_seek, | ||||
| http_close, | http_close, | ||||
| .url_get_file_handle = http_get_file_handle, | |||||
| }; | }; | ||||
| @@ -69,7 +69,9 @@ void rtp_parse_close(RTPDemuxContext *s); | |||||
| int rtp_get_local_port(URLContext *h); | int rtp_get_local_port(URLContext *h); | ||||
| int rtp_set_remote_url(URLContext *h, const char *uri); | 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); | 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... | * some rtp servers assume client is dead if they don't hear from them... | ||||
| @@ -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 | /* just to ease handle access. XXX: need to suppress direct handle | ||||
| access */ | 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->max_packet_size = url_get_max_packet_size(s->rtp_hd); | ||||
| h->is_streamed = 1; | h->is_streamed = 1; | ||||
| @@ -296,6 +296,7 @@ int rtp_get_local_port(URLContext *h) | |||||
| return udp_get_local_port(s->rtp_hd); | 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 | * Return the rtp and rtcp file handles for select() usage to wait for | ||||
| * several RTP streams at the same time. | * 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; | *prtp_fd = s->rtp_fd; | ||||
| *prtcp_fd = s->rtcp_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 = { | URLProtocol rtp_protocol = { | ||||
| "rtp", | "rtp", | ||||
| @@ -317,4 +325,5 @@ URLProtocol rtp_protocol = { | |||||
| rtp_write, | rtp_write, | ||||
| NULL, /* seek */ | NULL, /* seek */ | ||||
| rtp_close, | rtp_close, | ||||
| .url_get_file_handle = rtp_get_file_handle, | |||||
| }; | }; | ||||
| @@ -1305,7 +1305,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, | |||||
| RTSPState *rt = s->priv_data; | RTSPState *rt = s->priv_data; | ||||
| RTSPStream *rtsp_st; | RTSPStream *rtsp_st; | ||||
| fd_set rfds; | fd_set rfds; | ||||
| int fd1, fd2, fd_max, n, i, ret; | |||||
| int fd1, fd_max, n, i, ret; | |||||
| struct timeval tv; | struct timeval tv; | ||||
| for(;;) { | for(;;) { | ||||
| @@ -1318,7 +1318,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, | |||||
| if (rtsp_st->rtp_handle) { | if (rtsp_st->rtp_handle) { | ||||
| /* currently, we cannot probe RTCP handle because of | /* currently, we cannot probe RTCP handle because of | ||||
| * blocking restrictions */ | * 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) | if (fd1 > fd_max) | ||||
| fd_max = fd1; | fd_max = fd1; | ||||
| FD_SET(fd1, &rfds); | 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++) { | for(i = 0; i < rt->nb_rtsp_streams; i++) { | ||||
| rtsp_st = rt->rtsp_streams[i]; | rtsp_st = rt->rtsp_streams[i]; | ||||
| if (rtsp_st->rtp_handle) { | 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)) { | if (FD_ISSET(fd1, &rfds)) { | ||||
| ret = url_read(rtsp_st->rtp_handle, buf, buf_size); | ret = url_read(rtsp_st->rtp_handle, buf, buf_size); | ||||
| if (ret > 0) { | if (ret > 0) { | ||||
| @@ -181,6 +181,12 @@ static int tcp_close(URLContext *h) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int tcp_get_file_handle(URLContext *h) | |||||
| { | |||||
| TCPContext *s = h->priv_data; | |||||
| return s->fd; | |||||
| } | |||||
| URLProtocol tcp_protocol = { | URLProtocol tcp_protocol = { | ||||
| "tcp", | "tcp", | ||||
| tcp_open, | tcp_open, | ||||
| @@ -188,4 +194,5 @@ URLProtocol tcp_protocol = { | |||||
| tcp_write, | tcp_write, | ||||
| NULL, /* seek */ | NULL, /* seek */ | ||||
| tcp_close, | tcp_close, | ||||
| .url_get_file_handle = tcp_get_file_handle, | |||||
| }; | }; | ||||
| @@ -326,6 +326,9 @@ int udp_get_local_port(URLContext *h) | |||||
| * streams at the same time. | * streams at the same time. | ||||
| * @param h media file context | * @param h media file context | ||||
| */ | */ | ||||
| #if (LIBAVFORMAT_VERSION_MAJOR >= 53) | |||||
| static | |||||
| #endif | |||||
| int udp_get_file_handle(URLContext *h) | int udp_get_file_handle(URLContext *h) | ||||
| { | { | ||||
| UDPContext *s = h->priv_data; | UDPContext *s = h->priv_data; | ||||
| @@ -528,4 +531,5 @@ URLProtocol udp_protocol = { | |||||
| udp_write, | udp_write, | ||||
| NULL, /* seek */ | NULL, /* seek */ | ||||
| udp_close, | udp_close, | ||||
| .url_get_file_handle = udp_get_file_handle, | |||||
| }; | }; | ||||