OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM 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 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 | 181 |
182 if ((cfg->ss_number_layers > 1 || cfg->ts_number_layers > 1) && | 182 if ((cfg->ss_number_layers > 1 || cfg->ts_number_layers > 1) && |
183 cfg->g_pass == VPX_RC_LAST_PASS) { | 183 cfg->g_pass == VPX_RC_LAST_PASS) { |
184 unsigned int i, alt_ref_sum = 0; | 184 unsigned int i, alt_ref_sum = 0; |
185 for (i = 0; i < cfg->ss_number_layers; ++i) { | 185 for (i = 0; i < cfg->ss_number_layers; ++i) { |
186 if (cfg->ss_enable_auto_alt_ref[i]) | 186 if (cfg->ss_enable_auto_alt_ref[i]) |
187 ++alt_ref_sum; | 187 ++alt_ref_sum; |
188 } | 188 } |
189 if (alt_ref_sum > REF_FRAMES - cfg->ss_number_layers) | 189 if (alt_ref_sum > REF_FRAMES - cfg->ss_number_layers) |
190 ERROR("Not enough ref buffers for svc alt ref frames"); | 190 ERROR("Not enough ref buffers for svc alt ref frames"); |
191 if ((cfg->ss_number_layers > 3 || | 191 if (cfg->ss_number_layers * cfg->ts_number_layers > 3 && |
192 cfg->ss_number_layers * cfg->ts_number_layers > 4) && | |
193 cfg->g_error_resilient == 0) | 192 cfg->g_error_resilient == 0) |
194 ERROR("Multiple frame context are not supported for more than 3 spatial " | 193 ERROR("Multiple frame context are not supported for more than 3 layers"); |
195 "layers or more than 4 spatial x temporal layers"); | |
196 } | 194 } |
197 #endif | 195 #endif |
198 | 196 |
199 // VP9 does not support a lower bound on the keyframe interval in | 197 // VP9 does not support a lower bound on the keyframe interval in |
200 // automatic keyframe placement mode. | 198 // automatic keyframe placement mode. |
201 if (cfg->kf_mode != VPX_KF_DISABLED && | 199 if (cfg->kf_mode != VPX_KF_DISABLED && |
202 cfg->kf_min_dist != cfg->kf_max_dist && | 200 cfg->kf_min_dist != cfg->kf_max_dist && |
203 cfg->kf_min_dist > 0) | 201 cfg->kf_min_dist > 0) |
204 ERROR("kf_min_dist not supported in auto mode, use 0 " | 202 ERROR("kf_min_dist not supported in auto mode, use 0 " |
205 "or kf_max_dist instead."); | 203 "or kf_max_dist instead."); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 | 265 |
268 stats = | 266 stats = |
269 (const FIRSTPASS_STATS *)cfg->rc_twopass_stats_in.buf + n_packets - 1; | 267 (const FIRSTPASS_STATS *)cfg->rc_twopass_stats_in.buf + n_packets - 1; |
270 | 268 |
271 if ((int)(stats->count + 0.5) != n_packets - 1) | 269 if ((int)(stats->count + 0.5) != n_packets - 1) |
272 ERROR("rc_twopass_stats_in missing EOS stats packet"); | 270 ERROR("rc_twopass_stats_in missing EOS stats packet"); |
273 } | 271 } |
274 } | 272 } |
275 | 273 |
276 #if !CONFIG_VP9_HIGHBITDEPTH | 274 #if !CONFIG_VP9_HIGHBITDEPTH |
277 if (cfg->g_profile > (unsigned int)PROFILE_1) | 275 if (cfg->g_profile > (unsigned int)PROFILE_1) { |
278 ERROR("Profile > 1 not supported in this build configuration"); | 276 ERROR("Profile > 1 not supported in this build configuration"); |
| 277 } |
279 #endif | 278 #endif |
280 if (cfg->g_profile <= (unsigned int)PROFILE_1 && | 279 if (cfg->g_profile <= (unsigned int)PROFILE_1 && |
281 extra_cfg->bit_depth > VPX_BITS_8) | 280 cfg->g_bit_depth > VPX_BITS_8) { |
282 ERROR("Codec high bit-depth not supported in profile < 2"); | 281 ERROR("Codec high bit-depth not supported in profile < 2"); |
| 282 } |
| 283 if (cfg->g_profile <= (unsigned int)PROFILE_1 && |
| 284 cfg->g_input_bit_depth > 8) { |
| 285 ERROR("Source high bit-depth not supported in profile < 2"); |
| 286 } |
283 if (cfg->g_profile > (unsigned int)PROFILE_1 && | 287 if (cfg->g_profile > (unsigned int)PROFILE_1 && |
284 extra_cfg->bit_depth == VPX_BITS_8) | 288 cfg->g_bit_depth == VPX_BITS_8) { |
285 ERROR("Codec bit-depth 8 not supported in profile > 1"); | 289 ERROR("Codec bit-depth 8 not supported in profile > 1"); |
| 290 } |
286 | 291 |
287 return VPX_CODEC_OK; | 292 return VPX_CODEC_OK; |
288 } | 293 } |
289 | 294 |
290 | |
291 static vpx_codec_err_t validate_img(vpx_codec_alg_priv_t *ctx, | 295 static vpx_codec_err_t validate_img(vpx_codec_alg_priv_t *ctx, |
292 const vpx_image_t *img) { | 296 const vpx_image_t *img) { |
293 switch (img->fmt) { | 297 switch (img->fmt) { |
294 case VPX_IMG_FMT_YV12: | 298 case VPX_IMG_FMT_YV12: |
295 case VPX_IMG_FMT_I420: | 299 case VPX_IMG_FMT_I420: |
| 300 case VPX_IMG_FMT_I42016: |
| 301 break; |
296 case VPX_IMG_FMT_I422: | 302 case VPX_IMG_FMT_I422: |
297 case VPX_IMG_FMT_I444: | 303 case VPX_IMG_FMT_I444: |
| 304 case VPX_IMG_FMT_I440: |
| 305 if (ctx->cfg.g_profile != (unsigned int)PROFILE_1) { |
| 306 ERROR("Invalid image format. I422, I444, I440 images are " |
| 307 "not supported in profile."); |
| 308 } |
| 309 break; |
| 310 case VPX_IMG_FMT_I42216: |
| 311 case VPX_IMG_FMT_I44416: |
| 312 case VPX_IMG_FMT_I44016: |
| 313 if (ctx->cfg.g_profile != (unsigned int)PROFILE_1 && |
| 314 ctx->cfg.g_profile != (unsigned int)PROFILE_3) { |
| 315 ERROR("Invalid image format. 16-bit I422, I444, I440 images are " |
| 316 "not supported in profile."); |
| 317 } |
298 break; | 318 break; |
299 default: | 319 default: |
300 ERROR("Invalid image format. Only YV12, I420, I422, I444 images are " | 320 ERROR("Invalid image format. Only YV12, I420, I422, I444 images are " |
301 "supported."); | 321 "supported."); |
302 break; | 322 break; |
303 } | 323 } |
304 | 324 |
305 if (img->d_w != ctx->cfg.g_w || img->d_h != ctx->cfg.g_h) | 325 if (img->d_w != ctx->cfg.g_w || img->d_h != ctx->cfg.g_h) |
306 ERROR("Image size must match encoder init configuration size"); | 326 ERROR("Image size must match encoder init configuration size"); |
307 | 327 |
308 return VPX_CODEC_OK; | 328 return VPX_CODEC_OK; |
309 } | 329 } |
310 | 330 |
311 static int get_image_bps(const vpx_image_t *img) { | 331 static int get_image_bps(const vpx_image_t *img) { |
312 switch (img->fmt) { | 332 switch (img->fmt) { |
313 case VPX_IMG_FMT_YV12: | 333 case VPX_IMG_FMT_YV12: |
314 case VPX_IMG_FMT_I420: return 12; | 334 case VPX_IMG_FMT_I420: return 12; |
315 case VPX_IMG_FMT_I422: return 16; | 335 case VPX_IMG_FMT_I422: return 16; |
316 case VPX_IMG_FMT_I444: return 24; | 336 case VPX_IMG_FMT_I444: return 24; |
| 337 case VPX_IMG_FMT_I440: return 16; |
317 case VPX_IMG_FMT_I42016: return 24; | 338 case VPX_IMG_FMT_I42016: return 24; |
318 case VPX_IMG_FMT_I42216: return 32; | 339 case VPX_IMG_FMT_I42216: return 32; |
319 case VPX_IMG_FMT_I44416: return 48; | 340 case VPX_IMG_FMT_I44416: return 48; |
| 341 case VPX_IMG_FMT_I44016: return 32; |
320 default: assert(0 && "Invalid image format"); break; | 342 default: assert(0 && "Invalid image format"); break; |
321 } | 343 } |
322 return 0; | 344 return 0; |
323 } | 345 } |
324 | 346 |
325 static vpx_codec_err_t set_encoder_config( | 347 static vpx_codec_err_t set_encoder_config( |
326 VP9EncoderConfig *oxcf, | 348 VP9EncoderConfig *oxcf, |
327 const vpx_codec_enc_cfg_t *cfg, | 349 const vpx_codec_enc_cfg_t *cfg, |
328 const struct vp9_extracfg *extra_cfg) { | 350 const struct vp9_extracfg *extra_cfg) { |
329 const int is_vbr = cfg->rc_end_usage == VPX_VBR; | 351 const int is_vbr = cfg->rc_end_usage == VPX_VBR; |
330 oxcf->profile = cfg->g_profile; | 352 oxcf->profile = cfg->g_profile; |
331 oxcf->width = cfg->g_w; | 353 oxcf->width = cfg->g_w; |
332 oxcf->height = cfg->g_h; | 354 oxcf->height = cfg->g_h; |
333 oxcf->bit_depth = extra_cfg->bit_depth; | 355 oxcf->bit_depth = cfg->g_bit_depth; |
334 oxcf->input_bit_depth = cfg->g_input_bit_depth; | 356 oxcf->input_bit_depth = cfg->g_input_bit_depth; |
335 // guess a frame rate if out of whack, use 30 | 357 // guess a frame rate if out of whack, use 30 |
336 oxcf->init_framerate = (double)cfg->g_timebase.den / cfg->g_timebase.num; | 358 oxcf->init_framerate = (double)cfg->g_timebase.den / cfg->g_timebase.num; |
337 if (oxcf->init_framerate > 180) | 359 if (oxcf->init_framerate > 180) |
338 oxcf->init_framerate = 30; | 360 oxcf->init_framerate = 30; |
339 | 361 |
340 oxcf->mode = GOOD; | 362 oxcf->mode = GOOD; |
341 | 363 |
342 switch (cfg->g_pass) { | 364 switch (cfg->g_pass) { |
343 case VPX_RC_ONE_PASS: | 365 case VPX_RC_ONE_PASS: |
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1353 1, // 1 cfg map | 1375 1, // 1 cfg map |
1354 encoder_usage_cfg_map, // vpx_codec_enc_cfg_map_t | 1376 encoder_usage_cfg_map, // vpx_codec_enc_cfg_map_t |
1355 encoder_encode, // vpx_codec_encode_fn_t | 1377 encoder_encode, // vpx_codec_encode_fn_t |
1356 encoder_get_cxdata, // vpx_codec_get_cx_data_fn_t | 1378 encoder_get_cxdata, // vpx_codec_get_cx_data_fn_t |
1357 encoder_set_config, // vpx_codec_enc_config_set_fn_t | 1379 encoder_set_config, // vpx_codec_enc_config_set_fn_t |
1358 NULL, // vpx_codec_get_global_headers_fn_t | 1380 NULL, // vpx_codec_get_global_headers_fn_t |
1359 encoder_get_preview, // vpx_codec_get_preview_frame_fn_t | 1381 encoder_get_preview, // vpx_codec_get_preview_frame_fn_t |
1360 NULL // vpx_codec_enc_mr_get_mem_loc_fn_t | 1382 NULL // vpx_codec_enc_mr_get_mem_loc_fn_t |
1361 } | 1383 } |
1362 }; | 1384 }; |
OLD | NEW |