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 |
11 | 11 |
12 #include "vpx_config.h" | 12 #include "vpx_config.h" |
13 #include "./vpx_scale_rtcd.h" | 13 #include "./vpx_scale_rtcd.h" |
14 #include "./vpx_dsp_rtcd.h" | 14 #include "./vpx_dsp_rtcd.h" |
15 #include "./vp8_rtcd.h" | 15 #include "./vp8_rtcd.h" |
16 #include "vp8/common/onyxc_int.h" | 16 #include "vp8/common/onyxc_int.h" |
17 #include "vp8/common/blockd.h" | 17 #include "vp8/common/blockd.h" |
18 #include "onyx_int.h" | 18 #include "onyx_int.h" |
19 #include "vp8/common/systemdependent.h" | 19 #include "vp8/common/systemdependent.h" |
20 #include "quantize.h" | 20 #include "vp8/encoder/quantize.h" |
21 #include "vp8/common/alloccommon.h" | 21 #include "vp8/common/alloccommon.h" |
22 #include "mcomp.h" | 22 #include "mcomp.h" |
23 #include "firstpass.h" | 23 #include "firstpass.h" |
24 #include "vpx/internal/vpx_psnr.h" | 24 #include "vpx/internal/vpx_psnr.h" |
25 #include "vpx_scale/vpx_scale.h" | 25 #include "vpx_scale/vpx_scale.h" |
26 #include "vp8/common/extend.h" | 26 #include "vp8/common/extend.h" |
27 #include "ratectrl.h" | 27 #include "ratectrl.h" |
28 #include "vp8/common/quant_common.h" | 28 #include "vp8/common/quant_common.h" |
29 #include "segmentation.h" | 29 #include "segmentation.h" |
30 #if CONFIG_POSTPROC | 30 #if CONFIG_POSTPROC |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest); | 67 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest); |
68 | 68 |
69 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance); | 69 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance); |
70 | 70 |
71 static void set_default_lf_deltas(VP8_COMP *cpi); | 71 static void set_default_lf_deltas(VP8_COMP *cpi); |
72 | 72 |
73 extern const int vp8_gf_interval_table[101]; | 73 extern const int vp8_gf_interval_table[101]; |
74 | 74 |
75 #if CONFIG_INTERNAL_STATS | 75 #if CONFIG_INTERNAL_STATS |
76 #include "math.h" | 76 #include "math.h" |
77 | 77 #include "vpx_dsp/ssim.h" |
78 extern double vp8_calc_ssim | |
79 ( | |
80 YV12_BUFFER_CONFIG *source, | |
81 YV12_BUFFER_CONFIG *dest, | |
82 int lumamask, | |
83 double *weight | |
84 ); | |
85 | |
86 | |
87 extern double vp8_calc_ssimg | |
88 ( | |
89 YV12_BUFFER_CONFIG *source, | |
90 YV12_BUFFER_CONFIG *dest, | |
91 double *ssim_y, | |
92 double *ssim_u, | |
93 double *ssim_v | |
94 ); | |
95 | |
96 | |
97 #endif | 78 #endif |
98 | 79 |
99 | 80 |
100 #ifdef OUTPUT_YUV_SRC | 81 #ifdef OUTPUT_YUV_SRC |
101 FILE *yuv_file; | 82 FILE *yuv_file; |
102 #endif | 83 #endif |
103 #ifdef OUTPUT_YUV_DENOISED | 84 #ifdef OUTPUT_YUV_DENOISED |
104 FILE *yuv_denoised_file; | 85 FILE *yuv_denoised_file; |
105 #endif | 86 #endif |
106 | 87 |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 * abs_delta = SEGMENT_ABSDATA (use the absolute values given). | 509 * abs_delta = SEGMENT_ABSDATA (use the absolute values given). |
529 * | 510 * |
530 */ | 511 */ |
531 static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned
char abs_delta) | 512 static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned
char abs_delta) |
532 { | 513 { |
533 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta; | 514 cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta; |
534 memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_
data)); | 515 memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_
data)); |
535 } | 516 } |
536 | 517 |
537 | 518 |
538 static void segmentation_test_function(VP8_COMP *cpi) | |
539 { | |
540 unsigned char *seg_map; | |
541 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS]; | |
542 | |
543 // Create a temporary map for segmentation data. | |
544 CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_col
s, 1)); | |
545 | |
546 // Set the segmentation Map | |
547 set_segmentation_map(cpi, seg_map); | |
548 | |
549 // Activate segmentation. | |
550 enable_segmentation(cpi); | |
551 | |
552 // Set up the quant segment data | |
553 feature_data[MB_LVL_ALT_Q][0] = 0; | |
554 feature_data[MB_LVL_ALT_Q][1] = 4; | |
555 feature_data[MB_LVL_ALT_Q][2] = 0; | |
556 feature_data[MB_LVL_ALT_Q][3] = 0; | |
557 // Set up the loop segment data | |
558 feature_data[MB_LVL_ALT_LF][0] = 0; | |
559 feature_data[MB_LVL_ALT_LF][1] = 0; | |
560 feature_data[MB_LVL_ALT_LF][2] = 0; | |
561 feature_data[MB_LVL_ALT_LF][3] = 0; | |
562 | |
563 // Initialise the feature data structure | |
564 // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1 | |
565 set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA); | |
566 | |
567 // Delete sementation map | |
568 vpx_free(seg_map); | |
569 | |
570 seg_map = 0; | |
571 } | |
572 | |
573 /* A simple function to cyclically refresh the background at a lower Q */ | 519 /* A simple function to cyclically refresh the background at a lower Q */ |
574 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment) | 520 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment) |
575 { | 521 { |
576 unsigned char *seg_map = cpi->segmentation_map; | 522 unsigned char *seg_map = cpi->segmentation_map; |
577 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS]; | 523 signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS]; |
578 int i; | 524 int i; |
579 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe; | 525 int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe; |
580 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols; | 526 int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols; |
581 | 527 |
582 cpi->cyclic_refresh_q = Q / 2; | 528 cpi->cyclic_refresh_q = Q / 2; |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 cpi->mode_check_freq[THR_NEW3] = speed_map(Speed, | 871 cpi->mode_check_freq[THR_NEW3] = speed_map(Speed, |
926 mode_check_freq_map_new2); | 872 mode_check_freq_map_new2); |
927 cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed, | 873 cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed, |
928 mode_check_freq_map_split1); | 874 mode_check_freq_map_split1); |
929 cpi->mode_check_freq[THR_SPLIT2] = | 875 cpi->mode_check_freq[THR_SPLIT2] = |
930 cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed, | 876 cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed, |
931 mode_check_freq_map_split2); | 877 mode_check_freq_map_split2); |
932 Speed = cpi->Speed; | 878 Speed = cpi->Speed; |
933 switch (Mode) | 879 switch (Mode) |
934 { | 880 { |
935 #if !(CONFIG_REALTIME_ONLY) | 881 #if !CONFIG_REALTIME_ONLY |
936 case 0: /* best quality mode */ | 882 case 0: /* best quality mode */ |
937 sf->first_step = 0; | 883 sf->first_step = 0; |
938 sf->max_step_search_steps = MAX_MVSEARCH_STEPS; | 884 sf->max_step_search_steps = MAX_MVSEARCH_STEPS; |
939 break; | 885 break; |
940 case 1: | 886 case 1: |
941 case 3: | 887 case 3: |
942 if (Speed > 0) | 888 if (Speed > 0) |
943 { | 889 { |
944 /* Disable coefficient optimization above speed 0 */ | 890 /* Disable coefficient optimization above speed 0 */ |
945 sf->optimize_coefficients = 0; | 891 sf->optimize_coefficients = 0; |
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2077 yuv_denoised_file = fopen("denoised.yuv", "ab"); | 2023 yuv_denoised_file = fopen("denoised.yuv", "ab"); |
2078 #endif | 2024 #endif |
2079 | 2025 |
2080 #if 0 | 2026 #if 0 |
2081 framepsnr = fopen("framepsnr.stt", "a"); | 2027 framepsnr = fopen("framepsnr.stt", "a"); |
2082 kf_list = fopen("kf_list.stt", "w"); | 2028 kf_list = fopen("kf_list.stt", "w"); |
2083 #endif | 2029 #endif |
2084 | 2030 |
2085 cpi->output_pkt_list = oxcf->output_pkt_list; | 2031 cpi->output_pkt_list = oxcf->output_pkt_list; |
2086 | 2032 |
2087 #if !(CONFIG_REALTIME_ONLY) | 2033 #if !CONFIG_REALTIME_ONLY |
2088 | 2034 |
2089 if (cpi->pass == 1) | 2035 if (cpi->pass == 1) |
2090 { | 2036 { |
2091 vp8_init_first_pass(cpi); | 2037 vp8_init_first_pass(cpi); |
2092 } | 2038 } |
2093 else if (cpi->pass == 2) | 2039 else if (cpi->pass == 2) |
2094 { | 2040 { |
2095 size_t packet_sz = sizeof(FIRSTPASS_STATS); | 2041 size_t packet_sz = sizeof(FIRSTPASS_STATS); |
2096 int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz); | 2042 int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz); |
2097 | 2043 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2239 | 2185 |
2240 void vp8_remove_compressor(VP8_COMP **ptr) | 2186 void vp8_remove_compressor(VP8_COMP **ptr) |
2241 { | 2187 { |
2242 VP8_COMP *cpi = *ptr; | 2188 VP8_COMP *cpi = *ptr; |
2243 | 2189 |
2244 if (!cpi) | 2190 if (!cpi) |
2245 return; | 2191 return; |
2246 | 2192 |
2247 if (cpi && (cpi->common.current_video_frame > 0)) | 2193 if (cpi && (cpi->common.current_video_frame > 0)) |
2248 { | 2194 { |
2249 #if !(CONFIG_REALTIME_ONLY) | 2195 #if !CONFIG_REALTIME_ONLY |
2250 | 2196 |
2251 if (cpi->pass == 2) | 2197 if (cpi->pass == 2) |
2252 { | 2198 { |
2253 vp8_end_second_pass(cpi); | 2199 vp8_end_second_pass(cpi); |
2254 } | 2200 } |
2255 | 2201 |
2256 #endif | 2202 #endif |
2257 | 2203 |
2258 #ifdef VP8_ENTROPY_STATS | 2204 #ifdef VP8_ENTROPY_STATS |
2259 print_context_counters(); | 2205 print_context_counters(); |
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3030 | 2976 |
3031 if (cpi->prob_gf_coded < 10) | 2977 if (cpi->prob_gf_coded < 10) |
3032 cpi->prob_gf_coded = 10; | 2978 cpi->prob_gf_coded = 10; |
3033 } | 2979 } |
3034 if (!cpi->source_alt_ref_active) | 2980 if (!cpi->source_alt_ref_active) |
3035 cpi->prob_gf_coded = 255; | 2981 cpi->prob_gf_coded = 255; |
3036 } | 2982 } |
3037 } | 2983 } |
3038 | 2984 |
3039 | 2985 |
| 2986 #if !CONFIG_REALTIME_ONLY |
3040 /* 1 = key, 0 = inter */ | 2987 /* 1 = key, 0 = inter */ |
3041 static int decide_key_frame(VP8_COMP *cpi) | 2988 static int decide_key_frame(VP8_COMP *cpi) |
3042 { | 2989 { |
3043 VP8_COMMON *cm = &cpi->common; | 2990 VP8_COMMON *cm = &cpi->common; |
3044 | 2991 |
3045 int code_key_frame = 0; | 2992 int code_key_frame = 0; |
3046 | 2993 |
3047 cpi->kf_boost = 0; | 2994 cpi->kf_boost = 0; |
3048 | 2995 |
3049 if (cpi->Speed > 11) | 2996 if (cpi->Speed > 11) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3097 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra +
10)))) | 3044 (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra +
10)))) |
3098 { | 3045 { |
3099 if (!cm->refresh_golden_frame) | 3046 if (!cm->refresh_golden_frame) |
3100 code_key_frame = 1; | 3047 code_key_frame = 1; |
3101 } | 3048 } |
3102 | 3049 |
3103 return code_key_frame; | 3050 return code_key_frame; |
3104 | 3051 |
3105 } | 3052 } |
3106 | 3053 |
3107 #if !(CONFIG_REALTIME_ONLY) | |
3108 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest,
unsigned int *frame_flags) | 3054 static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest,
unsigned int *frame_flags) |
3109 { | 3055 { |
3110 (void) size; | 3056 (void) size; |
3111 (void) dest; | 3057 (void) dest; |
3112 (void) frame_flags; | 3058 (void) frame_flags; |
3113 vp8_set_quantizer(cpi, 26); | 3059 vp8_set_quantizer(cpi, 26); |
3114 | 3060 |
3115 vp8_first_pass(cpi); | 3061 vp8_first_pass(cpi); |
3116 } | 3062 } |
3117 #endif | 3063 #endif |
(...skipping 25 matching lines...) Expand all Loading... |
3143 yframe = fopen(filename, "wb"); | 3089 yframe = fopen(filename, "wb"); |
3144 | 3090 |
3145 for (i = 0; i < frame->uv_height; i++) | 3091 for (i = 0; i < frame->uv_height; i++) |
3146 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yfram
e); | 3092 fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yfram
e); |
3147 | 3093 |
3148 fclose(yframe); | 3094 fclose(yframe); |
3149 } | 3095 } |
3150 #endif | 3096 #endif |
3151 /* return of 0 means drop frame */ | 3097 /* return of 0 means drop frame */ |
3152 | 3098 |
| 3099 #if !CONFIG_REALTIME_ONLY |
3153 /* Function to test for conditions that indeicate we should loop | 3100 /* Function to test for conditions that indeicate we should loop |
3154 * back and recode a frame. | 3101 * back and recode a frame. |
3155 */ | 3102 */ |
3156 static int recode_loop_test( VP8_COMP *cpi, | 3103 static int recode_loop_test( VP8_COMP *cpi, |
3157 int high_limit, int low_limit, | 3104 int high_limit, int low_limit, |
3158 int q, int maxq, int minq ) | 3105 int q, int maxq, int minq ) |
3159 { | 3106 { |
3160 int force_recode = 0; | 3107 int force_recode = 0; |
3161 VP8_COMMON *cm = &cpi->common; | 3108 VP8_COMMON *cm = &cpi->common; |
3162 | 3109 |
(...skipping 29 matching lines...) Expand all Loading... |
3192 (cpi->active_best_quality > cpi->oxcf.cq_level)) | 3139 (cpi->active_best_quality > cpi->oxcf.cq_level)) |
3193 { | 3140 { |
3194 force_recode = 1; | 3141 force_recode = 1; |
3195 cpi->active_best_quality = cpi->oxcf.cq_level; | 3142 cpi->active_best_quality = cpi->oxcf.cq_level; |
3196 } | 3143 } |
3197 } | 3144 } |
3198 } | 3145 } |
3199 | 3146 |
3200 return force_recode; | 3147 return force_recode; |
3201 } | 3148 } |
| 3149 #endif // !CONFIG_REALTIME_ONLY |
3202 | 3150 |
3203 static void update_reference_frames(VP8_COMP *cpi) | 3151 static void update_reference_frames(VP8_COMP *cpi) |
3204 { | 3152 { |
3205 VP8_COMMON *cm = &cpi->common; | 3153 VP8_COMMON *cm = &cpi->common; |
3206 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb; | 3154 YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb; |
3207 | 3155 |
3208 /* At this point the new frame has been encoded. | 3156 /* At this point the new frame has been encoded. |
3209 * If any buffer copy / swapping is signaled it should be done here. | 3157 * If any buffer copy / swapping is signaled it should be done here. |
3210 */ | 3158 */ |
3211 | 3159 |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3613 int Q; | 3561 int Q; |
3614 int frame_over_shoot_limit; | 3562 int frame_over_shoot_limit; |
3615 int frame_under_shoot_limit; | 3563 int frame_under_shoot_limit; |
3616 | 3564 |
3617 int Loop = 0; | 3565 int Loop = 0; |
3618 int loop_count; | 3566 int loop_count; |
3619 | 3567 |
3620 VP8_COMMON *cm = &cpi->common; | 3568 VP8_COMMON *cm = &cpi->common; |
3621 int active_worst_qchanged = 0; | 3569 int active_worst_qchanged = 0; |
3622 | 3570 |
3623 #if !(CONFIG_REALTIME_ONLY) | 3571 #if !CONFIG_REALTIME_ONLY |
3624 int q_low; | 3572 int q_low; |
3625 int q_high; | 3573 int q_high; |
3626 int zbin_oq_high; | 3574 int zbin_oq_high; |
3627 int zbin_oq_low = 0; | 3575 int zbin_oq_low = 0; |
3628 int top_index; | 3576 int top_index; |
3629 int bottom_index; | 3577 int bottom_index; |
3630 int overshoot_seen = 0; | 3578 int overshoot_seen = 0; |
3631 int undershoot_seen = 0; | 3579 int undershoot_seen = 0; |
3632 #endif | 3580 #endif |
3633 | 3581 |
(...skipping 18 matching lines...) Expand all Loading... |
3652 | 3600 |
3653 if(cpi->force_next_frame_intra) | 3601 if(cpi->force_next_frame_intra) |
3654 { | 3602 { |
3655 cm->frame_type = KEY_FRAME; /* delayed intra frame */ | 3603 cm->frame_type = KEY_FRAME; /* delayed intra frame */ |
3656 cpi->force_next_frame_intra = 0; | 3604 cpi->force_next_frame_intra = 0; |
3657 } | 3605 } |
3658 | 3606 |
3659 /* For an alt ref frame in 2 pass we skip the call to the second pass | 3607 /* For an alt ref frame in 2 pass we skip the call to the second pass |
3660 * function that sets the target bandwidth | 3608 * function that sets the target bandwidth |
3661 */ | 3609 */ |
3662 #if !(CONFIG_REALTIME_ONLY) | 3610 #if !CONFIG_REALTIME_ONLY |
3663 | 3611 |
3664 if (cpi->pass == 2) | 3612 if (cpi->pass == 2) |
3665 { | 3613 { |
3666 if (cpi->common.refresh_alt_ref_frame) | 3614 if (cpi->common.refresh_alt_ref_frame) |
3667 { | 3615 { |
3668 /* Per frame bit target for the alt ref frame */ | 3616 /* Per frame bit target for the alt ref frame */ |
3669 cpi->per_frame_bandwidth = cpi->twopass.gf_bits; | 3617 cpi->per_frame_bandwidth = cpi->twopass.gf_bits; |
3670 /* per second target bitrate */ | 3618 /* per second target bitrate */ |
3671 cpi->target_bandwidth = (int)(cpi->twopass.gf_bits * | 3619 cpi->target_bandwidth = (int)(cpi->twopass.gf_bits * |
3672 cpi->output_framerate); | 3620 cpi->output_framerate); |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4161 | 4109 |
4162 if (cpi->active_best_quality < cpi->best_quality) | 4110 if (cpi->active_best_quality < cpi->best_quality) |
4163 cpi->active_best_quality = cpi->best_quality; | 4111 cpi->active_best_quality = cpi->best_quality; |
4164 | 4112 |
4165 if ( cpi->active_worst_quality < cpi->active_best_quality ) | 4113 if ( cpi->active_worst_quality < cpi->active_best_quality ) |
4166 cpi->active_worst_quality = cpi->active_best_quality; | 4114 cpi->active_worst_quality = cpi->active_best_quality; |
4167 | 4115 |
4168 /* Determine initial Q to try */ | 4116 /* Determine initial Q to try */ |
4169 Q = vp8_regulate_q(cpi, cpi->this_frame_target); | 4117 Q = vp8_regulate_q(cpi, cpi->this_frame_target); |
4170 | 4118 |
4171 #if !(CONFIG_REALTIME_ONLY) | 4119 #if !CONFIG_REALTIME_ONLY |
4172 | 4120 |
4173 /* Set highest allowed value for Zbin over quant */ | 4121 /* Set highest allowed value for Zbin over quant */ |
4174 if (cm->frame_type == KEY_FRAME) | 4122 if (cm->frame_type == KEY_FRAME) |
4175 zbin_oq_high = 0; | 4123 zbin_oq_high = 0; |
4176 else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame || | 4124 else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame || |
4177 (cm->refresh_golden_frame && !cpi->source_alt_ref_active)))) | 4125 (cm->refresh_golden_frame && !cpi->source_alt_ref_active)))) |
4178 { | 4126 { |
4179 zbin_oq_high = 16; | 4127 zbin_oq_high = 16; |
4180 } | 4128 } |
4181 else | 4129 else |
4182 zbin_oq_high = ZBIN_OQ_MAX; | 4130 zbin_oq_high = ZBIN_OQ_MAX; |
4183 #endif | 4131 #endif |
4184 | 4132 |
4185 /* Setup background Q adjustment for error resilient mode. | 4133 /* Setup background Q adjustment for error resilient mode. |
4186 * For multi-layer encodes only enable this for the base layer. | 4134 * For multi-layer encodes only enable this for the base layer. |
4187 */ | 4135 */ |
4188 if (cpi->cyclic_refresh_mode_enabled) | 4136 if (cpi->cyclic_refresh_mode_enabled) |
4189 { | 4137 { |
4190 // Special case for screen_content_mode with golden frame updates. | 4138 // Special case for screen_content_mode with golden frame updates. |
4191 int disable_cr_gf = (cpi->oxcf.screen_content_mode == 2 && | 4139 int disable_cr_gf = (cpi->oxcf.screen_content_mode == 2 && |
4192 cm->refresh_golden_frame); | 4140 cm->refresh_golden_frame); |
4193 if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf) | 4141 if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf) |
4194 cyclic_background_refresh(cpi, Q, 0); | 4142 cyclic_background_refresh(cpi, Q, 0); |
4195 else | 4143 else |
4196 disable_segmentation(cpi); | 4144 disable_segmentation(cpi); |
4197 } | 4145 } |
4198 | 4146 |
4199 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_sho
ot_limit); | 4147 vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_sho
ot_limit); |
4200 | 4148 |
4201 #if !(CONFIG_REALTIME_ONLY) | 4149 #if !CONFIG_REALTIME_ONLY |
4202 /* Limit Q range for the adaptive loop. */ | 4150 /* Limit Q range for the adaptive loop. */ |
4203 bottom_index = cpi->active_best_quality; | 4151 bottom_index = cpi->active_best_quality; |
4204 top_index = cpi->active_worst_quality; | 4152 top_index = cpi->active_worst_quality; |
4205 q_low = cpi->active_best_quality; | 4153 q_low = cpi->active_best_quality; |
4206 q_high = cpi->active_worst_quality; | 4154 q_high = cpi->active_worst_quality; |
4207 #endif | 4155 #endif |
4208 | 4156 |
4209 vp8_save_coding_context(cpi); | 4157 vp8_save_coding_context(cpi); |
4210 | 4158 |
4211 loop_count = 0; | 4159 loop_count = 0; |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4422 #endif | 4370 #endif |
4423 vp8_clear_system_state(); | 4371 vp8_clear_system_state(); |
4424 | 4372 |
4425 /* Test to see if the stats generated for this frame indicate that | 4373 /* Test to see if the stats generated for this frame indicate that |
4426 * we should have coded a key frame (assuming that we didn't)! | 4374 * we should have coded a key frame (assuming that we didn't)! |
4427 */ | 4375 */ |
4428 | 4376 |
4429 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME | 4377 if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME |
4430 && cpi->compressor_speed != 2) | 4378 && cpi->compressor_speed != 2) |
4431 { | 4379 { |
4432 #if !(CONFIG_REALTIME_ONLY) | 4380 #if !CONFIG_REALTIME_ONLY |
4433 if (decide_key_frame(cpi)) | 4381 if (decide_key_frame(cpi)) |
4434 { | 4382 { |
4435 /* Reset all our sizing numbers and recode */ | 4383 /* Reset all our sizing numbers and recode */ |
4436 cm->frame_type = KEY_FRAME; | 4384 cm->frame_type = KEY_FRAME; |
4437 | 4385 |
4438 vp8_pick_frame_size(cpi); | 4386 vp8_pick_frame_size(cpi); |
4439 | 4387 |
4440 /* Clear the Alt reference frame active flag when we have | 4388 /* Clear the Alt reference frame active flag when we have |
4441 * a key frame | 4389 * a key frame |
4442 */ | 4390 */ |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4478 { | 4426 { |
4479 int over_size_percent = ((cpi->projected_frame_size - frame_over_sho
ot_limit) * 100) / frame_over_shoot_limit; | 4427 int over_size_percent = ((cpi->projected_frame_size - frame_over_sho
ot_limit) * 100) / frame_over_shoot_limit; |
4480 | 4428 |
4481 /* If so is there any scope for relaxing it */ | 4429 /* If so is there any scope for relaxing it */ |
4482 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_siz
e_percent > 0)) | 4430 while ((cpi->active_worst_quality < cpi->worst_quality) && (over_siz
e_percent > 0)) |
4483 { | 4431 { |
4484 cpi->active_worst_quality++; | 4432 cpi->active_worst_quality++; |
4485 /* Assume 1 qstep = about 4% on frame size. */ | 4433 /* Assume 1 qstep = about 4% on frame size. */ |
4486 over_size_percent = (int)(over_size_percent * 0.96); | 4434 over_size_percent = (int)(over_size_percent * 0.96); |
4487 } | 4435 } |
4488 #if !(CONFIG_REALTIME_ONLY) | 4436 #if !CONFIG_REALTIME_ONLY |
4489 top_index = cpi->active_worst_quality; | 4437 top_index = cpi->active_worst_quality; |
4490 #endif | 4438 #endif // !CONFIG_REALTIME_ONLY |
4491 /* If we have updated the active max Q do not call | 4439 /* If we have updated the active max Q do not call |
4492 * vp8_update_rate_correction_factors() this loop. | 4440 * vp8_update_rate_correction_factors() this loop. |
4493 */ | 4441 */ |
4494 active_worst_qchanged = 1; | 4442 active_worst_qchanged = 1; |
4495 } | 4443 } |
4496 else | 4444 else |
4497 active_worst_qchanged = 0; | 4445 active_worst_qchanged = 0; |
4498 | 4446 |
4499 #if !(CONFIG_REALTIME_ONLY) | 4447 #if !CONFIG_REALTIME_ONLY |
4500 /* Special case handling for forced key frames */ | 4448 /* Special case handling for forced key frames */ |
4501 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced ) | 4449 if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced ) |
4502 { | 4450 { |
4503 int last_q = Q; | 4451 int last_q = Q; |
4504 int kf_err = vp8_calc_ss_err(cpi->Source, | 4452 int kf_err = vp8_calc_ss_err(cpi->Source, |
4505 &cm->yv12_fb[cm->new_fb_idx]); | 4453 &cm->yv12_fb[cm->new_fb_idx]); |
4506 | 4454 |
4507 /* The key frame is not good enough */ | 4455 /* The key frame is not good enough */ |
4508 if ( kf_err > ((cpi->ambient_err * 7) >> 3) ) | 4456 if ( kf_err > ((cpi->ambient_err * 7) >> 3) ) |
4509 { | 4457 { |
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5227 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file); | 5175 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file); |
5228 fclose(recon_file); | 5176 fclose(recon_file); |
5229 } | 5177 } |
5230 #endif | 5178 #endif |
5231 | 5179 |
5232 /* DEBUG */ | 5180 /* DEBUG */ |
5233 /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */ | 5181 /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */ |
5234 | 5182 |
5235 | 5183 |
5236 } | 5184 } |
5237 #if !(CONFIG_REALTIME_ONLY) | 5185 #if !CONFIG_REALTIME_ONLY |
5238 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest,
unsigned char * dest_end, unsigned int *frame_flags) | 5186 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest,
unsigned char * dest_end, unsigned int *frame_flags) |
5239 { | 5187 { |
5240 | 5188 |
5241 if (!cpi->common.refresh_alt_ref_frame) | 5189 if (!cpi->common.refresh_alt_ref_frame) |
5242 vp8_second_pass(cpi); | 5190 vp8_second_pass(cpi); |
5243 | 5191 |
5244 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags); | 5192 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags); |
5245 cpi->twopass.bits_left -= 8 * *size; | 5193 cpi->twopass.bits_left -= 8 * *size; |
5246 | 5194 |
5247 if (!cpi->common.refresh_alt_ref_frame) | 5195 if (!cpi->common.refresh_alt_ref_frame) |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5311 vp8_clear_system_state(); | 5259 vp8_clear_system_state(); |
5312 return VPX_CODEC_CORRUPT_FRAME; | 5260 return VPX_CODEC_CORRUPT_FRAME; |
5313 } | 5261 } |
5314 | 5262 |
5315 cpi->common.error.setjmp = 1; | 5263 cpi->common.error.setjmp = 1; |
5316 | 5264 |
5317 vpx_usec_timer_start(&cmptimer); | 5265 vpx_usec_timer_start(&cmptimer); |
5318 | 5266 |
5319 cpi->source = NULL; | 5267 cpi->source = NULL; |
5320 | 5268 |
5321 #if !(CONFIG_REALTIME_ONLY) | 5269 #if !CONFIG_REALTIME_ONLY |
5322 /* Should we code an alternate reference frame */ | 5270 /* Should we code an alternate reference frame */ |
5323 if (cpi->oxcf.error_resilient_mode == 0 && | 5271 if (cpi->oxcf.error_resilient_mode == 0 && |
5324 cpi->oxcf.play_alternate && | 5272 cpi->oxcf.play_alternate && |
5325 cpi->source_alt_ref_pending) | 5273 cpi->source_alt_ref_pending) |
5326 { | 5274 { |
5327 if ((cpi->source = vp8_lookahead_peek(cpi->lookahead, | 5275 if ((cpi->source = vp8_lookahead_peek(cpi->lookahead, |
5328 cpi->frames_till_gf_update_due, | 5276 cpi->frames_till_gf_update_due, |
5329 PEEK_FORWARD))) | 5277 PEEK_FORWARD))) |
5330 { | 5278 { |
5331 cpi->alt_ref_source = cpi->source; | 5279 cpi->alt_ref_source = cpi->source; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5379 *frame_flags = cpi->source->flags; | 5327 *frame_flags = cpi->source->flags; |
5380 | 5328 |
5381 if (cpi->pass == 1 && cm->current_video_frame > 0) | 5329 if (cpi->pass == 1 && cm->current_video_frame > 0) |
5382 { | 5330 { |
5383 cpi->last_frame_unscaled_source = &cpi->last_source->img; | 5331 cpi->last_frame_unscaled_source = &cpi->last_source->img; |
5384 } | 5332 } |
5385 } | 5333 } |
5386 else | 5334 else |
5387 { | 5335 { |
5388 *size = 0; | 5336 *size = 0; |
5389 #if !(CONFIG_REALTIME_ONLY) | 5337 #if !CONFIG_REALTIME_ONLY |
5390 | 5338 |
5391 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) | 5339 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) |
5392 { | 5340 { |
5393 vp8_end_first_pass(cpi); /* get last stats packet */ | 5341 vp8_end_first_pass(cpi); /* get last stats packet */ |
5394 cpi->twopass.first_pass_done = 1; | 5342 cpi->twopass.first_pass_done = 1; |
5395 } | 5343 } |
5396 | 5344 |
5397 #endif | 5345 #endif |
5398 | 5346 |
5399 return -1; | 5347 return -1; |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5572 { | 5520 { |
5573 if(!cm->yv12_fb[i].flags) | 5521 if(!cm->yv12_fb[i].flags) |
5574 { | 5522 { |
5575 cm->new_fb_idx = i; | 5523 cm->new_fb_idx = i; |
5576 break; | 5524 break; |
5577 } | 5525 } |
5578 } | 5526 } |
5579 | 5527 |
5580 assert(i < NUM_YV12_BUFFERS ); | 5528 assert(i < NUM_YV12_BUFFERS ); |
5581 } | 5529 } |
5582 #if !(CONFIG_REALTIME_ONLY) | 5530 #if !CONFIG_REALTIME_ONLY |
5583 | 5531 |
5584 if (cpi->pass == 1) | 5532 if (cpi->pass == 1) |
5585 { | 5533 { |
5586 Pass1Encode(cpi, size, dest, frame_flags); | 5534 Pass1Encode(cpi, size, dest, frame_flags); |
5587 } | 5535 } |
5588 else if (cpi->pass == 2) | 5536 else if (cpi->pass == 2) |
5589 { | 5537 { |
5590 Pass2Encode(cpi, size, dest, dest_end, frame_flags); | 5538 Pass2Encode(cpi, size, dest, dest_end, frame_flags); |
5591 } | 5539 } |
5592 else | 5540 else |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5734 | 5682 |
5735 cpi->totalp_y += vpx_sse_to_psnr(y_samples, | 5683 cpi->totalp_y += vpx_sse_to_psnr(y_samples, |
5736 255.0, (double)ye); | 5684 255.0, (double)ye); |
5737 cpi->totalp_u += vpx_sse_to_psnr(uv_samples, | 5685 cpi->totalp_u += vpx_sse_to_psnr(uv_samples, |
5738 255.0, (double)ue); | 5686 255.0, (double)ue); |
5739 cpi->totalp_v += vpx_sse_to_psnr(uv_samples, | 5687 cpi->totalp_v += vpx_sse_to_psnr(uv_samples, |
5740 255.0, (double)ve); | 5688 255.0, (double)ve); |
5741 cpi->total_sq_error2 += sq_error2; | 5689 cpi->total_sq_error2 += sq_error2; |
5742 cpi->totalp += frame_psnr2; | 5690 cpi->totalp += frame_psnr2; |
5743 | 5691 |
5744 frame_ssim2 = vp8_calc_ssim(cpi->Source, | 5692 frame_ssim2 = vpx_calc_ssim(cpi->Source, |
5745 &cm->post_proc_buffer, 1, &weight); | 5693 &cm->post_proc_buffer, &weight); |
5746 | 5694 |
5747 cpi->summed_quality += frame_ssim2 * weight; | 5695 cpi->summed_quality += frame_ssim2 * weight; |
5748 cpi->summed_weights += weight; | 5696 cpi->summed_weights += weight; |
5749 | 5697 |
5750 if (cpi->oxcf.number_of_layers > 1) | 5698 if (cpi->oxcf.number_of_layers > 1) |
5751 { | 5699 { |
5752 unsigned int i; | 5700 unsigned int i; |
5753 | 5701 |
5754 for (i=cpi->current_layer; | 5702 for (i=cpi->current_layer; |
5755 i<cpi->oxcf.number_of_layers; i++) | 5703 i<cpi->oxcf.number_of_layers; i++) |
5756 { | 5704 { |
5757 cpi->frames_in_layer[i]++; | 5705 cpi->frames_in_layer[i]++; |
5758 | 5706 |
5759 cpi->bytes_in_layer[i] += *size; | 5707 cpi->bytes_in_layer[i] += *size; |
5760 cpi->sum_psnr[i] += frame_psnr; | 5708 cpi->sum_psnr[i] += frame_psnr; |
5761 cpi->sum_psnr_p[i] += frame_psnr2; | 5709 cpi->sum_psnr_p[i] += frame_psnr2; |
5762 cpi->total_error2[i] += sq_error; | 5710 cpi->total_error2[i] += sq_error; |
5763 cpi->total_error2_p[i] += sq_error2; | 5711 cpi->total_error2_p[i] += sq_error2; |
5764 cpi->sum_ssim[i] += frame_ssim2 * weight; | 5712 cpi->sum_ssim[i] += frame_ssim2 * weight; |
5765 cpi->sum_weights[i] += weight; | 5713 cpi->sum_weights[i] += weight; |
5766 } | 5714 } |
5767 } | 5715 } |
5768 } | 5716 } |
5769 #endif | 5717 #endif |
5770 } | 5718 } |
5771 | 5719 |
5772 if (cpi->b_calculate_ssimg) | 5720 if (cpi->b_calculate_ssimg) |
5773 { | 5721 { |
5774 double y, u, v, frame_all; | 5722 double y, u, v, frame_all; |
5775 frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show, | 5723 frame_all = vpx_calc_ssimg(cpi->Source, cm->frame_to_show, |
5776 &y, &u, &v); | 5724 &y, &u, &v); |
5777 | 5725 |
5778 if (cpi->oxcf.number_of_layers > 1) | 5726 if (cpi->oxcf.number_of_layers > 1) |
5779 { | 5727 { |
5780 unsigned int i; | 5728 unsigned int i; |
5781 | 5729 |
5782 for (i=cpi->current_layer; | 5730 for (i=cpi->current_layer; |
5783 i<cpi->oxcf.number_of_layers; i++) | 5731 i<cpi->oxcf.number_of_layers; i++) |
5784 { | 5732 { |
5785 if (!cpi->b_calculate_psnr) | 5733 if (!cpi->b_calculate_psnr) |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6002 } | 5950 } |
6003 | 5951 |
6004 return Total; | 5952 return Total; |
6005 } | 5953 } |
6006 | 5954 |
6007 | 5955 |
6008 int vp8_get_quantizer(VP8_COMP *cpi) | 5956 int vp8_get_quantizer(VP8_COMP *cpi) |
6009 { | 5957 { |
6010 return cpi->common.base_qindex; | 5958 return cpi->common.base_qindex; |
6011 } | 5959 } |
OLD | NEW |