/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#include "./vpx_config.h"
#include "./vp8_rtcd.h"
#include "./vpx_dsp_rtcd.h"
#include "./vpx_scale_rtcd.h"
#include "vpx/vpx_codec.h"
#include "vpx/internal/vpx_codec_internal.h"
#include "vpx_version.h"
#include "vpx_mem/vpx_mem.h"
#include "vpx_ports/vpx_once.h"
#include "vp8/encoder/onyx_int.h"
#include "vpx/vp8cx.h"
#include "vp8/encoder/firstpass.h"
#include "vp8/common/onyx.h"
#include <stdlib.h>
#include <string.h>

struct vp8_extracfg
{
    struct vpx_codec_pkt_list *pkt_list;
    int                         cpu_used;                    /** available cpu percentage in 1/16*/
    unsigned int                enable_auto_alt_ref;           /** if encoder decides to uses alternate reference frame */
    unsigned int                noise_sensitivity;
    unsigned int                Sharpness;
    unsigned int                static_thresh;
    unsigned int                token_partitions;
    unsigned int                arnr_max_frames;    /* alt_ref Noise Reduction Max Frame Count */
    unsigned int                arnr_strength;    /* alt_ref Noise Reduction Strength */
    unsigned int                arnr_type;        /* alt_ref filter type */
    vp8e_tuning                 tuning;
    unsigned int                cq_level;         /* constrained quality level */
    unsigned int                rc_max_intra_bitrate_pct;
    unsigned int                screen_content_mode;

};

static struct vp8_extracfg default_extracfg = {
  NULL,
#if !(CONFIG_REALTIME_ONLY)
  0,                          /* cpu_used      */
#else
  4,                          /* cpu_used      */
#endif
  0,                          /* enable_auto_alt_ref */
  0,                          /* noise_sensitivity */
  0,                          /* Sharpness */
  0,                          /* static_thresh */
#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
  VP8_EIGHT_TOKENPARTITION,
#else
  VP8_ONE_TOKENPARTITION,     /* token_partitions */
#endif
  0,                          /* arnr_max_frames */
  3,                          /* arnr_strength */
  3,                          /* arnr_type*/
  0,                          /* tuning*/
  10,                         /* cq_level */
  0,                          /* rc_max_intra_bitrate_pct */
  0,                          /* screen_content_mode */
};

struct vpx_codec_alg_priv
{
    vpx_codec_priv_t        base;
    vpx_codec_enc_cfg_t     cfg;
    struct vp8_extracfg     vp8_cfg;
    VP8_CONFIG              oxcf;
    struct VP8_COMP        *cpi;
    unsigned char          *cx_data;
    unsigned int            cx_data_sz;
    vpx_image_t             preview_img;
    unsigned int            next_frame_flag;
    vp8_postproc_cfg_t      preview_ppcfg;
    /* pkt_list size depends on the maximum number of lagged frames allowed. */
    vpx_codec_pkt_list_decl(64) pkt_list;
    unsigned int                fixed_kf_cntr;
    vpx_enc_frame_flags_t   control_frame_flags;
};


static vpx_codec_err_t
update_error_state(vpx_codec_alg_priv_t                 *ctx,
                   const struct vpx_internal_error_info *error)
{
    vpx_codec_err_t res;

    if ((res = error->error_code))
        ctx->base.err_detail = error->has_detail
                               ? error->detail
                               : NULL;

    return res;
}


#undef ERROR
#define ERROR(str) do {\
        ctx->base.err_detail = str;\
        return VPX_CODEC_INVALID_PARAM;\
    } while(0)

#define RANGE_CHECK(p,memb,lo,hi) do {\
        if(!(((p)->memb == lo || (p)->memb > (lo)) && (p)->memb <= hi)) \
            ERROR(#memb " out of range ["#lo".."#hi"]");\
    } while(0)

#define RANGE_CHECK_HI(p,memb,hi) do {\
        if(!((p)->memb <= (hi))) \
            ERROR(#memb " out of range [.."#hi"]");\
    } while(0)

#define RANGE_CHECK_LO(p,memb,lo) do {\
        if(!((p)->memb >= (lo))) \
            ERROR(#memb " out of range ["#lo"..]");\
    } while(0)

#define RANGE_CHECK_BOOL(p,memb) do {\
        if(!!((p)->memb) != (p)->memb) ERROR(#memb " expected boolean");\
    } while(0)

static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t      *ctx,
                                       const vpx_codec_enc_cfg_t *cfg,
                                       const struct vp8_extracfg *vp8_cfg,
                                       int                        finalize)
{
    RANGE_CHECK(cfg, g_w,                   1, 16383); /* 14 bits available */
    RANGE_CHECK(cfg, g_h,                   1, 16383); /* 14 bits available */
    RANGE_CHECK(cfg, g_timebase.den,        1, 1000000000);
    RANGE_CHECK(cfg, g_timebase.num,        1, 1000000000);
    RANGE_CHECK_HI(cfg, g_profile,          3);
    RANGE_CHECK_HI(cfg, rc_max_quantizer,   63);
    RANGE_CHECK_HI(cfg, rc_min_quantizer,   cfg->rc_max_quantizer);
    RANGE_CHECK_HI(cfg, g_threads,          64);
#if CONFIG_REALTIME_ONLY
    RANGE_CHECK_HI(cfg, g_lag_in_frames,    0);
#elif CONFIG_MULTI_RES_ENCODING
    if (ctx->base.enc.total_encoders > 1)
        RANGE_CHECK_HI(cfg, g_lag_in_frames,    0);
#else
    RANGE_CHECK_HI(cfg, g_lag_in_frames,    25);
#endif
    RANGE_CHECK(cfg, rc_end_usage,          VPX_VBR, VPX_Q);
    RANGE_CHECK_HI(cfg, rc_undershoot_pct,  1000);
    RANGE_CHECK_HI(cfg, rc_overshoot_pct,   1000);
    RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100);
    RANGE_CHECK(cfg, kf_mode,               VPX_KF_DISABLED, VPX_KF_AUTO);

/* TODO: add spatial re-sampling support and frame dropping in
 * multi-res-encoder.*/
#if CONFIG_MULTI_RES_ENCODING
    if (ctx->base.enc.total_encoders > 1)
        RANGE_CHECK_HI(cfg, rc_resize_allowed,     0);
#else
    RANGE_CHECK_BOOL(cfg, rc_resize_allowed);
#endif
    RANGE_CHECK_HI(cfg, rc_dropframe_thresh,   100);
    RANGE_CHECK_HI(cfg, rc_resize_up_thresh,   100);
    RANGE_CHECK_HI(cfg, rc_resize_down_thresh, 100);

