49 if (!prev &&
h->priv_data &&
h->prot->priv_data_class)
54 #define OFFSET(x) offsetof(URLContext,x)
55 #define E AV_OPT_FLAG_ENCODING_PARAM
56 #define D AV_OPT_FLAG_DECODING_PARAM
58 {
"protocol_whitelist",
"List of protocols that are allowed to be used",
OFFSET(protocol_whitelist),
AV_OPT_TYPE_STRING, { .str =
NULL }, 0, 0,
D },
59 {
"protocol_blacklist",
"List of protocols that are not allowed to be used",
OFFSET(protocol_blacklist),
AV_OPT_TYPE_STRING, { .str =
NULL }, 0, 0,
D },
70 #if FF_API_CHILD_CLASS_NEXT
71 .child_class_next = ff_urlcontext_child_class_next,
78 const char *filename,
int flags,
90 "Impossible to open the '%s' protocol for reading\n", up->
name);
95 "Impossible to open the '%s' protocol for writing\n", up->
name);
127 if (strcmp(up->
name,
"subfile"))
130 while(ret >= 0 && (
key= strchr(p, sep)) && p<
key && (
val = strchr(
key+1, sep))){
132 if (strcmp(p,
"start") && strcmp(p,
"end")) {
148 memmove(start,
key+1, strlen(
key));
232 if (
s->prot->url_accept)
233 return s->prot->url_accept(
s,
c);
240 if (
c->prot->url_handshake) {
241 ret =
c->prot->url_handshake(
c);
249 #define URL_SCHEME_CHARS \
250 "abcdefghijklmnopqrstuvwxyz" \
251 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
257 char proto_str[128], proto_nested[128], *ptr;
261 if (filename[proto_len] !=
':' &&
262 (strncmp(filename,
"subfile,", 8) || !strchr(filename + proto_len + 1,
':')) ||
264 strcpy(proto_str,
"file");
267 FFMIN(proto_len + 1,
sizeof(proto_str)));
269 av_strlcpy(proto_nested, proto_str,
sizeof(proto_nested));
270 if ((ptr = strchr(proto_nested,
'+')))
276 for (
i = 0; protocols[
i];
i++) {
278 if (!strcmp(proto_str, up->
name)) {
283 !strcmp(proto_nested, up->
name)) {
291 "openssl, gnutls or securetransport enabled.\n");
311 const char *whitelist,
const char* blacklist,
324 if (
options && (*puc)->prot->priv_data_class &&
333 !strcmp(whitelist, e->
value));
336 !strcmp(blacklist, e->
value));
357 int size,
int size_min,
363 int fast_retries = 5;
364 int64_t wait_since = 0;
367 while (
len < size_min) {
393 fast_retries =
FFMAX(fast_retries, 2);
420 if (
h->max_packet_size &&
size >
h->max_packet_size)
432 if (!
h->prot->url_seek)
445 if (
h->is_connected &&
h->prot->url_close)
446 ret =
h->prot->url_close(
h);
451 if (
h->prot->priv_data_size) {
452 if (
h->prot->priv_data_class)
481 if (
h->prot->url_check) {
482 ret =
h->prot->url_check(
h,
flags);
522 if (
h->prot->url_delete)
523 ret =
h->prot->url_delete(
h);
547 if (
h->prot->url_open_dir &&
h->prot->url_read_dir &&
h->prot->url_close_dir) {
548 if (
options &&
h->prot->priv_data_class &&
551 ret =
h->prot->url_open_dir(
h);
558 ctx->url_context =
h;
574 if (!
s || !
s->url_context)
577 if ((ret =
h->prot->url_read_dir(
h, next)) < 0)
587 if (!(*
s) || !(*s)->url_context)
589 h = (*s)->url_context;
590 h->prot->url_close_dir(
h);
599 if (!entry || !*entry)
622 if (!
h || !
h->prot || !
h->prot->url_get_file_handle)
624 return h->prot->url_get_file_handle(
h);
631 if (!
h->prot->url_get_multi_file_handle) {
632 if (!
h->prot->url_get_file_handle)
638 *handles[0] =
h->prot->url_get_file_handle(
h);
641 return h->prot->url_get_multi_file_handle(
h, handles, numhandles);
646 if (!
h || !
h->prot || !
h->prot->url_get_short_seek)
648 return h->prot->url_get_short_seek(
h);
653 if (!
h || !
h->prot || !
h->prot->url_shutdown)
655 return h->prot->url_shutdown(
h,
flags);
660 if (
cb &&
cb->callback)
661 return cb->callback(
cb->opaque);
665 int ff_rename(
const char *url_src,
const char *url_dst,
void *logctx)
static double val(void *priv, double ch)
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ffurl_shutdown(URLContext *h, int flags)
Signal the URLContext that we are done reading or writing the stream.
int ffurl_handshake(URLContext *c)
Perform one step of the protocol handshake to accept a new client.
static const struct URLProtocol * url_find_protocol(const char *filename)
static const AVOption options[]
int ffurl_alloc(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb)
Create a URLContext for accessing to the resource indicated by url, but do not initiate the connectio...
int ffurl_read(URLContext *h, unsigned char *buf, int size)
Read up to size bytes from the resource accessed by h, and store the read bytes in buf.
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
int avpriv_io_delete(const char *url)
Delete a resource.
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
int avio_close_dir(AVIODirContext **s)
Close directory.
int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it.
static int retry_transfer_wrapper(URLContext *h, uint8_t *buf, int size, int size_min, int(*transfer_func)(URLContext *h, uint8_t *buf, int size))
int ffurl_get_short_seek(URLContext *h)
Return the current short seek threshold value for this URL.
int64_t ffurl_seek(URLContext *h, int64_t pos, int whence)
Change the position that will be used by the next read/write operation on the resource accessed by h.
int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options)
Open directory for reading.
int64_t ffurl_size(URLContext *h)
Return the filesize of the resource accessed by h, AVERROR(ENOSYS) if the operation is not supported ...
int ffurl_accept(URLContext *s, URLContext **c)
Accept an URLContext c on an URLContext s.
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
int ffurl_close(URLContext *h)
void avio_free_directory_entry(AVIODirEntry **entry)
Free entry allocated by avio_read_dir().
int avio_check(const char *url, int flags)
Return AVIO_FLAG_* access flags corresponding to the access permissions of the resource in url,...
static void * urlcontext_child_next(void *obj, void *prev)
int ffurl_connect(URLContext *uc, AVDictionary **options)
Connect an URLContext that has been allocated by ffurl_alloc.
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
int ffurl_get_file_handle(URLContext *h)
Return the file descriptor associated with this URL.
int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
Return the file descriptors associated with this URL.
int avio_read_dir(AVIODirContext *s, AVIODirEntry **next)
Get next directory entry.
int ffurl_read_complete(URLContext *h, unsigned char *buf, int size)
Read as many bytes as possible (up to size), calling the read function multiple times if necessary.
int avpriv_io_move(const char *url_src, const char *url_dst)
Move or rename a resource.
static const char * urlcontext_to_name(void *ptr)
static int url_alloc_for_protocol(URLContext **puc, const URLProtocol *up, const char *filename, int flags, const AVIOInterruptCB *int_cb)
const AVClass ffurl_context_class
int ff_rename(const char *url_src, const char *url_dst, void *logctx)
Wrap avpriv_io_move and log if error happens.
#define AVIO_FLAG_READ
read-only
#define AVSEEK_SIZE
ORing this as the "whence" parameter to a seek function causes it to return the filesize without seek...
#define AVIO_FLAG_WRITE
write-only
#define AVIO_FLAG_READ_WRITE
read-write pseudo flag
#define AVIO_FLAG_NONBLOCK
Use non-blocking mode.
#define AVSEEK_FORCE
Passing this flag as the "whence" parameter to a seek function causes it to seek by any means (like r...
#define flags(name, subs,...)
const AVIOInterruptCB int_cb
int av_opt_copy(void *dst, const void *src)
Copy options from src object into dest object.
void av_opt_free(void *obj)
Free all allocated objects in obj.
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
int av_opt_set_dict(void *obj, AVDictionary **options)
Set all the options from a given dictionary on an object.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
#define AVERROR_PROTOCOL_NOT_FOUND
Protocol not found.
#define AVERROR_EOF
End of file.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AVERROR_OPTION_NOT_FOUND
Option not found.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
char * av_strdup(const char *s)
Duplicate a string.
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
int av_match_list(const char *name, const char *list, char separator)
Check if a name is in a list.
#define LIBAVUTIL_VERSION_INT
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
common internal API header
int ff_network_init(void)
void ff_network_close(void)
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
miscellaneous OS support macros and functions.
static int is_dos_path(const char *path)
const URLProtocol ** ffurl_get_protocols(const char *whitelist, const char *blacklist)
Construct a list of protocols matching a given whitelist and/or blacklist.
const AVClass * ff_urlcontext_child_class_iterate(void **iter)
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Describes single entry of the directory.
Callback for checking whether to abort blocking functions.
const char * protocol_whitelist
AVIOInterruptCB interrupt_callback
const struct URLProtocol * prot
const AVClass * av_class
information for av_log().
int is_streamed
true if streamed (no seek possible), default = false
const char * protocol_blacklist
int max_packet_size
if non zero, the stream is packetized with this max packet size
char * filename
specified URL
int(* url_open2)(URLContext *h, const char *url, int flags, AVDictionary **options)
This callback is to be used by protocols which open further nested protocols.
int(* url_read)(URLContext *h, unsigned char *buf, int size)
Read data from the protocol.
int(* url_open)(URLContext *h, const char *url, int flags)
const AVClass * priv_data_class
const char * default_whitelist
int(* url_write)(URLContext *h, const unsigned char *buf, int size)
int(* url_move)(URLContext *h_src, URLContext *h_dst)
int av_usleep(unsigned usec)
Sleep for a period of time.
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
unbuffered private I/O API
#define URL_PROTOCOL_FLAG_NESTED_SCHEME
#define URL_PROTOCOL_FLAG_NETWORK
static double cb(void *priv, double x, double y)