forked from FFmpeg/FFmpeg
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
This commit is contained in:
parent
2fea965070
commit
f0a8039464
9 changed files with 61 additions and 5 deletions
|
@ -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…
Add table
Reference in a new issue