68 static int cmp(
void *key,
const void *node)
70 return (*(int64_t *) key) - ((
const CacheEntry *) node)->logical_pos;
102 pos = lseek(c->
fd, 0, SEEK_END);
110 ret = write(c->
fd, buf, size);
129 if (!entry || !node) {
138 if (entry_ret && entry_ret != entry) {
169 if (in_block_pos < entry->size) {
170 int64_t physical_target = entry->
physical_pos + in_block_pos;
173 r = lseek(c->
fd, physical_target, SEEK_SET);
179 r = read(c->
fd, buf,
FFMIN(size, entry->
size - in_block_pos));
203 if (r == 0 && size>0) {
238 if (whence == SEEK_CUR) {
247 if (whence == SEEK_SET && pos >= 0 && pos < c->
end) {
255 if ((whence == SEEK_SET && pos >= c->
logical_pos ||
256 whence == SEEK_END && pos <= 0) && ret < 0) {
260 while (c->
logical_pos < pos || whence == SEEK_END) {
261 int size =
sizeof(tmp);
262 if (whence == SEEK_SET)
265 if (ret == 0 && whence == SEEK_END) {
289 av_log(h,
AV_LOG_INFO,
"Statistics, cache hits:%"PRId64
" cache misses:%"PRId64
"\n",
299 #define OFFSET(x) offsetof(Context, x)
300 #define D AV_OPT_FLAG_DECODING_PARAM
303 {
"read_ahead_limit",
"Amount in bytes that may be read ahead when seeking isn't supported, -1 for unlimited",
OFFSET(read_ahead_limit),
AV_OPT_TYPE_INT, { .i64 = 65536 }, -1, INT_MAX,
D },
320 .priv_data_size =
sizeof(
Context),
321 .priv_data_class = &cache_context_class,
support keeping files support filling with a background thread
#define LIBAVUTIL_VERSION_INT
AVIOInterruptCB interrupt_callback
static const AVClass cache_context_class
static const AVOption options[]
struct AVTreeNode * av_tree_node_alloc(void)
Allocate an AVTreeNode.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
void * av_tree_find(const AVTreeNode *t, void *key, int(*cmp)(void *key, const void *b), void *next[2])
miscellaneous OS support macros and functions.
static av_cold int end(AVCodecContext *avctx)
URLProtocol ff_cache_protocol
void av_tree_destroy(AVTreeNode *t)
void * av_tree_insert(AVTreeNode **tp, void *key, int(*cmp)(void *key, const void *b), AVTreeNode **next)
Insert or remove an element.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
simple assert() macros that are a bit more flexible than ISO C assert().
static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary **options)
static int cmp(void *key, const void *node)
static int cache_close(URLContext *h)
static int64_t cache_seek(URLContext *h, int64_t pos, int whence)
int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx)
Wrapper to work around the lack of mkstemp() on mingw.
#define AV_LOG_INFO
Standard information.
static int cache_read(URLContext *h, unsigned char *buf, int size)
Describe the class of an AVClass context structure.
int ffurl_close(URLContext *h)
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
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 ffurl_open(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create an URLContext for accessing to the resource indicated by url, and open it. ...
#define AVSEEK_SIZE
Passing this as the "whence" parameter to a seek function causes it to return the filesize without se...
static int add_entry(URLContext *h, const unsigned char *buf, int size)
unbuffered private I/O API
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...