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. | ||||
| * | * | ||||