24#include "config_components.h"
51# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
60# define S_ISLNK(m) (((m) & S_IFLNK) == S_IFLNK)
69# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
78# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
87# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
106#if CONFIG_WINDOWS_HANDLE_PROTOCOL
127 .class_name =
"file",
134 .class_name =
"pipe",
153 if (
ret == 0 &&
c->follow)
178 const char *filename =
h->filename;
182#if HAVE_ACCESS && defined(R_OK)
183 if (access(filename, F_OK) < 0)
186 if (access(filename, R_OK) >= 0)
189 if (access(filename, W_OK) >= 0)
193 ret = stat(filename, &st);
204#if CONFIG_FD_PROTOCOL || CONFIG_PIPE_PROTOCOL
209#ifdef F_DUPFD_CLOEXEC
210 newfd = fcntl(oldfd, F_DUPFD_CLOEXEC, 0);
218 if (fcntl(newfd, F_SETFD, FD_CLOEXEC) == -1)
229#if CONFIG_FD_PROTOCOL || CONFIG_PIPE_PROTOCOL || CONFIG_WINDOWS_HANDLE_PROTOCOL
251 if (
c->follow && (whence == SEEK_END || whence ==
AVSEEK_SIZE))
256 ret = fstat(
c->fd, &st);
260 ret = lseek(
c->fd,
pos, whence);
265#if CONFIG_FILE_PROTOCOL
271 const char *filename =
h->filename;
274 ret = rmdir(filename);
275 if (
ret < 0 && (errno == ENOTDIR
280 ret = unlink(filename);
292 const char *filename_src = h_src->
filename;
293 const char *filename_dst = h_dst->
filename;
297 if (rename(filename_src, filename_dst) < 0)
313 access = O_CREAT | O_RDWR;
317 access = O_CREAT | O_WRONLY;
331 h->is_streamed = !fstat(fd, &st) &&
S_ISFIFO(st.st_mode);
334 h->max_packet_size =
c->pkt_size;
339 h->max_packet_size = 262144;
344 h->min_packet_size =
h->max_packet_size;
346 if (
c->seekable >= 0)
347 h->is_streamed = !
c->seekable;
357 c->dir = opendir(
h->filename);
372 char *fullpath =
NULL;
379 dir = readdir(
c->dir);
384 }
while (!strcmp(dir->d_name,
".") || !strcmp(dir->d_name,
".."));
389 if (!lstat(fullpath, &st)) {
390 if (S_ISDIR(st.st_mode))
394 else if (S_ISCHR(st.st_mode))
407 (*next)->group_id = st.st_gid;
408 (*next)->user_id = st.st_uid;
409 (*next)->size = st.st_size;
410 (*next)->filemode = st.st_mode & 0777;
411 (*next)->modification_timestamp = INT64_C(1000000) * st.st_mtime;
412 (*next)->access_timestamp = INT64_C(1000000) * st.st_atime;
413 (*next)->status_change_timestamp = INT64_C(1000000) * st.st_ctime;
419 return (*next)->name ? 0 :
AVERROR(ENOMEM);
438 .url_open = file_open,
445 .url_delete = file_delete,
446 .url_move = file_move,
449 .url_open_dir = file_open_dir,
450 .url_read_dir = file_read_dir,
451 .url_close_dir = file_close_dir,
452 .default_whitelist =
"file,crypto,data"
457#if CONFIG_PIPE_PROTOCOL
475 fd = strtol(filename, &
final, 10);
482 c->fd = fd_dup(
h,
c->fd);
491 .url_open = pipe_open,
496 .url_check = fd_check,
499 .default_whitelist =
"crypto,data"
504#if CONFIG_FD_PROTOCOL
511 if (strcmp(filename,
"fd:") != 0) {
513 " please set it via -fd {num}\n");
524 if (fstat(
c->fd, &st) < 0)
527 c->fd = fd_dup(
h,
c->fd);
542 .url_check = fd_check,
545 .default_whitelist =
"crypto,data"
550#if CONFIG_WINDOWS_HANDLE_PROTOCOL
554static const AVOption windows_handle_options[] = {
560static const AVClass windows_handle_class = {
561 .class_name =
"windows_handle",
563 .option = windows_handle_options,
567static int windows_handle_open(
URLContext *
h,
const char *filename,
int flags)
570 HANDLE handle = (HANDLE)(intptr_t)
c->handle;
575 if (strcmp(filename,
"handle:") != 0) {
577 " please set it via -handle {num}\n");
581 if (handle == INVALID_HANDLE_VALUE || !handle) {
583 handle = GetStdHandle(STD_OUTPUT_HANDLE);
585 handle = GetStdHandle(STD_INPUT_HANDLE);
586 if (handle == INVALID_HANDLE_VALUE || !handle)
590 if (!DuplicateHandle(GetCurrentProcess(), handle,
591 GetCurrentProcess(), &dup_handle,
592 0, FALSE, DUPLICATE_SAME_ACCESS))
593 return GetLastError() == ERROR_INVALID_HANDLE ?
AVERROR(EBADF)
596 fd = _open_osfhandle((intptr_t)dup_handle,
O_BINARY);
598 CloseHandle(dup_handle);
602 if (fstat(fd, &st) < 0) {
615 .url_open = windows_handle_open,
621 .url_check = fd_check,
623 .priv_data_class = &windows_handle_class,
624 .default_whitelist =
"crypto,data"
629#if CONFIG_ANDROID_CONTENT_PROTOCOL
634typedef struct JFields {
638 jclass context_class;
639 jmethodID get_content_resolver_id;
641 jclass content_resolver_class;
642 jmethodID open_file_descriptor_id;
644 jclass parcel_file_descriptor_class;
645 jmethodID detach_fd_id;
648#define OFFSET(x) offsetof(JFields, x)
649static const struct FFJniField jfields_mapping[] = {
654 {
"android/content/Context",
"getContentResolver",
"()Landroid/content/ContentResolver;",
FF_JNI_METHOD,
OFFSET(get_content_resolver_id), 1 },
657 {
"android/content/ContentResolver",
"openFileDescriptor",
"(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;",
FF_JNI_METHOD,
OFFSET(open_file_descriptor_id), 1 },
660 {
"android/os/ParcelFileDescriptor",
"detachFd",
"()I",
FF_JNI_METHOD,
OFFSET(detach_fd_id), 1 },
666static int android_content_open(
URLContext *
h,
const char *filename,
int flags)
671 const char *mode_str =
"r";
674 JFields jfields = { 0 };
675 jobject application_context =
NULL;
679 jobject content_resolver =
NULL;
680 jobject parcel_file_descriptor =
NULL;
694 if (!application_context) {
717 uri = (*env)->CallStaticObjectMethod(env, jfields.uri_class, jfields.parse_id, url);
722 content_resolver = (*env)->CallObjectMethod(env, application_context, jfields.get_content_resolver_id);
727 parcel_file_descriptor = (*env)->CallObjectMethod(env, content_resolver, jfields.open_file_descriptor_id, uri,
mode);
731 if (!parcel_file_descriptor) {
737 fd = (*env)->CallIntMethod(env, parcel_file_descriptor, jfields.detach_fd_id);
742 if (fstat(fd, &st) < 0) {
752 (*env)->DeleteLocalRef(env, url);
753 (*env)->DeleteLocalRef(env,
mode);
754 (*env)->DeleteLocalRef(env, uri);
755 (*env)->DeleteLocalRef(env, content_resolver);
756 (*env)->DeleteLocalRef(env, parcel_file_descriptor);
762static const AVOption android_content_options[] = {
767static const AVClass android_content_class = {
768 .class_name =
"android_content",
770 .option = android_content_options,
776 .url_open = android_content_open,
783 .priv_data_class = &android_content_class,
#define AVIO_FLAG_READ
read-only
#define AVSEEK_SIZE
Passing this as the "whence" parameter to a seek function causes it to return the filesize without se...
#define AVIO_FLAG_WRITE
write-only
@ AVIO_ENTRY_BLOCK_DEVICE
@ AVIO_ENTRY_SYMBOLIC_LINK
@ AVIO_ENTRY_CHARACTER_DEVICE
static uint32_t BS_FUNC read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
#define flags(name, subs,...)
static __device__ float trunc(float a)
#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.
@ AV_OPT_TYPE_INT64
Underlying C type is int64_t.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AVERROR_EOF
End of file.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
char * av_append_path_component(const char *path, const char *component)
Append path component to the existing path.
#define LIBAVUTIL_VERSION_INT
void * av_jni_get_android_app_ctx(void)
av_cold void CBS_FUNC close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
int ff_jni_init_jfields(JNIEnv *env, void *jfields, const struct FFJniField *jfields_mapping, int global, void *log_ctx)
jstring ff_jni_utf_chars_to_jstring(JNIEnv *env, const char *utf_chars, void *log_ctx)
int ff_jni_reset_jfields(JNIEnv *env, void *jfields, const struct FFJniField *jfields_mapping, int global, void *log_ctx)
int ff_jni_exception_check(JNIEnv *env, int log, void *log_ctx)
JNIEnv * ff_jni_get_env(void *log_ctx)
int avpriv_open(const char *filename, int flags,...)
A wrapper for open() setting O_CLOEXEC.
common internal API header
static const uint16_t mask[17]
Memory handling functions.
miscellaneous OS support macros and functions.
const URLProtocol ff_file_protocol
const URLProtocol ff_windows_handle_protocol
const URLProtocol ff_android_content_protocol
const URLProtocol ff_pipe_protocol
const URLProtocol ff_fd_protocol
Describe the class of an AVClass context structure.
Describes single entry of the directory.
char * filename
specified URL
AVIODirEntry * ff_alloc_dir_entry(void)
Allocate directory entry with default values.
unbuffered private I/O API