Signed-off-by: Martin Storsjö <martin@martin.st>tags/n1.0
@@ -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,13 +320,27 @@ 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", | |||||
.url_open = rtp_open, | |||||
.url_read = rtp_read, | |||||
.url_write = rtp_write, | |||||
.url_close = rtp_close, | |||||
.url_get_file_handle = rtp_get_file_handle, | |||||
.priv_data_size = sizeof(RTPContext), | |||||
.flags = URL_PROTOCOL_FLAG_NETWORK, | |||||
.name = "rtp", | |||||
.url_open = rtp_open, | |||||
.url_read = rtp_read, | |||||
.url_write = rtp_write, | |||||
.url_close = rtp_close, | |||||
.url_get_file_handle = rtp_get_file_handle, | |||||
.url_get_multi_file_handle = rtp_get_multi_file_handle, | |||||
.priv_data_size = sizeof(RTPContext), | |||||
.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. | ||||
* | * | ||||