#if CONFIG_REALTIME_ONLY
    RANGE_CHECK(cfg,        g_pass,         VPX_RC_ONE_PASS, VPX_RC_ONE_PASS);
#elif CONFIG_MULTI_RES_ENCODING
    if (ctx->base.enc.total_encoders > 1)
        RANGE_CHECK(cfg,    g_pass,         VPX_RC_ONE_PASS, VPX_RC_ONE_PASS);
#else
    RANGE_CHECK(cfg,        g_pass,         VPX_RC_ONE_PASS, VPX_RC_LAST_PASS);
#endif

    /* VP8 does not support a lower bound on the keyframe interval in
     * automatic keyframe placement mode.
     */
    if (cfg->kf_mode != VPX_KF_DISABLED && cfg->kf_min_dist != cfg->kf_max_dist
        && cfg->kf_min_dist > 0)
        ERROR("kf_min_dist not supported in auto mode, use 0 "
              "or kf_max_dist instead.");

    RANGE_CHECK_BOOL(vp8_cfg,               enable_auto_alt_ref);
    RANGE_CHECK(vp8_cfg, cpu_used,           -16, 16);

#if CONFIG_REALTIME_ONLY && !CONFIG_TEMPORAL_DENOISING
    RANGE_CHECK(vp8_cfg, noise_sensitivity,  0, 0);
#else
    RANGE_CHECK_HI(vp8_cfg, noise_sensitivity,  6);
#endif

    RANGE_CHECK(vp8_cfg, token_partitions,   VP8_ONE_TOKENPARTITION,
                VP8_EIGHT_TOKENPARTITION);
    RANGE_CHECK_HI(vp8_cfg, Sharpness,       7);
    RANGE_CHECK(vp8_cfg, arnr_max_frames, 0, 15);
    RANGE_CHECK_HI(vp8_cfg, arnr_strength,   6);
    RANGE_CHECK(vp8_cfg, arnr_type,       1, 3);
    RANGE_CHECK(vp8_cfg, cq_level, 0, 63);
    RANGE_CHECK_HI(vp8_cfg, screen_content_mode, 2);
    if (finalize && (cfg->rc_end_usage == VPX_CQ || cfg->rc_end_usage == VPX_Q))
        RANGE_CHECK(vp8_cfg, cq_level,
                    cfg->rc_min_quantizer, cfg->rc_max_quantizer);

#if !(CONFIG_REALTIME_ONLY)
    if (cfg->g_pass == VPX_RC_LAST_PASS)
    {
        size_t           packet_sz = sizeof(FIRSTPASS_STATS);
        int              n_packets = (int)(cfg->rc_twopass_stats_in.sz /
                                          packet_sz);
        FIRSTPASS_STATS *stats;

        if (!cfg->rc_twopass_stats_in.buf)
            ERROR("rc_twopass_stats_in.buf not set.");

        if (cfg->rc_twopass_stats_in.sz % packet_sz)
            ERROR("rc_twopass_stats_in.sz indicates truncated packet.");

        if (cfg->rc_twopass_stats_in.sz < 2 * packet_sz)
            ERROR("rc_twopass_stats_in requires at least two packets.");

        stats = (void*)((char *)cfg->rc_twopass_stats_in.buf
                + (n_packets - 1) * packet_sz);

        if ((int)(stats->count + 0.5) != n_packets - 1)
            ERROR("rc_twopass_stats_in missing EOS stats packet");
    }
#endif

    RANGE_CHECK(cfg, ts_number_layers, 1, 5);

    if (cfg->ts_number_layers > 1)
    {
        unsigned int i;
        RANGE_CHECK_HI(cfg, ts_periodicity, 16);

        for (i=1; i<cfg->ts_number_layers; i++)
            if (cfg->ts_target_bitrate[i] <= cfg->ts_target_bitrate[i-1] &&
                cfg->rc_target_bitrate > 0)
                ERROR("ts_target_bitrate entries are not strictly increasing");

        RANGE_CHECK(cfg, ts_rate_decimator[cfg->ts_number_layers-1], 1, 1);
        for (i=cfg->ts_number_layers-2; i>0; i--)
            if (cfg->ts_rate_decimator[i-1] != 2*cfg->ts_rate_decimator[i])
                ERROR("ts_rate_decimator factors are not powers of 2");

        RANGE_CHECK_HI(cfg, ts_layer_id[i], cfg->ts_number_layers-1);
    }

#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
    if(cfg->g_threads > (1 << vp8_cfg->token_partitions))
        ERROR("g_threads cannot be bigger than number of token partitions");
#endif

    return VPX_CODEC_OK;
}


static vpx_codec_err_t validate_img(vpx_codec_alg_priv_t *ctx,
                                    const vpx_image_t    *img)
{
    switch (img->fmt)
    {
    case VPX_IMG_FMT_YV12:
    case VPX_IMG_FMT_I420:
    case VPX_IMG_FMT_VPXI420:
    case VPX_IMG_FMT_VPXYV12:
        break;
    default:
        ERROR("Invalid image format. Only YV12 and I420 images are supported");
    }

    if ((img->d_w != ctx->cfg.g_w) || (img->d_h != ctx->cfg.g_h))
        ERROR("Image size must match encoder init configuration size");

    return VPX_CODEC_OK;
}


