diff options
author | Lukasz Marek <lukasz.m.luki2@gmail.com> | 2014-07-05 18:12:04 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-03-28 03:13:44 +0100 |
commit | 56b7aa213882e495ab8dc1b92acb83b1a1d91996 (patch) | |
tree | 7ab1635f978574ff7a2dcc3b801fa3e6de178e2c /doc/examples/avio_list_dir.c | |
parent | 303c3dada243243d4896c81979c15ce67b028cd6 (diff) |
doc/examples: add directory listing example
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'doc/examples/avio_list_dir.c')
-rw-r--r-- | doc/examples/avio_list_dir.c | 111 |
1 files changed, 111 insertions, 0 deletions
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 <libavcodec/avcodec.h> +#include <libavformat/avformat.h> +#include <libavformat/avio.h> + +static const char *type_string(int type) +{ + switch (type) { + case AVIO_ENTRY_DIRECTORY: + return "<DIR>"; + case AVIO_ENTRY_FILE: + return "<FILE>"; + case AVIO_ENTRY_BLOCK_DEVICE: + return "<BLOCK DEVICE>"; + case AVIO_ENTRY_CHARACTER_DEVICE: + return "<CHARACTER DEVICE>"; + case AVIO_ENTRY_NAMED_PIPE: + return "<PIPE>"; + case AVIO_ENTRY_SYMBOLIC_LINK: + return "<LINK>"; + case AVIO_ENTRY_SOCKET: + return "<SOCKET>"; + case AVIO_ENTRY_UNKNOWN: + default: + break; + } + return "<UNKNOWN>"; +} + +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; +} |