| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 | 11 |
| 12 #include "vpx/vpx_codec.h" | 12 #include "vpx/vpx_codec.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 #define ERROR(str) do {\ | 106 #define ERROR(str) do {\ |
| 107 ctx->base.err_detail = str;\ | 107 ctx->base.err_detail = str;\ |
| 108 return VPX_CODEC_INVALID_PARAM;\ | 108 return VPX_CODEC_INVALID_PARAM;\ |
| 109 } while(0) | 109 } while(0) |
| 110 | 110 |
| 111 #define RANGE_CHECK(p,memb,lo,hi) do {\ | 111 #define RANGE_CHECK(p,memb,lo,hi) do {\ |
| 112 if(!(((p)->memb == lo || (p)->memb > (lo)) && (p)->memb <= hi)) \ | 112 if(!(((p)->memb == lo || (p)->memb > (lo)) && (p)->memb <= hi)) \ |
| 113 ERROR(#memb " out of range ["#lo".."#hi"]");\ | 113 ERROR(#memb " out of range ["#lo".."#hi"]");\ |
| 114 } while(0) | 114 } while(0) |
| 115 | 115 |
| 116 #define RANGE_CHECK_HI(p,memb,hi) do {\ |
| 117 if(!((p)->memb <= (hi))) \ |
| 118 ERROR(#memb " out of range [.."#hi"]");\ |
| 119 } while(0) |
| 120 |
| 116 #define RANGE_CHECK_LO(p,memb,lo) do {\ | 121 #define RANGE_CHECK_LO(p,memb,lo) do {\ |
| 117 if(!((p)->memb >= (lo))) \ | 122 if(!((p)->memb >= (lo))) \ |
| 118 ERROR(#memb " out of range ["#lo"..]");\ | 123 ERROR(#memb " out of range ["#lo"..]");\ |
| 119 } while(0) | 124 } while(0) |
| 120 | 125 |
| 121 #define RANGE_CHECK_BOOL(p,memb) do {\ | 126 #define RANGE_CHECK_BOOL(p,memb) do {\ |
| 122 if(!!((p)->memb) != (p)->memb) ERROR(#memb " expected boolean");\ | 127 if(!!((p)->memb) != (p)->memb) ERROR(#memb " expected boolean");\ |
| 123 } while(0) | 128 } while(0) |
| 124 | 129 |
| 125 static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx, | 130 static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx, |
| 126 const vpx_codec_enc_cfg_t *cfg, | 131 const vpx_codec_enc_cfg_t *cfg, |
| 127 const struct vp8_extracfg *vp8_cfg) | 132 const struct vp8_extracfg *vp8_cfg) |
| 128 { | 133 { |
| 129 RANGE_CHECK(cfg, g_w, 2, 16384); | 134 RANGE_CHECK(cfg, g_w, 2, 16384); |
| 130 RANGE_CHECK(cfg, g_h, 2, 16384); | 135 RANGE_CHECK(cfg, g_h, 2, 16384); |
| 131 RANGE_CHECK(cfg, g_timebase.den, 1, 1000000000); | 136 RANGE_CHECK(cfg, g_timebase.den, 1, 1000000000); |
| 132 RANGE_CHECK(cfg, g_timebase.num, 1, cfg->g_timebase.den); | 137 RANGE_CHECK(cfg, g_timebase.num, 1, cfg->g_timebase.den); |
| 133 RANGE_CHECK(cfg, g_profile, 0, 3); | 138 RANGE_CHECK_HI(cfg, g_profile, 3); |
| 134 RANGE_CHECK(cfg, rc_min_quantizer, 0, 63); | 139 RANGE_CHECK_HI(cfg, rc_min_quantizer, 63); |
| 135 RANGE_CHECK(cfg, rc_max_quantizer, 0, 63); | 140 RANGE_CHECK_HI(cfg, rc_max_quantizer, 63); |
| 136 RANGE_CHECK(cfg, g_threads, 0, 64); | 141 RANGE_CHECK_HI(cfg, g_threads, 64); |
| 137 #if !(CONFIG_REALTIME_ONLY) | 142 #if !(CONFIG_REALTIME_ONLY) |
| 138 RANGE_CHECK(cfg, g_lag_in_frames, 0, 25); | 143 RANGE_CHECK_HI(cfg, g_lag_in_frames, 25); |
| 139 #else | 144 #else |
| 140 RANGE_CHECK(cfg, g_lag_in_frames, 0, 0); | 145 RANGE_CHECK_HI(cfg, g_lag_in_frames, 0); |
| 141 #endif | 146 #endif |
| 142 RANGE_CHECK(cfg, rc_end_usage, VPX_VBR, VPX_CBR); | 147 RANGE_CHECK(cfg, rc_end_usage, VPX_VBR, VPX_CBR); |
| 143 RANGE_CHECK(cfg, rc_undershoot_pct, 0, 100); | 148 RANGE_CHECK_HI(cfg, rc_undershoot_pct, 100); |
| 144 RANGE_CHECK(cfg, rc_2pass_vbr_bias_pct, 0, 100); | 149 RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100); |
| 145 RANGE_CHECK(cfg, kf_mode, VPX_KF_DISABLED, VPX_KF_AUTO); | 150 RANGE_CHECK(cfg, kf_mode, VPX_KF_DISABLED, VPX_KF_AUTO); |
| 146 //RANGE_CHECK_BOOL(cfg, g_delete_firstpassfile); | 151 //RANGE_CHECK_BOOL(cfg, g_delete_firstpassfile); |
| 147 RANGE_CHECK_BOOL(cfg, rc_resize_allowed); | 152 RANGE_CHECK_BOOL(cfg, rc_resize_allowed); |
| 148 RANGE_CHECK(cfg, rc_dropframe_thresh, 0, 100); | 153 RANGE_CHECK_HI(cfg, rc_dropframe_thresh, 100); |
| 149 RANGE_CHECK(cfg, rc_resize_up_thresh, 0, 100); | 154 RANGE_CHECK_HI(cfg, rc_resize_up_thresh, 100); |
| 150 RANGE_CHECK(cfg, rc_resize_down_thresh, 0, 100); | 155 RANGE_CHECK_HI(cfg, rc_resize_down_thresh, 100); |
| 151 #if !(CONFIG_REALTIME_ONLY) | 156 #if !(CONFIG_REALTIME_ONLY) |
| 152 RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_LAST_PASS); | 157 RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_LAST_PASS); |
| 153 #else | 158 #else |
| 154 RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_ONE_PASS); | 159 RANGE_CHECK(cfg, g_pass, VPX_RC_ONE_PASS, VPX_RC_ONE_PASS); |
| 155 #endif | 160 #endif |
| 156 | 161 |
| 157 /* VP8 does not support a lower bound on the keyframe interval in | 162 /* VP8 does not support a lower bound on the keyframe interval in |
| 158 * automatic keyframe placement mode. | 163 * automatic keyframe placement mode. |
| 159 */ | 164 */ |
| 160 if (cfg->kf_mode != VPX_KF_DISABLED && cfg->kf_min_dist != cfg->kf_max_dist | 165 if (cfg->kf_mode != VPX_KF_DISABLED && cfg->kf_min_dist != cfg->kf_max_dist |
| 161 && cfg->kf_min_dist > 0) | 166 && cfg->kf_min_dist > 0) |
| 162 ERROR("kf_min_dist not supported in auto mode, use 0 " | 167 ERROR("kf_min_dist not supported in auto mode, use 0 " |
| 163 "or kf_max_dist instead."); | 168 "or kf_max_dist instead."); |
| 164 | 169 |
| 165 RANGE_CHECK_BOOL(vp8_cfg, enable_auto_alt_ref); | 170 RANGE_CHECK_BOOL(vp8_cfg, enable_auto_alt_ref); |
| 166 #if !(CONFIG_REALTIME_ONLY) | 171 #if !(CONFIG_REALTIME_ONLY) |
| 167 RANGE_CHECK(vp8_cfg, encoding_mode, VP8_BEST_QUALITY_ENCODING, VP8_REAL
_TIME_ENCODING); | 172 RANGE_CHECK(vp8_cfg, encoding_mode, VP8_BEST_QUALITY_ENCODING, VP8_REAL
_TIME_ENCODING); |
| 168 RANGE_CHECK(vp8_cfg, cpu_used, -16, 16); | 173 RANGE_CHECK(vp8_cfg, cpu_used, -16, 16); |
| 169 RANGE_CHECK(vp8_cfg, noise_sensitivity, 0, 6); | 174 RANGE_CHECK_HI(vp8_cfg, noise_sensitivity, 6); |
| 170 #else | 175 #else |
| 171 RANGE_CHECK(vp8_cfg, encoding_mode, VP8_REAL_TIME_ENCODING, VP8_REAL_TI
ME_ENCODING); | 176 RANGE_CHECK(vp8_cfg, encoding_mode, VP8_REAL_TIME_ENCODING, VP8_REAL_TI
ME_ENCODING); |
| 172 | 177 |
| 173 if (!((vp8_cfg->cpu_used >= -16 && vp8_cfg->cpu_used <= -4) || (vp8_cfg->cpu
_used >= 4 && vp8_cfg->cpu_used <= 16))) | 178 if (!((vp8_cfg->cpu_used >= -16 && vp8_cfg->cpu_used <= -4) || (vp8_cfg->cpu
_used >= 4 && vp8_cfg->cpu_used <= 16))) |
| 174 ERROR("cpu_used out of range [-16..-4] or [4..16]"); | 179 ERROR("cpu_used out of range [-16..-4] or [4..16]"); |
| 175 | 180 |
| 176 RANGE_CHECK(vp8_cfg, noise_sensitivity, 0, 0); | 181 RANGE_CHECK(vp8_cfg, noise_sensitivity, 0, 0); |
| 177 #endif | 182 #endif |
| 178 | 183 |
| 179 RANGE_CHECK(vp8_cfg, token_partitions, VP8_ONE_TOKENPARTITION, VP8_EIGHT_T
OKENPARTITION); | 184 RANGE_CHECK(vp8_cfg, token_partitions, VP8_ONE_TOKENPARTITION, VP8_EIGHT_T
OKENPARTITION); |
| 180 RANGE_CHECK(vp8_cfg, Sharpness, 0, 7); | 185 RANGE_CHECK_HI(vp8_cfg, Sharpness, 7); |
| 181 RANGE_CHECK(vp8_cfg, arnr_max_frames, 0, 15); | 186 RANGE_CHECK_HI(vp8_cfg, arnr_max_frames, 15); |
| 182 RANGE_CHECK(vp8_cfg, arnr_strength, 0, 6); | 187 RANGE_CHECK_HI(vp8_cfg, arnr_strength, 6); |
| 183 RANGE_CHECK(vp8_cfg, arnr_type, 0, 0xffffffff); | 188 RANGE_CHECK_HI(vp8_cfg, arnr_type, 0xffffffff); |
| 184 | 189 |
| 185 if (cfg->g_pass == VPX_RC_LAST_PASS) | 190 if (cfg->g_pass == VPX_RC_LAST_PASS) |
| 186 { | 191 { |
| 187 int n_doubles = cfg->rc_twopass_stats_in.sz / sizeof(double); | 192 int n_doubles = cfg->rc_twopass_stats_in.sz / sizeof(double); |
| 188 int n_packets = cfg->rc_twopass_stats_in.sz / sizeof(FIRSTPASS_STATS); | 193 int n_packets = cfg->rc_twopass_stats_in.sz / sizeof(FIRSTPASS_STATS); |
| 189 double frames; | 194 double frames; |
| 190 | 195 |
| 191 if (!cfg->rc_twopass_stats_in.buf) | 196 if (!cfg->rc_twopass_stats_in.buf) |
| 192 ERROR("rc_twopass_stats_in.buf not set."); | 197 ERROR("rc_twopass_stats_in.buf not set."); |
| 193 | 198 |
| (...skipping 983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1177 {NOT_IMPLEMENTED}, /* decoder functions */ | 1182 {NOT_IMPLEMENTED}, /* decoder functions */ |
| 1178 { | 1183 { |
| 1179 vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t peek_si; */ | 1184 vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t peek_si; */ |
| 1180 api1_encode, /* vpx_codec_encode_fn_t encode; */ | 1185 api1_encode, /* vpx_codec_encode_fn_t encode; */ |
| 1181 vp8e_get_cxdata, /* vpx_codec_get_cx_data_fn_t frame_get; */ | 1186 vp8e_get_cxdata, /* vpx_codec_get_cx_data_fn_t frame_get; */ |
| 1182 vp8e_set_config, | 1187 vp8e_set_config, |
| 1183 NOT_IMPLEMENTED, | 1188 NOT_IMPLEMENTED, |
| 1184 vp8e_get_preview, | 1189 vp8e_get_preview, |
| 1185 } /* encoder functions */ | 1190 } /* encoder functions */ |
| 1186 }; | 1191 }; |
| OLD | NEW |