static vpx_codec_err_t set_vp8e_config(VP8_CONFIG *oxcf,
                                       vpx_codec_enc_cfg_t cfg,
                                       struct vp8_extracfg vp8_cfg,
                                       vpx_codec_priv_enc_mr_cfg_t *mr_cfg)
{
    oxcf->multi_threaded         = cfg.g_threads;
    oxcf->Version               = cfg.g_profile;

    oxcf->Width                 = cfg.g_w;
    oxcf->Height                = cfg.g_h;
    oxcf->timebase              = cfg.g_timebase;

    oxcf->error_resilient_mode = cfg.g_error_resilient;

    switch (cfg.g_pass)
    {
    case VPX_RC_ONE_PASS:
        oxcf->Mode = MODE_BESTQUALITY;
        break;
    case VPX_RC_FIRST_PASS:
        oxcf->Mode = MODE_FIRSTPASS;
        break;
    case VPX_RC_LAST_PASS:
        oxcf->Mode = MODE_SECONDPASS_BEST;
        break;
    }

    if (cfg.g_pass == VPX_RC_FIRST_PASS || cfg.g_pass == VPX_RC_ONE_PASS)
    {
        oxcf->allow_lag     = 0;
        oxcf->lag_in_frames = 0;
    }
    else
    {
        oxcf->allow_lag     = (cfg.g_lag_in_frames) > 0;
        oxcf->lag_in_frames = cfg.g_lag_in_frames;
    }

    oxcf->allow_df               = (cfg.rc_dropframe_thresh > 0);
    oxcf->drop_frames_water_mark   = cfg.rc_dropframe_thresh;

    oxcf->allow_spatial_resampling = cfg.rc_resize_allowed;
    oxcf->resample_up_water_mark   = cfg.rc_resize_up_thresh;
    oxcf->resample_down_water_mark = cfg.rc_resize_down_thresh;

    if (cfg.rc_end_usage == VPX_VBR) {
      oxcf->end_usage = USAGE_LOCAL_FILE_PLAYBACK;
    } else if (cfg.rc_end_usage == VPX_CBR) {
      oxcf->end_usage = USAGE_STREAM_FROM_SERVER;
    } else if (cfg.rc_end_usage == VPX_CQ) {
      oxcf->end_usage = USAGE_CONSTRAINED_QUALITY;
    } else if (cfg.rc_end_usage == VPX_Q) {
      oxcf->end_usage = USAGE_CONSTANT_QUALITY;
    }

    oxcf->target_bandwidth         = cfg.rc_target_bitrate;
    oxcf->rc_max_intra_bitrate_pct = vp8_cfg.rc_max_intra_bitrate_pct;

    oxcf->best_allowed_q           = cfg.rc_min_quantizer;
    oxcf->worst_allowed_q          = cfg.rc_max_quantizer;
    oxcf->cq_level                 = vp8_cfg.cq_level;
    oxcf->fixed_q = -1;

    oxcf->under_shoot_pct          = cfg.rc_undershoot_pct;
    oxcf->over_shoot_pct           = cfg.rc_overshoot_pct;

    oxcf->maximum_buffer_size_in_ms   = cfg.rc_buf_sz;
    oxcf->starting_buffer_level_in_ms = cfg.rc_buf_initial_sz;
    oxcf->optimal_buffer_level_in_ms  = cfg.rc_buf_optimal_sz;

    oxcf->maximum_buffer_size      = cfg.rc_buf_sz;
    oxcf->starting_buffer_level    = cfg.rc_buf_initial_sz;
    oxcf->optimal_buffer_level     = cfg.rc_buf_optimal_sz;

    oxcf->two_pass_vbrbias         = cfg.rc_2pass_vbr_bias_pct;
    oxcf->two_pass_vbrmin_section  = cfg.rc_2pass_vbr_minsection_pct;
    oxcf->two_pass_vbrmax_section  = cfg.rc_2pass_vbr_maxsection_pct;

    oxcf->auto_key                 = cfg.kf_mode == VPX_KF_AUTO
                                       && cfg.kf_min_dist != cfg.kf_max_dist;
    oxcf->key_freq                 = cfg.kf_max_dist;

    oxcf->number_of_layers         = cfg.ts_number_layers;
    oxcf->periodicity              = cfg.ts_periodicity;

    if (oxcf->number_of_layers > 1)
    {
        memcpy (oxcf->target_bitrate, cfg.ts_target_bitrate,
                sizeof(cfg.ts_target_bitrate));
        memcpy (oxcf->rate_decimator, cfg.ts_rate_decimator,
                sizeof(cfg.ts_rate_decimator));
        memcpy (oxcf->layer_id, cfg.ts_layer_id, sizeof(cfg.ts_layer_id));
    }

#if CONFIG_MULTI_RES_ENCODING
    /* When mr_cfg is NULL, oxcf->mr_total_resolutions and oxcf->mr_encoder_id
     * are both memset to 0, which ensures the correct logic under this
     * situation.
     */
    if(mr_cfg)
    {
        oxcf->mr_total_resolutions        = mr_cfg->mr_total_resolutions;
        oxcf->mr_encoder_id               = mr_cfg->mr_encoder_id;
        oxcf->mr_down_sampling_factor.num = mr_cfg->mr_down_sampling_factor.num;
        oxcf->mr_down_sampling_factor.den = mr_cfg->mr_down_sampling_factor.den;
        oxcf->mr_low_res_mode_info        = mr_cfg->mr_low_res_mode_info;
    }
#else
    (void)mr_cfg;
#endif

    oxcf->cpu_used               = vp8_cfg.cpu_used;
    oxcf->encode_breakout        = vp8_cfg.static_thresh;
    oxcf->play_alternate         = vp8_cfg.enable_auto_alt_ref;
    oxcf->noise_sensitivity      = vp8_cfg.noise_sensitivity;
    oxcf->Sharpness              = vp8_cfg.Sharpness;
    oxcf->token_partitions       = vp8_cfg.token_partitions;

    oxcf->two_pass_stats_in      = cfg.rc_twopass_stats_in;
    oxcf->output_pkt_list        = vp8_cfg.pkt_list;

    oxcf->arnr_max_frames        = vp8_cfg.arnr_max_frames;
    oxcf->arnr_strength          = vp8_cfg.arnr_strength;
    oxcf->arnr_type              = vp8_cfg.arnr_type;

    oxcf->tuning                 = vp8_cfg.tuning;

    oxcf->screen_content_mode    = vp8_cfg.screen_content_mode;

    /*
        printf("Current VP8 Settings: \n");
        printf("target_bandwidth: %d\n", oxcf->target_bandwidth);
        printf("noise_sensitivity: %d\n", oxcf->noise_sensitivity);
        printf("Sharpness: %d\n",    oxcf->Sharpness);
        printf("cpu_used: %d\n",  oxcf->cpu_used);
        printf("Mode: %d\n",     oxcf->Mode);
        printf("auto_key: %d\n",  oxcf->auto_key);
        printf("key_freq: %d\n", oxcf->key_freq);
        printf("end_usage: %d\n", oxcf->end_usage);
        printf("under_shoot_pct: %d\n", oxcf->under_shoot_pct);
        printf("over_shoot_pct: %d\n", oxcf->over_shoot_pct);
        printf("starting_buffer_level: %d\n", oxcf->starting_buffer_level);
        printf("optimal_buffer_level: %d\n",  oxcf->optimal_buffer_level);
        printf("maximum_buffer_size: %d\n", oxcf->maximum_buffer_size);
        printf("fixed_q: %d\n",  oxcf->fixed_q);
        printf("worst_allowed_q: %d\n", oxcf->worst_allowed_q);
        printf("best_allowed_q: %d\n", oxcf->best_allowed_q);
        printf("allow_spatial_resampling: %d\n",  oxcf->allow_spatial_resampling);
        printf("resample_down_water_mark: %d\n", oxcf->resample_down_water_mark);
        printf("resample_up_water_mark: %d\n", oxcf->resample_up_water_mark);
        printf("allow_df: %d\n", oxcf->allow_df);
        printf("drop_frames_water_mark: %d\n", oxcf->drop_frames_water_mark);
        printf("two_pass_vbrbias: %d\n",  oxcf->two_pass_vbrbias);
        printf("two_pass_vbrmin_section: %d\n", oxcf->two_pass_vbrmin_section);
        printf("two_pass_vbrmax_section: %d\n", oxcf->two_pass_vbrmax_section);
        printf("allow_lag: %d\n", oxcf->allow_lag);
        printf("lag_in_frames: %d\n", oxcf->lag_in_frames);
        printf("play_alternate: %d\n", oxcf->play_alternate);
        printf("Version: %d\n", oxcf->Version);
        printf("multi_threaded: %d\n",   oxcf->multi_threaded);
        printf("encode_breakout: %d\n", oxcf->encode_breakout);
    */
    return VPX_CODEC_OK;
}

