OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 14 matching lines...) Expand all Loading... |
25 | 25 |
26 #include "./tools_common.h" | 26 #include "./tools_common.h" |
27 #include "./video_writer.h" | 27 #include "./video_writer.h" |
28 | 28 |
29 static const char *exec_name; | 29 static const char *exec_name; |
30 | 30 |
31 void usage_exit() { | 31 void usage_exit() { |
32 exit(EXIT_FAILURE); | 32 exit(EXIT_FAILURE); |
33 } | 33 } |
34 | 34 |
| 35 // Denoiser states, for temporal denoising. |
| 36 enum denoiserState { |
| 37 kDenoiserOff, |
| 38 kDenoiserOnYOnly, |
| 39 kDenoiserOnYUV, |
| 40 kDenoiserOnYUVAggressive // Aggressive mode not implemented currently. |
| 41 }; |
| 42 |
35 static int mode_to_num_layers[12] = {1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 3}; | 43 static int mode_to_num_layers[12] = {1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 3}; |
36 | 44 |
37 // For rate control encoding stats. | 45 // For rate control encoding stats. |
38 struct RateControlMetrics { | 46 struct RateControlMetrics { |
39 // Number of input frames per layer. | 47 // Number of input frames per layer. |
40 int layer_input_frames[VPX_TS_MAX_LAYERS]; | 48 int layer_input_frames[VPX_TS_MAX_LAYERS]; |
41 // Total (cumulative) number of encoded frames per layer. | 49 // Total (cumulative) number of encoded frames per layer. |
42 int layer_tot_enc_frames[VPX_TS_MAX_LAYERS]; | 50 int layer_tot_enc_frames[VPX_TS_MAX_LAYERS]; |
43 // Number of encoded non-key frames per layer. | 51 // Number of encoded non-key frames per layer. |
44 int layer_enc_frames[VPX_TS_MAX_LAYERS]; | 52 int layer_enc_frames[VPX_TS_MAX_LAYERS]; |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 if (argc < 11) { | 467 if (argc < 11) { |
460 die("Usage: %s <infile> <outfile> <codec_type(vp8/vp9)> <width> <height> " | 468 die("Usage: %s <infile> <outfile> <codec_type(vp8/vp9)> <width> <height> " |
461 "<rate_num> <rate_den> <speed> <frame_drop_threshold> <mode> " | 469 "<rate_num> <rate_den> <speed> <frame_drop_threshold> <mode> " |
462 "<Rate_0> ... <Rate_nlayers-1> \n", argv[0]); | 470 "<Rate_0> ... <Rate_nlayers-1> \n", argv[0]); |
463 } | 471 } |
464 | 472 |
465 encoder = get_vpx_encoder_by_name(argv[3]); | 473 encoder = get_vpx_encoder_by_name(argv[3]); |
466 if (!encoder) | 474 if (!encoder) |
467 die("Unsupported codec."); | 475 die("Unsupported codec."); |
468 | 476 |
469 printf("Using %s\n", vpx_codec_iface_name(encoder->interface())); | 477 printf("Using %s\n", vpx_codec_iface_name(encoder->codec_interface())); |
470 | 478 |
471 width = strtol(argv[4], NULL, 0); | 479 width = strtol(argv[4], NULL, 0); |
472 height = strtol(argv[5], NULL, 0); | 480 height = strtol(argv[5], NULL, 0); |
473 if (width < 16 || width % 2 || height < 16 || height % 2) { | 481 if (width < 16 || width % 2 || height < 16 || height % 2) { |
474 die("Invalid resolution: %d x %d", width, height); | 482 die("Invalid resolution: %d x %d", width, height); |
475 } | 483 } |
476 | 484 |
477 layering_mode = strtol(argv[10], NULL, 0); | 485 layering_mode = strtol(argv[10], NULL, 0); |
478 if (layering_mode < 0 || layering_mode > 12) { | 486 if (layering_mode < 0 || layering_mode > 12) { |
479 die("Invalid layering mode (0..12) %s", argv[10]); | 487 die("Invalid layering mode (0..12) %s", argv[10]); |
480 } | 488 } |
481 | 489 |
482 if (argc != 11 + mode_to_num_layers[layering_mode]) { | 490 if (argc != 11 + mode_to_num_layers[layering_mode]) { |
483 die("Invalid number of arguments"); | 491 die("Invalid number of arguments"); |
484 } | 492 } |
485 | 493 |
486 if (!vpx_img_alloc(&raw, VPX_IMG_FMT_I420, width, height, 32)) { | 494 if (!vpx_img_alloc(&raw, VPX_IMG_FMT_I420, width, height, 32)) { |
487 die("Failed to allocate image", width, height); | 495 die("Failed to allocate image", width, height); |
488 } | 496 } |
489 | 497 |
490 // Populate encoder configuration. | 498 // Populate encoder configuration. |
491 res = vpx_codec_enc_config_default(encoder->interface(), &cfg, 0); | 499 res = vpx_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); |
492 if (res) { | 500 if (res) { |
493 printf("Failed to get config: %s\n", vpx_codec_err_to_string(res)); | 501 printf("Failed to get config: %s\n", vpx_codec_err_to_string(res)); |
494 return EXIT_FAILURE; | 502 return EXIT_FAILURE; |
495 } | 503 } |
496 | 504 |
497 // Update the default configuration with our settings. | 505 // Update the default configuration with our settings. |
498 cfg.g_w = width; | 506 cfg.g_w = width; |
499 cfg.g_h = height; | 507 cfg.g_h = height; |
500 | 508 |
501 // Timebase format e.g. 30fps: numerator=1, demoninator = 30. | 509 // Timebase format e.g. 30fps: numerator=1, demoninator = 30. |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 | 567 |
560 snprintf(file_name, sizeof(file_name), "%s_%d.ivf", argv[2], i); | 568 snprintf(file_name, sizeof(file_name), "%s_%d.ivf", argv[2], i); |
561 outfile[i] = vpx_video_writer_open(file_name, kContainerIVF, &info); | 569 outfile[i] = vpx_video_writer_open(file_name, kContainerIVF, &info); |
562 if (!outfile[i]) | 570 if (!outfile[i]) |
563 die("Failed to open %s for writing", file_name); | 571 die("Failed to open %s for writing", file_name); |
564 } | 572 } |
565 // No spatial layers in this encoder. | 573 // No spatial layers in this encoder. |
566 cfg.ss_number_layers = 1; | 574 cfg.ss_number_layers = 1; |
567 | 575 |
568 // Initialize codec. | 576 // Initialize codec. |
569 if (vpx_codec_enc_init(&codec, encoder->interface(), &cfg, 0)) | 577 if (vpx_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) |
570 die_codec(&codec, "Failed to initialize encoder"); | 578 die_codec(&codec, "Failed to initialize encoder"); |
571 | 579 |
572 if (strncmp(encoder->name, "vp8", 3) == 0) { | 580 if (strncmp(encoder->name, "vp8", 3) == 0) { |
573 vpx_codec_control(&codec, VP8E_SET_CPUUSED, -speed); | 581 vpx_codec_control(&codec, VP8E_SET_CPUUSED, -speed); |
574 vpx_codec_control(&codec, VP8E_SET_NOISE_SENSITIVITY, 1); | 582 vpx_codec_control(&codec, VP8E_SET_NOISE_SENSITIVITY, kDenoiserOnYOnly); |
575 } else if (strncmp(encoder->name, "vp9", 3) == 0) { | 583 } else if (strncmp(encoder->name, "vp9", 3) == 0) { |
576 vpx_codec_control(&codec, VP8E_SET_CPUUSED, speed); | 584 vpx_codec_control(&codec, VP8E_SET_CPUUSED, speed); |
577 vpx_codec_control(&codec, VP9E_SET_AQ_MODE, 3); | 585 vpx_codec_control(&codec, VP9E_SET_AQ_MODE, 3); |
578 vpx_codec_control(&codec, VP9E_SET_FRAME_PERIODIC_BOOST, 0); | 586 vpx_codec_control(&codec, VP9E_SET_FRAME_PERIODIC_BOOST, 0); |
579 vpx_codec_control(&codec, VP8E_SET_NOISE_SENSITIVITY, 0); | 587 vpx_codec_control(&codec, VP8E_SET_NOISE_SENSITIVITY, 0); |
580 if (vpx_codec_control(&codec, VP9E_SET_SVC, 1)) { | 588 if (vpx_codec_control(&codec, VP9E_SET_SVC, 1)) { |
581 die_codec(&codec, "Failed to set SVC"); | 589 die_codec(&codec, "Failed to set SVC"); |
582 } | 590 } |
583 } | 591 } |
584 vpx_codec_control(&codec, VP8E_SET_STATIC_THRESHOLD, 1); | 592 vpx_codec_control(&codec, VP8E_SET_STATIC_THRESHOLD, 1); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 if (vpx_codec_destroy(&codec)) | 667 if (vpx_codec_destroy(&codec)) |
660 die_codec(&codec, "Failed to destroy codec"); | 668 die_codec(&codec, "Failed to destroy codec"); |
661 | 669 |
662 // Try to rewrite the output file headers with the actual frame count. | 670 // Try to rewrite the output file headers with the actual frame count. |
663 for (i = 0; i < cfg.ts_number_layers; ++i) | 671 for (i = 0; i < cfg.ts_number_layers; ++i) |
664 vpx_video_writer_close(outfile[i]); | 672 vpx_video_writer_close(outfile[i]); |
665 | 673 |
666 vpx_img_free(&raw); | 674 vpx_img_free(&raw); |
667 return EXIT_SUCCESS; | 675 return EXIT_SUCCESS; |
668 } | 676 } |
OLD | NEW |