diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2018-09-05 00:32:00 +0300 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2018-09-22 14:59:19 +0300 |
commit | e2892ffa2dd1e893d0229c5fcbe0bbbee8e11c20 (patch) | |
tree | 9ba42513c2916db89d47f8b34fa0141d6aeb4dde /tools/dav1d.c | |
parent | d32eb2d935a31288c34ccaa42b09bc60eacdfd68 (diff) |
Initial decoder implementation.
With minor contributions from:
- Jean-Baptiste Kempf <jb@videolan.org>
- Marvin Scholz <epirat07@gmail.com>
- Hugo Beauzée-Luyssen <hugo@videolan.org>
Diffstat (limited to 'tools/dav1d.c')
-rw-r--r-- | tools/dav1d.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/tools/dav1d.c b/tools/dav1d.c new file mode 100644 index 0000000..9bfd66c --- /dev/null +++ b/tools/dav1d.c @@ -0,0 +1,173 @@ +/* + * Copyright © 2018, VideoLAN and dav1d authors + * Copyright © 2018, Two Orioles, LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include <assert.h> +#include <errno.h> +#include <math.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#include "dav1d/data.h" + +#include "include/version.h" + +#include "input/input.h" + +#include "output/output.h" + +#include "dav1d_cli_parse.h" + +static void print_stats(const int istty, const unsigned n, + const unsigned num) +{ + const char *pre_string = istty ? "\r" : ""; + const char *post_string = istty ? "" : "\n"; + + if (num == 0xFFFFFFFFU) { + fprintf(stderr, "%sDecoded %u frames%s", pre_string, n, post_string); + } else { + fprintf(stderr, "%sDecoded %u/%u frames (%.1lf%%)%s", + pre_string, n, num, 100.0 * n / num, post_string); + } +} + +int main(const int argc, char *const *const argv) { + const int istty = isatty(fileno(stderr)); + int res = 0; + CLISettings cli_settings; + Dav1dSettings lib_settings; + DemuxerContext *in; + MuxerContext *out = NULL; + Dav1dPicture p; + Dav1dContext *c; + Dav1dData data; + unsigned n_out = 0, total, fps[2]; + const char *version = dav1d_version(); + + if (strcmp(version, DAV1D_VERSION)) { + fprintf(stderr, "Version mismatch (library: %s, executable: %s)\n", + version, DAV1D_VERSION); + return -1; + } + + dav1d_init(); + init_demuxers(); + init_muxers(); + parse(argc, argv, &cli_settings, &lib_settings); + + if ((res = input_open(&in, cli_settings.inputfile, + fps, &total)) < 0) + { + return res; + } + for (unsigned i = 0; i <= cli_settings.skip; i++) { + if ((res = input_read(in, &data)) < 0) + return res; + if (i < cli_settings.skip) dav1d_data_unref(&data); + } + + if (!cli_settings.quiet) + fprintf(stderr, "Dav1d %s - by Two Orioles\n", DAV1D_VERSION); + + //getc(stdin); + if (cli_settings.limit != 0 && cli_settings.limit < total) + total = cli_settings.limit; + + if ((res = dav1d_open(&c, &lib_settings))) + return res; + + do { + memset(&p, 0, sizeof(p)); + if ((res = dav1d_decode(c, &data, &p)) < 0) { + if (res != -EAGAIN) { + fprintf(stderr, "Error decoding frame: %s\n", + strerror(-res)); + break; + } + res = 0; + } else { + if (!n_out) { + if ((res = output_open(&out, cli_settings.muxer, + cli_settings.outputfile, + &p.p, fps)) < 0) + { + return res; + } + } + if ((res = output_write(out, &p)) < 0) + break; + n_out++; + if (!cli_settings.quiet) + print_stats(istty, n_out, total); + } + + if (cli_settings.limit && n_out == cli_settings.limit) + break; + } while (data.sz > 0 || !input_read(in, &data)); + + // flush + if (res == 0) while (!cli_settings.limit || n_out < cli_settings.limit) { + if ((res = dav1d_decode(c, NULL, &p)) < 0) { + if (res != -EAGAIN) { + fprintf(stderr, "Error decoding frame: %s\n", + strerror(-res)); + } else + res = 0; + break; + } else { + if (!n_out) { + if ((res = output_open(&out, cli_settings.muxer, + cli_settings.outputfile, + &p.p, fps)) < 0) + { + return res; + } + } + if ((res = output_write(out, &p)) < 0) + break; + n_out++; + if (!cli_settings.quiet) + print_stats(istty, n_out, total); + } + } + + input_close(in); + if (out) { + if (!cli_settings.quiet && istty) + fprintf(stderr, "\n"); + output_close(out); + } else { + fprintf(stderr, "No data decoded\n"); + res = 1; + } + dav1d_close(c); + + return res; +} |