static vpx_codec_err_t vp8e_set_config(vpx_codec_alg_priv_t       *ctx,
                                       const vpx_codec_enc_cfg_t  *cfg)
{
    vpx_codec_err_t res;

    if (cfg->g_w != ctx->cfg.g_w || cfg->g_h != ctx->cfg.g_h)
    {
        if (cfg->g_lag_in_frames > 1 || cfg->g_pass != VPX_RC_ONE_PASS)
            ERROR("Cannot change width or height after initialization");
        if ((ctx->cpi->initial_width && (int)cfg->g_w > ctx->cpi->initial_width) ||
            (ctx->cpi->initial_height && (int)cfg->g_h > ctx->cpi->initial_height))
            ERROR("Cannot increase width or height larger than their initial values");
    }

    /* Prevent increasing lag_in_frames. This check is stricter than it needs
     * to be -- the limit is not increasing past the first lag_in_frames
     * value, but we don't track the initial config, only the last successful
     * config.
     */
    if ((cfg->g_lag_in_frames > ctx->cfg.g_lag_in_frames))
        ERROR("Cannot increase lag_in_frames");

    res = validate_config(ctx, cfg, &ctx->vp8_cfg, 0);

    if (!res)
    {
        ctx->cfg = *cfg;
        set_vp8e_config(&ctx->oxcf, ctx->cfg, ctx->vp8_cfg, NULL);
        vp8_change_config(ctx->cpi, &ctx->oxcf);
    }

    return res;
}

static vpx_codec_err_t get_quantizer(vpx_codec_alg_priv_t *ctx, va_list args)
{
  int *const arg = va_arg(args, int *);
  if (arg == NULL)
    return VPX_CODEC_INVALID_PARAM;
  *arg = vp8_get_quantizer(ctx->cpi);
  return VPX_CODEC_OK;
}

static vpx_codec_err_t get_quantizer64(vpx_codec_alg_priv_t *ctx, va_list args)
{
  int *const arg = va_arg(args, int *);
  if (arg == NULL)
    return VPX_CODEC_INVALID_PARAM;
  *arg = vp8_reverse_trans(vp8_get_quantizer(ctx->cpi));
  return VPX_CODEC_OK;
}

static vpx_codec_err_t update_extracfg(vpx_codec_alg_priv_t *ctx,
                                       const struct vp8_extracfg *extra_cfg)
{
  const vpx_codec_err_t res = validate_config(ctx, &ctx->cfg, extra_cfg, 0);
  if (res == VPX_CODEC_OK) {
    ctx->vp8_cfg = *extra_cfg;
    set_vp8e_config(&ctx->oxcf, ctx->cfg, ctx->vp8_cfg, NULL);
    vp8_change_config(ctx->cpi, &ctx->oxcf);
  }
  return res;
}

