mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-25 08:10:41 +00:00
avio: add (ff)url_get_multi_file_handle() for getting more than one fd
Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
2e8f3cbcda
commit
d6b9da1178
@ -344,6 +344,21 @@ int ffurl_get_file_handle(URLContext *h)
|
|||||||
return h->prot->url_get_file_handle(h);
|
return h->prot->url_get_file_handle(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
|
||||||
|
{
|
||||||
|
if (!h->prot->url_get_multi_file_handle) {
|
||||||
|
if (!h->prot->url_get_file_handle)
|
||||||
|
return AVERROR(ENOSYS);
|
||||||
|
*handles = av_malloc(sizeof(*handles));
|
||||||
|
if (!*handles)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
*numhandles = 1;
|
||||||
|
*handles[0] = h->prot->url_get_file_handle(h);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return h->prot->url_get_multi_file_handle(h, handles, numhandles);
|
||||||
|
}
|
||||||
|
|
||||||
int ffurl_shutdown(URLContext *h, int flags)
|
int ffurl_shutdown(URLContext *h, int flags)
|
||||||
{
|
{
|
||||||
if (!h->prot->url_shutdown)
|
if (!h->prot->url_shutdown)
|
||||||
|
@ -320,6 +320,19 @@ int ff_rtp_get_rtcp_file_handle(URLContext *h) {
|
|||||||
return s->rtcp_fd;
|
return s->rtcp_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtp_get_multi_file_handle(URLContext *h, int **handles,
|
||||||
|
int *numhandles)
|
||||||
|
{
|
||||||
|
RTPContext *s = h->priv_data;
|
||||||
|
int *hs = *handles = av_malloc(sizeof(**handles) * 2);
|
||||||
|
if (!hs)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
hs[0] = s->rtp_fd;
|
||||||
|
hs[1] = s->rtcp_fd;
|
||||||
|
*numhandles = 2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
URLProtocol ff_rtp_protocol = {
|
URLProtocol ff_rtp_protocol = {
|
||||||
.name = "rtp",
|
.name = "rtp",
|
||||||
.url_open = rtp_open,
|
.url_open = rtp_open,
|
||||||
@ -327,6 +340,7 @@ URLProtocol ff_rtp_protocol = {
|
|||||||
.url_write = rtp_write,
|
.url_write = rtp_write,
|
||||||
.url_close = rtp_close,
|
.url_close = rtp_close,
|
||||||
.url_get_file_handle = rtp_get_file_handle,
|
.url_get_file_handle = rtp_get_file_handle,
|
||||||
|
.url_get_multi_file_handle = rtp_get_multi_file_handle,
|
||||||
.priv_data_size = sizeof(RTPContext),
|
.priv_data_size = sizeof(RTPContext),
|
||||||
.flags = URL_PROTOCOL_FLAG_NETWORK,
|
.flags = URL_PROTOCOL_FLAG_NETWORK,
|
||||||
};
|
};
|
||||||
|
@ -81,6 +81,8 @@ typedef struct URLProtocol {
|
|||||||
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);
|
int (*url_get_file_handle)(URLContext *h);
|
||||||
|
int (*url_get_multi_file_handle)(URLContext *h, int **handles,
|
||||||
|
int *numhandles);
|
||||||
int (*url_shutdown)(URLContext *h, int flags);
|
int (*url_shutdown)(URLContext *h, int flags);
|
||||||
int priv_data_size;
|
int priv_data_size;
|
||||||
const AVClass *priv_data_class;
|
const AVClass *priv_data_class;
|
||||||
@ -201,6 +203,13 @@ int64_t ffurl_size(URLContext *h);
|
|||||||
*/
|
*/
|
||||||
int ffurl_get_file_handle(URLContext *h);
|
int ffurl_get_file_handle(URLContext *h);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the file descriptors associated with this URL.
|
||||||
|
*
|
||||||
|
* @return 0 on success or <0 on error.
|
||||||
|
*/
|
||||||
|
int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal the URLContext that we are done reading or writing the stream.
|
* Signal the URLContext that we are done reading or writing the stream.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user