11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./vpxenc.h" 129b35249446b07f40ac5fcc3205f2c048616efacchkuang#include "./vpx_config.h" 131b362b15af34006e6a11974088a46d42b903418eJohann 142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include <assert.h> 152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include <limits.h> 169b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <math.h> 172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include <stdarg.h> 181b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 191b362b15af34006e6a11974088a46d42b903418eJohann#include <stdlib.h> 201b362b15af34006e6a11974088a46d42b903418eJohann#include <string.h> 212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_LIBYUV 237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "third_party/libyuv/include/libyuv/scale.h" 247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 261b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx/vpx_encoder.h" 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_DECODERS 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_decoder.h" 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./args.h" 322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./ivfenc.h" 332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./tools_common.h" 345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 3568e1c830ade592be74773e249bf94e2bbfb50de7Johann#if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER 361b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx/vp8cx.h" 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 3868e1c830ade592be74773e249bf94e2bbfb50de7Johann#if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vp8dx.h" 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vpx/vpx_integer.h" 431b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_ports/mem_ops.h" 441b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_ports/vpx_timer.h" 452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./rate_hist.h" 469b35249446b07f40ac5fcc3205f2c048616efacchkuang#include "./vpxstats.h" 472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./warnings.h" 48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 499b35249446b07f40ac5fcc3205f2c048616efacchkuang#include "./webmenc.h" 50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 519b35249446b07f40ac5fcc3205f2c048616efacchkuang#include "./y4minput.h" 521b362b15af34006e6a11974088a46d42b903418eJohann 531b362b15af34006e6a11974088a46d42b903418eJohann/* Swallow warnings about unused results of fread/fwrite */ 547bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic size_t wrap_fread(void *ptr, size_t size, size_t nmemb, FILE *stream) { 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return fread(ptr, size, nmemb, stream); 561b362b15af34006e6a11974088a46d42b903418eJohann} 571b362b15af34006e6a11974088a46d42b903418eJohann#define fread wrap_fread 581b362b15af34006e6a11974088a46d42b903418eJohann 591b362b15af34006e6a11974088a46d42b903418eJohannstatic size_t wrap_fwrite(const void *ptr, size_t size, size_t nmemb, 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *stream) { 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return fwrite(ptr, size, nmemb, stream); 621b362b15af34006e6a11974088a46d42b903418eJohann} 631b362b15af34006e6a11974088a46d42b903418eJohann#define fwrite wrap_fwrite 641b362b15af34006e6a11974088a46d42b903418eJohann 651b362b15af34006e6a11974088a46d42b903418eJohannstatic const char *exec_name; 661b362b15af34006e6a11974088a46d42b903418eJohann 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void warn_or_exit_on_errorv(vpx_codec_ctx_t *ctx, int fatal, 68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *s, va_list ap) { 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ctx->err) { 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *detail = vpx_codec_error_detail(ctx); 711b362b15af34006e6a11974088a46d42b903418eJohann 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vfprintf(stderr, s, ap); 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, ": %s\n", vpx_codec_error(ctx)); 741b362b15af34006e6a11974088a46d42b903418eJohann 757bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (detail) fprintf(stderr, " %s\n", detail); 761b362b15af34006e6a11974088a46d42b903418eJohann 777bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (fatal) exit(EXIT_FAILURE); 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 801b362b15af34006e6a11974088a46d42b903418eJohann 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void ctx_exit_on_error(vpx_codec_ctx_t *ctx, const char *s, ...) { 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_list ap; 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_start(ap, s); 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn_or_exit_on_errorv(ctx, 1, s, ap); 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_end(ap); 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void warn_or_exit_on_error(vpx_codec_ctx_t *ctx, int fatal, 90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *s, ...) { 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_list ap; 92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_start(ap, s); 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn_or_exit_on_errorv(ctx, fatal, s, ap); 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang va_end(ap); 961b362b15af34006e6a11974088a46d42b903418eJohann} 971b362b15af34006e6a11974088a46d42b903418eJohann 987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic int read_frame(struct VpxInputContext *input_ctx, vpx_image_t *img) { 992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE *f = input_ctx->file; 1002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_input *y4m = &input_ctx->y4m; 101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int shortread = 0; 102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (input_ctx->file_type == FILE_TYPE_Y4M) { 1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (y4m_input_fetch_frame(y4m, f, img) < 1) return 0; 105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian shortread = read_yuv_frame(input_ctx, img); 107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1081b362b15af34006e6a11974088a46d42b903418eJohann 109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return !shortread; 1101b362b15af34006e6a11974088a46d42b903418eJohann} 1111b362b15af34006e6a11974088a46d42b903418eJohann 1127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic int file_is_y4m(const char detect[4]) { 113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (memcmp(detect, "YUV4", 4) == 0) { 114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 1; 115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 1171b362b15af34006e6a11974088a46d42b903418eJohann} 1181b362b15af34006e6a11974088a46d42b903418eJohann 1197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic int fourcc_is_ivf(const char detect[4]) { 1202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (memcmp(detect, "DKIF", 4) == 0) { 1212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian return 1; 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian return 0; 1241b362b15af34006e6a11974088a46d42b903418eJohann} 1251b362b15af34006e6a11974088a46d42b903418eJohann 1267bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t debugmode = 1277bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("D", "debug", 0, "Debug mode (makes output deterministic)"); 1287bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t outputfile = 1297bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("o", "output", 1, "Output filename"); 1307bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_yv12 = 1317bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "yv12", 0, "Input file is YV12 "); 1327bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_i420 = 1337bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "i420", 0, "Input file is I420 (default)"); 1347bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_i422 = 1357bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "i422", 0, "Input file is I422"); 1367bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_i444 = 1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "i444", 0, "Input file is I444"); 1387bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_i440 = 1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "i440", 0, "Input file is I440"); 1407bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t codecarg = ARG_DEF(NULL, "codec", 1, "Codec to use"); 1417bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t passes = 1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("p", "passes", 1, "Number of passes (1/2)"); 1437bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t pass_arg = 1447bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "pass", 1, "Pass to execute (1/2)"); 1457bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t fpf_name = 1467bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "fpf", 1, "First pass statistics file name"); 147ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 1487bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t fpmbf_name = 1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "fpmbf", 1, "First pass block statistics file name"); 150ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 1517bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t limit = 1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "limit", 1, "Stop encoding after n input frames"); 1537bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t skip = 1547bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "skip", 1, "Skip the first n input frames"); 1557bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t deadline = 1567bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("d", "deadline", 1, "Deadline per frame (usec)"); 1577bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t best_dl = 1587bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "best", 0, "Use Best Quality Deadline"); 1597bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t good_dl = 1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "good", 0, "Use Good Quality Deadline"); 1617bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t rt_dl = 1627bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "rt", 0, "Use Realtime Quality Deadline"); 1637bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t quietarg = 1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("q", "quiet", 0, "Do not print encode progress"); 1657bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t verbosearg = 1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("v", "verbose", 0, "Show encoder parameters"); 1677bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t psnrarg = 1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "psnr", 0, "Show PSNR in status line"); 1692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic const struct arg_enum_list test_decode_enum[] = { 1717bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "off", TEST_DECODE_OFF }, 1727bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "fatal", TEST_DECODE_FATAL }, 1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "warn", TEST_DECODE_WARN }, 1747bc9febe8749e98a3812a0dc4380ceae75c29450Johann { NULL, 0 } 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 1767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t recontest = ARG_DEF_ENUM( 1777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian NULL, "test-decode", 1, "Test encode/decode mismatch", test_decode_enum); 1787bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t framerate = 1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "fps", 1, "Stream frame rate (rate/scale)"); 1807bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_webm = 1817bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "webm", 0, "Output WebM (default when WebM IO is enabled)"); 1827bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t use_ivf = ARG_DEF(NULL, "ivf", 0, "Output IVF"); 1837bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t out_part = 1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("P", "output-partitions", 0, 1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Makes encoder output partitions. Requires IVF output!"); 1867bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t q_hist_n = 1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "q-hist", 1, "Show quantizer histogram (n-buckets)"); 1887bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t rate_hist_n = 1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "rate-hist", 1, "Show rate histogram (n-buckets)"); 1907bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t disable_warnings = 1917bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "disable-warnings", 0, 1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Disable warnings about potentially incorrect encode settings."); 1937bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t disable_warning_prompt = 1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("y", "disable-warning-prompt", 0, 1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Display warnings, but do not prompt user to continue."); 1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t test16bitinternalarg = ARG_DEF( 1997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian NULL, "test-16bit-internal", 0, "Force use of 16 bit internal buffer"); 2007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 2012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2027bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t *main_args[] = { &debugmode, 2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann &outputfile, 2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann &codecarg, 2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann &passes, 2067bc9febe8749e98a3812a0dc4380ceae75c29450Johann &pass_arg, 2077bc9febe8749e98a3812a0dc4380ceae75c29450Johann &fpf_name, 2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann &limit, 2097bc9febe8749e98a3812a0dc4380ceae75c29450Johann &skip, 2107bc9febe8749e98a3812a0dc4380ceae75c29450Johann &deadline, 2117bc9febe8749e98a3812a0dc4380ceae75c29450Johann &best_dl, 2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann &good_dl, 2137bc9febe8749e98a3812a0dc4380ceae75c29450Johann &rt_dl, 2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann &quietarg, 2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann &verbosearg, 2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann &psnrarg, 2177bc9febe8749e98a3812a0dc4380ceae75c29450Johann &use_webm, 2187bc9febe8749e98a3812a0dc4380ceae75c29450Johann &use_ivf, 2197bc9febe8749e98a3812a0dc4380ceae75c29450Johann &out_part, 2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann &q_hist_n, 2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann &rate_hist_n, 2227bc9febe8749e98a3812a0dc4380ceae75c29450Johann &disable_warnings, 2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann &disable_warning_prompt, 2247bc9febe8749e98a3812a0dc4380ceae75c29450Johann &recontest, 2257bc9febe8749e98a3812a0dc4380ceae75c29450Johann NULL }; 2267bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2277bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t usage = 2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("u", "usage", 1, "Usage profile number to use"); 2297bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t threads = 2307bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF("t", "threads", 1, "Max number of threads to use"); 2317bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t profile = 2327bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "profile", 1, "Bitstream profile number to use"); 2337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t width = ARG_DEF("w", "width", 1, "Frame width"); 2347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t height = ARG_DEF("h", "height", 1, "Frame height"); 235ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 2361b362b15af34006e6a11974088a46d42b903418eJohannstatic const struct arg_enum_list stereo_mode_enum[] = { 2377bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "mono", STEREO_FORMAT_MONO }, 2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "left-right", STEREO_FORMAT_LEFT_RIGHT }, 2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "bottom-top", STEREO_FORMAT_BOTTOM_TOP }, 2407bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "top-bottom", STEREO_FORMAT_TOP_BOTTOM }, 2417bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "right-left", STEREO_FORMAT_RIGHT_LEFT }, 2427bc9febe8749e98a3812a0dc4380ceae75c29450Johann { NULL, 0 } 2431b362b15af34006e6a11974088a46d42b903418eJohann}; 2447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t stereo_mode = ARG_DEF_ENUM( 2457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian NULL, "stereo-mode", 1, "Stereo 3D video format", stereo_mode_enum); 246ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 2477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t timebase = ARG_DEF( 2487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian NULL, "timebase", 1, "Output timestamp precision (fractional seconds)"); 2497bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t error_resilient = 2507bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "error-resilient", 1, "Enable error resiliency features"); 2517bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t lag_in_frames = 2527bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "lag-in-frames", 1, "Max number of frames to lag"); 2537bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2547bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t *global_args[] = { &use_yv12, 2557bc9febe8749e98a3812a0dc4380ceae75c29450Johann &use_i420, 2567bc9febe8749e98a3812a0dc4380ceae75c29450Johann &use_i422, 2577bc9febe8749e98a3812a0dc4380ceae75c29450Johann &use_i444, 2587bc9febe8749e98a3812a0dc4380ceae75c29450Johann &use_i440, 2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann &usage, 2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann &threads, 2617bc9febe8749e98a3812a0dc4380ceae75c29450Johann &profile, 2627bc9febe8749e98a3812a0dc4380ceae75c29450Johann &width, 2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann &height, 264ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 2657bc9febe8749e98a3812a0dc4380ceae75c29450Johann &stereo_mode, 266ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 2677bc9febe8749e98a3812a0dc4380ceae75c29450Johann &timebase, 2687bc9febe8749e98a3812a0dc4380ceae75c29450Johann &framerate, 2697bc9febe8749e98a3812a0dc4380ceae75c29450Johann &error_resilient, 2707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann &test16bitinternalarg, 2727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 2737bc9febe8749e98a3812a0dc4380ceae75c29450Johann &lag_in_frames, 2747bc9febe8749e98a3812a0dc4380ceae75c29450Johann NULL }; 2757bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2767bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t dropframe_thresh = 2777bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "drop-frame", 1, "Temporal resampling threshold (buf %)"); 2787bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t resize_allowed = 2797bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "resize-allowed", 1, "Spatial resampling enabled (bool)"); 2807bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t resize_width = 2817bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "resize-width", 1, "Width of encoded frame"); 2827bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t resize_height = 2837bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "resize-height", 1, "Height of encoded frame"); 2847bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t resize_up_thresh = 2857bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "resize-up", 1, "Upscale threshold (buf %)"); 2867bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t resize_down_thresh = 2877bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "resize-down", 1, "Downscale threshold (buf %)"); 2887bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const struct arg_enum_list end_usage_enum[] = { { "vbr", VPX_VBR }, 2897bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "cbr", VPX_CBR }, 2907bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "cq", VPX_CQ }, 2917bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "q", VPX_Q }, 2927bc9febe8749e98a3812a0dc4380ceae75c29450Johann { NULL, 0 } }; 2937bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t end_usage = 2947bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF_ENUM(NULL, "end-usage", 1, "Rate control mode", end_usage_enum); 2957bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t target_bitrate = 2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "target-bitrate", 1, "Bitrate (kbps)"); 2977bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t min_quantizer = 2987bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "min-q", 1, "Minimum (best) quantizer"); 2997bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t max_quantizer = 3007bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "max-q", 1, "Maximum (worst) quantizer"); 3017bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t undershoot_pct = 3027bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "undershoot-pct", 1, "Datarate undershoot (min) target (%)"); 3037bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t overshoot_pct = 3047bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "overshoot-pct", 1, "Datarate overshoot (max) target (%)"); 3057bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t buf_sz = 3067bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "buf-sz", 1, "Client buffer size (ms)"); 3077bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t buf_initial_sz = 3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "buf-initial-sz", 1, "Client initial buffer size (ms)"); 3097bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t buf_optimal_sz = 3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "buf-optimal-sz", 1, "Client optimal buffer size (ms)"); 311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic const arg_def_t *rc_args[] = { 3127bc9febe8749e98a3812a0dc4380ceae75c29450Johann &dropframe_thresh, &resize_allowed, &resize_width, &resize_height, 3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann &resize_up_thresh, &resize_down_thresh, &end_usage, &target_bitrate, 3147bc9febe8749e98a3812a0dc4380ceae75c29450Johann &min_quantizer, &max_quantizer, &undershoot_pct, &overshoot_pct, 3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann &buf_sz, &buf_initial_sz, &buf_optimal_sz, NULL 3161b362b15af34006e6a11974088a46d42b903418eJohann}; 3171b362b15af34006e6a11974088a46d42b903418eJohann 3187bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t bias_pct = 3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "bias-pct", 1, "CBR/VBR bias (0=CBR, 100=VBR)"); 3207bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t minsection_pct = 3217bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "minsection-pct", 1, "GOP min bitrate (% of target)"); 3227bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t maxsection_pct = 3237bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "maxsection-pct", 1, "GOP max bitrate (% of target)"); 3247bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t *rc_twopass_args[] = { &bias_pct, &minsection_pct, 3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann &maxsection_pct, NULL }; 3267bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3277bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t kf_min_dist = 3287bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "kf-min-dist", 1, "Minimum keyframe interval (frames)"); 3297bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t kf_max_dist = 3307bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "kf-max-dist", 1, "Maximum keyframe interval (frames)"); 3317bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t kf_disabled = 3327bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "disable-kf", 0, "Disable keyframe placement"); 3337bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t *kf_args[] = { &kf_min_dist, &kf_max_dist, &kf_disabled, 3347bc9febe8749e98a3812a0dc4380ceae75c29450Johann NULL }; 3357bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3367bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t noise_sens = 3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "noise-sensitivity", 1, "Noise sensitivity (frames to blur)"); 3387bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t sharpness = 3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "sharpness", 1, "Loop filter sharpness (0..7)"); 3407bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t static_thresh = 3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "static-thresh", 1, "Motion detection threshold"); 3427bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t auto_altref = 3437bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "auto-alt-ref", 1, "Enable automatic alt reference frames"); 3447bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t arnr_maxframes = 3457bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "arnr-maxframes", 1, "AltRef max frames (0..15)"); 3467bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t arnr_strength = 3477bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "arnr-strength", 1, "AltRef filter strength (0..6)"); 3487bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t arnr_type = ARG_DEF(NULL, "arnr-type", 1, "AltRef type"); 3491b362b15af34006e6a11974088a46d42b903418eJohannstatic const struct arg_enum_list tuning_enum[] = { 3507bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "psnr", VP8_TUNE_PSNR }, { "ssim", VP8_TUNE_SSIM }, { NULL, 0 } 3511b362b15af34006e6a11974088a46d42b903418eJohann}; 3527bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t tune_ssim = 3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF_ENUM(NULL, "tune", 1, "Material to favor", tuning_enum); 3547bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t cq_level = 3557bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "cq-level", 1, "Constant/Constrained Quality level"); 3567bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t max_intra_rate_pct = 3577bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "max-intra-rate", 1, "Max I-frame bitrate (pct)"); 3587bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t gf_cbr_boost_pct = ARG_DEF( 3597bc9febe8749e98a3812a0dc4380ceae75c29450Johann NULL, "gf-cbr-boost", 1, "Boost for Golden Frame in CBR mode (pct)"); 3601b362b15af34006e6a11974088a46d42b903418eJohann 361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER 3627bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t cpu_used_vp8 = 3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "cpu-used", 1, "CPU Used (-16..16)"); 3647bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t token_parts = 3657bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "token-parts", 1, "Number of token partitions to use, log2"); 3667bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t screen_content_mode = 3677bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "screen-content-mode", 1, "Screen content mode"); 3687bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t *vp8_args[] = { &cpu_used_vp8, 3697bc9febe8749e98a3812a0dc4380ceae75c29450Johann &auto_altref, 3707bc9febe8749e98a3812a0dc4380ceae75c29450Johann &noise_sens, 3717bc9febe8749e98a3812a0dc4380ceae75c29450Johann &sharpness, 3727bc9febe8749e98a3812a0dc4380ceae75c29450Johann &static_thresh, 3737bc9febe8749e98a3812a0dc4380ceae75c29450Johann &token_parts, 3747bc9febe8749e98a3812a0dc4380ceae75c29450Johann &arnr_maxframes, 3757bc9febe8749e98a3812a0dc4380ceae75c29450Johann &arnr_strength, 3767bc9febe8749e98a3812a0dc4380ceae75c29450Johann &arnr_type, 3777bc9febe8749e98a3812a0dc4380ceae75c29450Johann &tune_ssim, 3787bc9febe8749e98a3812a0dc4380ceae75c29450Johann &cq_level, 3797bc9febe8749e98a3812a0dc4380ceae75c29450Johann &max_intra_rate_pct, 3807bc9febe8749e98a3812a0dc4380ceae75c29450Johann &gf_cbr_boost_pct, 3817bc9febe8749e98a3812a0dc4380ceae75c29450Johann &screen_content_mode, 3827bc9febe8749e98a3812a0dc4380ceae75c29450Johann NULL }; 3837bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int vp8_arg_ctrl_map[] = { VP8E_SET_CPUUSED, 3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ENABLEAUTOALTREF, 3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_NOISE_SENSITIVITY, 3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_SHARPNESS, 3877bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_STATIC_THRESHOLD, 3887bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_TOKEN_PARTITIONS, 3897bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ARNR_MAXFRAMES, 3907bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ARNR_STRENGTH, 3917bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ARNR_TYPE, 3927bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_TUNING, 3937bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_CQ_LEVEL, 3947bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_MAX_INTRA_BITRATE_PCT, 3957bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_GF_CBR_BOOST_PCT, 3967bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_SCREEN_CONTENT_MODE, 3977bc9febe8749e98a3812a0dc4380ceae75c29450Johann 0 }; 398ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 40068e1c830ade592be74773e249bf94e2bbfb50de7Johann#if CONFIG_VP9_ENCODER 4017bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t cpu_used_vp9 = 4027bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "cpu-used", 1, "CPU Used (-8..8)"); 4037bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t tile_cols = 4047bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "tile-columns", 1, "Number of tile columns to use, log2"); 4057bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t tile_rows = 4067bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "tile-rows", 1, 4077bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Number of tile rows to use, log2 (set to 0 while threads > 1)"); 4087bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t lossless = 4097bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "lossless", 1, "Lossless mode (0: false (default), 1: true)"); 4102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic const arg_def_t frame_parallel_decoding = ARG_DEF( 4112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian NULL, "frame-parallel", 1, "Enable frame parallel decodability features"); 4122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic const arg_def_t aq_mode = ARG_DEF( 4132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian NULL, "aq-mode", 1, 414ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "Adaptive quantization mode (0: off (default), 1: variance 2: complexity, " 41568e1c830ade592be74773e249bf94e2bbfb50de7Johann "3: cyclic refresh, 4: equator360)"); 4167bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t alt_ref_aq = ARG_DEF(NULL, "alt-ref-aq", 1, 4177bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Special adaptive quantization for " 4187bc9febe8749e98a3812a0dc4380ceae75c29450Johann "the alternate reference frames."); 4197bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t frame_periodic_boost = 4207bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "frame-boost", 1, 4217bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Enable frame periodic boost (0: off (default), 1: on)"); 4227bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t max_inter_rate_pct = 4237bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "max-inter-rate", 1, "Max P-frame bitrate (pct)"); 4247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t min_gf_interval = ARG_DEF( 4257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian NULL, "min-gf-interval", 1, 4267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian "min gf/arf frame interval (default 0, indicating in-built behavior)"); 4277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t max_gf_interval = ARG_DEF( 4287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian NULL, "max-gf-interval", 1, 4297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian "max gf/arf frame interval (default 0, indicating in-built behavior)"); 4307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 4317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const struct arg_enum_list color_space_enum[] = { 4327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "unknown", VPX_CS_UNKNOWN }, 4337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "bt601", VPX_CS_BT_601 }, 4347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "bt709", VPX_CS_BT_709 }, 4357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "smpte170", VPX_CS_SMPTE_170 }, 4367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "smpte240", VPX_CS_SMPTE_240 }, 4377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "bt2020", VPX_CS_BT_2020 }, 4387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "reserved", VPX_CS_RESERVED }, 4397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { "sRGB", VPX_CS_SRGB }, 4407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian { NULL, 0 } 4417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}; 4427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 4437bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t input_color_space = 4447bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF_ENUM(NULL, "color-space", 1, "The color space of input content:", 4457bc9febe8749e98a3812a0dc4380ceae75c29450Johann color_space_enum); 4467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 4477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 4487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const struct arg_enum_list bitdepth_enum[] = { 4497bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "8", VPX_BITS_8 }, { "10", VPX_BITS_10 }, { "12", VPX_BITS_12 }, { NULL, 0 } 4507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}; 4517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 4527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic const arg_def_t bitdeptharg = ARG_DEF_ENUM( 4537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian "b", "bit-depth", 1, 4547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian "Bit depth for codec (8 for version <=1, 10 or 12 for version 2)", 4557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian bitdepth_enum); 4567bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t inbitdeptharg = 4577bc9febe8749e98a3812a0dc4380ceae75c29450Johann ARG_DEF(NULL, "input-bit-depth", 1, "Bit depth of input"); 4587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 459ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 460ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstatic const struct arg_enum_list tune_content_enum[] = { 4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "default", VP9E_CONTENT_DEFAULT }, 4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann { "screen", VP9E_CONTENT_SCREEN }, 4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann { NULL, 0 } 464ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian}; 465ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 466ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstatic const arg_def_t tune_content = ARG_DEF_ENUM( 467ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian NULL, "tune-content", 1, "Tune content type", tune_content_enum); 46868e1c830ade592be74773e249bf94e2bbfb50de7Johann 46968e1c830ade592be74773e249bf94e2bbfb50de7Johannstatic const arg_def_t target_level = ARG_DEF( 47068e1c830ade592be74773e249bf94e2bbfb50de7Johann NULL, "target-level", 1, 47168e1c830ade592be74773e249bf94e2bbfb50de7Johann "Target level (255: off (default); 0: only keep level stats; 10: level 1.0;" 47268e1c830ade592be74773e249bf94e2bbfb50de7Johann " 11: level 1.1; ... 62: level 6.2)"); 4730a39d0a697ff3603e8c100300fda363658e10b23James Zern 4740a39d0a697ff3603e8c100300fda363658e10b23James Zernstatic const arg_def_t row_mt = 4750a39d0a697ff3603e8c100300fda363658e10b23James Zern ARG_DEF(NULL, "row-mt", 1, 4760a39d0a697ff3603e8c100300fda363658e10b23James Zern "Enable row based non-deterministic multi-threading in VP9"); 4777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 4782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 4797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_ENCODER 4807bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const arg_def_t *vp9_args[] = { &cpu_used_vp9, 4817bc9febe8749e98a3812a0dc4380ceae75c29450Johann &auto_altref, 4827bc9febe8749e98a3812a0dc4380ceae75c29450Johann &sharpness, 4837bc9febe8749e98a3812a0dc4380ceae75c29450Johann &static_thresh, 4847bc9febe8749e98a3812a0dc4380ceae75c29450Johann &tile_cols, 4857bc9febe8749e98a3812a0dc4380ceae75c29450Johann &tile_rows, 4867bc9febe8749e98a3812a0dc4380ceae75c29450Johann &arnr_maxframes, 4877bc9febe8749e98a3812a0dc4380ceae75c29450Johann &arnr_strength, 4887bc9febe8749e98a3812a0dc4380ceae75c29450Johann &arnr_type, 4897bc9febe8749e98a3812a0dc4380ceae75c29450Johann &tune_ssim, 4907bc9febe8749e98a3812a0dc4380ceae75c29450Johann &cq_level, 4917bc9febe8749e98a3812a0dc4380ceae75c29450Johann &max_intra_rate_pct, 4927bc9febe8749e98a3812a0dc4380ceae75c29450Johann &max_inter_rate_pct, 4937bc9febe8749e98a3812a0dc4380ceae75c29450Johann &gf_cbr_boost_pct, 4947bc9febe8749e98a3812a0dc4380ceae75c29450Johann &lossless, 4957bc9febe8749e98a3812a0dc4380ceae75c29450Johann &frame_parallel_decoding, 4967bc9febe8749e98a3812a0dc4380ceae75c29450Johann &aq_mode, 4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann &alt_ref_aq, 4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann &frame_periodic_boost, 4997bc9febe8749e98a3812a0dc4380ceae75c29450Johann &noise_sens, 5007bc9febe8749e98a3812a0dc4380ceae75c29450Johann &tune_content, 5017bc9febe8749e98a3812a0dc4380ceae75c29450Johann &input_color_space, 5027bc9febe8749e98a3812a0dc4380ceae75c29450Johann &min_gf_interval, 5037bc9febe8749e98a3812a0dc4380ceae75c29450Johann &max_gf_interval, 5047bc9febe8749e98a3812a0dc4380ceae75c29450Johann &target_level, 5050a39d0a697ff3603e8c100300fda363658e10b23James Zern &row_mt, 50668e1c830ade592be74773e249bf94e2bbfb50de7Johann#if CONFIG_VP9_HIGHBITDEPTH 5077bc9febe8749e98a3812a0dc4380ceae75c29450Johann &bitdeptharg, 5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann &inbitdeptharg, 50968e1c830ade592be74773e249bf94e2bbfb50de7Johann#endif // CONFIG_VP9_HIGHBITDEPTH 5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann NULL }; 5117bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int vp9_arg_ctrl_map[] = { VP8E_SET_CPUUSED, 5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ENABLEAUTOALTREF, 5137bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_SHARPNESS, 5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_STATIC_THRESHOLD, 5157bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_TILE_COLUMNS, 5167bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_TILE_ROWS, 5177bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ARNR_MAXFRAMES, 5187bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ARNR_STRENGTH, 5197bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_ARNR_TYPE, 5207bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_TUNING, 5217bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_CQ_LEVEL, 5227bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8E_SET_MAX_INTRA_BITRATE_PCT, 5237bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_MAX_INTER_BITRATE_PCT, 5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_GF_CBR_BOOST_PCT, 5257bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_LOSSLESS, 5267bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_FRAME_PARALLEL_DECODING, 5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_AQ_MODE, 5287bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_ALT_REF_AQ, 5297bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_FRAME_PERIODIC_BOOST, 5307bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_NOISE_SENSITIVITY, 5317bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_TUNE_CONTENT, 5327bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_COLOR_SPACE, 5337bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_MIN_GF_INTERVAL, 5347bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_MAX_GF_INTERVAL, 5357bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP9E_SET_TARGET_LEVEL, 5360a39d0a697ff3603e8c100300fda363658e10b23James Zern VP9E_SET_ROW_MT, 5377bc9febe8749e98a3812a0dc4380ceae75c29450Johann 0 }; 5381b362b15af34006e6a11974088a46d42b903418eJohann#endif 5391b362b15af34006e6a11974088a46d42b903418eJohann 5401b362b15af34006e6a11974088a46d42b903418eJohannstatic const arg_def_t *no_args[] = { NULL }; 5411b362b15af34006e6a11974088a46d42b903418eJohann 5427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid usage_exit(void) { 543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 5447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int num_encoder = get_vpx_encoder_count(); 545ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 546ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "Usage: %s <options> -o dst_filename src_filename \n", 547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang exec_name); 548ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nOptions:\n"); 55091037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, main_args); 551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nEncoder Global Options:\n"); 55291037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, global_args); 553ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nRate Control Options:\n"); 55491037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, rc_args); 555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nTwopass Rate Control Options:\n"); 55691037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, rc_twopass_args); 557ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nKeyframe Placement Options:\n"); 55891037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, kf_args); 5591b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_VP8_ENCODER 560ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nVP8 Specific Options:\n"); 56191037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, vp8_args); 5621b362b15af34006e6a11974088a46d42b903418eJohann#endif 563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER 564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nVP9 Specific Options:\n"); 56591037db265ecdd914a26e056cf69207b4f50924ehkuang arg_show_usage(stderr, vp9_args); 566ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(stderr, 5687bc9febe8749e98a3812a0dc4380ceae75c29450Johann "\nStream timebase (--timebase):\n" 569ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " The desired precision of timestamps in the output, expressed\n" 570ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " in fractional seconds. Default is 1/1000.\n"); 5712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian fprintf(stderr, "\nIncluded encoders:\n\n"); 572ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0; i < num_encoder; ++i) { 5742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const VpxInterface *const encoder = get_vpx_encoder_by_index(i); 5757bc9febe8749e98a3812a0dc4380ceae75c29450Johann const char *defstr = (i == (num_encoder - 1)) ? "(default)" : ""; 5767bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(stderr, " %-6s - %s %s\n", encoder->name, 5777bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_codec_iface_name(encoder->codec_interface()), defstr); 578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 5797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian fprintf(stderr, "\n "); 5807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian fprintf(stderr, "Use --codec to switch to a non-default encoder.\n\n"); 581ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 5822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian exit(EXIT_FAILURE); 583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 5841b362b15af34006e6a11974088a46d42b903418eJohann 5857bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define mmin(a, b) ((a) < (b) ? (a) : (b)) 5867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 5877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 5887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic void find_mismatch_high(const vpx_image_t *const img1, 5897bc9febe8749e98a3812a0dc4380ceae75c29450Johann const vpx_image_t *const img2, int yloc[4], 5907bc9febe8749e98a3812a0dc4380ceae75c29450Johann int uloc[4], int vloc[4]) { 5917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uint16_t *plane1, *plane2; 5927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uint32_t stride1, stride2; 5937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const uint32_t bsize = 64; 5947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const uint32_t bsizey = bsize >> img1->y_chroma_shift; 5957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const uint32_t bsizex = bsize >> img1->x_chroma_shift; 5967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const uint32_t c_w = 5977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; 5987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const uint32_t c_h = 5997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; 6007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int match = 1; 6017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uint32_t i, j; 6027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian yloc[0] = yloc[1] = yloc[2] = yloc[3] = -1; 6037bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane1 = (uint16_t *)img1->planes[VPX_PLANE_Y]; 6047bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane2 = (uint16_t *)img2->planes[VPX_PLANE_Y]; 6057bc9febe8749e98a3812a0dc4380ceae75c29450Johann stride1 = img1->stride[VPX_PLANE_Y] / 2; 6067bc9febe8749e98a3812a0dc4380ceae75c29450Johann stride2 = img2->stride[VPX_PLANE_Y] / 2; 6077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0, match = 1; match && i < img1->d_h; i += bsize) { 6087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (j = 0; match && j < img1->d_w; j += bsize) { 6097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int k, l; 6107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int si = mmin(i + bsize, img1->d_h) - i; 6117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int sj = mmin(j + bsize, img1->d_w) - j; 6127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (k = 0; match && k < si; ++k) { 6137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (l = 0; match && l < sj; ++l) { 6147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (*(plane1 + (i + k) * stride1 + j + l) != 6157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *(plane2 + (i + k) * stride2 + j + l)) { 6167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian yloc[0] = i + k; 6177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian yloc[1] = j + l; 6187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian yloc[2] = *(plane1 + (i + k) * stride1 + j + l); 6197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian yloc[3] = *(plane2 + (i + k) * stride2 + j + l); 6207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian match = 0; 6217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 6287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uloc[0] = uloc[1] = uloc[2] = uloc[3] = -1; 6297bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane1 = (uint16_t *)img1->planes[VPX_PLANE_U]; 6307bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane2 = (uint16_t *)img2->planes[VPX_PLANE_U]; 6317bc9febe8749e98a3812a0dc4380ceae75c29450Johann stride1 = img1->stride[VPX_PLANE_U] / 2; 6327bc9febe8749e98a3812a0dc4380ceae75c29450Johann stride2 = img2->stride[VPX_PLANE_U] / 2; 6337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0, match = 1; match && i < c_h; i += bsizey) { 6347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (j = 0; match && j < c_w; j += bsizex) { 6357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int k, l; 6367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int si = mmin(i + bsizey, c_h - i); 6377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int sj = mmin(j + bsizex, c_w - j); 6387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (k = 0; match && k < si; ++k) { 6397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (l = 0; match && l < sj; ++l) { 6407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (*(plane1 + (i + k) * stride1 + j + l) != 6417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *(plane2 + (i + k) * stride2 + j + l)) { 6427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uloc[0] = i + k; 6437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uloc[1] = j + l; 6447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uloc[2] = *(plane1 + (i + k) * stride1 + j + l); 6457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uloc[3] = *(plane2 + (i + k) * stride2 + j + l); 6467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian match = 0; 6477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 6547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vloc[0] = vloc[1] = vloc[2] = vloc[3] = -1; 6557bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane1 = (uint16_t *)img1->planes[VPX_PLANE_V]; 6567bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane2 = (uint16_t *)img2->planes[VPX_PLANE_V]; 6577bc9febe8749e98a3812a0dc4380ceae75c29450Johann stride1 = img1->stride[VPX_PLANE_V] / 2; 6587bc9febe8749e98a3812a0dc4380ceae75c29450Johann stride2 = img2->stride[VPX_PLANE_V] / 2; 6597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0, match = 1; match && i < c_h; i += bsizey) { 6607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (j = 0; match && j < c_w; j += bsizex) { 6617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int k, l; 6627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int si = mmin(i + bsizey, c_h - i); 6637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int sj = mmin(j + bsizex, c_w - j); 6647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (k = 0; match && k < si; ++k) { 6657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (l = 0; match && l < sj; ++l) { 6667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (*(plane1 + (i + k) * stride1 + j + l) != 6677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *(plane2 + (i + k) * stride2 + j + l)) { 6687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vloc[0] = i + k; 6697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vloc[1] = j + l; 6707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vloc[2] = *(plane1 + (i + k) * stride1 + j + l); 6717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vloc[3] = *(plane2 + (i + k) * stride2 + j + l); 6727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian match = 0; 6737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 6747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 6797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 6807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 6817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 6822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void find_mismatch(const vpx_image_t *const img1, 6837bc9febe8749e98a3812a0dc4380ceae75c29450Johann const vpx_image_t *const img2, int yloc[4], 6847bc9febe8749e98a3812a0dc4380ceae75c29450Johann int uloc[4], int vloc[4]) { 6852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t bsize = 64; 6862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t bsizey = bsize >> img1->y_chroma_shift; 6872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t bsizex = bsize >> img1->x_chroma_shift; 6882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t c_w = 6892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; 6902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t c_h = 6912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; 6922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int match = 1; 6932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32_t i, j; 694ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yloc[0] = yloc[1] = yloc[2] = yloc[3] = -1; 695ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0, match = 1; match && i < img1->d_h; i += bsize) { 696ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (j = 0; match && j < img1->d_w; j += bsize) { 697ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int k, l; 6982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int si = mmin(i + bsize, img1->d_h) - i; 6992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int sj = mmin(j + bsize, img1->d_w) - j; 7002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (k = 0; match && k < si; ++k) { 7012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (l = 0; match && l < sj; ++l) { 702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (*(img1->planes[VPX_PLANE_Y] + 703ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img1->stride[VPX_PLANE_Y] + j + l) != 704ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *(img2->planes[VPX_PLANE_Y] + 705ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img2->stride[VPX_PLANE_Y] + j + l)) { 706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yloc[0] = i + k; 707ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yloc[1] = j + l; 708ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yloc[2] = *(img1->planes[VPX_PLANE_Y] + 709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img1->stride[VPX_PLANE_Y] + j + l); 710ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yloc[3] = *(img2->planes[VPX_PLANE_Y] + 711ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img2->stride[VPX_PLANE_Y] + j + l); 712ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang match = 0; 7131b362b15af34006e6a11974088a46d42b903418eJohann break; 714ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 715ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 7162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 7171b362b15af34006e6a11974088a46d42b903418eJohann } 718ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 719ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 720ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uloc[0] = uloc[1] = uloc[2] = uloc[3] = -1; 721ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0, match = 1; match && i < c_h; i += bsizey) { 722ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (j = 0; match && j < c_w; j += bsizex) { 723ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int k, l; 7242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int si = mmin(i + bsizey, c_h - i); 7252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int sj = mmin(j + bsizex, c_w - j); 7262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (k = 0; match && k < si; ++k) { 7272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (l = 0; match && l < sj; ++l) { 728ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (*(img1->planes[VPX_PLANE_U] + 729ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img1->stride[VPX_PLANE_U] + j + l) != 730ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *(img2->planes[VPX_PLANE_U] + 731ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img2->stride[VPX_PLANE_U] + j + l)) { 732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uloc[0] = i + k; 733ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uloc[1] = j + l; 734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uloc[2] = *(img1->planes[VPX_PLANE_U] + 735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img1->stride[VPX_PLANE_U] + j + l); 736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uloc[3] = *(img2->planes[VPX_PLANE_U] + 7372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian (i + k) * img2->stride[VPX_PLANE_U] + j + l); 738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang match = 0; 739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 740ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 741ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 7422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 743ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 745ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vloc[0] = vloc[1] = vloc[2] = vloc[3] = -1; 746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0, match = 1; match && i < c_h; i += bsizey) { 747ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (j = 0; match && j < c_w; j += bsizex) { 748ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int k, l; 7492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int si = mmin(i + bsizey, c_h - i); 7502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int sj = mmin(j + bsizex, c_w - j); 7512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (k = 0; match && k < si; ++k) { 7522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (l = 0; match && l < sj; ++l) { 753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (*(img1->planes[VPX_PLANE_V] + 754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img1->stride[VPX_PLANE_V] + j + l) != 755ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *(img2->planes[VPX_PLANE_V] + 756ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img2->stride[VPX_PLANE_V] + j + l)) { 757ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vloc[0] = i + k; 758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vloc[1] = j + l; 759ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vloc[2] = *(img1->planes[VPX_PLANE_V] + 760ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img1->stride[VPX_PLANE_V] + j + l); 761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vloc[3] = *(img2->planes[VPX_PLANE_V] + 762ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (i + k) * img2->stride[VPX_PLANE_V] + j + l); 763ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang match = 0; 764ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 765ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 7672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 768ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 769ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 7701b362b15af34006e6a11974088a46d42b903418eJohann} 7711b362b15af34006e6a11974088a46d42b903418eJohann 7722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic int compare_img(const vpx_image_t *const img1, 7732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const vpx_image_t *const img2) { 7747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian uint32_t l_w = img1->d_w; 7757bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint32_t c_w = (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; 7762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t c_h = 7772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; 7782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32_t i; 779ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int match = 1; 7801b362b15af34006e6a11974088a46d42b903418eJohann 781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang match &= (img1->fmt == img2->fmt); 7822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian match &= (img1->d_w == img2->d_w); 7832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian match &= (img1->d_h == img2->d_h); 7847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 7857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (img1->fmt & VPX_IMG_FMT_HIGHBITDEPTH) { 7867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian l_w *= 2; 7877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian c_w *= 2; 7887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 7897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 790ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (i = 0; i < img1->d_h; ++i) 7922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian match &= (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y], 7932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y], 7947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian l_w) == 0); 795ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 7962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (i = 0; i < c_h; ++i) 7972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian match &= (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U], 7982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U], 799ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang c_w) == 0); 8001b362b15af34006e6a11974088a46d42b903418eJohann 8012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (i = 0; i < c_h; ++i) 8022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian match &= (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V], 8032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V], 804ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang c_w) == 0); 805ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 806ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return match; 8071b362b15af34006e6a11974088a46d42b903418eJohann} 8081b362b15af34006e6a11974088a46d42b903418eJohann 8097bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define NELEMENTS(x) (sizeof(x) / sizeof(x[0])) 81068e1c830ade592be74773e249bf94e2bbfb50de7Johann#if CONFIG_VP9_ENCODER 811ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define ARG_CTRL_CNT_MAX NELEMENTS(vp9_arg_ctrl_map) 812ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 8137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define ARG_CTRL_CNT_MAX NELEMENTS(vp8_arg_ctrl_map) 814ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 8151b362b15af34006e6a11974088a46d42b903418eJohann 816ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if !CONFIG_WEBM_IO 817ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef int stereo_format_t; 8187bc9febe8749e98a3812a0dc4380ceae75c29450Johannstruct WebmOutputContext { 8197bc9febe8749e98a3812a0dc4380ceae75c29450Johann int debug; 8207bc9febe8749e98a3812a0dc4380ceae75c29450Johann}; 821ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 822ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 8231b362b15af34006e6a11974088a46d42b903418eJohann/* Per-stream configuration */ 824ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct stream_config { 8257bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct vpx_codec_enc_cfg cfg; 8267bc9febe8749e98a3812a0dc4380ceae75c29450Johann const char *out_fn; 8277bc9febe8749e98a3812a0dc4380ceae75c29450Johann const char *stats_fn; 828ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 8297bc9febe8749e98a3812a0dc4380ceae75c29450Johann const char *fpmb_stats_fn; 830ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 8317bc9febe8749e98a3812a0dc4380ceae75c29450Johann stereo_format_t stereo_fmt; 8327bc9febe8749e98a3812a0dc4380ceae75c29450Johann int arg_ctrls[ARG_CTRL_CNT_MAX][2]; 8337bc9febe8749e98a3812a0dc4380ceae75c29450Johann int arg_ctrl_cnt; 8347bc9febe8749e98a3812a0dc4380ceae75c29450Johann int write_webm; 8357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 8367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // whether to use 16bit internal buffers 8377bc9febe8749e98a3812a0dc4380ceae75c29450Johann int use_16bit_internal; 8387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 8391b362b15af34006e6a11974088a46d42b903418eJohann}; 8401b362b15af34006e6a11974088a46d42b903418eJohann 841ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct stream_state { 8427bc9febe8749e98a3812a0dc4380ceae75c29450Johann int index; 8437bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct stream_state *next; 8447bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct stream_config config; 8457bc9febe8749e98a3812a0dc4380ceae75c29450Johann FILE *file; 8467bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct rate_hist *rate_hist; 8477bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct WebmOutputContext webm_ctx; 8487bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint64_t psnr_sse_total; 8497bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint64_t psnr_samples_total; 8507bc9febe8749e98a3812a0dc4380ceae75c29450Johann double psnr_totals[4]; 8517bc9febe8749e98a3812a0dc4380ceae75c29450Johann int psnr_count; 8527bc9febe8749e98a3812a0dc4380ceae75c29450Johann int counts[64]; 8537bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_codec_ctx_t encoder; 8547bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int frames_out; 8557bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint64_t cx_time; 8567bc9febe8749e98a3812a0dc4380ceae75c29450Johann size_t nbytes; 8577bc9febe8749e98a3812a0dc4380ceae75c29450Johann stats_io_t stats; 858ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 8597bc9febe8749e98a3812a0dc4380ceae75c29450Johann stats_io_t fpmb_stats; 860ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 8617bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct vpx_image *img; 8627bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_codec_ctx_t decoder; 8637bc9febe8749e98a3812a0dc4380ceae75c29450Johann int mismatch_seen; 8641b362b15af34006e6a11974088a46d42b903418eJohann}; 8651b362b15af34006e6a11974088a46d42b903418eJohann 8667bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void validate_positive_rational(const char *msg, 8677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian struct vpx_rational *rat) { 868ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (rat->den < 0) { 869ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rat->num *= -1; 870ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rat->den *= -1; 871ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 8721b362b15af34006e6a11974088a46d42b903418eJohann 8737bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (rat->num < 0) die("Error: %s must be positive\n", msg); 8741b362b15af34006e6a11974088a46d42b903418eJohann 8757bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!rat->den) die("Error: %s has zero denominator\n", msg); 8761b362b15af34006e6a11974088a46d42b903418eJohann} 8771b362b15af34006e6a11974088a46d42b903418eJohann 8782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void parse_global_config(struct VpxEncoderConfig *global, char **argv) { 8797bc9febe8749e98a3812a0dc4380ceae75c29450Johann char **argi, **argj; 8807bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct arg arg; 8817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int num_encoder = get_vpx_encoder_count(); 8827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 8837bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (num_encoder < 1) die("Error: no valid encoder available\n"); 884ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 885ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Initialize default parameters */ 886ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memset(global, 0, sizeof(*global)); 8877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian global->codec = get_vpx_encoder_by_index(num_encoder - 1); 8881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang global->passes = 0; 889ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian global->color_type = I420; 8901184aebb761cbeac9124c37189a80a1a58f04b6bhkuang /* Assign default deadline to good quality */ 8911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang global->deadline = VPX_DL_GOOD_QUALITY; 892ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 893ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) { 894ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang arg.argv_step = 1; 895ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (arg_match(&arg, &codecarg, argi)) { 8972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global->codec = get_vpx_encoder_by_name(arg.val); 8982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!global->codec) 8992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian die("Error: Unrecognized argument (%s) to --codec\n", arg.val); 900ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (arg_match(&arg, &passes, argi)) { 901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->passes = arg_parse_uint(&arg); 902ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->passes < 1 || global->passes > 2) 904ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang die("Error: Invalid number of passes (%d)\n", global->passes); 905ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (arg_match(&arg, &pass_arg, argi)) { 906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->pass = arg_parse_uint(&arg); 907ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 908ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->pass < 1 || global->pass > 2) 9097bc9febe8749e98a3812a0dc4380ceae75c29450Johann die("Error: Invalid pass selected (%d)\n", global->pass); 910ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (arg_match(&arg, &usage, argi)) 911ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->usage = arg_parse_uint(&arg); 912ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &deadline, argi)) 913ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->deadline = arg_parse_uint(&arg); 914ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &best_dl, argi)) 915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->deadline = VPX_DL_BEST_QUALITY; 916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &good_dl, argi)) 917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->deadline = VPX_DL_GOOD_QUALITY; 918ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &rt_dl, argi)) 919ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->deadline = VPX_DL_REALTIME; 920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &use_yv12, argi)) 921ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian global->color_type = YV12; 922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &use_i420, argi)) 923ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian global->color_type = I420; 924ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian else if (arg_match(&arg, &use_i422, argi)) 925ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian global->color_type = I422; 926ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian else if (arg_match(&arg, &use_i444, argi)) 927ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian global->color_type = I444; 9287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else if (arg_match(&arg, &use_i440, argi)) 9297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian global->color_type = I440; 930ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &quietarg, argi)) 931ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->quiet = 1; 932ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &verbosearg, argi)) 933ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->verbose = 1; 934ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &limit, argi)) 935ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->limit = arg_parse_uint(&arg); 936ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &skip, argi)) 937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->skip_frames = arg_parse_uint(&arg); 938ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &psnrarg, argi)) 939ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->show_psnr = 1; 940ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &recontest, argi)) 941ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->test_decode = arg_parse_enum_or_int(&arg); 942ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &framerate, argi)) { 943ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->framerate = arg_parse_rational(&arg); 944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang validate_positive_rational(arg.name, &global->framerate); 945ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->have_framerate = 1; 946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (arg_match(&arg, &out_part, argi)) 947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->out_part = 1; 948ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &debugmode, argi)) 949ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->debug = 1; 950ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &q_hist_n, argi)) 951ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->show_q_hist_buckets = arg_parse_uint(&arg); 952ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else if (arg_match(&arg, &rate_hist_n, argi)) 953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->show_rate_hist_buckets = arg_parse_uint(&arg); 9542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian else if (arg_match(&arg, &disable_warnings, argi)) 9552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global->disable_warnings = 1; 9562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian else if (arg_match(&arg, &disable_warning_prompt, argi)) 9572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global->disable_warning_prompt = 1; 958ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 959ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang argj++; 960ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 9611b362b15af34006e6a11974088a46d42b903418eJohann 9622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (global->pass) { 9632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian /* DWIM: Assume the user meant passes=2 if pass=2 is specified */ 9642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (global->pass > global->passes) { 9657bc9febe8749e98a3812a0dc4380ceae75c29450Johann warn("Assuming --pass=%d implies --passes=%d\n", global->pass, 9667bc9febe8749e98a3812a0dc4380ceae75c29450Johann global->pass); 9672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global->passes = global->pass; 9682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 9692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 970ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Validate global config */ 9711184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (global->passes == 0) { 97268e1c830ade592be74773e249bf94e2bbfb50de7Johann#if CONFIG_VP9_ENCODER 9731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Make default VP9 passes = 2 until there is a better quality 1-pass 9741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // encoder 9757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (global->codec != NULL && global->codec->name != NULL) 9767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian global->passes = (strcmp(global->codec->name, "vp9") == 0 && 9777bc9febe8749e98a3812a0dc4380ceae75c29450Johann global->deadline != VPX_DL_REALTIME) 9787bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? 2 9797bc9febe8749e98a3812a0dc4380ceae75c29450Johann : 1; 9805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else 9815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang global->passes = 1; 9825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif 9831184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 9841b362b15af34006e6a11974088a46d42b903418eJohann 9857bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (global->deadline == VPX_DL_REALTIME && global->passes > 1) { 9862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian warn("Enforcing one-pass encoding in realtime mode\n"); 9872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global->passes = 1; 988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 9891b362b15af34006e6a11974088a46d42b903418eJohann} 9901b362b15af34006e6a11974088a46d42b903418eJohann 9917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic void open_input_file(struct VpxInputContext *input) { 992ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Parse certain options from the input file, if possible */ 9937bc9febe8749e98a3812a0dc4380ceae75c29450Johann input->file = strcmp(input->filename, "-") ? fopen(input->filename, "rb") 9947bc9febe8749e98a3812a0dc4380ceae75c29450Johann : set_binary_mode(stdin); 9951b362b15af34006e6a11974088a46d42b903418eJohann 9967bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!input->file) fatal("Failed to open input file"); 9971b362b15af34006e6a11974088a46d42b903418eJohann 998ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!fseeko(input->file, 0, SEEK_END)) { 999ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Input file is seekable. Figure out how long it is, so we can get 1000ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * progress info. 10011b362b15af34006e6a11974088a46d42b903418eJohann */ 1002ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input->length = ftello(input->file); 1003ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rewind(input->file); 1004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1005ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 10067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian /* Default to 1:1 pixel aspect ratio. */ 10077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input->pixel_aspect_ratio.numerator = 1; 10087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input->pixel_aspect_ratio.denominator = 1; 10097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1010ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* For RAW input sources, these bytes will applied on the first frame 1011ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in read_frame(). 1012ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1013ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input->detect.buf_read = fread(input->detect.buf, 1, 4, input->file); 1014ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input->detect.position = 0; 1015ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 10167bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (input->detect.buf_read == 4 && file_is_y4m(input->detect.buf)) { 1017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (y4m_input_open(&input->y4m, input->file, input->detect.buf, 4, 1018ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input->only_i420) >= 0) { 1019ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input->file_type = FILE_TYPE_Y4M; 10202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input->width = input->y4m.pic_w; 10212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input->height = input->y4m.pic_h; 10227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input->pixel_aspect_ratio.numerator = input->y4m.par_n; 10237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input->pixel_aspect_ratio.denominator = input->y4m.par_d; 10242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input->framerate.numerator = input->y4m.fps_n; 10252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input->framerate.denominator = input->y4m.fps_d; 1026ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian input->fmt = input->y4m.vpx_fmt; 1027ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian input->bit_depth = input->y4m.bit_depth; 1028ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else 1029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Unsupported Y4M stream."); 10302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (input->detect.buf_read == 4 && fourcc_is_ivf(input->detect.buf)) { 10319b35249446b07f40ac5fcc3205f2c048616efacchkuang fatal("IVF is not supported as input."); 1032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1033ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input->file_type = FILE_TYPE_RAW; 1034ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 10351b362b15af34006e6a11974088a46d42b903418eJohann} 10361b362b15af34006e6a11974088a46d42b903418eJohann 10372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void close_input_file(struct VpxInputContext *input) { 1038ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(input->file); 10397bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (input->file_type == FILE_TYPE_Y4M) y4m_input_close(&input->y4m); 10401b362b15af34006e6a11974088a46d42b903418eJohann} 10411b362b15af34006e6a11974088a46d42b903418eJohann 10422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic struct stream_state *new_stream(struct VpxEncoderConfig *global, 10439b35249446b07f40ac5fcc3205f2c048616efacchkuang struct stream_state *prev) { 1044ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct stream_state *stream; 1045ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1046ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream = calloc(1, sizeof(*stream)); 10477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream == NULL) { 1048ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Failed to allocate new stream."); 10497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 10507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1051ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (prev) { 1052ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memcpy(stream, prev, sizeof(*stream)); 1053ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->index++; 1054ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang prev->next = stream; 1055ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 10567bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_codec_err_t res; 1057ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1058ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Populate encoder configuration */ 1059ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian res = vpx_codec_enc_config_default(global->codec->codec_interface(), 10607bc9febe8749e98a3812a0dc4380ceae75c29450Johann &stream->config.cfg, global->usage); 10617bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (res) fatal("Failed to get config: %s\n", vpx_codec_err_to_string(res)); 1062ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1063ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Change the default timebase to a high enough value so that the 1064ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * encoder will always create strictly increasing timestamps. 1065ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1066ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_timebase.den = 1000; 10671b362b15af34006e6a11974088a46d42b903418eJohann 1068ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Never use the library's default resolution, require it be parsed 1069ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * from the file or set on the command line. 1070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1071ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_w = 0; 1072ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_h = 0; 1073ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1074ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Initialize remaining stream parameters */ 1075ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.write_webm = 1; 10762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 1077ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stream->config.stereo_fmt = STEREO_FORMAT_MONO; 107868e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->webm_ctx.last_pts_ns = -1; 107968e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->webm_ctx.writer = NULL; 108068e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->webm_ctx.segment = NULL; 10812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 1082ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1083ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Allows removal of the application version from the EBML tags */ 108468e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->webm_ctx.debug = global->debug; 10852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 10867bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Default lag_in_frames is 0 in realtime mode CBR mode*/ 10877bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (global->deadline == VPX_DL_REALTIME && 10887bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->config.cfg.rc_end_usage == 1) 10892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian stream->config.cfg.g_lag_in_frames = 0; 1090ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 10911b362b15af34006e6a11974088a46d42b903418eJohann 1092ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Output files must be specified for each stream */ 1093ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.out_fn = NULL; 10941b362b15af34006e6a11974088a46d42b903418eJohann 1095ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->next = NULL; 1096ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return stream; 10971b362b15af34006e6a11974088a46d42b903418eJohann} 10981b362b15af34006e6a11974088a46d42b903418eJohann 10992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic int parse_stream_params(struct VpxEncoderConfig *global, 11007bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct stream_state *stream, char **argv) { 11017bc9febe8749e98a3812a0dc4380ceae75c29450Johann char **argi, **argj; 11027bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct arg arg; 1103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static const arg_def_t **ctrl_args = no_args; 11047bc9febe8749e98a3812a0dc4380ceae75c29450Johann static const int *ctrl_args_map = NULL; 11057bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct stream_config *config = &stream->config; 11067bc9febe8749e98a3812a0dc4380ceae75c29450Johann int eos_mark_found = 0; 11077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 11087bc9febe8749e98a3812a0dc4380ceae75c29450Johann int test_16bit_internal = 0; 11097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Handle codec specific options 1112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (0) { 1113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP8_ENCODER 11142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (strcmp(global->codec->name, "vp8") == 0) { 1115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctrl_args = vp8_args; 1116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctrl_args_map = vp8_arg_ctrl_map; 1117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_VP9_ENCODER 11192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (strcmp(global->codec->name, "vp9") == 0) { 1120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctrl_args = vp9_args; 1121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctrl_args_map = vp9_arg_ctrl_map; 1122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 11241b362b15af34006e6a11974088a46d42b903418eJohann 1125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) { 1126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang arg.argv_step = 1; 11271b362b15af34006e6a11974088a46d42b903418eJohann 1128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Once we've found an end-of-stream marker (--) we want to continue 1129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * shifting arguments but not consuming them. 1130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (eos_mark_found) { 1132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang argj++; 1133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang continue; 1134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (!strcmp(*argj, "--")) { 1135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang eos_mark_found = 1; 1136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang continue; 1137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 11381b362b15af34006e6a11974088a46d42b903418eJohann 11397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (arg_match(&arg, &outputfile, argi)) { 1140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->out_fn = arg.val; 11412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &fpf_name, argi)) { 1142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->stats_fn = arg.val; 1143ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 1144ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else if (arg_match(&arg, &fpmbf_name, argi)) { 1145ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian config->fpmb_stats_fn = arg.val; 1146ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 11477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else if (arg_match(&arg, &use_webm, argi)) { 11487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 11497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian config->write_webm = 1; 11507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 11517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian die("Error: --webm specified but webm is disabled."); 11527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 11532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &use_ivf, argi)) { 1154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->write_webm = 0; 11552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &threads, argi)) { 1156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_threads = arg_parse_uint(&arg); 11572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &profile, argi)) { 1158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_profile = arg_parse_uint(&arg); 11592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &width, argi)) { 1160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_w = arg_parse_uint(&arg); 11612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &height, argi)) { 1162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_h = arg_parse_uint(&arg); 11637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 11647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else if (arg_match(&arg, &bitdeptharg, argi)) { 11657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian config->cfg.g_bit_depth = arg_parse_enum_or_int(&arg); 11667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else if (arg_match(&arg, &inbitdeptharg, argi)) { 11677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian config->cfg.g_input_bit_depth = arg_parse_uint(&arg); 11687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1169ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 11702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &stereo_mode, argi)) { 1171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->stereo_fmt = arg_parse_enum_or_int(&arg); 1172ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 11732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &timebase, argi)) { 1174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_timebase = arg_parse_rational(&arg); 1175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang validate_positive_rational(arg.name, &config->cfg.g_timebase); 11762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &error_resilient, argi)) { 1177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_error_resilient = arg_parse_uint(&arg); 11787bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (arg_match(&arg, &end_usage, argi)) { 11797bc9febe8749e98a3812a0dc4380ceae75c29450Johann config->cfg.rc_end_usage = arg_parse_enum_or_int(&arg); 11802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &lag_in_frames, argi)) { 1181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.g_lag_in_frames = arg_parse_uint(&arg); 11822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (global->deadline == VPX_DL_REALTIME && 11837bc9febe8749e98a3812a0dc4380ceae75c29450Johann config->cfg.rc_end_usage == VPX_CBR && 11842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian config->cfg.g_lag_in_frames != 0) { 11857bc9febe8749e98a3812a0dc4380ceae75c29450Johann warn("non-zero %s option ignored in realtime CBR mode.\n", arg.name); 11862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian config->cfg.g_lag_in_frames = 0; 11872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 11882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &dropframe_thresh, argi)) { 1189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_dropframe_thresh = arg_parse_uint(&arg); 11902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &resize_allowed, argi)) { 1191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_resize_allowed = arg_parse_uint(&arg); 1192ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else if (arg_match(&arg, &resize_width, argi)) { 1193ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian config->cfg.rc_scaled_width = arg_parse_uint(&arg); 1194ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else if (arg_match(&arg, &resize_height, argi)) { 1195ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian config->cfg.rc_scaled_height = arg_parse_uint(&arg); 11962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &resize_up_thresh, argi)) { 1197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_resize_up_thresh = arg_parse_uint(&arg); 11982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &resize_down_thresh, argi)) { 1199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_resize_down_thresh = arg_parse_uint(&arg); 12002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &end_usage, argi)) { 1201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_end_usage = arg_parse_enum_or_int(&arg); 12022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &target_bitrate, argi)) { 1203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_target_bitrate = arg_parse_uint(&arg); 12042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &min_quantizer, argi)) { 1205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_min_quantizer = arg_parse_uint(&arg); 12062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &max_quantizer, argi)) { 1207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_max_quantizer = arg_parse_uint(&arg); 12082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &undershoot_pct, argi)) { 1209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_undershoot_pct = arg_parse_uint(&arg); 12102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &overshoot_pct, argi)) { 1211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_overshoot_pct = arg_parse_uint(&arg); 12122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &buf_sz, argi)) { 1213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_buf_sz = arg_parse_uint(&arg); 12142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &buf_initial_sz, argi)) { 1215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_buf_initial_sz = arg_parse_uint(&arg); 12162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &buf_optimal_sz, argi)) { 1217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_buf_optimal_sz = arg_parse_uint(&arg); 12182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &bias_pct, argi)) { 12197bc9febe8749e98a3812a0dc4380ceae75c29450Johann config->cfg.rc_2pass_vbr_bias_pct = arg_parse_uint(&arg); 1220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->passes < 2) 1221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn("option %s ignored in one-pass mode.\n", arg.name); 1222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (arg_match(&arg, &minsection_pct, argi)) { 1223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_2pass_vbr_minsection_pct = arg_parse_uint(&arg); 1224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->passes < 2) 1226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn("option %s ignored in one-pass mode.\n", arg.name); 1227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (arg_match(&arg, &maxsection_pct, argi)) { 1228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.rc_2pass_vbr_maxsection_pct = arg_parse_uint(&arg); 1229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->passes < 2) 1231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn("option %s ignored in one-pass mode.\n", arg.name); 12322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &kf_min_dist, argi)) { 1233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.kf_min_dist = arg_parse_uint(&arg); 12342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &kf_max_dist, argi)) { 1235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.kf_max_dist = arg_parse_uint(&arg); 12362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else if (arg_match(&arg, &kf_disabled, argi)) { 1237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->cfg.kf_mode = VPX_KF_DISABLED; 12387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 12397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else if (arg_match(&arg, &test16bitinternalarg, argi)) { 124068e1c830ade592be74773e249bf94e2bbfb50de7Johann if (strcmp(global->codec->name, "vp9") == 0) { 12417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian test_16bit_internal = 1; 12427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 12437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 12442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } else { 1245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i, match = 0; 1246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; ctrl_args[i]; i++) { 1247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (arg_match(&arg, ctrl_args[i], argi)) { 1248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int j; 1249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang match = 1; 1250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Point either to the next free element or the first 1252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * instance of this control. 1253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (j = 0; j < config->arg_ctrl_cnt; j++) 12557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (ctrl_args_map != NULL && 12567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian config->arg_ctrls[j][0] == ctrl_args_map[i]) 1257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 1258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Update/insert */ 1260ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian assert(j < (int)ARG_CTRL_CNT_MAX); 12617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (ctrl_args_map != NULL && j < (int)ARG_CTRL_CNT_MAX) { 1262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->arg_ctrls[j][0] = ctrl_args_map[i]; 1263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang config->arg_ctrls[j][1] = arg_parse_enum_or_int(&arg); 12647bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (j == config->arg_ctrl_cnt) config->arg_ctrl_cnt++; 1265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 12661b362b15af34006e6a11974088a46d42b903418eJohann } 1267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 12687bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!match) argj++; 12691b362b15af34006e6a11974088a46d42b903418eJohann } 1270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 12717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 127268e1c830ade592be74773e249bf94e2bbfb50de7Johann if (strcmp(global->codec->name, "vp9") == 0) { 12737bc9febe8749e98a3812a0dc4380ceae75c29450Johann config->use_16bit_internal = 12747bc9febe8749e98a3812a0dc4380ceae75c29450Johann test_16bit_internal | (config->cfg.g_profile > 1); 12757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 12767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return eos_mark_found; 12781b362b15af34006e6a11974088a46d42b903418eJohann} 12791b362b15af34006e6a11974088a46d42b903418eJohann 12807bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define FOREACH_STREAM(func) \ 12817bc9febe8749e98a3812a0dc4380ceae75c29450Johann do { \ 12827bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct stream_state *stream; \ 12832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (stream = streams; stream; stream = stream->next) { \ 12847bc9febe8749e98a3812a0dc4380ceae75c29450Johann func; \ 12857bc9febe8749e98a3812a0dc4380ceae75c29450Johann } \ 12862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } while (0) 1287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 12882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void validate_stream_config(const struct stream_state *stream, 12892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct VpxEncoderConfig *global) { 12902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct stream_state *streami; 12917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (void)global; 1292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!stream->config.cfg.g_w || !stream->config.cfg.g_h) 12947bc9febe8749e98a3812a0dc4380ceae75c29450Johann fatal( 12957bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Stream %d: Specify stream dimensions with --width (-w) " 12967bc9febe8749e98a3812a0dc4380ceae75c29450Johann " and --height (-h)", 12977bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->index); 1298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 12997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // Check that the codec bit depth is greater than the input bit depth. 13007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream->config.cfg.g_input_bit_depth > 13017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (unsigned int)stream->config.cfg.g_bit_depth) { 13027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian fatal("Stream %d: codec bit depth (%d) less than input bit depth (%d)", 13037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian stream->index, (int)stream->config.cfg.g_bit_depth, 13047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian stream->config.cfg.g_input_bit_depth); 13052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 13062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (streami = stream; streami; streami = streami->next) { 1308ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* All streams require output files */ 1309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!streami->config.out_fn) 1310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Stream %d: Output file is required (specify with -o)", 1311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang streami->index); 1312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Check for two streams outputting to the same file */ 1314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (streami != stream) { 1315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *a = stream->config.out_fn; 1316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *b = streami->config.out_fn; 1317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!strcmp(a, b) && strcmp(a, "/dev/null") && strcmp(a, ":nul")) 1318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Stream %d: duplicate output file (from stream %d)", 1319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang streami->index, stream->index); 1320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 13211b362b15af34006e6a11974088a46d42b903418eJohann 1322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Check for two streams sharing a stats file. */ 1323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (streami != stream) { 1324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *a = stream->config.stats_fn; 1325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *b = streami->config.stats_fn; 1326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (a && b && !strcmp(a, b)) 1327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Stream %d: duplicate stats file (from stream %d)", 1328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang streami->index, stream->index); 13291b362b15af34006e6a11974088a46d42b903418eJohann } 1330ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 1331ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 1332ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian /* Check for two streams sharing a mb stats file. */ 1333ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (streami != stream) { 1334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const char *a = stream->config.fpmb_stats_fn; 1335ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const char *b = streami->config.fpmb_stats_fn; 1336ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (a && b && !strcmp(a, b)) 1337ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fatal("Stream %d: duplicate mb stats file (from stream %d)", 1338ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian streami->index, stream->index); 1339ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 1340ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 1341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 13421b362b15af34006e6a11974088a46d42b903418eJohann} 13431b362b15af34006e6a11974088a46d42b903418eJohann 13447bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void set_stream_dimensions(struct stream_state *stream, unsigned int w, 1345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int h) { 1346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!stream->config.cfg.g_w) { 1347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!stream->config.cfg.g_h) 1348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_w = w; 1349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 1350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_w = w * stream->config.cfg.g_h / h; 1351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1352ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!stream->config.cfg.g_h) { 1353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_h = h * stream->config.cfg.g_w / w; 1354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 13551b362b15af34006e6a11974088a46d42b903418eJohann} 13561b362b15af34006e6a11974088a46d42b903418eJohann 13577bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const char *file_type_to_string(enum VideoFileType t) { 1358ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (t) { 1359ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case FILE_TYPE_RAW: return "RAW"; 1360ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case FILE_TYPE_Y4M: return "Y4M"; 1361ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian default: return "Other"; 1362ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 1363ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 1364ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 13657bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const char *image_format_to_string(vpx_img_fmt_t f) { 1366ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (f) { 1367ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case VPX_IMG_FMT_I420: return "I420"; 1368ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case VPX_IMG_FMT_I422: return "I422"; 1369ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case VPX_IMG_FMT_I444: return "I444"; 13707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case VPX_IMG_FMT_I440: return "I440"; 1371ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case VPX_IMG_FMT_YV12: return "YV12"; 13727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case VPX_IMG_FMT_I42016: return "I42016"; 13737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case VPX_IMG_FMT_I42216: return "I42216"; 13747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case VPX_IMG_FMT_I44416: return "I44416"; 13757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian case VPX_IMG_FMT_I44016: return "I44016"; 1376ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian default: return "Other"; 1377ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 1378ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 13791b362b15af34006e6a11974088a46d42b903418eJohann 13802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void show_stream_config(struct stream_state *stream, 13812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct VpxEncoderConfig *global, 13822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct VpxInputContext *input) { 13831b362b15af34006e6a11974088a46d42b903418eJohann#define SHOW(field) \ 1384ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, " %-28s = %d\n", #field, stream->config.cfg.field) 1385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->index == 0) { 1387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "Codec: %s\n", 1388ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_codec_iface_name(global->codec->codec_interface())); 1389ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fprintf(stderr, "Source file: %s File Type: %s Format: %s\n", 13907bc9febe8749e98a3812a0dc4380ceae75c29450Johann input->filename, file_type_to_string(input->file_type), 1391ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian image_format_to_string(input->fmt)); 1392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->next || stream->index) 1394ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\nStream Index: %d\n", stream->index); 1395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "Destination file: %s\n", stream->config.out_fn); 1396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "Encoder parameters:\n"); 1397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1398ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_usage); 1399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_threads); 1400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_profile); 1401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_w); 1402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_h); 14037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian SHOW(g_bit_depth); 14047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian SHOW(g_input_bit_depth); 1405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_timebase.num); 1406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_timebase.den); 1407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_error_resilient); 1408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_pass); 1409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(g_lag_in_frames); 1410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_dropframe_thresh); 1411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_resize_allowed); 1412ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian SHOW(rc_scaled_width); 1413ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian SHOW(rc_scaled_height); 1414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_resize_up_thresh); 1415ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_resize_down_thresh); 1416ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_end_usage); 1417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_target_bitrate); 1418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_min_quantizer); 1419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_max_quantizer); 1420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_undershoot_pct); 1421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_overshoot_pct); 1422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_buf_sz); 1423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_buf_initial_sz); 1424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_buf_optimal_sz); 1425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_2pass_vbr_bias_pct); 1426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_2pass_vbr_minsection_pct); 1427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(rc_2pass_vbr_maxsection_pct); 1428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(kf_mode); 1429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(kf_min_dist); 1430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SHOW(kf_max_dist); 14311b362b15af34006e6a11974088a46d42b903418eJohann} 14321b362b15af34006e6a11974088a46d42b903418eJohann 14331b362b15af34006e6a11974088a46d42b903418eJohannstatic void open_output_file(struct stream_state *stream, 14347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian struct VpxEncoderConfig *global, 14357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const struct VpxRational *pixel_aspect_ratio) { 1436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const char *fn = stream->config.out_fn; 14372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct vpx_codec_enc_cfg *const cfg = &stream->config.cfg; 14382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14397bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cfg->g_pass == VPX_RC_FIRST_PASS) return; 1440ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1441ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->file = strcmp(fn, "-") ? fopen(fn, "wb") : set_binary_mode(stdout); 1442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14437bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!stream->file) fatal("Failed to open output file"); 1444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->config.write_webm && fseek(stream->file, 0, SEEK_CUR)) 1446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("WebM output to pipes not supported."); 1447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 1449ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->config.write_webm) { 145068e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->webm_ctx.stream = stream->file; 14517bc9febe8749e98a3812a0dc4380ceae75c29450Johann write_webm_file_header(&stream->webm_ctx, cfg, stream->config.stereo_fmt, 14527bc9febe8749e98a3812a0dc4380ceae75c29450Johann global->codec->fourcc, pixel_aspect_ratio); 14532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 145468e1c830ade592be74773e249bf94e2bbfb50de7Johann#else 145568e1c830ade592be74773e249bf94e2bbfb50de7Johann (void)pixel_aspect_ratio; 14562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 14572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!stream->config.write_webm) { 14592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ivf_write_file_header(stream->file, cfg, global->codec->fourcc, 0); 14602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 14611b362b15af34006e6a11974088a46d42b903418eJohann} 14621b362b15af34006e6a11974088a46d42b903418eJohann 14631b362b15af34006e6a11974088a46d42b903418eJohannstatic void close_output_file(struct stream_state *stream, 14642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int fourcc) { 14652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const struct vpx_codec_enc_cfg *const cfg = &stream->config.cfg; 14662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14677bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cfg->g_pass == VPX_RC_FIRST_PASS) return; 14682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 1470ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->config.write_webm) { 147168e1c830ade592be74773e249bf94e2bbfb50de7Johann write_webm_file_footer(&stream->webm_ctx); 14722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 14732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 14742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 14752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!stream->config.write_webm) { 1476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!fseek(stream->file, 0, SEEK_SET)) 14777bc9febe8749e98a3812a0dc4380ceae75c29450Johann ivf_write_file_header(stream->file, &stream->config.cfg, fourcc, 1478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->frames_out); 1479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(stream->file); 14821b362b15af34006e6a11974088a46d42b903418eJohann} 14831b362b15af34006e6a11974088a46d42b903418eJohann 14842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void setup_pass(struct stream_state *stream, 14857bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct VpxEncoderConfig *global, int pass) { 1486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->config.stats_fn) { 14877bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!stats_open_file(&stream->stats, stream->config.stats_fn, pass)) 1488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Failed to open statistics store"); 1489ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1490ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!stats_open_mem(&stream->stats, pass)) 1491ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fatal("Failed to open statistics store"); 1492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1494ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 1495ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (stream->config.fpmb_stats_fn) { 14967bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!stats_open_file(&stream->fpmb_stats, stream->config.fpmb_stats_fn, 14977bc9febe8749e98a3812a0dc4380ceae75c29450Johann pass)) 1498ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fatal("Failed to open mb statistics store"); 1499ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else { 1500ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (!stats_open_mem(&stream->fpmb_stats, pass)) 1501ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fatal("Failed to open mb statistics store"); 1502ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 1503ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 1504ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 1505ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.g_pass = global->passes == 2 15067bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? pass ? VPX_RC_LAST_PASS : VPX_RC_FIRST_PASS 15077bc9febe8749e98a3812a0dc4380ceae75c29450Johann : VPX_RC_ONE_PASS; 1508ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (pass) { 1509ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->config.cfg.rc_twopass_stats_in = stats_get(&stream->stats); 1510ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 1511ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stream->config.cfg.rc_firstpass_mb_stats_in = 1512ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stats_get(&stream->fpmb_stats); 1513ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 1514ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 1515ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1516ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->cx_time = 0; 1517ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->nbytes = 0; 1518ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->frames_out = 0; 15191b362b15af34006e6a11974088a46d42b903418eJohann} 15201b362b15af34006e6a11974088a46d42b903418eJohann 15212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void initialize_encoder(struct stream_state *stream, 15222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct VpxEncoderConfig *global) { 1523ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 1524ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int flags = 0; 1525ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1526ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang flags |= global->show_psnr ? VPX_CODEC_USE_PSNR : 0; 1527ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang flags |= global->out_part ? VPX_CODEC_USE_OUTPUT_PARTITION : 0; 15287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 15297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian flags |= stream->config.use_16bit_internal ? VPX_CODEC_USE_HIGHBITDEPTH : 0; 15307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1531ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1532ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Construct Encoder Context */ 1533ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_codec_enc_init(&stream->encoder, global->codec->codec_interface(), 1534ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang &stream->config.cfg, flags); 1535ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctx_exit_on_error(&stream->encoder, "Failed to initialize encoder"); 1536ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1537ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Note that we bypass the vpx_codec_control wrapper macro because 1538ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * we're being clever to store the control IDs in an array. Real 1539ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * applications will want to make use of the enumerations directly 1540ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1541ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < stream->config.arg_ctrl_cnt; i++) { 1542ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ctrl = stream->config.arg_ctrls[i][0]; 1543ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int value = stream->config.arg_ctrls[i][1]; 1544ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vpx_codec_control_(&stream->encoder, ctrl, value)) 15457bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(stderr, "Error: Tried to set control %d = %d\n", ctrl, value); 1546ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1547ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctx_exit_on_error(&stream->encoder, "Failed to control codec"); 1548ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1549ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1550ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_DECODERS 1551ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->test_decode != TEST_DECODE_OFF) { 15522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const VpxInterface *decoder = get_vpx_decoder_by_name(global->codec->name); 1553ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_codec_dec_init(&stream->decoder, decoder->codec_interface(), NULL, 0); 1554ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 15561b362b15af34006e6a11974088a46d42b903418eJohann} 15571b362b15af34006e6a11974088a46d42b903418eJohann 15582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void encode_frame(struct stream_state *stream, 15597bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct VpxEncoderConfig *global, struct vpx_image *img, 15602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int frames_in) { 1561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_pts_t frame_start, next_frame_start; 1562ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_codec_enc_cfg *cfg = &stream->config.cfg; 1563ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_usec_timer timer; 1564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15657bc9febe8749e98a3812a0dc4380ceae75c29450Johann frame_start = 15667bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cfg->g_timebase.den * (int64_t)(frames_in - 1) * global->framerate.den) / 15677bc9febe8749e98a3812a0dc4380ceae75c29450Johann cfg->g_timebase.num / global->framerate.num; 15687bc9febe8749e98a3812a0dc4380ceae75c29450Johann next_frame_start = 15697bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cfg->g_timebase.den * (int64_t)(frames_in)*global->framerate.den) / 15707bc9febe8749e98a3812a0dc4380ceae75c29450Johann cfg->g_timebase.num / global->framerate.num; 1571ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15727bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* Scale if necessary */ 15737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 15747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (img) { 15757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if ((img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) && 15767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (img->d_w != cfg->g_w || img->d_h != cfg->g_h)) { 15777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (img->fmt != VPX_IMG_FMT_I42016) { 15787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian fprintf(stderr, "%s can only scale 4:2:0 inputs\n", exec_name); 15797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian exit(EXIT_FAILURE); 15807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 15817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_LIBYUV 15827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!stream->img) { 15837bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img = 15847bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_img_alloc(NULL, VPX_IMG_FMT_I42016, cfg->g_w, cfg->g_h, 16); 15857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 15867bc9febe8749e98a3812a0dc4380ceae75c29450Johann I420Scale_16( 15877bc9febe8749e98a3812a0dc4380ceae75c29450Johann (uint16 *)img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y] / 2, 15887bc9febe8749e98a3812a0dc4380ceae75c29450Johann (uint16 *)img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U] / 2, 15897bc9febe8749e98a3812a0dc4380ceae75c29450Johann (uint16 *)img->planes[VPX_PLANE_V], img->stride[VPX_PLANE_V] / 2, 15907bc9febe8749e98a3812a0dc4380ceae75c29450Johann img->d_w, img->d_h, (uint16 *)stream->img->planes[VPX_PLANE_Y], 15917bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->stride[VPX_PLANE_Y] / 2, 15927bc9febe8749e98a3812a0dc4380ceae75c29450Johann (uint16 *)stream->img->planes[VPX_PLANE_U], 15937bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->stride[VPX_PLANE_U] / 2, 15947bc9febe8749e98a3812a0dc4380ceae75c29450Johann (uint16 *)stream->img->planes[VPX_PLANE_V], 15957bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->stride[VPX_PLANE_V] / 2, stream->img->d_w, 15967bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->d_h, kFilterBox); 15977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian img = stream->img; 15987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 15997bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->encoder.err = 1; 16007bc9febe8749e98a3812a0dc4380ceae75c29450Johann ctx_exit_on_error(&stream->encoder, 16017bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Stream %d: Failed to encode frame.\n" 16027bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Scaling disabled in this configuration. \n" 16037bc9febe8749e98a3812a0dc4380ceae75c29450Johann "To enable, configure with --enable-libyuv\n", 16047bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->index); 16057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 16067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 16077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 16087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1609ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (img && (img->d_w != cfg->g_w || img->d_h != cfg->g_h)) { 1610ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (img->fmt != VPX_IMG_FMT_I420 && img->fmt != VPX_IMG_FMT_YV12) { 1611ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian fprintf(stderr, "%s can only scale 4:2:0 8bpp inputs\n", exec_name); 1612ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian exit(EXIT_FAILURE); 1613ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 1614ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_LIBYUV 1615ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!stream->img) 16167bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img = 16177bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_img_alloc(NULL, VPX_IMG_FMT_I420, cfg->g_w, cfg->g_h, 16); 16187bc9febe8749e98a3812a0dc4380ceae75c29450Johann I420Scale( 16197bc9febe8749e98a3812a0dc4380ceae75c29450Johann img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y], 16207bc9febe8749e98a3812a0dc4380ceae75c29450Johann img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U], 16217bc9febe8749e98a3812a0dc4380ceae75c29450Johann img->planes[VPX_PLANE_V], img->stride[VPX_PLANE_V], img->d_w, img->d_h, 16227bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->planes[VPX_PLANE_Y], stream->img->stride[VPX_PLANE_Y], 16237bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->planes[VPX_PLANE_U], stream->img->stride[VPX_PLANE_U], 16247bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->planes[VPX_PLANE_V], stream->img->stride[VPX_PLANE_V], 16257bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->img->d_w, stream->img->d_h, kFilterBox); 1626ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang img = stream->img; 1627ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#else 1628ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stream->encoder.err = 1; 1629ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ctx_exit_on_error(&stream->encoder, 1630ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "Stream %d: Failed to encode frame.\n" 1631ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "Scaling disabled in this configuration. \n" 1632ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "To enable, configure with --enable-libyuv\n", 1633ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stream->index); 1634ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 1635ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1636ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1637ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_start(&timer); 1638ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_encode(&stream->encoder, img, frame_start, 16397bc9febe8749e98a3812a0dc4380ceae75c29450Johann (unsigned long)(next_frame_start - frame_start), 0, 16407bc9febe8749e98a3812a0dc4380ceae75c29450Johann global->deadline); 1641ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_mark(&timer); 1642ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->cx_time += vpx_usec_timer_elapsed(&timer); 1643ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctx_exit_on_error(&stream->encoder, "Stream %d: Failed to encode frame", 1644ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->index); 16451b362b15af34006e6a11974088a46d42b903418eJohann} 16461b362b15af34006e6a11974088a46d42b903418eJohann 1647ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void update_quantizer_histogram(struct stream_state *stream) { 1648ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->config.cfg.g_pass != VPX_RC_FIRST_PASS) { 1649ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int q; 16501b362b15af34006e6a11974088a46d42b903418eJohann 1651ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_control(&stream->encoder, VP8E_GET_LAST_QUANTIZER_64, &q); 1652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctx_exit_on_error(&stream->encoder, "Failed to read quantizer"); 1653ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->counts[q]++; 1654ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 16551b362b15af34006e6a11974088a46d42b903418eJohann} 16561b362b15af34006e6a11974088a46d42b903418eJohann 16572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic void get_cx_data(struct stream_state *stream, 16587bc9febe8749e98a3812a0dc4380ceae75c29450Johann struct VpxEncoderConfig *global, int *got_data) { 1659ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const vpx_codec_cx_pkt_t *pkt; 1660ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const struct vpx_codec_enc_cfg *cfg = &stream->config.cfg; 1661ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_iter_t iter = NULL; 1662ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1663ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *got_data = 0; 1664ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang while ((pkt = vpx_codec_get_cx_data(&stream->encoder, &iter))) { 1665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static size_t fsize = 0; 16660a39d0a697ff3603e8c100300fda363658e10b23James Zern static FileOffset ivf_header_pos = 0; 1667ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1668ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang switch (pkt->kind) { 1669ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case VPX_CODEC_CX_FRAME_PKT: 1670ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!(pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT)) { 1671ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->frames_out++; 1672ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1673ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!global->quiet) 1674ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, " %6luF", (unsigned long)pkt->data.frame.sz); 1675ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 16762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian update_rate_histogram(stream->rate_hist, cfg, pkt); 16772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if CONFIG_WEBM_IO 1678ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->config.write_webm) { 167968e1c830ade592be74773e249bf94e2bbfb50de7Johann write_webm_block(&stream->webm_ctx, cfg, pkt); 16802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 16812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 16822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!stream->config.write_webm) { 1683ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pkt->data.frame.partition_id <= 0) { 1684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ivf_header_pos = ftello(stream->file); 1685ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fsize = pkt->data.frame.sz; 1686ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 16872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ivf_write_frame_header(stream->file, pkt->data.frame.pts, fsize); 1688ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1689ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fsize += pkt->data.frame.sz; 1690ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1691ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!(pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT)) { 16920a39d0a697ff3603e8c100300fda363658e10b23James Zern const FileOffset currpos = ftello(stream->file); 1693ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fseeko(stream->file, ivf_header_pos, SEEK_SET); 16942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ivf_write_frame_size(stream->file, fsize); 1695ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fseeko(stream->file, currpos, SEEK_SET); 1696ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1697ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 16981b362b15af34006e6a11974088a46d42b903418eJohann 16997bc9febe8749e98a3812a0dc4380ceae75c29450Johann (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, 17007bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->file); 1701ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1702ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->nbytes += pkt->data.raw.sz; 17031b362b15af34006e6a11974088a46d42b903418eJohann 17041b362b15af34006e6a11974088a46d42b903418eJohann *got_data = 1; 1705ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_DECODERS 1706ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->test_decode != TEST_DECODE_OFF && !stream->mismatch_seen) { 1707ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_decode(&stream->decoder, pkt->data.frame.buf, 17082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian (unsigned int)pkt->data.frame.sz, NULL, 0); 1709ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream->decoder.err) { 1710ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn_or_exit_on_error(&stream->decoder, 1711ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global->test_decode == TEST_DECODE_FATAL, 1712ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Failed to decode frame %d in stream %d", 1713ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->frames_out + 1, stream->index); 1714ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->mismatch_seen = stream->frames_out + 1; 1715ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1716ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1717ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 1718ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 1719ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case VPX_CODEC_STATS_PKT: 1720ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->frames_out++; 17217bc9febe8749e98a3812a0dc4380ceae75c29450Johann stats_write(&stream->stats, pkt->data.twopass_stats.buf, 1722ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pkt->data.twopass_stats.sz); 1723ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->nbytes += pkt->data.raw.sz; 1724ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 1725ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 1726ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian case VPX_CODEC_FPMB_STATS_PKT: 17277bc9febe8749e98a3812a0dc4380ceae75c29450Johann stats_write(&stream->fpmb_stats, pkt->data.firstpass_mb_stats.buf, 1728ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian pkt->data.firstpass_mb_stats.sz); 1729ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stream->nbytes += pkt->data.raw.sz; 1730ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian break; 1731ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 1732ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang case VPX_CODEC_PSNR_PKT: 1733ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1734ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global->show_psnr) { 1735ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 1736ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1737ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->psnr_sse_total += pkt->data.psnr.sse[0]; 1738ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->psnr_samples_total += pkt->data.psnr.samples[0]; 1739ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < 4; i++) { 17401b362b15af34006e6a11974088a46d42b903418eJohann if (!global->quiet) 1741ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "%.3f ", pkt->data.psnr.psnr[i]); 1742ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->psnr_totals[i] += pkt->data.psnr.psnr[i]; 1743ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1744ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->psnr_count++; 17451b362b15af34006e6a11974088a46d42b903418eJohann } 1746ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1747ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang break; 17487bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: break; 17491b362b15af34006e6a11974088a46d42b903418eJohann } 1750ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 17511b362b15af34006e6a11974088a46d42b903418eJohann} 17521b362b15af34006e6a11974088a46d42b903418eJohann 17537bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void show_psnr(struct stream_state *stream, double peak) { 1754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 1755ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang double ovpsnr; 17561b362b15af34006e6a11974088a46d42b903418eJohann 17577bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!stream->psnr_count) return; 17581b362b15af34006e6a11974088a46d42b903418eJohann 1759ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "Stream %d PSNR (Overall/Avg/Y/U/V)", stream->index); 17607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ovpsnr = sse_to_psnr((double)stream->psnr_samples_total, peak, 17612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian (double)stream->psnr_sse_total); 1762ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, " %.3f", ovpsnr); 17631b362b15af34006e6a11974088a46d42b903418eJohann 1764ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < 4; i++) { 1765ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, " %.3f", stream->psnr_totals[i] / stream->psnr_count); 1766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\n"); 17681b362b15af34006e6a11974088a46d42b903418eJohann} 17691b362b15af34006e6a11974088a46d42b903418eJohann 1770ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic float usec_to_fps(uint64_t usec, unsigned int frames) { 1771ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (float)(usec > 0 ? frames * 1000000.0 / (float)usec : 0); 17721b362b15af34006e6a11974088a46d42b903418eJohann} 17731b362b15af34006e6a11974088a46d42b903418eJohann 17747bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void test_decode(struct stream_state *stream, 1775ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang enum TestDecodeFatality fatal, 17762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const VpxInterface *codec) { 1777ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_image_t enc_img, dec_img; 1778ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 17797bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (stream->mismatch_seen) return; 1780ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1781ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Get the internal reference frame */ 17822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (strcmp(codec->name, "vp8") == 0) { 1783ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_ref_frame ref_enc, ref_dec; 1784ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int width, height; 1785ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1786ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang width = (stream->config.cfg.g_w + 15) & ~15; 1787ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang height = (stream->config.cfg.g_h + 15) & ~15; 1788ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_img_alloc(&ref_enc.img, VPX_IMG_FMT_I420, width, height, 1); 1789ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang enc_img = ref_enc.img; 1790ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_img_alloc(&ref_dec.img, VPX_IMG_FMT_I420, width, height, 1); 1791ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dec_img = ref_dec.img; 1792ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1793ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_enc.frame_type = VP8_LAST_FRAME; 1794ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_dec.frame_type = VP8_LAST_FRAME; 1795ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_control(&stream->encoder, VP8_COPY_REFERENCE, &ref_enc); 1796ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_control(&stream->decoder, VP8_COPY_REFERENCE, &ref_dec); 1797ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 17987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian struct vp9_ref_frame ref_enc, ref_dec; 1799ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 18007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ref_enc.idx = 0; 18017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ref_dec.idx = 0; 18027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_codec_control(&stream->encoder, VP9_GET_REFERENCE, &ref_enc); 18037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian enc_img = ref_enc.img; 18047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_codec_control(&stream->decoder, VP9_GET_REFERENCE, &ref_dec); 18057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian dec_img = ref_dec.img; 18067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 18077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if ((enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) != 18087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (dec_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH)) { 18097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { 18107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_img_alloc(&enc_img, enc_img.fmt - VPX_IMG_FMT_HIGHBITDEPTH, 18117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian enc_img.d_w, enc_img.d_h, 16); 18127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_img_truncate_16_to_8(&enc_img, &ref_enc.img); 18137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 18147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (dec_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { 18157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_img_alloc(&dec_img, dec_img.fmt - VPX_IMG_FMT_HIGHBITDEPTH, 18167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian dec_img.d_w, dec_img.d_h, 16); 18177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_img_truncate_16_to_8(&dec_img, &ref_dec.img); 18187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 18197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 18207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1821ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1822ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctx_exit_on_error(&stream->encoder, "Failed to get encoder reference frame"); 1823ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ctx_exit_on_error(&stream->decoder, "Failed to get decoder reference frame"); 1824ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1825ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!compare_img(&enc_img, &dec_img)) { 1826ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int y[4], u[4], v[4]; 18277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 18287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { 18297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian find_mismatch_high(&enc_img, &dec_img, y, u, v); 18307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 18317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian find_mismatch(&enc_img, &dec_img, y, u, v); 18327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 18337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 1834ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang find_mismatch(&enc_img, &dec_img, y, u, v); 18357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1836ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->decoder.err = 1; 1837ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang warn_or_exit_on_error(&stream->decoder, fatal == TEST_DECODE_FATAL, 1838ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Stream %d: Encode/decode mismatch on frame %d at" 1839ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " Y[%d, %d] {%d/%d}," 1840ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " U[%d, %d] {%d/%d}," 1841ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang " V[%d, %d] {%d/%d}", 18427bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->index, stream->frames_out, y[0], y[1], y[2], 18437bc9febe8749e98a3812a0dc4380ceae75c29450Johann y[3], u[0], u[1], u[2], u[3], v[0], v[1], v[2], v[3]); 1844ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream->mismatch_seen = stream->frames_out; 1845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1847ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_img_free(&enc_img); 1848ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_img_free(&dec_img); 1849ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 18501b362b15af34006e6a11974088a46d42b903418eJohann 1851ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void print_time(const char *label, int64_t etl) { 18522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64_t hours; 18532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64_t mins; 18542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int64_t secs; 18551b362b15af34006e6a11974088a46d42b903418eJohann 1856ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (etl >= 0) { 1857ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang hours = etl / 3600; 1858ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang etl -= hours * 3600; 1859ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang mins = etl / 60; 1860ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang etl -= mins * 60; 1861ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang secs = etl; 18621b362b15af34006e6a11974088a46d42b903418eJohann 18637bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(stderr, "[%3s %2" PRId64 ":%02" PRId64 ":%02" PRId64 "] ", label, 18647bc9febe8749e98a3812a0dc4380ceae75c29450Johann hours, mins, secs); 1865ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1866ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "[%3s unknown] ", label); 1867ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1868ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 18691b362b15af34006e6a11974088a46d42b903418eJohann 1870ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint main(int argc, const char **argv_) { 18712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int pass; 18722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vpx_image_t raw; 18737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 18747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_image_t raw_shift; 18757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int allocated_raw_shift = 0; 18767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int use_16bit_internal = 0; 18777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int input_shift = 0; 18787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 18792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int frame_avail, got_data; 18802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1881ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian struct VpxInputContext input; 18822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct VpxEncoderConfig global; 18832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct stream_state *streams = NULL; 18842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char **argv, **argi; 18852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint64_t cx_time = 0; 18862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int stream_cnt = 0; 18872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int res = 0; 18881b362b15af34006e6a11974088a46d42b903418eJohann 1889ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian memset(&input, 0, sizeof(input)); 1890ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang exec_name = argv_[0]; 18911b362b15af34006e6a11974088a46d42b903418eJohann 18927bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (argc < 3) usage_exit(); 18931b362b15af34006e6a11974088a46d42b903418eJohann 1894ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Setup default input stream settings */ 18952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input.framerate.numerator = 30; 18962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input.framerate.denominator = 1; 1897ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang input.only_i420 = 1; 1898ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian input.bit_depth = 0; 1899ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1900ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* First parse the global configuration values, because we want to apply 1901ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * other parameters on top of the default configuration provided by the 1902ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * codec. 1903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1904ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang argv = argv_dup(argc - 1, argv_ + 1); 1905ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang parse_global_config(&global, argv); 1906ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1907ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian switch (global.color_type) { 19087bc9febe8749e98a3812a0dc4380ceae75c29450Johann case I420: input.fmt = VPX_IMG_FMT_I420; break; 19097bc9febe8749e98a3812a0dc4380ceae75c29450Johann case I422: input.fmt = VPX_IMG_FMT_I422; break; 19107bc9febe8749e98a3812a0dc4380ceae75c29450Johann case I444: input.fmt = VPX_IMG_FMT_I444; break; 19117bc9febe8749e98a3812a0dc4380ceae75c29450Johann case I440: input.fmt = VPX_IMG_FMT_I440; break; 19127bc9febe8749e98a3812a0dc4380ceae75c29450Johann case YV12: input.fmt = VPX_IMG_FMT_YV12; break; 1913ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 19142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1915ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 1916ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Now parse each stream's parameters. Using a local scope here 1917ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * due to the use of 'stream' as loop variable in FOREACH_STREAM 1918ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * loops 1919ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1920ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct stream_state *stream = NULL; 19211b362b15af34006e6a11974088a46d42b903418eJohann 1922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 1923ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream = new_stream(&global, stream); 1924ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang stream_cnt++; 19257bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!streams) streams = stream; 1926ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (parse_stream_params(&global, stream, argv)); 1927ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 19281b362b15af34006e6a11974088a46d42b903418eJohann 1929ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Check for unrecognized options */ 1930ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (argi = argv; *argi; argi++) 1931ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (argi[0][0] == '-' && argi[0][1]) 1932ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang die("Error: Unrecognized option %s\n", *argi); 19331b362b15af34006e6a11974088a46d42b903418eJohann 19347bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM(check_encoder_config(global.disable_warning_prompt, &global, 19357bc9febe8749e98a3812a0dc4380ceae75c29450Johann &stream->config.cfg);); 19362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1937ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Handle non-option arguments */ 19382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input.filename = argv[0]; 19391b362b15af34006e6a11974088a46d42b903418eJohann 19407bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!input.filename) usage_exit(); 19411b362b15af34006e6a11974088a46d42b903418eJohann 1942ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Decide if other chroma subsamplings than 4:2:0 are supported */ 19437bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (global.codec->fourcc == VP9_FOURCC) input.only_i420 = 0; 1944ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1945ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (pass = global.pass ? global.pass - 1 : 0; pass < global.passes; pass++) { 1946ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int frames_in = 0, seen_frames = 0; 1947ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t estimated_time_left = -1; 1948ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t average_rate = -1; 1949ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64_t lagged_count = 0; 19501b362b15af34006e6a11974088a46d42b903418eJohann 1951ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang open_input_file(&input); 19521b362b15af34006e6a11974088a46d42b903418eJohann 1953ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* If the input file doesn't specify its w/h (raw files), try to get 1954ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * the data from the first stream's configuration. 1955ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 19567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!input.width || !input.height) { 19577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM({ 19587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream->config.cfg.g_w && stream->config.cfg.g_h) { 19597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input.width = stream->config.cfg.g_w; 19607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input.height = stream->config.cfg.g_h; 19617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian break; 19627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 19637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian }); 19647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1965ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1966ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Update stream configurations from the input file's parameters */ 19672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!input.width || !input.height) 19687bc9febe8749e98a3812a0dc4380ceae75c29450Johann fatal( 19697bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Specify stream dimensions with --width (-w) " 19707bc9febe8749e98a3812a0dc4380ceae75c29450Johann " and --height (-h)"); 19717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 19727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian /* If input file does not specify bit-depth but input-bit-depth parameter 19737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * exists, assume that to be the input bit-depth. However, if the 19747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * input-bit-depth paramter does not exist, assume the input bit-depth 19757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * to be the same as the codec bit-depth. 19767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian */ 19777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!input.bit_depth) { 19787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM({ 19797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream->config.cfg.g_input_bit_depth) 19807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input.bit_depth = stream->config.cfg.g_input_bit_depth; 19817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else 19827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input.bit_depth = stream->config.cfg.g_input_bit_depth = 19837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian (int)stream->config.cfg.g_bit_depth; 19847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian }); 19857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (input.bit_depth > 8) input.fmt |= VPX_IMG_FMT_HIGHBITDEPTH; 19867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 19877bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM( 19887bc9febe8749e98a3812a0dc4380ceae75c29450Johann { stream->config.cfg.g_input_bit_depth = input.bit_depth; }); 19897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 19907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 19912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FOREACH_STREAM(set_stream_dimensions(stream, input.width, input.height)); 19922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FOREACH_STREAM(validate_stream_config(stream, &global)); 1993ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1994ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Ensure that --passes and --pass are consistent. If --pass is set and 1995ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * --passes=2, ensure --fpf was set. 1996ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 1997ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.pass && global.passes == 2) 19987bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM({ 19997bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!stream->config.stats_fn) 20007bc9febe8749e98a3812a0dc4380ceae75c29450Johann die("Stream %d: Must specify --fpf when --pass=%d" 20017bc9febe8749e98a3812a0dc4380ceae75c29450Johann " and --passes=2\n", 20027bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->index, global.pass); 20037bc9febe8749e98a3812a0dc4380ceae75c29450Johann }); 2004ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if !CONFIG_WEBM_IO 20062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FOREACH_STREAM({ 200768e1c830ade592be74773e249bf94e2bbfb50de7Johann if (stream->config.write_webm) { 200868e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->config.write_webm = 0; 20097bc9febe8749e98a3812a0dc4380ceae75c29450Johann warn( 20107bc9febe8749e98a3812a0dc4380ceae75c29450Johann "vpxenc was compiled without WebM container support." 20117bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Producing IVF output"); 201268e1c830ade592be74773e249bf94e2bbfb50de7Johann } 20132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian }); 20142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 20152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 2016ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Use the frame rate from the file only if none was specified 2017ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * on the command-line. 2018ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 20192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (!global.have_framerate) { 20202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global.framerate.num = input.framerate.numerator; 20212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian global.framerate.den = input.framerate.denominator; 202268e1c830ade592be74773e249bf94e2bbfb50de7Johann FOREACH_STREAM(stream->config.cfg.g_timebase.den = global.framerate.num; 202368e1c830ade592be74773e249bf94e2bbfb50de7Johann stream->config.cfg.g_timebase.num = global.framerate.den); 20242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 2025ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2026ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Show configuration */ 2027ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.verbose && pass == 0) 2028ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(show_stream_config(stream, &global, &input)); 2029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pass == (global.pass ? global.pass - 1 : 0)) { 2031ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (input.file_type == FILE_TYPE_Y4M) 2032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /*The Y4M reader does its own allocation. 2033ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Just initialize this here to avoid problems if we never read any 2034ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frames.*/ 2035ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memset(&raw, 0, sizeof(raw)); 2036ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2037ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_img_alloc(&raw, input.fmt, input.width, input.height, 32); 2038ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20397bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM(stream->rate_hist = init_rate_histogram( 20407bc9febe8749e98a3812a0dc4380ceae75c29450Johann &stream->config.cfg, &global.framerate)); 2041ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2042ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2043ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(setup_pass(stream, &global, pass)); 20447bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM( 20457bc9febe8749e98a3812a0dc4380ceae75c29450Johann open_output_file(stream, &global, &input.pixel_aspect_ratio)); 2046ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(initialize_encoder(stream, &global)); 2047ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 204968e1c830ade592be74773e249bf94e2bbfb50de7Johann if (strcmp(global.codec->name, "vp9") == 0) { 20507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // Check to see if at least one stream uses 16 bit internal. 20517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // Currently assume that the bit_depths for all streams using 20527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // highbitdepth are the same. 20537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM({ 20547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream->config.use_16bit_internal) { 20557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian use_16bit_internal = 1; 20567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 20577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream->config.cfg.g_profile == 0) { 20587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input_shift = 0; 20597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 20607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input_shift = (int)stream->config.cfg.g_bit_depth - 20617bc9febe8749e98a3812a0dc4380ceae75c29450Johann stream->config.cfg.g_input_bit_depth; 20627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 20637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian }); 20647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 20657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 20667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 2067ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame_avail = 1; 2068ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang got_data = 0; 2069ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang while (frame_avail || got_data) { 2071ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct vpx_usec_timer timer; 2072ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2073ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!global.limit || frames_in < global.limit) { 2074ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame_avail = read_frame(&input, &raw); 2075ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20767bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (frame_avail) frames_in++; 20777bc9febe8749e98a3812a0dc4380ceae75c29450Johann seen_frames = 20787bc9febe8749e98a3812a0dc4380ceae75c29450Johann frames_in > global.skip_frames ? frames_in - global.skip_frames : 0; 2079ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2080ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!global.quiet) { 2081ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang float fps = usec_to_fps(cx_time, seen_frames); 2082ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "\rPass %d/%d ", pass + 1, global.passes); 2083ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2084ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (stream_cnt == 1) 20857bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(stderr, "frame %4d/%-4d %7" PRId64 "B ", frames_in, 20867bc9febe8749e98a3812a0dc4380ceae75c29450Johann streams->frames_out, (int64_t)streams->nbytes); 2087ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang else 2088ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fprintf(stderr, "frame %4d ", frames_in); 2089ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 20907bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(stderr, "%7" PRId64 " %s %.2f %s ", 2091ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cx_time > 9999999 ? cx_time / 1000 : cx_time, 20927bc9febe8749e98a3812a0dc4380ceae75c29450Johann cx_time > 9999999 ? "ms" : "us", fps >= 1.0 ? fps : fps * 60, 20935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fps >= 1.0 ? "fps" : "fpm"); 2094ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang print_time("ETA", estimated_time_left); 2095ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2096ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2097ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else 2098ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame_avail = 0; 20991b362b15af34006e6a11974088a46d42b903418eJohann 2100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (frames_in > global.skip_frames) { 21017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 21027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_image_t *frame_to_encode; 21037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (input_shift || (use_16bit_internal && input.bit_depth == 8)) { 21047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian assert(use_16bit_internal); 21057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // Input bit depth and stream bit depth do not match, so up 21067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // shift frame to stream bit depth 21077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!allocated_raw_shift) { 21087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_img_alloc(&raw_shift, raw.fmt | VPX_IMG_FMT_HIGHBITDEPTH, 21097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian input.width, input.height, 32); 21107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian allocated_raw_shift = 1; 21117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 21127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_img_upshift(&raw_shift, &raw, input_shift); 21137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian frame_to_encode = &raw_shift; 21147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 21157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian frame_to_encode = &raw; 21167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 21177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian vpx_usec_timer_start(&timer); 21187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (use_16bit_internal) { 21197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian assert(frame_to_encode->fmt & VPX_IMG_FMT_HIGHBITDEPTH); 21207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM({ 21217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (stream->config.use_16bit_internal) 21227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian encode_frame(stream, &global, 21237bc9febe8749e98a3812a0dc4380ceae75c29450Johann frame_avail ? frame_to_encode : NULL, frames_in); 21247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian else 21257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian assert(0); 21267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian }); 21277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 21287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian assert((frame_to_encode->fmt & VPX_IMG_FMT_HIGHBITDEPTH) == 0); 21297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM(encode_frame(stream, &global, 21307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian frame_avail ? frame_to_encode : NULL, 21317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian frames_in)); 21327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 21337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 2134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_start(&timer); 21357bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM(encode_frame(stream, &global, frame_avail ? &raw : NULL, 2136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frames_in)); 21377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 2138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_usec_timer_mark(&timer); 2139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cx_time += vpx_usec_timer_elapsed(&timer); 21401b362b15af34006e6a11974088a46d42b903418eJohann 2141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(update_quantizer_histogram(stream)); 21421b362b15af34006e6a11974088a46d42b903418eJohann 2143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang got_data = 0; 2144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(get_cx_data(stream, &global, &got_data)); 2145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!got_data && input.length && streams != NULL && 21477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian !streams->frames_out) { 2148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lagged_count = global.limit ? seen_frames : ftello(input.file); 2149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else if (input.length) { 2150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t remaining; 2151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t rate; 2152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.limit) { 2154ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int64_t frame_in_lagged = (seen_frames - lagged_count) * 1000; 2155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate = cx_time ? frame_in_lagged * (int64_t)1000000 / cx_time : 0; 21577bc9febe8749e98a3812a0dc4380ceae75c29450Johann remaining = 1000 * (global.limit - global.skip_frames - 21587bc9febe8749e98a3812a0dc4380ceae75c29450Johann seen_frames + lagged_count); 2159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 2160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int64_t input_pos = ftello(input.file); 2161ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int64_t input_pos_lagged = input_pos - lagged_count; 2162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int64_t limit = input.length; 2163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang rate = cx_time ? input_pos_lagged * (int64_t)1000000 / cx_time : 0; 2165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang remaining = limit - input_pos + lagged_count; 2166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21687bc9febe8749e98a3812a0dc4380ceae75c29450Johann average_rate = 21697bc9febe8749e98a3812a0dc4380ceae75c29450Johann (average_rate <= 0) ? rate : (average_rate * 7 + rate) / 8; 2170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang estimated_time_left = average_rate ? remaining / average_rate : -1; 2171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 21721b362b15af34006e6a11974088a46d42b903418eJohann 2173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (got_data && global.test_decode != TEST_DECODE_OFF) 2174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(test_decode(stream, global.test_decode, global.codec)); 2175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 21761b362b15af34006e6a11974088a46d42b903418eJohann 2177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fflush(stdout); 21787bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!global.quiet) fprintf(stderr, "\033[K"); 2179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 21801b362b15af34006e6a11974088a46d42b903418eJohann 21817bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (stream_cnt > 1) fprintf(stderr, "\n"); 2182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 21837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (!global.quiet) { 21847bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM(fprintf( 21857bc9febe8749e98a3812a0dc4380ceae75c29450Johann stderr, "\rPass %d/%d frame %4d/%-4d %7" PRId64 "B %7" PRId64 21867bc9febe8749e98a3812a0dc4380ceae75c29450Johann "b/f %7" PRId64 "b/s" 21877bc9febe8749e98a3812a0dc4380ceae75c29450Johann " %7" PRId64 " %s (%.2f fps)\033[K\n", 21887bc9febe8749e98a3812a0dc4380ceae75c29450Johann pass + 1, global.passes, frames_in, stream->frames_out, 21897bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int64_t)stream->nbytes, 21907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian seen_frames ? (int64_t)(stream->nbytes * 8 / seen_frames) : 0, 21917bc9febe8749e98a3812a0dc4380ceae75c29450Johann seen_frames 21927bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? (int64_t)stream->nbytes * 8 * (int64_t)global.framerate.num / 21937bc9febe8749e98a3812a0dc4380ceae75c29450Johann global.framerate.den / seen_frames 21947bc9febe8749e98a3812a0dc4380ceae75c29450Johann : 0, 21957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian stream->cx_time > 9999999 ? stream->cx_time / 1000 : stream->cx_time, 21967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian stream->cx_time > 9999999 ? "ms" : "us", 21977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian usec_to_fps(stream->cx_time, seen_frames))); 21987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 21997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 22007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (global.show_psnr) { 22017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian if (global.codec->fourcc == VP9_FOURCC) { 22027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM( 22037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian show_psnr(stream, (1 << stream->config.cfg.g_input_bit_depth) - 1)); 22047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } else { 22057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian FOREACH_STREAM(show_psnr(stream, 255.0)); 22067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 22077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 2208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(vpx_codec_destroy(&stream->encoder)); 2210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.test_decode != TEST_DECODE_OFF) { 2212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(vpx_codec_destroy(&stream->decoder)); 22131b362b15af34006e6a11974088a46d42b903418eJohann } 22141b362b15af34006e6a11974088a46d42b903418eJohann 2215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang close_input_file(&input); 22161b362b15af34006e6a11974088a46d42b903418eJohann 2217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.test_decode == TEST_DECODE_FATAL) { 2218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(res |= stream->mismatch_seen); 2219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(close_output_file(stream, global.codec->fourcc)); 2221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FOREACH_STREAM(stats_close(&stream->stats, global.passes - 1)); 2223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2224ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS 2225ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian FOREACH_STREAM(stats_close(&stream->fpmb_stats, global.passes - 1)); 2226ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 2227ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 22287bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (global.pass) break; 2229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 2230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.show_q_hist_buckets) 22327bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM( 22337bc9febe8749e98a3812a0dc4380ceae75c29450Johann show_q_histogram(stream->counts, global.show_q_hist_buckets)); 2234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (global.show_rate_hist_buckets) 22367bc9febe8749e98a3812a0dc4380ceae75c29450Johann FOREACH_STREAM(show_rate_histogram(stream->rate_hist, &stream->config.cfg, 2237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang global.show_rate_hist_buckets)); 22382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FOREACH_STREAM(destroy_rate_histogram(stream->rate_hist)); 2239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_INTERNAL_STATS 2241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* TODO(jkoleszar): This doesn't belong in this executable. Do it for now, 2242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * to match some existing utilities. 2243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 22445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!(global.pass == 1 && global.passes == 2)) 22455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang FOREACH_STREAM({ 22465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang FILE *f = fopen("opsnr.stt", "a"); 22475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (stream->mismatch_seen) { 22485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fprintf(f, "First mismatch occurred in frame %d\n", 22495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang stream->mismatch_seen); 22505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 22515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fprintf(f, "No mismatch detected in recon buffers\n"); 22525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 22535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang fclose(f); 22545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang }); 2255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 22561b362b15af34006e6a11974088a46d42b903418eJohann 22577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 22587bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (allocated_raw_shift) vpx_img_free(&raw_shift); 22597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 2260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_img_free(&raw); 2261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang free(argv); 2262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang free(streams); 2263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return res ? EXIT_FAILURE : EXIT_SUCCESS; 22641b362b15af34006e6a11974088a46d42b903418eJohann} 2265