1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_codec.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/internal/vpx_codec_internal.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_version.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/encoder/onyx_int.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vp8cx.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/encoder/firstpass.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/onyx.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h> 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h> 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan 23233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct vp8_extracfg 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_pkt_list *pkt_list; 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cpu_used; /** available cpu percentage in 1/16*/ 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int enable_auto_alt_ref; /** if encoder decides to uses alternate reference frame */ 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int noise_sensitivity; 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int Sharpness; 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int static_thresh; 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int token_partitions; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int arnr_max_frames; /* alt_ref Noise Reduction Max Frame Count */ 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int arnr_strength; /* alt_ref Noise Reduction Strength */ 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int arnr_type; /* alt_ref filter type */ 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_tuning tuning; 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int cq_level; /* constrained quality level */ 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int rc_max_intra_bitrate_pct; 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan 41233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct extraconfig_map 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan int usage; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vp8_extracfg cfg; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan 47233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const struct extraconfig_map extracfg_map[] = 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan NULL, 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_REALTIME_ONLY) 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* cpu_used */ 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, /* cpu_used */ 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* enable_auto_alt_ref */ 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* noise_sensitivity */ 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* Sharpness */ 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* static_thresh */ 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_EIGHT_TOKENPARTITION, 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_ONE_TOKENPARTITION, /* token_partitions */ 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* arnr_max_frames */ 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, /* arnr_strength */ 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, /* arnr_type*/ 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* tuning*/ 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 10, /* cq_level */ 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* rc_max_intra_bitrate_pct */ 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct vpx_codec_alg_priv 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_priv_t base; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_enc_cfg_t cfg; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vp8_extracfg vp8_cfg; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_CONFIG oxcf; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct VP8_COMP *cpi; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *cx_data; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int cx_data_sz; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_image_t preview_img; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int next_frame_flag; 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_postproc_cfg_t preview_ppcfg; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* pkt_list size depends on the maximum number of lagged frames allowed. */ 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pkt_list_decl(64) pkt_list; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int fixed_kf_cntr; 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan 95233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t 96233d2500723e5594f3e7c70896ffeeef32b9c950ywanupdate_error_state(vpx_codec_alg_priv_t *ctx, 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan const struct vpx_internal_error_info *error) 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((res = error->error_code)) 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->base.err_detail = error->has_detail 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? error->detail 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan : NULL; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef ERROR 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ERROR(str) do {\ 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->base.err_detail = str;\ 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM;\ 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RANGE_CHECK(p,memb,lo,hi) do {\ 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!(((p)->memb == lo || (p)->memb > (lo)) && (p)->memb <= hi)) \ 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR(#memb " out of range ["#lo".."#hi"]");\ 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RANGE_CHECK_HI(p,memb,hi) do {\ 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!((p)->memb <= (hi))) \ 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR(#memb " out of range [.."#hi"]");\ 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RANGE_CHECK_LO(p,memb,lo) do {\ 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!((p)->memb >= (lo))) \ 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR(#memb " out of range ["#lo"..]");\ 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RANGE_CHECK_BOOL(p,memb) do {\ 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!!((p)->memb) != (p)->memb) ERROR(#memb " expected boolean");\ 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 135233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx, 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vpx_codec_enc_cfg_t *cfg, 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan const struct vp8_extracfg *vp8_cfg, 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan int finalize) 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_w, 1, 16383); /* 14 bits available */ 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_h, 1, 16383); /* 14 bits available */ 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_timebase.den, 1, 1000000000); 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_timebase.num, 1, cfg->g_timebase.den); 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, g_profile, 3); 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_max_quantizer, 63); 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_min_quantizer, cfg->rc_max_quantizer); 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, g_threads, 64); 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, g_lag_in_frames, 0); 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif CONFIG_MULTI_RES_ENCODING 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->base.enc.total_encoders > 1) 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, g_lag_in_frames, 0); 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, g_lag_in_frames, 25); 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, rc_end_usage, VPX_VBR, VPX_Q); 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_undershoot_pct, 1000); 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_overshoot_pct, 1000); 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100); 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, kf_mode, VPX_KF_DISABLED, VPX_KF_AUTO); 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* TODO: add spatial re-sampling support and frame dropping in 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan * multi-res-encoder.*/ 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTI_RES_ENCODING 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->base.enc.total_encoders > 1) 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_resize_allowed, 0); 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_BOOL(cfg, rc_resize_allowed); 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_dropframe_thresh, 100); 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_resize_up_thresh, 100); 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, rc_resize_down_thresh, 100); 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_ONE_PASS); 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif CONFIG_MULTI_RES_ENCODING 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->base.enc.total_encoders > 1) 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_ONE_PASS); 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_LAST_PASS); 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* VP8 does not support a lower bound on the keyframe interval in 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan * automatic keyframe placement mode. 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->kf_mode != VPX_KF_DISABLED && cfg->kf_min_dist != cfg->kf_max_dist 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan && cfg->kf_min_dist > 0) 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("kf_min_dist not supported in auto mode, use 0 " 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan "or kf_max_dist instead."); 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_BOOL(vp8_cfg, enable_auto_alt_ref); 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, cpu_used, -16, 16); 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY && !CONFIG_TEMPORAL_DENOISING 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, noise_sensitivity, 0, 0); 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(vp8_cfg, noise_sensitivity, 6); 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, token_partitions, VP8_ONE_TOKENPARTITION, 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_EIGHT_TOKENPARTITION); 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(vp8_cfg, Sharpness, 7); 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, arnr_max_frames, 0, 15); 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(vp8_cfg, arnr_strength, 6); 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, arnr_type, 1, 3); 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, cq_level, 0, 63); 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (finalize && (cfg->rc_end_usage == VPX_CQ || cfg->rc_end_usage == VPX_Q)) 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(vp8_cfg, cq_level, 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg->rc_min_quantizer, cfg->rc_max_quantizer); 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_REALTIME_ONLY) 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->g_pass == VPX_RC_LAST_PASS) 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t packet_sz = sizeof(FIRSTPASS_STATS); 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan int n_packets = (int)(cfg->rc_twopass_stats_in.sz / 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan packet_sz); 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan FIRSTPASS_STATS *stats; 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cfg->rc_twopass_stats_in.buf) 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("rc_twopass_stats_in.buf not set."); 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->rc_twopass_stats_in.sz % packet_sz) 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("rc_twopass_stats_in.sz indicates truncated packet."); 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->rc_twopass_stats_in.sz < 2 * packet_sz) 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("rc_twopass_stats_in requires at least two packets."); 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan stats = (void*)((char *)cfg->rc_twopass_stats_in.buf 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan + (n_packets - 1) * packet_sz); 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((int)(stats->count + 0.5) != n_packets - 1) 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("rc_twopass_stats_in missing EOS stats packet"); 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, ts_number_layers, 1, 5); 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->ts_number_layers > 1) 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int i; 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, ts_periodicity, 16); 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i=1; i<cfg->ts_number_layers; i++) 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->ts_target_bitrate[i] <= cfg->ts_target_bitrate[i-1]) 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("ts_target_bitrate entries are not strictly increasing"); 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK(cfg, ts_rate_decimator[cfg->ts_number_layers-1], 1, 1); 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i=cfg->ts_number_layers-2; i>0; i--) 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg->ts_rate_decimator[i-1] != 2*cfg->ts_rate_decimator[i]) 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("ts_rate_decimator factors are not powers of 2"); 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan RANGE_CHECK_HI(cfg, ts_layer_id[i], cfg->ts_number_layers-1); 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(cfg->g_threads > (1 << vp8_cfg->token_partitions)) 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("g_threads cannot be bigger than number of token partitions"); 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan 264233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t validate_img(vpx_codec_alg_priv_t *ctx, 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vpx_image_t *img) 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (img->fmt) 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_IMG_FMT_YV12: 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_IMG_FMT_I420: 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_IMG_FMT_VPXI420: 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_IMG_FMT_VPXYV12: 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("Invalid image format. Only YV12 and I420 images are supported"); 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((img->d_w != ctx->cfg.g_w) || (img->d_h != ctx->cfg.g_h)) 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("Image size must match encoder init configuration size"); 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan 285233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t set_vp8e_config(VP8_CONFIG *oxcf, 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_enc_cfg_t cfg, 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vp8_extracfg vp8_cfg, 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_priv_enc_mr_cfg_t *mr_cfg) 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->multi_threaded = cfg.g_threads; 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Version = cfg.g_profile; 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Width = cfg.g_w; 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Height = cfg.g_h; 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->timebase = cfg.g_timebase; 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->error_resilient_mode = cfg.g_error_resilient; 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)mr_cfg; 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (cfg.g_pass) 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_RC_ONE_PASS: 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Mode = MODE_BESTQUALITY; 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_RC_FIRST_PASS: 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Mode = MODE_FIRSTPASS; 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan case VPX_RC_LAST_PASS: 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Mode = MODE_SECONDPASS_BEST; 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg.g_pass == VPX_RC_FIRST_PASS || cfg.g_pass == VPX_RC_ONE_PASS) 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->allow_lag = 0; 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->lag_in_frames = 0; 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->allow_lag = (cfg.g_lag_in_frames) > 0; 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->lag_in_frames = cfg.g_lag_in_frames; 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->allow_df = (cfg.rc_dropframe_thresh > 0); 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->drop_frames_water_mark = cfg.rc_dropframe_thresh; 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->allow_spatial_resampling = cfg.rc_resize_allowed; 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->resample_up_water_mark = cfg.rc_resize_up_thresh; 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->resample_down_water_mark = cfg.rc_resize_down_thresh; 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cfg.rc_end_usage == VPX_VBR) { 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->end_usage = USAGE_LOCAL_FILE_PLAYBACK; 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cfg.rc_end_usage == VPX_CBR) { 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->end_usage = USAGE_STREAM_FROM_SERVER; 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cfg.rc_end_usage == VPX_CQ) { 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->end_usage = USAGE_CONSTRAINED_QUALITY; 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cfg.rc_end_usage == VPX_Q) { 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->end_usage = USAGE_CONSTANT_QUALITY; 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->target_bandwidth = cfg.rc_target_bitrate; 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->rc_max_intra_bitrate_pct = vp8_cfg.rc_max_intra_bitrate_pct; 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->best_allowed_q = cfg.rc_min_quantizer; 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->worst_allowed_q = cfg.rc_max_quantizer; 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->cq_level = vp8_cfg.cq_level; 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->fixed_q = -1; 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->under_shoot_pct = cfg.rc_undershoot_pct; 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->over_shoot_pct = cfg.rc_overshoot_pct; 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->maximum_buffer_size_in_ms = cfg.rc_buf_sz; 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->starting_buffer_level_in_ms = cfg.rc_buf_initial_sz; 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->optimal_buffer_level_in_ms = cfg.rc_buf_optimal_sz; 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->maximum_buffer_size = cfg.rc_buf_sz; 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->starting_buffer_level = cfg.rc_buf_initial_sz; 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->optimal_buffer_level = cfg.rc_buf_optimal_sz; 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->two_pass_vbrbias = cfg.rc_2pass_vbr_bias_pct; 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->two_pass_vbrmin_section = cfg.rc_2pass_vbr_minsection_pct; 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->two_pass_vbrmax_section = cfg.rc_2pass_vbr_maxsection_pct; 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->auto_key = cfg.kf_mode == VPX_KF_AUTO 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan && cfg.kf_min_dist != cfg.kf_max_dist; 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->key_freq = cfg.kf_max_dist; 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->number_of_layers = cfg.ts_number_layers; 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->periodicity = cfg.ts_periodicity; 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (oxcf->number_of_layers > 1) 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan memcpy (oxcf->target_bitrate, cfg.ts_target_bitrate, 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan sizeof(cfg.ts_target_bitrate)); 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan memcpy (oxcf->rate_decimator, cfg.ts_rate_decimator, 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan sizeof(cfg.ts_rate_decimator)); 378233d2500723e5594f3e7c70896ffeeef32b9c950ywan memcpy (oxcf->layer_id, cfg.ts_layer_id, sizeof(cfg.ts_layer_id)); 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTI_RES_ENCODING 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* When mr_cfg is NULL, oxcf->mr_total_resolutions and oxcf->mr_encoder_id 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan * are both memset to 0, which ensures the correct logic under this 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan * situation. 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(mr_cfg) 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->mr_total_resolutions = mr_cfg->mr_total_resolutions; 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->mr_encoder_id = mr_cfg->mr_encoder_id; 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->mr_down_sampling_factor.num = mr_cfg->mr_down_sampling_factor.num; 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->mr_down_sampling_factor.den = mr_cfg->mr_down_sampling_factor.den; 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->mr_low_res_mode_info = mr_cfg->mr_low_res_mode_info; 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->cpu_used = vp8_cfg.cpu_used; 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->encode_breakout = vp8_cfg.static_thresh; 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->play_alternate = vp8_cfg.enable_auto_alt_ref; 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->noise_sensitivity = vp8_cfg.noise_sensitivity; 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->Sharpness = vp8_cfg.Sharpness; 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->token_partitions = vp8_cfg.token_partitions; 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->two_pass_stats_in = cfg.rc_twopass_stats_in; 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->output_pkt_list = vp8_cfg.pkt_list; 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->arnr_max_frames = vp8_cfg.arnr_max_frames; 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->arnr_strength = vp8_cfg.arnr_strength; 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->arnr_type = vp8_cfg.arnr_type; 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan oxcf->tuning = vp8_cfg.tuning; 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("Current VP8 Settings: \n"); 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("target_bandwidth: %d\n", oxcf->target_bandwidth); 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("noise_sensitivity: %d\n", oxcf->noise_sensitivity); 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("Sharpness: %d\n", oxcf->Sharpness); 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("cpu_used: %d\n", oxcf->cpu_used); 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("Mode: %d\n", oxcf->Mode); 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("auto_key: %d\n", oxcf->auto_key); 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("key_freq: %d\n", oxcf->key_freq); 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("end_usage: %d\n", oxcf->end_usage); 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("under_shoot_pct: %d\n", oxcf->under_shoot_pct); 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("over_shoot_pct: %d\n", oxcf->over_shoot_pct); 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("starting_buffer_level: %d\n", oxcf->starting_buffer_level); 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("optimal_buffer_level: %d\n", oxcf->optimal_buffer_level); 426233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("maximum_buffer_size: %d\n", oxcf->maximum_buffer_size); 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("fixed_q: %d\n", oxcf->fixed_q); 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("worst_allowed_q: %d\n", oxcf->worst_allowed_q); 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("best_allowed_q: %d\n", oxcf->best_allowed_q); 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("allow_spatial_resampling: %d\n", oxcf->allow_spatial_resampling); 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("resample_down_water_mark: %d\n", oxcf->resample_down_water_mark); 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("resample_up_water_mark: %d\n", oxcf->resample_up_water_mark); 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("allow_df: %d\n", oxcf->allow_df); 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("drop_frames_water_mark: %d\n", oxcf->drop_frames_water_mark); 435233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("two_pass_vbrbias: %d\n", oxcf->two_pass_vbrbias); 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("two_pass_vbrmin_section: %d\n", oxcf->two_pass_vbrmin_section); 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("two_pass_vbrmax_section: %d\n", oxcf->two_pass_vbrmax_section); 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("allow_lag: %d\n", oxcf->allow_lag); 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("lag_in_frames: %d\n", oxcf->lag_in_frames); 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("play_alternate: %d\n", oxcf->play_alternate); 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("Version: %d\n", oxcf->Version); 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("multi_threaded: %d\n", oxcf->multi_threaded); 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan printf("encode_breakout: %d\n", oxcf->encode_breakout); 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan 448233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_set_config(vpx_codec_alg_priv_t *ctx, 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vpx_codec_enc_cfg_t *cfg) 450233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res; 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (((cfg->g_w != ctx->cfg.g_w) || (cfg->g_h != ctx->cfg.g_h)) 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan && (cfg->g_lag_in_frames > 1 || cfg->g_pass != VPX_RC_ONE_PASS)) 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("Cannot change width or height after initialization"); 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Prevent increasing lag_in_frames. This check is stricter than it needs 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to be -- the limit is not increasing past the first lag_in_frames 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan * value, but we don't track the initial config, only the last successful 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan * config. 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 462233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((cfg->g_lag_in_frames > ctx->cfg.g_lag_in_frames)) 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan ERROR("Cannot increase lag_in_frames"); 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = validate_config(ctx, cfg, &ctx->vp8_cfg, 0); 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!res) 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->cfg = *cfg; 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan set_vp8e_config(&ctx->oxcf, ctx->cfg, ctx->vp8_cfg, NULL); 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_change_config(ctx->cpi, &ctx->oxcf); 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan 478233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_reverse_trans(int); 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan 481233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t get_param(vpx_codec_alg_priv_t *ctx, 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctrl_id, 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan void *arg = va_arg(args, void *); 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAP(id, var) case id: *(RECAST(id, arg)) = var; break 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!arg) 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (ctrl_id) 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_GET_LAST_QUANTIZER, vp8_get_quantizer(ctx->cpi)); 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_GET_LAST_QUANTIZER_64, vp8_reverse_trans(vp8_get_quantizer(ctx->cpi))); 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef MAP 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan 503233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t set_param(vpx_codec_alg_priv_t *ctx, 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctrl_id, 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 507233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res = VPX_CODEC_OK; 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vp8_extracfg xcfg = ctx->vp8_cfg; 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAP(id, var) case id: var = CAST(id, args); break; 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (ctrl_id) 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_CPUUSED, xcfg.cpu_used); 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_ENABLEAUTOALTREF, xcfg.enable_auto_alt_ref); 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_NOISE_SENSITIVITY, xcfg.noise_sensitivity); 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_SHARPNESS, xcfg.Sharpness); 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_STATIC_THRESHOLD, xcfg.static_thresh); 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_TOKEN_PARTITIONS, xcfg.token_partitions); 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_ARNR_MAXFRAMES, xcfg.arnr_max_frames); 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_ARNR_STRENGTH , xcfg.arnr_strength); 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_ARNR_TYPE , xcfg.arnr_type); 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_TUNING, xcfg.tuning); 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_CQ_LEVEL, xcfg.cq_level); 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan MAP(VP8E_SET_MAX_INTRA_BITRATE_PCT, xcfg.rc_max_intra_bitrate_pct); 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 529233d2500723e5594f3e7c70896ffeeef32b9c950ywan 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = validate_config(ctx, &ctx->cfg, &xcfg, 0); 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!res) 533233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->vp8_cfg = xcfg; 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan set_vp8e_config(&ctx->oxcf, ctx->cfg, ctx->vp8_cfg, NULL); 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_change_config(ctx->cpi, &ctx->oxcf); 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 540233d2500723e5594f3e7c70896ffeeef32b9c950ywan#undef MAP 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 542233d2500723e5594f3e7c70896ffeeef32b9c950ywan 543233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_mr_alloc_mem(const vpx_codec_enc_cfg_t *cfg, 544233d2500723e5594f3e7c70896ffeeef32b9c950ywan void **mem_loc) 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res = 0; 547233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)cfg; 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)mem_loc; 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTI_RES_ENCODING 550233d2500723e5594f3e7c70896ffeeef32b9c950ywan LOWER_RES_FRAME_INFO *shared_mem_loc; 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_rows = ((cfg->g_w + 15) >>4); 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_cols = ((cfg->g_h + 15) >>4); 553233d2500723e5594f3e7c70896ffeeef32b9c950ywan 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan shared_mem_loc = calloc(1, sizeof(LOWER_RES_FRAME_INFO)); 555233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!shared_mem_loc) 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = VPX_CODEC_MEM_ERROR; 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan shared_mem_loc->mb_info = calloc(mb_rows*mb_cols, sizeof(LOWER_RES_MB_INFO)); 561233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!(shared_mem_loc->mb_info)) 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = VPX_CODEC_MEM_ERROR; 564233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 567233d2500723e5594f3e7c70896ffeeef32b9c950ywan *mem_loc = (void *)shared_mem_loc; 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = VPX_CODEC_OK; 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 570233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 572233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan 574233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx, 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_priv_enc_mr_cfg_t *mr_cfg) 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res = VPX_CODEC_OK; 578233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct vpx_codec_alg_priv *priv; 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_enc_cfg_t *cfg; 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int i; 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct VP8_COMP *optr; 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_rtcd(); 585233d2500723e5594f3e7c70896ffeeef32b9c950ywan 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!ctx->priv) 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 588233d2500723e5594f3e7c70896ffeeef32b9c950ywan priv = calloc(1, sizeof(struct vpx_codec_alg_priv)); 589233d2500723e5594f3e7c70896ffeeef32b9c950ywan 590233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!priv) 591233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 592233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_MEM_ERROR; 593233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 594233d2500723e5594f3e7c70896ffeeef32b9c950ywan 595233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv = &priv->base; 596233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->sz = sizeof(*ctx->priv); 597233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->iface = ctx->iface; 598233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->alg_priv = priv; 599233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->init_flags = ctx->init_flags; 600233d2500723e5594f3e7c70896ffeeef32b9c950ywan 601233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->config.enc) 602233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 603233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Update the reference to the config structure to an 604233d2500723e5594f3e7c70896ffeeef32b9c950ywan * internal copy. 605233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 606233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->alg_priv->cfg = *ctx->config.enc; 607233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->config.enc = &ctx->priv->alg_priv->cfg; 608233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 609233d2500723e5594f3e7c70896ffeeef32b9c950ywan 610233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg = &ctx->priv->alg_priv->cfg; 611233d2500723e5594f3e7c70896ffeeef32b9c950ywan 612233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Select the extra vp8 configuration table based on the current 613233d2500723e5594f3e7c70896ffeeef32b9c950ywan * usage value. If the current usage value isn't found, use the 614233d2500723e5594f3e7c70896ffeeef32b9c950ywan * values for usage case 0. 615233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 616233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; 617233d2500723e5594f3e7c70896ffeeef32b9c950ywan extracfg_map[i].usage && extracfg_map[i].usage != (int32_t)cfg->g_usage; 618233d2500723e5594f3e7c70896ffeeef32b9c950ywan i++); 619233d2500723e5594f3e7c70896ffeeef32b9c950ywan 620233d2500723e5594f3e7c70896ffeeef32b9c950ywan priv->vp8_cfg = extracfg_map[i].cfg; 621233d2500723e5594f3e7c70896ffeeef32b9c950ywan priv->vp8_cfg.pkt_list = &priv->pkt_list.head; 622233d2500723e5594f3e7c70896ffeeef32b9c950ywan 623233d2500723e5594f3e7c70896ffeeef32b9c950ywan priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 2; 624233d2500723e5594f3e7c70896ffeeef32b9c950ywan 625233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (priv->cx_data_sz < 32768) priv->cx_data_sz = 32768; 626233d2500723e5594f3e7c70896ffeeef32b9c950ywan 627233d2500723e5594f3e7c70896ffeeef32b9c950ywan priv->cx_data = malloc(priv->cx_data_sz); 628233d2500723e5594f3e7c70896ffeeef32b9c950ywan 629233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!priv->cx_data) 630233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 631233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_MEM_ERROR; 632233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 633233d2500723e5594f3e7c70896ffeeef32b9c950ywan 634233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(mr_cfg) 635233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->enc.total_encoders = mr_cfg->mr_total_resolutions; 636233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 637233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->enc.total_encoders = 1; 638233d2500723e5594f3e7c70896ffeeef32b9c950ywan 639233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = validate_config(priv, &priv->cfg, &priv->vp8_cfg, 0); 640233d2500723e5594f3e7c70896ffeeef32b9c950ywan 641233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!res) 642233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 643233d2500723e5594f3e7c70896ffeeef32b9c950ywan set_vp8e_config(&ctx->priv->alg_priv->oxcf, 644233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->alg_priv->cfg, 645233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->alg_priv->vp8_cfg, 646233d2500723e5594f3e7c70896ffeeef32b9c950ywan mr_cfg); 647233d2500723e5594f3e7c70896ffeeef32b9c950ywan 648233d2500723e5594f3e7c70896ffeeef32b9c950ywan optr = vp8_create_compressor(&ctx->priv->alg_priv->oxcf); 649233d2500723e5594f3e7c70896ffeeef32b9c950ywan 650233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!optr) 651233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = VPX_CODEC_MEM_ERROR; 652233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 653233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->priv->alg_priv->cpi = optr; 654233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 655233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 656233d2500723e5594f3e7c70896ffeeef32b9c950ywan 657233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 658233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 659233d2500723e5594f3e7c70896ffeeef32b9c950ywan 660233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_destroy(vpx_codec_alg_priv_t *ctx) 661233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 662233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTI_RES_ENCODING 663233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Free multi-encoder shared memory */ 664233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->oxcf.mr_total_resolutions > 0 && (ctx->oxcf.mr_encoder_id == ctx->oxcf.mr_total_resolutions-1)) 665233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 666233d2500723e5594f3e7c70896ffeeef32b9c950ywan LOWER_RES_FRAME_INFO *shared_mem_loc = (LOWER_RES_FRAME_INFO *)ctx->oxcf.mr_low_res_mode_info; 667233d2500723e5594f3e7c70896ffeeef32b9c950ywan free(shared_mem_loc->mb_info); 668233d2500723e5594f3e7c70896ffeeef32b9c950ywan free(ctx->oxcf.mr_low_res_mode_info); 669233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 670233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 671233d2500723e5594f3e7c70896ffeeef32b9c950ywan 672233d2500723e5594f3e7c70896ffeeef32b9c950ywan free(ctx->cx_data); 673233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_remove_compressor(&ctx->cpi); 674233d2500723e5594f3e7c70896ffeeef32b9c950ywan free(ctx); 675233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 676233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 677233d2500723e5594f3e7c70896ffeeef32b9c950ywan 678233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, 679233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *yv12) 680233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 681233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res = VPX_CODEC_OK; 682233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->y_buffer = img->planes[VPX_PLANE_Y]; 683233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->u_buffer = img->planes[VPX_PLANE_U]; 684233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->v_buffer = img->planes[VPX_PLANE_V]; 685233d2500723e5594f3e7c70896ffeeef32b9c950ywan 686233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->y_crop_width = img->d_w; 687233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->y_crop_height = img->d_h; 688233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->y_width = img->d_w; 689233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->y_height = img->d_h; 690233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->uv_width = (1 + yv12->y_width) / 2; 691233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->uv_height = (1 + yv12->y_height) / 2; 692233d2500723e5594f3e7c70896ffeeef32b9c950ywan 693233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->y_stride = img->stride[VPX_PLANE_Y]; 694233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->uv_stride = img->stride[VPX_PLANE_U]; 695233d2500723e5594f3e7c70896ffeeef32b9c950ywan 696233d2500723e5594f3e7c70896ffeeef32b9c950ywan yv12->border = (img->stride[VPX_PLANE_Y] - img->w) / 2; 697233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 698233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 699233d2500723e5594f3e7c70896ffeeef32b9c950ywan 700233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void pick_quickcompress_mode(vpx_codec_alg_priv_t *ctx, 701233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned long duration, 702233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned long deadline) 703233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 704233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int new_qc; 705233d2500723e5594f3e7c70896ffeeef32b9c950ywan 706233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_REALTIME_ONLY) 707233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Use best quality mode if no deadline is given. */ 708233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_qc = MODE_BESTQUALITY; 709233d2500723e5594f3e7c70896ffeeef32b9c950ywan 710233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (deadline) 711233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 712233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t duration_us; 713233d2500723e5594f3e7c70896ffeeef32b9c950ywan 714233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Convert duration parameter from stream timebase to microseconds */ 715233d2500723e5594f3e7c70896ffeeef32b9c950ywan duration_us = (uint64_t)duration * 1000000 716233d2500723e5594f3e7c70896ffeeef32b9c950ywan * (uint64_t)ctx->cfg.g_timebase.num 717233d2500723e5594f3e7c70896ffeeef32b9c950ywan / (uint64_t)ctx->cfg.g_timebase.den; 718233d2500723e5594f3e7c70896ffeeef32b9c950ywan 719233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If the deadline is more that the duration this frame is to be shown, 720233d2500723e5594f3e7c70896ffeeef32b9c950ywan * use good quality mode. Otherwise use realtime mode. 721233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 722233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_qc = (deadline > duration_us) ? MODE_GOODQUALITY : MODE_REALTIME; 723233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 724233d2500723e5594f3e7c70896ffeeef32b9c950ywan 725233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 726233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_qc = MODE_REALTIME; 727233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 728233d2500723e5594f3e7c70896ffeeef32b9c950ywan 729233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->cfg.g_pass == VPX_RC_FIRST_PASS) 730233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_qc = MODE_FIRSTPASS; 731233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (ctx->cfg.g_pass == VPX_RC_LAST_PASS) 732233d2500723e5594f3e7c70896ffeeef32b9c950ywan new_qc = (new_qc == MODE_BESTQUALITY) 733233d2500723e5594f3e7c70896ffeeef32b9c950ywan ? MODE_SECONDPASS_BEST 734233d2500723e5594f3e7c70896ffeeef32b9c950ywan : MODE_SECONDPASS; 735233d2500723e5594f3e7c70896ffeeef32b9c950ywan 736233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->oxcf.Mode != (int32_t)new_qc) 737233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 738233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->oxcf.Mode = new_qc; 739233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_change_config(ctx->cpi, &ctx->oxcf); 740233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 741233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 742233d2500723e5594f3e7c70896ffeeef32b9c950ywan 743233d2500723e5594f3e7c70896ffeeef32b9c950ywan 744233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_encode(vpx_codec_alg_priv_t *ctx, 745233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vpx_image_t *img, 746233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pts_t pts, 747233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned long duration, 748233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_enc_frame_flags_t flags, 749233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned long deadline) 750233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 751233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_err_t res = VPX_CODEC_OK; 752233d2500723e5594f3e7c70896ffeeef32b9c950ywan 753233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!ctx->cfg.rc_target_bitrate) 754233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 755233d2500723e5594f3e7c70896ffeeef32b9c950ywan 756233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (img) 757233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = validate_img(ctx, img); 758233d2500723e5594f3e7c70896ffeeef32b9c950ywan 759233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!res) 760233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = validate_config(ctx, &ctx->cfg, &ctx->vp8_cfg, 1); 761233d2500723e5594f3e7c70896ffeeef32b9c950ywan 762233d2500723e5594f3e7c70896ffeeef32b9c950ywan pick_quickcompress_mode(ctx, duration, deadline); 763233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pkt_list_init(&ctx->pkt_list); 764233d2500723e5594f3e7c70896ffeeef32b9c950ywan 765233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Handle Flags */ 766233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (((flags & VP8_EFLAG_NO_UPD_GF) && (flags & VP8_EFLAG_FORCE_GF)) 767233d2500723e5594f3e7c70896ffeeef32b9c950ywan || ((flags & VP8_EFLAG_NO_UPD_ARF) && (flags & VP8_EFLAG_FORCE_ARF))) 768233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 769233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->base.err_detail = "Conflicting flags."; 770233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 771233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 772233d2500723e5594f3e7c70896ffeeef32b9c950ywan 773233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF 774233d2500723e5594f3e7c70896ffeeef32b9c950ywan | VP8_EFLAG_NO_REF_ARF)) 775233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 776233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref = 7; 777233d2500723e5594f3e7c70896ffeeef32b9c950ywan 778233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_REF_LAST) 779233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref ^= VP8_LAST_FRAME; 780233d2500723e5594f3e7c70896ffeeef32b9c950ywan 781233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_REF_GF) 782233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref ^= VP8_GOLD_FRAME; 783233d2500723e5594f3e7c70896ffeeef32b9c950ywan 784233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_REF_ARF) 785233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref ^= VP8_ALTR_FRAME; 786233d2500723e5594f3e7c70896ffeeef32b9c950ywan 787233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_use_as_reference(ctx->cpi, ref); 788233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 789233d2500723e5594f3e7c70896ffeeef32b9c950ywan 790233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF 791233d2500723e5594f3e7c70896ffeeef32b9c950ywan | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_FORCE_GF 792233d2500723e5594f3e7c70896ffeeef32b9c950ywan | VP8_EFLAG_FORCE_ARF)) 793233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 794233d2500723e5594f3e7c70896ffeeef32b9c950ywan int upd = 7; 795233d2500723e5594f3e7c70896ffeeef32b9c950ywan 796233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_UPD_LAST) 797233d2500723e5594f3e7c70896ffeeef32b9c950ywan upd ^= VP8_LAST_FRAME; 798233d2500723e5594f3e7c70896ffeeef32b9c950ywan 799233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_UPD_GF) 800233d2500723e5594f3e7c70896ffeeef32b9c950ywan upd ^= VP8_GOLD_FRAME; 801233d2500723e5594f3e7c70896ffeeef32b9c950ywan 802233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_UPD_ARF) 803233d2500723e5594f3e7c70896ffeeef32b9c950ywan upd ^= VP8_ALTR_FRAME; 804233d2500723e5594f3e7c70896ffeeef32b9c950ywan 805233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_update_reference(ctx->cpi, upd); 806233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 807233d2500723e5594f3e7c70896ffeeef32b9c950ywan 808233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8_EFLAG_NO_UPD_ENTROPY) 809233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 810233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_update_entropy(ctx->cpi, 0); 811233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 812233d2500723e5594f3e7c70896ffeeef32b9c950ywan 813233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Handle fixed keyframe intervals */ 814233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->cfg.kf_mode == VPX_KF_AUTO 815233d2500723e5594f3e7c70896ffeeef32b9c950ywan && ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist) 816233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 817233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist) 818233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 819233d2500723e5594f3e7c70896ffeeef32b9c950ywan flags |= VPX_EFLAG_FORCE_KF; 820233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->fixed_kf_cntr = 1; 821233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 822233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 823233d2500723e5594f3e7c70896ffeeef32b9c950ywan 824233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Initialize the encoder instance on the first frame*/ 825233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!res && ctx->cpi) 826233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 827233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int lib_flags; 828233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG sd; 829233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t dst_time_stamp, dst_end_time_stamp; 830233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned long size, cx_data_sz; 831233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *cx_data; 832233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *cx_data_end; 833233d2500723e5594f3e7c70896ffeeef32b9c950ywan int comp_data_state = 0; 834233d2500723e5594f3e7c70896ffeeef32b9c950ywan 835233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up internal flags */ 836233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->base.init_flags & VPX_CODEC_USE_PSNR) 837233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((VP8_COMP *)ctx->cpi)->b_calculate_psnr = 1; 838233d2500723e5594f3e7c70896ffeeef32b9c950ywan 839233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->base.init_flags & VPX_CODEC_USE_OUTPUT_PARTITION) 840233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((VP8_COMP *)ctx->cpi)->output_partition = 1; 841233d2500723e5594f3e7c70896ffeeef32b9c950ywan 842233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Convert API flags to internal codec lib flags */ 843233d2500723e5594f3e7c70896ffeeef32b9c950ywan lib_flags = (flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0; 844233d2500723e5594f3e7c70896ffeeef32b9c950ywan 845233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* vp8 use 10,000,000 ticks/second as time stamp */ 846233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst_time_stamp = pts * 10000000 * ctx->cfg.g_timebase.num / ctx->cfg.g_timebase.den; 847233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst_end_time_stamp = (pts + duration) * 10000000 * ctx->cfg.g_timebase.num / ctx->cfg.g_timebase.den; 848233d2500723e5594f3e7c70896ffeeef32b9c950ywan 849233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (img != NULL) 850233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 851233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = image2yuvconfig(img, &sd); 852233d2500723e5594f3e7c70896ffeeef32b9c950ywan 853233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (vp8_receive_raw_frame(ctx->cpi, ctx->next_frame_flag | lib_flags, 854233d2500723e5594f3e7c70896ffeeef32b9c950ywan &sd, dst_time_stamp, dst_end_time_stamp)) 855233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 856233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMP *cpi = (VP8_COMP *)ctx->cpi; 857233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = update_error_state(ctx, &cpi->common.error); 858233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 859233d2500723e5594f3e7c70896ffeeef32b9c950ywan 860233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* reset for next frame */ 861233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->next_frame_flag = 0; 862233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 863233d2500723e5594f3e7c70896ffeeef32b9c950ywan 864233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data = ctx->cx_data; 865233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_sz = ctx->cx_data_sz; 866233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_end = ctx->cx_data + cx_data_sz; 867233d2500723e5594f3e7c70896ffeeef32b9c950ywan lib_flags = 0; 868233d2500723e5594f3e7c70896ffeeef32b9c950ywan 869233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (cx_data_sz >= ctx->cx_data_sz / 2) 870233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 871233d2500723e5594f3e7c70896ffeeef32b9c950ywan comp_data_state = vp8_get_compressed_data(ctx->cpi, 872233d2500723e5594f3e7c70896ffeeef32b9c950ywan &lib_flags, 873233d2500723e5594f3e7c70896ffeeef32b9c950ywan &size, 874233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data, 875233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_end, 876233d2500723e5594f3e7c70896ffeeef32b9c950ywan &dst_time_stamp, 877233d2500723e5594f3e7c70896ffeeef32b9c950ywan &dst_end_time_stamp, 878233d2500723e5594f3e7c70896ffeeef32b9c950ywan !img); 879233d2500723e5594f3e7c70896ffeeef32b9c950ywan 880233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(comp_data_state == VPX_CODEC_CORRUPT_FRAME) 881233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_CORRUPT_FRAME; 882233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if(comp_data_state == -1) 883233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 884233d2500723e5594f3e7c70896ffeeef32b9c950ywan 885233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (size) 886233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 887233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pts_t round, delta; 888233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_cx_pkt_t pkt; 889233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8_COMP *cpi = (VP8_COMP *)ctx->cpi; 890233d2500723e5594f3e7c70896ffeeef32b9c950ywan 891233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Add the frame packet to the list of returned packets. */ 892233d2500723e5594f3e7c70896ffeeef32b9c950ywan round = (vpx_codec_pts_t)1000000 893233d2500723e5594f3e7c70896ffeeef32b9c950ywan * ctx->cfg.g_timebase.num / 2 - 1; 894233d2500723e5594f3e7c70896ffeeef32b9c950ywan delta = (dst_end_time_stamp - dst_time_stamp); 895233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.kind = VPX_CODEC_CX_FRAME_PKT; 896233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.pts = 897233d2500723e5594f3e7c70896ffeeef32b9c950ywan (dst_time_stamp * ctx->cfg.g_timebase.den + round) 898233d2500723e5594f3e7c70896ffeeef32b9c950ywan / ctx->cfg.g_timebase.num / 10000000; 899233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.duration = (unsigned long) 900233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((delta * ctx->cfg.g_timebase.den + round) 901233d2500723e5594f3e7c70896ffeeef32b9c950ywan / ctx->cfg.g_timebase.num / 10000000); 902233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.flags = lib_flags << 16; 903233d2500723e5594f3e7c70896ffeeef32b9c950ywan 904233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (lib_flags & FRAMEFLAGS_KEY) 905233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.flags |= VPX_FRAME_IS_KEY; 906233d2500723e5594f3e7c70896ffeeef32b9c950ywan 907233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!cpi->common.show_frame) 908233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 909233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.flags |= VPX_FRAME_IS_INVISIBLE; 910233d2500723e5594f3e7c70896ffeeef32b9c950ywan 911233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* This timestamp should be as close as possible to the 912233d2500723e5594f3e7c70896ffeeef32b9c950ywan * prior PTS so that if a decoder uses pts to schedule when 913233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to do this, we start right after last frame was decoded. 914233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Invisible frames have no duration. 915233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 916233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.pts = ((cpi->last_time_stamp_seen 917233d2500723e5594f3e7c70896ffeeef32b9c950ywan * ctx->cfg.g_timebase.den + round) 918233d2500723e5594f3e7c70896ffeeef32b9c950ywan / ctx->cfg.g_timebase.num / 10000000) + 1; 919233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.duration = 0; 920233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 921233d2500723e5594f3e7c70896ffeeef32b9c950ywan 922233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->droppable) 923233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.flags |= VPX_FRAME_IS_DROPPABLE; 924233d2500723e5594f3e7c70896ffeeef32b9c950ywan 925233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->output_partition) 926233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 927233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 928233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int num_partitions = 929233d2500723e5594f3e7c70896ffeeef32b9c950ywan (1 << cpi->common.multi_token_partition) + 1; 930233d2500723e5594f3e7c70896ffeeef32b9c950ywan 931233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.flags |= VPX_FRAME_IS_FRAGMENT; 932233d2500723e5594f3e7c70896ffeeef32b9c950ywan 933233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < num_partitions; ++i) 934233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 935233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 936233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.buf = cpi->partition_d[i]; 937233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 938233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.buf = cx_data; 939233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data += cpi->partition_sz[i]; 940233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_sz -= cpi->partition_sz[i]; 941233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 942233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.sz = cpi->partition_sz[i]; 943233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.partition_id = i; 944233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* don't set the fragment bit for the last partition */ 945233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (i == (num_partitions - 1)) 946233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.flags &= ~VPX_FRAME_IS_FRAGMENT; 947233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); 948233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 949233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 950233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* In lagged mode the encoder can buffer multiple frames. 951233d2500723e5594f3e7c70896ffeeef32b9c950ywan * We don't want this in partitioned output because 952233d2500723e5594f3e7c70896ffeeef32b9c950ywan * partitions are spread all over the output buffer. 953233d2500723e5594f3e7c70896ffeeef32b9c950ywan * So, force an exit! 954233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 955233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_sz -= ctx->cx_data_sz / 2; 956233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 957233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 958233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 959233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 960233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.buf = cx_data; 961233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.sz = size; 962233d2500723e5594f3e7c70896ffeeef32b9c950ywan pkt.data.frame.partition_id = -1; 963233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); 964233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data += size; 965233d2500723e5594f3e7c70896ffeeef32b9c950ywan cx_data_sz -= size; 966233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 967233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 968233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 969233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 970233d2500723e5594f3e7c70896ffeeef32b9c950ywan 971233d2500723e5594f3e7c70896ffeeef32b9c950ywan return res; 972233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 973233d2500723e5594f3e7c70896ffeeef32b9c950ywan 974233d2500723e5594f3e7c70896ffeeef32b9c950ywan 975233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const vpx_codec_cx_pkt_t *vp8e_get_cxdata(vpx_codec_alg_priv_t *ctx, 976233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_iter_t *iter) 977233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 978233d2500723e5594f3e7c70896ffeeef32b9c950ywan return vpx_codec_pkt_list_get(&ctx->pkt_list.head, iter); 979233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 980233d2500723e5594f3e7c70896ffeeef32b9c950ywan 981233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_set_reference(vpx_codec_alg_priv_t *ctx, 982233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 983233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 984233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 985233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 986233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 987233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (data) 988233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 989233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 990233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG sd; 991233d2500723e5594f3e7c70896ffeeef32b9c950ywan 992233d2500723e5594f3e7c70896ffeeef32b9c950ywan image2yuvconfig(&frame->img, &sd); 993233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_set_reference(ctx->cpi, frame->frame_type, &sd); 994233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 995233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 996233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 997233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 998233d2500723e5594f3e7c70896ffeeef32b9c950ywan 999233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1001233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_get_reference(vpx_codec_alg_priv_t *ctx, 1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (data) 1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG sd; 1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan image2yuvconfig(&frame->img, &sd); 1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_get_reference(ctx->cpi, frame->frame_type, &sd); 1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1021233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_set_previewpp(vpx_codec_alg_priv_t *ctx, 1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1025233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC 1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *); 1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (data) 1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_ppcfg = *((vp8_postproc_cfg_t *)data); 1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1035233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctx; 1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)args; 1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INCAPABLE; 1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1042233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1043233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1045233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_image_t *vp8e_get_preview(vpx_codec_alg_priv_t *ctx) 1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG sd; 1049233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_ppflags_t flags = {0}; 1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ctx->preview_ppcfg.post_proc_flag) 1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan flags.post_proc_flag = ctx->preview_ppcfg.post_proc_flag; 1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan flags.deblocking_level = ctx->preview_ppcfg.deblocking_level; 1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan flags.noise_level = ctx->preview_ppcfg.noise_level; 1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1057233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (0 == vp8_get_preview_raw_frame(ctx->cpi, &sd, &flags)) 1059233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_img_wrap(&ctx->preview_img, VPX_IMG_FMT_YV12, 1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan sd.y_width + 2*VP8BORDERINPIXELS, 1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan sd.y_height + 2*VP8BORDERINPIXELS, 1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1, 1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan sd.buffer_alloc); 1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_img_set_rect(&ctx->preview_img, 1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8BORDERINPIXELS, VP8BORDERINPIXELS, 1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan sd.y_width, sd.y_height); 1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.bps = 12; 1073233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.planes[VPX_PLANE_Y] = sd.y_buffer; 1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.planes[VPX_PLANE_U] = sd.u_buffer; 1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.planes[VPX_PLANE_V] = sd.v_buffer; 1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1077233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.fmt = VPX_IMG_FMT_I420; 1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.x_chroma_shift = 1; 1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.y_chroma_shift = 1; 1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.d_w = sd.y_width; 1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.d_h = sd.y_height; 1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.stride[VPX_PLANE_Y] = sd.y_stride; 1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.stride[VPX_PLANE_U] = sd.uv_stride; 1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.stride[VPX_PLANE_V] = sd.uv_stride; 1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.w = sd.y_width; 1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->preview_img.h = sd.y_height; 1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1089233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &ctx->preview_img; 1090233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; 1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1095233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_update_entropy(vpx_codec_alg_priv_t *ctx, 1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1097233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan int update = va_arg(args, int); 1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_update_entropy(ctx->cpi, update); 1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1106233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_update_reference(vpx_codec_alg_priv_t *ctx, 1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan int update = va_arg(args, int); 1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_update_reference(ctx->cpi, update); 1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1116233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_use_reference(vpx_codec_alg_priv_t *ctx, 1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1119233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan int reference_flag = va_arg(args, int); 1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_use_as_reference(ctx->cpi, reference_flag); 1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1126233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_set_roi_map(vpx_codec_alg_priv_t *ctx, 1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_roi_map_t *data = va_arg(args, vpx_roi_map_t *); 1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (data) 1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_roi_map_t *roi = (vpx_roi_map_t *)data; 1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!vp8_set_roimap(ctx->cpi, roi->roi_map, roi->rows, roi->cols, roi->delta_q, roi->delta_lf, roi->static_threshold)) 1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1138233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1139233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1146233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_set_activemap(vpx_codec_alg_priv_t *ctx, 1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_active_map_t *data = va_arg(args, vpx_active_map_t *); 1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (data) 1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1155233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_active_map_t *map = (vpx_active_map_t *)data; 1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!vp8_set_active_map(ctx->cpi, map->active_map, map->rows, map->cols)) 1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1159233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1166233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_err_t vp8e_set_scalemode(vpx_codec_alg_priv_t *ctx, 1167233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ctr_id, 1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan va_list args) 1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_scaling_mode_t *data = va_arg(args, vpx_scaling_mode_t *); 1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)ctr_id; 1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (data) 1174233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan int res; 1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_scaling_mode_t scalemode = *(vpx_scaling_mode_t *)data ; 1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan res = vp8_set_internal_size(ctx->cpi, 1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan (VPX_SCALING)scalemode.h_scaling_mode, 1179233d2500723e5594f3e7c70896ffeeef32b9c950ywan (VPX_SCALING)scalemode.v_scaling_mode); 1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!res) 1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan /*force next frame a key frame to effect scaling mode */ 1184233d2500723e5594f3e7c70896ffeeef32b9c950ywan ctx->next_frame_flag |= FRAMEFLAGS_KEY; 1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_OK; 1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1190233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1191233d2500723e5594f3e7c70896ffeeef32b9c950ywan return VPX_CODEC_INVALID_PARAM; 1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1195233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_ctrl_fn_map_t vp8e_ctf_maps[] = 1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8_SET_REFERENCE, vp8e_set_reference}, 1198233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8_COPY_REFERENCE, vp8e_get_reference}, 1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8_SET_POSTPROC, vp8e_set_previewpp}, 1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_UPD_ENTROPY, vp8e_update_entropy}, 1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_UPD_REFERENCE, vp8e_update_reference}, 1202233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_USE_REFERENCE, vp8e_use_reference}, 1203233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_ROI_MAP, vp8e_set_roi_map}, 1204233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_ACTIVEMAP, vp8e_set_activemap}, 1205233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_SCALEMODE, vp8e_set_scalemode}, 1206233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_CPUUSED, set_param}, 1207233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_NOISE_SENSITIVITY, set_param}, 1208233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_ENABLEAUTOALTREF, set_param}, 1209233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_SHARPNESS, set_param}, 1210233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_STATIC_THRESHOLD, set_param}, 1211233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_TOKEN_PARTITIONS, set_param}, 1212233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_GET_LAST_QUANTIZER, get_param}, 1213233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_GET_LAST_QUANTIZER_64, get_param}, 1214233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_ARNR_MAXFRAMES, set_param}, 1215233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_ARNR_STRENGTH , set_param}, 1216233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_ARNR_TYPE , set_param}, 1217233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_TUNING, set_param}, 1218233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_CQ_LEVEL, set_param}, 1219233d2500723e5594f3e7c70896ffeeef32b9c950ywan {VP8E_SET_MAX_INTRA_BITRATE_PCT, set_param}, 1220233d2500723e5594f3e7c70896ffeeef32b9c950ywan { -1, NULL}, 1221233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 1222233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1223233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic vpx_codec_enc_cfg_map_t vp8e_usage_cfg_map[] = 1224233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1225233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1226233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 1227233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1228233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* g_usage */ 1229233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* g_threads */ 1230233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* g_profile */ 1231233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1232233d2500723e5594f3e7c70896ffeeef32b9c950ywan 320, /* g_width */ 1233233d2500723e5594f3e7c70896ffeeef32b9c950ywan 240, /* g_height */ 1234233d2500723e5594f3e7c70896ffeeef32b9c950ywan {1, 30}, /* g_timebase */ 1235233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1236233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* g_error_resilient */ 1237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1238233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_RC_ONE_PASS, /* g_pass */ 1239233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1240233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* g_lag_in_frames */ 1241233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1242233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* rc_dropframe_thresh */ 1243233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* rc_resize_allowed */ 1244233d2500723e5594f3e7c70896ffeeef32b9c950ywan 60, /* rc_resize_down_thresold */ 1245233d2500723e5594f3e7c70896ffeeef32b9c950ywan 30, /* rc_resize_up_thresold */ 1246233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1247233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_VBR, /* rc_end_usage */ 1248233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if VPX_ENCODER_ABI_VERSION > (1 + VPX_CODEC_ABI_VERSION) 1249233d2500723e5594f3e7c70896ffeeef32b9c950ywan {0}, /* rc_twopass_stats_in */ 1250233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1251233d2500723e5594f3e7c70896ffeeef32b9c950ywan 256, /* rc_target_bandwidth */ 1252233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, /* rc_min_quantizer */ 1253233d2500723e5594f3e7c70896ffeeef32b9c950ywan 63, /* rc_max_quantizer */ 1254233d2500723e5594f3e7c70896ffeeef32b9c950ywan 100, /* rc_undershoot_pct */ 1255233d2500723e5594f3e7c70896ffeeef32b9c950ywan 100, /* rc_overshoot_pct */ 1256233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1257233d2500723e5594f3e7c70896ffeeef32b9c950ywan 6000, /* rc_max_buffer_size */ 1258233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4000, /* rc_buffer_initial_size; */ 1259233d2500723e5594f3e7c70896ffeeef32b9c950ywan 5000, /* rc_buffer_optimal_size; */ 1260233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1261233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50, /* rc_two_pass_vbrbias */ 1262233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* rc_two_pass_vbrmin_section */ 1263233d2500723e5594f3e7c70896ffeeef32b9c950ywan 400, /* rc_two_pass_vbrmax_section */ 1264233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1265233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* keyframing settings (kf) */ 1266233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_KF_AUTO, /* g_kfmode*/ 1267233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* kf_min_dist */ 1268233d2500723e5594f3e7c70896ffeeef32b9c950ywan 128, /* kf_max_dist */ 1269233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1270233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if VPX_ENCODER_ABI_VERSION == (1 + VPX_CODEC_ABI_VERSION) 1271233d2500723e5594f3e7c70896ffeeef32b9c950ywan "vp8.fpf" /* first pass filename */ 1272233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1273233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_SS_DEFAULT_LAYERS, /* ss_number_layers */ 1274233d2500723e5594f3e7c70896ffeeef32b9c950ywan {0}, /* ss_target_bitrate */ 1275233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1, /* ts_number_layers */ 1276233d2500723e5594f3e7c70896ffeeef32b9c950ywan {0}, /* ts_target_bitrate */ 1277233d2500723e5594f3e7c70896ffeeef32b9c950ywan {0}, /* ts_rate_decimator */ 1278233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, /* ts_periodicity */ 1279233d2500723e5594f3e7c70896ffeeef32b9c950ywan {0}, /* ts_layer_id */ 1280233d2500723e5594f3e7c70896ffeeef32b9c950ywan }}, 1281233d2500723e5594f3e7c70896ffeeef32b9c950ywan { -1, {NOT_IMPLEMENTED}} 1282233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 1283233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1284233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1285233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VERSION_STRING 1286233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VERSION_STRING 1287233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1288233d2500723e5594f3e7c70896ffeeef32b9c950ywanCODEC_INTERFACE(vpx_codec_vp8_cx) = 1289233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 1290233d2500723e5594f3e7c70896ffeeef32b9c950ywan "WebM Project VP8 Encoder" VERSION_STRING, 1291233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_CODEC_INTERNAL_ABI_VERSION, 1292233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR | 1293233d2500723e5594f3e7c70896ffeeef32b9c950ywan VPX_CODEC_CAP_OUTPUT_PARTITION, 1294233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* vpx_codec_caps_t caps; */ 1295233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_init, /* vpx_codec_init_fn_t init; */ 1296233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_destroy, /* vpx_codec_destroy_fn_t destroy; */ 1297233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ 1298233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /* vpx_codec_get_mmap_fn_t get_mmap; */ 1299233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /* vpx_codec_set_mmap_fn_t set_mmap; */ 1300233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1301233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /* vpx_codec_peek_si_fn_t peek_si; */ 1302233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /* vpx_codec_get_si_fn_t get_si; */ 1303233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /* vpx_codec_decode_fn_t decode; */ 1304233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /* vpx_codec_frame_get_fn_t frame_get; */ 1305233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, /*vpx_codec_frame_set_fn_t set_fb_fn*/ 1306233d2500723e5594f3e7c70896ffeeef32b9c950ywan }, 1307233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1308233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t peek_si; */ 1309233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_encode, /* vpx_codec_encode_fn_t encode; */ 1310233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_get_cxdata, /* vpx_codec_get_cx_data_fn_t frame_get; */ 1311233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_set_config, 1312233d2500723e5594f3e7c70896ffeeef32b9c950ywan NOT_IMPLEMENTED, 1313233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_get_preview, 1314233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8e_mr_alloc_mem, 1315233d2500723e5594f3e7c70896ffeeef32b9c950ywan } /* encoder functions */ 1316233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 1317