| Index: source/libvpx/vpxenc.c
|
| ===================================================================
|
| --- source/libvpx/vpxenc.c (revision 251189)
|
| +++ source/libvpx/vpxenc.c (working copy)
|
| @@ -27,6 +27,7 @@
|
| #include "third_party/libyuv/include/libyuv/scale.h"
|
| #include "./args.h"
|
| #include "./ivfenc.h"
|
| +#include "./tools_common.h"
|
|
|
| #if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER
|
| #include "vpx/vp8cx.h"
|
| @@ -35,9 +36,10 @@
|
| #include "vpx/vp8dx.h"
|
| #endif
|
|
|
| -#include "./tools_common.h"
|
| +#include "vpx/vpx_integer.h"
|
| #include "vpx_ports/mem_ops.h"
|
| #include "vpx_ports/vpx_timer.h"
|
| +#include "./rate_hist.h"
|
| #include "./vpxstats.h"
|
| #include "./warnings.h"
|
| #include "./webmenc.h"
|
| @@ -59,24 +61,6 @@
|
|
|
| static const char *exec_name;
|
|
|
| -static const struct codec_item {
|
| - char const *name;
|
| - const vpx_codec_iface_t *(*iface)(void);
|
| - const vpx_codec_iface_t *(*dx_iface)(void);
|
| - unsigned int fourcc;
|
| -} codecs[] = {
|
| -#if CONFIG_VP8_ENCODER && CONFIG_VP8_DECODER
|
| - {"vp8", &vpx_codec_vp8_cx, &vpx_codec_vp8_dx, VP8_FOURCC},
|
| -#elif CONFIG_VP8_ENCODER && !CONFIG_VP8_DECODER
|
| - {"vp8", &vpx_codec_vp8_cx, NULL, VP8_FOURCC},
|
| -#endif
|
| -#if CONFIG_VP9_ENCODER && CONFIG_VP9_DECODER
|
| - {"vp9", &vpx_codec_vp9_cx, &vpx_codec_vp9_dx, VP9_FOURCC},
|
| -#elif CONFIG_VP9_ENCODER && !CONFIG_VP9_DECODER
|
| - {"vp9", &vpx_codec_vp9_cx, NULL, VP9_FOURCC},
|
| -#endif
|
| -};
|
| -
|
| static void warn_or_exit_on_errorv(vpx_codec_ctx_t *ctx, int fatal,
|
| const char *s, va_list ap) {
|
| if (ctx->err) {
|
| @@ -460,304 +444,38 @@
|
| fprintf(stderr, "\nStream timebase (--timebase):\n"
|
| " The desired precision of timestamps in the output, expressed\n"
|
| " in fractional seconds. Default is 1/1000.\n");
|
| - fprintf(stderr, "\n"
|
| - "Included encoders:\n"
|
| - "\n");
|
| + fprintf(stderr, "\nIncluded encoders:\n\n");
|
|
|
| - for (i = 0; i < sizeof(codecs) / sizeof(codecs[0]); i++)
|
| + for (i = 0; i < get_vpx_encoder_count(); ++i) {
|
| + const VpxInterface *const encoder = get_vpx_encoder_by_index(i);
|
| fprintf(stderr, " %-6s - %s\n",
|
| - codecs[i].name,
|
| - vpx_codec_iface_name(codecs[i].iface()));
|
| + encoder->name, vpx_codec_iface_name(encoder->interface()));
|
| + }
|
|
|
| exit(EXIT_FAILURE);
|
| }
|
|
|
| -
|
| -#define HIST_BAR_MAX 40
|
| -struct hist_bucket {
|
| - int low, high, count;
|
| -};
|
| -
|
| -
|
| -static int merge_hist_buckets(struct hist_bucket *bucket,
|
| - int *buckets_,
|
| - int max_buckets) {
|
| - int small_bucket = 0, merge_bucket = INT_MAX, big_bucket = 0;
|
| - int buckets = *buckets_;
|
| - int i;
|
| -
|
| - /* Find the extrema for this list of buckets */
|
| - big_bucket = small_bucket = 0;
|
| - for (i = 0; i < buckets; i++) {
|
| - if (bucket[i].count < bucket[small_bucket].count)
|
| - small_bucket = i;
|
| - if (bucket[i].count > bucket[big_bucket].count)
|
| - big_bucket = i;
|
| - }
|
| -
|
| - /* If we have too many buckets, merge the smallest with an adjacent
|
| - * bucket.
|
| - */
|
| - while (buckets > max_buckets) {
|
| - int last_bucket = buckets - 1;
|
| -
|
| - /* merge the small bucket with an adjacent one. */
|
| - if (small_bucket == 0)
|
| - merge_bucket = 1;
|
| - else if (small_bucket == last_bucket)
|
| - merge_bucket = last_bucket - 1;
|
| - else if (bucket[small_bucket - 1].count < bucket[small_bucket + 1].count)
|
| - merge_bucket = small_bucket - 1;
|
| - else
|
| - merge_bucket = small_bucket + 1;
|
| -
|
| - assert(abs(merge_bucket - small_bucket) <= 1);
|
| - assert(small_bucket < buckets);
|
| - assert(big_bucket < buckets);
|
| - assert(merge_bucket < buckets);
|
| -
|
| - if (merge_bucket < small_bucket) {
|
| - bucket[merge_bucket].high = bucket[small_bucket].high;
|
| - bucket[merge_bucket].count += bucket[small_bucket].count;
|
| - } else {
|
| - bucket[small_bucket].high = bucket[merge_bucket].high;
|
| - bucket[small_bucket].count += bucket[merge_bucket].count;
|
| - merge_bucket = small_bucket;
|
| - }
|
| -
|
| - assert(bucket[merge_bucket].low != bucket[merge_bucket].high);
|
| -
|
| - buckets--;
|
| -
|
| - /* Remove the merge_bucket from the list, and find the new small
|
| - * and big buckets while we're at it
|
| - */
|
| - big_bucket = small_bucket = 0;
|
| - for (i = 0; i < buckets; i++) {
|
| - if (i > merge_bucket)
|
| - bucket[i] = bucket[i + 1];
|
| -
|
| - if (bucket[i].count < bucket[small_bucket].count)
|
| - small_bucket = i;
|
| - if (bucket[i].count > bucket[big_bucket].count)
|
| - big_bucket = i;
|
| - }
|
| -
|
| - }
|
| -
|
| - *buckets_ = buckets;
|
| - return bucket[big_bucket].count;
|
| -}
|
| -
|
| -
|
| -static void show_histogram(const struct hist_bucket *bucket,
|
| - int buckets,
|
| - int total,
|
| - int scale) {
|
| - const char *pat1, *pat2;
|
| - int i;
|
| -
|
| - switch ((int)(log(bucket[buckets - 1].high) / log(10)) + 1) {
|
| - case 1:
|
| - case 2:
|
| - pat1 = "%4d %2s: ";
|
| - pat2 = "%4d-%2d: ";
|
| - break;
|
| - case 3:
|
| - pat1 = "%5d %3s: ";
|
| - pat2 = "%5d-%3d: ";
|
| - break;
|
| - case 4:
|
| - pat1 = "%6d %4s: ";
|
| - pat2 = "%6d-%4d: ";
|
| - break;
|
| - case 5:
|
| - pat1 = "%7d %5s: ";
|
| - pat2 = "%7d-%5d: ";
|
| - break;
|
| - case 6:
|
| - pat1 = "%8d %6s: ";
|
| - pat2 = "%8d-%6d: ";
|
| - break;
|
| - case 7:
|
| - pat1 = "%9d %7s: ";
|
| - pat2 = "%9d-%7d: ";
|
| - break;
|
| - default:
|
| - pat1 = "%12d %10s: ";
|
| - pat2 = "%12d-%10d: ";
|
| - break;
|
| - }
|
| -
|
| - for (i = 0; i < buckets; i++) {
|
| - int len;
|
| - int j;
|
| - float pct;
|
| -
|
| - pct = (float)(100.0 * bucket[i].count / total);
|
| - len = HIST_BAR_MAX * bucket[i].count / scale;
|
| - if (len < 1)
|
| - len = 1;
|
| - assert(len <= HIST_BAR_MAX);
|
| -
|
| - if (bucket[i].low == bucket[i].high)
|
| - fprintf(stderr, pat1, bucket[i].low, "");
|
| - else
|
| - fprintf(stderr, pat2, bucket[i].low, bucket[i].high);
|
| -
|
| - for (j = 0; j < HIST_BAR_MAX; j++)
|
| - fprintf(stderr, j < len ? "=" : " ");
|
| - fprintf(stderr, "\t%5d (%6.2f%%)\n", bucket[i].count, pct);
|
| - }
|
| -}
|
| -
|
| -
|
| -static void show_q_histogram(const int counts[64], int max_buckets) {
|
| - struct hist_bucket bucket[64];
|
| - int buckets = 0;
|
| - int total = 0;
|
| - int scale;
|
| - int i;
|
| -
|
| -
|
| - for (i = 0; i < 64; i++) {
|
| - if (counts[i]) {
|
| - bucket[buckets].low = bucket[buckets].high = i;
|
| - bucket[buckets].count = counts[i];
|
| - buckets++;
|
| - total += counts[i];
|
| - }
|
| - }
|
| -
|
| - fprintf(stderr, "\nQuantizer Selection:\n");
|
| - scale = merge_hist_buckets(bucket, &buckets, max_buckets);
|
| - show_histogram(bucket, buckets, total, scale);
|
| -}
|
| -
|
| -
|
| -#define RATE_BINS (100)
|
| -struct rate_hist {
|
| - int64_t *pts;
|
| - int *sz;
|
| - int samples;
|
| - int frames;
|
| - struct hist_bucket bucket[RATE_BINS];
|
| - int total;
|
| -};
|
| -
|
| -
|
| -static void init_rate_histogram(struct rate_hist *hist,
|
| - const vpx_codec_enc_cfg_t *cfg,
|
| - const vpx_rational_t *fps) {
|
| - int i;
|
| -
|
| - /* Determine the number of samples in the buffer. Use the file's framerate
|
| - * to determine the number of frames in rc_buf_sz milliseconds, with an
|
| - * adjustment (5/4) to account for alt-refs
|
| - */
|
| - hist->samples = cfg->rc_buf_sz * 5 / 4 * fps->num / fps->den / 1000;
|
| -
|
| - /* prevent division by zero */
|
| - if (hist->samples == 0)
|
| - hist->samples = 1;
|
| -
|
| - hist->pts = calloc(hist->samples, sizeof(*hist->pts));
|
| - hist->sz = calloc(hist->samples, sizeof(*hist->sz));
|
| - for (i = 0; i < RATE_BINS; i++) {
|
| - hist->bucket[i].low = INT_MAX;
|
| - hist->bucket[i].high = 0;
|
| - hist->bucket[i].count = 0;
|
| - }
|
| -}
|
| -
|
| -
|
| -static void destroy_rate_histogram(struct rate_hist *hist) {
|
| - free(hist->pts);
|
| - free(hist->sz);
|
| -}
|
| -
|
| -
|
| -static void update_rate_histogram(struct rate_hist *hist,
|
| - const vpx_codec_enc_cfg_t *cfg,
|
| - const vpx_codec_cx_pkt_t *pkt) {
|
| - int i, idx;
|
| - int64_t now, then, sum_sz = 0, avg_bitrate;
|
| -
|
| - now = pkt->data.frame.pts * 1000
|
| - * (uint64_t)cfg->g_timebase.num / (uint64_t)cfg->g_timebase.den;
|
| -
|
| - idx = hist->frames++ % hist->samples;
|
| - hist->pts[idx] = now;
|
| - hist->sz[idx] = (int)pkt->data.frame.sz;
|
| -
|
| - if (now < cfg->rc_buf_initial_sz)
|
| - return;
|
| -
|
| - then = now;
|
| -
|
| - /* Sum the size over the past rc_buf_sz ms */
|
| - for (i = hist->frames; i > 0 && hist->frames - i < hist->samples; i--) {
|
| - int i_idx = (i - 1) % hist->samples;
|
| -
|
| - then = hist->pts[i_idx];
|
| - if (now - then > cfg->rc_buf_sz)
|
| - break;
|
| - sum_sz += hist->sz[i_idx];
|
| - }
|
| -
|
| - if (now == then)
|
| - return;
|
| -
|
| - avg_bitrate = sum_sz * 8 * 1000 / (now - then);
|
| - idx = (int)(avg_bitrate * (RATE_BINS / 2) / (cfg->rc_target_bitrate * 1000));
|
| - if (idx < 0)
|
| - idx = 0;
|
| - if (idx > RATE_BINS - 1)
|
| - idx = RATE_BINS - 1;
|
| - if (hist->bucket[idx].low > avg_bitrate)
|
| - hist->bucket[idx].low = (int)avg_bitrate;
|
| - if (hist->bucket[idx].high < avg_bitrate)
|
| - hist->bucket[idx].high = (int)avg_bitrate;
|
| - hist->bucket[idx].count++;
|
| - hist->total++;
|
| -}
|
| -
|
| -
|
| -static void show_rate_histogram(struct rate_hist *hist,
|
| - const vpx_codec_enc_cfg_t *cfg,
|
| - int max_buckets) {
|
| - int i, scale;
|
| - int buckets = 0;
|
| -
|
| - for (i = 0; i < RATE_BINS; i++) {
|
| - if (hist->bucket[i].low == INT_MAX)
|
| - continue;
|
| - hist->bucket[buckets++] = hist->bucket[i];
|
| - }
|
| -
|
| - fprintf(stderr, "\nRate (over %dms window):\n", cfg->rc_buf_sz);
|
| - scale = merge_hist_buckets(hist->bucket, &buckets, max_buckets);
|
| - show_histogram(hist->bucket, buckets, hist->total, scale);
|
| -}
|
| -
|
| #define mmin(a, b) ((a) < (b) ? (a) : (b))
|
| -static void find_mismatch(vpx_image_t *img1, vpx_image_t *img2,
|
| +static void find_mismatch(const vpx_image_t *const img1,
|
| + const vpx_image_t *const img2,
|
| int yloc[4], int uloc[4], int vloc[4]) {
|
| - const unsigned int bsize = 64;
|
| - const unsigned int bsizey = bsize >> img1->y_chroma_shift;
|
| - const unsigned int bsizex = bsize >> img1->x_chroma_shift;
|
| - const int c_w = (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift;
|
| - const int c_h = (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift;
|
| - unsigned int match = 1;
|
| - unsigned int i, j;
|
| + const uint32_t bsize = 64;
|
| + const uint32_t bsizey = bsize >> img1->y_chroma_shift;
|
| + const uint32_t bsizex = bsize >> img1->x_chroma_shift;
|
| + const uint32_t c_w =
|
| + (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift;
|
| + const uint32_t c_h =
|
| + (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift;
|
| + int match = 1;
|
| + uint32_t i, j;
|
| yloc[0] = yloc[1] = yloc[2] = yloc[3] = -1;
|
| for (i = 0, match = 1; match && i < img1->d_h; i += bsize) {
|
| for (j = 0; match && j < img1->d_w; j += bsize) {
|
| int k, l;
|
| - int si = mmin(i + bsize, img1->d_h) - i;
|
| - int sj = mmin(j + bsize, img1->d_w) - j;
|
| - for (k = 0; match && k < si; k++)
|
| - for (l = 0; match && l < sj; l++) {
|
| + const int si = mmin(i + bsize, img1->d_h) - i;
|
| + const int sj = mmin(j + bsize, img1->d_w) - j;
|
| + for (k = 0; match && k < si; ++k) {
|
| + for (l = 0; match && l < sj; ++l) {
|
| if (*(img1->planes[VPX_PLANE_Y] +
|
| (i + k) * img1->stride[VPX_PLANE_Y] + j + l) !=
|
| *(img2->planes[VPX_PLANE_Y] +
|
| @@ -772,6 +490,7 @@
|
| break;
|
| }
|
| }
|
| + }
|
| }
|
| }
|
|
|
| @@ -779,10 +498,10 @@
|
| for (i = 0, match = 1; match && i < c_h; i += bsizey) {
|
| for (j = 0; match && j < c_w; j += bsizex) {
|
| int k, l;
|
| - int si = mmin(i + bsizey, c_h - i);
|
| - int sj = mmin(j + bsizex, c_w - j);
|
| - for (k = 0; match && k < si; k++)
|
| - for (l = 0; match && l < sj; l++) {
|
| + const int si = mmin(i + bsizey, c_h - i);
|
| + const int sj = mmin(j + bsizex, c_w - j);
|
| + for (k = 0; match && k < si; ++k) {
|
| + for (l = 0; match && l < sj; ++l) {
|
| if (*(img1->planes[VPX_PLANE_U] +
|
| (i + k) * img1->stride[VPX_PLANE_U] + j + l) !=
|
| *(img2->planes[VPX_PLANE_U] +
|
| @@ -792,21 +511,22 @@
|
| uloc[2] = *(img1->planes[VPX_PLANE_U] +
|
| (i + k) * img1->stride[VPX_PLANE_U] + j + l);
|
| uloc[3] = *(img2->planes[VPX_PLANE_U] +
|
| - (i + k) * img2->stride[VPX_PLANE_V] + j + l);
|
| + (i + k) * img2->stride[VPX_PLANE_U] + j + l);
|
| match = 0;
|
| break;
|
| }
|
| }
|
| + }
|
| }
|
| }
|
| vloc[0] = vloc[1] = vloc[2] = vloc[3] = -1;
|
| for (i = 0, match = 1; match && i < c_h; i += bsizey) {
|
| for (j = 0; match && j < c_w; j += bsizex) {
|
| int k, l;
|
| - int si = mmin(i + bsizey, c_h - i);
|
| - int sj = mmin(j + bsizex, c_w - j);
|
| - for (k = 0; match && k < si; k++)
|
| - for (l = 0; match && l < sj; l++) {
|
| + const int si = mmin(i + bsizey, c_h - i);
|
| + const int sj = mmin(j + bsizex, c_w - j);
|
| + for (k = 0; match && k < si; ++k) {
|
| + for (l = 0; match && l < sj; ++l) {
|
| if (*(img1->planes[VPX_PLANE_V] +
|
| (i + k) * img1->stride[VPX_PLANE_V] + j + l) !=
|
| *(img2->planes[VPX_PLANE_V] +
|
| @@ -821,34 +541,37 @@
|
| break;
|
| }
|
| }
|
| + }
|
| }
|
| }
|
| }
|
|
|
| -static int compare_img(vpx_image_t *img1, vpx_image_t *img2)
|
| -{
|
| - const int c_w = (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift;
|
| - const int c_h = (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift;
|
| +static int compare_img(const vpx_image_t *const img1,
|
| + const vpx_image_t *const img2) {
|
| + const uint32_t c_w =
|
| + (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift;
|
| + const uint32_t c_h =
|
| + (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift;
|
| + uint32_t i;
|
| int match = 1;
|
| - unsigned int i;
|
|
|
| match &= (img1->fmt == img2->fmt);
|
| match &= (img1->d_w == img2->d_w);
|
| match &= (img1->d_h == img2->d_h);
|
|
|
| - for (i = 0; i < img1->d_h; i++)
|
| - match &= (memcmp(img1->planes[VPX_PLANE_Y]+i*img1->stride[VPX_PLANE_Y],
|
| - img2->planes[VPX_PLANE_Y]+i*img2->stride[VPX_PLANE_Y],
|
| + for (i = 0; i < img1->d_h; ++i)
|
| + match &= (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y],
|
| + img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y],
|
| img1->d_w) == 0);
|
|
|
| - for (i = 0; i < c_h; i++)
|
| - match &= (memcmp(img1->planes[VPX_PLANE_U]+i*img1->stride[VPX_PLANE_U],
|
| - img2->planes[VPX_PLANE_U]+i*img2->stride[VPX_PLANE_U],
|
| + for (i = 0; i < c_h; ++i)
|
| + match &= (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U],
|
| + img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U],
|
| c_w) == 0);
|
|
|
| - for (i = 0; i < c_h; i++)
|
| - match &= (memcmp(img1->planes[VPX_PLANE_V]+i*img1->stride[VPX_PLANE_U],
|
| - img2->planes[VPX_PLANE_V]+i*img2->stride[VPX_PLANE_U],
|
| + for (i = 0; i < c_h; ++i)
|
| + match &= (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V],
|
| + img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V],
|
| c_w) == 0);
|
|
|
| return match;
|
| @@ -884,7 +607,7 @@
|
| struct stream_state *next;
|
| struct stream_config config;
|
| FILE *file;
|
| - struct rate_hist rate_hist;
|
| + struct rate_hist *rate_hist;
|
| struct EbmlGlobal ebml;
|
| uint32_t hash;
|
| uint64_t psnr_sse_total;
|
| @@ -924,7 +647,7 @@
|
|
|
| /* Initialize default parameters */
|
| memset(global, 0, sizeof(*global));
|
| - global->codec = codecs;
|
| + global->codec = get_vpx_encoder_by_index(0);
|
| global->passes = 0;
|
| global->use_i420 = 1;
|
| /* Assign default deadline to good quality */
|
| @@ -934,18 +657,9 @@
|
| arg.argv_step = 1;
|
|
|
| if (arg_match(&arg, &codecarg, argi)) {
|
| - int j, k = -1;
|
| -
|
| - for (j = 0; j < sizeof(codecs) / sizeof(codecs[0]); j++)
|
| - if (!strcmp(codecs[j].name, arg.val))
|
| - k = j;
|
| -
|
| - if (k >= 0)
|
| - global->codec = codecs + k;
|
| - else
|
| - die("Error: Unrecognized argument (%s) to --codec\n",
|
| - arg.val);
|
| -
|
| + global->codec = get_vpx_encoder_by_name(arg.val);
|
| + if (!global->codec)
|
| + die("Error: Unrecognized argument (%s) to --codec\n", arg.val);
|
| } else if (arg_match(&arg, &passes, argi)) {
|
| global->passes = arg_parse_uint(&arg);
|
|
|
| @@ -1008,7 +722,7 @@
|
| #if CONFIG_VP9_ENCODER
|
| // Make default VP9 passes = 2 until there is a better quality 1-pass
|
| // encoder
|
| - global->passes = (global->codec->iface == vpx_codec_vp9_cx ? 2 : 1);
|
| + global->passes = strcmp(global->codec->name, "vp9") == 0 ? 2 : 1;
|
| #else
|
| global->passes = 1;
|
| #endif
|
| @@ -1088,7 +802,7 @@
|
| vpx_codec_err_t res;
|
|
|
| /* Populate encoder configuration */
|
| - res = vpx_codec_enc_config_default(global->codec->iface(),
|
| + res = vpx_codec_enc_config_default(global->codec->interface(),
|
| &stream->config.cfg,
|
| global->usage);
|
| if (res)
|
| @@ -1132,15 +846,15 @@
|
| struct stream_config *config = &stream->config;
|
| int eos_mark_found = 0;
|
|
|
| - /* Handle codec specific options */
|
| + // Handle codec specific options
|
| if (0) {
|
| #if CONFIG_VP8_ENCODER
|
| - } else if (global->codec->iface == vpx_codec_vp8_cx) {
|
| + } else if (strcmp(global->codec->name, "vp8") == 0) {
|
| ctrl_args = vp8_args;
|
| ctrl_args_map = vp8_arg_ctrl_map;
|
| #endif
|
| #if CONFIG_VP9_ENCODER
|
| - } else if (global->codec->iface == vpx_codec_vp9_cx) {
|
| + } else if (strcmp(global->codec->name, "vp9") == 0) {
|
| ctrl_args = vp9_args;
|
| ctrl_args_map = vp9_arg_ctrl_map;
|
| #endif
|
| @@ -1348,7 +1062,7 @@
|
|
|
| if (stream->index == 0) {
|
| fprintf(stderr, "Codec: %s\n",
|
| - vpx_codec_iface_name(global->codec->iface()));
|
| + vpx_codec_iface_name(global->codec->interface()));
|
| fprintf(stderr, "Source file: %s Format: %s\n", input->filename,
|
| input->use_i420 ? "I420" : "YV12");
|
| }
|
| @@ -1472,7 +1186,7 @@
|
| flags |= global->out_part ? VPX_CODEC_USE_OUTPUT_PARTITION : 0;
|
|
|
| /* Construct Encoder Context */
|
| - vpx_codec_enc_init(&stream->encoder, global->codec->iface(),
|
| + vpx_codec_enc_init(&stream->encoder, global->codec->interface(),
|
| &stream->config.cfg, flags);
|
| ctx_exit_on_error(&stream->encoder, "Failed to initialize encoder");
|
|
|
| @@ -1492,7 +1206,8 @@
|
|
|
| #if CONFIG_DECODERS
|
| if (global->test_decode != TEST_DECODE_OFF) {
|
| - vpx_codec_dec_init(&stream->decoder, global->codec->dx_iface(), NULL, 0);
|
| + const VpxInterface *decoder = get_vpx_decoder_by_name(global->codec->name);
|
| + vpx_codec_dec_init(&stream->decoder, decoder->interface(), NULL, 0);
|
| }
|
| #endif
|
| }
|
| @@ -1576,7 +1291,7 @@
|
| if (!global->quiet)
|
| fprintf(stderr, " %6luF", (unsigned long)pkt->data.frame.sz);
|
|
|
| - update_rate_histogram(&stream->rate_hist, cfg, pkt);
|
| + update_rate_histogram(stream->rate_hist, cfg, pkt);
|
| if (stream->config.write_webm) {
|
| /* Update the hash */
|
| if (!stream->ebml.debug)
|
| @@ -1590,7 +1305,7 @@
|
| ivf_header_pos = ftello(stream->file);
|
| fsize = pkt->data.frame.sz;
|
|
|
| - ivf_write_frame_header(stream->file, pkt);
|
| + ivf_write_frame_header(stream->file, pkt->data.frame.pts, fsize);
|
| } else {
|
| fsize += pkt->data.frame.sz;
|
|
|
| @@ -1611,7 +1326,7 @@
|
| #if CONFIG_DECODERS
|
| if (global->test_decode != TEST_DECODE_OFF && !stream->mismatch_seen) {
|
| vpx_codec_decode(&stream->decoder, pkt->data.frame.buf,
|
| - pkt->data.frame.sz, NULL, 0);
|
| + (unsigned int)pkt->data.frame.sz, NULL, 0);
|
| if (stream->decoder.err) {
|
| warn_or_exit_on_error(&stream->decoder,
|
| global->test_decode == TEST_DECODE_FATAL,
|
| @@ -1678,14 +1393,14 @@
|
|
|
| static void test_decode(struct stream_state *stream,
|
| enum TestDecodeFatality fatal,
|
| - const struct codec_item *codec) {
|
| + const VpxInterface *codec) {
|
| vpx_image_t enc_img, dec_img;
|
|
|
| if (stream->mismatch_seen)
|
| return;
|
|
|
| /* Get the internal reference frame */
|
| - if (codec->fourcc == VP8_FOURCC) {
|
| + if (strcmp(codec->name, "vp8") == 0) {
|
| struct vpx_ref_frame ref_enc, ref_dec;
|
| int width, height;
|
|
|
| @@ -1734,7 +1449,9 @@
|
|
|
|
|
| static void print_time(const char *label, int64_t etl) {
|
| - int hours, mins, secs;
|
| + int64_t hours;
|
| + int64_t mins;
|
| + int64_t secs;
|
|
|
| if (etl >= 0) {
|
| hours = etl / 3600;
|
| @@ -1743,7 +1460,7 @@
|
| etl -= mins * 60;
|
| secs = etl;
|
|
|
| - fprintf(stderr, "[%3s %2d:%02d:%02d] ",
|
| + fprintf(stderr, "[%3s %2"PRId64":%02"PRId64": % 02"PRId64"] ",
|
| label, hours, mins, secs);
|
| } else {
|
| fprintf(stderr, "[%3s unknown] ", label);
|
| @@ -1881,9 +1598,9 @@
|
| : VPX_IMG_FMT_YV12,
|
| input.width, input.height, 32);
|
|
|
| - FOREACH_STREAM(init_rate_histogram(&stream->rate_hist,
|
| - &stream->config.cfg,
|
| - &global.framerate));
|
| + FOREACH_STREAM(stream->rate_hist =
|
| + init_rate_histogram(&stream->config.cfg,
|
| + &global.framerate));
|
| }
|
|
|
| FOREACH_STREAM(setup_pass(stream, &global, pass));
|
| @@ -1947,7 +1664,7 @@
|
| int64_t rate;
|
|
|
| if (global.limit) {
|
| - int frame_in_lagged = (seen_frames - lagged_count) * 1000;
|
| + off_t frame_in_lagged = (seen_frames - lagged_count) * 1000;
|
|
|
| rate = cx_time ? frame_in_lagged * (int64_t)1000000 / cx_time : 0;
|
| remaining = 1000 * (global.limit - global.skip_frames
|
| @@ -2020,10 +1737,10 @@
|
| global.show_q_hist_buckets));
|
|
|
| if (global.show_rate_hist_buckets)
|
| - FOREACH_STREAM(show_rate_histogram(&stream->rate_hist,
|
| + FOREACH_STREAM(show_rate_histogram(stream->rate_hist,
|
| &stream->config.cfg,
|
| global.show_rate_hist_buckets));
|
| - FOREACH_STREAM(destroy_rate_histogram(&stream->rate_hist));
|
| + FOREACH_STREAM(destroy_rate_histogram(stream->rate_hist));
|
|
|
| #if CONFIG_INTERNAL_STATS
|
| /* TODO(jkoleszar): This doesn't belong in this executable. Do it for now,
|
|
|