mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avio: add avio_check()
The new function is more flexible than url_exist(), as it allows to specify which access flags to check, and does not require an explicit open of the checked resource. Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
parent
cbea3ac820
commit
175389c854
@ -374,6 +374,25 @@ int url_exist(const char *filename)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int avio_check(const char *url, int flags)
|
||||
{
|
||||
URLContext *h;
|
||||
int ret = ffurl_alloc(&h, url, flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (h->prot->url_check) {
|
||||
ret = h->prot->url_check(h, flags);
|
||||
} else {
|
||||
ret = ffurl_connect(h);
|
||||
if (ret >= 0)
|
||||
ret = flags;
|
||||
}
|
||||
|
||||
ffurl_close(h);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int64_t ffurl_size(URLContext *h)
|
||||
{
|
||||
int64_t pos, size;
|
||||
|
@ -134,6 +134,7 @@ typedef struct URLProtocol {
|
||||
int priv_data_size;
|
||||
const AVClass *priv_data_class;
|
||||
int flags;
|
||||
int (*url_check)(URLContext *h, int mask);
|
||||
} URLProtocol;
|
||||
|
||||
typedef struct URLPollEntry {
|
||||
@ -346,6 +347,23 @@ attribute_deprecated int url_close_buf(AVIOContext *s);
|
||||
*/
|
||||
int url_exist(const char *url);
|
||||
|
||||
/**
|
||||
* Return AVIO_* access flags corresponding to the access permissions
|
||||
* of the resource in url, or a negative value corresponding to an
|
||||
* AVERROR code in case of failure. The returned access flags are
|
||||
* masked by the value in flags.
|
||||
*
|
||||
* @note This function is intrinsically unsafe, in the sense that the
|
||||
* checked resource may change its existence or permission status from
|
||||
* one call to another. Thus you should not trust the returned value,
|
||||
* unless you are sure that no other processes are accessing the
|
||||
* checked resource.
|
||||
*
|
||||
* @note This function is slightly broken until next major bump
|
||||
* because of AVIO_RDONLY == 0. Don't use it until then.
|
||||
*/
|
||||
int avio_check(const char *url, int flags);
|
||||
|
||||
/**
|
||||
* The callback is called in blocking functions to test regulary if
|
||||
* asynchronous interruption is needed. AVERROR_EXIT is returned
|
||||
|
@ -59,6 +59,7 @@ typedef struct URLProtocol {
|
||||
int priv_data_size;
|
||||
const AVClass *priv_data_class;
|
||||
int flags;
|
||||
int (*url_check)(URLContext *h, int mask);
|
||||
} URLProtocol;
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user