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
release/0.6
Ronald S. Bultje 16 years ago
parent 2fea965070
commit f0a8039464
  1. 7
      libavformat/avio.c
  2. 12
      libavformat/avio.h
  3. 7
      libavformat/file.c
  4. 8
      libavformat/http.c
  5. 2
      libavformat/rtpdec.h
  6. 13
      libavformat/rtpproto.c
  7. 6
      libavformat/rtsp.c
  8. 7
      libavformat/tcp.c
  9. 4
      libavformat/udp.c

@ -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->rtp_fd = url_get_file_handle(s->rtp_hd);
s->rtcp_fd = udp_get_file_handle(s->rtcp_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,
}; };

Loading…
Cancel
Save