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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 cm->fc = cm->frame_contexts[cm->frame_context_idx]; | 137 cm->fc = cm->frame_contexts[cm->frame_context_idx]; |
138 vp9_zero(cpi->interp_filter_selected[0]); | 138 vp9_zero(cpi->interp_filter_selected[0]); |
139 } | 139 } |
140 } | 140 } |
141 | 141 |
142 void vp9_initialize_enc() { | 142 void vp9_initialize_enc() { |
143 static int init_done = 0; | 143 static int init_done = 0; |
144 | 144 |
145 if (!init_done) { | 145 if (!init_done) { |
146 vp9_rtcd(); | 146 vp9_rtcd(); |
147 vp9_init_neighbors(); | |
148 vp9_init_intra_predictors(); | 147 vp9_init_intra_predictors(); |
149 vp9_coef_tree_initialize(); | 148 vp9_coef_tree_initialize(); |
150 vp9_tokenize_initialize(); | 149 vp9_tokenize_initialize(); |
151 vp9_init_me_luts(); | 150 vp9_init_me_luts(); |
152 vp9_rc_init_minq_luts(); | 151 vp9_rc_init_minq_luts(); |
153 vp9_entropy_mv_init(); | 152 vp9_entropy_mv_init(); |
154 vp9_entropy_mode_init(); | 153 vp9_entropy_mode_init(); |
155 vp9_temporal_filter_init(); | 154 vp9_temporal_filter_init(); |
156 init_done = 1; | 155 init_done = 1; |
157 } | 156 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 if (cpi->source_diff_var != NULL) { | 218 if (cpi->source_diff_var != NULL) { |
220 vpx_free(cpi->source_diff_var); | 219 vpx_free(cpi->source_diff_var); |
221 cpi->source_diff_var = NULL; | 220 cpi->source_diff_var = NULL; |
222 } | 221 } |
223 | 222 |
224 for (i = 0; i < MAX_LAG_BUFFERS; ++i) { | 223 for (i = 0; i < MAX_LAG_BUFFERS; ++i) { |
225 vp9_free_frame_buffer(&cpi->svc.scaled_frames[i]); | 224 vp9_free_frame_buffer(&cpi->svc.scaled_frames[i]); |
226 } | 225 } |
227 vpx_memset(&cpi->svc.scaled_frames[0], 0, | 226 vpx_memset(&cpi->svc.scaled_frames[0], 0, |
228 MAX_LAG_BUFFERS * sizeof(cpi->svc.scaled_frames[0])); | 227 MAX_LAG_BUFFERS * sizeof(cpi->svc.scaled_frames[0])); |
| 228 |
| 229 vp9_free_frame_buffer(&cpi->svc.empty_frame.img); |
| 230 vpx_memset(&cpi->svc.empty_frame, 0, sizeof(cpi->svc.empty_frame)); |
229 } | 231 } |
230 | 232 |
231 static void save_coding_context(VP9_COMP *cpi) { | 233 static void save_coding_context(VP9_COMP *cpi) { |
232 CODING_CONTEXT *const cc = &cpi->coding_context; | 234 CODING_CONTEXT *const cc = &cpi->coding_context; |
233 VP9_COMMON *cm = &cpi->common; | 235 VP9_COMMON *cm = &cpi->common; |
234 | 236 |
235 // Stores a snapshot of key state variables which can subsequently be | 237 // Stores a snapshot of key state variables which can subsequently be |
236 // restored with a call to vp9_restore_coding_context. These functions are | 238 // restored with a call to vp9_restore_coding_context. These functions are |
237 // intended for use in a re-code loop in vp9_compress_frame where the | 239 // intended for use in a re-code loop in vp9_compress_frame where the |
238 // quantizer value is adjusted between loop iterations. | 240 // quantizer value is adjusted between loop iterations. |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 vp9_init_layer_context(cpi); | 581 vp9_init_layer_context(cpi); |
580 } | 582 } |
581 | 583 |
582 // change includes all joint functionality | 584 // change includes all joint functionality |
583 vp9_change_config(cpi, oxcf); | 585 vp9_change_config(cpi, oxcf); |
584 | 586 |
585 cpi->static_mb_pct = 0; | 587 cpi->static_mb_pct = 0; |
586 cpi->ref_frame_flags = 0; | 588 cpi->ref_frame_flags = 0; |
587 | 589 |
588 init_buffer_indices(cpi); | 590 init_buffer_indices(cpi); |
589 | |
590 set_tile_limits(cpi); | |
591 } | 591 } |
592 | 592 |
593 static void set_rc_buffer_sizes(RATE_CONTROL *rc, | 593 static void set_rc_buffer_sizes(RATE_CONTROL *rc, |
594 const VP9EncoderConfig *oxcf) { | 594 const VP9EncoderConfig *oxcf) { |
595 const int64_t bandwidth = oxcf->target_bandwidth; | 595 const int64_t bandwidth = oxcf->target_bandwidth; |
596 const int64_t starting = oxcf->starting_buffer_level_ms; | 596 const int64_t starting = oxcf->starting_buffer_level_ms; |
597 const int64_t optimal = oxcf->optimal_buffer_level_ms; | 597 const int64_t optimal = oxcf->optimal_buffer_level_ms; |
598 const int64_t maximum = oxcf->maximum_buffer_size_ms; | 598 const int64_t maximum = oxcf->maximum_buffer_size_ms; |
599 | 599 |
600 rc->starting_buffer_level = starting * bandwidth / 1000; | 600 rc->starting_buffer_level = starting * bandwidth / 1000; |
601 rc->optimal_buffer_level = (optimal == 0) ? bandwidth / 8 | 601 rc->optimal_buffer_level = (optimal == 0) ? bandwidth / 8 |
602 : optimal * bandwidth / 1000; | 602 : optimal * bandwidth / 1000; |
603 rc->maximum_buffer_size = (maximum == 0) ? bandwidth / 8 | 603 rc->maximum_buffer_size = (maximum == 0) ? bandwidth / 8 |
604 : maximum * bandwidth / 1000; | 604 : maximum * bandwidth / 1000; |
605 } | 605 } |
606 | 606 |
| 607 #if CONFIG_VP9_HIGHBITDEPTH |
| 608 #define HIGHBD_BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX3F, SDX8F, SDX4DF) \ |
| 609 cpi->fn_ptr[BT].sdf = SDF; \ |
| 610 cpi->fn_ptr[BT].sdaf = SDAF; \ |
| 611 cpi->fn_ptr[BT].vf = VF; \ |
| 612 cpi->fn_ptr[BT].svf = SVF; \ |
| 613 cpi->fn_ptr[BT].svaf = SVAF; \ |
| 614 cpi->fn_ptr[BT].sdx3f = SDX3F; \ |
| 615 cpi->fn_ptr[BT].sdx8f = SDX8F; \ |
| 616 cpi->fn_ptr[BT].sdx4df = SDX4DF; |
| 617 |
| 618 #define MAKE_BFP_SAD_WRAPPER(fnname) \ |
| 619 static unsigned int fnname##_bits8(const uint8_t *src_ptr, \ |
| 620 int source_stride, \ |
| 621 const uint8_t *ref_ptr, \ |
| 622 int ref_stride) { \ |
| 623 return fnname(src_ptr, source_stride, ref_ptr, ref_stride); \ |
| 624 } \ |
| 625 static unsigned int fnname##_bits10(const uint8_t *src_ptr, \ |
| 626 int source_stride, \ |
| 627 const uint8_t *ref_ptr, \ |
| 628 int ref_stride) { \ |
| 629 return fnname(src_ptr, source_stride, ref_ptr, ref_stride) >> 2; \ |
| 630 } \ |
| 631 static unsigned int fnname##_bits12(const uint8_t *src_ptr, \ |
| 632 int source_stride, \ |
| 633 const uint8_t *ref_ptr, \ |
| 634 int ref_stride) { \ |
| 635 return fnname(src_ptr, source_stride, ref_ptr, ref_stride) >> 4; \ |
| 636 } |
| 637 |
| 638 #define MAKE_BFP_SADAVG_WRAPPER(fnname) static unsigned int \ |
| 639 fnname##_bits8(const uint8_t *src_ptr, \ |
| 640 int source_stride, \ |
| 641 const uint8_t *ref_ptr, \ |
| 642 int ref_stride, \ |
| 643 const uint8_t *second_pred) { \ |
| 644 return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred); \ |
| 645 } \ |
| 646 static unsigned int fnname##_bits10(const uint8_t *src_ptr, \ |
| 647 int source_stride, \ |
| 648 const uint8_t *ref_ptr, \ |
| 649 int ref_stride, \ |
| 650 const uint8_t *second_pred) { \ |
| 651 return fnname(src_ptr, source_stride, ref_ptr, ref_stride, \ |
| 652 second_pred) >> 2; \ |
| 653 } \ |
| 654 static unsigned int fnname##_bits12(const uint8_t *src_ptr, \ |
| 655 int source_stride, \ |
| 656 const uint8_t *ref_ptr, \ |
| 657 int ref_stride, \ |
| 658 const uint8_t *second_pred) { \ |
| 659 return fnname(src_ptr, source_stride, ref_ptr, ref_stride, \ |
| 660 second_pred) >> 4; \ |
| 661 } |
| 662 |
| 663 #define MAKE_BFP_SAD3_WRAPPER(fnname) \ |
| 664 static void fnname##_bits8(const uint8_t *src_ptr, \ |
| 665 int source_stride, \ |
| 666 const uint8_t *ref_ptr, \ |
| 667 int ref_stride, \ |
| 668 unsigned int *sad_array) { \ |
| 669 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 670 } \ |
| 671 static void fnname##_bits10(const uint8_t *src_ptr, \ |
| 672 int source_stride, \ |
| 673 const uint8_t *ref_ptr, \ |
| 674 int ref_stride, \ |
| 675 unsigned int *sad_array) { \ |
| 676 int i; \ |
| 677 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 678 for (i = 0; i < 3; i++) \ |
| 679 sad_array[i] >>= 2; \ |
| 680 } \ |
| 681 static void fnname##_bits12(const uint8_t *src_ptr, \ |
| 682 int source_stride, \ |
| 683 const uint8_t *ref_ptr, \ |
| 684 int ref_stride, \ |
| 685 unsigned int *sad_array) { \ |
| 686 int i; \ |
| 687 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 688 for (i = 0; i < 3; i++) \ |
| 689 sad_array[i] >>= 4; \ |
| 690 } |
| 691 |
| 692 #define MAKE_BFP_SAD8_WRAPPER(fnname) \ |
| 693 static void fnname##_bits8(const uint8_t *src_ptr, \ |
| 694 int source_stride, \ |
| 695 const uint8_t *ref_ptr, \ |
| 696 int ref_stride, \ |
| 697 unsigned int *sad_array) { \ |
| 698 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 699 } \ |
| 700 static void fnname##_bits10(const uint8_t *src_ptr, \ |
| 701 int source_stride, \ |
| 702 const uint8_t *ref_ptr, \ |
| 703 int ref_stride, \ |
| 704 unsigned int *sad_array) { \ |
| 705 int i; \ |
| 706 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 707 for (i = 0; i < 8; i++) \ |
| 708 sad_array[i] >>= 2; \ |
| 709 } \ |
| 710 static void fnname##_bits12(const uint8_t *src_ptr, \ |
| 711 int source_stride, \ |
| 712 const uint8_t *ref_ptr, \ |
| 713 int ref_stride, \ |
| 714 unsigned int *sad_array) { \ |
| 715 int i; \ |
| 716 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 717 for (i = 0; i < 8; i++) \ |
| 718 sad_array[i] >>= 4; \ |
| 719 } |
| 720 #define MAKE_BFP_SAD4D_WRAPPER(fnname) \ |
| 721 static void fnname##_bits8(const uint8_t *src_ptr, \ |
| 722 int source_stride, \ |
| 723 const uint8_t* const ref_ptr[], \ |
| 724 int ref_stride, \ |
| 725 unsigned int *sad_array) { \ |
| 726 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 727 } \ |
| 728 static void fnname##_bits10(const uint8_t *src_ptr, \ |
| 729 int source_stride, \ |
| 730 const uint8_t* const ref_ptr[], \ |
| 731 int ref_stride, \ |
| 732 unsigned int *sad_array) { \ |
| 733 int i; \ |
| 734 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 735 for (i = 0; i < 4; i++) \ |
| 736 sad_array[i] >>= 2; \ |
| 737 } \ |
| 738 static void fnname##_bits12(const uint8_t *src_ptr, \ |
| 739 int source_stride, \ |
| 740 const uint8_t* const ref_ptr[], \ |
| 741 int ref_stride, \ |
| 742 unsigned int *sad_array) { \ |
| 743 int i; \ |
| 744 fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array); \ |
| 745 for (i = 0; i < 4; i++) \ |
| 746 sad_array[i] >>= 4; \ |
| 747 } |
| 748 |
| 749 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad32x16) |
| 750 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad32x16_avg) |
| 751 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad32x16x4d) |
| 752 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad16x32) |
| 753 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad16x32_avg) |
| 754 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad16x32x4d) |
| 755 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad64x32) |
| 756 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad64x32_avg) |
| 757 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad64x32x4d) |
| 758 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad32x64) |
| 759 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad32x64_avg) |
| 760 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad32x64x4d) |
| 761 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad32x32) |
| 762 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad32x32_avg) |
| 763 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad32x32x3) |
| 764 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad32x32x8) |
| 765 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad32x32x4d) |
| 766 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad64x64) |
| 767 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad64x64_avg) |
| 768 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad64x64x3) |
| 769 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad64x64x8) |
| 770 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad64x64x4d) |
| 771 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad16x16) |
| 772 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad16x16_avg) |
| 773 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad16x16x3) |
| 774 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad16x16x8) |
| 775 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad16x16x4d) |
| 776 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad16x8) |
| 777 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad16x8_avg) |
| 778 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad16x8x3) |
| 779 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad16x8x8) |
| 780 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad16x8x4d) |
| 781 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad8x16) |
| 782 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad8x16_avg) |
| 783 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad8x16x3) |
| 784 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad8x16x8) |
| 785 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad8x16x4d) |
| 786 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad8x8) |
| 787 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad8x8_avg) |
| 788 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad8x8x3) |
| 789 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad8x8x8) |
| 790 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad8x8x4d) |
| 791 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad8x4) |
| 792 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad8x4_avg) |
| 793 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad8x4x8) |
| 794 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad8x4x4d) |
| 795 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad4x8) |
| 796 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad4x8_avg) |
| 797 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad4x8x8) |
| 798 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad4x8x4d) |
| 799 MAKE_BFP_SAD_WRAPPER(vp9_highbd_sad4x4) |
| 800 MAKE_BFP_SADAVG_WRAPPER(vp9_highbd_sad4x4_avg) |
| 801 MAKE_BFP_SAD3_WRAPPER(vp9_highbd_sad4x4x3) |
| 802 MAKE_BFP_SAD8_WRAPPER(vp9_highbd_sad4x4x8) |
| 803 MAKE_BFP_SAD4D_WRAPPER(vp9_highbd_sad4x4x4d) |
| 804 |
| 805 static void highbd_set_var_fns(VP9_COMP *const cpi) { |
| 806 VP9_COMMON *const cm = &cpi->common; |
| 807 if (cm->use_highbitdepth) { |
| 808 switch (cm->bit_depth) { |
| 809 case VPX_BITS_8: |
| 810 HIGHBD_BFP(BLOCK_32X16, |
| 811 vp9_highbd_sad32x16_bits8, |
| 812 vp9_highbd_sad32x16_avg_bits8, |
| 813 vp9_highbd_variance32x16, |
| 814 vp9_highbd_sub_pixel_variance32x16, |
| 815 vp9_highbd_sub_pixel_avg_variance32x16, |
| 816 NULL, |
| 817 NULL, |
| 818 vp9_highbd_sad32x16x4d_bits8) |
| 819 |
| 820 HIGHBD_BFP(BLOCK_16X32, |
| 821 vp9_highbd_sad16x32_bits8, |
| 822 vp9_highbd_sad16x32_avg_bits8, |
| 823 vp9_highbd_variance16x32, |
| 824 vp9_highbd_sub_pixel_variance16x32, |
| 825 vp9_highbd_sub_pixel_avg_variance16x32, |
| 826 NULL, |
| 827 NULL, |
| 828 vp9_highbd_sad16x32x4d_bits8) |
| 829 |
| 830 HIGHBD_BFP(BLOCK_64X32, |
| 831 vp9_highbd_sad64x32_bits8, |
| 832 vp9_highbd_sad64x32_avg_bits8, |
| 833 vp9_highbd_variance64x32, |
| 834 vp9_highbd_sub_pixel_variance64x32, |
| 835 vp9_highbd_sub_pixel_avg_variance64x32, |
| 836 NULL, |
| 837 NULL, |
| 838 vp9_highbd_sad64x32x4d_bits8) |
| 839 |
| 840 HIGHBD_BFP(BLOCK_32X64, |
| 841 vp9_highbd_sad32x64_bits8, |
| 842 vp9_highbd_sad32x64_avg_bits8, |
| 843 vp9_highbd_variance32x64, |
| 844 vp9_highbd_sub_pixel_variance32x64, |
| 845 vp9_highbd_sub_pixel_avg_variance32x64, |
| 846 NULL, |
| 847 NULL, |
| 848 vp9_highbd_sad32x64x4d_bits8) |
| 849 |
| 850 HIGHBD_BFP(BLOCK_32X32, |
| 851 vp9_highbd_sad32x32_bits8, |
| 852 vp9_highbd_sad32x32_avg_bits8, |
| 853 vp9_highbd_variance32x32, |
| 854 vp9_highbd_sub_pixel_variance32x32, |
| 855 vp9_highbd_sub_pixel_avg_variance32x32, |
| 856 vp9_highbd_sad32x32x3_bits8, |
| 857 vp9_highbd_sad32x32x8_bits8, |
| 858 vp9_highbd_sad32x32x4d_bits8) |
| 859 |
| 860 HIGHBD_BFP(BLOCK_64X64, |
| 861 vp9_highbd_sad64x64_bits8, |
| 862 vp9_highbd_sad64x64_avg_bits8, |
| 863 vp9_highbd_variance64x64, |
| 864 vp9_highbd_sub_pixel_variance64x64, |
| 865 vp9_highbd_sub_pixel_avg_variance64x64, |
| 866 vp9_highbd_sad64x64x3_bits8, |
| 867 vp9_highbd_sad64x64x8_bits8, |
| 868 vp9_highbd_sad64x64x4d_bits8) |
| 869 |
| 870 HIGHBD_BFP(BLOCK_16X16, |
| 871 vp9_highbd_sad16x16_bits8, |
| 872 vp9_highbd_sad16x16_avg_bits8, |
| 873 vp9_highbd_variance16x16, |
| 874 vp9_highbd_sub_pixel_variance16x16, |
| 875 vp9_highbd_sub_pixel_avg_variance16x16, |
| 876 vp9_highbd_sad16x16x3_bits8, |
| 877 vp9_highbd_sad16x16x8_bits8, |
| 878 vp9_highbd_sad16x16x4d_bits8) |
| 879 |
| 880 HIGHBD_BFP(BLOCK_16X8, |
| 881 vp9_highbd_sad16x8_bits8, |
| 882 vp9_highbd_sad16x8_avg_bits8, |
| 883 vp9_highbd_variance16x8, |
| 884 vp9_highbd_sub_pixel_variance16x8, |
| 885 vp9_highbd_sub_pixel_avg_variance16x8, |
| 886 vp9_highbd_sad16x8x3_bits8, |
| 887 vp9_highbd_sad16x8x8_bits8, |
| 888 vp9_highbd_sad16x8x4d_bits8) |
| 889 |
| 890 HIGHBD_BFP(BLOCK_8X16, |
| 891 vp9_highbd_sad8x16_bits8, |
| 892 vp9_highbd_sad8x16_avg_bits8, |
| 893 vp9_highbd_variance8x16, |
| 894 vp9_highbd_sub_pixel_variance8x16, |
| 895 vp9_highbd_sub_pixel_avg_variance8x16, |
| 896 vp9_highbd_sad8x16x3_bits8, |
| 897 vp9_highbd_sad8x16x8_bits8, |
| 898 vp9_highbd_sad8x16x4d_bits8) |
| 899 |
| 900 HIGHBD_BFP(BLOCK_8X8, |
| 901 vp9_highbd_sad8x8_bits8, |
| 902 vp9_highbd_sad8x8_avg_bits8, |
| 903 vp9_highbd_variance8x8, |
| 904 vp9_highbd_sub_pixel_variance8x8, |
| 905 vp9_highbd_sub_pixel_avg_variance8x8, |
| 906 vp9_highbd_sad8x8x3_bits8, |
| 907 vp9_highbd_sad8x8x8_bits8, |
| 908 vp9_highbd_sad8x8x4d_bits8) |
| 909 |
| 910 HIGHBD_BFP(BLOCK_8X4, |
| 911 vp9_highbd_sad8x4_bits8, |
| 912 vp9_highbd_sad8x4_avg_bits8, |
| 913 vp9_highbd_variance8x4, |
| 914 vp9_highbd_sub_pixel_variance8x4, |
| 915 vp9_highbd_sub_pixel_avg_variance8x4, |
| 916 NULL, |
| 917 vp9_highbd_sad8x4x8_bits8, |
| 918 vp9_highbd_sad8x4x4d_bits8) |
| 919 |
| 920 HIGHBD_BFP(BLOCK_4X8, |
| 921 vp9_highbd_sad4x8_bits8, |
| 922 vp9_highbd_sad4x8_avg_bits8, |
| 923 vp9_highbd_variance4x8, |
| 924 vp9_highbd_sub_pixel_variance4x8, |
| 925 vp9_highbd_sub_pixel_avg_variance4x8, |
| 926 NULL, |
| 927 vp9_highbd_sad4x8x8_bits8, |
| 928 vp9_highbd_sad4x8x4d_bits8) |
| 929 |
| 930 HIGHBD_BFP(BLOCK_4X4, |
| 931 vp9_highbd_sad4x4_bits8, |
| 932 vp9_highbd_sad4x4_avg_bits8, |
| 933 vp9_highbd_variance4x4, |
| 934 vp9_highbd_sub_pixel_variance4x4, |
| 935 vp9_highbd_sub_pixel_avg_variance4x4, |
| 936 vp9_highbd_sad4x4x3_bits8, |
| 937 vp9_highbd_sad4x4x8_bits8, |
| 938 vp9_highbd_sad4x4x4d_bits8) |
| 939 break; |
| 940 |
| 941 case VPX_BITS_10: |
| 942 HIGHBD_BFP(BLOCK_32X16, |
| 943 vp9_highbd_sad32x16_bits10, |
| 944 vp9_highbd_sad32x16_avg_bits10, |
| 945 vp9_highbd_10_variance32x16, |
| 946 vp9_highbd_10_sub_pixel_variance32x16, |
| 947 vp9_highbd_10_sub_pixel_avg_variance32x16, |
| 948 NULL, |
| 949 NULL, |
| 950 vp9_highbd_sad32x16x4d_bits10) |
| 951 |
| 952 HIGHBD_BFP(BLOCK_16X32, |
| 953 vp9_highbd_sad16x32_bits10, |
| 954 vp9_highbd_sad16x32_avg_bits10, |
| 955 vp9_highbd_10_variance16x32, |
| 956 vp9_highbd_10_sub_pixel_variance16x32, |
| 957 vp9_highbd_10_sub_pixel_avg_variance16x32, |
| 958 NULL, |
| 959 NULL, |
| 960 vp9_highbd_sad16x32x4d_bits10) |
| 961 |
| 962 HIGHBD_BFP(BLOCK_64X32, |
| 963 vp9_highbd_sad64x32_bits10, |
| 964 vp9_highbd_sad64x32_avg_bits10, |
| 965 vp9_highbd_10_variance64x32, |
| 966 vp9_highbd_10_sub_pixel_variance64x32, |
| 967 vp9_highbd_10_sub_pixel_avg_variance64x32, |
| 968 NULL, |
| 969 NULL, |
| 970 vp9_highbd_sad64x32x4d_bits10) |
| 971 |
| 972 HIGHBD_BFP(BLOCK_32X64, |
| 973 vp9_highbd_sad32x64_bits10, |
| 974 vp9_highbd_sad32x64_avg_bits10, |
| 975 vp9_highbd_10_variance32x64, |
| 976 vp9_highbd_10_sub_pixel_variance32x64, |
| 977 vp9_highbd_10_sub_pixel_avg_variance32x64, |
| 978 NULL, |
| 979 NULL, |
| 980 vp9_highbd_sad32x64x4d_bits10) |
| 981 |
| 982 HIGHBD_BFP(BLOCK_32X32, |
| 983 vp9_highbd_sad32x32_bits10, |
| 984 vp9_highbd_sad32x32_avg_bits10, |
| 985 vp9_highbd_10_variance32x32, |
| 986 vp9_highbd_10_sub_pixel_variance32x32, |
| 987 vp9_highbd_10_sub_pixel_avg_variance32x32, |
| 988 vp9_highbd_sad32x32x3_bits10, |
| 989 vp9_highbd_sad32x32x8_bits10, |
| 990 vp9_highbd_sad32x32x4d_bits10) |
| 991 |
| 992 HIGHBD_BFP(BLOCK_64X64, |
| 993 vp9_highbd_sad64x64_bits10, |
| 994 vp9_highbd_sad64x64_avg_bits10, |
| 995 vp9_highbd_10_variance64x64, |
| 996 vp9_highbd_10_sub_pixel_variance64x64, |
| 997 vp9_highbd_10_sub_pixel_avg_variance64x64, |
| 998 vp9_highbd_sad64x64x3_bits10, |
| 999 vp9_highbd_sad64x64x8_bits10, |
| 1000 vp9_highbd_sad64x64x4d_bits10) |
| 1001 |
| 1002 HIGHBD_BFP(BLOCK_16X16, |
| 1003 vp9_highbd_sad16x16_bits10, |
| 1004 vp9_highbd_sad16x16_avg_bits10, |
| 1005 vp9_highbd_10_variance16x16, |
| 1006 vp9_highbd_10_sub_pixel_variance16x16, |
| 1007 vp9_highbd_10_sub_pixel_avg_variance16x16, |
| 1008 vp9_highbd_sad16x16x3_bits10, |
| 1009 vp9_highbd_sad16x16x8_bits10, |
| 1010 vp9_highbd_sad16x16x4d_bits10) |
| 1011 |
| 1012 HIGHBD_BFP(BLOCK_16X8, |
| 1013 vp9_highbd_sad16x8_bits10, |
| 1014 vp9_highbd_sad16x8_avg_bits10, |
| 1015 vp9_highbd_10_variance16x8, |
| 1016 vp9_highbd_10_sub_pixel_variance16x8, |
| 1017 vp9_highbd_10_sub_pixel_avg_variance16x8, |
| 1018 vp9_highbd_sad16x8x3_bits10, |
| 1019 vp9_highbd_sad16x8x8_bits10, |
| 1020 vp9_highbd_sad16x8x4d_bits10) |
| 1021 |
| 1022 HIGHBD_BFP(BLOCK_8X16, |
| 1023 vp9_highbd_sad8x16_bits10, |
| 1024 vp9_highbd_sad8x16_avg_bits10, |
| 1025 vp9_highbd_10_variance8x16, |
| 1026 vp9_highbd_10_sub_pixel_variance8x16, |
| 1027 vp9_highbd_10_sub_pixel_avg_variance8x16, |
| 1028 vp9_highbd_sad8x16x3_bits10, |
| 1029 vp9_highbd_sad8x16x8_bits10, |
| 1030 vp9_highbd_sad8x16x4d_bits10) |
| 1031 |
| 1032 HIGHBD_BFP(BLOCK_8X8, |
| 1033 vp9_highbd_sad8x8_bits10, |
| 1034 vp9_highbd_sad8x8_avg_bits10, |
| 1035 vp9_highbd_10_variance8x8, |
| 1036 vp9_highbd_10_sub_pixel_variance8x8, |
| 1037 vp9_highbd_10_sub_pixel_avg_variance8x8, |
| 1038 vp9_highbd_sad8x8x3_bits10, |
| 1039 vp9_highbd_sad8x8x8_bits10, |
| 1040 vp9_highbd_sad8x8x4d_bits10) |
| 1041 |
| 1042 HIGHBD_BFP(BLOCK_8X4, |
| 1043 vp9_highbd_sad8x4_bits10, |
| 1044 vp9_highbd_sad8x4_avg_bits10, |
| 1045 vp9_highbd_10_variance8x4, |
| 1046 vp9_highbd_10_sub_pixel_variance8x4, |
| 1047 vp9_highbd_10_sub_pixel_avg_variance8x4, |
| 1048 NULL, |
| 1049 vp9_highbd_sad8x4x8_bits10, |
| 1050 vp9_highbd_sad8x4x4d_bits10) |
| 1051 |
| 1052 HIGHBD_BFP(BLOCK_4X8, |
| 1053 vp9_highbd_sad4x8_bits10, |
| 1054 vp9_highbd_sad4x8_avg_bits10, |
| 1055 vp9_highbd_10_variance4x8, |
| 1056 vp9_highbd_10_sub_pixel_variance4x8, |
| 1057 vp9_highbd_10_sub_pixel_avg_variance4x8, |
| 1058 NULL, |
| 1059 vp9_highbd_sad4x8x8_bits10, |
| 1060 vp9_highbd_sad4x8x4d_bits10) |
| 1061 |
| 1062 HIGHBD_BFP(BLOCK_4X4, |
| 1063 vp9_highbd_sad4x4_bits10, |
| 1064 vp9_highbd_sad4x4_avg_bits10, |
| 1065 vp9_highbd_10_variance4x4, |
| 1066 vp9_highbd_10_sub_pixel_variance4x4, |
| 1067 vp9_highbd_10_sub_pixel_avg_variance4x4, |
| 1068 vp9_highbd_sad4x4x3_bits10, |
| 1069 vp9_highbd_sad4x4x8_bits10, |
| 1070 vp9_highbd_sad4x4x4d_bits10) |
| 1071 break; |
| 1072 |
| 1073 case VPX_BITS_12: |
| 1074 HIGHBD_BFP(BLOCK_32X16, |
| 1075 vp9_highbd_sad32x16_bits12, |
| 1076 vp9_highbd_sad32x16_avg_bits12, |
| 1077 vp9_highbd_12_variance32x16, |
| 1078 vp9_highbd_12_sub_pixel_variance32x16, |
| 1079 vp9_highbd_12_sub_pixel_avg_variance32x16, |
| 1080 NULL, |
| 1081 NULL, |
| 1082 vp9_highbd_sad32x16x4d_bits12) |
| 1083 |
| 1084 HIGHBD_BFP(BLOCK_16X32, |
| 1085 vp9_highbd_sad16x32_bits12, |
| 1086 vp9_highbd_sad16x32_avg_bits12, |
| 1087 vp9_highbd_12_variance16x32, |
| 1088 vp9_highbd_12_sub_pixel_variance16x32, |
| 1089 vp9_highbd_12_sub_pixel_avg_variance16x32, |
| 1090 NULL, |
| 1091 NULL, |
| 1092 vp9_highbd_sad16x32x4d_bits12) |
| 1093 |
| 1094 HIGHBD_BFP(BLOCK_64X32, |
| 1095 vp9_highbd_sad64x32_bits12, |
| 1096 vp9_highbd_sad64x32_avg_bits12, |
| 1097 vp9_highbd_12_variance64x32, |
| 1098 vp9_highbd_12_sub_pixel_variance64x32, |
| 1099 vp9_highbd_12_sub_pixel_avg_variance64x32, |
| 1100 NULL, |
| 1101 NULL, |
| 1102 vp9_highbd_sad64x32x4d_bits12) |
| 1103 |
| 1104 HIGHBD_BFP(BLOCK_32X64, |
| 1105 vp9_highbd_sad32x64_bits12, |
| 1106 vp9_highbd_sad32x64_avg_bits12, |
| 1107 vp9_highbd_12_variance32x64, |
| 1108 vp9_highbd_12_sub_pixel_variance32x64, |
| 1109 vp9_highbd_12_sub_pixel_avg_variance32x64, |
| 1110 NULL, |
| 1111 NULL, |
| 1112 vp9_highbd_sad32x64x4d_bits12) |
| 1113 |
| 1114 HIGHBD_BFP(BLOCK_32X32, |
| 1115 vp9_highbd_sad32x32_bits12, |
| 1116 vp9_highbd_sad32x32_avg_bits12, |
| 1117 vp9_highbd_12_variance32x32, |
| 1118 vp9_highbd_12_sub_pixel_variance32x32, |
| 1119 vp9_highbd_12_sub_pixel_avg_variance32x32, |
| 1120 vp9_highbd_sad32x32x3_bits12, |
| 1121 vp9_highbd_sad32x32x8_bits12, |
| 1122 vp9_highbd_sad32x32x4d_bits12) |
| 1123 |
| 1124 HIGHBD_BFP(BLOCK_64X64, |
| 1125 vp9_highbd_sad64x64_bits12, |
| 1126 vp9_highbd_sad64x64_avg_bits12, |
| 1127 vp9_highbd_12_variance64x64, |
| 1128 vp9_highbd_12_sub_pixel_variance64x64, |
| 1129 vp9_highbd_12_sub_pixel_avg_variance64x64, |
| 1130 vp9_highbd_sad64x64x3_bits12, |
| 1131 vp9_highbd_sad64x64x8_bits12, |
| 1132 vp9_highbd_sad64x64x4d_bits12) |
| 1133 |
| 1134 HIGHBD_BFP(BLOCK_16X16, |
| 1135 vp9_highbd_sad16x16_bits12, |
| 1136 vp9_highbd_sad16x16_avg_bits12, |
| 1137 vp9_highbd_12_variance16x16, |
| 1138 vp9_highbd_12_sub_pixel_variance16x16, |
| 1139 vp9_highbd_12_sub_pixel_avg_variance16x16, |
| 1140 vp9_highbd_sad16x16x3_bits12, |
| 1141 vp9_highbd_sad16x16x8_bits12, |
| 1142 vp9_highbd_sad16x16x4d_bits12) |
| 1143 |
| 1144 HIGHBD_BFP(BLOCK_16X8, |
| 1145 vp9_highbd_sad16x8_bits12, |
| 1146 vp9_highbd_sad16x8_avg_bits12, |
| 1147 vp9_highbd_12_variance16x8, |
| 1148 vp9_highbd_12_sub_pixel_variance16x8, |
| 1149 vp9_highbd_12_sub_pixel_avg_variance16x8, |
| 1150 vp9_highbd_sad16x8x3_bits12, |
| 1151 vp9_highbd_sad16x8x8_bits12, |
| 1152 vp9_highbd_sad16x8x4d_bits12) |
| 1153 |
| 1154 HIGHBD_BFP(BLOCK_8X16, |
| 1155 vp9_highbd_sad8x16_bits12, |
| 1156 vp9_highbd_sad8x16_avg_bits12, |
| 1157 vp9_highbd_12_variance8x16, |
| 1158 vp9_highbd_12_sub_pixel_variance8x16, |
| 1159 vp9_highbd_12_sub_pixel_avg_variance8x16, |
| 1160 vp9_highbd_sad8x16x3_bits12, |
| 1161 vp9_highbd_sad8x16x8_bits12, |
| 1162 vp9_highbd_sad8x16x4d_bits12) |
| 1163 |
| 1164 HIGHBD_BFP(BLOCK_8X8, |
| 1165 vp9_highbd_sad8x8_bits12, |
| 1166 vp9_highbd_sad8x8_avg_bits12, |
| 1167 vp9_highbd_12_variance8x8, |
| 1168 vp9_highbd_12_sub_pixel_variance8x8, |
| 1169 vp9_highbd_12_sub_pixel_avg_variance8x8, |
| 1170 vp9_highbd_sad8x8x3_bits12, |
| 1171 vp9_highbd_sad8x8x8_bits12, |
| 1172 vp9_highbd_sad8x8x4d_bits12) |
| 1173 |
| 1174 HIGHBD_BFP(BLOCK_8X4, |
| 1175 vp9_highbd_sad8x4_bits12, |
| 1176 vp9_highbd_sad8x4_avg_bits12, |
| 1177 vp9_highbd_12_variance8x4, |
| 1178 vp9_highbd_12_sub_pixel_variance8x4, |
| 1179 vp9_highbd_12_sub_pixel_avg_variance8x4, |
| 1180 NULL, |
| 1181 vp9_highbd_sad8x4x8_bits12, |
| 1182 vp9_highbd_sad8x4x4d_bits12) |
| 1183 |
| 1184 HIGHBD_BFP(BLOCK_4X8, |
| 1185 vp9_highbd_sad4x8_bits12, |
| 1186 vp9_highbd_sad4x8_avg_bits12, |
| 1187 vp9_highbd_12_variance4x8, |
| 1188 vp9_highbd_12_sub_pixel_variance4x8, |
| 1189 vp9_highbd_12_sub_pixel_avg_variance4x8, |
| 1190 NULL, |
| 1191 vp9_highbd_sad4x8x8_bits12, |
| 1192 vp9_highbd_sad4x8x4d_bits12) |
| 1193 |
| 1194 HIGHBD_BFP(BLOCK_4X4, |
| 1195 vp9_highbd_sad4x4_bits12, |
| 1196 vp9_highbd_sad4x4_avg_bits12, |
| 1197 vp9_highbd_12_variance4x4, |
| 1198 vp9_highbd_12_sub_pixel_variance4x4, |
| 1199 vp9_highbd_12_sub_pixel_avg_variance4x4, |
| 1200 vp9_highbd_sad4x4x3_bits12, |
| 1201 vp9_highbd_sad4x4x8_bits12, |
| 1202 vp9_highbd_sad4x4x4d_bits12) |
| 1203 break; |
| 1204 |
| 1205 default: |
| 1206 assert(0 && "cm->bit_depth should be VPX_BITS_8, " |
| 1207 "VPX_BITS_10 or VPX_BITS_12"); |
| 1208 } |
| 1209 } |
| 1210 } |
| 1211 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 1212 |
607 void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { | 1213 void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { |
608 VP9_COMMON *const cm = &cpi->common; | 1214 VP9_COMMON *const cm = &cpi->common; |
609 RATE_CONTROL *const rc = &cpi->rc; | 1215 RATE_CONTROL *const rc = &cpi->rc; |
610 | 1216 |
611 if (cm->profile != oxcf->profile) | 1217 if (cm->profile != oxcf->profile) |
612 cm->profile = oxcf->profile; | 1218 cm->profile = oxcf->profile; |
613 cm->bit_depth = oxcf->bit_depth; | 1219 cm->bit_depth = oxcf->bit_depth; |
614 | 1220 |
615 if (cm->profile <= PROFILE_1) | 1221 if (cm->profile <= PROFILE_1) |
616 assert(cm->bit_depth == VPX_BITS_8); | 1222 assert(cm->bit_depth == VPX_BITS_8); |
617 else | 1223 else |
618 assert(cm->bit_depth > VPX_BITS_8); | 1224 assert(cm->bit_depth > VPX_BITS_8); |
619 | 1225 |
620 cpi->oxcf = *oxcf; | 1226 cpi->oxcf = *oxcf; |
621 #if CONFIG_VP9_HIGHBITDEPTH | 1227 #if CONFIG_VP9_HIGHBITDEPTH |
622 if (cpi->oxcf.use_highbitdepth) { | 1228 cpi->mb.e_mbd.bd = (int)cm->bit_depth; |
623 cpi->mb.e_mbd.bd = (int)cm->bit_depth; | 1229 #endif // CONFIG_VP9_HIGHBITDEPTH |
624 } | |
625 #endif | |
626 | 1230 |
627 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; | 1231 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; |
628 | 1232 |
629 cpi->refresh_golden_frame = 0; | 1233 cpi->refresh_golden_frame = 0; |
630 cpi->refresh_last_frame = 1; | 1234 cpi->refresh_last_frame = 1; |
631 cm->refresh_frame_context = 1; | 1235 cm->refresh_frame_context = 1; |
632 cm->reset_frame_context = 0; | 1236 cm->reset_frame_context = 0; |
633 | 1237 |
634 vp9_reset_segment_features(&cm->seg); | 1238 vp9_reset_segment_features(&cm->seg); |
635 vp9_set_high_precision_mv(cpi, 0); | 1239 vp9_set_high_precision_mv(cpi, 0); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 // Experimental RD Code | 1290 // Experimental RD Code |
687 cpi->frame_distortion = 0; | 1291 cpi->frame_distortion = 0; |
688 cpi->last_frame_distortion = 0; | 1292 cpi->last_frame_distortion = 0; |
689 #endif | 1293 #endif |
690 | 1294 |
691 set_tile_limits(cpi); | 1295 set_tile_limits(cpi); |
692 | 1296 |
693 cpi->ext_refresh_frame_flags_pending = 0; | 1297 cpi->ext_refresh_frame_flags_pending = 0; |
694 cpi->ext_refresh_frame_context_pending = 0; | 1298 cpi->ext_refresh_frame_context_pending = 0; |
695 | 1299 |
| 1300 #if CONFIG_VP9_HIGHBITDEPTH |
| 1301 highbd_set_var_fns(cpi); |
| 1302 #endif |
| 1303 |
696 #if CONFIG_VP9_TEMPORAL_DENOISING | 1304 #if CONFIG_VP9_TEMPORAL_DENOISING |
697 if (cpi->oxcf.noise_sensitivity > 0) { | 1305 if (cpi->oxcf.noise_sensitivity > 0) { |
698 vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, | 1306 vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, |
699 cm->subsampling_x, cm->subsampling_y, | 1307 cm->subsampling_x, cm->subsampling_y, |
700 #if CONFIG_VP9_HIGHBITDEPTH | 1308 #if CONFIG_VP9_HIGHBITDEPTH |
701 cm->use_highbitdepth, | 1309 cm->use_highbitdepth, |
702 #endif | 1310 #endif |
703 VP9_ENC_BORDER_IN_PIXELS); | 1311 VP9_ENC_BORDER_IN_PIXELS); |
704 } | 1312 } |
705 #endif | 1313 #endif |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 } | 1373 } |
766 | 1374 |
767 cm->error.setjmp = 1; | 1375 cm->error.setjmp = 1; |
768 | 1376 |
769 cpi->use_svc = 0; | 1377 cpi->use_svc = 0; |
770 | 1378 |
771 init_config(cpi, oxcf); | 1379 init_config(cpi, oxcf); |
772 vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc); | 1380 vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc); |
773 | 1381 |
774 cm->current_video_frame = 0; | 1382 cm->current_video_frame = 0; |
775 cpi->skippable_frame = 0; | 1383 cpi->partition_search_skippable_frame = 0; |
776 | 1384 |
777 // Create the encoder segmentation map and set all entries to 0 | 1385 // Create the encoder segmentation map and set all entries to 0 |
778 CHECK_MEM_ERROR(cm, cpi->segmentation_map, | 1386 CHECK_MEM_ERROR(cm, cpi->segmentation_map, |
779 vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); | 1387 vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); |
780 | 1388 |
781 // Create a complexity map used for rd adjustment | 1389 // Create a complexity map used for rd adjustment |
782 CHECK_MEM_ERROR(cm, cpi->complexity_map, | 1390 CHECK_MEM_ERROR(cm, cpi->complexity_map, |
783 vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); | 1391 vpx_calloc(cm->mi_rows * cm->mi_cols, 1)); |
784 | 1392 |
785 // Create a map used for cyclic background refresh. | 1393 // Create a map used for cyclic background refresh. |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1059 | 1667 |
1060 BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg, | 1668 BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg, |
1061 vp9_variance4x8, vp9_sub_pixel_variance4x8, | 1669 vp9_variance4x8, vp9_sub_pixel_variance4x8, |
1062 vp9_sub_pixel_avg_variance4x8, NULL, vp9_sad4x8x8, vp9_sad4x8x4d) | 1670 vp9_sub_pixel_avg_variance4x8, NULL, vp9_sad4x8x8, vp9_sad4x8x4d) |
1063 | 1671 |
1064 BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg, | 1672 BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg, |
1065 vp9_variance4x4, vp9_sub_pixel_variance4x4, | 1673 vp9_variance4x4, vp9_sub_pixel_variance4x4, |
1066 vp9_sub_pixel_avg_variance4x4, | 1674 vp9_sub_pixel_avg_variance4x4, |
1067 vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d) | 1675 vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d) |
1068 | 1676 |
| 1677 #if CONFIG_VP9_HIGHBITDEPTH |
| 1678 highbd_set_var_fns(cpi); |
| 1679 #endif |
| 1680 |
1069 /* vp9_init_quantizer() is first called here. Add check in | 1681 /* vp9_init_quantizer() is first called here. Add check in |
1070 * vp9_frame_init_quantizer() so that vp9_init_quantizer is only | 1682 * vp9_frame_init_quantizer() so that vp9_init_quantizer is only |
1071 * called later when needed. This will avoid unnecessary calls of | 1683 * called later when needed. This will avoid unnecessary calls of |
1072 * vp9_init_quantizer() for every frame. | 1684 * vp9_init_quantizer() for every frame. |
1073 */ | 1685 */ |
1074 vp9_init_quantizer(cpi); | 1686 vp9_init_quantizer(cpi); |
1075 | 1687 |
1076 vp9_loop_filter_init(cm); | 1688 vp9_loop_filter_init(cm); |
1077 | 1689 |
1078 cm->error.setjmp = 0; | 1690 cm->error.setjmp = 0; |
(...skipping 12 matching lines...) Expand all Loading... |
1091 | 1703 |
1092 vp9_clear_system_state(); | 1704 vp9_clear_system_state(); |
1093 | 1705 |
1094 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count); | 1706 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count); |
1095 if (cpi->oxcf.pass != 1) { | 1707 if (cpi->oxcf.pass != 1) { |
1096 FILE *f = fopen("opsnr.stt", "a"); | 1708 FILE *f = fopen("opsnr.stt", "a"); |
1097 double time_encoded = (cpi->last_end_time_stamp_seen | 1709 double time_encoded = (cpi->last_end_time_stamp_seen |
1098 - cpi->first_time_stamp_ever) / 10000000.000; | 1710 - cpi->first_time_stamp_ever) / 10000000.000; |
1099 double total_encode_time = (cpi->time_receive_data + | 1711 double total_encode_time = (cpi->time_receive_data + |
1100 cpi->time_compress_data) / 1000.000; | 1712 cpi->time_compress_data) / 1000.000; |
1101 double dr = (double)cpi->bytes * (double) 8 / (double)1000 | 1713 const double dr = |
1102 / time_encoded; | 1714 (double)cpi->bytes * (double) 8 / (double)1000 / time_encoded; |
| 1715 const double peak = (double)((1 << cpi->oxcf.input_bit_depth) - 1); |
1103 | 1716 |
1104 if (cpi->b_calculate_psnr) { | 1717 if (cpi->b_calculate_psnr) { |
1105 const double total_psnr = | 1718 const double total_psnr = |
1106 vpx_sse_to_psnr((double)cpi->total_samples, 255.0, | 1719 vpx_sse_to_psnr((double)cpi->total_samples, peak, |
1107 (double)cpi->total_sq_error); | 1720 (double)cpi->total_sq_error); |
1108 const double totalp_psnr = | 1721 const double totalp_psnr = |
1109 vpx_sse_to_psnr((double)cpi->totalp_samples, 255.0, | 1722 vpx_sse_to_psnr((double)cpi->totalp_samples, peak, |
1110 (double)cpi->totalp_sq_error); | 1723 (double)cpi->totalp_sq_error); |
1111 const double total_ssim = 100 * pow(cpi->summed_quality / | 1724 const double total_ssim = 100 * pow(cpi->summed_quality / |
1112 cpi->summed_weights, 8.0); | 1725 cpi->summed_weights, 8.0); |
1113 const double totalp_ssim = 100 * pow(cpi->summedp_quality / | 1726 const double totalp_ssim = 100 * pow(cpi->summedp_quality / |
1114 cpi->summedp_weights, 8.0); | 1727 cpi->summedp_weights, 8.0); |
1115 | 1728 |
1116 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t" | 1729 fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t" |
1117 "VPXSSIM\tVPSSIMP\t Time(ms)\n"); | 1730 "VPXSSIM\tVPSSIMP\t Time(ms)\n"); |
1118 fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n", | 1731 fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n", |
1119 dr, cpi->total / cpi->count, total_psnr, | 1732 dr, cpi->total / cpi->count, total_psnr, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 fclose(keyfile); | 1799 fclose(keyfile); |
1187 | 1800 |
1188 if (framepsnr) | 1801 if (framepsnr) |
1189 fclose(framepsnr); | 1802 fclose(framepsnr); |
1190 | 1803 |
1191 if (kf_list) | 1804 if (kf_list) |
1192 fclose(kf_list); | 1805 fclose(kf_list); |
1193 | 1806 |
1194 #endif | 1807 #endif |
1195 } | 1808 } |
| 1809 |
1196 static int64_t get_sse(const uint8_t *a, int a_stride, | 1810 static int64_t get_sse(const uint8_t *a, int a_stride, |
1197 const uint8_t *b, int b_stride, | 1811 const uint8_t *b, int b_stride, |
1198 int width, int height) { | 1812 int width, int height) { |
1199 const int dw = width % 16; | 1813 const int dw = width % 16; |
1200 const int dh = height % 16; | 1814 const int dh = height % 16; |
1201 int64_t total_sse = 0; | 1815 int64_t total_sse = 0; |
1202 unsigned int sse = 0; | 1816 unsigned int sse = 0; |
1203 int sum = 0; | 1817 int sum = 0; |
1204 int x, y; | 1818 int x, y; |
1205 | 1819 |
(...skipping 21 matching lines...) Expand all Loading... |
1227 pb += 16; | 1841 pb += 16; |
1228 } | 1842 } |
1229 | 1843 |
1230 a += 16 * a_stride; | 1844 a += 16 * a_stride; |
1231 b += 16 * b_stride; | 1845 b += 16 * b_stride; |
1232 } | 1846 } |
1233 | 1847 |
1234 return total_sse; | 1848 return total_sse; |
1235 } | 1849 } |
1236 | 1850 |
| 1851 #if CONFIG_VP9_HIGHBITDEPTH |
| 1852 static int64_t highbd_get_sse_shift(const uint8_t *a8, int a_stride, |
| 1853 const uint8_t *b8, int b_stride, |
| 1854 int width, int height, |
| 1855 unsigned int input_shift) { |
| 1856 const uint16_t *a = CONVERT_TO_SHORTPTR(a8); |
| 1857 const uint16_t *b = CONVERT_TO_SHORTPTR(b8); |
| 1858 int64_t total_sse = 0; |
| 1859 int x, y; |
| 1860 for (y = 0; y < height; ++y) { |
| 1861 for (x = 0; x < width; ++x) { |
| 1862 int64_t diff; |
| 1863 diff = (a[x] >> input_shift) - (b[x] >> input_shift); |
| 1864 total_sse += diff * diff; |
| 1865 } |
| 1866 a += a_stride; |
| 1867 b += b_stride; |
| 1868 } |
| 1869 return total_sse; |
| 1870 } |
| 1871 |
| 1872 static int64_t highbd_get_sse(const uint8_t *a, int a_stride, |
| 1873 const uint8_t *b, int b_stride, |
| 1874 int width, int height) { |
| 1875 int64_t total_sse = 0; |
| 1876 int x, y; |
| 1877 const int dw = width % 16; |
| 1878 const int dh = height % 16; |
| 1879 unsigned int sse = 0; |
| 1880 int sum = 0; |
| 1881 if (dw > 0) { |
| 1882 highbd_variance(&a[width - dw], a_stride, &b[width - dw], b_stride, |
| 1883 dw, height, &sse, &sum); |
| 1884 total_sse += sse; |
| 1885 } |
| 1886 if (dh > 0) { |
| 1887 highbd_variance(&a[(height - dh) * a_stride], a_stride, |
| 1888 &b[(height - dh) * b_stride], b_stride, |
| 1889 width - dw, dh, &sse, &sum); |
| 1890 total_sse += sse; |
| 1891 } |
| 1892 for (y = 0; y < height / 16; ++y) { |
| 1893 const uint8_t *pa = a; |
| 1894 const uint8_t *pb = b; |
| 1895 for (x = 0; x < width / 16; ++x) { |
| 1896 vp9_highbd_mse16x16(pa, a_stride, pb, b_stride, &sse); |
| 1897 total_sse += sse; |
| 1898 pa += 16; |
| 1899 pb += 16; |
| 1900 } |
| 1901 a += 16 * a_stride; |
| 1902 b += 16 * b_stride; |
| 1903 } |
| 1904 return total_sse; |
| 1905 } |
| 1906 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 1907 |
1237 typedef struct { | 1908 typedef struct { |
1238 double psnr[4]; // total/y/u/v | 1909 double psnr[4]; // total/y/u/v |
1239 uint64_t sse[4]; // total/y/u/v | 1910 uint64_t sse[4]; // total/y/u/v |
1240 uint32_t samples[4]; // total/y/u/v | 1911 uint32_t samples[4]; // total/y/u/v |
1241 } PSNR_STATS; | 1912 } PSNR_STATS; |
1242 | 1913 |
1243 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, | 1914 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, |
1244 PSNR_STATS *psnr) { | 1915 PSNR_STATS *psnr) { |
| 1916 static const double peak = 255.0; |
1245 const int widths[3] = {a->y_width, a->uv_width, a->uv_width }; | 1917 const int widths[3] = {a->y_width, a->uv_width, a->uv_width }; |
1246 const int heights[3] = {a->y_height, a->uv_height, a->uv_height}; | 1918 const int heights[3] = {a->y_height, a->uv_height, a->uv_height}; |
1247 const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer }; | 1919 const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer }; |
1248 const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride}; | 1920 const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride}; |
1249 const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer }; | 1921 const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer }; |
1250 const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride}; | 1922 const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride}; |
1251 int i; | 1923 int i; |
1252 uint64_t total_sse = 0; | 1924 uint64_t total_sse = 0; |
1253 uint32_t total_samples = 0; | 1925 uint32_t total_samples = 0; |
1254 | 1926 |
1255 for (i = 0; i < 3; ++i) { | 1927 for (i = 0; i < 3; ++i) { |
1256 const int w = widths[i]; | 1928 const int w = widths[i]; |
1257 const int h = heights[i]; | 1929 const int h = heights[i]; |
1258 const uint32_t samples = w * h; | 1930 const uint32_t samples = w * h; |
1259 const uint64_t sse = get_sse(a_planes[i], a_strides[i], | 1931 const uint64_t sse = get_sse(a_planes[i], a_strides[i], |
1260 b_planes[i], b_strides[i], | 1932 b_planes[i], b_strides[i], |
1261 w, h); | 1933 w, h); |
1262 psnr->sse[1 + i] = sse; | 1934 psnr->sse[1 + i] = sse; |
1263 psnr->samples[1 + i] = samples; | 1935 psnr->samples[1 + i] = samples; |
1264 psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse); | 1936 psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse); |
1265 | 1937 |
1266 total_sse += sse; | 1938 total_sse += sse; |
1267 total_samples += samples; | 1939 total_samples += samples; |
1268 } | 1940 } |
1269 | 1941 |
1270 psnr->sse[0] = total_sse; | 1942 psnr->sse[0] = total_sse; |
1271 psnr->samples[0] = total_samples; | 1943 psnr->samples[0] = total_samples; |
1272 psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0, | 1944 psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak, |
1273 (double)total_sse); | 1945 (double)total_sse); |
1274 } | 1946 } |
1275 | 1947 |
| 1948 #if CONFIG_VP9_HIGHBITDEPTH |
| 1949 static void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a, |
| 1950 const YV12_BUFFER_CONFIG *b, |
| 1951 PSNR_STATS *psnr, |
| 1952 unsigned int bit_depth, |
| 1953 unsigned int in_bit_depth) { |
| 1954 const int widths[3] = {a->y_width, a->uv_width, a->uv_width }; |
| 1955 const int heights[3] = {a->y_height, a->uv_height, a->uv_height}; |
| 1956 const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer }; |
| 1957 const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride}; |
| 1958 const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer }; |
| 1959 const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride}; |
| 1960 int i; |
| 1961 uint64_t total_sse = 0; |
| 1962 uint32_t total_samples = 0; |
| 1963 const double peak = (double)((1 << in_bit_depth) - 1); |
| 1964 const unsigned int input_shift = bit_depth - in_bit_depth; |
| 1965 |
| 1966 for (i = 0; i < 3; ++i) { |
| 1967 const int w = widths[i]; |
| 1968 const int h = heights[i]; |
| 1969 const uint32_t samples = w * h; |
| 1970 uint64_t sse; |
| 1971 if (a->flags & YV12_FLAG_HIGHBITDEPTH) { |
| 1972 if (input_shift) { |
| 1973 sse = highbd_get_sse_shift(a_planes[i], a_strides[i], |
| 1974 b_planes[i], b_strides[i], w, h, |
| 1975 input_shift); |
| 1976 } else { |
| 1977 sse = highbd_get_sse(a_planes[i], a_strides[i], |
| 1978 b_planes[i], b_strides[i], w, h); |
| 1979 } |
| 1980 } else { |
| 1981 sse = get_sse(a_planes[i], a_strides[i], |
| 1982 b_planes[i], b_strides[i], |
| 1983 w, h); |
| 1984 } |
| 1985 psnr->sse[1 + i] = sse; |
| 1986 psnr->samples[1 + i] = samples; |
| 1987 psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse); |
| 1988 |
| 1989 total_sse += sse; |
| 1990 total_samples += samples; |
| 1991 } |
| 1992 |
| 1993 psnr->sse[0] = total_sse; |
| 1994 psnr->samples[0] = total_samples; |
| 1995 psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak, |
| 1996 (double)total_sse); |
| 1997 } |
| 1998 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 1999 |
1276 static void generate_psnr_packet(VP9_COMP *cpi) { | 2000 static void generate_psnr_packet(VP9_COMP *cpi) { |
1277 struct vpx_codec_cx_pkt pkt; | 2001 struct vpx_codec_cx_pkt pkt; |
1278 int i; | 2002 int i; |
1279 PSNR_STATS psnr; | 2003 PSNR_STATS psnr; |
| 2004 #if CONFIG_VP9_HIGHBITDEPTH |
| 2005 calc_highbd_psnr(cpi->Source, cpi->common.frame_to_show, &psnr, |
| 2006 cpi->mb.e_mbd.bd, cpi->oxcf.input_bit_depth); |
| 2007 #else |
1280 calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr); | 2008 calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr); |
| 2009 #endif |
| 2010 |
1281 for (i = 0; i < 4; ++i) { | 2011 for (i = 0; i < 4; ++i) { |
1282 pkt.data.psnr.samples[i] = psnr.samples[i]; | 2012 pkt.data.psnr.samples[i] = psnr.samples[i]; |
1283 pkt.data.psnr.sse[i] = psnr.sse[i]; | 2013 pkt.data.psnr.sse[i] = psnr.sse[i]; |
1284 pkt.data.psnr.psnr[i] = psnr.psnr[i]; | 2014 pkt.data.psnr.psnr[i] = psnr.psnr[i]; |
1285 } | 2015 } |
1286 pkt.kind = VPX_CODEC_PSNR_PKT; | 2016 pkt.kind = VPX_CODEC_PSNR_PKT; |
1287 if (is_two_pass_svc(cpi)) | 2017 if (is_two_pass_svc(cpi)) |
1288 cpi->svc.layer_context[cpi->svc.spatial_layer_id].psnr_pkt = pkt.data.psnr; | 2018 cpi->svc.layer_context[cpi->svc.spatial_layer_id].psnr_pkt = pkt.data.psnr; |
1289 else | 2019 else |
1290 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt); | 2020 vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1379 } | 2109 } |
1380 #endif | 2110 #endif |
1381 #endif | 2111 #endif |
1382 | 2112 |
1383 #ifdef OUTPUT_YUV_REC | 2113 #ifdef OUTPUT_YUV_REC |
1384 void vp9_write_yuv_rec_frame(VP9_COMMON *cm) { | 2114 void vp9_write_yuv_rec_frame(VP9_COMMON *cm) { |
1385 YV12_BUFFER_CONFIG *s = cm->frame_to_show; | 2115 YV12_BUFFER_CONFIG *s = cm->frame_to_show; |
1386 uint8_t *src = s->y_buffer; | 2116 uint8_t *src = s->y_buffer; |
1387 int h = cm->height; | 2117 int h = cm->height; |
1388 | 2118 |
| 2119 #if CONFIG_VP9_HIGHBITDEPTH |
| 2120 if (s->flags & YV12_FLAG_HIGHBITDEPTH) { |
| 2121 uint16_t *src16 = CONVERT_TO_SHORTPTR(s->y_buffer); |
| 2122 |
| 2123 do { |
| 2124 fwrite(src16, s->y_width, 2, yuv_rec_file); |
| 2125 src16 += s->y_stride; |
| 2126 } while (--h); |
| 2127 |
| 2128 src16 = CONVERT_TO_SHORTPTR(s->u_buffer); |
| 2129 h = s->uv_height; |
| 2130 |
| 2131 do { |
| 2132 fwrite(src16, s->uv_width, 2, yuv_rec_file); |
| 2133 src16 += s->uv_stride; |
| 2134 } while (--h); |
| 2135 |
| 2136 src16 = CONVERT_TO_SHORTPTR(s->v_buffer); |
| 2137 h = s->uv_height; |
| 2138 |
| 2139 do { |
| 2140 fwrite(src16, s->uv_width, 2, yuv_rec_file); |
| 2141 src16 += s->uv_stride; |
| 2142 } while (--h); |
| 2143 |
| 2144 fflush(yuv_rec_file); |
| 2145 return; |
| 2146 } |
| 2147 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 2148 |
1389 do { | 2149 do { |
1390 fwrite(src, s->y_width, 1, yuv_rec_file); | 2150 fwrite(src, s->y_width, 1, yuv_rec_file); |
1391 src += s->y_stride; | 2151 src += s->y_stride; |
1392 } while (--h); | 2152 } while (--h); |
1393 | 2153 |
1394 src = s->u_buffer; | 2154 src = s->u_buffer; |
1395 h = s->uv_height; | 2155 h = s->uv_height; |
1396 | 2156 |
1397 do { | 2157 do { |
1398 fwrite(src, s->uv_width, 1, yuv_rec_file); | 2158 fwrite(src, s->uv_width, 1, yuv_rec_file); |
1399 src += s->uv_stride; | 2159 src += s->uv_stride; |
1400 } while (--h); | 2160 } while (--h); |
1401 | 2161 |
1402 src = s->v_buffer; | 2162 src = s->v_buffer; |
1403 h = s->uv_height; | 2163 h = s->uv_height; |
1404 | 2164 |
1405 do { | 2165 do { |
1406 fwrite(src, s->uv_width, 1, yuv_rec_file); | 2166 fwrite(src, s->uv_width, 1, yuv_rec_file); |
1407 src += s->uv_stride; | 2167 src += s->uv_stride; |
1408 } while (--h); | 2168 } while (--h); |
1409 | 2169 |
1410 fflush(yuv_rec_file); | 2170 fflush(yuv_rec_file); |
1411 } | 2171 } |
1412 #endif | 2172 #endif |
1413 | 2173 |
| 2174 #if CONFIG_VP9_HIGHBITDEPTH |
| 2175 static void scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src, |
| 2176 YV12_BUFFER_CONFIG *dst, |
| 2177 int bd) { |
| 2178 #else |
1414 static void scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src, | 2179 static void scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src, |
1415 YV12_BUFFER_CONFIG *dst) { | 2180 YV12_BUFFER_CONFIG *dst) { |
| 2181 #endif // CONFIG_VP9_HIGHBITDEPTH |
1416 // TODO(dkovalev): replace YV12_BUFFER_CONFIG with vpx_image_t | 2182 // TODO(dkovalev): replace YV12_BUFFER_CONFIG with vpx_image_t |
1417 int i; | 2183 int i; |
1418 const uint8_t *const srcs[3] = {src->y_buffer, src->u_buffer, src->v_buffer}; | 2184 const uint8_t *const srcs[3] = {src->y_buffer, src->u_buffer, src->v_buffer}; |
1419 const int src_strides[3] = {src->y_stride, src->uv_stride, src->uv_stride}; | 2185 const int src_strides[3] = {src->y_stride, src->uv_stride, src->uv_stride}; |
1420 const int src_widths[3] = {src->y_crop_width, src->uv_crop_width, | 2186 const int src_widths[3] = {src->y_crop_width, src->uv_crop_width, |
1421 src->uv_crop_width }; | 2187 src->uv_crop_width }; |
1422 const int src_heights[3] = {src->y_crop_height, src->uv_crop_height, | 2188 const int src_heights[3] = {src->y_crop_height, src->uv_crop_height, |
1423 src->uv_crop_height}; | 2189 src->uv_crop_height}; |
1424 uint8_t *const dsts[3] = {dst->y_buffer, dst->u_buffer, dst->v_buffer}; | 2190 uint8_t *const dsts[3] = {dst->y_buffer, dst->u_buffer, dst->v_buffer}; |
1425 const int dst_strides[3] = {dst->y_stride, dst->uv_stride, dst->uv_stride}; | 2191 const int dst_strides[3] = {dst->y_stride, dst->uv_stride, dst->uv_stride}; |
1426 const int dst_widths[3] = {dst->y_crop_width, dst->uv_crop_width, | 2192 const int dst_widths[3] = {dst->y_crop_width, dst->uv_crop_width, |
1427 dst->uv_crop_width}; | 2193 dst->uv_crop_width}; |
1428 const int dst_heights[3] = {dst->y_crop_height, dst->uv_crop_height, | 2194 const int dst_heights[3] = {dst->y_crop_height, dst->uv_crop_height, |
1429 dst->uv_crop_height}; | 2195 dst->uv_crop_height}; |
1430 | 2196 |
1431 for (i = 0; i < MAX_MB_PLANE; ++i) | 2197 for (i = 0; i < MAX_MB_PLANE; ++i) { |
| 2198 #if CONFIG_VP9_HIGHBITDEPTH |
| 2199 if (src->flags & YV12_FLAG_HIGHBITDEPTH) { |
| 2200 vp9_highbd_resize_plane(srcs[i], src_heights[i], src_widths[i], |
| 2201 src_strides[i], dsts[i], dst_heights[i], |
| 2202 dst_widths[i], dst_strides[i], bd); |
| 2203 } else { |
| 2204 vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i], |
| 2205 dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]); |
| 2206 } |
| 2207 #else |
1432 vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i], | 2208 vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i], |
1433 dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]); | 2209 dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]); |
1434 | 2210 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 2211 } |
1435 vp9_extend_frame_borders(dst); | 2212 vp9_extend_frame_borders(dst); |
1436 } | 2213 } |
1437 | 2214 |
| 2215 #if CONFIG_VP9_HIGHBITDEPTH |
| 2216 static void scale_and_extend_frame(const YV12_BUFFER_CONFIG *src, |
| 2217 YV12_BUFFER_CONFIG *dst, int bd) { |
| 2218 #else |
1438 static void scale_and_extend_frame(const YV12_BUFFER_CONFIG *src, | 2219 static void scale_and_extend_frame(const YV12_BUFFER_CONFIG *src, |
1439 YV12_BUFFER_CONFIG *dst) { | 2220 YV12_BUFFER_CONFIG *dst) { |
| 2221 #endif // CONFIG_VP9_HIGHBITDEPTH |
1440 const int src_w = src->y_crop_width; | 2222 const int src_w = src->y_crop_width; |
1441 const int src_h = src->y_crop_height; | 2223 const int src_h = src->y_crop_height; |
1442 const int dst_w = dst->y_crop_width; | 2224 const int dst_w = dst->y_crop_width; |
1443 const int dst_h = dst->y_crop_height; | 2225 const int dst_h = dst->y_crop_height; |
1444 const uint8_t *const srcs[3] = {src->y_buffer, src->u_buffer, src->v_buffer}; | 2226 const uint8_t *const srcs[3] = {src->y_buffer, src->u_buffer, src->v_buffer}; |
1445 const int src_strides[3] = {src->y_stride, src->uv_stride, src->uv_stride}; | 2227 const int src_strides[3] = {src->y_stride, src->uv_stride, src->uv_stride}; |
1446 uint8_t *const dsts[3] = {dst->y_buffer, dst->u_buffer, dst->v_buffer}; | 2228 uint8_t *const dsts[3] = {dst->y_buffer, dst->u_buffer, dst->v_buffer}; |
1447 const int dst_strides[3] = {dst->y_stride, dst->uv_stride, dst->uv_stride}; | 2229 const int dst_strides[3] = {dst->y_stride, dst->uv_stride, dst->uv_stride}; |
1448 const InterpKernel *const kernel = vp9_get_interp_kernel(EIGHTTAP); | 2230 const InterpKernel *const kernel = vp9_get_interp_kernel(EIGHTTAP); |
1449 int x, y, i; | 2231 int x, y, i; |
1450 | 2232 |
1451 for (y = 0; y < dst_h; y += 16) { | 2233 for (y = 0; y < dst_h; y += 16) { |
1452 for (x = 0; x < dst_w; x += 16) { | 2234 for (x = 0; x < dst_w; x += 16) { |
1453 for (i = 0; i < MAX_MB_PLANE; ++i) { | 2235 for (i = 0; i < MAX_MB_PLANE; ++i) { |
1454 const int factor = (i == 0 || i == 3 ? 1 : 2); | 2236 const int factor = (i == 0 || i == 3 ? 1 : 2); |
1455 const int x_q4 = x * (16 / factor) * src_w / dst_w; | 2237 const int x_q4 = x * (16 / factor) * src_w / dst_w; |
1456 const int y_q4 = y * (16 / factor) * src_h / dst_h; | 2238 const int y_q4 = y * (16 / factor) * src_h / dst_h; |
1457 const int src_stride = src_strides[i]; | 2239 const int src_stride = src_strides[i]; |
1458 const int dst_stride = dst_strides[i]; | 2240 const int dst_stride = dst_strides[i]; |
1459 const uint8_t *src_ptr = srcs[i] + (y / factor) * src_h / dst_h * | 2241 const uint8_t *src_ptr = srcs[i] + (y / factor) * src_h / dst_h * |
1460 src_stride + (x / factor) * src_w / dst_w; | 2242 src_stride + (x / factor) * src_w / dst_w; |
1461 uint8_t *dst_ptr = dsts[i] + (y / factor) * dst_stride + (x / factor); | 2243 uint8_t *dst_ptr = dsts[i] + (y / factor) * dst_stride + (x / factor); |
1462 | 2244 |
| 2245 #if CONFIG_VP9_HIGHBITDEPTH |
| 2246 if (src->flags & YV12_FLAG_HIGHBITDEPTH) { |
| 2247 vp9_highbd_convolve8(src_ptr, src_stride, dst_ptr, dst_stride, |
| 2248 kernel[x_q4 & 0xf], 16 * src_w / dst_w, |
| 2249 kernel[y_q4 & 0xf], 16 * src_h / dst_h, |
| 2250 16 / factor, 16 / factor, bd); |
| 2251 } else { |
| 2252 vp9_convolve8(src_ptr, src_stride, dst_ptr, dst_stride, |
| 2253 kernel[x_q4 & 0xf], 16 * src_w / dst_w, |
| 2254 kernel[y_q4 & 0xf], 16 * src_h / dst_h, |
| 2255 16 / factor, 16 / factor); |
| 2256 } |
| 2257 #else |
1463 vp9_convolve8(src_ptr, src_stride, dst_ptr, dst_stride, | 2258 vp9_convolve8(src_ptr, src_stride, dst_ptr, dst_stride, |
1464 kernel[x_q4 & 0xf], 16 * src_w / dst_w, | 2259 kernel[x_q4 & 0xf], 16 * src_w / dst_w, |
1465 kernel[y_q4 & 0xf], 16 * src_h / dst_h, | 2260 kernel[y_q4 & 0xf], 16 * src_h / dst_h, |
1466 16 / factor, 16 / factor); | 2261 16 / factor, 16 / factor); |
| 2262 #endif // CONFIG_VP9_HIGHBITDEPTH |
1467 } | 2263 } |
1468 } | 2264 } |
1469 } | 2265 } |
1470 | 2266 |
1471 vp9_extend_frame_borders(dst); | 2267 vp9_extend_frame_borders(dst); |
1472 } | 2268 } |
1473 | 2269 |
1474 // Function to test for conditions that indicate we should loop | 2270 // Function to test for conditions that indicate we should loop |
1475 // back and recode a frame. | 2271 // back and recode a frame. |
1476 static int recode_loop_test(const VP9_COMP *cpi, | 2272 static int recode_loop_test(const VP9_COMP *cpi, |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 | 2421 |
1626 // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1). | 2422 // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1). |
1627 if ((cpi->ref_frame_flags & ref_mask[ref_frame - 1]) && | 2423 if ((cpi->ref_frame_flags & ref_mask[ref_frame - 1]) && |
1628 (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height)) { | 2424 (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height)) { |
1629 const int new_fb = get_free_fb(cm); | 2425 const int new_fb = get_free_fb(cm); |
1630 vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf, | 2426 vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf, |
1631 cm->width, cm->height, | 2427 cm->width, cm->height, |
1632 cm->subsampling_x, cm->subsampling_y, | 2428 cm->subsampling_x, cm->subsampling_y, |
1633 #if CONFIG_VP9_HIGHBITDEPTH | 2429 #if CONFIG_VP9_HIGHBITDEPTH |
1634 cm->use_highbitdepth, | 2430 cm->use_highbitdepth, |
1635 #endif | 2431 #endif // CONFIG_VP9_HIGHBITDEPTH |
1636 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL); | 2432 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL); |
| 2433 #if CONFIG_VP9_HIGHBITDEPTH |
| 2434 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf, |
| 2435 (int)cm->bit_depth); |
| 2436 #else |
1637 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf); | 2437 scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf); |
| 2438 #endif // CONFIG_VP9_HIGHBITDEPTH |
1638 cpi->scaled_ref_idx[ref_frame - 1] = new_fb; | 2439 cpi->scaled_ref_idx[ref_frame - 1] = new_fb; |
1639 } else { | 2440 } else { |
1640 cpi->scaled_ref_idx[ref_frame - 1] = idx; | 2441 cpi->scaled_ref_idx[ref_frame - 1] = idx; |
1641 cm->frame_bufs[idx].ref_count++; | 2442 cm->frame_bufs[idx].ref_count++; |
1642 } | 2443 } |
1643 } | 2444 } |
1644 } | 2445 } |
1645 | 2446 |
1646 static void release_scaled_references(VP9_COMP *cpi) { | 2447 static void release_scaled_references(VP9_COMP *cpi) { |
1647 VP9_COMMON *cm = &cpi->common; | 2448 VP9_COMMON *cm = &cpi->common; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1691 "%10"PRId64" %10.3lf" | 2492 "%10"PRId64" %10.3lf" |
1692 "%10lf %8u %10d %10d %10d\n", | 2493 "%10lf %8u %10d %10d %10d\n", |
1693 cpi->common.current_video_frame, cpi->rc.this_frame_target, | 2494 cpi->common.current_video_frame, cpi->rc.this_frame_target, |
1694 cpi->rc.projected_frame_size, | 2495 cpi->rc.projected_frame_size, |
1695 cpi->rc.projected_frame_size / cpi->common.MBs, | 2496 cpi->rc.projected_frame_size / cpi->common.MBs, |
1696 (cpi->rc.projected_frame_size - cpi->rc.this_frame_target), | 2497 (cpi->rc.projected_frame_size - cpi->rc.this_frame_target), |
1697 cpi->rc.vbr_bits_off_target, | 2498 cpi->rc.vbr_bits_off_target, |
1698 cpi->rc.total_target_vs_actual, | 2499 cpi->rc.total_target_vs_actual, |
1699 (cpi->rc.starting_buffer_level - cpi->rc.bits_off_target), | 2500 (cpi->rc.starting_buffer_level - cpi->rc.bits_off_target), |
1700 cpi->rc.total_actual_bits, cm->base_qindex, | 2501 cpi->rc.total_actual_bits, cm->base_qindex, |
1701 vp9_convert_qindex_to_q(cm->base_qindex), | 2502 vp9_convert_qindex_to_q(cm->base_qindex, cm->bit_depth), |
1702 (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0, | 2503 (double)vp9_dc_quant(cm->base_qindex, 0, cm->bit_depth) / 4.0, |
1703 vp9_convert_qindex_to_q(cpi->twopass.active_worst_quality), | 2504 vp9_convert_qindex_to_q(cpi->twopass.active_worst_quality, |
| 2505 cm->bit_depth), |
1704 cpi->rc.avg_q, | 2506 cpi->rc.avg_q, |
1705 vp9_convert_qindex_to_q(cpi->oxcf.cq_level), | 2507 vp9_convert_qindex_to_q(cpi->oxcf.cq_level, cm->bit_depth), |
1706 cpi->refresh_last_frame, cpi->refresh_golden_frame, | 2508 cpi->refresh_last_frame, cpi->refresh_golden_frame, |
1707 cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost, | 2509 cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost, |
1708 cpi->twopass.bits_left, | 2510 cpi->twopass.bits_left, |
1709 cpi->twopass.total_left_stats.coded_error, | 2511 cpi->twopass.total_left_stats.coded_error, |
1710 cpi->twopass.bits_left / | 2512 cpi->twopass.bits_left / |
1711 (1 + cpi->twopass.total_left_stats.coded_error), | 2513 (1 + cpi->twopass.total_left_stats.coded_error), |
1712 cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, | 2514 cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, |
1713 cpi->twopass.kf_zeromotion_pct); | 2515 cpi->twopass.kf_zeromotion_pct); |
1714 | 2516 |
1715 fclose(f); | 2517 fclose(f); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1817 frame_over_shoot_limit = 1; | 2619 frame_over_shoot_limit = 1; |
1818 } | 2620 } |
1819 | 2621 |
1820 if (cpi->oxcf.rc_mode == VPX_Q) { | 2622 if (cpi->oxcf.rc_mode == VPX_Q) { |
1821 loop = 0; | 2623 loop = 0; |
1822 } else { | 2624 } else { |
1823 if ((cm->frame_type == KEY_FRAME) && | 2625 if ((cm->frame_type == KEY_FRAME) && |
1824 rc->this_key_frame_forced && | 2626 rc->this_key_frame_forced && |
1825 (rc->projected_frame_size < rc->max_frame_bandwidth)) { | 2627 (rc->projected_frame_size < rc->max_frame_bandwidth)) { |
1826 int last_q = q; | 2628 int last_q = q; |
1827 int kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); | 2629 int kf_err; |
1828 | 2630 |
1829 int high_err_target = cpi->ambient_err; | 2631 int high_err_target = cpi->ambient_err; |
1830 int low_err_target = cpi->ambient_err >> 1; | 2632 int low_err_target = cpi->ambient_err >> 1; |
1831 | 2633 |
| 2634 #if CONFIG_VP9_HIGHBITDEPTH |
| 2635 if (cm->use_highbitdepth) { |
| 2636 kf_err = vp9_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm), |
| 2637 cm->bit_depth); |
| 2638 } else { |
| 2639 kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); |
| 2640 } |
| 2641 #else |
| 2642 kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); |
| 2643 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 2644 |
1832 // Prevent possible divide by zero error below for perfect KF | 2645 // Prevent possible divide by zero error below for perfect KF |
1833 kf_err += !kf_err; | 2646 kf_err += !kf_err; |
1834 | 2647 |
1835 // The key frame is not good enough or we can afford | 2648 // The key frame is not good enough or we can afford |
1836 // to make it better without undue risk of popping. | 2649 // to make it better without undue risk of popping. |
1837 if ((kf_err > high_err_target && | 2650 if ((kf_err > high_err_target && |
1838 rc->projected_frame_size <= frame_over_shoot_limit) || | 2651 rc->projected_frame_size <= frame_over_shoot_limit) || |
1839 (kf_err > low_err_target && | 2652 (kf_err > low_err_target && |
1840 rc->projected_frame_size <= frame_under_shoot_limit)) { | 2653 rc->projected_frame_size <= frame_under_shoot_limit)) { |
1841 // Lower q_high | 2654 // Lower q_high |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1992 cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame; | 2805 cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame; |
1993 cpi->ext_refresh_frame_flags_pending = 0; | 2806 cpi->ext_refresh_frame_flags_pending = 0; |
1994 } | 2807 } |
1995 } | 2808 } |
1996 | 2809 |
1997 YV12_BUFFER_CONFIG *vp9_scale_if_required(VP9_COMMON *cm, | 2810 YV12_BUFFER_CONFIG *vp9_scale_if_required(VP9_COMMON *cm, |
1998 YV12_BUFFER_CONFIG *unscaled, | 2811 YV12_BUFFER_CONFIG *unscaled, |
1999 YV12_BUFFER_CONFIG *scaled) { | 2812 YV12_BUFFER_CONFIG *scaled) { |
2000 if (cm->mi_cols * MI_SIZE != unscaled->y_width || | 2813 if (cm->mi_cols * MI_SIZE != unscaled->y_width || |
2001 cm->mi_rows * MI_SIZE != unscaled->y_height) { | 2814 cm->mi_rows * MI_SIZE != unscaled->y_height) { |
| 2815 #if CONFIG_VP9_HIGHBITDEPTH |
| 2816 scale_and_extend_frame_nonnormative(unscaled, scaled, (int)cm->bit_depth); |
| 2817 #else |
2002 scale_and_extend_frame_nonnormative(unscaled, scaled); | 2818 scale_and_extend_frame_nonnormative(unscaled, scaled); |
| 2819 #endif // CONFIG_VP9_HIGHBITDEPTH |
2003 return scaled; | 2820 return scaled; |
2004 } else { | 2821 } else { |
2005 return unscaled; | 2822 return unscaled; |
2006 } | 2823 } |
2007 } | 2824 } |
2008 | 2825 |
2009 static int is_skippable_frame(const VP9_COMP *cpi) { | 2826 static int is_skippable_frame(const VP9_COMP *cpi) { |
2010 // If the current frame does not have non-zero motion vector detected in the | 2827 // If the current frame does not have non-zero motion vector detected in the |
2011 // first pass, and so do its previous and forward frames, then this frame | 2828 // first pass, and so do its previous and forward frames, then this frame |
2012 // can be skipped for partition check, and the partition size is assigned | 2829 // can be skipped for partition check, and the partition size is assigned |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2158 cm->frame_parallel_decoding_mode = 1; | 2975 cm->frame_parallel_decoding_mode = 1; |
2159 cm->reset_frame_context = 0; | 2976 cm->reset_frame_context = 0; |
2160 cm->refresh_frame_context = 0; | 2977 cm->refresh_frame_context = 0; |
2161 } else if (cm->intra_only) { | 2978 } else if (cm->intra_only) { |
2162 cm->frame_parallel_decoding_mode = oxcf->frame_parallel_decoding_mode; | 2979 cm->frame_parallel_decoding_mode = oxcf->frame_parallel_decoding_mode; |
2163 // Only reset the current context. | 2980 // Only reset the current context. |
2164 cm->reset_frame_context = 2; | 2981 cm->reset_frame_context = 2; |
2165 } | 2982 } |
2166 } | 2983 } |
2167 if (is_two_pass_svc(cpi) && cm->error_resilient_mode == 0) { | 2984 if (is_two_pass_svc(cpi) && cm->error_resilient_mode == 0) { |
| 2985 // Use the last frame context for the empty frame. |
2168 cm->frame_context_idx = | 2986 cm->frame_context_idx = |
| 2987 (cpi->svc.encode_empty_frame_state == ENCODING) ? FRAME_CONTEXTS - 1 : |
2169 cpi->svc.spatial_layer_id * cpi->svc.number_temporal_layers + | 2988 cpi->svc.spatial_layer_id * cpi->svc.number_temporal_layers + |
2170 cpi->svc.temporal_layer_id; | 2989 cpi->svc.temporal_layer_id; |
2171 | 2990 |
2172 // The probs will be updated based on the frame type of its previous | 2991 // The probs will be updated based on the frame type of its previous |
2173 // frame if frame_parallel_decoding_mode is 0. The type may vary for | 2992 // frame if frame_parallel_decoding_mode is 0. The type may vary for |
2174 // the frame after a key frame in base layer since we may drop enhancement | 2993 // the frame after a key frame in base layer since we may drop enhancement |
2175 // layers. So set frame_parallel_decoding_mode to 1 in this case. | 2994 // layers. So set frame_parallel_decoding_mode to 1 in this case. |
2176 if (cpi->svc.number_temporal_layers == 1) { | 2995 if (cpi->svc.number_temporal_layers == 1) { |
2177 if (cpi->svc.spatial_layer_id == 0 && | 2996 if (cpi->svc.spatial_layer_id == 0 && |
2178 cpi->svc.layer_context[0].last_frame_type == KEY_FRAME) | 2997 cpi->svc.layer_context[0].last_frame_type == KEY_FRAME) |
(...skipping 17 matching lines...) Expand all Loading... |
2196 | 3015 |
2197 // Configure experimental use of segmentation for enhanced coding of | 3016 // Configure experimental use of segmentation for enhanced coding of |
2198 // static regions if indicated. | 3017 // static regions if indicated. |
2199 // Only allowed in second pass of two pass (as requires lagged coding) | 3018 // Only allowed in second pass of two pass (as requires lagged coding) |
2200 // and if the relevant speed feature flag is set. | 3019 // and if the relevant speed feature flag is set. |
2201 if (oxcf->pass == 2 && cpi->sf.static_segmentation) | 3020 if (oxcf->pass == 2 && cpi->sf.static_segmentation) |
2202 configure_static_seg_features(cpi); | 3021 configure_static_seg_features(cpi); |
2203 | 3022 |
2204 // Check if the current frame is skippable for the partition search in the | 3023 // Check if the current frame is skippable for the partition search in the |
2205 // second pass according to the first pass stats | 3024 // second pass according to the first pass stats |
2206 if (oxcf->pass == 2 && | 3025 if (cpi->sf.allow_partition_search_skip && oxcf->pass == 2 && |
2207 (!cpi->use_svc || is_two_pass_svc(cpi))) { | 3026 (!cpi->use_svc || is_two_pass_svc(cpi))) { |
2208 cpi->skippable_frame = is_skippable_frame(cpi); | 3027 cpi->partition_search_skippable_frame = is_skippable_frame(cpi); |
2209 } | 3028 } |
2210 | 3029 |
2211 // For 1 pass CBR, check if we are dropping this frame. | 3030 // For 1 pass CBR, check if we are dropping this frame. |
2212 // Never drop on key frame. | 3031 // Never drop on key frame. |
2213 if (oxcf->pass == 0 && | 3032 if (oxcf->pass == 0 && |
2214 oxcf->rc_mode == VPX_CBR && | 3033 oxcf->rc_mode == VPX_CBR && |
2215 cm->frame_type != KEY_FRAME) { | 3034 cm->frame_type != KEY_FRAME) { |
2216 if (vp9_rc_drop_frame(cpi)) { | 3035 if (vp9_rc_drop_frame(cpi)) { |
2217 vp9_rc_postencode_update_drop_frame(cpi); | 3036 vp9_rc_postencode_update_drop_frame(cpi); |
2218 ++cm->current_video_frame; | 3037 ++cm->current_video_frame; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2282 yuv_denoised_file); | 3101 yuv_denoised_file); |
2283 } | 3102 } |
2284 #endif | 3103 #endif |
2285 #endif | 3104 #endif |
2286 | 3105 |
2287 | 3106 |
2288 // Special case code to reduce pulsing when key frames are forced at a | 3107 // Special case code to reduce pulsing when key frames are forced at a |
2289 // fixed interval. Note the reconstruction error if it is the frame before | 3108 // fixed interval. Note the reconstruction error if it is the frame before |
2290 // the force key frame | 3109 // the force key frame |
2291 if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) { | 3110 if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) { |
| 3111 #if CONFIG_VP9_HIGHBITDEPTH |
| 3112 if (cm->use_highbitdepth) { |
| 3113 cpi->ambient_err = vp9_highbd_get_y_sse(cpi->Source, |
| 3114 get_frame_new_buffer(cm), |
| 3115 cm->bit_depth); |
| 3116 } else { |
| 3117 cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); |
| 3118 } |
| 3119 #else |
2292 cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); | 3120 cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm)); |
| 3121 #endif // CONFIG_VP9_HIGHBITDEPTH |
2293 } | 3122 } |
2294 | 3123 |
2295 // If the encoder forced a KEY_FRAME decision | 3124 // If the encoder forced a KEY_FRAME decision |
2296 if (cm->frame_type == KEY_FRAME) | 3125 if (cm->frame_type == KEY_FRAME) |
2297 cpi->refresh_last_frame = 1; | 3126 cpi->refresh_last_frame = 1; |
2298 | 3127 |
2299 cm->frame_to_show = get_frame_new_buffer(cm); | 3128 cm->frame_to_show = get_frame_new_buffer(cm); |
2300 | 3129 |
2301 // Pick the loop filter level for the frame. | 3130 // Pick the loop filter level for the frame. |
2302 loopfilter_frame(cpi, cm); | 3131 loopfilter_frame(cpi, cm); |
(...skipping 26 matching lines...) Expand all Loading... |
2329 cpi->frame_flags &= ~FRAMEFLAGS_GOLDEN; | 3158 cpi->frame_flags &= ~FRAMEFLAGS_GOLDEN; |
2330 | 3159 |
2331 if (cpi->refresh_alt_ref_frame == 1) | 3160 if (cpi->refresh_alt_ref_frame == 1) |
2332 cpi->frame_flags |= FRAMEFLAGS_ALTREF; | 3161 cpi->frame_flags |= FRAMEFLAGS_ALTREF; |
2333 else | 3162 else |
2334 cpi->frame_flags &= ~FRAMEFLAGS_ALTREF; | 3163 cpi->frame_flags &= ~FRAMEFLAGS_ALTREF; |
2335 | 3164 |
2336 cpi->ref_frame_flags = get_ref_frame_flags(cpi); | 3165 cpi->ref_frame_flags = get_ref_frame_flags(cpi); |
2337 | 3166 |
2338 cm->last_frame_type = cm->frame_type; | 3167 cm->last_frame_type = cm->frame_type; |
2339 vp9_rc_postencode_update(cpi, *size); | 3168 |
| 3169 if (!(is_two_pass_svc(cpi) && cpi->svc.encode_empty_frame_state == ENCODING)) |
| 3170 vp9_rc_postencode_update(cpi, *size); |
2340 | 3171 |
2341 #if 0 | 3172 #if 0 |
2342 output_frame_level_debug_stats(cpi); | 3173 output_frame_level_debug_stats(cpi); |
2343 #endif | 3174 #endif |
2344 | 3175 |
2345 if (cm->frame_type == KEY_FRAME) { | 3176 if (cm->frame_type == KEY_FRAME) { |
2346 // Tell the caller that the frame was coded as a key frame | 3177 // Tell the caller that the frame was coded as a key frame |
2347 *frame_flags = cpi->frame_flags | FRAMEFLAGS_KEY; | 3178 *frame_flags = cpi->frame_flags | FRAMEFLAGS_KEY; |
2348 } else { | 3179 } else { |
2349 *frame_flags = cpi->frame_flags & ~FRAMEFLAGS_KEY; | 3180 *frame_flags = cpi->frame_flags & ~FRAMEFLAGS_KEY; |
2350 } | 3181 } |
2351 | 3182 |
2352 // Clear the one shot update flags for segmentation map and mode/ref loop | 3183 // Clear the one shot update flags for segmentation map and mode/ref loop |
2353 // filter deltas. | 3184 // filter deltas. |
2354 cm->seg.update_map = 0; | 3185 cm->seg.update_map = 0; |
2355 cm->seg.update_data = 0; | 3186 cm->seg.update_data = 0; |
2356 cm->lf.mode_ref_delta_update = 0; | 3187 cm->lf.mode_ref_delta_update = 0; |
2357 | 3188 |
2358 // keep track of the last coded dimensions | 3189 // keep track of the last coded dimensions |
2359 cm->last_width = cm->width; | 3190 cm->last_width = cm->width; |
2360 cm->last_height = cm->height; | 3191 cm->last_height = cm->height; |
2361 | 3192 |
2362 // reset to normal state now that we are done. | 3193 // reset to normal state now that we are done. |
2363 if (!cm->show_existing_frame) { | 3194 if (!cm->show_existing_frame) |
2364 if (is_two_pass_svc(cpi) && cm->error_resilient_mode == 0) | 3195 cm->last_show_frame = cm->show_frame; |
2365 cm->last_show_frame = 0; | |
2366 else | |
2367 cm->last_show_frame = cm->show_frame; | |
2368 } | |
2369 | 3196 |
2370 if (cm->show_frame) { | 3197 if (cm->show_frame) { |
2371 vp9_swap_mi_and_prev_mi(cm); | 3198 vp9_swap_mi_and_prev_mi(cm); |
2372 | 3199 |
2373 // Don't increment frame counters if this was an altref buffer | 3200 // Don't increment frame counters if this was an altref buffer |
2374 // update not a real frame | 3201 // update not a real frame |
2375 ++cm->current_video_frame; | 3202 ++cm->current_video_frame; |
2376 if (cpi->use_svc) | 3203 if (cpi->use_svc) |
2377 vp9_inc_frame_in_layer(cpi); | 3204 vp9_inc_frame_in_layer(cpi); |
2378 } | 3205 } |
(...skipping 16 matching lines...) Expand all Loading... |
2395 } else { | 3222 } else { |
2396 vp9_rc_get_one_pass_vbr_params(cpi); | 3223 vp9_rc_get_one_pass_vbr_params(cpi); |
2397 } | 3224 } |
2398 encode_frame_to_data_rate(cpi, size, dest, frame_flags); | 3225 encode_frame_to_data_rate(cpi, size, dest, frame_flags); |
2399 } | 3226 } |
2400 | 3227 |
2401 static void Pass2Encode(VP9_COMP *cpi, size_t *size, | 3228 static void Pass2Encode(VP9_COMP *cpi, size_t *size, |
2402 uint8_t *dest, unsigned int *frame_flags) { | 3229 uint8_t *dest, unsigned int *frame_flags) { |
2403 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; | 3230 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; |
2404 encode_frame_to_data_rate(cpi, size, dest, frame_flags); | 3231 encode_frame_to_data_rate(cpi, size, dest, frame_flags); |
2405 vp9_twopass_postencode_update(cpi); | 3232 |
| 3233 if (!(is_two_pass_svc(cpi) && cpi->svc.encode_empty_frame_state == ENCODING)) |
| 3234 vp9_twopass_postencode_update(cpi); |
2406 } | 3235 } |
2407 | 3236 |
2408 static void init_motion_estimation(VP9_COMP *cpi) { | 3237 static void init_motion_estimation(VP9_COMP *cpi) { |
2409 int y_stride = cpi->scaled_source.y_stride; | 3238 int y_stride = cpi->scaled_source.y_stride; |
2410 | 3239 |
2411 if (cpi->sf.mv.search_method == NSTEP) { | 3240 if (cpi->sf.mv.search_method == NSTEP) { |
2412 vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride); | 3241 vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride); |
2413 } else if (cpi->sf.mv.search_method == DIAMOND) { | 3242 } else if (cpi->sf.mv.search_method == DIAMOND) { |
2414 vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride); | 3243 vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride); |
2415 } | 3244 } |
2416 } | 3245 } |
2417 | 3246 |
2418 static void check_initial_width(VP9_COMP *cpi, int subsampling_x, | 3247 static void check_initial_width(VP9_COMP *cpi, |
2419 int subsampling_y) { | 3248 #if CONFIG_VP9_HIGHBITDEPTH |
| 3249 int use_highbitdepth, |
| 3250 #endif |
| 3251 int subsampling_x, int subsampling_y) { |
2420 VP9_COMMON *const cm = &cpi->common; | 3252 VP9_COMMON *const cm = &cpi->common; |
2421 | 3253 |
2422 if (!cpi->initial_width) { | 3254 if (!cpi->initial_width) { |
2423 cm->subsampling_x = subsampling_x; | 3255 cm->subsampling_x = subsampling_x; |
2424 cm->subsampling_y = subsampling_y; | 3256 cm->subsampling_y = subsampling_y; |
| 3257 #if CONFIG_VP9_HIGHBITDEPTH |
| 3258 cm->use_highbitdepth = use_highbitdepth; |
| 3259 #endif |
2425 | 3260 |
2426 alloc_raw_frame_buffers(cpi); | 3261 alloc_raw_frame_buffers(cpi); |
2427 alloc_ref_frame_buffers(cpi); | 3262 alloc_ref_frame_buffers(cpi); |
2428 alloc_util_frame_buffers(cpi); | 3263 alloc_util_frame_buffers(cpi); |
2429 | 3264 |
2430 init_motion_estimation(cpi); | 3265 init_motion_estimation(cpi); |
2431 | 3266 |
2432 cpi->initial_width = cm->width; | 3267 cpi->initial_width = cm->width; |
2433 cpi->initial_height = cm->height; | 3268 cpi->initial_height = cm->height; |
2434 } | 3269 } |
2435 } | 3270 } |
2436 | 3271 |
2437 | 3272 |
2438 int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, | 3273 int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, |
2439 YV12_BUFFER_CONFIG *sd, int64_t time_stamp, | 3274 YV12_BUFFER_CONFIG *sd, int64_t time_stamp, |
2440 int64_t end_time) { | 3275 int64_t end_time) { |
2441 VP9_COMMON *cm = &cpi->common; | 3276 VP9_COMMON *cm = &cpi->common; |
2442 struct vpx_usec_timer timer; | 3277 struct vpx_usec_timer timer; |
2443 int res = 0; | 3278 int res = 0; |
2444 const int subsampling_x = sd->uv_width < sd->y_width; | 3279 const int subsampling_x = sd->subsampling_x; |
2445 const int subsampling_y = sd->uv_height < sd->y_height; | 3280 const int subsampling_y = sd->subsampling_y; |
2446 | 3281 #if CONFIG_VP9_HIGHBITDEPTH |
| 3282 const int use_highbitdepth = sd->flags & YV12_FLAG_HIGHBITDEPTH; |
| 3283 check_initial_width(cpi, use_highbitdepth, subsampling_x, subsampling_y); |
| 3284 #else |
2447 check_initial_width(cpi, subsampling_x, subsampling_y); | 3285 check_initial_width(cpi, subsampling_x, subsampling_y); |
| 3286 #endif // CONFIG_VP9_HIGHBITDEPTH |
2448 | 3287 |
2449 vpx_usec_timer_start(&timer); | 3288 vpx_usec_timer_start(&timer); |
2450 | 3289 |
2451 if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags)) | 3290 if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags)) |
2452 res = -1; | 3291 res = -1; |
2453 vpx_usec_timer_mark(&timer); | 3292 vpx_usec_timer_mark(&timer); |
2454 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer); | 3293 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer); |
2455 | 3294 |
2456 if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) && | 3295 if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) && |
2457 (subsampling_x != 1 || subsampling_y != 1)) { | 3296 (subsampling_x != 1 || subsampling_y != 1)) { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2573 struct vpx_usec_timer cmptimer; | 3412 struct vpx_usec_timer cmptimer; |
2574 YV12_BUFFER_CONFIG *force_src_buffer = NULL; | 3413 YV12_BUFFER_CONFIG *force_src_buffer = NULL; |
2575 struct lookahead_entry *last_source = NULL; | 3414 struct lookahead_entry *last_source = NULL; |
2576 struct lookahead_entry *source = NULL; | 3415 struct lookahead_entry *source = NULL; |
2577 MV_REFERENCE_FRAME ref_frame; | 3416 MV_REFERENCE_FRAME ref_frame; |
2578 int arf_src_index; | 3417 int arf_src_index; |
2579 | 3418 |
2580 if (is_two_pass_svc(cpi)) { | 3419 if (is_two_pass_svc(cpi)) { |
2581 #if CONFIG_SPATIAL_SVC | 3420 #if CONFIG_SPATIAL_SVC |
2582 vp9_svc_start_frame(cpi); | 3421 vp9_svc_start_frame(cpi); |
| 3422 // Use a small empty frame instead of a real frame |
| 3423 if (cpi->svc.encode_empty_frame_state == ENCODING) |
| 3424 source = &cpi->svc.empty_frame; |
2583 #endif | 3425 #endif |
2584 if (oxcf->pass == 2) | 3426 if (oxcf->pass == 2) |
2585 vp9_restore_layer_context(cpi); | 3427 vp9_restore_layer_context(cpi); |
2586 } | 3428 } |
2587 | 3429 |
2588 vpx_usec_timer_start(&cmptimer); | 3430 vpx_usec_timer_start(&cmptimer); |
2589 | 3431 |
2590 vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); | 3432 vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); |
2591 | 3433 |
2592 // Normal defaults | 3434 // Normal defaults |
2593 cm->reset_frame_context = 0; | 3435 cm->reset_frame_context = 0; |
2594 cm->refresh_frame_context = 1; | 3436 cm->refresh_frame_context = 1; |
2595 cpi->refresh_last_frame = 1; | 3437 cpi->refresh_last_frame = 1; |
2596 cpi->refresh_golden_frame = 0; | 3438 cpi->refresh_golden_frame = 0; |
2597 cpi->refresh_alt_ref_frame = 0; | 3439 cpi->refresh_alt_ref_frame = 0; |
2598 | 3440 |
2599 // Should we encode an arf frame. | 3441 // Should we encode an arf frame. |
2600 arf_src_index = get_arf_src_index(cpi); | 3442 arf_src_index = get_arf_src_index(cpi); |
| 3443 |
| 3444 // Skip alt frame if we encode the empty frame |
| 3445 if (is_two_pass_svc(cpi) && source != NULL) |
| 3446 arf_src_index = 0; |
| 3447 |
2601 if (arf_src_index) { | 3448 if (arf_src_index) { |
2602 assert(arf_src_index <= rc->frames_to_key); | 3449 assert(arf_src_index <= rc->frames_to_key); |
2603 | 3450 |
2604 if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) { | 3451 if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) { |
2605 cpi->alt_ref_source = source; | 3452 cpi->alt_ref_source = source; |
2606 | 3453 |
2607 #if CONFIG_SPATIAL_SVC | 3454 #if CONFIG_SPATIAL_SVC |
2608 if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0) { | 3455 if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0) { |
2609 int i; | 3456 int i; |
2610 // Reference a hidden frame from a lower layer | 3457 // Reference a hidden frame from a lower layer |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2701 *size = 0; | 3548 *size = 0; |
2702 | 3549 |
2703 /* find a free buffer for the new frame, releasing the reference previously | 3550 /* find a free buffer for the new frame, releasing the reference previously |
2704 * held. | 3551 * held. |
2705 */ | 3552 */ |
2706 cm->frame_bufs[cm->new_fb_idx].ref_count--; | 3553 cm->frame_bufs[cm->new_fb_idx].ref_count--; |
2707 cm->new_fb_idx = get_free_fb(cm); | 3554 cm->new_fb_idx = get_free_fb(cm); |
2708 | 3555 |
2709 // For two pass encodes analyse the first pass stats and determine | 3556 // For two pass encodes analyse the first pass stats and determine |
2710 // the bit allocation and other parameters for this frame / group of frames. | 3557 // the bit allocation and other parameters for this frame / group of frames. |
2711 if ((oxcf->pass == 2) && (!cpi->use_svc || is_two_pass_svc(cpi))) { | 3558 if ((oxcf->pass == 2) && |
| 3559 (!cpi->use_svc || |
| 3560 (is_two_pass_svc(cpi) && |
| 3561 cpi->svc.encode_empty_frame_state != ENCODING))) { |
2712 vp9_rc_get_second_pass_params(cpi); | 3562 vp9_rc_get_second_pass_params(cpi); |
2713 } | 3563 } |
2714 | 3564 |
2715 if (!cpi->use_svc && cpi->multi_arf_allowed) { | 3565 if (!cpi->use_svc && cpi->multi_arf_allowed) { |
2716 if (cm->frame_type == KEY_FRAME) { | 3566 if (cm->frame_type == KEY_FRAME) { |
2717 init_buffer_indices(cpi); | 3567 init_buffer_indices(cpi); |
2718 } else if (oxcf->pass == 2) { | 3568 } else if (oxcf->pass == 2) { |
2719 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; | 3569 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; |
2720 cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index]; | 3570 cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index]; |
2721 } | 3571 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2753 #if CONFIG_VP9_HIGHBITDEPTH | 3603 #if CONFIG_VP9_HIGHBITDEPTH |
2754 vp9_setup_scale_factors_for_frame(&ref_buf->sf, | 3604 vp9_setup_scale_factors_for_frame(&ref_buf->sf, |
2755 buf->y_crop_width, buf->y_crop_height, | 3605 buf->y_crop_width, buf->y_crop_height, |
2756 cm->width, cm->height, | 3606 cm->width, cm->height, |
2757 (buf->flags & YV12_FLAG_HIGHBITDEPTH) ? | 3607 (buf->flags & YV12_FLAG_HIGHBITDEPTH) ? |
2758 1 : 0); | 3608 1 : 0); |
2759 #else | 3609 #else |
2760 vp9_setup_scale_factors_for_frame(&ref_buf->sf, | 3610 vp9_setup_scale_factors_for_frame(&ref_buf->sf, |
2761 buf->y_crop_width, buf->y_crop_height, | 3611 buf->y_crop_width, buf->y_crop_height, |
2762 cm->width, cm->height); | 3612 cm->width, cm->height); |
2763 #endif | 3613 #endif // CONFIG_VP9_HIGHBITDEPTH |
2764 if (vp9_is_scaled(&ref_buf->sf)) | 3614 if (vp9_is_scaled(&ref_buf->sf)) |
2765 vp9_extend_frame_borders(buf); | 3615 vp9_extend_frame_borders(buf); |
2766 } | 3616 } |
2767 | 3617 |
2768 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); | 3618 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); |
2769 | 3619 |
2770 if (oxcf->aq_mode == VARIANCE_AQ) { | 3620 if (oxcf->aq_mode == VARIANCE_AQ) { |
2771 vp9_vaq_init(); | 3621 vp9_vaq_init(); |
2772 } | 3622 } |
2773 | 3623 |
2774 if (oxcf->pass == 1 && | 3624 if (oxcf->pass == 1 && |
2775 (!cpi->use_svc || is_two_pass_svc(cpi))) { | 3625 (!cpi->use_svc || is_two_pass_svc(cpi))) { |
2776 const int lossless = is_lossless_requested(oxcf); | 3626 const int lossless = is_lossless_requested(oxcf); |
2777 #if CONFIG_VP9_HIGHBITDEPTH | 3627 #if CONFIG_VP9_HIGHBITDEPTH |
2778 if (cpi->oxcf.use_highbitdepth) | 3628 if (cpi->oxcf.use_highbitdepth) |
2779 cpi->mb.fwd_txm4x4 = lossless ? vp9_high_fwht4x4 : vp9_high_fdct4x4; | 3629 cpi->mb.fwd_txm4x4 = lossless ? vp9_highbd_fwht4x4 : vp9_highbd_fdct4x4; |
2780 else | 3630 else |
2781 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; | 3631 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; |
2782 cpi->mb.high_itxm_add = lossless ? vp9_high_iwht4x4_add : | 3632 cpi->mb.highbd_itxm_add = lossless ? vp9_highbd_iwht4x4_add : |
2783 vp9_high_idct4x4_add; | 3633 vp9_highbd_idct4x4_add; |
2784 #else | 3634 #else |
2785 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; | 3635 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; |
2786 #endif | 3636 #endif // CONFIG_VP9_HIGHBITDEPTH |
2787 cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add; | 3637 cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add; |
2788 vp9_first_pass(cpi, source); | 3638 vp9_first_pass(cpi, source); |
2789 } else if (oxcf->pass == 2 && | 3639 } else if (oxcf->pass == 2 && |
2790 (!cpi->use_svc || is_two_pass_svc(cpi))) { | 3640 (!cpi->use_svc || is_two_pass_svc(cpi))) { |
2791 Pass2Encode(cpi, size, dest, frame_flags); | 3641 Pass2Encode(cpi, size, dest, frame_flags); |
2792 } else if (cpi->use_svc) { | 3642 } else if (cpi->use_svc) { |
2793 SvcEncode(cpi, size, dest, frame_flags); | 3643 SvcEncode(cpi, size, dest, frame_flags); |
2794 } else { | 3644 } else { |
2795 // One pass encode | 3645 // One pass encode |
2796 Pass0Encode(cpi, size, dest, frame_flags); | 3646 Pass0Encode(cpi, size, dest, frame_flags); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2829 cpi->bytes += (int)(*size); | 3679 cpi->bytes += (int)(*size); |
2830 | 3680 |
2831 if (cm->show_frame) { | 3681 if (cm->show_frame) { |
2832 cpi->count++; | 3682 cpi->count++; |
2833 | 3683 |
2834 if (cpi->b_calculate_psnr) { | 3684 if (cpi->b_calculate_psnr) { |
2835 YV12_BUFFER_CONFIG *orig = cpi->Source; | 3685 YV12_BUFFER_CONFIG *orig = cpi->Source; |
2836 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show; | 3686 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show; |
2837 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer; | 3687 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer; |
2838 PSNR_STATS psnr; | 3688 PSNR_STATS psnr; |
| 3689 #if CONFIG_VP9_HIGHBITDEPTH |
| 3690 calc_highbd_psnr(orig, recon, &psnr, cpi->mb.e_mbd.bd, |
| 3691 cpi->oxcf.input_bit_depth); |
| 3692 #else |
2839 calc_psnr(orig, recon, &psnr); | 3693 calc_psnr(orig, recon, &psnr); |
| 3694 #endif // CONFIG_VP9_HIGHBITDEPTH |
2840 | 3695 |
2841 cpi->total += psnr.psnr[0]; | 3696 cpi->total += psnr.psnr[0]; |
2842 cpi->total_y += psnr.psnr[1]; | 3697 cpi->total_y += psnr.psnr[1]; |
2843 cpi->total_u += psnr.psnr[2]; | 3698 cpi->total_u += psnr.psnr[2]; |
2844 cpi->total_v += psnr.psnr[3]; | 3699 cpi->total_v += psnr.psnr[3]; |
2845 cpi->total_sq_error += psnr.sse[0]; | 3700 cpi->total_sq_error += psnr.sse[0]; |
2846 cpi->total_samples += psnr.samples[0]; | 3701 cpi->total_samples += psnr.samples[0]; |
2847 | 3702 |
2848 { | 3703 { |
2849 PSNR_STATS psnr2; | 3704 PSNR_STATS psnr2; |
2850 double frame_ssim2 = 0, weight = 0; | 3705 double frame_ssim2 = 0, weight = 0; |
2851 #if CONFIG_VP9_POSTPROC | 3706 #if CONFIG_VP9_POSTPROC |
2852 // TODO(agrange) Add resizing of post-proc buffer in here when the | 3707 // TODO(agrange) Add resizing of post-proc buffer in here when the |
2853 // encoder is changed to use on-demand buffer allocation. | 3708 // encoder is changed to use on-demand buffer allocation. |
2854 vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer, | 3709 vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer, |
2855 cm->lf.filter_level * 10 / 6); | 3710 cm->lf.filter_level * 10 / 6); |
2856 #endif | 3711 #endif |
2857 vp9_clear_system_state(); | 3712 vp9_clear_system_state(); |
2858 | 3713 |
| 3714 #if CONFIG_VP9_HIGHBITDEPTH |
| 3715 calc_highbd_psnr(orig, pp, &psnr, cpi->mb.e_mbd.bd, |
| 3716 cpi->oxcf.input_bit_depth); |
| 3717 #else |
2859 calc_psnr(orig, pp, &psnr2); | 3718 calc_psnr(orig, pp, &psnr2); |
| 3719 #endif // CONFIG_VP9_HIGHBITDEPTH |
2860 | 3720 |
2861 cpi->totalp += psnr2.psnr[0]; | 3721 cpi->totalp += psnr2.psnr[0]; |
2862 cpi->totalp_y += psnr2.psnr[1]; | 3722 cpi->totalp_y += psnr2.psnr[1]; |
2863 cpi->totalp_u += psnr2.psnr[2]; | 3723 cpi->totalp_u += psnr2.psnr[2]; |
2864 cpi->totalp_v += psnr2.psnr[3]; | 3724 cpi->totalp_v += psnr2.psnr[3]; |
2865 cpi->totalp_sq_error += psnr2.sse[0]; | 3725 cpi->totalp_sq_error += psnr2.sse[0]; |
2866 cpi->totalp_samples += psnr2.samples[0]; | 3726 cpi->totalp_samples += psnr2.samples[0]; |
2867 | 3727 |
| 3728 #if CONFIG_VP9_HIGHBITDEPTH |
| 3729 if (cm->use_highbitdepth) { |
| 3730 frame_ssim2 = vp9_highbd_calc_ssim(orig, recon, &weight, xd->bd); |
| 3731 } else { |
| 3732 frame_ssim2 = vp9_calc_ssim(orig, recon, &weight); |
| 3733 } |
| 3734 #else |
2868 frame_ssim2 = vp9_calc_ssim(orig, recon, &weight); | 3735 frame_ssim2 = vp9_calc_ssim(orig, recon, &weight); |
| 3736 #endif // CONFIG_VP9_HIGHBITDEPTH |
2869 | 3737 |
2870 cpi->summed_quality += frame_ssim2 * weight; | 3738 cpi->summed_quality += frame_ssim2 * weight; |
2871 cpi->summed_weights += weight; | 3739 cpi->summed_weights += weight; |
2872 | 3740 |
| 3741 #if CONFIG_VP9_HIGHBITDEPTH |
| 3742 if (cm->use_highbitdepth) { |
| 3743 frame_ssim2 = vp9_highbd_calc_ssim( |
| 3744 orig, &cm->post_proc_buffer, &weight, xd->bd); |
| 3745 } else { |
| 3746 frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, &weight); |
| 3747 } |
| 3748 #else |
2873 frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, &weight); | 3749 frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, &weight); |
| 3750 #endif // CONFIG_VP9_HIGHBITDEPTH |
2874 | 3751 |
2875 cpi->summedp_quality += frame_ssim2 * weight; | 3752 cpi->summedp_quality += frame_ssim2 * weight; |
2876 cpi->summedp_weights += weight; | 3753 cpi->summedp_weights += weight; |
2877 #if 0 | 3754 #if 0 |
2878 { | 3755 { |
2879 FILE *f = fopen("q_used.stt", "a"); | 3756 FILE *f = fopen("q_used.stt", "a"); |
2880 fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n", | 3757 fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n", |
2881 cpi->common.current_video_frame, y2, u2, v2, | 3758 cpi->common.current_video_frame, y2, u2, v2, |
2882 frame_psnr2, frame_ssim2); | 3759 frame_psnr2, frame_ssim2); |
2883 fclose(f); | 3760 fclose(f); |
2884 } | 3761 } |
2885 #endif | 3762 #endif |
2886 } | 3763 } |
2887 } | 3764 } |
2888 | 3765 |
2889 | 3766 |
2890 if (cpi->b_calculate_ssimg) { | 3767 if (cpi->b_calculate_ssimg) { |
2891 double y, u, v, frame_all; | 3768 double y, u, v, frame_all; |
| 3769 #if CONFIG_VP9_HIGHBITDEPTH |
| 3770 if (cm->use_highbitdepth) { |
| 3771 frame_all = vp9_highbd_calc_ssimg(cpi->Source, cm->frame_to_show, &y, |
| 3772 &u, &v, xd->bd); |
| 3773 } else { |
| 3774 frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, |
| 3775 &v); |
| 3776 } |
| 3777 #else |
2892 frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v); | 3778 frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v); |
| 3779 #endif // CONFIG_VP9_HIGHBITDEPTH |
2893 cpi->total_ssimg_y += y; | 3780 cpi->total_ssimg_y += y; |
2894 cpi->total_ssimg_u += u; | 3781 cpi->total_ssimg_u += u; |
2895 cpi->total_ssimg_v += v; | 3782 cpi->total_ssimg_v += v; |
2896 cpi->total_ssimg_all += frame_all; | 3783 cpi->total_ssimg_all += frame_all; |
2897 } | 3784 } |
2898 } | 3785 } |
2899 } | 3786 } |
2900 | 3787 |
2901 #endif | 3788 #endif |
2902 | 3789 |
2903 if (is_two_pass_svc(cpi) && cm->show_frame) { | 3790 if (is_two_pass_svc(cpi)) { |
2904 ++cpi->svc.spatial_layer_to_encode; | 3791 if (cpi->svc.encode_empty_frame_state == ENCODING) |
2905 if (cpi->svc.spatial_layer_to_encode >= cpi->svc.number_spatial_layers) | 3792 cpi->svc.encode_empty_frame_state = ENCODED; |
2906 cpi->svc.spatial_layer_to_encode = 0; | 3793 |
| 3794 if (cm->show_frame) { |
| 3795 ++cpi->svc.spatial_layer_to_encode; |
| 3796 if (cpi->svc.spatial_layer_to_encode >= cpi->svc.number_spatial_layers) |
| 3797 cpi->svc.spatial_layer_to_encode = 0; |
| 3798 |
| 3799 // May need the empty frame after an visible frame. |
| 3800 cpi->svc.encode_empty_frame_state = NEED_TO_ENCODE; |
| 3801 } |
2907 } | 3802 } |
2908 return 0; | 3803 return 0; |
2909 } | 3804 } |
2910 | 3805 |
2911 int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest, | 3806 int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest, |
2912 vp9_ppflags_t *flags) { | 3807 vp9_ppflags_t *flags) { |
2913 VP9_COMMON *cm = &cpi->common; | 3808 VP9_COMMON *cm = &cpi->common; |
2914 #if !CONFIG_VP9_POSTPROC | 3809 #if !CONFIG_VP9_POSTPROC |
2915 (void)flags; | 3810 (void)flags; |
2916 #endif | 3811 #endif |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2979 assert(cm->height <= cpi->initial_height); | 3874 assert(cm->height <= cpi->initial_height); |
2980 | 3875 |
2981 update_frame_size(cpi); | 3876 update_frame_size(cpi); |
2982 | 3877 |
2983 return 0; | 3878 return 0; |
2984 } | 3879 } |
2985 | 3880 |
2986 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, | 3881 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, |
2987 unsigned int height) { | 3882 unsigned int height) { |
2988 VP9_COMMON *cm = &cpi->common; | 3883 VP9_COMMON *cm = &cpi->common; |
2989 | 3884 #if CONFIG_VP9_HIGHBITDEPTH |
| 3885 check_initial_width(cpi, 1, 1, cm->use_highbitdepth); |
| 3886 #else |
2990 check_initial_width(cpi, 1, 1); | 3887 check_initial_width(cpi, 1, 1); |
| 3888 #endif // CONFIG_VP9_HIGHBITDEPTH |
2991 | 3889 |
2992 if (width) { | 3890 if (width) { |
2993 cm->width = width; | 3891 cm->width = width; |
2994 if (cm->width * 5 < cpi->initial_width) { | |
2995 cm->width = cpi->initial_width / 5 + 1; | |
2996 printf("Warning: Desired width too small, changed to %d\n", cm->width); | |
2997 } | |
2998 if (cm->width > cpi->initial_width) { | 3892 if (cm->width > cpi->initial_width) { |
2999 cm->width = cpi->initial_width; | 3893 cm->width = cpi->initial_width; |
3000 printf("Warning: Desired width too large, changed to %d\n", cm->width); | 3894 printf("Warning: Desired width too large, changed to %d\n", cm->width); |
3001 } | 3895 } |
3002 } | 3896 } |
3003 | 3897 |
3004 if (height) { | 3898 if (height) { |
3005 cm->height = height; | 3899 cm->height = height; |
3006 if (cm->height * 5 < cpi->initial_height) { | |
3007 cm->height = cpi->initial_height / 5 + 1; | |
3008 printf("Warning: Desired height too small, changed to %d\n", cm->height); | |
3009 } | |
3010 if (cm->height > cpi->initial_height) { | 3900 if (cm->height > cpi->initial_height) { |
3011 cm->height = cpi->initial_height; | 3901 cm->height = cpi->initial_height; |
3012 printf("Warning: Desired height too large, changed to %d\n", cm->height); | 3902 printf("Warning: Desired height too large, changed to %d\n", cm->height); |
3013 } | 3903 } |
3014 } | 3904 } |
3015 assert(cm->width <= cpi->initial_width); | 3905 assert(cm->width <= cpi->initial_width); |
3016 assert(cm->height <= cpi->initial_height); | 3906 assert(cm->height <= cpi->initial_height); |
3017 | 3907 |
3018 update_frame_size(cpi); | 3908 update_frame_size(cpi); |
3019 | 3909 |
3020 return 0; | 3910 return 0; |
3021 } | 3911 } |
3022 | 3912 |
3023 void vp9_set_svc(VP9_COMP *cpi, int use_svc) { | 3913 void vp9_set_svc(VP9_COMP *cpi, int use_svc) { |
3024 cpi->use_svc = use_svc; | 3914 cpi->use_svc = use_svc; |
3025 return; | 3915 return; |
3026 } | 3916 } |
3027 | 3917 |
3028 int vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b) { | 3918 int vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b) { |
3029 assert(a->y_crop_width == b->y_crop_width); | 3919 assert(a->y_crop_width == b->y_crop_width); |
3030 assert(a->y_crop_height == b->y_crop_height); | 3920 assert(a->y_crop_height == b->y_crop_height); |
3031 | 3921 |
3032 return (int)get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, | 3922 return (int)get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, |
3033 a->y_crop_width, a->y_crop_height); | 3923 a->y_crop_width, a->y_crop_height); |
3034 } | 3924 } |
3035 | 3925 |
| 3926 #if CONFIG_VP9_HIGHBITDEPTH |
| 3927 int vp9_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a, |
| 3928 const YV12_BUFFER_CONFIG *b, |
| 3929 vpx_bit_depth_t bit_depth) { |
| 3930 unsigned int sse; |
| 3931 int sum; |
| 3932 assert(a->y_crop_width == b->y_crop_width); |
| 3933 assert(a->y_crop_height == b->y_crop_height); |
| 3934 assert((a->flags & YV12_FLAG_HIGHBITDEPTH) != 0); |
| 3935 assert((b->flags & YV12_FLAG_HIGHBITDEPTH) != 0); |
| 3936 switch (bit_depth) { |
| 3937 case VPX_BITS_8: |
| 3938 highbd_variance(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, |
| 3939 a->y_crop_width, a->y_crop_height, &sse, &sum); |
| 3940 return (int) sse; |
| 3941 case VPX_BITS_10: |
| 3942 highbd_10_variance(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, |
| 3943 a->y_crop_width, a->y_crop_height, &sse, &sum); |
| 3944 return (int) sse; |
| 3945 case VPX_BITS_12: |
| 3946 highbd_12_variance(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride, |
| 3947 a->y_crop_width, a->y_crop_height, &sse, &sum); |
| 3948 return (int) sse; |
| 3949 default: |
| 3950 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); |
| 3951 return -1; |
| 3952 } |
| 3953 } |
| 3954 #endif // CONFIG_VP9_HIGHBITDEPTH |
3036 | 3955 |
3037 int vp9_get_quantizer(VP9_COMP *cpi) { | 3956 int vp9_get_quantizer(VP9_COMP *cpi) { |
3038 return cpi->common.base_qindex; | 3957 return cpi->common.base_qindex; |
3039 } | 3958 } |
3040 | 3959 |
3041 void vp9_apply_encoding_flags(VP9_COMP *cpi, vpx_enc_frame_flags_t flags) { | 3960 void vp9_apply_encoding_flags(VP9_COMP *cpi, vpx_enc_frame_flags_t flags) { |
3042 if (flags & (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF | | 3961 if (flags & (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF | |
3043 VP8_EFLAG_NO_REF_ARF)) { | 3962 VP8_EFLAG_NO_REF_ARF)) { |
3044 int ref = 7; | 3963 int ref = 7; |
3045 | 3964 |
(...skipping 23 matching lines...) Expand all Loading... |
3069 if (flags & VP8_EFLAG_NO_UPD_ARF) | 3988 if (flags & VP8_EFLAG_NO_UPD_ARF) |
3070 upd ^= VP9_ALT_FLAG; | 3989 upd ^= VP9_ALT_FLAG; |
3071 | 3990 |
3072 vp9_update_reference(cpi, upd); | 3991 vp9_update_reference(cpi, upd); |
3073 } | 3992 } |
3074 | 3993 |
3075 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) { | 3994 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) { |
3076 vp9_update_entropy(cpi, 0); | 3995 vp9_update_entropy(cpi, 0); |
3077 } | 3996 } |
3078 } | 3997 } |
OLD | NEW |