Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(655)

Side by Side Diff: source/libvpx/vp8/encoder/onyx_if.c

Issue 11974002: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp8/encoder/firstpass.c ('k') | source/libvpx/vp8/encoder/onyx_int.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "vp8/common/onyxc_int.h" 14 #include "vp8/common/onyxc_int.h"
15 #include "vp8/common/blockd.h" 15 #include "vp8/common/blockd.h"
16 #include "onyx_int.h" 16 #include "onyx_int.h"
17 #include "vp8/common/systemdependent.h" 17 #include "vp8/common/systemdependent.h"
18 #include "quantize.h" 18 #include "quantize.h"
19 #include "vp8/common/alloccommon.h" 19 #include "vp8/common/alloccommon.h"
20 #include "mcomp.h" 20 #include "mcomp.h"
21 #include "firstpass.h" 21 #include "firstpass.h"
22 #include "psnr.h" 22 #include "psnr.h"
23 #include "vpx_scale/vpxscale.h" 23 #include "vpx_scale/vpx_scale.h"
24 #include "vp8/common/extend.h" 24 #include "vp8/common/extend.h"
25 #include "ratectrl.h" 25 #include "ratectrl.h"
26 #include "vp8/common/quant_common.h" 26 #include "vp8/common/quant_common.h"
27 #include "segmentation.h" 27 #include "segmentation.h"
28 #if CONFIG_POSTPROC 28 #if CONFIG_POSTPROC
29 #include "vp8/common/postproc.h" 29 #include "vp8/common/postproc.h"
30 #endif 30 #endif
31 #include "vpx_mem/vpx_mem.h" 31 #include "vpx_mem/vpx_mem.h"
32 #include "vp8/common/swapyv12buffer.h" 32 #include "vp8/common/swapyv12buffer.h"
33 #include "vp8/common/threading.h" 33 #include "vp8/common/threading.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 lc->active_worst_quality = cpi->active_worst_quality; 232 lc->active_worst_quality = cpi->active_worst_quality;
233 lc->best_quality = cpi->best_quality; 233 lc->best_quality = cpi->best_quality;
234 lc->active_best_quality = cpi->active_best_quality; 234 lc->active_best_quality = cpi->active_best_quality;
235 lc->ni_av_qi = cpi->ni_av_qi; 235 lc->ni_av_qi = cpi->ni_av_qi;
236 lc->ni_tot_qi = cpi->ni_tot_qi; 236 lc->ni_tot_qi = cpi->ni_tot_qi;
237 lc->ni_frames = cpi->ni_frames; 237 lc->ni_frames = cpi->ni_frames;
238 lc->avg_frame_qindex = cpi->avg_frame_qindex; 238 lc->avg_frame_qindex = cpi->avg_frame_qindex;
239 lc->rate_correction_factor = cpi->rate_correction_factor; 239 lc->rate_correction_factor = cpi->rate_correction_factor;
240 lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor ; 240 lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor ;
241 lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor; 241 lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
242 lc->zbin_over_quant = cpi->zbin_over_quant; 242 lc->zbin_over_quant = cpi->mb.zbin_over_quant;
243 lc->inter_frame_target = cpi->inter_frame_target; 243 lc->inter_frame_target = cpi->inter_frame_target;
244 lc->total_byte_count = cpi->total_byte_count; 244 lc->total_byte_count = cpi->total_byte_count;
245 lc->filter_level = cpi->common.filter_level; 245 lc->filter_level = cpi->common.filter_level;
246 246
247 lc->last_frame_percent_intra = cpi->last_frame_percent_intra; 247 lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
248 248
249 memcpy (lc->count_mb_ref_frame_usage, 249 memcpy (lc->count_mb_ref_frame_usage,
250 cpi->count_mb_ref_frame_usage, 250 cpi->mb.count_mb_ref_frame_usage,
251 sizeof(cpi->count_mb_ref_frame_usage)); 251 sizeof(cpi->mb.count_mb_ref_frame_usage));
252 } 252 }
253 253
254 static void restore_layer_context(VP8_COMP *cpi, const int layer) 254 static void restore_layer_context(VP8_COMP *cpi, const int layer)
255 { 255 {
256 LAYER_CONTEXT *lc = &cpi->layer_context[layer]; 256 LAYER_CONTEXT *lc = &cpi->layer_context[layer];
257 257
258 /* Restore layer dependent coding state */ 258 /* Restore layer dependent coding state */
259 cpi->current_layer = layer; 259 cpi->current_layer = layer;
260 cpi->target_bandwidth = lc->target_bandwidth; 260 cpi->target_bandwidth = lc->target_bandwidth;
261 cpi->oxcf.target_bandwidth = lc->target_bandwidth; 261 cpi->oxcf.target_bandwidth = lc->target_bandwidth;
262 cpi->oxcf.starting_buffer_level = lc->starting_buffer_level; 262 cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
263 cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level; 263 cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
264 cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size; 264 cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
265 cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms; 265 cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
266 cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms; 266 cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
267 cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms; 267 cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
268 cpi->buffer_level = lc->buffer_level; 268 cpi->buffer_level = lc->buffer_level;
269 cpi->bits_off_target = lc->bits_off_target; 269 cpi->bits_off_target = lc->bits_off_target;
270 cpi->total_actual_bits = lc->total_actual_bits; 270 cpi->total_actual_bits = lc->total_actual_bits;
271 cpi->active_worst_quality = lc->active_worst_quality; 271 cpi->active_worst_quality = lc->active_worst_quality;
272 cpi->active_best_quality = lc->active_best_quality; 272 cpi->active_best_quality = lc->active_best_quality;
273 cpi->ni_av_qi = lc->ni_av_qi; 273 cpi->ni_av_qi = lc->ni_av_qi;
274 cpi->ni_tot_qi = lc->ni_tot_qi; 274 cpi->ni_tot_qi = lc->ni_tot_qi;
275 cpi->ni_frames = lc->ni_frames; 275 cpi->ni_frames = lc->ni_frames;
276 cpi->avg_frame_qindex = lc->avg_frame_qindex; 276 cpi->avg_frame_qindex = lc->avg_frame_qindex;
277 cpi->rate_correction_factor = lc->rate_correction_factor; 277 cpi->rate_correction_factor = lc->rate_correction_factor;
278 cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor ; 278 cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor ;
279 cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor; 279 cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
280 cpi->zbin_over_quant = lc->zbin_over_quant; 280 cpi->mb.zbin_over_quant = lc->zbin_over_quant;
281 cpi->inter_frame_target = lc->inter_frame_target; 281 cpi->inter_frame_target = lc->inter_frame_target;
282 cpi->total_byte_count = lc->total_byte_count; 282 cpi->total_byte_count = lc->total_byte_count;
283 cpi->common.filter_level = lc->filter_level; 283 cpi->common.filter_level = lc->filter_level;
284 284
285 cpi->last_frame_percent_intra = lc->last_frame_percent_intra; 285 cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
286 286
287 memcpy (cpi->count_mb_ref_frame_usage, 287 memcpy (cpi->mb.count_mb_ref_frame_usage,
288 lc->count_mb_ref_frame_usage, 288 lc->count_mb_ref_frame_usage,
289 sizeof(cpi->count_mb_ref_frame_usage)); 289 sizeof(cpi->mb.count_mb_ref_frame_usage));
290 } 290 }
291 291
292 static void setup_features(VP8_COMP *cpi) 292 static void setup_features(VP8_COMP *cpi)
293 { 293 {
294 // If segmentation enabled set the update flags 294 // If segmentation enabled set the update flags
295 if ( cpi->mb.e_mbd.segmentation_enabled ) 295 if ( cpi->mb.e_mbd.segmentation_enabled )
296 { 296 {
297 cpi->mb.e_mbd.update_mb_segmentation_map = 1; 297 cpi->mb.e_mbd.update_mb_segmentation_map = 1;
298 cpi->mb.e_mbd.update_mb_segmentation_data = 1; 298 cpi->mb.e_mbd.update_mb_segmentation_data = 1;
299 } 299 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 vpx_free(cpi->tok); 349 vpx_free(cpi->tok);
350 cpi->tok = 0; 350 cpi->tok = 0;
351 351
352 /* Structure used to monitor GF usage */ 352 /* Structure used to monitor GF usage */
353 vpx_free(cpi->gf_active_flags); 353 vpx_free(cpi->gf_active_flags);
354 cpi->gf_active_flags = 0; 354 cpi->gf_active_flags = 0;
355 355
356 /* Activity mask based per mb zbin adjustments */ 356 /* Activity mask based per mb zbin adjustments */
357 vpx_free(cpi->mb_activity_map); 357 vpx_free(cpi->mb_activity_map);
358 cpi->mb_activity_map = 0; 358 cpi->mb_activity_map = 0;
359 vpx_free(cpi->mb_norm_activity_map);
360 cpi->mb_norm_activity_map = 0;
361 359
362 vpx_free(cpi->mb.pip); 360 vpx_free(cpi->mb.pip);
363 cpi->mb.pip = 0; 361 cpi->mb.pip = 0;
364 362
365 #if CONFIG_MULTITHREAD 363 #if CONFIG_MULTITHREAD
366 vpx_free(cpi->mt_current_mb_col); 364 vpx_free(cpi->mt_current_mb_col);
367 cpi->mt_current_mb_col = NULL; 365 cpi->mt_current_mb_col = NULL;
368 #endif 366 #endif
369 } 367 }
370 368
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 int Speed = cpi->Speed; 634 int Speed = cpi->Speed;
637 int i; 635 int i;
638 VP8_COMMON *cm = &cpi->common; 636 VP8_COMMON *cm = &cpi->common;
639 int last_improved_quant = sf->improved_quant; 637 int last_improved_quant = sf->improved_quant;
640 int ref_frames; 638 int ref_frames;
641 639
642 /* Initialise default mode frequency sampling variables */ 640 /* Initialise default mode frequency sampling variables */
643 for (i = 0; i < MAX_MODES; i ++) 641 for (i = 0; i < MAX_MODES; i ++)
644 { 642 {
645 cpi->mode_check_freq[i] = 0; 643 cpi->mode_check_freq[i] = 0;
646 cpi->mode_test_hit_counts[i] = 0;
647 cpi->mode_chosen_counts[i] = 0; 644 cpi->mode_chosen_counts[i] = 0;
648 } 645 }
649 646
650 cpi->mbs_tested_so_far = 0; 647 cpi->mb.mbs_tested_so_far = 0;
651 648
652 /* best quality defaults */ 649 /* best quality defaults */
653 sf->RD = 1; 650 sf->RD = 1;
654 sf->search_method = NSTEP; 651 sf->search_method = NSTEP;
655 sf->improved_quant = 1; 652 sf->improved_quant = 1;
656 sf->improved_dct = 1; 653 sf->improved_dct = 1;
657 sf->auto_filter = 1; 654 sf->auto_filter = 1;
658 sf->recode_loop = 1; 655 sf->recode_loop = 1;
659 sf->quarter_pixel_search = 1; 656 sf->quarter_pixel_search = 1;
660 sf->half_pixel_search = 1; 657 sf->half_pixel_search = 1;
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 831
835 int min = 2000; 832 int min = 2000;
836 833
837 if (cpi->oxcf.encode_breakout > 2000) 834 if (cpi->oxcf.encode_breakout > 2000)
838 min = cpi->oxcf.encode_breakout; 835 min = cpi->oxcf.encode_breakout;
839 836
840 min >>= 7; 837 min >>= 7;
841 838
842 for (i = 0; i < min; i++) 839 for (i = 0; i < min; i++)
843 { 840 {
844 sum += cpi->error_bins[i]; 841 sum += cpi->mb.error_bins[i];
845 } 842 }
846 843
847 total_skip = sum; 844 total_skip = sum;
848 sum = 0; 845 sum = 0;
849 846
850 /* i starts from 2 to make sure thresh started from 2048 */ 847 /* i starts from 2 to make sure thresh started from 2048 */
851 for (; i < 1024; i++) 848 for (; i < 1024; i++)
852 { 849 {
853 sum += cpi->error_bins[i]; 850 sum += cpi->mb.error_bins[i];
854 851
855 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - tota l_skip)) 852 if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - tota l_skip))
856 break; 853 break;
857 } 854 }
858 855
859 i--; 856 i--;
860 thresh = (i << 7); 857 thresh = (i << 7);
861 858
862 if (thresh < 2000) 859 if (thresh < 2000)
863 thresh = 2000; 860 thresh = 2000;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 } 895 }
899 else 896 else
900 { 897 {
901 cm->filter_type = SIMPLE_LOOPFILTER; 898 cm->filter_type = SIMPLE_LOOPFILTER;
902 } 899 }
903 900
904 /* This has a big hit on quality. Last resort */ 901 /* This has a big hit on quality. Last resort */
905 if (Speed >= 15) 902 if (Speed >= 15)
906 sf->half_pixel_search = 0; 903 sf->half_pixel_search = 0;
907 904
908 vpx_memset(cpi->error_bins, 0, sizeof(cpi->error_bins)); 905 vpx_memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
909 906
910 }; /* switch */ 907 }; /* switch */
911 908
912 /* Slow quant, dct and trellis not worthwhile for first pass 909 /* Slow quant, dct and trellis not worthwhile for first pass
913 * so make sure they are always turned off. 910 * so make sure they are always turned off.
914 */ 911 */
915 if ( cpi->pass == 1 ) 912 if ( cpi->pass == 1 )
916 { 913 {
917 sf->improved_quant = 0; 914 sf->improved_quant = 0;
918 sf->optimize_coefficients = 0; 915 sf->optimize_coefficients = 0;
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 { 1070 {
1074 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 1071 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
1075 unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */ 1072 unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
1076 #else 1073 #else
1077 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16; 1074 unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
1078 #endif 1075 #endif
1079 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok))); 1076 CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
1080 } 1077 }
1081 1078
1082 /* Data used for real time vc mode to see if gf needs refreshing */ 1079 /* Data used for real time vc mode to see if gf needs refreshing */
1083 cpi->inter_zz_count = 0;
1084 cpi->zeromv_count = 0; 1080 cpi->zeromv_count = 0;
1085 cpi->gf_bad_count = 0;
1086 cpi->gf_update_recommended = 0;
1087 1081
1088 1082
1089 /* Structures used to monitor GF usage */ 1083 /* Structures used to monitor GF usage */
1090 vpx_free(cpi->gf_active_flags); 1084 vpx_free(cpi->gf_active_flags);
1091 CHECK_MEM_ERROR(cpi->gf_active_flags, 1085 CHECK_MEM_ERROR(cpi->gf_active_flags,
1092 vpx_calloc(sizeof(*cpi->gf_active_flags), 1086 vpx_calloc(sizeof(*cpi->gf_active_flags),
1093 cm->mb_rows * cm->mb_cols)); 1087 cm->mb_rows * cm->mb_cols));
1094 cpi->gf_active_count = cm->mb_rows * cm->mb_cols; 1088 cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
1095 1089
1096 vpx_free(cpi->mb_activity_map); 1090 vpx_free(cpi->mb_activity_map);
1097 CHECK_MEM_ERROR(cpi->mb_activity_map, 1091 CHECK_MEM_ERROR(cpi->mb_activity_map,
1098 vpx_calloc(sizeof(*cpi->mb_activity_map), 1092 vpx_calloc(sizeof(*cpi->mb_activity_map),
1099 cm->mb_rows * cm->mb_cols)); 1093 cm->mb_rows * cm->mb_cols));
1100 1094
1101 vpx_free(cpi->mb_norm_activity_map);
1102 CHECK_MEM_ERROR(cpi->mb_norm_activity_map,
1103 vpx_calloc(sizeof(*cpi->mb_norm_activity_map),
1104 cm->mb_rows * cm->mb_cols));
1105
1106 /* allocate memory for storing last frame's MVs for MV prediction. */ 1095 /* allocate memory for storing last frame's MVs for MV prediction. */
1107 vpx_free(cpi->lfmv); 1096 vpx_free(cpi->lfmv);
1108 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2), 1097 CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1109 sizeof(*cpi->lfmv))); 1098 sizeof(*cpi->lfmv)));
1110 vpx_free(cpi->lf_ref_frame_sign_bias); 1099 vpx_free(cpi->lf_ref_frame_sign_bias);
1111 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias, 1100 CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
1112 vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2), 1101 vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
1113 sizeof(*cpi->lf_ref_frame_sign_bias))); 1102 sizeof(*cpi->lf_ref_frame_sign_bias)));
1114 vpx_free(cpi->lf_ref_frame); 1103 vpx_free(cpi->lf_ref_frame);
1115 CHECK_MEM_ERROR(cpi->lf_ref_frame, 1104 CHECK_MEM_ERROR(cpi->lf_ref_frame,
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after
1925 { 1914 {
1926 cpi->avg_encode_time = 0; 1915 cpi->avg_encode_time = 0;
1927 cpi->avg_pick_mode_time = 0; 1916 cpi->avg_pick_mode_time = 0;
1928 } 1917 }
1929 1918
1930 vp8_set_speed_features(cpi); 1919 vp8_set_speed_features(cpi);
1931 1920
1932 /* Set starting values of RD threshold multipliers (128 = *1) */ 1921 /* Set starting values of RD threshold multipliers (128 = *1) */
1933 for (i = 0; i < MAX_MODES; i++) 1922 for (i = 0; i < MAX_MODES; i++)
1934 { 1923 {
1935 cpi->rd_thresh_mult[i] = 128; 1924 cpi->mb.rd_thresh_mult[i] = 128;
1936 } 1925 }
1937 1926
1938 #ifdef ENTROPY_STATS 1927 #ifdef ENTROPY_STATS
1939 init_mv_ref_counts(); 1928 init_mv_ref_counts();
1940 #endif 1929 #endif
1941 1930
1942 #if CONFIG_MULTITHREAD 1931 #if CONFIG_MULTITHREAD
1943 if(vp8cx_create_encoder_threads(cpi)) 1932 if(vp8cx_create_encoder_threads(cpi))
1944 { 1933 {
1945 vp8_remove_compressor(&cpi); 1934 vp8_remove_compressor(&cpi);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2003 cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn; 1992 cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
2004 cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn; 1993 cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
2005 cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn; 1994 cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
2006 #endif 1995 #endif
2007 1996
2008 cpi->full_search_sad = vp8_full_search_sad; 1997 cpi->full_search_sad = vp8_full_search_sad;
2009 cpi->diamond_search_sad = vp8_diamond_search_sad; 1998 cpi->diamond_search_sad = vp8_diamond_search_sad;
2010 cpi->refining_search_sad = vp8_refining_search_sad; 1999 cpi->refining_search_sad = vp8_refining_search_sad;
2011 2000
2012 /* make sure frame 1 is okay */ 2001 /* make sure frame 1 is okay */
2013 cpi->error_bins[0] = cpi->common.MBs; 2002 cpi->mb.error_bins[0] = cpi->common.MBs;
2014 2003
2015 /* vp8cx_init_quantizer() is first called here. Add check in 2004 /* vp8cx_init_quantizer() is first called here. Add check in
2016 * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only 2005 * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
2017 * called later when needed. This will avoid unnecessary calls of 2006 * called later when needed. This will avoid unnecessary calls of
2018 * vp8cx_init_quantizer() for every frame. 2007 * vp8cx_init_quantizer() for every frame.
2019 */ 2008 */
2020 vp8cx_init_quantizer(cpi); 2009 vp8cx_init_quantizer(cpi);
2021 2010
2022 vp8_loop_filter_init(cm); 2011 vp8_loop_filter_init(cm);
2023 2012
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
2592 int tmp_height; 2581 int tmp_height;
2593 2582
2594 if (cm->vert_scale == 3) 2583 if (cm->vert_scale == 3)
2595 tmp_height = 9; 2584 tmp_height = 9;
2596 else 2585 else
2597 tmp_height = 11; 2586 tmp_height = 11;
2598 2587
2599 Scale2Ratio(cm->horiz_scale, &hr, &hs); 2588 Scale2Ratio(cm->horiz_scale, &hr, &hs);
2600 Scale2Ratio(cm->vert_scale, &vr, &vs); 2589 Scale2Ratio(cm->vert_scale, &vr, &vs);
2601 2590
2602 vp8_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer, 2591 vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
2603 tmp_height, hs, hr, vs, vr, 0); 2592 tmp_height, hs, hr, vs, vr, 0);
2604 2593
2605 vp8_yv12_extend_frame_borders(&cpi->scaled_source); 2594 vp8_yv12_extend_frame_borders(&cpi->scaled_source);
2606 cpi->Source = &cpi->scaled_source; 2595 cpi->Source = &cpi->scaled_source;
2607 #endif 2596 #endif
2608 } 2597 }
2609 else 2598 else
2610 cpi->Source = sd; 2599 cpi->Source = sd;
2611 } 2600 }
2612 2601
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 if (cpi->frames_till_gf_update_due > 0) 2765 if (cpi->frames_till_gf_update_due > 0)
2777 cpi->frames_till_gf_update_due--; 2766 cpi->frames_till_gf_update_due--;
2778 2767
2779 if (cpi->common.frames_till_alt_ref_frame) 2768 if (cpi->common.frames_till_alt_ref_frame)
2780 cpi->common.frames_till_alt_ref_frame --; 2769 cpi->common.frames_till_alt_ref_frame --;
2781 2770
2782 cpi->common.frames_since_golden ++; 2771 cpi->common.frames_since_golden ++;
2783 2772
2784 if (cpi->common.frames_since_golden > 1) 2773 if (cpi->common.frames_since_golden > 1)
2785 { 2774 {
2786 cpi->recent_ref_frame_usage[INTRA_FRAME] += cpi->count_mb_ref_frame_ usage[INTRA_FRAME]; 2775 cpi->recent_ref_frame_usage[INTRA_FRAME] +=
2787 cpi->recent_ref_frame_usage[LAST_FRAME] += cpi->count_mb_ref_frame_u sage[LAST_FRAME]; 2776 cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
2788 cpi->recent_ref_frame_usage[GOLDEN_FRAME] += cpi->count_mb_ref_frame _usage[GOLDEN_FRAME]; 2777 cpi->recent_ref_frame_usage[LAST_FRAME] +=
2789 cpi->recent_ref_frame_usage[ALTREF_FRAME] += cpi->count_mb_ref_frame _usage[ALTREF_FRAME]; 2778 cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
2779 cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
2780 cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
2781 cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
2782 cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
2790 } 2783 }
2791 } 2784 }
2792 } 2785 }
2793 2786
2794 /* This function updates the reference frame probability estimates that 2787 /* This function updates the reference frame probability estimates that
2795 * will be used during mode selection 2788 * will be used during mode selection
2796 */ 2789 */
2797 static void update_rd_ref_frame_probs(VP8_COMP *cpi) 2790 static void update_rd_ref_frame_probs(VP8_COMP *cpi)
2798 { 2791 {
2799 VP8_COMMON *cm = &cpi->common; 2792 VP8_COMMON *cm = &cpi->common;
2800 2793
2801 const int *const rfct = cpi->count_mb_ref_frame_usage; 2794 const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
2802 const int rf_intra = rfct[INTRA_FRAME]; 2795 const int rf_intra = rfct[INTRA_FRAME];
2803 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRA ME]; 2796 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRA ME];
2804 2797
2805 if (cm->frame_type == KEY_FRAME) 2798 if (cm->frame_type == KEY_FRAME)
2806 { 2799 {
2807 cpi->prob_intra_coded = 255; 2800 cpi->prob_intra_coded = 255;
2808 cpi->prob_last_coded = 128; 2801 cpi->prob_last_coded = 128;
2809 cpi->prob_gf_coded = 128; 2802 cpi->prob_gf_coded = 128;
2810 } 2803 }
2811 else if (!(rf_intra + rf_inter)) 2804 else if (!(rf_intra + rf_inter))
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2858 cpi->kf_boost = 0; 2851 cpi->kf_boost = 0;
2859 2852
2860 if (cpi->Speed > 11) 2853 if (cpi->Speed > 11)
2861 return 0; 2854 return 0;
2862 2855
2863 /* Clear down mmx registers */ 2856 /* Clear down mmx registers */
2864 vp8_clear_system_state(); 2857 vp8_clear_system_state();
2865 2858
2866 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0)) 2859 if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
2867 { 2860 {
2868 double change = 1.0 * abs((int)(cpi->intra_error - cpi->last_intra_error )) / (1 + cpi->last_intra_error); 2861 double change = 1.0 * abs((int)(cpi->mb.intra_error -
2869 double change2 = 1.0 * abs((int)(cpi->prediction_error - cpi->last_predi ction_error)) / (1 + cpi->last_prediction_error); 2862 cpi->last_intra_error)) / (1 + cpi->last_intra_error);
2863 double change2 = 1.0 * abs((int)(cpi->mb.prediction_error -
2864 cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
2870 double minerror = cm->MBs * 256; 2865 double minerror = cm->MBs * 256;
2871 2866
2872 #if 0 2867 cpi->last_intra_error = cpi->mb.intra_error;
2868 cpi->last_prediction_error = cpi->mb.prediction_error;
2873 2869
2874 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15 2870 if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15
2875 && cpi->prediction_error > minerror 2871 && cpi->mb.prediction_error > minerror
2876 && (change > .25 || change2 > .25))
2877 {
2878 FILE *f = fopen("intra_inter.stt", "a");
2879
2880 if (cpi->prediction_error <= 0)
2881 cpi->prediction_error = 1;
2882
2883 fprintf(f, "%d %d %d %d %14.4f\n",
2884 cm->current_video_frame,
2885 (int) cpi->prediction_error,
2886 (int) cpi->intra_error,
2887 (int)((10 * cpi->intra_error) / cpi->prediction_error),
2888 change);
2889
2890 fclose(f);
2891 }
2892
2893 #endif
2894
2895 cpi->last_intra_error = cpi->intra_error;
2896 cpi->last_prediction_error = cpi->prediction_error;
2897
2898 if (10 * cpi->intra_error / (1 + cpi->prediction_error) < 15
2899 && cpi->prediction_error > minerror
2900 && (change > .25 || change2 > .25)) 2872 && (change > .25 || change2 > .25))
2901 { 2873 {
2902 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > c pi->last_frame_percent_intra + 3*/ 2874 /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > c pi->last_frame_percent_intra + 3*/
2903 return 1; 2875 return 1;
2904 } 2876 }
2905 2877
2906 return 0; 2878 return 0;
2907 2879
2908 } 2880 }
2909 2881
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
3153 if (cm->refresh_last_frame) 3125 if (cm->refresh_last_frame)
3154 { 3126 {
3155 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME; 3127 cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
3156 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME; 3128 cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
3157 cm->lst_fb_idx = cm->new_fb_idx; 3129 cm->lst_fb_idx = cm->new_fb_idx;
3158 3130
3159 #if CONFIG_MULTI_RES_ENCODING 3131 #if CONFIG_MULTI_RES_ENCODING
3160 cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame; 3132 cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
3161 #endif 3133 #endif
3162 } 3134 }
3135
3136 #if CONFIG_TEMPORAL_DENOISING
3137 if (cpi->oxcf.noise_sensitivity)
3138 {
3139 /* we shouldn't have to keep multiple copies as we know in advance which
3140 * buffer we should start - for now to get something up and running
3141 * I've chosen to copy the buffers
3142 */
3143 if (cm->frame_type == KEY_FRAME)
3144 {
3145 int i;
3146 vp8_yv12_copy_frame(
3147 cpi->Source,
3148 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3149
3150 vp8_yv12_extend_frame_borders(
3151 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3152
3153 for (i = 2; i < MAX_REF_FRAMES - 1; i++)
3154 vp8_yv12_copy_frame(
3155 &cpi->denoiser.yv12_running_avg[LAST_FRAME],
3156 &cpi->denoiser.yv12_running_avg[i]);
3157 }
3158 else /* For non key frames */
3159 {
3160 vp8_yv12_extend_frame_borders(
3161 &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
3162
3163 if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
3164 {
3165 vp8_yv12_copy_frame(
3166 &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3167 &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
3168 }
3169 if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
3170 {
3171 vp8_yv12_copy_frame(
3172 &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3173 &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
3174 }
3175 if(cm->refresh_last_frame)
3176 {
3177 vp8_yv12_copy_frame(
3178 &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
3179 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3180 }
3181 }
3182
3183 }
3184 #endif
3185
3163 } 3186 }
3164 3187
3165 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) 3188 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
3166 { 3189 {
3167 const FRAME_TYPE frame_type = cm->frame_type; 3190 const FRAME_TYPE frame_type = cm->frame_type;
3168 3191
3169 if (cm->no_lpf) 3192 if (cm->no_lpf)
3170 { 3193 {
3171 cm->filter_level = 0; 3194 cm->filter_level = 0;
3172 } 3195 }
(...skipping 23 matching lines...) Expand all
3196 if (cpi->b_multi_threaded) 3219 if (cpi->b_multi_threaded)
3197 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */ 3220 sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
3198 #endif 3221 #endif
3199 3222
3200 if (cm->filter_level > 0) 3223 if (cm->filter_level > 0)
3201 { 3224 {
3202 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type); 3225 vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
3203 } 3226 }
3204 3227
3205 vp8_yv12_extend_frame_borders(cm->frame_to_show); 3228 vp8_yv12_extend_frame_borders(cm->frame_to_show);
3206 #if CONFIG_TEMPORAL_DENOISING
3207 if (cpi->oxcf.noise_sensitivity)
3208 {
3209
3210
3211 /* we shouldn't have to keep multiple copies as we know in advance which
3212 * buffer we should start - for now to get something up and running
3213 * I've chosen to copy the buffers
3214 */
3215 if (cm->frame_type == KEY_FRAME)
3216 {
3217 int i;
3218 vp8_yv12_copy_frame(
3219 cpi->Source,
3220 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3221
3222 vp8_yv12_extend_frame_borders(
3223 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3224
3225 for (i = 2; i < MAX_REF_FRAMES - 1; i++)
3226 vp8_yv12_copy_frame(
3227 cpi->Source,
3228 &cpi->denoiser.yv12_running_avg[i]);
3229 }
3230 else /* For non key frames */
3231 {
3232 vp8_yv12_extend_frame_borders(
3233 &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
3234
3235 if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
3236 {
3237 vp8_yv12_copy_frame(
3238 &cpi->denoiser.yv12_running_avg[LAST_FRAME],
3239 &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
3240 }
3241 if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
3242 {
3243 vp8_yv12_copy_frame(
3244 &cpi->denoiser.yv12_running_avg[LAST_FRAME],
3245 &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
3246 }
3247 }
3248
3249 }
3250 #endif
3251 3229
3252 } 3230 }
3253 3231
3254 static void encode_frame_to_data_rate 3232 static void encode_frame_to_data_rate
3255 ( 3233 (
3256 VP8_COMP *cpi, 3234 VP8_COMP *cpi,
3257 unsigned long *size, 3235 unsigned long *size,
3258 unsigned char *dest, 3236 unsigned char *dest,
3259 unsigned char* dest_end, 3237 unsigned char* dest_end,
3260 unsigned int *frame_flags 3238 unsigned int *frame_flags
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3324 } 3302 }
3325 else 3303 else
3326 #endif 3304 #endif
3327 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_fr ame_rate); 3305 cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_fr ame_rate);
3328 3306
3329 /* Default turn off buffer to buffer copying */ 3307 /* Default turn off buffer to buffer copying */
3330 cm->copy_buffer_to_gf = 0; 3308 cm->copy_buffer_to_gf = 0;
3331 cm->copy_buffer_to_arf = 0; 3309 cm->copy_buffer_to_arf = 0;
3332 3310
3333 /* Clear zbin over-quant value and mode boost values. */ 3311 /* Clear zbin over-quant value and mode boost values. */
3334 cpi->zbin_over_quant = 0; 3312 cpi->mb.zbin_over_quant = 0;
3335 cpi->zbin_mode_boost = 0; 3313 cpi->mb.zbin_mode_boost = 0;
3336 3314
3337 /* Enable or disable mode based tweaking of the zbin 3315 /* Enable or disable mode based tweaking of the zbin
3338 * For 2 Pass Only used where GF/ARF prediction quality 3316 * For 2 Pass Only used where GF/ARF prediction quality
3339 * is above a threshold 3317 * is above a threshold
3340 */ 3318 */
3341 cpi->zbin_mode_boost_enabled = 1; 3319 cpi->mb.zbin_mode_boost_enabled = 1;
3342 if (cpi->pass == 2) 3320 if (cpi->pass == 2)
3343 { 3321 {
3344 if ( cpi->gfu_boost <= 400 ) 3322 if ( cpi->gfu_boost <= 400 )
3345 { 3323 {
3346 cpi->zbin_mode_boost_enabled = 0; 3324 cpi->mb.zbin_mode_boost_enabled = 0;
3347 } 3325 }
3348 } 3326 }
3349 3327
3350 /* Current default encoder behaviour for the altref sign bias */ 3328 /* Current default encoder behaviour for the altref sign bias */
3351 if (cpi->source_alt_ref_active) 3329 if (cpi->source_alt_ref_active)
3352 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1; 3330 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
3353 else 3331 else
3354 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0; 3332 cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
3355 3333
3356 /* Check to see if a key frame is signalled 3334 /* Check to see if a key frame is signalled
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
3403 3381
3404 // Set the loop filter deltas and segmentation map update 3382 // Set the loop filter deltas and segmentation map update
3405 setup_features(cpi); 3383 setup_features(cpi);
3406 3384
3407 /* The alternate reference frame cannot be active for a key frame */ 3385 /* The alternate reference frame cannot be active for a key frame */
3408 cpi->source_alt_ref_active = 0; 3386 cpi->source_alt_ref_active = 0;
3409 3387
3410 /* Reset the RD threshold multipliers to default of * 1 (128) */ 3388 /* Reset the RD threshold multipliers to default of * 1 (128) */
3411 for (i = 0; i < MAX_MODES; i++) 3389 for (i = 0; i < MAX_MODES; i++)
3412 { 3390 {
3413 cpi->rd_thresh_mult[i] = 128; 3391 cpi->mb.rd_thresh_mult[i] = 128;
3414 } 3392 }
3415 } 3393 }
3416 3394
3417 #if 0 3395 #if 0
3418 /* Experimental code for lagged compress and one pass 3396 /* Experimental code for lagged compress and one pass
3419 * Initialise one_pass GF frames stats 3397 * Initialise one_pass GF frames stats
3420 * Update stats used for GF selection 3398 * Update stats used for GF selection
3421 */ 3399 */
3422 { 3400 {
3423 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS; 3401 cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
4092 * & compute new Q to try... 4070 * & compute new Q to try...
4093 */ 4071 */
4094 4072
4095 /* Frame is too large */ 4073 /* Frame is too large */
4096 if (cpi->projected_frame_size > cpi->this_frame_target) 4074 if (cpi->projected_frame_size > cpi->this_frame_target)
4097 { 4075 {
4098 /* Raise Qlow as to at least the current value */ 4076 /* Raise Qlow as to at least the current value */
4099 q_low = (Q < q_high) ? (Q + 1) : q_high; 4077 q_low = (Q < q_high) ? (Q + 1) : q_high;
4100 4078
4101 /* If we are using over quant do the same for zbin_oq_low */ 4079 /* If we are using over quant do the same for zbin_oq_low */
4102 if (cpi->zbin_over_quant > 0) 4080 if (cpi->mb.zbin_over_quant > 0)
4103 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (cpi-> zbin_over_quant + 1) : zbin_oq_high; 4081 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4082 (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4104 4083
4105 if (undershoot_seen) 4084 if (undershoot_seen)
4106 { 4085 {
4107 /* Update rate_correction_factor unless 4086 /* Update rate_correction_factor unless
4108 * cpi->active_worst_quality has changed. 4087 * cpi->active_worst_quality has changed.
4109 */ 4088 */
4110 if (!active_worst_qchanged) 4089 if (!active_worst_qchanged)
4111 vp8_update_rate_correction_factors(cpi, 1); 4090 vp8_update_rate_correction_factors(cpi, 1);
4112 4091
4113 Q = (q_high + q_low + 1) / 2; 4092 Q = (q_high + q_low + 1) / 2;
4114 4093
4115 /* Adjust cpi->zbin_over_quant (only allowed when Q 4094 /* Adjust cpi->zbin_over_quant (only allowed when Q
4116 * is max) 4095 * is max)
4117 */ 4096 */
4118 if (Q < MAXQ) 4097 if (Q < MAXQ)
4119 cpi->zbin_over_quant = 0; 4098 cpi->mb.zbin_over_quant = 0;
4120 else 4099 else
4121 { 4100 {
4122 zbin_oq_low = (cpi->zbin_over_quant < zbin_oq_high) ? (c pi->zbin_over_quant + 1) : zbin_oq_high; 4101 zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
4123 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2; 4102 (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
4103 cpi->mb.zbin_over_quant =
4104 (zbin_oq_high + zbin_oq_low) / 2;
4124 } 4105 }
4125 } 4106 }
4126 else 4107 else
4127 { 4108 {
4128 /* Update rate_correction_factor unless 4109 /* Update rate_correction_factor unless
4129 * cpi->active_worst_quality has changed. 4110 * cpi->active_worst_quality has changed.
4130 */ 4111 */
4131 if (!active_worst_qchanged) 4112 if (!active_worst_qchanged)
4132 vp8_update_rate_correction_factors(cpi, 0); 4113 vp8_update_rate_correction_factors(cpi, 0);
4133 4114
4134 Q = vp8_regulate_q(cpi, cpi->this_frame_target); 4115 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4135 4116
4136 while (((Q < q_low) || (cpi->zbin_over_quant < zbin_oq_low)) && (Retries < 10)) 4117 while (((Q < q_low) ||
4118 (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
4119 (Retries < 10))
4137 { 4120 {
4138 vp8_update_rate_correction_factors(cpi, 0); 4121 vp8_update_rate_correction_factors(cpi, 0);
4139 Q = vp8_regulate_q(cpi, cpi->this_frame_target); 4122 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4140 Retries ++; 4123 Retries ++;
4141 } 4124 }
4142 } 4125 }
4143 4126
4144 overshoot_seen = 1; 4127 overshoot_seen = 1;
4145 } 4128 }
4146 /* Frame is too small */ 4129 /* Frame is too small */
4147 else 4130 else
4148 { 4131 {
4149 if (cpi->zbin_over_quant == 0) 4132 if (cpi->mb.zbin_over_quant == 0)
4150 /* Lower q_high if not using over quant */ 4133 /* Lower q_high if not using over quant */
4151 q_high = (Q > q_low) ? (Q - 1) : q_low; 4134 q_high = (Q > q_low) ? (Q - 1) : q_low;
4152 else 4135 else
4153 /* else lower zbin_oq_high */ 4136 /* else lower zbin_oq_high */
4154 zbin_oq_high = (cpi->zbin_over_quant > zbin_oq_low) ? (cpi-> zbin_over_quant - 1) : zbin_oq_low; 4137 zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low) ?
4138 (cpi->mb.zbin_over_quant - 1) : zbin_oq_low;
4155 4139
4156 if (overshoot_seen) 4140 if (overshoot_seen)
4157 { 4141 {
4158 /* Update rate_correction_factor unless 4142 /* Update rate_correction_factor unless
4159 * cpi->active_worst_quality has changed. 4143 * cpi->active_worst_quality has changed.
4160 */ 4144 */
4161 if (!active_worst_qchanged) 4145 if (!active_worst_qchanged)
4162 vp8_update_rate_correction_factors(cpi, 1); 4146 vp8_update_rate_correction_factors(cpi, 1);
4163 4147
4164 Q = (q_high + q_low) / 2; 4148 Q = (q_high + q_low) / 2;
4165 4149
4166 /* Adjust cpi->zbin_over_quant (only allowed when Q 4150 /* Adjust cpi->zbin_over_quant (only allowed when Q
4167 * is max) 4151 * is max)
4168 */ 4152 */
4169 if (Q < MAXQ) 4153 if (Q < MAXQ)
4170 cpi->zbin_over_quant = 0; 4154 cpi->mb.zbin_over_quant = 0;
4171 else 4155 else
4172 cpi->zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2; 4156 cpi->mb.zbin_over_quant =
4157 (zbin_oq_high + zbin_oq_low) / 2;
4173 } 4158 }
4174 else 4159 else
4175 { 4160 {
4176 /* Update rate_correction_factor unless 4161 /* Update rate_correction_factor unless
4177 * cpi->active_worst_quality has changed. 4162 * cpi->active_worst_quality has changed.
4178 */ 4163 */
4179 if (!active_worst_qchanged) 4164 if (!active_worst_qchanged)
4180 vp8_update_rate_correction_factors(cpi, 0); 4165 vp8_update_rate_correction_factors(cpi, 0);
4181 4166
4182 Q = vp8_regulate_q(cpi, cpi->this_frame_target); 4167 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4183 4168
4184 /* Special case reset for qlow for constrained quality. 4169 /* Special case reset for qlow for constrained quality.
4185 * This should only trigger where there is very substantial 4170 * This should only trigger where there is very substantial
4186 * undershoot on a frame and the auto cq level is above 4171 * undershoot on a frame and the auto cq level is above
4187 * the user passsed in value. 4172 * the user passsed in value.
4188 */ 4173 */
4189 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) && 4174 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
4190 (Q < q_low) ) 4175 (Q < q_low) )
4191 { 4176 {
4192 q_low = Q; 4177 q_low = Q;
4193 } 4178 }
4194 4179
4195 while (((Q > q_high) || (cpi->zbin_over_quant > zbin_oq_high )) && (Retries < 10)) 4180 while (((Q > q_high) ||
4181 (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
4182 (Retries < 10))
4196 { 4183 {
4197 vp8_update_rate_correction_factors(cpi, 0); 4184 vp8_update_rate_correction_factors(cpi, 0);
4198 Q = vp8_regulate_q(cpi, cpi->this_frame_target); 4185 Q = vp8_regulate_q(cpi, cpi->this_frame_target);
4199 Retries ++; 4186 Retries ++;
4200 } 4187 }
4201 } 4188 }
4202 4189
4203 undershoot_seen = 1; 4190 undershoot_seen = 1;
4204 } 4191 }
4205 4192
4206 /* Clamp Q to upper and lower limits: */ 4193 /* Clamp Q to upper and lower limits: */
4207 if (Q > q_high) 4194 if (Q > q_high)
4208 Q = q_high; 4195 Q = q_high;
4209 else if (Q < q_low) 4196 else if (Q < q_low)
4210 Q = q_low; 4197 Q = q_low;
4211 4198
4212 /* Clamp cpi->zbin_over_quant */ 4199 /* Clamp cpi->zbin_over_quant */
4213 cpi->zbin_over_quant = (cpi->zbin_over_quant < zbin_oq_low) ? zbin_o q_low : (cpi->zbin_over_quant > zbin_oq_high) ? zbin_oq_high : cpi->zbin_over_qu ant; 4200 cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low) ?
4201 zbin_oq_low : (cpi->mb.zbin_over_quant > zbin_oq_high) ?
4202 zbin_oq_high : cpi->mb.zbin_over_quant;
4214 4203
4215 Loop = Q != last_q; 4204 Loop = Q != last_q;
4216 } 4205 }
4217 else 4206 else
4218 #endif 4207 #endif
4219 Loop = 0; 4208 Loop = 0;
4220 4209
4221 if (cpi->is_src_frame_alt_ref) 4210 if (cpi->is_src_frame_alt_ref)
4222 Loop = 0; 4211 Loop = 0;
4223 4212
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
4285 } 4274 }
4286 } 4275 }
4287 4276
4288 /* Count last ref frame 0,0 usage on current encoded frame. */ 4277 /* Count last ref frame 0,0 usage on current encoded frame. */
4289 { 4278 {
4290 int mb_row; 4279 int mb_row;
4291 int mb_col; 4280 int mb_col;
4292 /* Point to beginning of MODE_INFO arrays. */ 4281 /* Point to beginning of MODE_INFO arrays. */
4293 MODE_INFO *tmp = cm->mi; 4282 MODE_INFO *tmp = cm->mi;
4294 4283
4295 cpi->inter_zz_count = 0;
4296 cpi->zeromv_count = 0; 4284 cpi->zeromv_count = 0;
4297 4285
4298 if(cm->frame_type != KEY_FRAME) 4286 if(cm->frame_type != KEY_FRAME)
4299 { 4287 {
4300 for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++) 4288 for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
4301 { 4289 {
4302 for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++) 4290 for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
4303 { 4291 {
4304 if(tmp->mbmi.mode == ZEROMV && tmp->mbmi.ref_frame == LAST_F RAME)
4305 cpi->inter_zz_count++;
4306 if(tmp->mbmi.mode == ZEROMV) 4292 if(tmp->mbmi.mode == ZEROMV)
4307 cpi->zeromv_count++; 4293 cpi->zeromv_count++;
4308 tmp++; 4294 tmp++;
4309 } 4295 }
4310 tmp++; 4296 tmp++;
4311 } 4297 }
4312 } 4298 }
4313 } 4299 }
4314 4300
4315 #if CONFIG_MULTI_RES_ENCODING 4301 #if CONFIG_MULTI_RES_ENCODING
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
4725 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file); 4711 cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
4726 fclose(recon_file); 4712 fclose(recon_file);
4727 } 4713 }
4728 #endif 4714 #endif
4729 4715
4730 /* DEBUG */ 4716 /* DEBUG */
4731 /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */ 4717 /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
4732 4718
4733 4719
4734 } 4720 }
4735
4736
4737 static void check_gf_quality(VP8_COMP *cpi)
4738 {
4739 VP8_COMMON *cm = &cpi->common;
4740 int gf_active_pct = (100 * cpi->gf_active_count) / (cm->mb_rows * cm->mb_col s);
4741 int gf_ref_usage_pct = (cpi->count_mb_ref_frame_usage[GOLDEN_FRAME] * 100) / (cm->mb_rows * cm->mb_cols);
4742 int last_ref_zz_useage = (cpi->inter_zz_count * 100) / (cm->mb_rows * cm->mb _cols);
4743
4744 /* Gf refresh is not currently being signalled */
4745 if (cpi->gf_update_recommended == 0)
4746 {
4747 if (cpi->common.frames_since_golden > 7)
4748 {
4749 /* Low use of gf */
4750 if ((gf_active_pct < 10) || ((gf_active_pct + gf_ref_usage_pct) < 15 ))
4751 {
4752 /* ...but last frame zero zero usage is reasonbable so a
4753 * new gf might be appropriate
4754 */
4755 if (last_ref_zz_useage >= 25)
4756 {
4757 cpi->gf_bad_count ++;
4758
4759 /* Check that the condition is stable */
4760 if (cpi->gf_bad_count >= 8)
4761 {
4762 cpi->gf_update_recommended = 1;
4763 cpi->gf_bad_count = 0;
4764 }
4765 }
4766 else
4767 /* Restart count as the background is not stable enough */
4768 cpi->gf_bad_count = 0;
4769 }
4770 else
4771 /* Gf useage has picked up so reset count */
4772 cpi->gf_bad_count = 0;
4773 }
4774 }
4775 /* If the signal is set but has not been read should we cancel it. */
4776 else if (last_ref_zz_useage < 15)
4777 {
4778 cpi->gf_update_recommended = 0;
4779 cpi->gf_bad_count = 0;
4780 }
4781
4782 #if 0
4783 {
4784 FILE *f = fopen("gfneeded.stt", "a");
4785 fprintf(f, "%10d %10d %10d %10d %10ld \n",
4786 cm->current_video_frame,
4787 cpi->common.frames_since_golden,
4788 gf_active_pct, gf_ref_usage_pct,
4789 cpi->gf_update_recommended);
4790 fclose(f);
4791 }
4792
4793 #endif
4794 }
4795
4796 #if !(CONFIG_REALTIME_ONLY) 4721 #if !(CONFIG_REALTIME_ONLY)
4797 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags) 4722 static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
4798 { 4723 {
4799 4724
4800 if (!cpi->common.refresh_alt_ref_frame) 4725 if (!cpi->common.refresh_alt_ref_frame)
4801 vp8_second_pass(cpi); 4726 vp8_second_pass(cpi);
4802 4727
4803 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags); 4728 encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
4804 cpi->twopass.bits_left -= 8 * *size; 4729 cpi->twopass.bits_left -= 8 * *size;
4805 4730
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
5089 5014
5090 /* Restore layer specific context & set frame rate */ 5015 /* Restore layer specific context & set frame rate */
5091 layer = cpi->oxcf.layer_id[ 5016 layer = cpi->oxcf.layer_id[
5092 cm->current_video_frame % cpi->oxcf.periodicity]; 5017 cm->current_video_frame % cpi->oxcf.periodicity];
5093 restore_layer_context (cpi, layer); 5018 restore_layer_context (cpi, layer);
5094 vp8_new_frame_rate (cpi, cpi->layer_context[layer].frame_rate); 5019 vp8_new_frame_rate (cpi, cpi->layer_context[layer].frame_rate);
5095 } 5020 }
5096 5021
5097 if (cpi->compressor_speed == 2) 5022 if (cpi->compressor_speed == 2)
5098 { 5023 {
5099 if (cpi->oxcf.number_of_layers == 1)
5100 check_gf_quality(cpi);
5101 vpx_usec_timer_start(&tsctimer); 5024 vpx_usec_timer_start(&tsctimer);
5102 vpx_usec_timer_start(&ticktimer); 5025 vpx_usec_timer_start(&ticktimer);
5103 } 5026 }
5104 5027
5105 cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs; 5028 cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs;
5106 5029
5107 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING 5030 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
5108 { 5031 {
5109 int i; 5032 int i;
5110 const int num_part = (1 << cm->multi_token_partition); 5033 const int num_part = (1 << cm->multi_token_partition);
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
5588 } 5511 }
5589 5512
5590 return Total; 5513 return Total;
5591 } 5514 }
5592 5515
5593 5516
5594 int vp8_get_quantizer(VP8_COMP *cpi) 5517 int vp8_get_quantizer(VP8_COMP *cpi)
5595 { 5518 {
5596 return cpi->common.base_qindex; 5519 return cpi->common.base_qindex;
5597 } 5520 }
OLDNEW
« no previous file with comments | « source/libvpx/vp8/encoder/firstpass.c ('k') | source/libvpx/vp8/encoder/onyx_int.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698