diff --git a/.gitignore b/.gitignore index d2088e5205..71d4d647e9 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ /doc/avoptions_codec.texi /doc/avoptions_format.texi /doc/doxy/html/ +/doc/examples/avio_list_dir /doc/examples/avio_reading /doc/examples/decoding_encoding /doc/examples/demuxing_decoding diff --git a/configure b/configure index 606af60141..017a9d27dc 100755 --- a/configure +++ b/configure @@ -1321,6 +1321,7 @@ COMPONENT_LIST=" EXAMPLE_LIST=" avio_reading_example + avio_list_dir_example decoding_encoding_example demuxing_decoding_example extract_mvs_example @@ -2659,6 +2660,7 @@ zoompan_filter_deps="swscale" # examples avio_reading="avformat avcodec avutil" +avio_list_dir="avformat avutil" avcodec_example_deps="avcodec avutil" decoding_encoding_example_deps="avcodec avformat avutil" demuxing_decoding_example_deps="avcodec avformat avutil" diff --git a/doc/Makefile b/doc/Makefile index 697142f088..4573531184 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -36,6 +36,7 @@ DOCS-$(CONFIG_MANPAGES) += $(MANPAGES) DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES) DOCS = $(DOCS-yes) +DOC_EXAMPLES-$(CONFIG_AVIO_LIST_DIR_EXAMPLE) += avio_list_dir DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE) += avcodec DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding diff --git a/doc/examples/Makefile b/doc/examples/Makefile index 9f03f04b57..9699f11d43 100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@ -11,7 +11,8 @@ CFLAGS += -Wall -g CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS) LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS) -EXAMPLES= avio_reading \ +EXAMPLES= avio_list_dir \ + avio_reading \ decoding_encoding \ demuxing_decoding \ extract_mvs \ diff --git a/doc/examples/avio_list_dir.c b/doc/examples/avio_list_dir.c new file mode 100644 index 0000000000..37b80c58c5 --- /dev/null +++ b/doc/examples/avio_list_dir.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2014 Lukasz Marek + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include + +static const char *type_string(int type) +{ + switch (type) { + case AVIO_ENTRY_DIRECTORY: + return ""; + case AVIO_ENTRY_FILE: + return ""; + case AVIO_ENTRY_BLOCK_DEVICE: + return ""; + case AVIO_ENTRY_CHARACTER_DEVICE: + return ""; + case AVIO_ENTRY_NAMED_PIPE: + return ""; + case AVIO_ENTRY_SYMBOLIC_LINK: + return ""; + case AVIO_ENTRY_SOCKET: + return ""; + case AVIO_ENTRY_UNKNOWN: + default: + break; + } + return ""; +} + +int main(int argc, char *argv[]) +{ + const char *input_dir = NULL; + AVIODirEntry *entry = NULL; + AVIODirContext *ctx = NULL; + int cnt, ret; + char filemode[4], uid_and_gid[20]; + + av_log_set_level(AV_LOG_DEBUG); + + if (argc != 2) { + fprintf(stderr, "usage: %s input_dir\n" + "API example program to show how to list files in directory " + "accessed through AVIOContext.\n", argv[0]); + return 1; + } + input_dir = argv[1]; + + /* register codecs and formats and other lavf/lavc components*/ + av_register_all(); + + if ((ret = avio_open_dir(&ctx, input_dir, NULL)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot open directory: %s.\n", av_err2str(ret)); + return 1; + } + + cnt = 0; + for (;;) { + if ((ret = avio_read_dir(ctx, &entry)) < 0) { + av_log(NULL, AV_LOG_ERROR, "Cannot list directory: %s.\n", av_err2str(ret)); + return 1; + } + if (!entry) + break; + if (entry->filemode == -1) { + snprintf(filemode, 4, "???"); + } else { + snprintf(filemode, 4, "%3"PRIo64, entry->filemode); + } + snprintf(uid_and_gid, 20, "%"PRId64"(%"PRId64")", entry->user_id, entry->group_id); + if (cnt == 0) + av_log(NULL, AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n", + "TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED", + "ACCESSED", "STATUS_CHANGED"); + av_log(NULL, AV_LOG_INFO, "%-9s %12"PRId64" %30s %10s %s %16"PRId64" %16"PRId64" %16"PRId64"\n", + type_string(entry->type), + entry->size, + entry->name, + uid_and_gid, + filemode, + entry->modification_timestamp, + entry->access_timestamp, + entry->status_change_timestamp); + avio_free_directory_entry(&entry); + cnt++; + }; + + avio_close_dir(&ctx); + + return 0; +}