static vpx_codec_err_t set_cpu_used(vpx_codec_alg_priv_t *ctx, va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.cpu_used = CAST(VP8E_SET_CPUUSED, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_enable_auto_alt_ref(vpx_codec_alg_priv_t *ctx,
                                               va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.enable_auto_alt_ref = CAST(VP8E_SET_ENABLEAUTOALTREF, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_noise_sensitivity(vpx_codec_alg_priv_t *ctx,
                                             va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.noise_sensitivity = CAST(VP8E_SET_NOISE_SENSITIVITY, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_sharpness(vpx_codec_alg_priv_t *ctx, va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.Sharpness = CAST(VP8E_SET_SHARPNESS, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_static_thresh(vpx_codec_alg_priv_t *ctx,
                                         va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.static_thresh = CAST(VP8E_SET_STATIC_THRESHOLD, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_token_partitions(vpx_codec_alg_priv_t *ctx,
                                            va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.token_partitions = CAST(VP8E_SET_TOKEN_PARTITIONS, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_arnr_max_frames(vpx_codec_alg_priv_t *ctx,
                                           va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.arnr_max_frames = CAST(VP8E_SET_ARNR_MAXFRAMES, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_arnr_strength(vpx_codec_alg_priv_t *ctx,
                                         va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.arnr_strength = CAST(VP8E_SET_ARNR_STRENGTH, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_arnr_type(vpx_codec_alg_priv_t *ctx, va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.arnr_type = CAST(VP8E_SET_ARNR_TYPE, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_tuning(vpx_codec_alg_priv_t *ctx, va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.tuning = CAST(VP8E_SET_TUNING, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_cq_level(vpx_codec_alg_priv_t *ctx, va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.cq_level = CAST(VP8E_SET_CQ_LEVEL, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_rc_max_intra_bitrate_pct(vpx_codec_alg_priv_t *ctx,
                                                    va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.rc_max_intra_bitrate_pct =
      CAST(VP8E_SET_MAX_INTRA_BITRATE_PCT, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t set_screen_content_mode(vpx_codec_alg_priv_t *ctx,
                                               va_list args)
{
  struct vp8_extracfg extra_cfg = ctx->vp8_cfg;
  extra_cfg.screen_content_mode =
      CAST(VP8E_SET_SCREEN_CONTENT_MODE, args);
  return update_extracfg(ctx, &extra_cfg);
}

static vpx_codec_err_t vp8e_mr_alloc_mem(const vpx_codec_enc_cfg_t *cfg,
                                        void **mem_loc)
{
    vpx_codec_err_t res = 0;

#if CONFIG_MULTI_RES_ENCODING
    LOWER_RES_FRAME_INFO *shared_mem_loc;
    int mb_rows = ((cfg->g_w + 15) >>4);
    int mb_cols = ((cfg->g_h + 15) >>4);

    shared_mem_loc = calloc(1, sizeof(LOWER_RES_FRAME_INFO));
    if(!shared_mem_loc)
    {
        res = VPX_CODEC_MEM_ERROR;
    }

    shared_mem_loc->mb_info = calloc(mb_rows*mb_cols, sizeof(LOWER_RES_MB_INFO));
    if(!(shared_mem_loc->mb_info))
    {
        res = VPX_CODEC_MEM_ERROR;
    }
    else
    {
        *mem_loc = (void *)shared_mem_loc;
        res = VPX_CODEC_OK;
    }
#else
    (void)cfg;
    (void)mem_loc;
#endif
    return res;
}

static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx,
                                 vpx_codec_priv_enc_mr_cfg_t *mr_cfg)
{
    vpx_codec_err_t        res = VPX_CODEC_OK;


    vp8_rtcd();
    vpx_dsp_rtcd();
    vpx_scale_rtcd();

    if (!ctx->priv)
    {
        struct vpx_codec_alg_priv *priv =
            (struct vpx_codec_alg_priv *)vpx_calloc(1, sizeof(*priv));

        if (!priv)
        {
            return VPX_CODEC_MEM_ERROR;
        }

        ctx->priv = (vpx_codec_priv_t *)priv;
        ctx->priv->init_flags = ctx->init_flags;

        if (ctx->config.enc)
        {
            /* Update the reference to the config structure to an
             * internal copy.
             */
            priv->cfg = *ctx->config.enc;
            ctx->config.enc = &priv->cfg;
        }

        priv->vp8_cfg = default_extracfg;
        priv->vp8_cfg.pkt_list = &priv->pkt_list.head;

        priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 2;

        if (priv->cx_data_sz < 32768) priv->cx_data_sz = 32768;

        priv->cx_data = malloc(priv->cx_data_sz);

        if (!priv->cx_data)
        {
            return VPX_CODEC_MEM_ERROR;
        }

        if(mr_cfg)
            ctx->priv->enc.total_encoders   = mr_cfg->mr_total_resolutions;
        else
            ctx->priv->enc.total_encoders   = 1;

        once(vp8_initialize_enc);

        res = validate_config(priv, &priv->cfg, &priv->vp8_cfg, 0);

        if (!res)
        {
            set_vp8e_config(&priv->oxcf, priv->cfg, priv->vp8_cfg, mr_cfg);
            priv->cpi = vp8_create_compressor(&priv->oxcf);
            if (!priv->cpi)
                res = VPX_CODEC_MEM_ERROR;
        }
    }

    return res;
}

static vpx_codec_err_t vp8e_destroy(vpx_codec_alg_priv_t *ctx)
{
#if CONFIG_MULTI_RES_ENCODING
    /* Free multi-encoder shared memory */
    if (ctx->oxcf.mr_total_resolutions > 0 && (ctx->oxcf.mr_encoder_id == ctx->oxcf.mr_total_resolutions-1))
    {
        LOWER_RES_FRAME_INFO *shared_mem_loc = (LOWER_RES_FRAME_INFO *)ctx->oxcf.mr_low_res_mode_info;
        free(shared_mem_loc->mb_info);
        free(ctx->oxcf.mr_low_res_mode_info);
    }
#endif

    free(ctx->cx_data);
    vp8_remove_compressor(&ctx->cpi);
    vpx_free(ctx);
    return VPX_CODEC_OK;
}

static vpx_codec_err_t image2yuvconfig(const vpx_image_t   *img,
                                       YV12_BUFFER_CONFIG  *yv12)
{
    const int y_w = img->d_w;
    const int y_h = img->d_h;
    const int uv_w = (img->d_w + 1) / 2;
    const int uv_h = (img->d_h + 1) / 2;
    vpx_codec_err_t        res = VPX_CODEC_OK;
    yv12->y_buffer = img->planes[VPX_PLANE_Y];
    yv12->u_buffer = img->planes[VPX_PLANE_U];
    yv12->v_buffer = img->planes[VPX_PLANE_V];

    yv12->y_crop_width  = y_w;
    yv12->y_crop_height = y_h;
    yv12->y_width  = y_w;
    yv12->y_height = y_h;
    yv12->uv_crop_width = uv_w;
    yv12->uv_crop_height = uv_h;
    yv12->uv_width = uv_w;
    yv12->uv_height = uv_h;

    yv12->y_stride = img->stride[VPX_PLANE_Y];
    yv12->uv_stride = img->stride[VPX_PLANE_U];

    yv12->border  = (img->stride[VPX_PLANE_Y] - img->w) / 2;
    return res;
}

static void pick_quickcompress_mode(vpx_codec_alg_priv_t  *ctx,
                                    unsigned long          duration,
                                    unsigned long          deadline)
{
    unsigned int new_qc;

#if !(CONFIG_REALTIME_ONLY)
    /* Use best quality mode if no deadline is given. */
    new_qc = MODE_BESTQUALITY;

    if (deadline)
    {
        uint64_t     duration_us;

        /* Convert duration parameter from stream timebase to microseconds */
        duration_us = (uint64_t)duration * 1000000
                      * (uint64_t)ctx->cfg.g_timebase.num
                      / (uint64_t)ctx->cfg.g_timebase.den;

        /* If the deadline is more that the duration this frame is to be shown,
         * use good quality mode. Otherwise use realtime mode.
         */
        new_qc = (deadline > duration_us) ? MODE_GOODQUALITY : MODE_REALTIME;
    }

#else
    new_qc = MODE_REALTIME;
#endif

    if (ctx->cfg.g_pass == VPX_RC_FIRST_PASS)
        new_qc = MODE_FIRSTPASS;
    else if (ctx->cfg.g_pass == VPX_RC_LAST_PASS)
        new_qc = (new_qc == MODE_BESTQUALITY)
                 ? MODE_SECONDPASS_BEST
                 : MODE_SECONDPASS;

    if (ctx->oxcf.Mode != new_qc)
    {
        ctx->oxcf.Mode = new_qc;
        vp8_change_config(ctx->cpi, &ctx->oxcf);
    }
}

static vpx_codec_err_t set_reference_and_update(vpx_codec_alg_priv_t *ctx,
                                                int flags)
{

    /* Handle Flags */
    if (((flags & VP8_EFLAG_NO_UPD_GF) && (flags & VP8_EFLAG_FORCE_GF))
        || ((flags & VP8_EFLAG_NO_UPD_ARF) && (flags & VP8_EFLAG_FORCE_ARF)))
    {
        ctx->base.err_detail = "Conflicting flags.";
        return VPX_CODEC_INVALID_PARAM;
    }

    if (flags & (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF
                 | VP8_EFLAG_NO_REF_ARF))
    {
        int ref = 7;

        if (flags & VP8_EFLAG_NO_REF_LAST)
            ref ^= VP8_LAST_FRAME;

        if (flags & VP8_EFLAG_NO_REF_GF)
            ref ^= VP8_GOLD_FRAME;

        if (flags & VP8_EFLAG_NO_REF_ARF)
            ref ^= VP8_ALTR_FRAME;

        vp8_use_as_reference(ctx->cpi, ref);
    }

    if (flags & (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF
                 | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_FORCE_GF
                 | VP8_EFLAG_FORCE_ARF))
    {
        int upd = 7;

        if (flags & VP8_EFLAG_NO_UPD_LAST)
            upd ^= VP8_LAST_FRAME;

        if (flags & VP8_EFLAG_NO_UPD_GF)
            upd ^= VP8_GOLD_FRAME;

        if (flags & VP8_EFLAG_NO_UPD_ARF)
            upd ^= VP8_ALTR_FRAME;

        vp8_update_reference(ctx->cpi, upd);
    }

    if (flags & VP8_EFLAG_NO_UPD_ENTROPY)
    {
        vp8_update_entropy(ctx->cpi, 0);
    }

    return VPX_CODEC_OK;
}

static vpx_codec_err_t vp8e_encode(vpx_codec_alg_priv_t  *ctx,
                                   const vpx_image_t     *img,
                                   vpx_codec_pts_t        pts,
                                   unsigned long          duration,
                                   vpx_enc_frame_flags_t  flags,
                                   unsigned long          deadline)
{
    vpx_codec_err_t res = VPX_CODEC_OK;

    if (!ctx->cfg.rc_target_bitrate)
        return res;

    if (img)
        res = validate_img(ctx, img);

    if (!res)
        res = validate_config(ctx, &ctx->cfg, &ctx->vp8_cfg, 1);

    pick_quickcompress_mode(ctx, duration, deadline);
    vpx_codec_pkt_list_init(&ctx->pkt_list);

    // If no flags are set in the encode call, then use the frame flags as
    // defined via the control function: vp8e_set_frame_flags.
    if (!flags) {
        flags = ctx->control_frame_flags;
    }
    ctx->control_frame_flags = 0;

    if (!res)
        res = set_reference_and_update(ctx, flags);

    /* Handle fixed keyframe intervals */
    if (ctx->cfg.kf_mode == VPX_KF_AUTO
        && ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist)
    {
        if (++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist)
        {
            flags |= VPX_EFLAG_FORCE_KF;
            ctx->fixed_kf_cntr = 1;
        }
    }

    /* Initialize the encoder instance on the first frame*/
    if (!res && ctx->cpi)
    {
        unsigned int lib_flags;
        YV12_BUFFER_CONFIG sd;
        int64_t dst_time_stamp, dst_end_time_stamp;
        unsigned long size, cx_data_sz;
        unsigned char *cx_data;
        unsigned char *cx_data_end;
        int comp_data_state = 0;

        /* Set up internal flags */
        if (ctx->base.init_flags & VPX_CODEC_USE_PSNR)
            ((VP8_COMP *)ctx->cpi)->b_calculate_psnr = 1;

        if (ctx->base.init_flags & VPX_CODEC_USE_OUTPUT_PARTITION)
            ((VP8_COMP *)ctx->cpi)->output_partition = 1;

        /* Convert API flags to internal codec lib flags */
        lib_flags = (flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;

        /* vp8 use 10,000,000 ticks/second as time stamp */
        dst_time_stamp    = pts * 10000000 * ctx->cfg.g_timebase.num / ctx->cfg.g_timebase.den;
        dst_end_time_stamp = (pts + duration) * 10000000 * ctx->cfg.g_timebase.num / ctx->cfg.g_timebase.den;

        if (img != NULL)
        {
            res = image2yuvconfig(img, &sd);

            if (vp8_receive_raw_frame(ctx->cpi, ctx->next_frame_flag | lib_flags,
                                      &sd, dst_time_stamp, dst_end_time_stamp))
            {
                VP8_COMP *cpi = (VP8_COMP *)ctx->cpi;
                res = update_error_state(ctx, &cpi->common.error);
            }

            /* reset for next frame */
            ctx->next_frame_flag = 0;
        }

        cx_data = ctx->cx_data;
        cx_data_sz = ctx->cx_data_sz;
        cx_data_end = ctx->cx_data + cx_data_sz;
        lib_flags = 0;

        while (cx_data_sz >= ctx->cx_data_sz / 2)
        {
            comp_data_state = vp8_get_compressed_data(ctx->cpi,
                                                  &lib_flags,
                                                  &size,
                                                  cx_data,
                                                  cx_data_end,
                                                  &dst_time_stamp,
                                                  &dst_end_time_stamp,
                                                  !img);

            if(comp_data_state == VPX_CODEC_CORRUPT_FRAME)
                return VPX_CODEC_CORRUPT_FRAME;
            else if(comp_data_state == -1)
                break;

            if (size)
            {
                vpx_codec_pts_t    round, delta;
                vpx_codec_cx_pkt_t pkt;
                VP8_COMP *cpi = (VP8_COMP *)ctx->cpi;

                /* Add the frame packet to the list of returned packets. */
                round = (vpx_codec_pts_t)10000000
                        * ctx->cfg.g_timebase.num / 2 - 1;
                delta = (dst_end_time_stamp - dst_time_stamp);
                pkt.kind = VPX_CODEC_CX_FRAME_PKT;
                pkt.data.frame.pts =
                    (dst_time_stamp * ctx->cfg.g_timebase.den + round)
                    / ctx->cfg.g_timebase.num / 10000000;
                pkt.data.frame.duration = (unsigned long)
                    ((delta * ctx->cfg.g_timebase.den + round)
                    / ctx->cfg.g_timebase.num / 10000000);
                pkt.data.frame.flags = lib_flags << 16;

                if (lib_flags & FRAMEFLAGS_KEY)
                    pkt.data.frame.flags |= VPX_FRAME_IS_KEY;

                if (!cpi->common.show_frame)
                {
                    pkt.data.frame.flags |= VPX_FRAME_IS_INVISIBLE;

                    /* This timestamp should be as close as possible to the
                     * prior PTS so that if a decoder uses pts to schedule when
                     * to do this, we start right after last frame was decoded.
                     * Invisible frames have no duration.
                     */
                    pkt.data.frame.pts = ((cpi->last_time_stamp_seen
                        * ctx->cfg.g_timebase.den + round)
                        / ctx->cfg.g_timebase.num / 10000000) + 1;
                    pkt.data.frame.duration = 0;
                }

                if (cpi->droppable)
                    pkt.data.frame.flags |= VPX_FRAME_IS_DROPPABLE;

                if (cpi->output_partition)
                {
                    int i;
                    const int num_partitions =
                            (1 << cpi->common.multi_token_partition) + 1;

                    pkt.data.frame.flags |= VPX_FRAME_IS_FRAGMENT;

                    for (i = 0; i < num_partitions; ++i)
                    {
#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
                        pkt.data.frame.buf = cpi->partition_d[i];
#else
                        pkt.data.frame.buf = cx_data;
                        cx_data += cpi->partition_sz[i];
                        cx_data_sz -= cpi->partition_sz[i];
#endif
                        pkt.data.frame.sz = cpi->partition_sz[i];
                        pkt.data.frame.partition_id = i;
                        /* don't set the fragment bit for the last partition */
                        if (i == (num_partitions - 1))
                            pkt.data.frame.flags &= ~VPX_FRAME_IS_FRAGMENT;
                        vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt);
                    }
#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
                    /* In lagged mode the encoder can buffer multiple frames.
                     * We don't want this in partitioned output because
                     * partitions are spread all over the output buffer.
                     * So, force an exit!
                     */
                    cx_data_sz -= ctx->cx_data_sz / 2;
#endif
                }
                else
                {
                    pkt.data.frame.buf = cx_data;
                    pkt.data.frame.sz  = size;
                    pkt.data.frame.partition_id = -1;
                    vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt);
                    cx_data += size;
                    cx_data_sz -= size;
                }
            }
        }
    }

    return res;
}


static const vpx_codec_cx_pkt_t *vp8e_get_cxdata(vpx_codec_alg_priv_t  *ctx,
        vpx_codec_iter_t      *iter)
{
    return vpx_codec_pkt_list_get(&ctx->pkt_list.head, iter);
}

static vpx_codec_err_t vp8e_set_reference(vpx_codec_alg_priv_t *ctx,
                                          va_list args)
{
    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);

    if (data)
    {
        vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
        YV12_BUFFER_CONFIG sd;

        image2yuvconfig(&frame->img, &sd);
        vp8_set_reference(ctx->cpi, frame->frame_type, &sd);
        return VPX_CODEC_OK;
    }
    else
        return VPX_CODEC_INVALID_PARAM;

}

static vpx_codec_err_t vp8e_get_reference(vpx_codec_alg_priv_t *ctx,
                                          va_list args)
{

    vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);

    if (data)
    {
        vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
        YV12_BUFFER_CONFIG sd;

        image2yuvconfig(&frame->img, &sd);
        vp8_get_reference(ctx->cpi, frame->frame_type, &sd);
        return VPX_CODEC_OK;
    }
    else
        return VPX_CODEC_INVALID_PARAM;
}

static vpx_codec_err_t vp8e_set_previewpp(vpx_codec_alg_priv_t *ctx,
                                          va_list args)
{
#if CONFIG_POSTPROC
    vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *);

    if (data)
    {
        ctx->preview_ppcfg = *((vp8_postproc_cfg_t *)data);
        return VPX_CODEC_OK;
    }
    else
        return VPX_CODEC_INVALID_PARAM;
#else
    (void)ctx;
    (void)args;
    return VPX_CODEC_INCAPABLE;
#endif
}


static vpx_image_t *vp8e_get_preview(vpx_codec_alg_priv_t *ctx)
{

    YV12_BUFFER_CONFIG sd;
    vp8_ppflags_t flags = {0};

    if (ctx->preview_ppcfg.post_proc_flag)
    {
        flags.post_proc_flag        = ctx->preview_ppcfg.post_proc_flag;
        flags.deblocking_level      = ctx->preview_ppcfg.deblocking_level;
        flags.noise_level           = ctx->preview_ppcfg.noise_level;
    }

    if (0 == vp8_get_preview_raw_frame(ctx->cpi, &sd, &flags))
    {

        /*
        vpx_img_wrap(&ctx->preview_img, VPX_IMG_FMT_YV12,
            sd.y_width + 2*VP8BORDERINPIXELS,
            sd.y_height + 2*VP8BORDERINPIXELS,
            1,
            sd.buffer_alloc);
        vpx_img_set_rect(&ctx->preview_img,
            VP8BORDERINPIXELS, VP8BORDERINPIXELS,
            sd.y_width, sd.y_height);
            */

        ctx->preview_img.bps = 12;
        ctx->preview_img.planes[VPX_PLANE_Y] = sd.y_buffer;
        ctx->preview_img.planes[VPX_PLANE_U] = sd.u_buffer;
        ctx->preview_img.planes[VPX_PLANE_V] = sd.v_buffer;

        ctx->preview_img.fmt = VPX_IMG_FMT_I420;
        ctx->preview_img.x_chroma_shift = 1;
        ctx->preview_img.y_chroma_shift = 1;

        ctx->preview_img.d_w = sd.y_width;
        ctx->preview_img.d_h = sd.y_height;
        ctx->preview_img.stride[VPX_PLANE_Y] = sd.y_stride;
        ctx->preview_img.stride[VPX_PLANE_U] = sd.uv_stride;
        ctx->preview_img.stride[VPX_PLANE_V] = sd.uv_stride;
        ctx->preview_img.w   = sd.y_width;
        ctx->preview_img.h   = sd.y_height;

        return &ctx->preview_img;
    }
    else
        return NULL;
}

static vpx_codec_err_t vp8e_set_frame_flags(vpx_codec_alg_priv_t *ctx,
                                            va_list args)
{
    int frame_flags = va_arg(args, int);
    ctx->control_frame_flags = frame_flags;
    return set_reference_and_update(ctx, frame_flags);
}

static vpx_codec_err_t vp8e_set_temporal_layer_id(vpx_codec_alg_priv_t *ctx,
                                                  va_list args)
{
    int layer_id = va_arg(args, int);
    if (layer_id < 0 || layer_id >= (int)ctx->cfg.ts_number_layers) {
      return VPX_CODEC_INVALID_PARAM;
    }
    ctx->cpi->temporal_layer_id = layer_id;
    return VPX_CODEC_OK;
}

static vpx_codec_err_t vp8e_set_roi_map(vpx_codec_alg_priv_t *ctx,
                                        va_list args)
{
    vpx_roi_map_t *data = va_arg(args, vpx_roi_map_t *);

    if (data)
    {
        vpx_roi_map_t *roi = (vpx_roi_map_t *)data;

        if (!vp8_set_roimap(ctx->cpi, roi->roi_map, roi->rows, roi->cols, roi->delta_q, roi->delta_lf, roi->static_threshold))
            return VPX_CODEC_OK;
        else
            return VPX_CODEC_INVALID_PARAM;
    }
    else
        return VPX_CODEC_INVALID_PARAM;
}


static vpx_codec_err_t vp8e_set_activemap(vpx_codec_alg_priv_t *ctx,
                                          va_list args)
{
    vpx_active_map_t *data = va_arg(args, vpx_active_map_t *);

    if (data)
    {

        vpx_active_map_t *map = (vpx_active_map_t *)data;

        if (!vp8_set_active_map(ctx->cpi, map->active_map, map->rows, map->cols))
            return VPX_CODEC_OK;
        else
            return VPX_CODEC_INVALID_PARAM;
    }
    else
        return VPX_CODEC_INVALID_PARAM;
}

static vpx_codec_err_t vp8e_set_scalemode(vpx_codec_alg_priv_t *ctx,
                                          va_list args)
{

    vpx_scaling_mode_t *data =  va_arg(args, vpx_scaling_mode_t *);

    if (data)
    {
        int res;
        vpx_scaling_mode_t scalemode = *(vpx_scaling_mode_t *)data ;
        res = vp8_set_internal_size(ctx->cpi,
                                    (VPX_SCALING)scalemode.h_scaling_mode,
                                    (VPX_SCALING)scalemode.v_scaling_mode);

        if (!res)
        {
            /*force next frame a key frame to effect scaling mode */
            ctx->next_frame_flag |= FRAMEFLAGS_KEY;
            return VPX_CODEC_OK;
        }
        else
            return VPX_CODEC_INVALID_PARAM;
    }
    else
        return VPX_CODEC_INVALID_PARAM;
}


static vpx_codec_ctrl_fn_map_t vp8e_ctf_maps[] =
{
    {VP8_SET_REFERENCE,                 vp8e_set_reference},
    {VP8_COPY_REFERENCE,                vp8e_get_reference},
    {VP8_SET_POSTPROC,                  vp8e_set_previewpp},
    {VP8E_SET_FRAME_FLAGS,              vp8e_set_frame_flags},
    {VP8E_SET_TEMPORAL_LAYER_ID,        vp8e_set_temporal_layer_id},
    {VP8E_SET_ROI_MAP,                  vp8e_set_roi_map},
    {VP8E_SET_ACTIVEMAP,                vp8e_set_activemap},
    {VP8E_SET_SCALEMODE,                vp8e_set_scalemode},
    {VP8E_SET_CPUUSED,                  set_cpu_used},
    {VP8E_SET_NOISE_SENSITIVITY,        set_noise_sensitivity},
    {VP8E_SET_ENABLEAUTOALTREF,         set_enable_auto_alt_ref},
    {VP8E_SET_SHARPNESS,                set_sharpness},
    {VP8E_SET_STATIC_THRESHOLD,         set_static_thresh},
    {VP8E_SET_TOKEN_PARTITIONS,         set_token_partitions},
    {VP8E_GET_LAST_QUANTIZER,           get_quantizer},
    {VP8E_GET_LAST_QUANTIZER_64,        get_quantizer64},
    {VP8E_SET_ARNR_MAXFRAMES,           set_arnr_max_frames},
    {VP8E_SET_ARNR_STRENGTH ,           set_arnr_strength},
    {VP8E_SET_ARNR_TYPE     ,           set_arnr_type},
    {VP8E_SET_TUNING,                   set_tuning},
    {VP8E_SET_CQ_LEVEL,                 set_cq_level},
    {VP8E_SET_MAX_INTRA_BITRATE_PCT,    set_rc_max_intra_bitrate_pct},
    {VP8E_SET_SCREEN_CONTENT_MODE,      set_screen_content_mode},
    { -1, NULL},
};

static vpx_codec_enc_cfg_map_t vp8e_usage_cfg_map[] =
{
    {
    0,
    {
        0,                  /* g_usage */
        0,                  /* g_threads */
        0,                  /* g_profile */

        320,                /* g_width */
        240,                /* g_height */
        VPX_BITS_8,         /* g_bit_depth */
        8,                  /* g_input_bit_depth */

        {1, 30},            /* g_timebase */

        0,                  /* g_error_resilient */

        VPX_RC_ONE_PASS,    /* g_pass */

        0,                  /* g_lag_in_frames */

        0,                  /* rc_dropframe_thresh */
        0,                  /* rc_resize_allowed */
        1,                  /* rc_scaled_width */
        1,                  /* rc_scaled_height */
        60,                 /* rc_resize_down_thresold */
        30,                 /* rc_resize_up_thresold */

        VPX_VBR,            /* rc_end_usage */
        {0},                /* rc_twopass_stats_in */
        {0},                /* rc_firstpass_mb_stats_in */
        256,                /* rc_target_bandwidth */
        4,                  /* rc_min_quantizer */
        63,                 /* rc_max_quantizer */
        100,                /* rc_undershoot_pct */
        100,                /* rc_overshoot_pct */

        6000,               /* rc_max_buffer_size */
        4000,               /* rc_buffer_initial_size; */
        5000,               /* rc_buffer_optimal_size; */

        50,                 /* rc_two_pass_vbrbias  */
        0,                  /* rc_two_pass_vbrmin_section */
        400,                /* rc_two_pass_vbrmax_section */

        /* keyframing settings (kf) */
        VPX_KF_AUTO,        /* g_kfmode*/
        0,                  /* kf_min_dist */
        128,                /* kf_max_dist */

        VPX_SS_DEFAULT_LAYERS, /* ss_number_layers */
        {0},
        {0},                /* ss_target_bitrate */
        1,                  /* ts_number_layers */
        {0},                /* ts_target_bitrate */
        {0},                /* ts_rate_decimator */
        0,                  /* ts_periodicity */
        {0},                /* ts_layer_id */
    }},
};


#ifndef VERSION_STRING
#define VERSION_STRING
#endif
CODEC_INTERFACE(vpx_codec_vp8_cx) =
{
    "WebM Project VP8 Encoder" VERSION_STRING,
    VPX_CODEC_INTERNAL_ABI_VERSION,
    VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR |
    VPX_CODEC_CAP_OUTPUT_PARTITION,
    /* vpx_codec_caps_t          caps; */
    vp8e_init,          /* vpx_codec_init_fn_t       init; */
    vp8e_destroy,       /* vpx_codec_destroy_fn_t    destroy; */
    vp8e_ctf_maps,      /* vpx_codec_ctrl_fn_map_t  *ctrl_maps; */
    {
        NULL,    /* vpx_codec_peek_si_fn_t    peek_si; */
        NULL,    /* vpx_codec_get_si_fn_t     get_si; */
        NULL,    /* vpx_codec_decode_fn_t     decode; */
        NULL,    /* vpx_codec_frame_get_fn_t  frame_get; */
        NULL,    /* vpx_codec_set_fb_fn_t     set_fb_fn; */
    },
    {
        1,                  /* 1 cfg map */
        vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t    cfg_maps; */
        vp8e_encode,        /* vpx_codec_encode_fn_t      encode; */
        vp8e_get_cxdata,    /* vpx_codec_get_cx_data_fn_t   get_cx_data; */
        vp8e_set_config,
        NULL,
        vp8e_get_preview,
        vp8e_mr_alloc_mem,
    } /* encoder functions */
};
