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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 static const arg_def_t disable_warnings = | 193 static const arg_def_t disable_warnings = |
194 ARG_DEF(NULL, "disable-warnings", 0, | 194 ARG_DEF(NULL, "disable-warnings", 0, |
195 "Disable warnings about potentially incorrect encode settings."); | 195 "Disable warnings about potentially incorrect encode settings."); |
196 static const arg_def_t disable_warning_prompt = | 196 static const arg_def_t disable_warning_prompt = |
197 ARG_DEF("y", "disable-warning-prompt", 0, | 197 ARG_DEF("y", "disable-warning-prompt", 0, |
198 "Display warnings, but do not prompt user to continue."); | 198 "Display warnings, but do not prompt user to continue."); |
199 static const arg_def_t experimental_bitstream = | 199 static const arg_def_t experimental_bitstream = |
200 ARG_DEF(NULL, "experimental-bitstream", 0, | 200 ARG_DEF(NULL, "experimental-bitstream", 0, |
201 "Allow experimental bitstream features."); | 201 "Allow experimental bitstream features."); |
202 | 202 |
| 203 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 204 static const arg_def_t test16bitinternalarg = ARG_DEF( |
| 205 NULL, "test-16bit-internal", 0, "Force use of 16 bit internal buffer"); |
| 206 #endif |
203 | 207 |
204 static const arg_def_t *main_args[] = { | 208 static const arg_def_t *main_args[] = { |
205 &debugmode, | 209 &debugmode, |
206 &outputfile, &codecarg, &passes, &pass_arg, &fpf_name, &limit, &skip, | 210 &outputfile, &codecarg, &passes, &pass_arg, &fpf_name, &limit, &skip, |
207 &deadline, &best_dl, &good_dl, &rt_dl, | 211 &deadline, &best_dl, &good_dl, &rt_dl, |
208 &quietarg, &verbosearg, &psnrarg, &use_ivf, &out_part, &q_hist_n, | 212 &quietarg, &verbosearg, &psnrarg, &use_ivf, &out_part, &q_hist_n, |
209 &rate_hist_n, &disable_warnings, &disable_warning_prompt, | 213 &rate_hist_n, &disable_warnings, &disable_warning_prompt, |
210 NULL | 214 NULL |
211 }; | 215 }; |
212 | 216 |
(...skipping 28 matching lines...) Expand all Loading... |
241 | 245 |
242 static const arg_def_t *global_args[] = { | 246 static const arg_def_t *global_args[] = { |
243 &use_yv12, &use_i420, &use_i422, &use_i444, | 247 &use_yv12, &use_i420, &use_i422, &use_i444, |
244 &usage, &threads, &profile, | 248 &usage, &threads, &profile, |
245 &width, &height, | 249 &width, &height, |
246 #if CONFIG_WEBM_IO | 250 #if CONFIG_WEBM_IO |
247 &stereo_mode, | 251 &stereo_mode, |
248 #endif | 252 #endif |
249 &timebase, &framerate, | 253 &timebase, &framerate, |
250 &error_resilient, | 254 &error_resilient, |
| 255 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 256 &test16bitinternalarg, |
| 257 #endif |
251 &lag_in_frames, NULL | 258 &lag_in_frames, NULL |
252 }; | 259 }; |
253 | 260 |
254 static const arg_def_t dropframe_thresh = ARG_DEF(NULL, "drop-frame", 1, | 261 static const arg_def_t dropframe_thresh = ARG_DEF(NULL, "drop-frame", 1, |
255 "Temporal resampling thresho
ld (buf %)"); | 262 "Temporal resampling thresho
ld (buf %)"); |
256 static const arg_def_t resize_allowed = ARG_DEF(NULL, "resize-allowed", 1, | 263 static const arg_def_t resize_allowed = ARG_DEF(NULL, "resize-allowed", 1, |
257 "Spatial resampling enabled
(bool)"); | 264 "Spatial resampling enabled
(bool)"); |
258 static const arg_def_t resize_width = ARG_DEF(NULL, "resize-width", 1, | 265 static const arg_def_t resize_width = ARG_DEF(NULL, "resize-width", 1, |
259 "Width of encoded frame"); | 266 "Width of encoded frame"); |
260 static const arg_def_t resize_height = ARG_DEF(NULL, "resize-height", 1, | 267 static const arg_def_t resize_height = ARG_DEF(NULL, "resize-height", 1, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 static const arg_def_t kf_disabled = ARG_DEF(NULL, "disable-kf", 0, | 321 static const arg_def_t kf_disabled = ARG_DEF(NULL, "disable-kf", 0, |
315 "Disable keyframe placement"); | 322 "Disable keyframe placement"); |
316 static const arg_def_t *kf_args[] = { | 323 static const arg_def_t *kf_args[] = { |
317 &kf_min_dist, &kf_max_dist, &kf_disabled, NULL | 324 &kf_min_dist, &kf_max_dist, &kf_disabled, NULL |
318 }; | 325 }; |
319 | 326 |
320 | 327 |
321 static const arg_def_t noise_sens = ARG_DEF(NULL, "noise-sensitivity", 1, | 328 static const arg_def_t noise_sens = ARG_DEF(NULL, "noise-sensitivity", 1, |
322 "Noise sensitivity (frames to blur)"
); | 329 "Noise sensitivity (frames to blur)"
); |
323 static const arg_def_t sharpness = ARG_DEF(NULL, "sharpness", 1, | 330 static const arg_def_t sharpness = ARG_DEF(NULL, "sharpness", 1, |
324 "Filter sharpness (0-7)"); | 331 "Loop filter sharpness (0..7)"); |
325 static const arg_def_t static_thresh = ARG_DEF(NULL, "static-thresh", 1, | 332 static const arg_def_t static_thresh = ARG_DEF(NULL, "static-thresh", 1, |
326 "Motion detection threshold"); | 333 "Motion detection threshold"); |
327 static const arg_def_t cpu_used = ARG_DEF(NULL, "cpu-used", 1, | 334 static const arg_def_t cpu_used = ARG_DEF(NULL, "cpu-used", 1, |
328 "CPU Used (-16..16)"); | 335 "CPU Used (-16..16)"); |
329 static const arg_def_t auto_altref = ARG_DEF(NULL, "auto-alt-ref", 1, | 336 static const arg_def_t auto_altref = ARG_DEF(NULL, "auto-alt-ref", 1, |
330 "Enable automatic alt reference fra
mes"); | 337 "Enable automatic alt reference fra
mes"); |
331 static const arg_def_t arnr_maxframes = ARG_DEF(NULL, "arnr-maxframes", 1, | 338 static const arg_def_t arnr_maxframes = ARG_DEF(NULL, "arnr-maxframes", 1, |
332 "AltRef Max Frames"); | 339 "AltRef max frames (0..15)"); |
333 static const arg_def_t arnr_strength = ARG_DEF(NULL, "arnr-strength", 1, | 340 static const arg_def_t arnr_strength = ARG_DEF(NULL, "arnr-strength", 1, |
334 "AltRef Strength"); | 341 "AltRef filter strength (0..6)"); |
335 static const arg_def_t arnr_type = ARG_DEF(NULL, "arnr-type", 1, | 342 static const arg_def_t arnr_type = ARG_DEF(NULL, "arnr-type", 1, |
336 "AltRef Type"); | 343 "AltRef type"); |
337 static const struct arg_enum_list tuning_enum[] = { | 344 static const struct arg_enum_list tuning_enum[] = { |
338 {"psnr", VP8_TUNE_PSNR}, | 345 {"psnr", VP8_TUNE_PSNR}, |
339 {"ssim", VP8_TUNE_SSIM}, | 346 {"ssim", VP8_TUNE_SSIM}, |
340 {NULL, 0} | 347 {NULL, 0} |
341 }; | 348 }; |
342 static const arg_def_t tune_ssim = ARG_DEF_ENUM(NULL, "tune", 1, | 349 static const arg_def_t tune_ssim = ARG_DEF_ENUM(NULL, "tune", 1, |
343 "Material to favor", tuning_enum
); | 350 "Material to favor", tuning_enum
); |
344 static const arg_def_t cq_level = ARG_DEF(NULL, "cq-level", 1, | 351 static const arg_def_t cq_level = ARG_DEF(NULL, "cq-level", 1, |
345 "Constant/Constrained Quality level"); | 352 "Constant/Constrained Quality level"); |
346 static const arg_def_t max_intra_rate_pct = ARG_DEF(NULL, "max-intra-rate", 1, | 353 static const arg_def_t max_intra_rate_pct = ARG_DEF(NULL, "max-intra-rate", 1, |
(...skipping 24 matching lines...) Expand all Loading... |
371 static const arg_def_t tile_rows = | 378 static const arg_def_t tile_rows = |
372 ARG_DEF(NULL, "tile-rows", 1, "Number of tile rows to use, log2"); | 379 ARG_DEF(NULL, "tile-rows", 1, "Number of tile rows to use, log2"); |
373 static const arg_def_t lossless = ARG_DEF(NULL, "lossless", 1, "Lossless mode"); | 380 static const arg_def_t lossless = ARG_DEF(NULL, "lossless", 1, "Lossless mode"); |
374 static const arg_def_t frame_parallel_decoding = ARG_DEF( | 381 static const arg_def_t frame_parallel_decoding = ARG_DEF( |
375 NULL, "frame-parallel", 1, "Enable frame parallel decodability features"); | 382 NULL, "frame-parallel", 1, "Enable frame parallel decodability features"); |
376 static const arg_def_t aq_mode = ARG_DEF( | 383 static const arg_def_t aq_mode = ARG_DEF( |
377 NULL, "aq-mode", 1, | 384 NULL, "aq-mode", 1, |
378 "Adaptive quantization mode (0: off (default), 1: variance 2: complexity, " | 385 "Adaptive quantization mode (0: off (default), 1: variance 2: complexity, " |
379 "3: cyclic refresh)"); | 386 "3: cyclic refresh)"); |
380 static const arg_def_t frame_periodic_boost = ARG_DEF( | 387 static const arg_def_t frame_periodic_boost = ARG_DEF( |
381 NULL, "frame_boost", 1, | 388 NULL, "frame-boost", 1, |
382 "Enable frame periodic boost (0: off (default), 1: on)"); | 389 "Enable frame periodic boost (0: off (default), 1: on)"); |
383 | 390 |
| 391 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 392 static const struct arg_enum_list bitdepth_enum[] = { |
| 393 {"8", VPX_BITS_8}, |
| 394 {"10", VPX_BITS_10}, |
| 395 {"12", VPX_BITS_12}, |
| 396 {NULL, 0} |
| 397 }; |
| 398 |
| 399 static const arg_def_t bitdeptharg = ARG_DEF_ENUM("b", "bit-depth", 1, |
| 400 "Bit depth for codec " |
| 401 "(8 for version <=1, " |
| 402 "10 or 12 for version 2)", |
| 403 bitdepth_enum); |
| 404 static const arg_def_t inbitdeptharg = ARG_DEF(NULL, "input-bit-depth", 1, |
| 405 "Bit depth of input"); |
| 406 #endif |
| 407 |
384 static const struct arg_enum_list tune_content_enum[] = { | 408 static const struct arg_enum_list tune_content_enum[] = { |
385 {"default", VP9E_CONTENT_DEFAULT}, | 409 {"default", VP9E_CONTENT_DEFAULT}, |
386 {"screen", VP9E_CONTENT_SCREEN}, | 410 {"screen", VP9E_CONTENT_SCREEN}, |
387 {NULL, 0} | 411 {NULL, 0} |
388 }; | 412 }; |
389 | 413 |
390 static const arg_def_t tune_content = ARG_DEF_ENUM( | 414 static const arg_def_t tune_content = ARG_DEF_ENUM( |
391 NULL, "tune-content", 1, "Tune content type", tune_content_enum); | 415 NULL, "tune-content", 1, "Tune content type", tune_content_enum); |
392 | 416 |
393 static const arg_def_t *vp9_args[] = { | 417 static const arg_def_t *vp9_args[] = { |
394 &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh, | 418 &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh, |
395 &tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type, | 419 &tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type, |
396 &tune_ssim, &cq_level, &max_intra_rate_pct, &lossless, | 420 &tune_ssim, &cq_level, &max_intra_rate_pct, &lossless, |
397 &frame_parallel_decoding, &aq_mode, &frame_periodic_boost, &tune_content, | 421 &frame_parallel_decoding, &aq_mode, &frame_periodic_boost, &tune_content, |
| 422 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 423 &bitdeptharg, &inbitdeptharg, |
| 424 #endif |
398 NULL | 425 NULL |
399 }; | 426 }; |
400 static const int vp9_arg_ctrl_map[] = { | 427 static const int vp9_arg_ctrl_map[] = { |
401 VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF, | 428 VP8E_SET_CPUUSED, VP8E_SET_ENABLEAUTOALTREF, |
402 VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD, | 429 VP8E_SET_NOISE_SENSITIVITY, VP8E_SET_SHARPNESS, VP8E_SET_STATIC_THRESHOLD, |
403 VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS, | 430 VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS, |
404 VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE, | 431 VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE, |
405 VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT, | 432 VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT, |
406 VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE, | 433 VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE, |
407 VP9E_SET_FRAME_PERIODIC_BOOST, VP9E_SET_TUNE_CONTENT, | 434 VP9E_SET_FRAME_PERIODIC_BOOST, VP9E_SET_TUNE_CONTENT, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 for (i = 0; i < get_vpx_encoder_count(); ++i) { | 470 for (i = 0; i < get_vpx_encoder_count(); ++i) { |
444 const VpxInterface *const encoder = get_vpx_encoder_by_index(i); | 471 const VpxInterface *const encoder = get_vpx_encoder_by_index(i); |
445 fprintf(stderr, " %-6s - %s\n", | 472 fprintf(stderr, " %-6s - %s\n", |
446 encoder->name, vpx_codec_iface_name(encoder->codec_interface())); | 473 encoder->name, vpx_codec_iface_name(encoder->codec_interface())); |
447 } | 474 } |
448 | 475 |
449 exit(EXIT_FAILURE); | 476 exit(EXIT_FAILURE); |
450 } | 477 } |
451 | 478 |
452 #define mmin(a, b) ((a) < (b) ? (a) : (b)) | 479 #define mmin(a, b) ((a) < (b) ? (a) : (b)) |
| 480 |
| 481 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 482 static void find_mismatch_high(const vpx_image_t *const img1, |
| 483 const vpx_image_t *const img2, |
| 484 int yloc[4], int uloc[4], int vloc[4]) { |
| 485 uint16_t *plane1, *plane2; |
| 486 uint32_t stride1, stride2; |
| 487 const uint32_t bsize = 64; |
| 488 const uint32_t bsizey = bsize >> img1->y_chroma_shift; |
| 489 const uint32_t bsizex = bsize >> img1->x_chroma_shift; |
| 490 const uint32_t c_w = |
| 491 (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; |
| 492 const uint32_t c_h = |
| 493 (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; |
| 494 int match = 1; |
| 495 uint32_t i, j; |
| 496 yloc[0] = yloc[1] = yloc[2] = yloc[3] = -1; |
| 497 plane1 = (uint16_t*)img1->planes[VPX_PLANE_Y]; |
| 498 plane2 = (uint16_t*)img2->planes[VPX_PLANE_Y]; |
| 499 stride1 = img1->stride[VPX_PLANE_Y]/2; |
| 500 stride2 = img2->stride[VPX_PLANE_Y]/2; |
| 501 for (i = 0, match = 1; match && i < img1->d_h; i += bsize) { |
| 502 for (j = 0; match && j < img1->d_w; j += bsize) { |
| 503 int k, l; |
| 504 const int si = mmin(i + bsize, img1->d_h) - i; |
| 505 const int sj = mmin(j + bsize, img1->d_w) - j; |
| 506 for (k = 0; match && k < si; ++k) { |
| 507 for (l = 0; match && l < sj; ++l) { |
| 508 if (*(plane1 + (i + k) * stride1 + j + l) != |
| 509 *(plane2 + (i + k) * stride2 + j + l)) { |
| 510 yloc[0] = i + k; |
| 511 yloc[1] = j + l; |
| 512 yloc[2] = *(plane1 + (i + k) * stride1 + j + l); |
| 513 yloc[3] = *(plane2 + (i + k) * stride2 + j + l); |
| 514 match = 0; |
| 515 break; |
| 516 } |
| 517 } |
| 518 } |
| 519 } |
| 520 } |
| 521 |
| 522 uloc[0] = uloc[1] = uloc[2] = uloc[3] = -1; |
| 523 plane1 = (uint16_t*)img1->planes[VPX_PLANE_U]; |
| 524 plane2 = (uint16_t*)img2->planes[VPX_PLANE_U]; |
| 525 stride1 = img1->stride[VPX_PLANE_U]/2; |
| 526 stride2 = img2->stride[VPX_PLANE_U]/2; |
| 527 for (i = 0, match = 1; match && i < c_h; i += bsizey) { |
| 528 for (j = 0; match && j < c_w; j += bsizex) { |
| 529 int k, l; |
| 530 const int si = mmin(i + bsizey, c_h - i); |
| 531 const int sj = mmin(j + bsizex, c_w - j); |
| 532 for (k = 0; match && k < si; ++k) { |
| 533 for (l = 0; match && l < sj; ++l) { |
| 534 if (*(plane1 + (i + k) * stride1 + j + l) != |
| 535 *(plane2 + (i + k) * stride2 + j + l)) { |
| 536 uloc[0] = i + k; |
| 537 uloc[1] = j + l; |
| 538 uloc[2] = *(plane1 + (i + k) * stride1 + j + l); |
| 539 uloc[3] = *(plane2 + (i + k) * stride2 + j + l); |
| 540 match = 0; |
| 541 break; |
| 542 } |
| 543 } |
| 544 } |
| 545 } |
| 546 } |
| 547 |
| 548 vloc[0] = vloc[1] = vloc[2] = vloc[3] = -1; |
| 549 plane1 = (uint16_t*)img1->planes[VPX_PLANE_V]; |
| 550 plane2 = (uint16_t*)img2->planes[VPX_PLANE_V]; |
| 551 stride1 = img1->stride[VPX_PLANE_V]/2; |
| 552 stride2 = img2->stride[VPX_PLANE_V]/2; |
| 553 for (i = 0, match = 1; match && i < c_h; i += bsizey) { |
| 554 for (j = 0; match && j < c_w; j += bsizex) { |
| 555 int k, l; |
| 556 const int si = mmin(i + bsizey, c_h - i); |
| 557 const int sj = mmin(j + bsizex, c_w - j); |
| 558 for (k = 0; match && k < si; ++k) { |
| 559 for (l = 0; match && l < sj; ++l) { |
| 560 if (*(plane1 + (i + k) * stride1 + j + l) != |
| 561 *(plane2 + (i + k) * stride2 + j + l)) { |
| 562 vloc[0] = i + k; |
| 563 vloc[1] = j + l; |
| 564 vloc[2] = *(plane1 + (i + k) * stride1 + j + l); |
| 565 vloc[3] = *(plane2 + (i + k) * stride2 + j + l); |
| 566 match = 0; |
| 567 break; |
| 568 } |
| 569 } |
| 570 } |
| 571 } |
| 572 } |
| 573 } |
| 574 #endif |
| 575 |
453 static void find_mismatch(const vpx_image_t *const img1, | 576 static void find_mismatch(const vpx_image_t *const img1, |
454 const vpx_image_t *const img2, | 577 const vpx_image_t *const img2, |
455 int yloc[4], int uloc[4], int vloc[4]) { | 578 int yloc[4], int uloc[4], int vloc[4]) { |
456 const uint32_t bsize = 64; | 579 const uint32_t bsize = 64; |
457 const uint32_t bsizey = bsize >> img1->y_chroma_shift; | 580 const uint32_t bsizey = bsize >> img1->y_chroma_shift; |
458 const uint32_t bsizex = bsize >> img1->x_chroma_shift; | 581 const uint32_t bsizex = bsize >> img1->x_chroma_shift; |
459 const uint32_t c_w = | 582 const uint32_t c_w = |
460 (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; | 583 (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; |
461 const uint32_t c_h = | 584 const uint32_t c_h = |
462 (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; | 585 (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 break; | 658 break; |
536 } | 659 } |
537 } | 660 } |
538 } | 661 } |
539 } | 662 } |
540 } | 663 } |
541 } | 664 } |
542 | 665 |
543 static int compare_img(const vpx_image_t *const img1, | 666 static int compare_img(const vpx_image_t *const img1, |
544 const vpx_image_t *const img2) { | 667 const vpx_image_t *const img2) { |
545 const uint32_t c_w = | 668 uint32_t l_w = img1->d_w; |
| 669 uint32_t c_w = |
546 (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; | 670 (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; |
547 const uint32_t c_h = | 671 const uint32_t c_h = |
548 (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; | 672 (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; |
549 uint32_t i; | 673 uint32_t i; |
550 int match = 1; | 674 int match = 1; |
551 | 675 |
552 match &= (img1->fmt == img2->fmt); | 676 match &= (img1->fmt == img2->fmt); |
553 match &= (img1->d_w == img2->d_w); | 677 match &= (img1->d_w == img2->d_w); |
554 match &= (img1->d_h == img2->d_h); | 678 match &= (img1->d_h == img2->d_h); |
| 679 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 680 if (img1->fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
| 681 l_w *= 2; |
| 682 c_w *= 2; |
| 683 } |
| 684 #endif |
555 | 685 |
556 for (i = 0; i < img1->d_h; ++i) | 686 for (i = 0; i < img1->d_h; ++i) |
557 match &= (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y], | 687 match &= (memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y], |
558 img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y], | 688 img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y], |
559 img1->d_w) == 0); | 689 l_w) == 0); |
560 | 690 |
561 for (i = 0; i < c_h; ++i) | 691 for (i = 0; i < c_h; ++i) |
562 match &= (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U], | 692 match &= (memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U], |
563 img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U], | 693 img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U], |
564 c_w) == 0); | 694 c_w) == 0); |
565 | 695 |
566 for (i = 0; i < c_h; ++i) | 696 for (i = 0; i < c_h; ++i) |
567 match &= (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V], | 697 match &= (memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V], |
568 img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V], | 698 img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V], |
569 c_w) == 0); | 699 c_w) == 0); |
(...skipping 24 matching lines...) Expand all Loading... |
594 const char *out_fn; | 724 const char *out_fn; |
595 const char *stats_fn; | 725 const char *stats_fn; |
596 #if CONFIG_FP_MB_STATS | 726 #if CONFIG_FP_MB_STATS |
597 const char *fpmb_stats_fn; | 727 const char *fpmb_stats_fn; |
598 #endif | 728 #endif |
599 stereo_format_t stereo_fmt; | 729 stereo_format_t stereo_fmt; |
600 int arg_ctrls[ARG_CTRL_CNT_MAX][2]; | 730 int arg_ctrls[ARG_CTRL_CNT_MAX][2]; |
601 int arg_ctrl_cnt; | 731 int arg_ctrl_cnt; |
602 int write_webm; | 732 int write_webm; |
603 int have_kf_max_dist; | 733 int have_kf_max_dist; |
| 734 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 735 // whether to use 16bit internal buffers |
| 736 int use_16bit_internal; |
| 737 #endif |
604 }; | 738 }; |
605 | 739 |
606 | 740 |
607 struct stream_state { | 741 struct stream_state { |
608 int index; | 742 int index; |
609 struct stream_state *next; | 743 struct stream_state *next; |
610 struct stream_config config; | 744 struct stream_config config; |
611 FILE *file; | 745 FILE *file; |
612 struct rate_hist *rate_hist; | 746 struct rate_hist *rate_hist; |
613 struct EbmlGlobal ebml; | 747 struct EbmlGlobal ebml; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 warn("Assuming --pass=%d implies --passes=%d\n", | 867 warn("Assuming --pass=%d implies --passes=%d\n", |
734 global->pass, global->pass); | 868 global->pass, global->pass); |
735 global->passes = global->pass; | 869 global->passes = global->pass; |
736 } | 870 } |
737 } | 871 } |
738 /* Validate global config */ | 872 /* Validate global config */ |
739 if (global->passes == 0) { | 873 if (global->passes == 0) { |
740 #if CONFIG_VP9_ENCODER | 874 #if CONFIG_VP9_ENCODER |
741 // Make default VP9 passes = 2 until there is a better quality 1-pass | 875 // Make default VP9 passes = 2 until there is a better quality 1-pass |
742 // encoder | 876 // encoder |
743 global->passes = (strcmp(global->codec->name, "vp9") == 0 && | 877 if (global->codec != NULL && global->codec->name != NULL) |
744 global->deadline != VPX_DL_REALTIME) ? 2 : 1; | 878 global->passes = (strcmp(global->codec->name, "vp9") == 0 && |
| 879 global->deadline != VPX_DL_REALTIME) ? 2 : 1; |
745 #else | 880 #else |
746 global->passes = 1; | 881 global->passes = 1; |
747 #endif | 882 #endif |
748 } | 883 } |
749 | 884 |
750 if (global->deadline == VPX_DL_REALTIME && | 885 if (global->deadline == VPX_DL_REALTIME && |
751 global->passes > 1) { | 886 global->passes > 1) { |
752 warn("Enforcing one-pass encoding in realtime mode\n"); | 887 warn("Enforcing one-pass encoding in realtime mode\n"); |
753 global->passes = 1; | 888 global->passes = 1; |
754 } | 889 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 fclose(input->file); | 937 fclose(input->file); |
803 if (input->file_type == FILE_TYPE_Y4M) | 938 if (input->file_type == FILE_TYPE_Y4M) |
804 y4m_input_close(&input->y4m); | 939 y4m_input_close(&input->y4m); |
805 } | 940 } |
806 | 941 |
807 static struct stream_state *new_stream(struct VpxEncoderConfig *global, | 942 static struct stream_state *new_stream(struct VpxEncoderConfig *global, |
808 struct stream_state *prev) { | 943 struct stream_state *prev) { |
809 struct stream_state *stream; | 944 struct stream_state *stream; |
810 | 945 |
811 stream = calloc(1, sizeof(*stream)); | 946 stream = calloc(1, sizeof(*stream)); |
812 if (!stream) | 947 if (stream == NULL) { |
813 fatal("Failed to allocate new stream."); | 948 fatal("Failed to allocate new stream."); |
| 949 } |
| 950 |
814 if (prev) { | 951 if (prev) { |
815 memcpy(stream, prev, sizeof(*stream)); | 952 memcpy(stream, prev, sizeof(*stream)); |
816 stream->index++; | 953 stream->index++; |
817 prev->next = stream; | 954 prev->next = stream; |
818 } else { | 955 } else { |
819 vpx_codec_err_t res; | 956 vpx_codec_err_t res; |
820 | 957 |
821 /* Populate encoder configuration */ | 958 /* Populate encoder configuration */ |
822 res = vpx_codec_enc_config_default(global->codec->codec_interface(), | 959 res = vpx_codec_enc_config_default(global->codec->codec_interface(), |
823 &stream->config.cfg, | 960 &stream->config.cfg, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 | 1000 |
864 static int parse_stream_params(struct VpxEncoderConfig *global, | 1001 static int parse_stream_params(struct VpxEncoderConfig *global, |
865 struct stream_state *stream, | 1002 struct stream_state *stream, |
866 char **argv) { | 1003 char **argv) { |
867 char **argi, **argj; | 1004 char **argi, **argj; |
868 struct arg arg; | 1005 struct arg arg; |
869 static const arg_def_t **ctrl_args = no_args; | 1006 static const arg_def_t **ctrl_args = no_args; |
870 static const int *ctrl_args_map = NULL; | 1007 static const int *ctrl_args_map = NULL; |
871 struct stream_config *config = &stream->config; | 1008 struct stream_config *config = &stream->config; |
872 int eos_mark_found = 0; | 1009 int eos_mark_found = 0; |
| 1010 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1011 int test_16bit_internal = 0; |
| 1012 #endif |
873 | 1013 |
874 // Handle codec specific options | 1014 // Handle codec specific options |
875 if (0) { | 1015 if (0) { |
876 #if CONFIG_VP8_ENCODER | 1016 #if CONFIG_VP8_ENCODER |
877 } else if (strcmp(global->codec->name, "vp8") == 0) { | 1017 } else if (strcmp(global->codec->name, "vp8") == 0) { |
878 ctrl_args = vp8_args; | 1018 ctrl_args = vp8_args; |
879 ctrl_args_map = vp8_arg_ctrl_map; | 1019 ctrl_args_map = vp8_arg_ctrl_map; |
880 #endif | 1020 #endif |
881 #if CONFIG_VP9_ENCODER | 1021 #if CONFIG_VP9_ENCODER |
882 } else if (strcmp(global->codec->name, "vp9") == 0) { | 1022 } else if (strcmp(global->codec->name, "vp9") == 0) { |
(...skipping 28 matching lines...) Expand all Loading... |
911 } else if (arg_match(&arg, &use_ivf, argi)) { | 1051 } else if (arg_match(&arg, &use_ivf, argi)) { |
912 config->write_webm = 0; | 1052 config->write_webm = 0; |
913 } else if (arg_match(&arg, &threads, argi)) { | 1053 } else if (arg_match(&arg, &threads, argi)) { |
914 config->cfg.g_threads = arg_parse_uint(&arg); | 1054 config->cfg.g_threads = arg_parse_uint(&arg); |
915 } else if (arg_match(&arg, &profile, argi)) { | 1055 } else if (arg_match(&arg, &profile, argi)) { |
916 config->cfg.g_profile = arg_parse_uint(&arg); | 1056 config->cfg.g_profile = arg_parse_uint(&arg); |
917 } else if (arg_match(&arg, &width, argi)) { | 1057 } else if (arg_match(&arg, &width, argi)) { |
918 config->cfg.g_w = arg_parse_uint(&arg); | 1058 config->cfg.g_w = arg_parse_uint(&arg); |
919 } else if (arg_match(&arg, &height, argi)) { | 1059 } else if (arg_match(&arg, &height, argi)) { |
920 config->cfg.g_h = arg_parse_uint(&arg); | 1060 config->cfg.g_h = arg_parse_uint(&arg); |
| 1061 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1062 } else if (arg_match(&arg, &bitdeptharg, argi)) { |
| 1063 config->cfg.g_bit_depth = arg_parse_enum_or_int(&arg); |
| 1064 } else if (arg_match(&arg, &inbitdeptharg, argi)) { |
| 1065 config->cfg.g_input_bit_depth = arg_parse_uint(&arg); |
| 1066 #endif |
921 #if CONFIG_WEBM_IO | 1067 #if CONFIG_WEBM_IO |
922 } else if (arg_match(&arg, &stereo_mode, argi)) { | 1068 } else if (arg_match(&arg, &stereo_mode, argi)) { |
923 config->stereo_fmt = arg_parse_enum_or_int(&arg); | 1069 config->stereo_fmt = arg_parse_enum_or_int(&arg); |
924 #endif | 1070 #endif |
925 } else if (arg_match(&arg, &timebase, argi)) { | 1071 } else if (arg_match(&arg, &timebase, argi)) { |
926 config->cfg.g_timebase = arg_parse_rational(&arg); | 1072 config->cfg.g_timebase = arg_parse_rational(&arg); |
927 validate_positive_rational(arg.name, &config->cfg.g_timebase); | 1073 validate_positive_rational(arg.name, &config->cfg.g_timebase); |
928 } else if (arg_match(&arg, &error_resilient, argi)) { | 1074 } else if (arg_match(&arg, &error_resilient, argi)) { |
929 config->cfg.g_error_resilient = arg_parse_uint(&arg); | 1075 config->cfg.g_error_resilient = arg_parse_uint(&arg); |
930 } else if (arg_match(&arg, &lag_in_frames, argi)) { | 1076 } else if (arg_match(&arg, &lag_in_frames, argi)) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 | 1124 |
979 if (global->passes < 2) | 1125 if (global->passes < 2) |
980 warn("option %s ignored in one-pass mode.\n", arg.name); | 1126 warn("option %s ignored in one-pass mode.\n", arg.name); |
981 } else if (arg_match(&arg, &kf_min_dist, argi)) { | 1127 } else if (arg_match(&arg, &kf_min_dist, argi)) { |
982 config->cfg.kf_min_dist = arg_parse_uint(&arg); | 1128 config->cfg.kf_min_dist = arg_parse_uint(&arg); |
983 } else if (arg_match(&arg, &kf_max_dist, argi)) { | 1129 } else if (arg_match(&arg, &kf_max_dist, argi)) { |
984 config->cfg.kf_max_dist = arg_parse_uint(&arg); | 1130 config->cfg.kf_max_dist = arg_parse_uint(&arg); |
985 config->have_kf_max_dist = 1; | 1131 config->have_kf_max_dist = 1; |
986 } else if (arg_match(&arg, &kf_disabled, argi)) { | 1132 } else if (arg_match(&arg, &kf_disabled, argi)) { |
987 config->cfg.kf_mode = VPX_KF_DISABLED; | 1133 config->cfg.kf_mode = VPX_KF_DISABLED; |
| 1134 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1135 } else if (arg_match(&arg, &test16bitinternalarg, argi)) { |
| 1136 if (strcmp(global->codec->name, "vp9") == 0) { |
| 1137 test_16bit_internal = 1; |
| 1138 } |
| 1139 #endif |
988 } else { | 1140 } else { |
989 int i, match = 0; | 1141 int i, match = 0; |
990 for (i = 0; ctrl_args[i]; i++) { | 1142 for (i = 0; ctrl_args[i]; i++) { |
991 if (arg_match(&arg, ctrl_args[i], argi)) { | 1143 if (arg_match(&arg, ctrl_args[i], argi)) { |
992 int j; | 1144 int j; |
993 match = 1; | 1145 match = 1; |
994 | 1146 |
995 /* Point either to the next free element or the first | 1147 /* Point either to the next free element or the first |
996 * instance of this control. | 1148 * instance of this control. |
997 */ | 1149 */ |
998 for (j = 0; j < config->arg_ctrl_cnt; j++) | 1150 for (j = 0; j < config->arg_ctrl_cnt; j++) |
999 if (config->arg_ctrls[j][0] == ctrl_args_map[i]) | 1151 if (ctrl_args_map != NULL && |
| 1152 config->arg_ctrls[j][0] == ctrl_args_map[i]) |
1000 break; | 1153 break; |
1001 | 1154 |
1002 /* Update/insert */ | 1155 /* Update/insert */ |
1003 assert(j < (int)ARG_CTRL_CNT_MAX); | 1156 assert(j < (int)ARG_CTRL_CNT_MAX); |
1004 if (j < (int)ARG_CTRL_CNT_MAX) { | 1157 if (ctrl_args_map != NULL && j < (int)ARG_CTRL_CNT_MAX) { |
1005 config->arg_ctrls[j][0] = ctrl_args_map[i]; | 1158 config->arg_ctrls[j][0] = ctrl_args_map[i]; |
1006 config->arg_ctrls[j][1] = arg_parse_enum_or_int(&arg); | 1159 config->arg_ctrls[j][1] = arg_parse_enum_or_int(&arg); |
1007 if (j == config->arg_ctrl_cnt) | 1160 if (j == config->arg_ctrl_cnt) |
1008 config->arg_ctrl_cnt++; | 1161 config->arg_ctrl_cnt++; |
1009 } | 1162 } |
1010 | 1163 |
1011 } | 1164 } |
1012 } | 1165 } |
1013 if (!match) | 1166 if (!match) |
1014 argj++; | 1167 argj++; |
1015 } | 1168 } |
1016 } | 1169 } |
| 1170 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1171 if (strcmp(global->codec->name, "vp9") == 0) { |
| 1172 config->use_16bit_internal = test_16bit_internal | |
| 1173 (config->cfg.g_profile > 1); |
| 1174 } |
| 1175 #endif |
1017 return eos_mark_found; | 1176 return eos_mark_found; |
1018 } | 1177 } |
1019 | 1178 |
1020 | 1179 |
1021 #define FOREACH_STREAM(func) \ | 1180 #define FOREACH_STREAM(func) \ |
1022 do { \ | 1181 do { \ |
1023 struct stream_state *stream; \ | 1182 struct stream_state *stream; \ |
1024 for (stream = streams; stream; stream = stream->next) { \ | 1183 for (stream = streams; stream; stream = stream->next) { \ |
1025 func; \ | 1184 func; \ |
1026 } \ | 1185 } \ |
1027 } while (0) | 1186 } while (0) |
1028 | 1187 |
1029 | 1188 |
1030 static void validate_stream_config(const struct stream_state *stream, | 1189 static void validate_stream_config(const struct stream_state *stream, |
1031 const struct VpxEncoderConfig *global) { | 1190 const struct VpxEncoderConfig *global) { |
1032 const struct stream_state *streami; | 1191 const struct stream_state *streami; |
1033 | 1192 |
1034 if (!stream->config.cfg.g_w || !stream->config.cfg.g_h) | 1193 if (!stream->config.cfg.g_w || !stream->config.cfg.g_h) |
1035 fatal("Stream %d: Specify stream dimensions with --width (-w) " | 1194 fatal("Stream %d: Specify stream dimensions with --width (-w) " |
1036 " and --height (-h)", stream->index); | 1195 " and --height (-h)", stream->index); |
1037 | 1196 |
1038 if (stream->config.cfg.g_profile != 0 && !global->experimental_bitstream) { | 1197 if (stream->config.cfg.g_profile != 0 && !global->experimental_bitstream) { |
1039 fatal("Stream %d: profile %d is experimental and requires the --%s flag", | 1198 fatal("Stream %d: profile %d is experimental and requires the --%s flag", |
1040 stream->index, stream->config.cfg.g_profile, | 1199 stream->index, stream->config.cfg.g_profile, |
1041 experimental_bitstream.long_name); | 1200 experimental_bitstream.long_name); |
1042 } | 1201 } |
1043 | 1202 |
| 1203 // Check that the codec bit depth is greater than the input bit depth. |
| 1204 if (stream->config.cfg.g_input_bit_depth > |
| 1205 (unsigned int)stream->config.cfg.g_bit_depth) { |
| 1206 fatal("Stream %d: codec bit depth (%d) less than input bit depth (%d)", |
| 1207 stream->index, (int)stream->config.cfg.g_bit_depth, |
| 1208 stream->config.cfg.g_input_bit_depth); |
| 1209 } |
| 1210 |
1044 for (streami = stream; streami; streami = streami->next) { | 1211 for (streami = stream; streami; streami = streami->next) { |
1045 /* All streams require output files */ | 1212 /* All streams require output files */ |
1046 if (!streami->config.out_fn) | 1213 if (!streami->config.out_fn) |
1047 fatal("Stream %d: Output file is required (specify with -o)", | 1214 fatal("Stream %d: Output file is required (specify with -o)", |
1048 streami->index); | 1215 streami->index); |
1049 | 1216 |
1050 /* Check for two streams outputting to the same file */ | 1217 /* Check for two streams outputting to the same file */ |
1051 if (streami != stream) { | 1218 if (streami != stream) { |
1052 const char *a = stream->config.out_fn; | 1219 const char *a = stream->config.out_fn; |
1053 const char *b = streami->config.out_fn; | 1220 const char *b = streami->config.out_fn; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1142 if (stream->next || stream->index) | 1309 if (stream->next || stream->index) |
1143 fprintf(stderr, "\nStream Index: %d\n", stream->index); | 1310 fprintf(stderr, "\nStream Index: %d\n", stream->index); |
1144 fprintf(stderr, "Destination file: %s\n", stream->config.out_fn); | 1311 fprintf(stderr, "Destination file: %s\n", stream->config.out_fn); |
1145 fprintf(stderr, "Encoder parameters:\n"); | 1312 fprintf(stderr, "Encoder parameters:\n"); |
1146 | 1313 |
1147 SHOW(g_usage); | 1314 SHOW(g_usage); |
1148 SHOW(g_threads); | 1315 SHOW(g_threads); |
1149 SHOW(g_profile); | 1316 SHOW(g_profile); |
1150 SHOW(g_w); | 1317 SHOW(g_w); |
1151 SHOW(g_h); | 1318 SHOW(g_h); |
| 1319 SHOW(g_bit_depth); |
| 1320 SHOW(g_input_bit_depth); |
1152 SHOW(g_timebase.num); | 1321 SHOW(g_timebase.num); |
1153 SHOW(g_timebase.den); | 1322 SHOW(g_timebase.den); |
1154 SHOW(g_error_resilient); | 1323 SHOW(g_error_resilient); |
1155 SHOW(g_pass); | 1324 SHOW(g_pass); |
1156 SHOW(g_lag_in_frames); | 1325 SHOW(g_lag_in_frames); |
1157 SHOW(rc_dropframe_thresh); | 1326 SHOW(rc_dropframe_thresh); |
1158 SHOW(rc_resize_allowed); | 1327 SHOW(rc_resize_allowed); |
1159 SHOW(rc_scaled_width); | 1328 SHOW(rc_scaled_width); |
1160 SHOW(rc_scaled_height); | 1329 SHOW(rc_scaled_height); |
1161 SHOW(rc_resize_up_thresh); | 1330 SHOW(rc_resize_up_thresh); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1274 } | 1443 } |
1275 | 1444 |
1276 | 1445 |
1277 static void initialize_encoder(struct stream_state *stream, | 1446 static void initialize_encoder(struct stream_state *stream, |
1278 struct VpxEncoderConfig *global) { | 1447 struct VpxEncoderConfig *global) { |
1279 int i; | 1448 int i; |
1280 int flags = 0; | 1449 int flags = 0; |
1281 | 1450 |
1282 flags |= global->show_psnr ? VPX_CODEC_USE_PSNR : 0; | 1451 flags |= global->show_psnr ? VPX_CODEC_USE_PSNR : 0; |
1283 flags |= global->out_part ? VPX_CODEC_USE_OUTPUT_PARTITION : 0; | 1452 flags |= global->out_part ? VPX_CODEC_USE_OUTPUT_PARTITION : 0; |
| 1453 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1454 flags |= stream->config.use_16bit_internal ? VPX_CODEC_USE_HIGHBITDEPTH : 0; |
| 1455 #endif |
1284 | 1456 |
1285 /* Construct Encoder Context */ | 1457 /* Construct Encoder Context */ |
1286 vpx_codec_enc_init(&stream->encoder, global->codec->codec_interface(), | 1458 vpx_codec_enc_init(&stream->encoder, global->codec->codec_interface(), |
1287 &stream->config.cfg, flags); | 1459 &stream->config.cfg, flags); |
1288 ctx_exit_on_error(&stream->encoder, "Failed to initialize encoder"); | 1460 ctx_exit_on_error(&stream->encoder, "Failed to initialize encoder"); |
1289 | 1461 |
1290 /* Note that we bypass the vpx_codec_control wrapper macro because | 1462 /* Note that we bypass the vpx_codec_control wrapper macro because |
1291 * we're being clever to store the control IDs in an array. Real | 1463 * we're being clever to store the control IDs in an array. Real |
1292 * applications will want to make use of the enumerations directly | 1464 * applications will want to make use of the enumerations directly |
1293 */ | 1465 */ |
(...skipping 25 matching lines...) Expand all Loading... |
1319 struct vpx_usec_timer timer; | 1491 struct vpx_usec_timer timer; |
1320 | 1492 |
1321 frame_start = (cfg->g_timebase.den * (int64_t)(frames_in - 1) | 1493 frame_start = (cfg->g_timebase.den * (int64_t)(frames_in - 1) |
1322 * global->framerate.den) | 1494 * global->framerate.den) |
1323 / cfg->g_timebase.num / global->framerate.num; | 1495 / cfg->g_timebase.num / global->framerate.num; |
1324 next_frame_start = (cfg->g_timebase.den * (int64_t)(frames_in) | 1496 next_frame_start = (cfg->g_timebase.den * (int64_t)(frames_in) |
1325 * global->framerate.den) | 1497 * global->framerate.den) |
1326 / cfg->g_timebase.num / global->framerate.num; | 1498 / cfg->g_timebase.num / global->framerate.num; |
1327 | 1499 |
1328 /* Scale if necessary */ | 1500 /* Scale if necessary */ |
| 1501 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1502 if (img) { |
| 1503 if ((img->fmt & VPX_IMG_FMT_HIGHBITDEPTH) && |
| 1504 (img->d_w != cfg->g_w || img->d_h != cfg->g_h)) { |
| 1505 if (img->fmt != VPX_IMG_FMT_I42016) { |
| 1506 fprintf(stderr, "%s can only scale 4:2:0 inputs\n", exec_name); |
| 1507 exit(EXIT_FAILURE); |
| 1508 } |
| 1509 #if CONFIG_LIBYUV |
| 1510 if (!stream->img) { |
| 1511 stream->img = vpx_img_alloc(NULL, VPX_IMG_FMT_I42016, |
| 1512 cfg->g_w, cfg->g_h, 16); |
| 1513 } |
| 1514 I420Scale_16((uint16*)img->planes[VPX_PLANE_Y], |
| 1515 img->stride[VPX_PLANE_Y]/2, |
| 1516 (uint16*)img->planes[VPX_PLANE_U], |
| 1517 img->stride[VPX_PLANE_U]/2, |
| 1518 (uint16*)img->planes[VPX_PLANE_V], |
| 1519 img->stride[VPX_PLANE_V]/2, |
| 1520 img->d_w, img->d_h, |
| 1521 (uint16*)stream->img->planes[VPX_PLANE_Y], |
| 1522 stream->img->stride[VPX_PLANE_Y]/2, |
| 1523 (uint16*)stream->img->planes[VPX_PLANE_U], |
| 1524 stream->img->stride[VPX_PLANE_U]/2, |
| 1525 (uint16*)stream->img->planes[VPX_PLANE_V], |
| 1526 stream->img->stride[VPX_PLANE_V]/2, |
| 1527 stream->img->d_w, stream->img->d_h, |
| 1528 kFilterBox); |
| 1529 img = stream->img; |
| 1530 #else |
| 1531 stream->encoder.err = 1; |
| 1532 ctx_exit_on_error(&stream->encoder, |
| 1533 "Stream %d: Failed to encode frame.\n" |
| 1534 "Scaling disabled in this configuration. \n" |
| 1535 "To enable, configure with --enable-libyuv\n", |
| 1536 stream->index); |
| 1537 #endif |
| 1538 } |
| 1539 } |
| 1540 #endif |
1329 if (img && (img->d_w != cfg->g_w || img->d_h != cfg->g_h)) { | 1541 if (img && (img->d_w != cfg->g_w || img->d_h != cfg->g_h)) { |
1330 if (img->fmt != VPX_IMG_FMT_I420 && img->fmt != VPX_IMG_FMT_YV12) { | 1542 if (img->fmt != VPX_IMG_FMT_I420 && img->fmt != VPX_IMG_FMT_YV12) { |
1331 fprintf(stderr, "%s can only scale 4:2:0 8bpp inputs\n", exec_name); | 1543 fprintf(stderr, "%s can only scale 4:2:0 8bpp inputs\n", exec_name); |
1332 exit(EXIT_FAILURE); | 1544 exit(EXIT_FAILURE); |
1333 } | 1545 } |
1334 #if CONFIG_LIBYUV | 1546 #if CONFIG_LIBYUV |
1335 if (!stream->img) | 1547 if (!stream->img) |
1336 stream->img = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, | 1548 stream->img = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, |
1337 cfg->g_w, cfg->g_h, 16); | 1549 cfg->g_w, cfg->g_h, 16); |
1338 I420Scale(img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y], | 1550 I420Scale(img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y], |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 fprintf(stderr, " %.3f", stream->psnr_totals[i] / stream->psnr_count); | 1709 fprintf(stderr, " %.3f", stream->psnr_totals[i] / stream->psnr_count); |
1498 } | 1710 } |
1499 fprintf(stderr, "\n"); | 1711 fprintf(stderr, "\n"); |
1500 } | 1712 } |
1501 | 1713 |
1502 | 1714 |
1503 static float usec_to_fps(uint64_t usec, unsigned int frames) { | 1715 static float usec_to_fps(uint64_t usec, unsigned int frames) { |
1504 return (float)(usec > 0 ? frames * 1000000.0 / (float)usec : 0); | 1716 return (float)(usec > 0 ? frames * 1000000.0 / (float)usec : 0); |
1505 } | 1717 } |
1506 | 1718 |
| 1719 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1720 static void high_img_upshift(vpx_image_t *dst, vpx_image_t *src, |
| 1721 int input_shift) { |
| 1722 // Note the offset is 1 less than half |
| 1723 const int offset = input_shift > 0 ? (1 << (input_shift - 1)) - 1 : 0; |
| 1724 int plane; |
| 1725 if (dst->w != src->w || dst->h != src->h || |
| 1726 dst->x_chroma_shift != src->x_chroma_shift || |
| 1727 dst->y_chroma_shift != src->y_chroma_shift || |
| 1728 dst->fmt != src->fmt || input_shift < 0) { |
| 1729 fatal("Unsupported image conversion"); |
| 1730 } |
| 1731 switch (src->fmt) { |
| 1732 case VPX_IMG_FMT_I42016: |
| 1733 case VPX_IMG_FMT_I42216: |
| 1734 case VPX_IMG_FMT_I44416: |
| 1735 break; |
| 1736 default: |
| 1737 fatal("Unsupported image conversion"); |
| 1738 break; |
| 1739 } |
| 1740 for (plane = 0; plane < 3; plane++) { |
| 1741 int w = src->w; |
| 1742 int h = src->h; |
| 1743 int x, y; |
| 1744 if (plane) { |
| 1745 w >>= src->x_chroma_shift; |
| 1746 h >>= src->y_chroma_shift; |
| 1747 } |
| 1748 for (y = 0; y < h; y++) { |
| 1749 uint16_t *p_src = (uint16_t *)(src->planes[plane] + |
| 1750 y * src->stride[plane]); |
| 1751 uint16_t *p_dst = (uint16_t *)(dst->planes[plane] + |
| 1752 y * dst->stride[plane]); |
| 1753 for (x = 0; x < w; x++) |
| 1754 *p_dst++ = (*p_src++ << input_shift) + offset; |
| 1755 } |
| 1756 } |
| 1757 } |
| 1758 |
| 1759 static void low_img_upshift(vpx_image_t *dst, vpx_image_t *src, |
| 1760 int input_shift) { |
| 1761 // Note the offset is 1 less than half |
| 1762 const int offset = input_shift > 0 ? (1 << (input_shift - 1)) - 1 : 0; |
| 1763 int plane; |
| 1764 if (dst->w != src->w || dst->h != src->h || |
| 1765 dst->x_chroma_shift != src->x_chroma_shift || |
| 1766 dst->y_chroma_shift != src->y_chroma_shift || |
| 1767 dst->fmt != src->fmt + VPX_IMG_FMT_HIGHBITDEPTH || |
| 1768 input_shift < 0) { |
| 1769 fatal("Unsupported image conversion"); |
| 1770 } |
| 1771 switch (src->fmt) { |
| 1772 case VPX_IMG_FMT_I420: |
| 1773 case VPX_IMG_FMT_I422: |
| 1774 case VPX_IMG_FMT_I444: |
| 1775 break; |
| 1776 default: |
| 1777 fatal("Unsupported image conversion"); |
| 1778 break; |
| 1779 } |
| 1780 for (plane = 0; plane < 3; plane++) { |
| 1781 int w = src->w; |
| 1782 int h = src->h; |
| 1783 int x, y; |
| 1784 if (plane) { |
| 1785 w >>= src->x_chroma_shift; |
| 1786 h >>= src->y_chroma_shift; |
| 1787 } |
| 1788 for (y = 0; y < h; y++) { |
| 1789 uint8_t *p_src = src->planes[plane] + y * src->stride[plane]; |
| 1790 uint16_t *p_dst = (uint16_t *)(dst->planes[plane] + |
| 1791 y * dst->stride[plane]); |
| 1792 for (x = 0; x < w; x++) { |
| 1793 *p_dst++ = (*p_src++ << input_shift) + offset; |
| 1794 } |
| 1795 } |
| 1796 } |
| 1797 } |
| 1798 |
| 1799 static void img_upshift(vpx_image_t *dst, vpx_image_t *src, |
| 1800 int input_shift) { |
| 1801 if (src->fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
| 1802 high_img_upshift(dst, src, input_shift); |
| 1803 } else { |
| 1804 low_img_upshift(dst, src, input_shift); |
| 1805 } |
| 1806 } |
| 1807 |
| 1808 static void img_cast_16_to_8(vpx_image_t *dst, vpx_image_t *src) { |
| 1809 int plane; |
| 1810 if (dst->fmt + VPX_IMG_FMT_HIGHBITDEPTH != src->fmt || |
| 1811 dst->d_w != src->d_w || dst->d_h != src->d_h || |
| 1812 dst->x_chroma_shift != src->x_chroma_shift || |
| 1813 dst->y_chroma_shift != src->y_chroma_shift) { |
| 1814 fatal("Unsupported image conversion"); |
| 1815 } |
| 1816 switch (dst->fmt) { |
| 1817 case VPX_IMG_FMT_I420: |
| 1818 case VPX_IMG_FMT_I422: |
| 1819 case VPX_IMG_FMT_I444: |
| 1820 break; |
| 1821 default: |
| 1822 fatal("Unsupported image conversion"); |
| 1823 break; |
| 1824 } |
| 1825 for (plane = 0; plane < 3; plane++) { |
| 1826 int w = src->d_w; |
| 1827 int h = src->d_h; |
| 1828 int x, y; |
| 1829 if (plane) { |
| 1830 w >>= src->x_chroma_shift; |
| 1831 h >>= src->y_chroma_shift; |
| 1832 } |
| 1833 for (y = 0; y < h; y++) { |
| 1834 uint16_t *p_src = (uint16_t *)(src->planes[plane] + |
| 1835 y * src->stride[plane]); |
| 1836 uint8_t *p_dst = dst->planes[plane] + y * dst->stride[plane]; |
| 1837 for (x = 0; x < w; x++) { |
| 1838 *p_dst++ = *p_src++; |
| 1839 } |
| 1840 } |
| 1841 } |
| 1842 } |
| 1843 #endif |
1507 | 1844 |
1508 static void test_decode(struct stream_state *stream, | 1845 static void test_decode(struct stream_state *stream, |
1509 enum TestDecodeFatality fatal, | 1846 enum TestDecodeFatality fatal, |
1510 const VpxInterface *codec) { | 1847 const VpxInterface *codec) { |
1511 vpx_image_t enc_img, dec_img; | 1848 vpx_image_t enc_img, dec_img; |
1512 | 1849 |
1513 if (stream->mismatch_seen) | 1850 if (stream->mismatch_seen) |
1514 return; | 1851 return; |
1515 | 1852 |
1516 /* Get the internal reference frame */ | 1853 /* Get the internal reference frame */ |
1517 if (strcmp(codec->name, "vp8") == 0) { | 1854 if (strcmp(codec->name, "vp8") == 0) { |
1518 struct vpx_ref_frame ref_enc, ref_dec; | 1855 struct vpx_ref_frame ref_enc, ref_dec; |
1519 int width, height; | 1856 int width, height; |
1520 | 1857 |
1521 width = (stream->config.cfg.g_w + 15) & ~15; | 1858 width = (stream->config.cfg.g_w + 15) & ~15; |
1522 height = (stream->config.cfg.g_h + 15) & ~15; | 1859 height = (stream->config.cfg.g_h + 15) & ~15; |
1523 vpx_img_alloc(&ref_enc.img, VPX_IMG_FMT_I420, width, height, 1); | 1860 vpx_img_alloc(&ref_enc.img, VPX_IMG_FMT_I420, width, height, 1); |
1524 enc_img = ref_enc.img; | 1861 enc_img = ref_enc.img; |
1525 vpx_img_alloc(&ref_dec.img, VPX_IMG_FMT_I420, width, height, 1); | 1862 vpx_img_alloc(&ref_dec.img, VPX_IMG_FMT_I420, width, height, 1); |
1526 dec_img = ref_dec.img; | 1863 dec_img = ref_dec.img; |
1527 | 1864 |
1528 ref_enc.frame_type = VP8_LAST_FRAME; | 1865 ref_enc.frame_type = VP8_LAST_FRAME; |
1529 ref_dec.frame_type = VP8_LAST_FRAME; | 1866 ref_dec.frame_type = VP8_LAST_FRAME; |
1530 vpx_codec_control(&stream->encoder, VP8_COPY_REFERENCE, &ref_enc); | 1867 vpx_codec_control(&stream->encoder, VP8_COPY_REFERENCE, &ref_enc); |
1531 vpx_codec_control(&stream->decoder, VP8_COPY_REFERENCE, &ref_dec); | 1868 vpx_codec_control(&stream->decoder, VP8_COPY_REFERENCE, &ref_dec); |
1532 } else { | 1869 } else { |
1533 struct vp9_ref_frame ref; | 1870 struct vp9_ref_frame ref_enc, ref_dec; |
1534 | 1871 |
1535 ref.idx = 0; | 1872 ref_enc.idx = 0; |
1536 vpx_codec_control(&stream->encoder, VP9_GET_REFERENCE, &ref); | 1873 ref_dec.idx = 0; |
1537 enc_img = ref.img; | 1874 vpx_codec_control(&stream->encoder, VP9_GET_REFERENCE, &ref_enc); |
1538 vpx_codec_control(&stream->decoder, VP9_GET_REFERENCE, &ref); | 1875 enc_img = ref_enc.img; |
1539 dec_img = ref.img; | 1876 vpx_codec_control(&stream->decoder, VP9_GET_REFERENCE, &ref_dec); |
| 1877 dec_img = ref_dec.img; |
| 1878 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1879 if ((enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) != |
| 1880 (dec_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH)) { |
| 1881 if (enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
| 1882 vpx_img_alloc(&enc_img, enc_img.fmt - VPX_IMG_FMT_HIGHBITDEPTH, |
| 1883 enc_img.d_w, enc_img.d_h, 16); |
| 1884 img_cast_16_to_8(&enc_img, &ref_enc.img); |
| 1885 } |
| 1886 if (dec_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
| 1887 vpx_img_alloc(&dec_img, dec_img.fmt - VPX_IMG_FMT_HIGHBITDEPTH, |
| 1888 dec_img.d_w, dec_img.d_h, 16); |
| 1889 img_cast_16_to_8(&dec_img, &ref_dec.img); |
| 1890 } |
| 1891 } |
| 1892 #endif |
1540 } | 1893 } |
1541 ctx_exit_on_error(&stream->encoder, "Failed to get encoder reference frame"); | 1894 ctx_exit_on_error(&stream->encoder, "Failed to get encoder reference frame"); |
1542 ctx_exit_on_error(&stream->decoder, "Failed to get decoder reference frame"); | 1895 ctx_exit_on_error(&stream->decoder, "Failed to get decoder reference frame"); |
1543 | 1896 |
1544 if (!compare_img(&enc_img, &dec_img)) { | 1897 if (!compare_img(&enc_img, &dec_img)) { |
1545 int y[4], u[4], v[4]; | 1898 int y[4], u[4], v[4]; |
| 1899 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1900 if (enc_img.fmt & VPX_IMG_FMT_HIGHBITDEPTH) { |
| 1901 find_mismatch_high(&enc_img, &dec_img, y, u, v); |
| 1902 } else { |
| 1903 find_mismatch(&enc_img, &dec_img, y, u, v); |
| 1904 } |
| 1905 #else |
1546 find_mismatch(&enc_img, &dec_img, y, u, v); | 1906 find_mismatch(&enc_img, &dec_img, y, u, v); |
| 1907 #endif |
1547 stream->decoder.err = 1; | 1908 stream->decoder.err = 1; |
1548 warn_or_exit_on_error(&stream->decoder, fatal == TEST_DECODE_FATAL, | 1909 warn_or_exit_on_error(&stream->decoder, fatal == TEST_DECODE_FATAL, |
1549 "Stream %d: Encode/decode mismatch on frame %d at" | 1910 "Stream %d: Encode/decode mismatch on frame %d at" |
1550 " Y[%d, %d] {%d/%d}," | 1911 " Y[%d, %d] {%d/%d}," |
1551 " U[%d, %d] {%d/%d}," | 1912 " U[%d, %d] {%d/%d}," |
1552 " V[%d, %d] {%d/%d}", | 1913 " V[%d, %d] {%d/%d}", |
1553 stream->index, stream->frames_out, | 1914 stream->index, stream->frames_out, |
1554 y[0], y[1], y[2], y[3], | 1915 y[0], y[1], y[2], y[3], |
1555 u[0], u[1], u[2], u[3], | 1916 u[0], u[1], u[2], u[3], |
1556 v[0], v[1], v[2], v[3]); | 1917 v[0], v[1], v[2], v[3]); |
(...skipping 21 matching lines...) Expand all Loading... |
1578 label, hours, mins, secs); | 1939 label, hours, mins, secs); |
1579 } else { | 1940 } else { |
1580 fprintf(stderr, "[%3s unknown] ", label); | 1941 fprintf(stderr, "[%3s unknown] ", label); |
1581 } | 1942 } |
1582 } | 1943 } |
1583 | 1944 |
1584 | 1945 |
1585 int main(int argc, const char **argv_) { | 1946 int main(int argc, const char **argv_) { |
1586 int pass; | 1947 int pass; |
1587 vpx_image_t raw; | 1948 vpx_image_t raw; |
| 1949 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 1950 vpx_image_t raw_shift; |
| 1951 int allocated_raw_shift = 0; |
| 1952 int use_16bit_internal = 0; |
| 1953 int input_shift = 0; |
| 1954 #endif |
1588 int frame_avail, got_data; | 1955 int frame_avail, got_data; |
1589 | 1956 |
1590 struct VpxInputContext input; | 1957 struct VpxInputContext input; |
1591 struct VpxEncoderConfig global; | 1958 struct VpxEncoderConfig global; |
1592 struct stream_state *streams = NULL; | 1959 struct stream_state *streams = NULL; |
1593 char **argv, **argi; | 1960 char **argv, **argi; |
1594 uint64_t cx_time = 0; | 1961 uint64_t cx_time = 0; |
1595 int stream_cnt = 0; | 1962 int stream_cnt = 0; |
1596 int res = 0; | 1963 int res = 0; |
1597 | 1964 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 input.width = stream->config.cfg.g_w; | 2046 input.width = stream->config.cfg.g_w; |
1680 input.height = stream->config.cfg.g_h; | 2047 input.height = stream->config.cfg.g_h; |
1681 break; | 2048 break; |
1682 } | 2049 } |
1683 }); | 2050 }); |
1684 | 2051 |
1685 /* Update stream configurations from the input file's parameters */ | 2052 /* Update stream configurations from the input file's parameters */ |
1686 if (!input.width || !input.height) | 2053 if (!input.width || !input.height) |
1687 fatal("Specify stream dimensions with --width (-w) " | 2054 fatal("Specify stream dimensions with --width (-w) " |
1688 " and --height (-h)"); | 2055 " and --height (-h)"); |
| 2056 |
| 2057 /* If input file does not specify bit-depth but input-bit-depth parameter |
| 2058 * exists, assume that to be the input bit-depth. However, if the |
| 2059 * input-bit-depth paramter does not exist, assume the input bit-depth |
| 2060 * to be the same as the codec bit-depth. |
| 2061 */ |
| 2062 if (!input.bit_depth) { |
| 2063 FOREACH_STREAM({ |
| 2064 if (stream->config.cfg.g_input_bit_depth) |
| 2065 input.bit_depth = stream->config.cfg.g_input_bit_depth; |
| 2066 else |
| 2067 input.bit_depth = stream->config.cfg.g_input_bit_depth = |
| 2068 (int)stream->config.cfg.g_bit_depth; |
| 2069 }); |
| 2070 if (input.bit_depth > 8) input.fmt |= VPX_IMG_FMT_HIGHBITDEPTH; |
| 2071 } else { |
| 2072 FOREACH_STREAM({ |
| 2073 stream->config.cfg.g_input_bit_depth = input.bit_depth; |
| 2074 }); |
| 2075 } |
| 2076 |
1689 FOREACH_STREAM(set_stream_dimensions(stream, input.width, input.height)); | 2077 FOREACH_STREAM(set_stream_dimensions(stream, input.width, input.height)); |
1690 FOREACH_STREAM(validate_stream_config(stream, &global)); | 2078 FOREACH_STREAM(validate_stream_config(stream, &global)); |
1691 | 2079 |
1692 /* Ensure that --passes and --pass are consistent. If --pass is set and | 2080 /* Ensure that --passes and --pass are consistent. If --pass is set and |
1693 * --passes=2, ensure --fpf was set. | 2081 * --passes=2, ensure --fpf was set. |
1694 */ | 2082 */ |
1695 if (global.pass && global.passes == 2) | 2083 if (global.pass && global.passes == 2) |
1696 FOREACH_STREAM( { | 2084 FOREACH_STREAM( { |
1697 if (!stream->config.stats_fn) | 2085 if (!stream->config.stats_fn) |
1698 die("Stream %d: Must specify --fpf when --pass=%d" | 2086 die("Stream %d: Must specify --fpf when --pass=%d" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1732 | 2120 |
1733 FOREACH_STREAM(stream->rate_hist = | 2121 FOREACH_STREAM(stream->rate_hist = |
1734 init_rate_histogram(&stream->config.cfg, | 2122 init_rate_histogram(&stream->config.cfg, |
1735 &global.framerate)); | 2123 &global.framerate)); |
1736 } | 2124 } |
1737 | 2125 |
1738 FOREACH_STREAM(setup_pass(stream, &global, pass)); | 2126 FOREACH_STREAM(setup_pass(stream, &global, pass)); |
1739 FOREACH_STREAM(open_output_file(stream, &global)); | 2127 FOREACH_STREAM(open_output_file(stream, &global)); |
1740 FOREACH_STREAM(initialize_encoder(stream, &global)); | 2128 FOREACH_STREAM(initialize_encoder(stream, &global)); |
1741 | 2129 |
| 2130 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 2131 if (strcmp(global.codec->name, "vp9") == 0) { |
| 2132 // Check to see if at least one stream uses 16 bit internal. |
| 2133 // Currently assume that the bit_depths for all streams using |
| 2134 // highbitdepth are the same. |
| 2135 FOREACH_STREAM({ |
| 2136 if (stream->config.use_16bit_internal) { |
| 2137 use_16bit_internal = 1; |
| 2138 } |
| 2139 if (stream->config.cfg.g_profile == 0) { |
| 2140 input_shift = 0; |
| 2141 } else { |
| 2142 input_shift = (int)stream->config.cfg.g_bit_depth - |
| 2143 stream->config.cfg.g_input_bit_depth; |
| 2144 } |
| 2145 }); |
| 2146 } |
| 2147 #endif |
| 2148 |
1742 frame_avail = 1; | 2149 frame_avail = 1; |
1743 got_data = 0; | 2150 got_data = 0; |
1744 | 2151 |
1745 while (frame_avail || got_data) { | 2152 while (frame_avail || got_data) { |
1746 struct vpx_usec_timer timer; | 2153 struct vpx_usec_timer timer; |
1747 | 2154 |
1748 if (!global.limit || frames_in < global.limit) { | 2155 if (!global.limit || frames_in < global.limit) { |
1749 frame_avail = read_frame(&input, &raw); | 2156 frame_avail = read_frame(&input, &raw); |
1750 | 2157 |
1751 if (frame_avail) | 2158 if (frame_avail) |
(...skipping 17 matching lines...) Expand all Loading... |
1769 cx_time > 9999999 ? "ms" : "us", | 2176 cx_time > 9999999 ? "ms" : "us", |
1770 fps >= 1.0 ? fps : fps * 60, | 2177 fps >= 1.0 ? fps : fps * 60, |
1771 fps >= 1.0 ? "fps" : "fpm"); | 2178 fps >= 1.0 ? "fps" : "fpm"); |
1772 print_time("ETA", estimated_time_left); | 2179 print_time("ETA", estimated_time_left); |
1773 } | 2180 } |
1774 | 2181 |
1775 } else | 2182 } else |
1776 frame_avail = 0; | 2183 frame_avail = 0; |
1777 | 2184 |
1778 if (frames_in > global.skip_frames) { | 2185 if (frames_in > global.skip_frames) { |
| 2186 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 2187 vpx_image_t *frame_to_encode; |
| 2188 if (input_shift || (use_16bit_internal && input.bit_depth == 8)) { |
| 2189 assert(use_16bit_internal); |
| 2190 // Input bit depth and stream bit depth do not match, so up |
| 2191 // shift frame to stream bit depth |
| 2192 if (!allocated_raw_shift) { |
| 2193 vpx_img_alloc(&raw_shift, raw.fmt | VPX_IMG_FMT_HIGHBITDEPTH, |
| 2194 input.width, input.height, 32); |
| 2195 allocated_raw_shift = 1; |
| 2196 } |
| 2197 img_upshift(&raw_shift, &raw, input_shift); |
| 2198 frame_to_encode = &raw_shift; |
| 2199 } else { |
| 2200 frame_to_encode = &raw; |
| 2201 } |
| 2202 vpx_usec_timer_start(&timer); |
| 2203 if (use_16bit_internal) { |
| 2204 assert(frame_to_encode->fmt & VPX_IMG_FMT_HIGHBITDEPTH); |
| 2205 FOREACH_STREAM({ |
| 2206 if (stream->config.use_16bit_internal) |
| 2207 encode_frame(stream, &global, |
| 2208 frame_avail ? frame_to_encode : NULL, |
| 2209 frames_in); |
| 2210 else |
| 2211 assert(0); |
| 2212 }); |
| 2213 } else { |
| 2214 assert((frame_to_encode->fmt & VPX_IMG_FMT_HIGHBITDEPTH) == 0); |
| 2215 FOREACH_STREAM(encode_frame(stream, &global, |
| 2216 frame_avail ? frame_to_encode : NULL, |
| 2217 frames_in)); |
| 2218 } |
| 2219 #else |
1779 vpx_usec_timer_start(&timer); | 2220 vpx_usec_timer_start(&timer); |
1780 FOREACH_STREAM(encode_frame(stream, &global, | 2221 FOREACH_STREAM(encode_frame(stream, &global, |
1781 frame_avail ? &raw : NULL, | 2222 frame_avail ? &raw : NULL, |
1782 frames_in)); | 2223 frames_in)); |
| 2224 #endif |
1783 vpx_usec_timer_mark(&timer); | 2225 vpx_usec_timer_mark(&timer); |
1784 cx_time += vpx_usec_timer_elapsed(&timer); | 2226 cx_time += vpx_usec_timer_elapsed(&timer); |
1785 | 2227 |
1786 FOREACH_STREAM(update_quantizer_histogram(stream)); | 2228 FOREACH_STREAM(update_quantizer_histogram(stream)); |
1787 | 2229 |
1788 got_data = 0; | 2230 got_data = 0; |
1789 FOREACH_STREAM(get_cx_data(stream, &global, &got_data)); | 2231 FOREACH_STREAM(get_cx_data(stream, &global, &got_data)); |
1790 | 2232 |
1791 if (!got_data && input.length && !streams->frames_out) { | 2233 if (!got_data && input.length && streams != NULL && |
| 2234 !streams->frames_out) { |
1792 lagged_count = global.limit ? seen_frames : ftello(input.file); | 2235 lagged_count = global.limit ? seen_frames : ftello(input.file); |
1793 } else if (input.length) { | 2236 } else if (input.length) { |
1794 int64_t remaining; | 2237 int64_t remaining; |
1795 int64_t rate; | 2238 int64_t rate; |
1796 | 2239 |
1797 if (global.limit) { | 2240 if (global.limit) { |
1798 const int64_t frame_in_lagged = (seen_frames - lagged_count) * 1000; | 2241 const int64_t frame_in_lagged = (seen_frames - lagged_count) * 1000; |
1799 | 2242 |
1800 rate = cx_time ? frame_in_lagged * (int64_t)1000000 / cx_time : 0; | 2243 rate = cx_time ? frame_in_lagged * (int64_t)1000000 / cx_time : 0; |
1801 remaining = 1000 * (global.limit - global.skip_frames | 2244 remaining = 1000 * (global.limit - global.skip_frames |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1889 if (stream->mismatch_seen) { | 2332 if (stream->mismatch_seen) { |
1890 fprintf(f, "First mismatch occurred in frame %d\n", | 2333 fprintf(f, "First mismatch occurred in frame %d\n", |
1891 stream->mismatch_seen); | 2334 stream->mismatch_seen); |
1892 } else { | 2335 } else { |
1893 fprintf(f, "No mismatch detected in recon buffers\n"); | 2336 fprintf(f, "No mismatch detected in recon buffers\n"); |
1894 } | 2337 } |
1895 fclose(f); | 2338 fclose(f); |
1896 }); | 2339 }); |
1897 #endif | 2340 #endif |
1898 | 2341 |
| 2342 #if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
| 2343 if (allocated_raw_shift) |
| 2344 vpx_img_free(&raw_shift); |
| 2345 #endif |
1899 vpx_img_free(&raw); | 2346 vpx_img_free(&raw); |
1900 free(argv); | 2347 free(argv); |
1901 free(streams); | 2348 free(streams); |
1902 return res ? EXIT_FAILURE : EXIT_SUCCESS; | 2349 return res ? EXIT_FAILURE : EXIT_SUCCESS; |
1903 } | 2350 } |
OLD | NEW |