| 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 | |
| 12 #include "./vpx_config.h" | 11 #include "./vpx_config.h" |
| 13 #include "./vp9_rtcd.h" | 12 #include "./vp9_rtcd.h" |
| 14 #include "vp9/encoder/vp9_encodeframe.h" | 13 #include "vp9/encoder/vp9_encodeframe.h" |
| 15 #include "vp9/encoder/vp9_encodemb.h" | 14 #include "vp9/encoder/vp9_encodemb.h" |
| 16 #include "vp9/encoder/vp9_encodemv.h" | 15 #include "vp9/encoder/vp9_encodemv.h" |
| 17 #include "vp9/common/vp9_common.h" | 16 #include "vp9/common/vp9_common.h" |
| 18 #include "vp9/encoder/vp9_onyx_int.h" | 17 #include "vp9/encoder/vp9_onyx_int.h" |
| 19 #include "vp9/common/vp9_extend.h" | 18 #include "vp9/common/vp9_extend.h" |
| 20 #include "vp9/common/vp9_entropy.h" | 19 #include "vp9/common/vp9_entropy.h" |
| 21 #include "vp9/common/vp9_entropymode.h" | 20 #include "vp9/common/vp9_entropymode.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 39 | 38 |
| 40 #define DBG_PRNT_SEGMAP 0 | 39 #define DBG_PRNT_SEGMAP 0 |
| 41 | 40 |
| 42 // #define ENC_DEBUG | 41 // #define ENC_DEBUG |
| 43 #ifdef ENC_DEBUG | 42 #ifdef ENC_DEBUG |
| 44 int enc_debug = 0; | 43 int enc_debug = 0; |
| 45 #endif | 44 #endif |
| 46 | 45 |
| 47 void vp9_select_interp_filter_type(VP9_COMP *cpi); | 46 void vp9_select_interp_filter_type(VP9_COMP *cpi); |
| 48 | 47 |
| 49 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, | 48 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled, |
| 50 int output_enabled, int mi_row, int mi_col, | 49 int mi_row, int mi_col, BLOCK_SIZE_TYPE bsize); |
| 51 BLOCK_SIZE_TYPE bsize); | |
| 52 | 50 |
| 53 static void adjust_act_zbin(VP9_COMP *cpi, MACROBLOCK *x); | 51 static void adjust_act_zbin(VP9_COMP *cpi, MACROBLOCK *x); |
| 54 | 52 |
| 55 /* activity_avg must be positive, or flat regions could get a zero weight | 53 /* activity_avg must be positive, or flat regions could get a zero weight |
| 56 * (infinite lambda), which confounds analysis. | 54 * (infinite lambda), which confounds analysis. |
| 57 * This also avoids the need for divide by zero checks in | 55 * This also avoids the need for divide by zero checks in |
| 58 * vp9_activity_masking(). | 56 * vp9_activity_masking(). |
| 59 */ | 57 */ |
| 60 #define VP9_ACTIVITY_AVG_MIN (64) | 58 #define VP9_ACTIVITY_AVG_MIN (64) |
| 61 | 59 |
| 62 /* This is used as a reference when computing the source variance for the | 60 /* This is used as a reference when computing the source variance for the |
| 63 * purposes of activity masking. | 61 * purposes of activity masking. |
| 64 * Eventually this should be replaced by custom no-reference routines, | 62 * Eventually this should be replaced by custom no-reference routines, |
| 65 * which will be faster. | 63 * which will be faster. |
| 66 */ | 64 */ |
| 67 static const uint8_t VP9_VAR_OFFS[16] = { | 65 static const uint8_t VP9_VAR_OFFS[16] = {128, 128, 128, 128, 128, 128, 128, 128, |
| 68 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 | 66 128, 128, 128, 128, 128, 128, 128, 128}; |
| 69 }; | |
| 70 | |
| 71 | 67 |
| 72 // Original activity measure from Tim T's code. | 68 // Original activity measure from Tim T's code. |
| 73 static unsigned int tt_activity_measure(VP9_COMP *cpi, MACROBLOCK *x) { | 69 static unsigned int tt_activity_measure(VP9_COMP *cpi, MACROBLOCK *x) { |
| 74 unsigned int act; | 70 unsigned int act; |
| 75 unsigned int sse; | 71 unsigned int sse; |
| 76 /* TODO: This could also be done over smaller areas (8x8), but that would | 72 /* TODO: This could also be done over smaller areas (8x8), but that would |
| 77 * require extensive changes elsewhere, as lambda is assumed to be fixed | 73 * require extensive changes elsewhere, as lambda is assumed to be fixed |
| 78 * over an entire MB in most of the code. | 74 * over an entire MB in most of the code. |
| 79 * Another option is to compute four 8x8 variances, and pick a single | 75 * Another option is to compute four 8x8 variances, and pick a single |
| 80 * lambda using a non-linear combination (e.g., the smallest, or second | 76 * lambda using a non-linear combination (e.g., the smallest, or second |
| 81 * smallest, etc.). | 77 * smallest, etc.). |
| 82 */ | 78 */ |
| 83 act = vp9_variance16x16(x->plane[0].src.buf, x->plane[0].src.stride, | 79 act = vp9_variance16x16(x->plane[0].src.buf, x->plane[0].src.stride, |
| 84 VP9_VAR_OFFS, 0, &sse); | 80 VP9_VAR_OFFS, 0, &sse); |
| 85 act <<= 4; | 81 act <<= 4; |
| 86 | 82 |
| 87 /* If the region is flat, lower the activity some more. */ | 83 /* If the region is flat, lower the activity some more. */ |
| 88 if (act < 8 << 12) | 84 if (act < 8 << 12) |
| 89 act = act < 5 << 12 ? act : 5 << 12; | 85 act = act < 5 << 12 ? act : 5 << 12; |
| 90 | 86 |
| 91 return act; | 87 return act; |
| 92 } | 88 } |
| 93 | 89 |
| 94 // Stub for alternative experimental activity measures. | 90 // Stub for alternative experimental activity measures. |
| 95 static unsigned int alt_activity_measure(VP9_COMP *cpi, | 91 static unsigned int alt_activity_measure(VP9_COMP *cpi, MACROBLOCK *x, |
| 96 MACROBLOCK *x, int use_dc_pred) { | 92 int use_dc_pred) { |
| 97 return vp9_encode_intra(cpi, x, use_dc_pred); | 93 return vp9_encode_intra(cpi, x, use_dc_pred); |
| 98 } | 94 } |
| 99 | 95 DECLARE_ALIGNED(16, static const uint8_t, vp9_64x64_zeros[64*64]) = {0}; |
| 100 DECLARE_ALIGNED(16, static const uint8_t, vp9_64x64_zeros[64*64]) = { 0 }; | |
| 101 | |
| 102 | 96 |
| 103 // Measure the activity of the current macroblock | 97 // Measure the activity of the current macroblock |
| 104 // What we measure here is TBD so abstracted to this function | 98 // What we measure here is TBD so abstracted to this function |
| 105 #define ALT_ACT_MEASURE 1 | 99 #define ALT_ACT_MEASURE 1 |
| 106 static unsigned int mb_activity_measure(VP9_COMP *cpi, MACROBLOCK *x, | 100 static unsigned int mb_activity_measure(VP9_COMP *cpi, MACROBLOCK *x, |
| 107 int mb_row, int mb_col) { | 101 int mb_row, int mb_col) { |
| 108 unsigned int mb_activity; | 102 unsigned int mb_activity; |
| 109 | 103 |
| 110 if (ALT_ACT_MEASURE) { | 104 if (ALT_ACT_MEASURE) { |
| 111 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); | 105 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 129 #if ACT_MEDIAN | 123 #if ACT_MEDIAN |
| 130 // Find median: Simple n^2 algorithm for experimentation | 124 // Find median: Simple n^2 algorithm for experimentation |
| 131 { | 125 { |
| 132 unsigned int median; | 126 unsigned int median; |
| 133 unsigned int i, j; | 127 unsigned int i, j; |
| 134 unsigned int *sortlist; | 128 unsigned int *sortlist; |
| 135 unsigned int tmp; | 129 unsigned int tmp; |
| 136 | 130 |
| 137 // Create a list to sort to | 131 // Create a list to sort to |
| 138 CHECK_MEM_ERROR(sortlist, | 132 CHECK_MEM_ERROR(sortlist, |
| 139 vpx_calloc(sizeof(unsigned int), | 133 vpx_calloc(sizeof(unsigned int), |
| 140 cpi->common.MBs)); | 134 cpi->common.MBs)); |
| 141 | 135 |
| 142 // Copy map to sort list | 136 // Copy map to sort list |
| 143 vpx_memcpy(sortlist, cpi->mb_activity_map, | 137 vpx_memcpy(sortlist, cpi->mb_activity_map, |
| 144 sizeof(unsigned int) * cpi->common.MBs); | 138 sizeof(unsigned int) * cpi->common.MBs); |
| 145 | |
| 146 | 139 |
| 147 // Ripple each value down to its correct position | 140 // Ripple each value down to its correct position |
| 148 for (i = 1; i < cpi->common.MBs; i ++) { | 141 for (i = 1; i < cpi->common.MBs; i ++) { |
| 149 for (j = i; j > 0; j --) { | 142 for (j = i; j > 0; j --) { |
| 150 if (sortlist[j] < sortlist[j - 1]) { | 143 if (sortlist[j] < sortlist[j - 1]) { |
| 151 // Swap values | 144 // Swap values |
| 152 tmp = sortlist[j - 1]; | 145 tmp = sortlist[j - 1]; |
| 153 sortlist[j - 1] = sortlist[j]; | 146 sortlist[j - 1] = sortlist[j]; |
| 154 sortlist[j] = tmp; | 147 sortlist[j] = tmp; |
| 155 } else | 148 } else |
| 156 break; | 149 break; |
| 157 } | 150 } |
| 158 } | 151 } |
| 159 | 152 |
| 160 // Even number MBs so estimate median as mean of two either side. | 153 // Even number MBs so estimate median as mean of two either side. |
| 161 median = (1 + sortlist[cpi->common.MBs >> 1] + | 154 median = (1 + sortlist[cpi->common.MBs >> 1] + |
| 162 sortlist[(cpi->common.MBs >> 1) + 1]) >> 1; | 155 sortlist[(cpi->common.MBs >> 1) + 1]) >> 1; |
| 163 | 156 |
| 164 cpi->activity_avg = median; | 157 cpi->activity_avg = median; |
| 165 | 158 |
| 166 vpx_free(sortlist); | 159 vpx_free(sortlist); |
| 167 } | 160 } |
| 168 #else | 161 #else |
| 169 // Simple mean for now | 162 // Simple mean for now |
| 170 cpi->activity_avg = (unsigned int)(activity_sum / cpi->common.MBs); | 163 cpi->activity_avg = (unsigned int) (activity_sum / cpi->common.MBs); |
| 171 #endif | 164 #endif |
| 172 | 165 |
| 173 if (cpi->activity_avg < VP9_ACTIVITY_AVG_MIN) | 166 if (cpi->activity_avg < VP9_ACTIVITY_AVG_MIN) |
| 174 cpi->activity_avg = VP9_ACTIVITY_AVG_MIN; | 167 cpi->activity_avg = VP9_ACTIVITY_AVG_MIN; |
| 175 | 168 |
| 176 // Experimental code: return fixed value normalized for several clips | 169 // Experimental code: return fixed value normalized for several clips |
| 177 if (ALT_ACT_MEASURE) | 170 if (ALT_ACT_MEASURE) |
| 178 cpi->activity_avg = 100000; | 171 cpi->activity_avg = 100000; |
| 179 } | 172 } |
| 180 | 173 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 204 // for each macroblock col in image | 197 // for each macroblock col in image |
| 205 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { | 198 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { |
| 206 // Read activity from the map | 199 // Read activity from the map |
| 207 act = *(x->mb_activity_ptr); | 200 act = *(x->mb_activity_ptr); |
| 208 | 201 |
| 209 // Calculate a normalized activity number | 202 // Calculate a normalized activity number |
| 210 a = act + 4 * cpi->activity_avg; | 203 a = act + 4 * cpi->activity_avg; |
| 211 b = 4 * act + cpi->activity_avg; | 204 b = 4 * act + cpi->activity_avg; |
| 212 | 205 |
| 213 if (b >= a) | 206 if (b >= a) |
| 214 *(x->activity_ptr) = (int)((b + (a >> 1)) / a) - 1; | 207 *(x->activity_ptr) = (int)((b + (a >> 1)) / a) - 1; |
| 215 else | 208 else |
| 216 *(x->activity_ptr) = 1 - (int)((a + (b >> 1)) / b); | 209 *(x->activity_ptr) = 1 - (int)((a + (b >> 1)) / b); |
| 217 | 210 |
| 218 #if OUTPUT_NORM_ACT_STATS | 211 #if OUTPUT_NORM_ACT_STATS |
| 219 fprintf(f, " %6d", *(x->mb_activity_ptr)); | 212 fprintf(f, " %6d", *(x->mb_activity_ptr)); |
| 220 #endif | 213 #endif |
| 221 // Increment activity map pointers | 214 // Increment activity map pointers |
| 222 x->mb_activity_ptr++; | 215 x->mb_activity_ptr++; |
| 223 } | 216 } |
| 224 | 217 |
| 225 #if OUTPUT_NORM_ACT_STATS | 218 #if OUTPUT_NORM_ACT_STATS |
| 226 fprintf(f, "\n"); | 219 fprintf(f, "\n"); |
| 227 #endif | 220 #endif |
| 228 | 221 |
| 229 } | 222 } |
| 230 | 223 |
| 231 #if OUTPUT_NORM_ACT_STATS | 224 #if OUTPUT_NORM_ACT_STATS |
| 232 fclose(f); | 225 fclose(f); |
| 233 #endif | 226 #endif |
| 234 | 227 |
| 235 } | 228 } |
| 236 #endif | 229 #endif |
| 237 | 230 |
| 238 // Loop through all MBs. Note activity of each, average activity and | 231 // Loop through all MBs. Note activity of each, average activity and |
| 239 // calculate a normalized activity for each | 232 // calculate a normalized activity for each |
| 240 static void build_activity_map(VP9_COMP *cpi) { | 233 static void build_activity_map(VP9_COMP *cpi) { |
| 241 MACROBLOCK *const x = &cpi->mb; | 234 MACROBLOCK * const x = &cpi->mb; |
| 242 MACROBLOCKD *xd = &x->e_mbd; | 235 MACROBLOCKD *xd = &x->e_mbd; |
| 243 VP9_COMMON *const cm = &cpi->common; | 236 VP9_COMMON * const cm = &cpi->common; |
| 244 | 237 |
| 245 #if ALT_ACT_MEASURE | 238 #if ALT_ACT_MEASURE |
| 246 YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx]; | 239 YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx]; |
| 247 int recon_yoffset; | 240 int recon_yoffset; |
| 248 int recon_y_stride = new_yv12->y_stride; | 241 int recon_y_stride = new_yv12->y_stride; |
| 249 #endif | 242 #endif |
| 250 | 243 |
| 251 int mb_row, mb_col; | 244 int mb_row, mb_col; |
| 252 unsigned int mb_activity; | 245 unsigned int mb_activity; |
| 253 int64_t activity_sum = 0; | 246 int64_t activity_sum = 0; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 278 // Store MB level activity details. | 271 // Store MB level activity details. |
| 279 *x->mb_activity_ptr = mb_activity; | 272 *x->mb_activity_ptr = mb_activity; |
| 280 | 273 |
| 281 // Increment activity map pointer | 274 // Increment activity map pointer |
| 282 x->mb_activity_ptr++; | 275 x->mb_activity_ptr++; |
| 283 | 276 |
| 284 // adjust to the next column of source macroblocks | 277 // adjust to the next column of source macroblocks |
| 285 x->plane[0].src.buf += 16; | 278 x->plane[0].src.buf += 16; |
| 286 } | 279 } |
| 287 | 280 |
| 288 | |
| 289 // adjust to the next row of mbs | 281 // adjust to the next row of mbs |
| 290 x->plane[0].src.buf += 16 * x->plane[0].src.stride - 16 * cm->mb_cols; | 282 x->plane[0].src.buf += 16 * x->plane[0].src.stride - 16 * cm->mb_cols; |
| 291 } | 283 } |
| 292 | 284 |
| 293 // Calculate an "average" MB activity | 285 // Calculate an "average" MB activity |
| 294 calc_av_activity(cpi, activity_sum); | 286 calc_av_activity(cpi, activity_sum); |
| 295 | 287 |
| 296 #if USE_ACT_INDEX | 288 #if USE_ACT_INDEX |
| 297 // Calculate an activity index number of each mb | 289 // Calculate an activity index number of each mb |
| 298 calc_activity_index(cpi, x); | 290 calc_activity_index(cpi, x); |
| 299 #endif | 291 #endif |
| 300 | 292 |
| 301 } | 293 } |
| 302 | 294 |
| 303 // Macroblock activity masking | 295 // Macroblock activity masking |
| 304 void vp9_activity_masking(VP9_COMP *cpi, MACROBLOCK *x) { | 296 void vp9_activity_masking(VP9_COMP *cpi, MACROBLOCK *x) { |
| 305 #if USE_ACT_INDEX | 297 #if USE_ACT_INDEX |
| 306 x->rdmult += *(x->mb_activity_ptr) * (x->rdmult >> 2); | 298 x->rdmult += *(x->mb_activity_ptr) * (x->rdmult >> 2); |
| 307 x->errorperbit = x->rdmult * 100 / (110 * x->rddiv); | 299 x->errorperbit = x->rdmult * 100 / (110 * x->rddiv); |
| 308 x->errorperbit += (x->errorperbit == 0); | 300 x->errorperbit += (x->errorperbit == 0); |
| 309 #else | 301 #else |
| 310 int64_t a; | 302 int64_t a; |
| 311 int64_t b; | 303 int64_t b; |
| 312 int64_t act = *(x->mb_activity_ptr); | 304 int64_t act = *(x->mb_activity_ptr); |
| 313 | 305 |
| 314 // Apply the masking to the RD multiplier. | 306 // Apply the masking to the RD multiplier. |
| 315 a = act + (2 * cpi->activity_avg); | 307 a = act + (2 * cpi->activity_avg); |
| 316 b = (2 * act) + cpi->activity_avg; | 308 b = (2 * act) + cpi->activity_avg; |
| 317 | 309 |
| 318 x->rdmult = (unsigned int)(((int64_t)x->rdmult * b + (a >> 1)) / a); | 310 x->rdmult = (unsigned int) (((int64_t) x->rdmult * b + (a >> 1)) / a); |
| 319 x->errorperbit = x->rdmult * 100 / (110 * x->rddiv); | 311 x->errorperbit = x->rdmult * 100 / (110 * x->rddiv); |
| 320 x->errorperbit += (x->errorperbit == 0); | 312 x->errorperbit += (x->errorperbit == 0); |
| 321 #endif | 313 #endif |
| 322 | 314 |
| 323 // Activity based Zbin adjustment | 315 // Activity based Zbin adjustment |
| 324 adjust_act_zbin(cpi, x); | 316 adjust_act_zbin(cpi, x); |
| 325 } | 317 } |
| 326 | 318 |
| 327 static void update_state(VP9_COMP *cpi, | 319 static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, |
| 328 PICK_MODE_CONTEXT *ctx, | 320 BLOCK_SIZE_TYPE bsize, int output_enabled) { |
| 329 BLOCK_SIZE_TYPE bsize, | |
| 330 int output_enabled) { | |
| 331 int i, x_idx, y; | 321 int i, x_idx, y; |
| 332 MACROBLOCK *const x = &cpi->mb; | 322 MACROBLOCK * const x = &cpi->mb; |
| 333 MACROBLOCKD *const xd = &x->e_mbd; | 323 MACROBLOCKD * const xd = &x->e_mbd; |
| 334 MODE_INFO *mi = &ctx->mic; | 324 MODE_INFO *mi = &ctx->mic; |
| 335 MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; | 325 MB_MODE_INFO * const mbmi = &xd->mode_info_context->mbmi; |
| 336 #if CONFIG_DEBUG || CONFIG_INTERNAL_STATS | 326 #if CONFIG_DEBUG || CONFIG_INTERNAL_STATS |
| 337 MB_PREDICTION_MODE mb_mode = mi->mbmi.mode; | 327 MB_PREDICTION_MODE mb_mode = mi->mbmi.mode; |
| 338 #endif | 328 #endif |
| 339 int mb_mode_index = ctx->best_mode_index; | 329 int mb_mode_index = ctx->best_mode_index; |
| 340 const int mis = cpi->common.mode_info_stride; | 330 const int mis = cpi->common.mode_info_stride; |
| 341 const int bh = 1 << mi_height_log2(bsize), bw = 1 << mi_width_log2(bsize); | 331 const int bh = 1 << mi_height_log2(bsize), bw = 1 << mi_width_log2(bsize); |
| 342 | 332 |
| 343 #if CONFIG_DEBUG | 333 #if CONFIG_DEBUG |
| 344 assert(mb_mode < MB_MODE_COUNT); | 334 assert(mb_mode < MB_MODE_COUNT); |
| 345 assert(mb_mode_index < MAX_MODES); | 335 assert(mb_mode_index < MAX_MODES); |
| 346 assert(mi->mbmi.ref_frame[0] < MAX_REF_FRAMES); | 336 assert(mi->mbmi.ref_frame[0] < MAX_REF_FRAMES); |
| 347 assert(mi->mbmi.ref_frame[1] < MAX_REF_FRAMES); | 337 assert(mi->mbmi.ref_frame[1] < MAX_REF_FRAMES); |
| 348 #endif | 338 #endif |
| 349 | 339 |
| 350 assert(mi->mbmi.sb_type == bsize); | 340 assert(mi->mbmi.sb_type == bsize); |
| 351 // Restore the coding context of the MB to that that was in place | 341 // Restore the coding context of the MB to that that was in place |
| 352 // when the mode was picked for it | 342 // when the mode was picked for it |
| 353 for (y = 0; y < bh; y++) { | 343 for (y = 0; y < bh; y++) { |
| 354 for (x_idx = 0; x_idx < bw; x_idx++) { | 344 for (x_idx = 0; x_idx < bw; x_idx++) { |
| 355 if ((xd->mb_to_right_edge >> (3 + LOG2_MI_SIZE)) + bw > x_idx && | 345 if ((xd->mb_to_right_edge >> (3 + LOG2_MI_SIZE)) + bw > x_idx |
| 356 (xd->mb_to_bottom_edge >> (3 + LOG2_MI_SIZE)) + bh > y) { | 346 && (xd->mb_to_bottom_edge >> (3 + LOG2_MI_SIZE)) + bh > y) { |
| 357 MODE_INFO *mi_addr = xd->mode_info_context + x_idx + y * mis; | 347 MODE_INFO *mi_addr = xd->mode_info_context + x_idx + y * mis; |
| 358 *mi_addr = *mi; | 348 *mi_addr = *mi; |
| 359 } | 349 } |
| 360 } | 350 } |
| 361 } | 351 } |
| 362 if (bsize < BLOCK_SIZE_SB32X32) { | 352 if (bsize < BLOCK_SIZE_SB32X32) { |
| 363 if (bsize < BLOCK_SIZE_MB16X16) | 353 if (bsize < BLOCK_SIZE_MB16X16) |
| 364 ctx->txfm_rd_diff[ALLOW_16X16] = ctx->txfm_rd_diff[ALLOW_8X8]; | 354 ctx->txfm_rd_diff[ALLOW_16X16] = ctx->txfm_rd_diff[ALLOW_8X8]; |
| 365 ctx->txfm_rd_diff[ALLOW_32X32] = ctx->txfm_rd_diff[ALLOW_16X16]; | 355 ctx->txfm_rd_diff[ALLOW_32X32] = ctx->txfm_rd_diff[ALLOW_16X16]; |
| 366 } | 356 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 THR_D153_PRED /*D153_PRED*/, | 391 THR_D153_PRED /*D153_PRED*/, |
| 402 THR_D27_PRED /*D27_PRED*/, | 392 THR_D27_PRED /*D27_PRED*/, |
| 403 THR_D63_PRED /*D63_PRED*/, | 393 THR_D63_PRED /*D63_PRED*/, |
| 404 THR_TM /*TM_PRED*/, | 394 THR_TM /*TM_PRED*/, |
| 405 THR_B_PRED /*I4X4_PRED*/, | 395 THR_B_PRED /*I4X4_PRED*/, |
| 406 }; | 396 }; |
| 407 cpi->mode_chosen_counts[kf_mode_index[mb_mode]]++; | 397 cpi->mode_chosen_counts[kf_mode_index[mb_mode]]++; |
| 408 #endif | 398 #endif |
| 409 } else { | 399 } else { |
| 410 /* | 400 /* |
| 411 // Reduce the activation RD thresholds for the best choice mode | 401 // Reduce the activation RD thresholds for the best choice mode |
| 412 if ((cpi->rd_baseline_thresh[mb_mode_index] > 0) && | 402 if ((cpi->rd_baseline_thresh[mb_mode_index] > 0) && |
| 413 (cpi->rd_baseline_thresh[mb_mode_index] < (INT_MAX >> 2))) | 403 (cpi->rd_baseline_thresh[mb_mode_index] < (INT_MAX >> 2))) |
| 414 { | 404 { |
| 415 int best_adjustment = (cpi->rd_thresh_mult[mb_mode_index] >> 2); | 405 int best_adjustment = (cpi->rd_thresh_mult[mb_mode_index] >> 2); |
| 416 | 406 |
| 417 cpi->rd_thresh_mult[mb_mode_index] = | 407 cpi->rd_thresh_mult[mb_mode_index] = |
| 418 (cpi->rd_thresh_mult[mb_mode_index] | 408 (cpi->rd_thresh_mult[mb_mode_index] |
| 419 >= (MIN_THRESHMULT + best_adjustment)) ? | 409 >= (MIN_THRESHMULT + best_adjustment)) ? |
| 420 cpi->rd_thresh_mult[mb_mode_index] - best_adjust
ment : | 410 cpi->rd_thresh_mult[mb_mode_index] - best_adjustment : |
| 421 MIN_THRESHMULT; | 411 MIN_THRESHMULT; |
| 422 cpi->rd_threshes[mb_mode_index] = | 412 cpi->rd_threshes[mb_mode_index] = |
| 423 (cpi->rd_baseline_thresh[mb_mode_index] >> 7) | 413 (cpi->rd_baseline_thresh[mb_mode_index] >> 7) |
| 424 * cpi->rd_thresh_mult[mb_mode_index]; | 414 * cpi->rd_thresh_mult[mb_mode_index]; |
| 425 | 415 |
| 426 } | 416 } |
| 427 */ | 417 */ |
| 428 // Note how often each mode chosen as best | 418 // Note how often each mode chosen as best |
| 429 cpi->mode_chosen_counts[mb_mode_index]++; | 419 cpi->mode_chosen_counts[mb_mode_index]++; |
| 430 if (mbmi->ref_frame[0] != INTRA_FRAME && | 420 if (mbmi->ref_frame[0] != INTRA_FRAME |
| 431 (mbmi->sb_type < BLOCK_SIZE_SB8X8 || mbmi->mode == NEWMV)) { | 421 && (mbmi->sb_type < BLOCK_SIZE_SB8X8 || mbmi->mode == NEWMV)) { |
| 432 int_mv best_mv, best_second_mv; | 422 int_mv best_mv, best_second_mv; |
| 433 const MV_REFERENCE_FRAME rf1 = mbmi->ref_frame[0]; | 423 const MV_REFERENCE_FRAME rf1 = mbmi->ref_frame[0]; |
| 434 const MV_REFERENCE_FRAME rf2 = mbmi->ref_frame[1]; | 424 const MV_REFERENCE_FRAME rf2 = mbmi->ref_frame[1]; |
| 435 best_mv.as_int = ctx->best_ref_mv.as_int; | 425 best_mv.as_int = ctx->best_ref_mv.as_int; |
| 436 best_second_mv.as_int = ctx->second_best_ref_mv.as_int; | 426 best_second_mv.as_int = ctx->second_best_ref_mv.as_int; |
| 437 if (mbmi->mode == NEWMV) { | 427 if (mbmi->mode == NEWMV) { |
| 438 best_mv.as_int = mbmi->ref_mvs[rf1][0].as_int; | 428 best_mv.as_int = mbmi->ref_mvs[rf1][0].as_int; |
| 439 best_second_mv.as_int = mbmi->ref_mvs[rf2][0].as_int; | 429 best_second_mv.as_int = mbmi->ref_mvs[rf2][0].as_int; |
| 440 } | 430 } |
| 441 mbmi->best_mv.as_int = best_mv.as_int; | 431 mbmi->best_mv.as_int = best_mv.as_int; |
| 442 mbmi->best_second_mv.as_int = best_second_mv.as_int; | 432 mbmi->best_second_mv.as_int = best_second_mv.as_int; |
| 443 vp9_update_nmv_count(cpi, x, &best_mv, &best_second_mv); | 433 vp9_update_nmv_count(cpi, x, &best_mv, &best_second_mv); |
| 444 } | 434 } |
| 445 | 435 |
| 446 if (bsize > BLOCK_SIZE_SB8X8 && mbmi->mode == NEWMV) { | 436 if (bsize > BLOCK_SIZE_SB8X8 && mbmi->mode == NEWMV) { |
| 447 int i, j; | 437 int i, j; |
| 448 for (j = 0; j < bh; ++j) | 438 for (j = 0; j < bh; ++j) |
| 449 for (i = 0; i < bw; ++i) | 439 for (i = 0; i < bw; ++i) |
| 450 if ((xd->mb_to_right_edge >> (3 + LOG2_MI_SIZE)) + bw > i && | 440 if ((xd->mb_to_right_edge >> (3 + LOG2_MI_SIZE)) + bw > i |
| 451 (xd->mb_to_bottom_edge >> (3 + LOG2_MI_SIZE)) + bh > j) | 441 && (xd->mb_to_bottom_edge >> (3 + LOG2_MI_SIZE)) + bh > j) |
| 452 xd->mode_info_context[mis * j + i].mbmi = *mbmi; | 442 xd->mode_info_context[mis * j + i].mbmi = *mbmi; |
| 453 } | 443 } |
| 454 | 444 |
| 455 if (cpi->common.mcomp_filter_type == SWITCHABLE && | 445 if (cpi->common.mcomp_filter_type == SWITCHABLE |
| 456 is_inter_mode(mbmi->mode)) { | 446 && is_inter_mode(mbmi->mode)) { |
| 457 ++cpi->common.fc.switchable_interp_count | 447 ++cpi->common.fc.switchable_interp_count[vp9_get_pred_context( |
| 458 [vp9_get_pred_context(&cpi->common, xd, PRED_SWITCHABLE_INTERP)] | 448 &cpi->common, xd, PRED_SWITCHABLE_INTERP)][vp9_switchable_interp_map[m
bmi |
| 459 [vp9_switchable_interp_map[mbmi->interp_filter]]; | 449 ->interp_filter]]; |
| 460 } | 450 } |
| 461 | 451 |
| 462 cpi->rd_comp_pred_diff[SINGLE_PREDICTION_ONLY] += ctx->single_pred_diff; | 452 cpi->rd_comp_pred_diff[SINGLE_PREDICTION_ONLY] += ctx->single_pred_diff; |
| 463 cpi->rd_comp_pred_diff[COMP_PREDICTION_ONLY] += ctx->comp_pred_diff; | 453 cpi->rd_comp_pred_diff[COMP_PREDICTION_ONLY] += ctx->comp_pred_diff; |
| 464 cpi->rd_comp_pred_diff[HYBRID_PREDICTION] += ctx->hybrid_pred_diff; | 454 cpi->rd_comp_pred_diff[HYBRID_PREDICTION] += ctx->hybrid_pred_diff; |
| 465 } | 455 } |
| 466 } | 456 } |
| 467 | 457 |
| 468 static unsigned find_seg_id(VP9_COMMON *cm, uint8_t *buf, BLOCK_SIZE_TYPE bsize, | 458 static unsigned find_seg_id(VP9_COMMON *cm, uint8_t *buf, BLOCK_SIZE_TYPE bsize, |
| 469 int start_y, int height, int start_x, int width) { | 459 int start_y, int height, int start_x, int width) { |
| 470 const int bw = 1 << mi_width_log2(bsize), bh = 1 << mi_height_log2(bsize); | 460 const int bw = 1 << mi_width_log2(bsize), bh = 1 << mi_height_log2(bsize); |
| 471 const int end_x = MIN(start_x + bw, width); | 461 const int end_x = MIN(start_x + bw, width); |
| 472 const int end_y = MIN(start_y + bh, height); | 462 const int end_y = MIN(start_y + bh, height); |
| 473 int x, y; | 463 int x, y; |
| 474 unsigned seg_id = -1; | 464 unsigned seg_id = -1; |
| 475 | 465 |
| 476 buf += width * start_y; | 466 buf += width * start_y; |
| 477 assert(start_y < cm->mi_rows && start_x < cm->cur_tile_mi_col_end); | 467 assert(start_y < cm->mi_rows && start_x < cm->cur_tile_mi_col_end); |
| 478 for (y = start_y; y < end_y; y++, buf += width) { | 468 for (y = start_y; y < end_y; y++, buf += width) { |
| 479 for (x = start_x; x < end_x; x++) { | 469 for (x = start_x; x < end_x; x++) { |
| 480 seg_id = MIN(seg_id, buf[x]); | 470 seg_id = MIN(seg_id, buf[x]); |
| 481 } | 471 } |
| 482 } | 472 } |
| 483 | 473 |
| 484 return seg_id; | 474 return seg_id; |
| 485 } | 475 } |
| 486 | 476 |
| 487 void vp9_setup_src_planes(MACROBLOCK *x, | 477 void vp9_setup_src_planes(MACROBLOCK *x, const YV12_BUFFER_CONFIG *src, |
| 488 const YV12_BUFFER_CONFIG *src, | |
| 489 int mb_row, int mb_col) { | 478 int mb_row, int mb_col) { |
| 490 uint8_t *buffers[4] = {src->y_buffer, src->u_buffer, src->v_buffer, | 479 uint8_t *buffers[4] = {src->y_buffer, src->u_buffer, src->v_buffer, src |
| 491 src->alpha_buffer}; | 480 ->alpha_buffer}; |
| 492 int strides[4] = {src->y_stride, src->uv_stride, src->uv_stride, | 481 int strides[4] = {src->y_stride, src->uv_stride, src->uv_stride, src |
| 493 src->alpha_stride}; | 482 ->alpha_stride}; |
| 494 int i; | 483 int i; |
| 495 | 484 |
| 496 for (i = 0; i < MAX_MB_PLANE; i++) { | 485 for (i = 0; i < MAX_MB_PLANE; i++) { |
| 497 setup_pred_plane(&x->plane[i].src, | 486 setup_pred_plane(&x->plane[i].src, buffers[i], strides[i], mb_row, mb_col, |
| 498 buffers[i], strides[i], | 487 NULL, x->e_mbd.plane[i].subsampling_x, |
| 499 mb_row, mb_col, NULL, | |
| 500 x->e_mbd.plane[i].subsampling_x, | |
| 501 x->e_mbd.plane[i].subsampling_y); | 488 x->e_mbd.plane[i].subsampling_y); |
| 502 } | 489 } |
| 503 } | 490 } |
| 504 | 491 |
| 505 static void set_offsets(VP9_COMP *cpi, | 492 static void set_offsets(VP9_COMP *cpi, int mi_row, int mi_col, |
| 506 int mi_row, int mi_col, BLOCK_SIZE_TYPE bsize) { | 493 BLOCK_SIZE_TYPE bsize) { |
| 507 MACROBLOCK *const x = &cpi->mb; | 494 MACROBLOCK * const x = &cpi->mb; |
| 508 VP9_COMMON *const cm = &cpi->common; | 495 VP9_COMMON * const cm = &cpi->common; |
| 509 MACROBLOCKD *const xd = &x->e_mbd; | 496 MACROBLOCKD * const xd = &x->e_mbd; |
| 510 MB_MODE_INFO *mbmi; | 497 MB_MODE_INFO *mbmi; |
| 511 const int dst_fb_idx = cm->new_fb_idx; | 498 const int dst_fb_idx = cm->new_fb_idx; |
| 512 const int idx_str = xd->mode_info_stride * mi_row + mi_col; | 499 const int idx_str = xd->mode_info_stride * mi_row + mi_col; |
| 513 const int bw = 1 << mi_width_log2(bsize), bh = 1 << mi_height_log2(bsize); | 500 const int bw = 1 << mi_width_log2(bsize), bh = 1 << mi_height_log2(bsize); |
| 514 const int mb_row = mi_row >> 1; | 501 const int mb_row = mi_row >> 1; |
| 515 const int mb_col = mi_col >> 1; | 502 const int mb_col = mi_col >> 1; |
| 516 const int idx_map = mb_row * cm->mb_cols + mb_col; | 503 const int idx_map = mb_row * cm->mb_cols + mb_col; |
| 517 int i; | 504 int i; |
| 518 | 505 |
| 519 // entropy context structures | 506 // entropy context structures |
| 520 for (i = 0; i < MAX_MB_PLANE; i++) { | 507 for (i = 0; i < MAX_MB_PLANE; i++) { |
| 521 xd->plane[i].above_context = cm->above_context[i] + | 508 xd->plane[i].above_context = cm->above_context[i] |
| 522 (mi_col * 2 >> xd->plane[i].subsampling_x); | 509 + (mi_col * 2 >> xd->plane[i].subsampling_x); |
| 523 xd->plane[i].left_context = cm->left_context[i] + | 510 xd->plane[i].left_context = cm->left_context[i] |
| 524 (((mi_row * 2) & 15) >> xd->plane[i].subsampling_y); | 511 + (((mi_row * 2) & 15) >> xd->plane[i].subsampling_y); |
| 525 } | 512 } |
| 526 | 513 |
| 527 // partition contexts | 514 // partition contexts |
| 528 set_partition_seg_context(cm, xd, mi_row, mi_col); | 515 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 529 | 516 |
| 530 // Activity map pointer | 517 // Activity map pointer |
| 531 x->mb_activity_ptr = &cpi->mb_activity_map[idx_map]; | 518 x->mb_activity_ptr = &cpi->mb_activity_map[idx_map]; |
| 532 x->active_ptr = cpi->active_map + idx_map; | 519 x->active_ptr = cpi->active_map + idx_map; |
| 533 | 520 |
| 534 /* pointers to mode info contexts */ | 521 /* pointers to mode info contexts */ |
| 535 x->partition_info = x->pi + idx_str; | 522 x->partition_info = x->pi + idx_str; |
| 536 xd->mode_info_context = cm->mi + idx_str; | 523 xd->mode_info_context = cm->mi + idx_str; |
| 537 mbmi = &xd->mode_info_context->mbmi; | 524 mbmi = &xd->mode_info_context->mbmi; |
| 538 // Special case: if prev_mi is NULL, the previous mode info context | 525 // Special case: if prev_mi is NULL, the previous mode info context |
| 539 // cannot be used. | 526 // cannot be used. |
| 540 xd->prev_mode_info_context = cm->prev_mi ? | 527 xd->prev_mode_info_context = cm->prev_mi ? cm->prev_mi + idx_str : NULL; |
| 541 cm->prev_mi + idx_str : NULL; | |
| 542 | 528 |
| 543 // Set up destination pointers | 529 // Set up destination pointers |
| 544 setup_dst_planes(xd, &cm->yv12_fb[dst_fb_idx], mi_row, mi_col); | 530 setup_dst_planes(xd, &cm->yv12_fb[dst_fb_idx], mi_row, mi_col); |
| 545 | 531 |
| 546 /* Set up limit values for MV components to prevent them from | 532 /* Set up limit values for MV components to prevent them from |
| 547 * extending beyond the UMV borders assuming 16x16 block size */ | 533 * extending beyond the UMV borders assuming 16x16 block size */ |
| 548 x->mv_row_min = -((mi_row * MI_SIZE) + VP9BORDERINPIXELS - VP9_INTERP_EXTEND); | 534 x->mv_row_min = -((mi_row * MI_SIZE)+ VP9BORDERINPIXELS - VP9_INTERP_EXTEND); |
| 549 x->mv_col_min = -((mi_col * MI_SIZE) + VP9BORDERINPIXELS - VP9_INTERP_EXTEND); | 535 x->mv_col_min = -((mi_col * MI_SIZE)+ VP9BORDERINPIXELS - VP9_INTERP_EXTEND); |
| 550 x->mv_row_max = ((cm->mi_rows - mi_row) * MI_SIZE + | 536 x->mv_row_max = ((cm->mi_rows - mi_row) * MI_SIZE |
| 551 (VP9BORDERINPIXELS - MI_SIZE * bh - VP9_INTERP_EXTEND)); | 537 + (VP9BORDERINPIXELS - MI_SIZE * bh - VP9_INTERP_EXTEND)); |
| 552 x->mv_col_max = ((cm->mi_cols - mi_col) * MI_SIZE + | 538 x->mv_col_max = ((cm->mi_cols - mi_col) * MI_SIZE |
| 553 (VP9BORDERINPIXELS - MI_SIZE * bw - VP9_INTERP_EXTEND)); | 539 + (VP9BORDERINPIXELS - MI_SIZE * bw - VP9_INTERP_EXTEND)); |
| 554 | 540 |
| 555 // Set up distance of MB to edge of frame in 1/8th pel units | 541 // Set up distance of MB to edge of frame in 1/8th pel units |
| 556 assert(!(mi_col & (bw - 1)) && !(mi_row & (bh - 1))); | 542 assert(!(mi_col & (bw - 1)) && !(mi_row & (bh - 1))); |
| 557 set_mi_row_col(cm, xd, mi_row, bh, mi_col, bw); | 543 set_mi_row_col(cm, xd, mi_row, bh, mi_col, bw); |
| 558 | 544 |
| 559 /* set up source buffers */ | 545 /* set up source buffers */ |
| 560 vp9_setup_src_planes(x, cpi->Source, mi_row, mi_col); | 546 vp9_setup_src_planes(x, cpi->Source, mi_row, mi_col); |
| 561 | 547 |
| 562 /* R/D setup */ | 548 /* R/D setup */ |
| 563 x->rddiv = cpi->RDDIV; | 549 x->rddiv = cpi->RDDIV; |
| 564 x->rdmult = cpi->RDMULT; | 550 x->rdmult = cpi->RDMULT; |
| 565 | 551 |
| 566 /* segment ID */ | 552 /* segment ID */ |
| 567 if (xd->segmentation_enabled) { | 553 if (xd->segmentation_enabled) { |
| 568 uint8_t *map = xd->update_mb_segmentation_map ? cpi->segmentation_map | 554 uint8_t *map = |
| 569 : cm->last_frame_seg_map; | 555 xd->update_mb_segmentation_map ? |
| 570 mbmi->segment_id = find_seg_id(cm, map, bsize, mi_row, | 556 cpi->segmentation_map : cm->last_frame_seg_map; |
| 571 cm->mi_rows, mi_col, cm->mi_cols); | 557 mbmi->segment_id = find_seg_id(cm, map, bsize, mi_row, cm->mi_rows, mi_col, |
| 558 cm->mi_cols); |
| 572 | 559 |
| 573 assert(mbmi->segment_id <= (MAX_MB_SEGMENTS-1)); | 560 assert(mbmi->segment_id <= (MAX_MB_SEGMENTS-1)); |
| 574 vp9_mb_init_quantizer(cpi, x); | 561 vp9_mb_init_quantizer(cpi, x); |
| 575 | 562 |
| 576 if (xd->segmentation_enabled && cpi->seg0_cnt > 0 && | 563 if (xd->segmentation_enabled && cpi->seg0_cnt > 0 |
| 577 !vp9_segfeature_active(xd, 0, SEG_LVL_REF_FRAME) && | 564 && !vp9_segfeature_active(xd, 0, SEG_LVL_REF_FRAME) |
| 578 vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME)) { | 565 && vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME)) { |
| 579 cpi->seg0_progress = (cpi->seg0_idx << 16) / cpi->seg0_cnt; | 566 cpi->seg0_progress = (cpi->seg0_idx << 16) / cpi->seg0_cnt; |
| 580 } else { | 567 } else { |
| 581 const int y = mb_row & ~3; | 568 const int y = mb_row & ~3; |
| 582 const int x = mb_col & ~3; | 569 const int x = mb_col & ~3; |
| 583 const int p16 = ((mb_row & 1) << 1) + (mb_col & 1); | 570 const int p16 = ((mb_row & 1) << 1) + (mb_col & 1); |
| 584 const int p32 = ((mb_row & 2) << 2) + ((mb_col & 2) << 1); | 571 const int p32 = ((mb_row & 2) << 2) + ((mb_col & 2) << 1); |
| 585 const int tile_progress = | 572 const int tile_progress = cm->cur_tile_mi_col_start * cm->mb_rows >> 1; |
| 586 cm->cur_tile_mi_col_start * cm->mb_rows >> 1; | 573 const int mb_cols = (cm->cur_tile_mi_col_end - cm->cur_tile_mi_col_start) |
| 587 const int mb_cols = | 574 >> 1; |
| 588 (cm->cur_tile_mi_col_end - cm->cur_tile_mi_col_start) >> 1; | |
| 589 | 575 |
| 590 cpi->seg0_progress = | 576 cpi->seg0_progress = ((y * mb_cols + x * 4 + p32 + p16 + tile_progress) |
| 591 ((y * mb_cols + x * 4 + p32 + p16 + tile_progress) << 16) / cm->MBs; | 577 << 16) / cm->MBs; |
| 592 } | 578 } |
| 593 } else { | 579 } else { |
| 594 mbmi->segment_id = 0; | 580 mbmi->segment_id = 0; |
| 595 } | 581 } |
| 596 } | 582 } |
| 597 | 583 |
| 598 static void pick_sb_modes(VP9_COMP *cpi, int mi_row, int mi_col, | 584 static void pick_sb_modes(VP9_COMP *cpi, int mi_row, int mi_col, |
| 599 TOKENEXTRA **tp, int *totalrate, int *totaldist, | 585 TOKENEXTRA **tp, int *totalrate, int *totaldist, |
| 600 BLOCK_SIZE_TYPE bsize, PICK_MODE_CONTEXT *ctx) { | 586 BLOCK_SIZE_TYPE bsize, PICK_MODE_CONTEXT *ctx) { |
| 601 VP9_COMMON *const cm = &cpi->common; | 587 VP9_COMMON * const cm = &cpi->common; |
| 602 MACROBLOCK *const x = &cpi->mb; | 588 MACROBLOCK * const x = &cpi->mb; |
| 603 MACROBLOCKD *const xd = &x->e_mbd; | 589 MACROBLOCKD * const xd = &x->e_mbd; |
| 604 | 590 |
| 605 x->rd_search = 1; | 591 x->rd_search = 1; |
| 606 | 592 |
| 607 if (bsize < BLOCK_SIZE_SB8X8) | 593 if (bsize < BLOCK_SIZE_SB8X8) |
| 608 if (xd->ab_index != 0) | 594 if (xd->ab_index != 0) |
| 609 return; | 595 return; |
| 610 | 596 |
| 611 set_offsets(cpi, mi_row, mi_col, bsize); | 597 set_offsets(cpi, mi_row, mi_col, bsize); |
| 612 xd->mode_info_context->mbmi.sb_type = bsize; | 598 xd->mode_info_context->mbmi.sb_type = bsize; |
| 613 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) | 599 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) |
| 614 vp9_activity_masking(cpi, x); | 600 vp9_activity_masking(cpi, x); |
| 615 | 601 |
| 616 /* Find best coding mode & reconstruct the MB so it is available | 602 /* Find best coding mode & reconstruct the MB so it is available |
| 617 * as a predictor for MBs that follow in the SB */ | 603 * as a predictor for MBs that follow in the SB */ |
| 618 if (cm->frame_type == KEY_FRAME) { | 604 if (cm->frame_type == KEY_FRAME) { |
| 619 vp9_rd_pick_intra_mode_sb(cpi, x, totalrate, totaldist, bsize, ctx); | 605 vp9_rd_pick_intra_mode_sb(cpi, x, totalrate, totaldist, bsize, ctx); |
| 620 } else { | 606 } else { |
| 621 vp9_rd_pick_inter_mode_sb(cpi, x, mi_row, mi_col, totalrate, totaldist, | 607 vp9_rd_pick_inter_mode_sb(cpi, x, mi_row, mi_col, totalrate, totaldist, |
| 622 bsize, ctx); | 608 bsize, ctx); |
| 623 } | 609 } |
| 624 } | 610 } |
| 625 | 611 |
| 626 static void update_stats(VP9_COMP *cpi, int mi_row, int mi_col) { | 612 static void update_stats(VP9_COMP *cpi, int mi_row, int mi_col) { |
| 627 VP9_COMMON *const cm = &cpi->common; | 613 VP9_COMMON * const cm = &cpi->common; |
| 628 MACROBLOCK *const x = &cpi->mb; | 614 MACROBLOCK * const x = &cpi->mb; |
| 629 MACROBLOCKD *const xd = &x->e_mbd; | 615 MACROBLOCKD * const xd = &x->e_mbd; |
| 630 MODE_INFO *mi = xd->mode_info_context; | 616 MODE_INFO *mi = xd->mode_info_context; |
| 631 MB_MODE_INFO *const mbmi = &mi->mbmi; | 617 MB_MODE_INFO * const mbmi = &mi->mbmi; |
| 632 | 618 |
| 633 if (cm->frame_type != KEY_FRAME) { | 619 if (cm->frame_type != KEY_FRAME) { |
| 634 int segment_id, seg_ref_active; | 620 int segment_id, seg_ref_active; |
| 635 | 621 |
| 636 segment_id = mbmi->segment_id; | 622 segment_id = mbmi->segment_id; |
| 637 seg_ref_active = vp9_segfeature_active(xd, segment_id, | 623 seg_ref_active = vp9_segfeature_active(xd, segment_id, SEG_LVL_REF_FRAME); |
| 638 SEG_LVL_REF_FRAME); | |
| 639 | 624 |
| 640 if (!seg_ref_active) | 625 if (!seg_ref_active) |
| 641 cpi->intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)] | 626 cpi->intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)][mbm
i |
| 642 [mbmi->ref_frame[0] > INTRA_FRAME]++; | 627 ->ref_frame[0] > INTRA_FRAME]++; |
| 643 | 628 |
| 644 // If the segment reference feature is enabled we have only a single | 629 // If the segment reference feature is enabled we have only a single |
| 645 // reference frame allowed for the segment so exclude it from | 630 // reference frame allowed for the segment so exclude it from |
| 646 // the reference frame counts used to work out probabilities. | 631 // the reference frame counts used to work out probabilities. |
| 647 if ((mbmi->ref_frame[0] > INTRA_FRAME) && !seg_ref_active) { | 632 if ((mbmi->ref_frame[0] > INTRA_FRAME) && !seg_ref_active) { |
| 648 if (cm->comp_pred_mode == HYBRID_PREDICTION) | 633 if (cm->comp_pred_mode == HYBRID_PREDICTION) |
| 649 cpi->comp_inter_count[vp9_get_pred_context(cm, xd, | 634 cpi->comp_inter_count[vp9_get_pred_context(cm, xd, |
| 650 PRED_COMP_INTER_INTER)] | 635 PRED_COMP_INTER_INTER)][mbmi |
| 651 [mbmi->ref_frame[1] > INTRA_FRAME]++; | 636 ->ref_frame[1] > INTRA_FRAME]++; |
| 652 | 637 |
| 653 if (mbmi->ref_frame[1] > INTRA_FRAME) { | 638 if (mbmi->ref_frame[1] > INTRA_FRAME) { |
| 654 cpi->comp_ref_count[vp9_get_pred_context(cm, xd, PRED_COMP_REF_P)] | 639 cpi->comp_ref_count[vp9_get_pred_context(cm, xd, PRED_COMP_REF_P)][mbmi |
| 655 [mbmi->ref_frame[0] == GOLDEN_FRAME]++; | 640 ->ref_frame[0] == GOLDEN_FRAME]++; |
| 656 } else { | 641 } else { |
| 657 cpi->single_ref_count[vp9_get_pred_context(cm, xd, PRED_SINGLE_REF_P1)] | 642 cpi->single_ref_count[vp9_get_pred_context(cm, xd, PRED_SINGLE_REF_P1)][
0][mbmi |
| 658 [0][mbmi->ref_frame[0] != LAST_FRAME]++; | 643 ->ref_frame[0] != LAST_FRAME]++; |
| 659 if (mbmi->ref_frame[0] != LAST_FRAME) | 644 if (mbmi->ref_frame[0] != LAST_FRAME) |
| 660 cpi->single_ref_count[vp9_get_pred_context(cm, xd, | 645 cpi->single_ref_count[vp9_get_pred_context(cm, xd, PRED_SINGLE_REF_P2)
][1][mbmi |
| 661 PRED_SINGLE_REF_P2)] | 646 ->ref_frame[0] != GOLDEN_FRAME]++; |
| 662 [1][mbmi->ref_frame[0] != GOLDEN_FRAME]++; | |
| 663 } | 647 } |
| 664 } | 648 } |
| 665 // Count of last ref frame 0,0 usage | 649 // Count of last ref frame 0,0 usage |
| 666 if ((mbmi->mode == ZEROMV) && (mbmi->ref_frame[0] == LAST_FRAME)) | 650 if ((mbmi->mode == ZEROMV) && (mbmi->ref_frame[0] == LAST_FRAME)) |
| 667 cpi->inter_zz_count++; | 651 cpi->inter_zz_count++; |
| 668 } | 652 } |
| 669 } | 653 } |
| 670 | 654 |
| 671 // TODO(jingning): the variables used here are little complicated. need further | 655 // TODO(jingning): the variables used here are little complicated. need further |
| 672 // refactoring on organizing the the temporary buffers, when recursive | 656 // refactoring on organizing the the temporary buffers, when recursive |
| 673 // partition down to 4x4 block size is enabled. | 657 // partition down to 4x4 block size is enabled. |
| 674 static PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x, | 658 static PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x, |
| 675 BLOCK_SIZE_TYPE bsize) { | 659 BLOCK_SIZE_TYPE bsize) { |
| 676 MACROBLOCKD *const xd = &x->e_mbd; | 660 MACROBLOCKD * const xd = &x->e_mbd; |
| 677 | 661 |
| 678 switch (bsize) { | 662 switch (bsize) { |
| 679 case BLOCK_SIZE_SB64X64: | 663 case BLOCK_SIZE_SB64X64: |
| 680 return &x->sb64_context; | 664 return &x->sb64_context; |
| 681 case BLOCK_SIZE_SB64X32: | 665 case BLOCK_SIZE_SB64X32: |
| 682 return &x->sb64x32_context[xd->sb_index]; | 666 return &x->sb64x32_context[xd->sb_index]; |
| 683 case BLOCK_SIZE_SB32X64: | 667 case BLOCK_SIZE_SB32X64: |
| 684 return &x->sb32x64_context[xd->sb_index]; | 668 return &x->sb32x64_context[xd->sb_index]; |
| 685 case BLOCK_SIZE_SB32X32: | 669 case BLOCK_SIZE_SB32X32: |
| 686 return &x->sb32_context[xd->sb_index]; | 670 return &x->sb32_context[xd->sb_index]; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 697 case BLOCK_SIZE_SB8X8: | 681 case BLOCK_SIZE_SB8X8: |
| 698 return &x->sb8x8_context[xd->sb_index][xd->mb_index][xd->b_index]; | 682 return &x->sb8x8_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 699 case BLOCK_SIZE_SB8X4: | 683 case BLOCK_SIZE_SB8X4: |
| 700 return &x->sb8x4_context[xd->sb_index][xd->mb_index][xd->b_index]; | 684 return &x->sb8x4_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 701 case BLOCK_SIZE_SB4X8: | 685 case BLOCK_SIZE_SB4X8: |
| 702 return &x->sb4x8_context[xd->sb_index][xd->mb_index][xd->b_index]; | 686 return &x->sb4x8_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 703 case BLOCK_SIZE_AB4X4: | 687 case BLOCK_SIZE_AB4X4: |
| 704 return &x->ab4x4_context[xd->sb_index][xd->mb_index][xd->b_index]; | 688 return &x->ab4x4_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 705 default: | 689 default: |
| 706 assert(0); | 690 assert(0); |
| 707 return NULL; | 691 return NULL ; |
| 708 } | 692 } |
| 709 } | 693 } |
| 710 | 694 |
| 711 static BLOCK_SIZE_TYPE *get_sb_partitioning(MACROBLOCK *x, | 695 static BLOCK_SIZE_TYPE *get_sb_partitioning(MACROBLOCK *x, |
| 712 BLOCK_SIZE_TYPE bsize) { | 696 BLOCK_SIZE_TYPE bsize) { |
| 713 MACROBLOCKD *xd = &x->e_mbd; | 697 MACROBLOCKD *xd = &x->e_mbd; |
| 714 switch (bsize) { | 698 switch (bsize) { |
| 715 case BLOCK_SIZE_SB64X64: | 699 case BLOCK_SIZE_SB64X64: |
| 716 return &x->sb64_partitioning; | 700 return &x->sb64_partitioning; |
| 717 case BLOCK_SIZE_SB32X32: | 701 case BLOCK_SIZE_SB32X32: |
| 718 return &x->sb_partitioning[xd->sb_index]; | 702 return &x->sb_partitioning[xd->sb_index]; |
| 719 case BLOCK_SIZE_MB16X16: | 703 case BLOCK_SIZE_MB16X16: |
| 720 return &x->mb_partitioning[xd->sb_index][xd->mb_index]; | 704 return &x->mb_partitioning[xd->sb_index][xd->mb_index]; |
| 721 case BLOCK_SIZE_SB8X8: | 705 case BLOCK_SIZE_SB8X8: |
| 722 return &x->b_partitioning[xd->sb_index][xd->mb_index][xd->b_index]; | 706 return &x->b_partitioning[xd->sb_index][xd->mb_index][xd->b_index]; |
| 723 default: | 707 default: |
| 724 assert(0); | 708 assert(0); |
| 725 return NULL; | 709 return NULL ; |
| 726 } | 710 } |
| 727 } | 711 } |
| 728 | 712 |
| 729 static void restore_context(VP9_COMP *cpi, int mi_row, int mi_col, | 713 static void restore_context(VP9_COMP *cpi, int mi_row, int mi_col, |
| 730 ENTROPY_CONTEXT a[16 * MAX_MB_PLANE], | 714 ENTROPY_CONTEXT a[16 * MAX_MB_PLANE], |
| 731 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], | 715 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], |
| 732 PARTITION_CONTEXT sa[8], | 716 PARTITION_CONTEXT sa[8], PARTITION_CONTEXT sl[8], |
| 733 PARTITION_CONTEXT sl[8], | |
| 734 BLOCK_SIZE_TYPE bsize) { | 717 BLOCK_SIZE_TYPE bsize) { |
| 735 VP9_COMMON *const cm = &cpi->common; | 718 VP9_COMMON * const cm = &cpi->common; |
| 736 MACROBLOCK *const x = &cpi->mb; | 719 MACROBLOCK * const x = &cpi->mb; |
| 737 MACROBLOCKD *const xd = &x->e_mbd; | 720 MACROBLOCKD * const xd = &x->e_mbd; |
| 738 int p; | 721 int p; |
| 739 int bwl = b_width_log2(bsize), bw = 1 << bwl; | 722 int bwl = b_width_log2(bsize), bw = 1 << bwl; |
| 740 int bhl = b_height_log2(bsize), bh = 1 << bhl; | 723 int bhl = b_height_log2(bsize), bh = 1 << bhl; |
| 741 int mwl = mi_width_log2(bsize), mw = 1 << mwl; | 724 int mwl = mi_width_log2(bsize), mw = 1 << mwl; |
| 742 int mhl = mi_height_log2(bsize), mh = 1 << mhl; | 725 int mhl = mi_height_log2(bsize), mh = 1 << mhl; |
| 743 for (p = 0; p < MAX_MB_PLANE; p++) { | 726 for (p = 0; p < MAX_MB_PLANE; p++) { |
| 744 vpx_memcpy(cm->above_context[p] + | 727 vpx_memcpy( |
| 745 ((mi_col * 2) >> xd->plane[p].subsampling_x), | 728 cm->above_context[p] + ((mi_col * 2) >> xd->plane[p].subsampling_x), |
| 746 a + bw * p, | 729 a + bw * p, sizeof(ENTROPY_CONTEXT) * bw >> xd->plane[p].subsampling_x); |
| 747 sizeof(ENTROPY_CONTEXT) * bw >> xd->plane[p].subsampling_x); | 730 vpx_memcpy( |
| 748 vpx_memcpy(cm->left_context[p] + | 731 cm->left_context[p] |
| 749 ((mi_row & MI_MASK) * 2 >> xd->plane[p].subsampling_y), | 732 + ((mi_row & MI_MASK)* 2 >> xd->plane[p].subsampling_y),l + bh * p, |
| 750 l + bh * p, | 733 sizeof(ENTROPY_CONTEXT) * bh >> xd->plane[p].subsampling_y); |
| 751 sizeof(ENTROPY_CONTEXT) * bh >> xd->plane[p].subsampling_y); | 734 } |
| 752 } | |
| 753 vpx_memcpy(cm->above_seg_context + mi_col, sa, | 735 vpx_memcpy(cm->above_seg_context + mi_col, sa, |
| 754 sizeof(PARTITION_CONTEXT) * mw); | 736 sizeof(PARTITION_CONTEXT) * mw); |
| 755 vpx_memcpy(cm->left_seg_context + (mi_row & MI_MASK), sl, | 737 vpx_memcpy(cm->left_seg_context + (mi_row & MI_MASK), sl, |
| 756 sizeof(PARTITION_CONTEXT) * mh); | 738 sizeof(PARTITION_CONTEXT) * mh) |
| 757 } | 739 ;} |
| 758 static void save_context(VP9_COMP *cpi, int mi_row, int mi_col, | 740 static void save_context(VP9_COMP *cpi, int mi_row, int mi_col, |
| 759 ENTROPY_CONTEXT a[16 * MAX_MB_PLANE], | 741 ENTROPY_CONTEXT a[16 * MAX_MB_PLANE], |
| 760 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], | 742 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], |
| 761 PARTITION_CONTEXT sa[8], | 743 PARTITION_CONTEXT sa[8], PARTITION_CONTEXT sl[8], |
| 762 PARTITION_CONTEXT sl[8], | 744 BLOCK_SIZE_TYPE bsize) { |
| 763 BLOCK_SIZE_TYPE bsize) { | 745 VP9_COMMON * const cm = &cpi->common; |
| 764 VP9_COMMON *const cm = &cpi->common; | 746 MACROBLOCK * const x = &cpi->mb; |
| 765 MACROBLOCK *const x = &cpi->mb; | 747 MACROBLOCKD * const xd = &x->e_mbd; |
| 766 MACROBLOCKD *const xd = &x->e_mbd; | |
| 767 int p; | 748 int p; |
| 768 int bwl = b_width_log2(bsize), bw = 1 << bwl; | 749 int bwl = b_width_log2(bsize), bw = 1 << bwl; |
| 769 int bhl = b_height_log2(bsize), bh = 1 << bhl; | 750 int bhl = b_height_log2(bsize), bh = 1 << bhl; |
| 770 int mwl = mi_width_log2(bsize), mw = 1 << mwl; | 751 int mwl = mi_width_log2(bsize), mw = 1 << mwl; |
| 771 int mhl = mi_height_log2(bsize), mh = 1 << mhl; | 752 int mhl = mi_height_log2(bsize), mh = 1 << mhl; |
| 772 | 753 |
| 773 // buffer the above/left context information of the block in search. | 754 // buffer the above/left context information of the block in search. |
| 774 for (p = 0; p < MAX_MB_PLANE; ++p) { | 755 for (p = 0; p < MAX_MB_PLANE; ++p) { |
| 775 vpx_memcpy(a + bw * p, cm->above_context[p] + | 756 vpx_memcpy( |
| 776 (mi_col * 2 >> xd->plane[p].subsampling_x), | 757 a + bw * p, |
| 777 sizeof(ENTROPY_CONTEXT) * bw >> xd->plane[p].subsampling_x); | 758 cm->above_context[p] + (mi_col * 2 >> xd->plane[p].subsampling_x), |
| 778 vpx_memcpy(l + bh * p, cm->left_context[p] + | 759 sizeof(ENTROPY_CONTEXT) * bw >> xd->plane[p].subsampling_x); |
| 779 ((mi_row & MI_MASK) * 2 >> xd->plane[p].subsampling_y), | 760 vpx_memcpy( |
| 780 sizeof(ENTROPY_CONTEXT) * bh >> xd->plane[p].subsampling_y); | 761 l + bh * p, |
| 781 } | 762 cm->left_context[p] |
| 763 + ((mi_row & MI_MASK)* 2 >> xd->plane[p].subsampling_y),sizeof(ENTRO
PY_CONTEXT) * bh >> xd->plane[p].subsampling_y); |
| 764 } |
| 782 vpx_memcpy(sa, cm->above_seg_context + mi_col, | 765 vpx_memcpy(sa, cm->above_seg_context + mi_col, |
| 783 sizeof(PARTITION_CONTEXT) * mw); | 766 sizeof(PARTITION_CONTEXT) * mw); |
| 784 vpx_memcpy(sl, cm->left_seg_context + (mi_row & MI_MASK), | 767 vpx_memcpy(sl, cm->left_seg_context + (mi_row & MI_MASK), |
| 785 sizeof(PARTITION_CONTEXT) * mh); | 768 sizeof(PARTITION_CONTEXT) * mh) |
| 786 } | 769 ;} |
| 787 | 770 |
| 788 static void encode_b(VP9_COMP *cpi, TOKENEXTRA **tp, | 771 static void encode_b(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, int mi_col, |
| 789 int mi_row, int mi_col, int output_enabled, | 772 int output_enabled, BLOCK_SIZE_TYPE bsize, int sub_index) { |
| 790 BLOCK_SIZE_TYPE bsize, int sub_index) { | 773 VP9_COMMON * const cm = &cpi->common; |
| 791 VP9_COMMON *const cm = &cpi->common; | 774 MACROBLOCK * const x = &cpi->mb; |
| 792 MACROBLOCK *const x = &cpi->mb; | 775 MACROBLOCKD * const xd = &x->e_mbd; |
| 793 MACROBLOCKD *const xd = &x->e_mbd; | |
| 794 | 776 |
| 795 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) | 777 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) |
| 796 return; | 778 return; |
| 797 | 779 |
| 798 if (sub_index != -1) | 780 if (sub_index != -1) |
| 799 *(get_sb_index(xd, bsize)) = sub_index; | 781 *(get_sb_index(xd, bsize)) = sub_index; |
| 800 | 782 |
| 801 if (bsize < BLOCK_SIZE_SB8X8) | 783 if (bsize < BLOCK_SIZE_SB8X8) |
| 802 if (xd->ab_index > 0) | 784 if (xd->ab_index > 0) |
| 803 return; | 785 return; |
| 804 set_offsets(cpi, mi_row, mi_col, bsize); | 786 set_offsets(cpi, mi_row, mi_col, bsize); |
| 805 update_state(cpi, get_block_context(x, bsize), bsize, output_enabled); | 787 update_state(cpi, get_block_context(x, bsize), bsize, output_enabled); |
| 806 encode_superblock(cpi, tp, output_enabled, mi_row, mi_col, bsize); | 788 encode_superblock(cpi, tp, output_enabled, mi_row, mi_col, bsize); |
| 807 | 789 |
| 808 if (output_enabled) { | 790 if (output_enabled) { |
| 809 update_stats(cpi, mi_row, mi_col); | 791 update_stats(cpi, mi_row, mi_col); |
| 810 | 792 |
| 811 (*tp)->token = EOSB_TOKEN; | 793 (*tp)->token = EOSB_TOKEN; |
| 812 (*tp)++; | 794 (*tp)++; |
| 813 } | 795 } |
| 814 } | 796 } |
| 815 | 797 |
| 816 static void encode_sb(VP9_COMP *cpi, TOKENEXTRA **tp, | 798 static void encode_sb(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, int mi_col, |
| 817 int mi_row, int mi_col, int output_enabled, | 799 int output_enabled, BLOCK_SIZE_TYPE bsize) { |
| 818 BLOCK_SIZE_TYPE bsize) { | 800 VP9_COMMON * const cm = &cpi->common; |
| 819 VP9_COMMON *const cm = &cpi->common; | 801 MACROBLOCK * const x = &cpi->mb; |
| 820 MACROBLOCK *const x = &cpi->mb; | 802 MACROBLOCKD * const xd = &x->e_mbd; |
| 821 MACROBLOCKD *const xd = &x->e_mbd; | |
| 822 BLOCK_SIZE_TYPE c1 = BLOCK_SIZE_SB8X8; | 803 BLOCK_SIZE_TYPE c1 = BLOCK_SIZE_SB8X8; |
| 823 const int bsl = b_width_log2(bsize), bs = (1 << bsl) / 4; | 804 const int bsl = b_width_log2(bsize), bs = (1 << bsl) / 4; |
| 824 int bwl, bhl; | 805 int bwl, bhl; |
| 825 int UNINITIALIZED_IS_SAFE(pl); | 806 int UNINITIALIZED_IS_SAFE(pl); |
| 826 | 807 |
| 827 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) | 808 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) |
| 828 return; | 809 return; |
| 829 | 810 |
| 830 c1 = BLOCK_SIZE_AB4X4; | 811 c1 = BLOCK_SIZE_AB4X4; |
| 831 if (bsize >= BLOCK_SIZE_SB8X8) { | 812 if (bsize >= BLOCK_SIZE_SB8X8) { |
| 832 set_partition_seg_context(cm, xd, mi_row, mi_col); | 813 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 833 pl = partition_plane_context(xd, bsize); | 814 pl = partition_plane_context(xd, bsize); |
| 834 c1 = *(get_sb_partitioning(x, bsize)); | 815 c1 = *(get_sb_partitioning(x, bsize)); |
| 835 } | 816 } |
| 836 | 817 |
| 837 bwl = b_width_log2(c1), bhl = b_height_log2(c1); | 818 bwl = b_width_log2(c1), bhl = b_height_log2(c1); |
| 838 | 819 |
| 839 if (bsl == bwl && bsl == bhl) { | 820 if (bsl == bwl && bsl == bhl) { |
| 840 if (output_enabled && bsize >= BLOCK_SIZE_SB8X8) | 821 if (output_enabled && bsize >= BLOCK_SIZE_SB8X8) |
| 841 cpi->partition_count[pl][PARTITION_NONE]++; | 822 cpi->partition_count[pl][PARTITION_NONE]++; |
| 842 encode_b(cpi, tp, mi_row, mi_col, output_enabled, c1, -1); | 823 encode_b(cpi, tp, mi_row, mi_col, output_enabled, c1, -1); |
| 843 } else if (bsl == bhl && bsl > bwl) { | 824 } else if (bsl == bhl && bsl > bwl) { |
| 844 if (output_enabled) | 825 if (output_enabled) |
| 845 cpi->partition_count[pl][PARTITION_VERT]++; | 826 cpi->partition_count[pl][PARTITION_VERT]++; |
| 846 encode_b(cpi, tp, mi_row, mi_col, output_enabled, c1, 0); | 827 encode_b(cpi, tp, mi_row, mi_col, output_enabled, c1, 0); |
| 847 encode_b(cpi, tp, mi_row, mi_col + bs, output_enabled, c1, 1); | 828 encode_b(cpi, tp, mi_row, mi_col + bs, output_enabled, c1, 1); |
| 848 } else if (bsl == bwl && bsl > bhl) { | 829 } else if (bsl == bwl && bsl > bhl) { |
| 849 if (output_enabled) | 830 if (output_enabled) |
| 850 cpi->partition_count[pl][PARTITION_HORZ]++; | 831 cpi->partition_count[pl][PARTITION_HORZ]++; |
| 851 encode_b(cpi, tp, mi_row, mi_col, output_enabled, c1, 0); | 832 encode_b(cpi, tp, mi_row, mi_col, output_enabled, c1, 0); |
| 852 encode_b(cpi, tp, mi_row + bs, mi_col, output_enabled, c1, 1); | 833 encode_b(cpi, tp, mi_row + bs, mi_col, output_enabled, c1, 1); |
| 853 } else { | 834 } else { |
| 854 BLOCK_SIZE_TYPE subsize; | 835 BLOCK_SIZE_TYPE subsize; |
| 855 int i; | 836 int i; |
| 856 | 837 |
| 857 assert(bwl < bsl && bhl < bsl); | 838 assert(bwl < bsl && bhl < bsl); |
| 858 subsize = get_subsize(bsize, PARTITION_SPLIT); | 839 subsize = get_subsize(bsize, PARTITION_SPLIT); |
| 859 | 840 |
| 860 if (output_enabled) | 841 if (output_enabled) |
| 861 cpi->partition_count[pl][PARTITION_SPLIT]++; | 842 cpi->partition_count[pl][PARTITION_SPLIT]++; |
| 862 | 843 |
| 863 for (i = 0; i < 4; i++) { | 844 for (i = 0; i < 4; i++) { |
| 864 const int x_idx = i & 1, y_idx = i >> 1; | 845 const int x_idx = i & 1, y_idx = i >> 1; |
| 865 | 846 |
| 866 *(get_sb_index(xd, subsize)) = i; | 847 *(get_sb_index(xd, subsize)) = i; |
| 867 encode_sb(cpi, tp, mi_row + y_idx * bs, mi_col + x_idx * bs, | 848 encode_sb(cpi, tp, mi_row + y_idx * bs, mi_col + x_idx * bs, |
| 868 output_enabled, subsize); | 849 output_enabled, subsize); |
| 869 } | 850 } |
| 870 } | 851 } |
| 871 | 852 |
| 872 if (bsize >= BLOCK_SIZE_SB8X8 && | 853 if (bsize >= BLOCK_SIZE_SB8X8 |
| 873 (bsize == BLOCK_SIZE_SB8X8 || bsl == bwl || bsl == bhl)) { | 854 && (bsize == BLOCK_SIZE_SB8X8 || bsl == bwl || bsl == bhl)) { |
| 874 set_partition_seg_context(cm, xd, mi_row, mi_col); | 855 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 875 update_partition_context(xd, c1, bsize); | 856 update_partition_context(xd, c1, bsize); |
| 876 } | 857 } |
| 877 } | 858 } |
| 878 | 859 |
| 879 static void set_partitioning(VP9_COMP *cpi, MODE_INFO *m, | 860 static void set_partitioning(VP9_COMP *cpi, MODE_INFO *m, |
| 880 BLOCK_SIZE_TYPE bsize) { | 861 BLOCK_SIZE_TYPE bsize) { |
| 881 VP9_COMMON *const cm = &cpi->common; | 862 VP9_COMMON *const cm = &cpi->common; |
| 882 const int mis = cm->mode_info_stride; | 863 const int mis = cm->mode_info_stride; |
| 883 int bsl = b_width_log2(bsize); | |
| 884 int bs = (1 << bsl) / 2; // | |
| 885 int block_row, block_col; | 864 int block_row, block_col; |
| 886 int row, col; | 865 for (block_row = 0; block_row < 8; ++block_row) { |
| 887 | 866 for (block_col = 0; block_col < 8; ++block_col) { |
| 888 // this test function sets the entire macroblock to the same bsize | 867 m[block_row * mis + block_col].mbmi.sb_type = bsize; |
| 889 for (block_row = 0; block_row < 8; block_row += bs) { | 868 } |
| 890 for (block_col = 0; block_col < 8; block_col += bs) { | 869 } |
| 891 for (row = 0; row < bs; row++) { | 870 } |
| 892 for (col = 0; col < bs; col++) { | 871 static void copy_partitioning(VP9_COMP *cpi, MODE_INFO *m, MODE_INFO *p) { |
| 893 m[(block_row+row)*mis + block_col+col].mbmi.sb_type = bsize; | 872 VP9_COMMON *const cm = &cpi->common; |
| 894 } | 873 const int mis = cm->mode_info_stride; |
| 895 } | 874 int block_row, block_col; |
| 875 for (block_row = 0; block_row < 8; ++block_row) { |
| 876 for (block_col = 0; block_col < 8; ++block_col) { |
| 877 m[block_row * mis + block_col].mbmi.sb_type = |
| 878 p[block_row * mis + block_col].mbmi.sb_type; |
| 896 } | 879 } |
| 897 } | 880 } |
| 898 } | 881 } |
| 899 | 882 |
| 900 static void set_block_size(VP9_COMMON *const cm, | 883 static void set_block_size(VP9_COMMON * const cm, MODE_INFO *m, |
| 901 MODE_INFO *m, BLOCK_SIZE_TYPE bsize, int mis, | 884 BLOCK_SIZE_TYPE bsize, int mis, int mi_row, |
| 902 int mi_row, int mi_col) { | 885 int mi_col) { |
| 903 int row, col; | 886 int row, col; |
| 904 int bwl = b_width_log2(bsize); | 887 int bwl = b_width_log2(bsize); |
| 905 int bhl = b_height_log2(bsize); | 888 int bhl = b_height_log2(bsize); |
| 906 int bsl = (bwl > bhl ? bwl : bhl); | 889 int bsl = (bwl > bhl ? bwl : bhl); |
| 907 | 890 |
| 908 int bs = (1 << bsl) / 2; // | 891 int bs = (1 << bsl) / 2; // |
| 909 MODE_INFO *m2 = m + mi_row * mis + mi_col; | 892 MODE_INFO *m2 = m + mi_row * mis + mi_col; |
| 910 for (row = 0; row < bs; row++) { | 893 for (row = 0; row < bs; row++) { |
| 911 for (col = 0; col < bs; col++) { | 894 for (col = 0; col < bs; col++) { |
| 912 if (mi_row + row >= cm->mi_rows || mi_col + col >= cm->mi_cols) | 895 if (mi_row + row >= cm->mi_rows || mi_col + col >= cm->mi_cols) |
| 913 continue; | 896 continue; |
| 914 m2[row*mis+col].mbmi.sb_type = bsize; | 897 m2[row * mis + col].mbmi.sb_type = bsize; |
| 915 } | 898 } |
| 916 } | 899 } |
| 917 } | 900 } |
| 901 |
| 918 typedef struct { | 902 typedef struct { |
| 919 int64_t sum_square_error; | 903 int64_t sum_square_error; |
| 920 int64_t sum_error; | 904 int64_t sum_error; |
| 921 int count; | 905 int count; |
| 922 int variance; | 906 int variance; |
| 923 } var; | 907 } var; |
| 924 | 908 |
| 909 typedef struct { |
| 910 var none; |
| 911 var horz[2]; |
| 912 var vert[2]; |
| 913 } partition_variance; |
| 914 |
| 925 #define VT(TYPE, BLOCKSIZE) \ | 915 #define VT(TYPE, BLOCKSIZE) \ |
| 926 typedef struct { \ | 916 typedef struct { \ |
| 927 var none; \ | 917 partition_variance vt; \ |
| 928 var horz[2]; \ | |
| 929 var vert[2]; \ | |
| 930 BLOCKSIZE split[4]; } TYPE; | 918 BLOCKSIZE split[4]; } TYPE; |
| 931 | 919 |
| 932 VT(v8x8, var) | 920 VT(v8x8, var) |
| 933 VT(v16x16, v8x8) | 921 VT(v16x16, v8x8) |
| 934 VT(v32x32, v16x16) | 922 VT(v32x32, v16x16) |
| 935 VT(v64x64, v32x32) | 923 VT(v64x64, v32x32) |
| 936 | 924 |
| 925 typedef struct { |
| 926 partition_variance *vt; |
| 927 var *split[4]; |
| 928 } vt_node; |
| 929 |
| 937 typedef enum { | 930 typedef enum { |
| 938 V16X16, | 931 V16X16, |
| 939 V32X32, | 932 V32X32, |
| 940 V64X64, | 933 V64X64, |
| 941 } TREE_LEVEL; | 934 } TREE_LEVEL; |
| 942 | 935 |
| 936 static void tree_to_node(void *data, BLOCK_SIZE_TYPE block_size, vt_node *node)
{ |
| 937 int i; |
| 938 switch (block_size) { |
| 939 case BLOCK_SIZE_SB64X64: { |
| 940 v64x64 *vt = (v64x64 *) data; |
| 941 node->vt = &vt->vt; |
| 942 for (i = 0; i < 4; i++) |
| 943 node->split[i] = &vt->split[i].vt.none; |
| 944 break; |
| 945 } |
| 946 case BLOCK_SIZE_SB32X32: { |
| 947 v32x32 *vt = (v32x32 *) data; |
| 948 node->vt = &vt->vt; |
| 949 for (i = 0; i < 4; i++) |
| 950 node->split[i] = &vt->split[i].vt.none; |
| 951 break; |
| 952 } |
| 953 case BLOCK_SIZE_MB16X16: { |
| 954 v16x16 *vt = (v16x16 *) data; |
| 955 node->vt = &vt->vt; |
| 956 for (i = 0; i < 4; i++) |
| 957 node->split[i] = &vt->split[i].vt.none; |
| 958 break; |
| 959 } |
| 960 case BLOCK_SIZE_SB8X8: { |
| 961 v8x8 *vt = (v8x8 *) data; |
| 962 node->vt = &vt->vt; |
| 963 for (i = 0; i < 4; i++) |
| 964 node->split[i] = &vt->split[i]; |
| 965 break; |
| 966 } |
| 967 default: |
| 968 node->vt = 0; |
| 969 for (i = 0; i < 4; i++) |
| 970 node->split[i] = 0; |
| 971 assert(-1); |
| 972 } |
| 973 } |
| 974 |
| 943 // Set variance values given sum square error, sum error, count. | 975 // Set variance values given sum square error, sum error, count. |
| 944 static void fill_variance(var *v, int64_t s2, int64_t s, int c) { | 976 static void fill_variance(var *v, int64_t s2, int64_t s, int c) { |
| 945 v->sum_square_error = s2; | 977 v->sum_square_error = s2; |
| 946 v->sum_error = s; | 978 v->sum_error = s; |
| 947 v->count = c; | 979 v->count = c; |
| 948 v->variance = 256 | 980 if (c > 0) |
| 949 * (v->sum_square_error - v->sum_error * v->sum_error / v->count) | 981 v->variance = 256 |
| 950 / v->count; | 982 * (v->sum_square_error - v->sum_error * v->sum_error / v->count) |
| 983 / v->count; |
| 984 else |
| 985 v->variance = 0; |
| 951 } | 986 } |
| 952 | 987 |
| 953 // Combine 2 variance structures by summing the sum_error, sum_square_error, | 988 // Combine 2 variance structures by summing the sum_error, sum_square_error, |
| 954 // and counts and then calculating the new variance. | 989 // and counts and then calculating the new variance. |
| 955 void sum_2_variances(var *r, var *a, var*b) { | 990 void sum_2_variances(var *r, var *a, var*b) { |
| 956 fill_variance(r, a->sum_square_error + b->sum_square_error, | 991 fill_variance(r, a->sum_square_error + b->sum_square_error, |
| 957 a->sum_error + b->sum_error, a->count + b->count); | 992 a->sum_error + b->sum_error, a->count + b->count); |
| 958 } | 993 } |
| 959 // Fill one level of our variance tree, by summing the split sums into each of | |
| 960 // the horizontal, vertical and none from split and recalculating variance. | |
| 961 #define fill_variance_tree(VT) \ | |
| 962 sum_2_variances(VT.horz[0], VT.split[0].none, VT.split[1].none); \ | |
| 963 sum_2_variances(VT.horz[1], VT.split[2].none, VT.split[3].none); \ | |
| 964 sum_2_variances(VT.vert[0], VT.split[0].none, VT.split[2].none); \ | |
| 965 sum_2_variances(VT.vert[1], VT.split[1].none, VT.split[3].none); \ | |
| 966 sum_2_variances(VT.none, VT.vert[0], VT.vert[1]); | |
| 967 | 994 |
| 968 // Set the blocksize in the macroblock info structure if the variance is less | 995 static void fill_variance_tree(void *data, BLOCK_SIZE_TYPE block_size) { |
| 969 // than our threshold to one of none, horz, vert. | 996 vt_node node; |
| 970 #define set_vt_size(VT, BLOCKSIZE, R, C, ACTION) \ | 997 tree_to_node(data, block_size, &node); |
| 971 if (VT.none.variance < threshold) { \ | 998 sum_2_variances(&node.vt->horz[0], node.split[0], node.split[1]); |
| 972 set_block_size(cm, m, BLOCKSIZE, mis, R, C); \ | 999 sum_2_variances(&node.vt->horz[1], node.split[2], node.split[3]); |
| 973 ACTION; \ | 1000 sum_2_variances(&node.vt->vert[0], node.split[0], node.split[2]); |
| 974 } \ | 1001 sum_2_variances(&node.vt->vert[1], node.split[1], node.split[3]); |
| 975 if (VT.horz[0].variance < threshold && VT.horz[1].variance < threshold ) { \ | 1002 sum_2_variances(&node.vt->none, &node.vt->vert[0], &node.vt->vert[1]); |
| 976 set_block_size(cm, m, get_subsize(BLOCKSIZE, PARTITION_HORZ), mis, R, C); \ | 1003 } |
| 977 ACTION; \ | 1004 |
| 978 } \ | 1005 #if PERFORM_RANDOM_PARTITIONING |
| 979 if (VT.vert[0].variance < threshold && VT.vert[1].variance < threshold ) { \ | 1006 static int set_vt_partitioning(VP9_COMP *cpi, void *data, MODE_INFO *m, |
| 980 set_block_size(cm, m, get_subsize(BLOCKSIZE, PARTITION_VERT), mis, R, C); \ | 1007 BLOCK_SIZE_TYPE block_size, int mi_row, |
| 981 ACTION; \ | 1008 int mi_col, int mi_size) { |
| 1009 VP9_COMMON * const cm = &cpi->common; |
| 1010 vt_node vt; |
| 1011 const int mis = cm->mode_info_stride; |
| 1012 int64_t threshold = 4 * cpi->common.base_qindex * cpi->common.base_qindex; |
| 1013 |
| 1014 tree_to_node(data, block_size, &vt); |
| 1015 |
| 1016 // split none is available only if we have more than half a block size |
| 1017 // in width and height inside the visible image |
| 1018 if (mi_col + mi_size < cm->mi_cols && mi_row + mi_size < cm->mi_rows && |
| 1019 (rand() & 3) < 1) { |
| 1020 set_block_size(cm, m, block_size, mis, mi_row, mi_col); |
| 1021 return 1; |
| 982 } | 1022 } |
| 983 | 1023 |
| 1024 // vertical split is available on all but the bottom border |
| 1025 if (mi_row + mi_size < cm->mi_rows && vt.vt->vert[0].variance < threshold |
| 1026 && (rand() & 3) < 1) { |
| 1027 set_block_size(cm, m, get_subsize(block_size, PARTITION_VERT), mis, mi_row, |
| 1028 mi_col); |
| 1029 return 1; |
| 1030 } |
| 1031 |
| 1032 // horizontal split is available on all but the right border |
| 1033 if (mi_col + mi_size < cm->mi_cols && vt.vt->horz[0].variance < threshold |
| 1034 && (rand() & 3) < 1) { |
| 1035 set_block_size(cm, m, get_subsize(block_size, PARTITION_HORZ), mis, mi_row, |
| 1036 mi_col); |
| 1037 return 1; |
| 1038 } |
| 1039 |
| 1040 return 0; |
| 1041 } |
| 1042 |
| 1043 #else |
| 1044 |
| 1045 static int set_vt_partitioning(VP9_COMP *cpi, void *data, MODE_INFO *m, |
| 1046 BLOCK_SIZE_TYPE block_size, int mi_row, |
| 1047 int mi_col, int mi_size) { |
| 1048 VP9_COMMON * const cm = &cpi->common; |
| 1049 vt_node vt; |
| 1050 const int mis = cm->mode_info_stride; |
| 1051 int64_t threshold = 50 * cpi->common.base_qindex; |
| 1052 |
| 1053 tree_to_node(data, block_size, &vt); |
| 1054 |
| 1055 // split none is available only if we have more than half a block size |
| 1056 // in width and height inside the visible image |
| 1057 if (mi_col + mi_size < cm->mi_cols && mi_row + mi_size < cm->mi_rows |
| 1058 && vt.vt->none.variance < threshold) { |
| 1059 set_block_size(cm, m, block_size, mis, mi_row, mi_col); |
| 1060 return 1; |
| 1061 } |
| 1062 |
| 1063 // vertical split is available on all but the bottom border |
| 1064 if (mi_row + mi_size < cm->mi_rows && vt.vt->vert[0].variance < threshold |
| 1065 && vt.vt->vert[1].variance < threshold) { |
| 1066 set_block_size(cm, m, get_subsize(block_size, PARTITION_VERT), mis, mi_row, |
| 1067 mi_col); |
| 1068 return 1; |
| 1069 } |
| 1070 |
| 1071 // horizontal split is available on all but the right border |
| 1072 if (mi_col + mi_size < cm->mi_cols && vt.vt->horz[0].variance < threshold |
| 1073 && vt.vt->horz[1].variance < threshold) { |
| 1074 set_block_size(cm, m, get_subsize(block_size, PARTITION_HORZ), mis, mi_row, |
| 1075 mi_col); |
| 1076 return 1; |
| 1077 } |
| 1078 |
| 1079 return 0; |
| 1080 } |
| 1081 #endif |
| 1082 |
| 984 static void choose_partitioning(VP9_COMP *cpi, MODE_INFO *m, int mi_row, | 1083 static void choose_partitioning(VP9_COMP *cpi, MODE_INFO *m, int mi_row, |
| 985 int mi_col) { | 1084 int mi_col) { |
| 986 VP9_COMMON * const cm = &cpi->common; | 1085 VP9_COMMON * const cm = &cpi->common; |
| 987 MACROBLOCK *x = &cpi->mb; | 1086 MACROBLOCK *x = &cpi->mb; |
| 988 MACROBLOCKD *xd = &cpi->mb.e_mbd; | 1087 MACROBLOCKD *xd = &cpi->mb.e_mbd; |
| 989 const int mis = cm->mode_info_stride; | 1088 const int mis = cm->mode_info_stride; |
| 990 // TODO(JBB): More experimentation or testing of this threshold; | 1089 // TODO(JBB): More experimentation or testing of this threshold; |
| 991 int64_t threshold = 4; | 1090 int64_t threshold = 4; |
| 992 int i, j, k; | 1091 int i, j, k; |
| 993 v64x64 vt; | 1092 v64x64 vt; |
| 994 unsigned char * s; | 1093 unsigned char * s; |
| 995 int sp; | 1094 int sp; |
| 996 const unsigned char * d = xd->plane[0].pre->buf; | 1095 const unsigned char * d; |
| 997 int dp = xd->plane[0].pre->stride; | 1096 int dp; |
| 998 int pixels_wide = 64, pixels_high = 64; | 1097 int pixels_wide = 64, pixels_high = 64; |
| 999 | 1098 |
| 1000 vpx_memset(&vt, 0, sizeof(vt)); | 1099 vpx_memset(&vt, 0, sizeof(vt)); |
| 1001 | 1100 |
| 1002 set_offsets(cpi, mi_row, mi_col, BLOCK_SIZE_SB64X64); | 1101 set_offsets(cpi, mi_row, mi_col, BLOCK_SIZE_SB64X64); |
| 1003 | 1102 |
| 1004 if (xd->mb_to_right_edge < 0) | 1103 if (xd->mb_to_right_edge < 0) |
| 1005 pixels_wide += (xd->mb_to_right_edge >> 3); | 1104 pixels_wide += (xd->mb_to_right_edge >> 3); |
| 1006 | 1105 |
| 1007 if (xd->mb_to_bottom_edge < 0) | 1106 if (xd->mb_to_bottom_edge < 0) |
| 1008 pixels_high += (xd->mb_to_bottom_edge >> 3); | 1107 pixels_high += (xd->mb_to_bottom_edge >> 3); |
| 1009 | 1108 |
| 1010 s = x->plane[0].src.buf; | 1109 s = x->plane[0].src.buf; |
| 1011 sp = x->plane[0].src.stride; | 1110 sp = x->plane[0].src.stride; |
| 1012 | 1111 |
| 1013 // TODO(JBB): Clearly the higher the quantizer the fewer partitions we want | 1112 // TODO(JBB): Clearly the higher the quantizer the fewer partitions we want |
| 1014 // but this needs more experimentation. | 1113 // but this needs more experimentation. |
| 1015 threshold = threshold * cpi->common.base_qindex * cpi->common.base_qindex; | 1114 threshold = threshold * cpi->common.base_qindex * cpi->common.base_qindex; |
| 1016 | 1115 |
| 1017 // if ( cm->frame_type == KEY_FRAME ) { | |
| 1018 d = vp9_64x64_zeros; | 1116 d = vp9_64x64_zeros; |
| 1019 dp = 64; | 1117 dp = 64; |
| 1020 // } | 1118 if (cm->frame_type != KEY_FRAME) { |
| 1119 int_mv nearest, near; |
| 1120 YV12_BUFFER_CONFIG *ref_fb = &cm->yv12_fb[0]; |
| 1121 YV12_BUFFER_CONFIG *second_ref_fb = NULL; |
| 1122 |
| 1123 setup_pre_planes(xd, ref_fb, second_ref_fb, mi_row, mi_col, |
| 1124 xd->scale_factor, xd->scale_factor_uv); |
| 1125 xd->mode_info_context->mbmi.ref_frame[0] = LAST_FRAME; |
| 1126 xd->mode_info_context->mbmi.sb_type = BLOCK_SIZE_SB64X64; |
| 1127 vp9_find_best_ref_mvs(xd, m->mbmi.ref_mvs[m->mbmi.ref_frame[0]], &nearest, |
| 1128 &near); |
| 1129 |
| 1130 xd->mode_info_context->mbmi.mv[0] = nearest; |
| 1131 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, BLOCK_SIZE_SB64X64); |
| 1132 d = xd->plane[0].dst.buf; |
| 1133 dp = xd->plane[0].dst.stride; |
| 1134 |
| 1135 } |
| 1021 | 1136 |
| 1022 // Fill in the entire tree of 8x8 variances for splits. | 1137 // Fill in the entire tree of 8x8 variances for splits. |
| 1023 for (i = 0; i < 4; i++) { | 1138 for (i = 0; i < 4; i++) { |
| 1024 const int x32_idx = ((i & 1) << 5); | 1139 const int x32_idx = ((i & 1) << 5); |
| 1025 const int y32_idx = ((i >> 1) << 5); | 1140 const int y32_idx = ((i >> 1) << 5); |
| 1026 for (j = 0; j < 4; j++) { | 1141 for (j = 0; j < 4; j++) { |
| 1027 const int x_idx = x32_idx + ((j & 1) << 4); | 1142 const int x16_idx = x32_idx + ((j & 1) << 4); |
| 1028 const int y_idx = y32_idx + ((j >> 1) << 4); | 1143 const int y16_idx = y32_idx + ((j >> 1) << 4); |
| 1029 const uint8_t *st = s + y_idx * sp + x_idx; | |
| 1030 const uint8_t *dt = d + y_idx * dp + x_idx; | |
| 1031 unsigned int sse = 0; | |
| 1032 int sum = 0; | |
| 1033 v16x16 *vst = &vt.split[i].split[j]; | 1144 v16x16 *vst = &vt.split[i].split[j]; |
| 1034 sse = sum = 0; | 1145 for (k = 0; k < 4; k++) { |
| 1035 if (x_idx < pixels_wide && y_idx < pixels_high) | 1146 int x_idx = x16_idx + ((k & 1) << 3); |
| 1036 vp9_get_sse_sum_8x8(st, sp, dt, dp, &sse, &sum); | 1147 int y_idx = y16_idx + ((k >> 1) << 3); |
| 1037 fill_variance(&vst->split[0].none, sse, sum, 64); | 1148 unsigned int sse = 0; |
| 1038 sse = sum = 0; | 1149 int sum = 0; |
| 1039 if (x_idx + 8 < pixels_wide && y_idx < pixels_high) | 1150 if (x_idx < pixels_wide && y_idx < pixels_high) |
| 1040 vp9_get_sse_sum_8x8(st + 8, sp, dt + 8, dp, &sse, &sum); | 1151 vp9_get_sse_sum_8x8(s + y_idx * sp + x_idx, sp, |
| 1041 fill_variance(&vst->split[1].none, sse, sum, 64); | 1152 d + y_idx * dp + x_idx, dp, &sse, &sum); |
| 1042 sse = sum = 0; | 1153 fill_variance(&vst->split[k].vt.none, sse, sum, 64); |
| 1043 if (x_idx < pixels_wide && y_idx + 8 < pixels_high) | 1154 } |
| 1044 vp9_get_sse_sum_8x8(st + 8 * sp, sp, dt + 8 * dp, dp, &sse, &sum); | |
| 1045 fill_variance(&vst->split[2].none, sse, sum, 64); | |
| 1046 sse = sum = 0; | |
| 1047 if (x_idx + 8 < pixels_wide && y_idx + 8 < pixels_high) | |
| 1048 vp9_get_sse_sum_8x8(st + 8 * sp + 8, sp, dt + 8 + 8 * dp, dp, &sse, | |
| 1049 &sum); | |
| 1050 fill_variance(&vst->split[3].none, sse, sum, 64); | |
| 1051 } | 1155 } |
| 1052 } | 1156 } |
| 1053 // Fill the rest of the variance tree by summing the split partition | 1157 // Fill the rest of the variance tree by summing the split partition |
| 1054 // values. | 1158 // values. |
| 1055 for (i = 0; i < 4; i++) { | 1159 for (i = 0; i < 4; i++) { |
| 1056 for (j = 0; j < 4; j++) { | 1160 for (j = 0; j < 4; j++) { |
| 1057 fill_variance_tree(&vt.split[i].split[j]) | 1161 fill_variance_tree(&vt.split[i].split[j], BLOCK_SIZE_MB16X16); |
| 1058 } | 1162 } |
| 1059 fill_variance_tree(&vt.split[i]) | 1163 fill_variance_tree(&vt.split[i], BLOCK_SIZE_SB32X32); |
| 1060 } | 1164 } |
| 1061 fill_variance_tree(&vt) | 1165 fill_variance_tree(&vt, BLOCK_SIZE_SB64X64); |
| 1062 | 1166 // Now go through the entire structure, splitting every block size until |
| 1063 // Now go through the entire structure, splitting every blocksize until | |
| 1064 // we get to one that's got a variance lower than our threshold, or we | 1167 // we get to one that's got a variance lower than our threshold, or we |
| 1065 // hit 8x8. | 1168 // hit 8x8. |
| 1066 set_vt_size( vt, BLOCK_SIZE_SB64X64, mi_row, mi_col, return); | 1169 if (!set_vt_partitioning(cpi, &vt, m, BLOCK_SIZE_SB64X64, mi_row, mi_col, |
| 1067 for (i = 0; i < 4; ++i) { | 1170 4)) { |
| 1068 const int x32_idx = ((i & 1) << 2); | 1171 for (i = 0; i < 4; ++i) { |
| 1069 const int y32_idx = ((i >> 1) << 2); | 1172 const int x32_idx = ((i & 1) << 2); |
| 1070 set_vt_size(vt, BLOCK_SIZE_SB32X32, mi_row + y32_idx, mi_col + x32_idx, | 1173 const int y32_idx = ((i >> 1) << 2); |
| 1071 continue); | 1174 if (!set_vt_partitioning(cpi, &vt.split[i], m, BLOCK_SIZE_SB32X32, |
| 1072 | 1175 (mi_row + y32_idx), (mi_col + x32_idx), 2)) { |
| 1073 for (j = 0; j < 4; ++j) { | 1176 for (j = 0; j < 4; ++j) { |
| 1074 const int x16_idx = ((j & 1) << 1); | 1177 const int x16_idx = ((j & 1) << 1); |
| 1075 const int y16_idx = ((j >> 1) << 1); | 1178 const int y16_idx = ((j >> 1) << 1); |
| 1076 set_vt_size(vt, BLOCK_SIZE_MB16X16, mi_row + y32_idx + y16_idx, | 1179 if (!set_vt_partitioning(cpi, &vt.split[i].split[j], m, |
| 1077 mi_col+x32_idx+x16_idx, continue); | 1180 BLOCK_SIZE_MB16X16, |
| 1078 | 1181 (mi_row + y32_idx + y16_idx), |
| 1079 for (k = 0; k < 4; ++k) { | 1182 (mi_col + x32_idx + x16_idx), 1)) { |
| 1080 const int x8_idx = (k & 1); | 1183 for (k = 0; k < 4; ++k) { |
| 1081 const int y8_idx = (k >> 1); | 1184 const int x8_idx = (k & 1); |
| 1082 set_block_size(cm, m, BLOCK_SIZE_SB8X8, mis, | 1185 const int y8_idx = (k >> 1); |
| 1083 mi_row + y32_idx + y16_idx + y8_idx, | 1186 set_block_size(cm, m, BLOCK_SIZE_SB8X8, mis, |
| 1084 mi_col + x32_idx + x16_idx + x8_idx); | 1187 (mi_row + y32_idx + y16_idx + y8_idx), |
| 1188 (mi_col + x32_idx + x16_idx + x8_idx)); |
| 1189 } |
| 1190 } |
| 1191 } |
| 1085 } | 1192 } |
| 1086 } | 1193 } |
| 1087 } | 1194 } |
| 1088 } | 1195 } |
| 1089 static void rd_use_partition(VP9_COMP *cpi, MODE_INFO *m, TOKENEXTRA **tp, | 1196 static void rd_use_partition(VP9_COMP *cpi, MODE_INFO *m, TOKENEXTRA **tp, |
| 1090 int mi_row, int mi_col, BLOCK_SIZE_TYPE bsize, | 1197 int mi_row, int mi_col, BLOCK_SIZE_TYPE bsize, |
| 1091 int *rate, int *dist) { | 1198 int *rate, int *dist) { |
| 1092 VP9_COMMON * const cm = &cpi->common; | 1199 VP9_COMMON * const cm = &cpi->common; |
| 1093 MACROBLOCK * const x = &cpi->mb; | 1200 MACROBLOCK * const x = &cpi->mb; |
| 1094 MACROBLOCKD *xd = &cpi->mb.e_mbd; | 1201 MACROBLOCKD *xd = &cpi->mb.e_mbd; |
| 1095 const int mis = cm->mode_info_stride; | 1202 const int mis = cm->mode_info_stride; |
| 1096 int bwl = b_width_log2(m->mbmi.sb_type); | 1203 int bwl = b_width_log2(m->mbmi.sb_type); |
| 1097 int bhl = b_height_log2(m->mbmi.sb_type); | 1204 int bhl = b_height_log2(m->mbmi.sb_type); |
| 1098 int bsl = b_width_log2(bsize); | 1205 int bsl = b_width_log2(bsize); |
| 1099 int bh = (1 << bhl); | 1206 int bh = (1 << bhl); |
| 1100 int bs = (1 << bsl); | 1207 int bs = (1 << bsl); |
| 1101 int bss = (1 << bsl)/4; | 1208 int bss = (1 << bsl) / 4; |
| 1102 int i, pl; | 1209 int i, pl; |
| 1103 PARTITION_TYPE partition; | 1210 PARTITION_TYPE partition; |
| 1104 BLOCK_SIZE_TYPE subsize; | 1211 BLOCK_SIZE_TYPE subsize; |
| 1105 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE]; | 1212 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE]; |
| 1106 PARTITION_CONTEXT sl[8], sa[8]; | 1213 PARTITION_CONTEXT sl[8], sa[8]; |
| 1107 int r = 0, d = 0; | 1214 int r = 0, d = 0; |
| 1108 | 1215 |
| 1109 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) | 1216 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) |
| 1110 return; | 1217 return; |
| 1111 | 1218 |
| 1112 | |
| 1113 // parse the partition type | 1219 // parse the partition type |
| 1114 if ((bwl == bsl) && (bhl == bsl)) | 1220 if ((bwl == bsl) && (bhl == bsl)) |
| 1115 partition = PARTITION_NONE; | 1221 partition = PARTITION_NONE; |
| 1116 else if ((bwl == bsl) && (bhl < bsl)) | 1222 else if ((bwl == bsl) && (bhl < bsl)) |
| 1117 partition = PARTITION_HORZ; | 1223 partition = PARTITION_HORZ; |
| 1118 else if ((bwl < bsl) && (bhl == bsl)) | 1224 else if ((bwl < bsl) && (bhl == bsl)) |
| 1119 partition = PARTITION_VERT; | 1225 partition = PARTITION_VERT; |
| 1120 else if ((bwl < bsl) && (bhl < bsl)) | 1226 else if ((bwl < bsl) && (bhl < bsl)) |
| 1121 partition = PARTITION_SPLIT; | 1227 partition = PARTITION_SPLIT; |
| 1122 else | 1228 else |
| 1123 assert(0); | 1229 assert(0); |
| 1124 | 1230 |
| 1125 subsize = get_subsize(bsize, partition); | 1231 subsize = get_subsize(bsize, partition); |
| 1126 | 1232 |
| 1127 // TODO(JBB): this restriction is here because pick_sb_modes can return | 1233 if (bsize < BLOCK_SIZE_SB8X8) { |
| 1128 // r's that are INT_MAX meaning we can't select a mode / mv for this block. | 1234 if (xd->ab_index != 0) { |
| 1129 // when the code is made to work for less than sb8x8 we need to come up with | 1235 *rate = 0; |
| 1130 // a solution to this problem. | 1236 *dist = 0; |
| 1131 assert(subsize >= BLOCK_SIZE_SB8X8); | 1237 return; |
| 1132 | 1238 } |
| 1133 if (bsize >= BLOCK_SIZE_SB8X8) { | 1239 } else { |
| 1134 xd->left_seg_context = cm->left_seg_context + (mi_row & MI_MASK); | |
| 1135 xd->above_seg_context = cm->above_seg_context + mi_col; | |
| 1136 *(get_sb_partitioning(x, bsize)) = subsize; | 1240 *(get_sb_partitioning(x, bsize)) = subsize; |
| 1137 } | 1241 } |
| 1138 | |
| 1139 pl = partition_plane_context(xd, bsize); | 1242 pl = partition_plane_context(xd, bsize); |
| 1140 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | 1243 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1141 switch (partition) { | 1244 switch (partition) { |
| 1142 case PARTITION_NONE: | 1245 case PARTITION_NONE: |
| 1143 pick_sb_modes(cpi, mi_row, mi_col, tp, &r, &d, bsize, | 1246 pick_sb_modes(cpi, mi_row, mi_col, tp, &r, &d, bsize, |
| 1144 get_block_context(x, bsize)); | 1247 get_block_context(x, bsize)); |
| 1145 r += x->partition_cost[pl][PARTITION_NONE]; | 1248 r += x->partition_cost[pl][PARTITION_NONE]; |
| 1146 break; | 1249 break; |
| 1147 case PARTITION_HORZ: | 1250 case PARTITION_HORZ: |
| 1148 *(get_sb_index(xd, subsize)) = 0; | 1251 *(get_sb_index(xd, subsize)) = 0; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1199 d += dt; | 1302 d += dt; |
| 1200 } | 1303 } |
| 1201 set_partition_seg_context(cm, xd, mi_row, mi_col); | 1304 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 1202 pl = partition_plane_context(xd, bsize); | 1305 pl = partition_plane_context(xd, bsize); |
| 1203 r += x->partition_cost[pl][PARTITION_SPLIT]; | 1306 r += x->partition_cost[pl][PARTITION_SPLIT]; |
| 1204 break; | 1307 break; |
| 1205 default: | 1308 default: |
| 1206 assert(0); | 1309 assert(0); |
| 1207 } | 1310 } |
| 1208 | 1311 |
| 1209 // update partition context | |
| 1210 #if CONFIG_AB4X4 | |
| 1211 if (bsize >= BLOCK_SIZE_SB8X8 && | |
| 1212 (bsize == BLOCK_SIZE_SB8X8 || partition != PARTITION_SPLIT)) { | |
| 1213 #else | |
| 1214 if (bsize > BLOCK_SIZE_SB8X8 | |
| 1215 && (bsize == BLOCK_SIZE_MB16X16 || partition != PARTITION_SPLIT)) { | |
| 1216 #endif | |
| 1217 set_partition_seg_context(cm, xd, mi_row, mi_col); | |
| 1218 update_partition_context(xd, subsize, bsize); | |
| 1219 } | |
| 1220 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | 1312 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1221 | 1313 |
| 1222 if (r < INT_MAX && d < INT_MAX) | 1314 if (r < INT_MAX && d < INT_MAX) |
| 1223 encode_sb(cpi, tp, mi_row, mi_col, bsize == BLOCK_SIZE_SB64X64, bsize); | 1315 encode_sb(cpi, tp, mi_row, mi_col, bsize == BLOCK_SIZE_SB64X64, bsize); |
| 1224 *rate = r; | 1316 *rate = r; |
| 1225 *dist = d; | 1317 *dist = d; |
| 1226 } | 1318 } |
| 1227 | 1319 |
| 1228 | 1320 |
| 1229 // TODO(jingning,jimbankoski,rbultje): properly skip partition types that are | 1321 // TODO(jingning,jimbankoski,rbultje): properly skip partition types that are |
| 1230 // unlikely to be selected depending on previously rate-distortion optimization | 1322 // unlikely to be selected depending on previously rate-distortion optimization |
| 1231 // results, for encoding speed-up. | 1323 // results, for encoding speed-up. |
| 1232 static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, | 1324 static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, |
| 1233 int mi_row, int mi_col, | 1325 int mi_col, BLOCK_SIZE_TYPE bsize, int *rate, |
| 1234 BLOCK_SIZE_TYPE bsize, | 1326 int *dist) { |
| 1235 int *rate, int *dist) { | 1327 VP9_COMMON * const cm = &cpi->common; |
| 1236 VP9_COMMON *const cm = &cpi->common; | 1328 MACROBLOCK * const x = &cpi->mb; |
| 1237 MACROBLOCK *const x = &cpi->mb; | 1329 MACROBLOCKD * const xd = &x->e_mbd; |
| 1238 MACROBLOCKD *const xd = &x->e_mbd; | |
| 1239 int bsl = b_width_log2(bsize), bs = 1 << bsl; | 1330 int bsl = b_width_log2(bsize), bs = 1 << bsl; |
| 1240 int ms = bs / 2; | 1331 int ms = bs / 2; |
| 1241 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE]; | 1332 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE]; |
| 1242 PARTITION_CONTEXT sl[8], sa[8]; | 1333 PARTITION_CONTEXT sl[8], sa[8]; |
| 1243 TOKENEXTRA *tp_orig = *tp; | 1334 TOKENEXTRA *tp_orig = *tp; |
| 1244 int i, pl; | 1335 int i, pl; |
| 1245 BLOCK_SIZE_TYPE subsize; | 1336 BLOCK_SIZE_TYPE subsize; |
| 1246 int srate = INT_MAX, sdist = INT_MAX; | 1337 int srate = INT_MAX, sdist = INT_MAX; |
| 1247 | 1338 |
| 1248 if (bsize < BLOCK_SIZE_SB8X8) | 1339 if (bsize < BLOCK_SIZE_SB8X8) |
| 1249 if (xd->ab_index != 0) { | 1340 if (xd->ab_index != 0) { |
| 1250 *rate = 0; | 1341 *rate = 0; |
| 1251 *dist = 0; | 1342 *dist = 0; |
| 1252 return; | 1343 return; |
| 1253 } | 1344 } |
| 1254 assert(mi_height_log2(bsize) == mi_width_log2(bsize)); | 1345 assert(mi_height_log2(bsize) == mi_width_log2(bsize)); |
| 1255 | 1346 |
| 1256 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | 1347 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1257 | 1348 |
| 1258 // PARTITION_SPLIT | 1349 // PARTITION_SPLIT |
| 1259 if (bsize >= BLOCK_SIZE_SB8X8) { | 1350 if (!cpi->sf.use_partitions_greater_than |
| 1260 int r4 = 0, d4 = 0; | 1351 || (cpi->sf.use_partitions_greater_than |
| 1261 subsize = get_subsize(bsize, PARTITION_SPLIT); | 1352 && bsize > cpi->sf.greater_than_block_size)) { |
| 1262 *(get_sb_partitioning(x, bsize)) = subsize; | 1353 if (bsize >= BLOCK_SIZE_SB8X8) { |
| 1354 int r4 = 0, d4 = 0; |
| 1355 subsize = get_subsize(bsize, PARTITION_SPLIT); |
| 1356 *(get_sb_partitioning(x, bsize)) = subsize; |
| 1263 | 1357 |
| 1264 for (i = 0; i < 4; ++i) { | 1358 for (i = 0; i < 4; ++i) { |
| 1265 int x_idx = (i & 1) * (ms >> 1); | 1359 int x_idx = (i & 1) * (ms >> 1); |
| 1266 int y_idx = (i >> 1) * (ms >> 1); | 1360 int y_idx = (i >> 1) * (ms >> 1); |
| 1267 int r = 0, d = 0; | 1361 int r = 0, d = 0; |
| 1268 | 1362 |
| 1269 if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols)) | 1363 if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols)) |
| 1270 continue; | 1364 continue; |
| 1271 | 1365 |
| 1272 *(get_sb_index(xd, subsize)) = i; | 1366 *(get_sb_index(xd, subsize)) = i; |
| 1273 rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize, | 1367 rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize, &r, |
| 1274 &r, &d); | 1368 &d); |
| 1275 | 1369 |
| 1276 r4 += r; | 1370 r4 += r; |
| 1277 d4 += d; | 1371 d4 += d; |
| 1278 } | 1372 } |
| 1279 set_partition_seg_context(cm, xd, mi_row, mi_col); | |
| 1280 pl = partition_plane_context(xd, bsize); | |
| 1281 if (r4 < INT_MAX) | |
| 1282 r4 += x->partition_cost[pl][PARTITION_SPLIT]; | |
| 1283 assert(r4 >= 0); | |
| 1284 assert(d4 >= 0); | |
| 1285 srate = r4; | |
| 1286 sdist = d4; | |
| 1287 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | |
| 1288 } | |
| 1289 | |
| 1290 // PARTITION_HORZ | |
| 1291 if (bsize >= BLOCK_SIZE_SB8X8 && mi_col + (ms >> 1) < cm->mi_cols) { | |
| 1292 int r2, d2; | |
| 1293 int r = 0, d = 0; | |
| 1294 subsize = get_subsize(bsize, PARTITION_HORZ); | |
| 1295 *(get_sb_index(xd, subsize)) = 0; | |
| 1296 pick_sb_modes(cpi, mi_row, mi_col, tp, &r2, &d2, subsize, | |
| 1297 get_block_context(x, subsize)); | |
| 1298 | |
| 1299 if (mi_row + (ms >> 1) < cm->mi_rows) { | |
| 1300 update_state(cpi, get_block_context(x, subsize), subsize, 0); | |
| 1301 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); | |
| 1302 | |
| 1303 *(get_sb_index(xd, subsize)) = 1; | |
| 1304 pick_sb_modes(cpi, mi_row + (ms >> 1), mi_col, tp, &r, &d, subsize, | |
| 1305 get_block_context(x, subsize)); | |
| 1306 r2 += r; | |
| 1307 d2 += d; | |
| 1308 } | |
| 1309 set_partition_seg_context(cm, xd, mi_row, mi_col); | |
| 1310 pl = partition_plane_context(xd, bsize); | |
| 1311 if (r2 < INT_MAX) | |
| 1312 r2 += x->partition_cost[pl][PARTITION_HORZ]; | |
| 1313 if (RDCOST(x->rdmult, x->rddiv, r2, d2) < | |
| 1314 RDCOST(x->rdmult, x->rddiv, srate, sdist)) { | |
| 1315 srate = r2; | |
| 1316 sdist = d2; | |
| 1317 *(get_sb_partitioning(x, bsize)) = subsize; | |
| 1318 } | |
| 1319 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | |
| 1320 } | |
| 1321 | |
| 1322 // PARTITION_VERT | |
| 1323 if (bsize >= BLOCK_SIZE_SB8X8 && mi_row + (ms >> 1) < cm->mi_rows) { | |
| 1324 int r2, d2; | |
| 1325 subsize = get_subsize(bsize, PARTITION_VERT); | |
| 1326 *(get_sb_index(xd, subsize)) = 0; | |
| 1327 pick_sb_modes(cpi, mi_row, mi_col, tp, &r2, &d2, subsize, | |
| 1328 get_block_context(x, subsize)); | |
| 1329 if (mi_col + (ms >> 1) < cm->mi_cols) { | |
| 1330 int r = 0, d = 0; | |
| 1331 update_state(cpi, get_block_context(x, subsize), subsize, 0); | |
| 1332 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); | |
| 1333 | |
| 1334 *(get_sb_index(xd, subsize)) = 1; | |
| 1335 pick_sb_modes(cpi, mi_row, mi_col + (ms >> 1), tp, &r, &d, subsize, | |
| 1336 get_block_context(x, subsize)); | |
| 1337 r2 += r; | |
| 1338 d2 += d; | |
| 1339 } | |
| 1340 set_partition_seg_context(cm, xd, mi_row, mi_col); | |
| 1341 pl = partition_plane_context(xd, bsize); | |
| 1342 if (r2 < INT_MAX) | |
| 1343 r2 += x->partition_cost[pl][PARTITION_VERT]; | |
| 1344 if (RDCOST(x->rdmult, x->rddiv, r2, d2) < | |
| 1345 RDCOST(x->rdmult, x->rddiv, srate, sdist)) { | |
| 1346 srate = r2; | |
| 1347 sdist = d2; | |
| 1348 *(get_sb_partitioning(x, bsize)) = subsize; | |
| 1349 } | |
| 1350 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | |
| 1351 } | |
| 1352 | |
| 1353 // PARTITION_NONE | |
| 1354 if ((mi_row + (ms >> 1) < cm->mi_rows) && | |
| 1355 (mi_col + (ms >> 1) < cm->mi_cols)) { | |
| 1356 int r, d; | |
| 1357 pick_sb_modes(cpi, mi_row, mi_col, tp, &r, &d, bsize, | |
| 1358 get_block_context(x, bsize)); | |
| 1359 if (bsize >= BLOCK_SIZE_SB8X8) { | |
| 1360 set_partition_seg_context(cm, xd, mi_row, mi_col); | 1373 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 1361 pl = partition_plane_context(xd, bsize); | 1374 pl = partition_plane_context(xd, bsize); |
| 1362 r += x->partition_cost[pl][PARTITION_NONE]; | 1375 if (r4 < INT_MAX) |
| 1376 r4 += x->partition_cost[pl][PARTITION_SPLIT]; |
| 1377 assert(r4 >= 0); |
| 1378 assert(d4 >= 0); |
| 1379 srate = r4; |
| 1380 sdist = d4; |
| 1381 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1382 } |
| 1383 } |
| 1384 if (!cpi->sf.use_partitions_less_than |
| 1385 || (cpi->sf.use_partitions_less_than |
| 1386 && bsize <= cpi->sf.less_than_block_size)) { |
| 1387 // PARTITION_HORZ |
| 1388 if (bsize >= BLOCK_SIZE_SB8X8 && mi_col + (ms >> 1) < cm->mi_cols) { |
| 1389 int r2, d2; |
| 1390 int r = 0, d = 0; |
| 1391 subsize = get_subsize(bsize, PARTITION_HORZ); |
| 1392 *(get_sb_index(xd, subsize)) = 0; |
| 1393 pick_sb_modes(cpi, mi_row, mi_col, tp, &r2, &d2, subsize, |
| 1394 get_block_context(x, subsize)); |
| 1395 |
| 1396 if (mi_row + (ms >> 1) < cm->mi_rows) { |
| 1397 update_state(cpi, get_block_context(x, subsize), subsize, 0); |
| 1398 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); |
| 1399 |
| 1400 *(get_sb_index(xd, subsize)) = 1; |
| 1401 pick_sb_modes(cpi, mi_row + (ms >> 1), mi_col, tp, &r, &d, subsize, |
| 1402 get_block_context(x, subsize)); |
| 1403 r2 += r; |
| 1404 d2 += d; |
| 1405 } |
| 1406 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 1407 pl = partition_plane_context(xd, bsize); |
| 1408 if (r2 < INT_MAX) |
| 1409 r2 += x->partition_cost[pl][PARTITION_HORZ]; |
| 1410 if (RDCOST(x->rdmult, x->rddiv, r2, d2) |
| 1411 < RDCOST(x->rdmult, x->rddiv, srate, sdist)) { |
| 1412 srate = r2; |
| 1413 sdist = d2; |
| 1414 *(get_sb_partitioning(x, bsize)) = subsize; |
| 1415 } |
| 1416 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1363 } | 1417 } |
| 1364 | 1418 |
| 1365 if (RDCOST(x->rdmult, x->rddiv, r, d) < | 1419 // PARTITION_VERT |
| 1366 RDCOST(x->rdmult, x->rddiv, srate, sdist)) { | 1420 if (bsize >= BLOCK_SIZE_SB8X8 && mi_row + (ms >> 1) < cm->mi_rows) { |
| 1367 srate = r; | 1421 int r2, d2; |
| 1368 sdist = d; | 1422 subsize = get_subsize(bsize, PARTITION_VERT); |
| 1369 if (bsize >= BLOCK_SIZE_SB8X8) | 1423 *(get_sb_index(xd, subsize)) = 0; |
| 1370 *(get_sb_partitioning(x, bsize)) = bsize; | 1424 pick_sb_modes(cpi, mi_row, mi_col, tp, &r2, &d2, subsize, |
| 1425 get_block_context(x, subsize)); |
| 1426 if (mi_col + (ms >> 1) < cm->mi_cols) { |
| 1427 int r = 0, d = 0; |
| 1428 update_state(cpi, get_block_context(x, subsize), subsize, 0); |
| 1429 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); |
| 1430 |
| 1431 *(get_sb_index(xd, subsize)) = 1; |
| 1432 pick_sb_modes(cpi, mi_row, mi_col + (ms >> 1), tp, &r, &d, subsize, |
| 1433 get_block_context(x, subsize)); |
| 1434 r2 += r; |
| 1435 d2 += d; |
| 1436 } |
| 1437 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 1438 pl = partition_plane_context(xd, bsize); |
| 1439 if (r2 < INT_MAX) |
| 1440 r2 += x->partition_cost[pl][PARTITION_VERT]; |
| 1441 if (RDCOST(x->rdmult, x->rddiv, r2, d2) |
| 1442 < RDCOST(x->rdmult, x->rddiv, srate, sdist)) { |
| 1443 srate = r2; |
| 1444 sdist = d2; |
| 1445 *(get_sb_partitioning(x, bsize)) = subsize; |
| 1446 } |
| 1447 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1448 } |
| 1449 |
| 1450 // PARTITION_NONE |
| 1451 if ((mi_row + (ms >> 1) < cm->mi_rows) && |
| 1452 (mi_col + (ms >> 1) < cm->mi_cols)) { |
| 1453 int r, d; |
| 1454 pick_sb_modes(cpi, mi_row, mi_col, tp, &r, &d, bsize, |
| 1455 get_block_context(x, bsize)); |
| 1456 if (bsize >= BLOCK_SIZE_SB8X8) { |
| 1457 set_partition_seg_context(cm, xd, mi_row, mi_col); |
| 1458 pl = partition_plane_context(xd, bsize); |
| 1459 r += x->partition_cost[pl][PARTITION_NONE]; |
| 1460 } |
| 1461 |
| 1462 if (RDCOST(x->rdmult, x->rddiv, r, d) |
| 1463 < RDCOST(x->rdmult, x->rddiv, srate, sdist)) { |
| 1464 srate = r; |
| 1465 sdist = d; |
| 1466 if (bsize >= BLOCK_SIZE_SB8X8) |
| 1467 *(get_sb_partitioning(x, bsize)) = bsize; |
| 1468 } |
| 1371 } | 1469 } |
| 1372 } | 1470 } |
| 1373 | |
| 1374 *rate = srate; | 1471 *rate = srate; |
| 1375 *dist = sdist; | 1472 *dist = sdist; |
| 1376 | 1473 |
| 1377 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); | 1474 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
| 1378 | 1475 |
| 1379 if (srate < INT_MAX && sdist < INT_MAX) | 1476 if (srate < INT_MAX && sdist < INT_MAX) |
| 1380 encode_sb(cpi, tp, mi_row, mi_col, bsize == BLOCK_SIZE_SB64X64, bsize); | 1477 encode_sb(cpi, tp, mi_row, mi_col, bsize == BLOCK_SIZE_SB64X64, bsize); |
| 1381 | 1478 |
| 1382 if (bsize == BLOCK_SIZE_SB64X64) { | 1479 if (bsize == BLOCK_SIZE_SB64X64) { |
| 1383 assert(tp_orig < *tp); | 1480 assert(tp_orig < *tp); |
| 1384 assert(srate < INT_MAX); | 1481 assert(srate < INT_MAX); |
| 1385 assert(sdist < INT_MAX); | 1482 assert(sdist < INT_MAX); |
| 1386 } else { | 1483 } else { |
| 1387 assert(tp_orig == *tp); | 1484 assert(tp_orig == *tp); |
| 1388 } | 1485 } |
| 1389 } | 1486 } |
| 1390 | 1487 |
| 1391 static void encode_sb_row(VP9_COMP *cpi, int mi_row, | 1488 static void encode_sb_row(VP9_COMP *cpi, int mi_row, TOKENEXTRA **tp, |
| 1392 TOKENEXTRA **tp, int *totalrate) { | 1489 int *totalrate) { |
| 1393 VP9_COMMON *const cm = &cpi->common; | 1490 VP9_COMMON * const cm = &cpi->common; |
| 1394 int mi_col; | 1491 int mi_col; |
| 1395 | 1492 |
| 1396 // Initialize the left context for the new SB row | 1493 // Initialize the left context for the new SB row |
| 1397 vpx_memset(&cm->left_context, 0, sizeof(cm->left_context)); | 1494 vpx_memset(&cm->left_context, 0, sizeof(cm->left_context)); |
| 1398 vpx_memset(cm->left_seg_context, 0, sizeof(cm->left_seg_context)); | 1495 vpx_memset(cm->left_seg_context, 0, sizeof(cm->left_seg_context)); |
| 1399 | 1496 |
| 1400 // Code each SB in the row | 1497 // Code each SB in the row |
| 1401 for (mi_col = cm->cur_tile_mi_col_start; | 1498 for (mi_col = cm->cur_tile_mi_col_start; mi_col < cm->cur_tile_mi_col_end; |
| 1402 mi_col < cm->cur_tile_mi_col_end; mi_col += 64 / MI_SIZE) { | 1499 mi_col += 64 / MI_SIZE) { |
| 1403 int dummy_rate, dummy_dist; | 1500 int dummy_rate, dummy_dist; |
| 1404 if (cpi->speed < 5) { | 1501 if (cpi->sf.partition_by_variance || cpi->sf.use_lastframe_partitioning || |
| 1502 cpi->sf.use_one_partition_size_always ) { |
| 1503 const int idx_str = cm->mode_info_stride * mi_row + mi_col; |
| 1504 MODE_INFO *m = cm->mi + idx_str; |
| 1505 MODE_INFO *p = cm->prev_mi + idx_str; |
| 1506 |
| 1507 if (cpi->sf.use_one_partition_size_always) { |
| 1508 set_offsets(cpi, mi_row, mi_col, BLOCK_SIZE_SB64X64); |
| 1509 set_partitioning(cpi, m, cpi->sf.always_this_block_size); |
| 1510 rd_use_partition(cpi, m, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, |
| 1511 &dummy_rate, &dummy_dist); |
| 1512 } else if (cpi->sf.partition_by_variance) { |
| 1513 choose_partitioning(cpi, cm->mi, mi_row, mi_col); |
| 1514 rd_use_partition(cpi, m, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, |
| 1515 &dummy_rate, &dummy_dist); |
| 1516 } else { |
| 1517 if ((cpi->common.current_video_frame & 1) == 0 || cm->prev_mi == 0 |
| 1518 || cpi->common.show_frame == 0 |
| 1519 || cpi->common.frame_type == KEY_FRAME |
| 1520 || cpi->is_src_frame_alt_ref) { |
| 1521 rd_pick_partition(cpi, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, |
| 1522 &dummy_rate, &dummy_dist); |
| 1523 } else { |
| 1524 copy_partitioning(cpi, m, p); |
| 1525 rd_use_partition(cpi, m, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, |
| 1526 &dummy_rate, &dummy_dist); |
| 1527 } |
| 1528 } |
| 1529 } else { |
| 1405 rd_pick_partition(cpi, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, | 1530 rd_pick_partition(cpi, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, |
| 1406 &dummy_rate, &dummy_dist); | 1531 &dummy_rate, &dummy_dist); |
| 1407 } else { | |
| 1408 const int idx_str = cm->mode_info_stride * mi_row + mi_col; | |
| 1409 MODE_INFO *m = cm->mi + idx_str; | |
| 1410 // set_partitioning(cpi, m, BLOCK_SIZE_SB64X64); | |
| 1411 choose_partitioning(cpi, cm->mi, mi_row, mi_col); | |
| 1412 rd_use_partition(cpi, m, tp, mi_row, mi_col, BLOCK_SIZE_SB64X64, | |
| 1413 &dummy_rate, &dummy_dist); | |
| 1414 } | 1532 } |
| 1415 } | 1533 } |
| 1416 } | 1534 } |
| 1417 | 1535 |
| 1418 static void init_encode_frame_mb_context(VP9_COMP *cpi) { | 1536 static void init_encode_frame_mb_context(VP9_COMP *cpi) { |
| 1419 MACROBLOCK *const x = &cpi->mb; | 1537 MACROBLOCK * const x = &cpi->mb; |
| 1420 VP9_COMMON *const cm = &cpi->common; | 1538 VP9_COMMON * const cm = &cpi->common; |
| 1421 MACROBLOCKD *const xd = &x->e_mbd; | 1539 MACROBLOCKD * const xd = &x->e_mbd; |
| 1422 | 1540 |
| 1423 x->act_zbin_adj = 0; | 1541 x->act_zbin_adj = 0; |
| 1424 cpi->seg0_idx = 0; | 1542 cpi->seg0_idx = 0; |
| 1425 | 1543 |
| 1426 xd->mode_info_stride = cm->mode_info_stride; | 1544 xd->mode_info_stride = cm->mode_info_stride; |
| 1427 xd->frame_type = cm->frame_type; | 1545 xd->frame_type = cm->frame_type; |
| 1428 | 1546 |
| 1429 xd->frames_since_golden = cm->frames_since_golden; | 1547 xd->frames_since_golden = cm->frames_since_golden; |
| 1430 xd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame; | 1548 xd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame; |
| 1431 | 1549 |
| 1432 // reset intra mode contexts | 1550 // reset intra mode contexts |
| 1433 if (cm->frame_type == KEY_FRAME) | 1551 if (cm->frame_type == KEY_FRAME) |
| 1434 vp9_init_mbmode_probs(cm); | 1552 vp9_init_mbmode_probs(cm); |
| 1435 | 1553 |
| 1436 // Copy data over into macro block data structures. | 1554 // Copy data over into macro block data structures. |
| 1437 vp9_setup_src_planes(x, cpi->Source, 0, 0); | 1555 vp9_setup_src_planes(x, cpi->Source, 0, 0); |
| 1438 | 1556 |
| 1439 // TODO(jkoleszar): are these initializations required? | 1557 // TODO(jkoleszar): are these initializations required? |
| 1440 setup_pre_planes(xd, &cm->yv12_fb[cm->ref_frame_map[cpi->lst_fb_idx]], NULL, | 1558 setup_pre_planes(xd, &cm->yv12_fb[cm->ref_frame_map[cpi->lst_fb_idx]], NULL, |
| 1441 0, 0, NULL, NULL); | 1559 0, 0, NULL, NULL ); |
| 1442 setup_dst_planes(xd, &cm->yv12_fb[cm->new_fb_idx], 0, 0); | 1560 setup_dst_planes(xd, &cm->yv12_fb[cm->new_fb_idx], 0, 0); |
| 1443 | 1561 |
| 1444 vp9_build_block_offsets(x); | 1562 vp9_build_block_offsets(x); |
| 1445 | 1563 |
| 1446 vp9_setup_block_dptrs(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); | 1564 vp9_setup_block_dptrs(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); |
| 1447 | 1565 |
| 1448 xd->mode_info_context->mbmi.mode = DC_PRED; | 1566 xd->mode_info_context->mbmi.mode = DC_PRED; |
| 1449 xd->mode_info_context->mbmi.uv_mode = DC_PRED; | 1567 xd->mode_info_context->mbmi.uv_mode = DC_PRED; |
| 1450 | 1568 |
| 1451 vp9_zero(cpi->y_mode_count) | 1569 vp9_zero(cpi->y_mode_count) |
| 1452 vp9_zero(cpi->y_uv_mode_count) | 1570 vp9_zero(cpi->y_uv_mode_count) |
| 1453 vp9_zero(cm->fc.inter_mode_counts) | 1571 vp9_zero(cm->fc.inter_mode_counts) |
| 1454 vp9_zero(cpi->partition_count); | 1572 vp9_zero(cpi->partition_count); |
| 1455 vp9_zero(cpi->intra_inter_count); | 1573 vp9_zero(cpi->intra_inter_count); |
| 1456 vp9_zero(cpi->comp_inter_count); | 1574 vp9_zero(cpi->comp_inter_count); |
| 1457 vp9_zero(cpi->single_ref_count); | 1575 vp9_zero(cpi->single_ref_count); |
| 1458 vp9_zero(cpi->comp_ref_count); | 1576 vp9_zero(cpi->comp_ref_count); |
| 1459 vp9_zero(cm->fc.tx_count_32x32p); | 1577 vp9_zero(cm->fc.tx_count_32x32p); |
| 1460 vp9_zero(cm->fc.tx_count_16x16p); | 1578 vp9_zero(cm->fc.tx_count_16x16p); |
| 1461 vp9_zero(cm->fc.tx_count_8x8p); | 1579 vp9_zero(cm->fc.tx_count_8x8p); |
| 1462 vp9_zero(cm->fc.mbskip_count); | 1580 vp9_zero(cm->fc.mbskip_count); |
| 1463 | 1581 |
| 1464 // Note: this memset assumes above_context[0], [1] and [2] | 1582 // Note: this memset assumes above_context[0], [1] and [2] |
| 1465 // are allocated as part of the same buffer. | 1583 // are allocated as part of the same buffer. |
| 1466 vpx_memset(cm->above_context[0], 0, sizeof(ENTROPY_CONTEXT) * 2 * | 1584 vpx_memset( |
| 1467 MAX_MB_PLANE * mi_cols_aligned_to_sb(cm)); | 1585 cm->above_context[0], 0, |
| 1468 vpx_memset(cm->above_seg_context, 0, sizeof(PARTITION_CONTEXT) * | 1586 sizeof(ENTROPY_CONTEXT) * 2 * MAX_MB_PLANE * mi_cols_aligned_to_sb(cm)); |
| 1469 mi_cols_aligned_to_sb(cm)); | 1587 vpx_memset(cm->above_seg_context, 0, |
| 1588 sizeof(PARTITION_CONTEXT) * mi_cols_aligned_to_sb(cm)); |
| 1470 } | 1589 } |
| 1471 | 1590 |
| 1472 static void switch_lossless_mode(VP9_COMP *cpi, int lossless) { | 1591 static void switch_lossless_mode(VP9_COMP *cpi, int lossless) { |
| 1473 if (lossless) { | 1592 if (lossless) { |
| 1474 cpi->mb.fwd_txm8x4 = vp9_short_walsh8x4; | 1593 cpi->mb.fwd_txm8x4 = vp9_short_walsh8x4; |
| 1475 cpi->mb.fwd_txm4x4 = vp9_short_walsh4x4; | 1594 cpi->mb.fwd_txm4x4 = vp9_short_walsh4x4; |
| 1476 cpi->mb.e_mbd.inv_txm4x4_1_add = vp9_short_iwalsh4x4_1_add; | 1595 cpi->mb.e_mbd.inv_txm4x4_1_add = vp9_short_iwalsh4x4_1_add; |
| 1477 cpi->mb.e_mbd.inv_txm4x4_add = vp9_short_iwalsh4x4_add; | 1596 cpi->mb.e_mbd.inv_txm4x4_add = vp9_short_iwalsh4x4_add; |
| 1478 cpi->mb.optimize = 0; | 1597 cpi->mb.optimize = 0; |
| 1479 cpi->common.filter_level = 0; | 1598 cpi->common.filter_level = 0; |
| 1480 cpi->zbin_mode_boost_enabled = 0; | 1599 cpi->zbin_mode_boost_enabled = 0; |
| 1481 cpi->common.txfm_mode = ONLY_4X4; | 1600 cpi->common.txfm_mode = ONLY_4X4; |
| 1482 } else { | 1601 } else { |
| 1483 cpi->mb.fwd_txm8x4 = vp9_short_fdct8x4; | 1602 cpi->mb.fwd_txm8x4 = vp9_short_fdct8x4; |
| 1484 cpi->mb.fwd_txm4x4 = vp9_short_fdct4x4; | 1603 cpi->mb.fwd_txm4x4 = vp9_short_fdct4x4; |
| 1485 cpi->mb.e_mbd.inv_txm4x4_1_add = vp9_short_idct4x4_1_add; | 1604 cpi->mb.e_mbd.inv_txm4x4_1_add = vp9_short_idct4x4_1_add; |
| 1486 cpi->mb.e_mbd.inv_txm4x4_add = vp9_short_idct4x4_add; | 1605 cpi->mb.e_mbd.inv_txm4x4_add = vp9_short_idct4x4_add; |
| 1487 } | 1606 } |
| 1488 } | 1607 } |
| 1489 | 1608 |
| 1490 | |
| 1491 static void encode_frame_internal(VP9_COMP *cpi) { | 1609 static void encode_frame_internal(VP9_COMP *cpi) { |
| 1492 int mi_row; | 1610 int mi_row; |
| 1493 MACROBLOCK *const x = &cpi->mb; | 1611 MACROBLOCK * const x = &cpi->mb; |
| 1494 VP9_COMMON *const cm = &cpi->common; | 1612 VP9_COMMON * const cm = &cpi->common; |
| 1495 MACROBLOCKD *const xd = &x->e_mbd; | 1613 MACROBLOCKD * const xd = &x->e_mbd; |
| 1496 int totalrate; | 1614 int totalrate; |
| 1497 | 1615 |
| 1498 // fprintf(stderr, "encode_frame_internal frame %d (%d) type %d\n", | 1616 // fprintf(stderr, "encode_frame_internal frame %d (%d) type %d\n", |
| 1499 // cpi->common.current_video_frame, cpi->common.show_frame, | 1617 // cpi->common.current_video_frame, cpi->common.show_frame, |
| 1500 // cm->frame_type); | 1618 // cm->frame_type); |
| 1501 | 1619 |
| 1502 // debug output | 1620 // debug output |
| 1503 #if DBG_PRNT_SEGMAP | 1621 #if DBG_PRNT_SEGMAP |
| 1504 { | 1622 { |
| 1505 FILE *statsfile; | 1623 FILE *statsfile; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1517 vp9_zero(cm->fc.switchable_interp_count); | 1635 vp9_zero(cm->fc.switchable_interp_count); |
| 1518 vp9_zero(cpi->best_switchable_interp_count); | 1636 vp9_zero(cpi->best_switchable_interp_count); |
| 1519 | 1637 |
| 1520 xd->mode_info_context = cm->mi; | 1638 xd->mode_info_context = cm->mi; |
| 1521 xd->prev_mode_info_context = cm->prev_mi; | 1639 xd->prev_mode_info_context = cm->prev_mi; |
| 1522 | 1640 |
| 1523 vp9_zero(cpi->NMVcount); | 1641 vp9_zero(cpi->NMVcount); |
| 1524 vp9_zero(cpi->coef_counts); | 1642 vp9_zero(cpi->coef_counts); |
| 1525 vp9_zero(cm->fc.eob_branch_counts); | 1643 vp9_zero(cm->fc.eob_branch_counts); |
| 1526 | 1644 |
| 1527 cpi->mb.e_mbd.lossless = cm->base_qindex == 0 && | 1645 cpi->mb.e_mbd.lossless = cm->base_qindex == 0 && cm->y_dc_delta_q == 0 |
| 1528 cm->y_dc_delta_q == 0 && | 1646 && cm->uv_dc_delta_q == 0 && cm->uv_ac_delta_q == 0; |
| 1529 cm->uv_dc_delta_q == 0 && | |
| 1530 cm->uv_ac_delta_q == 0; | |
| 1531 switch_lossless_mode(cpi, cpi->mb.e_mbd.lossless); | 1647 switch_lossless_mode(cpi, cpi->mb.e_mbd.lossless); |
| 1532 | 1648 |
| 1533 vp9_frame_init_quantizer(cpi); | 1649 vp9_frame_init_quantizer(cpi); |
| 1534 | 1650 |
| 1535 vp9_initialize_rd_consts(cpi, cm->base_qindex + cm->y_dc_delta_q); | 1651 vp9_initialize_rd_consts(cpi, cm->base_qindex + cm->y_dc_delta_q); |
| 1536 vp9_initialize_me_consts(cpi, cm->base_qindex); | 1652 vp9_initialize_me_consts(cpi, cm->base_qindex); |
| 1537 | 1653 |
| 1538 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) { | 1654 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) { |
| 1539 // Initialize encode frame context. | 1655 // Initialize encode frame context. |
| 1540 init_encode_frame_mb_context(cpi); | 1656 init_encode_frame_mb_context(cpi); |
| 1541 | 1657 |
| 1542 // Build a frame level activity map | 1658 // Build a frame level activity map |
| 1543 build_activity_map(cpi); | 1659 build_activity_map(cpi); |
| 1544 } | 1660 } |
| 1545 | 1661 |
| 1546 // re-initencode frame context. | 1662 // re-initencode frame context. |
| 1547 init_encode_frame_mb_context(cpi); | 1663 init_encode_frame_mb_context(cpi); |
| 1548 | 1664 |
| 1549 vpx_memset(cpi->rd_comp_pred_diff, 0, sizeof(cpi->rd_comp_pred_diff)); | 1665 vpx_memset(cpi->rd_comp_pred_diff, 0, sizeof(cpi->rd_comp_pred_diff)); |
| 1550 vpx_memset(cpi->rd_tx_select_diff, 0, sizeof(cpi->rd_tx_select_diff)); | 1666 vpx_memset(cpi->rd_tx_select_diff, 0, sizeof(cpi->rd_tx_select_diff)); |
| 1551 vpx_memset(cpi->rd_tx_select_threshes, 0, sizeof(cpi->rd_tx_select_threshes)); | 1667 vpx_memset(cpi->rd_tx_select_threshes, 0, sizeof(cpi->rd_tx_select_threshes)); |
| 1552 | 1668 |
| 1553 set_prev_mi(cm); | 1669 set_prev_mi(cm); |
| 1554 | 1670 |
| 1555 { | 1671 { |
| 1556 struct vpx_usec_timer emr_timer; | 1672 struct vpx_usec_timer emr_timer; |
| 1557 vpx_usec_timer_start(&emr_timer); | 1673 vpx_usec_timer_start(&emr_timer); |
| 1558 | 1674 |
| 1559 { | 1675 { |
| 1560 // Take tiles into account and give start/end MB | 1676 // Take tiles into account and give start/end MB |
| 1561 int tile_col, tile_row; | 1677 int tile_col, tile_row; |
| 1562 TOKENEXTRA *tp = cpi->tok; | 1678 TOKENEXTRA *tp = cpi->tok; |
| 1563 | 1679 |
| 1564 for (tile_row = 0; tile_row < cm->tile_rows; tile_row++) { | 1680 for (tile_row = 0; tile_row < cm->tile_rows; tile_row++) { |
| 1565 vp9_get_tile_row_offsets(cm, tile_row); | 1681 vp9_get_tile_row_offsets(cm, tile_row); |
| 1566 | 1682 |
| 1567 for (tile_col = 0; tile_col < cm->tile_columns; tile_col++) { | 1683 for (tile_col = 0; tile_col < cm->tile_columns; tile_col++) { |
| 1568 TOKENEXTRA *tp_old = tp; | 1684 TOKENEXTRA *tp_old = tp; |
| 1569 | 1685 |
| 1570 // For each row of SBs in the frame | 1686 // For each row of SBs in the frame |
| 1571 vp9_get_tile_col_offsets(cm, tile_col); | 1687 vp9_get_tile_col_offsets(cm, tile_col); |
| 1572 for (mi_row = cm->cur_tile_mi_row_start; | 1688 for (mi_row = cm->cur_tile_mi_row_start; |
| 1573 mi_row < cm->cur_tile_mi_row_end; | 1689 mi_row < cm->cur_tile_mi_row_end; mi_row += 8) |
| 1574 mi_row += 8) | |
| 1575 encode_sb_row(cpi, mi_row, &tp, &totalrate); | 1690 encode_sb_row(cpi, mi_row, &tp, &totalrate); |
| 1691 |
| 1576 cpi->tok_count[tile_row][tile_col] = (unsigned int)(tp - tp_old); | 1692 cpi->tok_count[tile_row][tile_col] = (unsigned int)(tp - tp_old); |
| 1577 assert(tp - cpi->tok <= | 1693 assert(tp - cpi->tok <= |
| 1578 get_token_alloc(cm->mb_rows, cm->mb_cols)); | 1694 get_token_alloc(cm->mb_rows, cm->mb_cols)); |
| 1579 } | 1695 } |
| 1580 } | 1696 } |
| 1581 } | 1697 } |
| 1582 | 1698 |
| 1583 vpx_usec_timer_mark(&emr_timer); | 1699 vpx_usec_timer_mark(&emr_timer); |
| 1584 cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer); | 1700 cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer); |
| 1585 } | 1701 } |
| 1586 | 1702 |
| 1587 // 256 rate units to the bit, | 1703 // 256 rate units to the bit, |
| 1588 // projected_frame_size in units of BYTES | 1704 // projected_frame_size in units of BYTES |
| 1589 cpi->projected_frame_size = totalrate >> 8; | 1705 cpi->projected_frame_size = totalrate >> 8; |
| 1590 | 1706 |
| 1591 #if 0 | 1707 #if 0 |
| 1592 // Keep record of the total distortion this time around for future use | 1708 // Keep record of the total distortion this time around for future use |
| 1593 cpi->last_frame_distortion = cpi->frame_distortion; | 1709 cpi->last_frame_distortion = cpi->frame_distortion; |
| 1594 #endif | 1710 #endif |
| 1595 | 1711 |
| 1596 } | 1712 } |
| 1597 | 1713 |
| 1598 static int check_dual_ref_flags(VP9_COMP *cpi) { | 1714 static int check_dual_ref_flags(VP9_COMP *cpi) { |
| 1599 MACROBLOCKD *xd = &cpi->mb.e_mbd; | 1715 MACROBLOCKD *xd = &cpi->mb.e_mbd; |
| 1600 int ref_flags = cpi->ref_frame_flags; | 1716 int ref_flags = cpi->ref_frame_flags; |
| 1601 | 1717 |
| 1602 if (vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME)) { | 1718 if (vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME)) { |
| 1603 return 0; | 1719 return 0; |
| 1604 } else { | 1720 } else { |
| 1605 return (!!(ref_flags & VP9_GOLD_FLAG) + | 1721 return (!!(ref_flags & VP9_GOLD_FLAG) + !!(ref_flags & VP9_LAST_FLAG) |
| 1606 !!(ref_flags & VP9_LAST_FLAG) + | 1722 + !!(ref_flags & VP9_ALT_FLAG)) >= 2; |
| 1607 !!(ref_flags & VP9_ALT_FLAG)) >= 2; | |
| 1608 } | 1723 } |
| 1609 } | 1724 } |
| 1610 | 1725 |
| 1611 static int get_skip_flag(MODE_INFO *mi, int mis, int ymbs, int xmbs) { | 1726 static int get_skip_flag(MODE_INFO *mi, int mis, int ymbs, int xmbs) { |
| 1612 int x, y; | 1727 int x, y; |
| 1613 | 1728 |
| 1614 for (y = 0; y < ymbs; y++) { | 1729 for (y = 0; y < ymbs; y++) { |
| 1615 for (x = 0; x < xmbs; x++) { | 1730 for (x = 0; x < xmbs; x++) { |
| 1616 if (!mi[y * mis + x].mbmi.mb_skip_coeff) | 1731 if (!mi[y * mis + x].mbmi.mb_skip_coeff) |
| 1617 return 0; | 1732 return 0; |
| 1618 } | 1733 } |
| 1619 } | 1734 } |
| 1620 | 1735 |
| 1621 return 1; | 1736 return 1; |
| 1622 } | 1737 } |
| 1623 | 1738 |
| 1624 static void set_txfm_flag(MODE_INFO *mi, int mis, int ymbs, int xmbs, | 1739 static void set_txfm_flag(MODE_INFO *mi, int mis, int ymbs, int xmbs, |
| 1625 TX_SIZE txfm_size) { | 1740 TX_SIZE txfm_size) { |
| 1626 int x, y; | 1741 int x, y; |
| 1627 | 1742 |
| 1628 for (y = 0; y < ymbs; y++) { | 1743 for (y = 0; y < ymbs; y++) { |
| 1629 for (x = 0; x < xmbs; x++) | 1744 for (x = 0; x < xmbs; x++) |
| 1630 mi[y * mis + x].mbmi.txfm_size = txfm_size; | 1745 mi[y * mis + x].mbmi.txfm_size = txfm_size; |
| 1631 } | 1746 } |
| 1632 } | 1747 } |
| 1633 | 1748 |
| 1634 static void reset_skip_txfm_size_b(VP9_COMP *cpi, MODE_INFO *mi, | 1749 static void reset_skip_txfm_size_b(VP9_COMP *cpi, MODE_INFO *mi, int mis, |
| 1635 int mis, TX_SIZE txfm_max, | 1750 TX_SIZE txfm_max, int bw, int bh, int mi_row, |
| 1636 int bw, int bh, int mi_row, int mi_col, | 1751 int mi_col, BLOCK_SIZE_TYPE bsize) { |
| 1637 BLOCK_SIZE_TYPE bsize) { | 1752 VP9_COMMON * const cm = &cpi->common; |
| 1638 VP9_COMMON *const cm = &cpi->common; | 1753 MB_MODE_INFO * const mbmi = &mi->mbmi; |
| 1639 MB_MODE_INFO *const mbmi = &mi->mbmi; | |
| 1640 | 1754 |
| 1641 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) | 1755 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) |
| 1642 return; | 1756 return; |
| 1643 | 1757 |
| 1644 if (mbmi->txfm_size > txfm_max) { | 1758 if (mbmi->txfm_size > txfm_max) { |
| 1645 MACROBLOCK *const x = &cpi->mb; | 1759 MACROBLOCK * const x = &cpi->mb; |
| 1646 MACROBLOCKD *const xd = &x->e_mbd; | 1760 MACROBLOCKD * const xd = &x->e_mbd; |
| 1647 const int segment_id = mbmi->segment_id; | 1761 const int segment_id = mbmi->segment_id; |
| 1648 const int ymbs = MIN(bh, cm->mi_rows - mi_row); | 1762 const int ymbs = MIN(bh, cm->mi_rows - mi_row); |
| 1649 const int xmbs = MIN(bw, cm->mi_cols - mi_col); | 1763 const int xmbs = MIN(bw, cm->mi_cols - mi_col); |
| 1650 | 1764 |
| 1651 xd->mode_info_context = mi; | 1765 xd->mode_info_context = mi; |
| 1652 assert(vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP) || | 1766 assert( |
| 1653 get_skip_flag(mi, mis, ymbs, xmbs)); | 1767 vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP) || get_skip_flag(mi,
mis, ymbs, xmbs)); |
| 1654 set_txfm_flag(mi, mis, ymbs, xmbs, txfm_max); | 1768 set_txfm_flag(mi, mis, ymbs, xmbs, txfm_max); |
| 1655 } | 1769 } |
| 1656 } | 1770 } |
| 1657 | 1771 |
| 1658 static void reset_skip_txfm_size_sb(VP9_COMP *cpi, MODE_INFO *mi, | 1772 static void reset_skip_txfm_size_sb(VP9_COMP *cpi, MODE_INFO *mi, |
| 1659 TX_SIZE txfm_max, | 1773 TX_SIZE txfm_max, int mi_row, int mi_col, |
| 1660 int mi_row, int mi_col, | |
| 1661 BLOCK_SIZE_TYPE bsize) { | 1774 BLOCK_SIZE_TYPE bsize) { |
| 1662 VP9_COMMON *const cm = &cpi->common; | 1775 VP9_COMMON * const cm = &cpi->common; |
| 1663 const int mis = cm->mode_info_stride; | 1776 const int mis = cm->mode_info_stride; |
| 1664 int bwl, bhl; | 1777 int bwl, bhl; |
| 1665 const int bsl = mi_width_log2(bsize), bs = 1 << (bsl - 1); | 1778 const int bsl = mi_width_log2(bsize), bs = 1 << (bsl - 1); |
| 1666 | 1779 |
| 1667 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) | 1780 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) |
| 1668 return; | 1781 return; |
| 1669 | 1782 |
| 1670 bwl = mi_width_log2(mi->mbmi.sb_type); | 1783 bwl = mi_width_log2(mi->mbmi.sb_type); |
| 1671 bhl = mi_height_log2(mi->mbmi.sb_type); | 1784 bhl = mi_height_log2(mi->mbmi.sb_type); |
| 1672 | 1785 |
| 1673 if (bwl == bsl && bhl == bsl) { | 1786 if (bwl == bsl && bhl == bsl) { |
| 1674 reset_skip_txfm_size_b(cpi, mi, mis, txfm_max, 1 << bsl, 1 << bsl, | 1787 reset_skip_txfm_size_b(cpi, mi, mis, txfm_max, 1 << bsl, 1 << bsl, mi_row, |
| 1675 mi_row, mi_col, bsize); | 1788 mi_col, bsize); |
| 1676 } else if (bwl == bsl && bhl < bsl) { | 1789 } else if (bwl == bsl && bhl < bsl) { |
| 1677 reset_skip_txfm_size_b(cpi, mi, mis, txfm_max, 1 << bsl, bs, | 1790 reset_skip_txfm_size_b(cpi, mi, mis, txfm_max, 1 << bsl, bs, mi_row, mi_col, |
| 1678 mi_row, mi_col, bsize); | 1791 bsize); |
| 1679 reset_skip_txfm_size_b(cpi, mi + bs * mis, mis, txfm_max, 1 << bsl, bs, | 1792 reset_skip_txfm_size_b(cpi, mi + bs * mis, mis, txfm_max, 1 << bsl, bs, |
| 1680 mi_row + bs, mi_col, bsize); | 1793 mi_row + bs, mi_col, bsize); |
| 1681 } else if (bwl < bsl && bhl == bsl) { | 1794 } else if (bwl < bsl && bhl == bsl) { |
| 1682 reset_skip_txfm_size_b(cpi, mi, mis, txfm_max, bs, 1 << bsl, | 1795 reset_skip_txfm_size_b(cpi, mi, mis, txfm_max, bs, 1 << bsl, mi_row, mi_col, |
| 1683 mi_row, mi_col, bsize); | 1796 bsize); |
| 1684 reset_skip_txfm_size_b(cpi, mi + bs, mis, txfm_max, bs, 1 << bsl, | 1797 reset_skip_txfm_size_b(cpi, mi + bs, mis, txfm_max, bs, 1 << bsl, mi_row, |
| 1685 mi_row, mi_col + bs, bsize); | 1798 mi_col + bs, bsize); |
| 1686 } else { | 1799 } else { |
| 1687 BLOCK_SIZE_TYPE subsize; | 1800 BLOCK_SIZE_TYPE subsize; |
| 1688 int n; | 1801 int n; |
| 1689 | 1802 |
| 1690 assert(bwl < bsl && bhl < bsl); | 1803 assert(bwl < bsl && bhl < bsl); |
| 1691 if (bsize == BLOCK_SIZE_SB64X64) { | 1804 if (bsize == BLOCK_SIZE_SB64X64) { |
| 1692 subsize = BLOCK_SIZE_SB32X32; | 1805 subsize = BLOCK_SIZE_SB32X32; |
| 1693 } else if (bsize == BLOCK_SIZE_SB32X32) { | 1806 } else if (bsize == BLOCK_SIZE_SB32X32) { |
| 1694 subsize = BLOCK_SIZE_MB16X16; | 1807 subsize = BLOCK_SIZE_MB16X16; |
| 1695 } else { | 1808 } else { |
| 1696 assert(bsize == BLOCK_SIZE_MB16X16); | 1809 assert(bsize == BLOCK_SIZE_MB16X16); |
| 1697 subsize = BLOCK_SIZE_SB8X8; | 1810 subsize = BLOCK_SIZE_SB8X8; |
| 1698 } | 1811 } |
| 1699 | 1812 |
| 1700 for (n = 0; n < 4; n++) { | 1813 for (n = 0; n < 4; n++) { |
| 1701 const int y_idx = n >> 1, x_idx = n & 0x01; | 1814 const int y_idx = n >> 1, x_idx = n & 0x01; |
| 1702 | 1815 |
| 1703 reset_skip_txfm_size_sb(cpi, mi + y_idx * bs * mis + x_idx * bs, | 1816 reset_skip_txfm_size_sb(cpi, mi + y_idx * bs * mis + x_idx * bs, txfm_max, |
| 1704 txfm_max, mi_row + y_idx * bs, | 1817 mi_row + y_idx * bs, mi_col + x_idx * bs, |
| 1705 mi_col + x_idx * bs, subsize); | 1818 subsize); |
| 1706 } | 1819 } |
| 1707 } | 1820 } |
| 1708 } | 1821 } |
| 1709 | 1822 |
| 1710 static void reset_skip_txfm_size(VP9_COMP *cpi, TX_SIZE txfm_max) { | 1823 static void reset_skip_txfm_size(VP9_COMP *cpi, TX_SIZE txfm_max) { |
| 1711 VP9_COMMON *const cm = &cpi->common; | 1824 VP9_COMMON * const cm = &cpi->common; |
| 1712 int mi_row, mi_col; | 1825 int mi_row, mi_col; |
| 1713 const int mis = cm->mode_info_stride; | 1826 const int mis = cm->mode_info_stride; |
| 1714 MODE_INFO *mi, *mi_ptr = cm->mi; | 1827 MODE_INFO *mi, *mi_ptr = cm->mi; |
| 1715 | 1828 |
| 1716 for (mi_row = 0; mi_row < cm->mi_rows; | 1829 for (mi_row = 0; mi_row < cm->mi_rows; mi_row += 8, mi_ptr += 8 * mis) { |
| 1717 mi_row += 8, mi_ptr += 8 * mis) { | |
| 1718 mi = mi_ptr; | 1830 mi = mi_ptr; |
| 1719 for (mi_col = 0; mi_col < cm->mi_cols; | 1831 for (mi_col = 0; mi_col < cm->mi_cols; mi_col += 8, mi += 8) { |
| 1720 mi_col += 8, mi += 8) { | 1832 reset_skip_txfm_size_sb(cpi, mi, txfm_max, mi_row, mi_col, |
| 1721 reset_skip_txfm_size_sb(cpi, mi, txfm_max, | 1833 BLOCK_SIZE_SB64X64); |
| 1722 mi_row, mi_col, BLOCK_SIZE_SB64X64); | |
| 1723 } | 1834 } |
| 1724 } | 1835 } |
| 1725 } | 1836 } |
| 1726 | 1837 |
| 1727 void vp9_encode_frame(VP9_COMP *cpi) { | 1838 void vp9_encode_frame(VP9_COMP *cpi) { |
| 1728 VP9_COMMON *const cm = &cpi->common; | 1839 VP9_COMMON * const cm = &cpi->common; |
| 1729 | 1840 |
| 1730 // In the longer term the encoder should be generalized to match the | 1841 // In the longer term the encoder should be generalized to match the |
| 1731 // decoder such that we allow compound where one of the 3 buffers has a | 1842 // decoder such that we allow compound where one of the 3 buffers has a |
| 1732 // differnt sign bias and that buffer is then the fixed ref. However, this | 1843 // differnt sign bias and that buffer is then the fixed ref. However, this |
| 1733 // requires further work in the rd loop. For now the only supported encoder | 1844 // requires further work in the rd loop. For now the only supported encoder |
| 1734 // side behaviour is where the ALT ref buffer has oppositie sign bias to | 1845 // side behaviour is where the ALT ref buffer has oppositie sign bias to |
| 1735 // the other two. | 1846 // the other two. |
| 1736 if ((cm->ref_frame_sign_bias[ALTREF_FRAME] == | 1847 if ((cm->ref_frame_sign_bias[ALTREF_FRAME] |
| 1737 cm->ref_frame_sign_bias[GOLDEN_FRAME]) || | 1848 == cm->ref_frame_sign_bias[GOLDEN_FRAME]) |
| 1738 (cm->ref_frame_sign_bias[ALTREF_FRAME] == | 1849 || (cm->ref_frame_sign_bias[ALTREF_FRAME] |
| 1739 cm->ref_frame_sign_bias[LAST_FRAME])) { | 1850 == cm->ref_frame_sign_bias[LAST_FRAME])) { |
| 1740 cm->allow_comp_inter_inter = 0; | 1851 cm->allow_comp_inter_inter = 0; |
| 1741 } else { | 1852 } else { |
| 1742 cm->allow_comp_inter_inter = 1; | 1853 cm->allow_comp_inter_inter = 1; |
| 1743 cm->comp_fixed_ref = ALTREF_FRAME; | 1854 cm->comp_fixed_ref = ALTREF_FRAME; |
| 1744 cm->comp_var_ref[0] = LAST_FRAME; | 1855 cm->comp_var_ref[0] = LAST_FRAME; |
| 1745 cm->comp_var_ref[1] = GOLDEN_FRAME; | 1856 cm->comp_var_ref[1] = GOLDEN_FRAME; |
| 1746 } | 1857 } |
| 1747 | 1858 |
| 1748 if (cpi->sf.RD) { | 1859 if (cpi->sf.RD) { |
| 1749 int i, frame_type, pred_type; | 1860 int i, frame_type, pred_type; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1763 else if (cpi->is_src_frame_alt_ref && cpi->refresh_golden_frame) | 1874 else if (cpi->is_src_frame_alt_ref && cpi->refresh_golden_frame) |
| 1764 frame_type = 3; | 1875 frame_type = 3; |
| 1765 else if (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) | 1876 else if (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) |
| 1766 frame_type = 1; | 1877 frame_type = 1; |
| 1767 else | 1878 else |
| 1768 frame_type = 2; | 1879 frame_type = 2; |
| 1769 | 1880 |
| 1770 /* prediction (compound, single or hybrid) mode selection */ | 1881 /* prediction (compound, single or hybrid) mode selection */ |
| 1771 if (frame_type == 3 || !cm->allow_comp_inter_inter) | 1882 if (frame_type == 3 || !cm->allow_comp_inter_inter) |
| 1772 pred_type = SINGLE_PREDICTION_ONLY; | 1883 pred_type = SINGLE_PREDICTION_ONLY; |
| 1773 else if (cpi->rd_prediction_type_threshes[frame_type][1] > | 1884 else if (cpi->rd_prediction_type_threshes[frame_type][1] |
| 1774 cpi->rd_prediction_type_threshes[frame_type][0] && | 1885 > cpi->rd_prediction_type_threshes[frame_type][0] |
| 1775 cpi->rd_prediction_type_threshes[frame_type][1] > | 1886 && cpi->rd_prediction_type_threshes[frame_type][1] |
| 1776 cpi->rd_prediction_type_threshes[frame_type][2] && | 1887 > cpi->rd_prediction_type_threshes[frame_type][2] |
| 1777 check_dual_ref_flags(cpi) && cpi->static_mb_pct == 100) | 1888 && check_dual_ref_flags(cpi) && cpi->static_mb_pct == 100) |
| 1778 pred_type = COMP_PREDICTION_ONLY; | 1889 pred_type = COMP_PREDICTION_ONLY; |
| 1779 else if (cpi->rd_prediction_type_threshes[frame_type][0] > | 1890 else if (cpi->rd_prediction_type_threshes[frame_type][0] |
| 1780 cpi->rd_prediction_type_threshes[frame_type][2]) | 1891 > cpi->rd_prediction_type_threshes[frame_type][2]) |
| 1781 pred_type = SINGLE_PREDICTION_ONLY; | 1892 pred_type = SINGLE_PREDICTION_ONLY; |
| 1782 else | 1893 else |
| 1783 pred_type = HYBRID_PREDICTION; | 1894 pred_type = HYBRID_PREDICTION; |
| 1784 | 1895 |
| 1785 /* transform size (4x4, 8x8, 16x16 or select-per-mb) selection */ | 1896 /* transform size (4x4, 8x8, 16x16 or select-per-mb) selection */ |
| 1786 | 1897 |
| 1787 cpi->mb.e_mbd.lossless = 0; | 1898 cpi->mb.e_mbd.lossless = 0; |
| 1788 if (cpi->oxcf.lossless) { | 1899 if (cpi->oxcf.lossless) { |
| 1789 txfm_type = ONLY_4X4; | 1900 txfm_type = ONLY_4X4; |
| 1790 cpi->mb.e_mbd.lossless = 1; | 1901 cpi->mb.e_mbd.lossless = 1; |
| 1791 } else | 1902 } else |
| 1792 #if 0 | 1903 #if 0 |
| 1793 /* FIXME (rbultje): this code is disabled until we support cost updates | 1904 /* FIXME (rbultje): this code is disabled until we support cost updates |
| 1794 * while a frame is being encoded; the problem is that each time we | 1905 * while a frame is being encoded; the problem is that each time we |
| 1795 * "revert" to 4x4 only (or even 8x8 only), the coefficient probabilities | 1906 * "revert" to 4x4 only (or even 8x8 only), the coefficient probabilities |
| 1796 * for 16x16 (and 8x8) start lagging behind, thus leading to them lagging | 1907 * for 16x16 (and 8x8) start lagging behind, thus leading to them lagging |
| 1797 * further behind and not being chosen for subsequent frames either. This | 1908 * further behind and not being chosen for subsequent frames either. This |
| 1798 * is essentially a local minimum problem that we can probably fix by | 1909 * is essentially a local minimum problem that we can probably fix by |
| 1799 * estimating real costs more closely within a frame, perhaps by re- | 1910 * estimating real costs more closely within a frame, perhaps by re- |
| 1800 * calculating costs on-the-fly as frame encoding progresses. */ | 1911 * calculating costs on-the-fly as frame encoding progresses. */ |
| 1801 if (cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] > | 1912 if (cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] > |
| 1802 cpi->rd_tx_select_threshes[frame_type][ONLY_4X4] && | 1913 cpi->rd_tx_select_threshes[frame_type][ONLY_4X4] && |
| 1803 cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] > | 1914 cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] > |
| 1804 cpi->rd_tx_select_threshes[frame_type][ALLOW_16X16] && | 1915 cpi->rd_tx_select_threshes[frame_type][ALLOW_16X16] && |
| 1805 cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] > | 1916 cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] > |
| 1806 cpi->rd_tx_select_threshes[frame_type][ALLOW_8X8]) { | 1917 cpi->rd_tx_select_threshes[frame_type][ALLOW_8X8]) { |
| 1807 txfm_type = TX_MODE_SELECT; | 1918 txfm_type = TX_MODE_SELECT; |
| 1808 } else if (cpi->rd_tx_select_threshes[frame_type][ONLY_4X4] > | 1919 } else if (cpi->rd_tx_select_threshes[frame_type][ONLY_4X4] > |
| 1809 cpi->rd_tx_select_threshes[frame_type][ALLOW_8X8] | 1920 cpi->rd_tx_select_threshes[frame_type][ALLOW_8X8] |
| 1810 && cpi->rd_tx_select_threshes[frame_type][ONLY_4X4] > | 1921 && cpi->rd_tx_select_threshes[frame_type][ONLY_4X4] > |
| 1811 cpi->rd_tx_select_threshes[frame_type][ALLOW_16X16] | 1922 cpi->rd_tx_select_threshes[frame_type][ALLOW_16X16] |
| 1812 ) { | 1923 ) { |
| 1813 txfm_type = ONLY_4X4; | 1924 txfm_type = ONLY_4X4; |
| 1814 } else if (cpi->rd_tx_select_threshes[frame_type][ALLOW_16X16] >= | 1925 } else if (cpi->rd_tx_select_threshes[frame_type][ALLOW_16X16] >= |
| 1815 cpi->rd_tx_select_threshes[frame_type][ALLOW_8X8]) { | 1926 cpi->rd_tx_select_threshes[frame_type][ALLOW_8X8]) { |
| 1816 txfm_type = ALLOW_16X16; | 1927 txfm_type = ALLOW_16X16; |
| 1817 } else | 1928 } else |
| 1818 txfm_type = ALLOW_8X8; | 1929 txfm_type = ALLOW_8X8; |
| 1819 #else | 1930 #else |
| 1820 txfm_type = cpi->rd_tx_select_threshes[frame_type][ALLOW_32X32] > | 1931 txfm_type = |
| 1821 cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] ? | 1932 cpi->rd_tx_select_threshes[frame_type][ALLOW_32X32] |
| 1822 ALLOW_32X32 : TX_MODE_SELECT; | 1933 > cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] ? |
| 1934 ALLOW_32X32 : TX_MODE_SELECT; |
| 1823 #endif | 1935 #endif |
| 1824 cpi->common.txfm_mode = txfm_type; | 1936 cpi->common.txfm_mode = txfm_type; |
| 1825 cpi->common.comp_pred_mode = pred_type; | 1937 cpi->common.comp_pred_mode = pred_type; |
| 1826 encode_frame_internal(cpi); | 1938 encode_frame_internal(cpi); |
| 1827 | 1939 |
| 1828 for (i = 0; i < NB_PREDICTION_TYPES; ++i) { | 1940 for (i = 0; i < NB_PREDICTION_TYPES; ++i) { |
| 1829 const int diff = (int)(cpi->rd_comp_pred_diff[i] / cpi->common.MBs); | 1941 const int diff = (int) (cpi->rd_comp_pred_diff[i] / cpi->common.MBs); |
| 1830 cpi->rd_prediction_type_threshes[frame_type][i] += diff; | 1942 cpi->rd_prediction_type_threshes[frame_type][i] += diff; |
| 1831 cpi->rd_prediction_type_threshes[frame_type][i] >>= 1; | 1943 cpi->rd_prediction_type_threshes[frame_type][i] >>= 1; |
| 1832 } | 1944 } |
| 1833 | 1945 |
| 1834 for (i = 0; i < NB_TXFM_MODES; ++i) { | 1946 for (i = 0; i < NB_TXFM_MODES; ++i) { |
| 1835 int64_t pd = cpi->rd_tx_select_diff[i]; | 1947 int64_t pd = cpi->rd_tx_select_diff[i]; |
| 1836 int diff; | 1948 int diff; |
| 1837 if (i == TX_MODE_SELECT) | 1949 if (i == TX_MODE_SELECT) |
| 1838 pd -= RDCOST(cpi->mb.rdmult, cpi->mb.rddiv, | 1950 pd -= RDCOST(cpi->mb.rdmult, cpi->mb.rddiv, |
| 1839 2048 * (TX_SIZE_MAX_SB - 1), 0); | 1951 2048 * (TX_SIZE_MAX_SB - 1), 0); |
| 1840 diff = (int)(pd / cpi->common.MBs); | 1952 diff = (int) (pd / cpi->common.MBs); |
| 1841 cpi->rd_tx_select_threshes[frame_type][i] += diff; | 1953 cpi->rd_tx_select_threshes[frame_type][i] += diff; |
| 1842 cpi->rd_tx_select_threshes[frame_type][i] /= 2; | 1954 cpi->rd_tx_select_threshes[frame_type][i] /= 2; |
| 1843 } | 1955 } |
| 1844 | 1956 |
| 1845 if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) { | 1957 if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) { |
| 1846 int single_count_zero = 0; | 1958 int single_count_zero = 0; |
| 1847 int comp_count_zero = 0; | 1959 int comp_count_zero = 0; |
| 1848 | 1960 |
| 1849 for (i = 0; i < COMP_INTER_CONTEXTS; i++) { | 1961 for (i = 0; i < COMP_INTER_CONTEXTS; i++) { |
| 1850 single_count_zero += cpi->comp_inter_count[i][0]; | 1962 single_count_zero += cpi->comp_inter_count[i][0]; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1883 | 1995 |
| 1884 for (i = 0; i < TX_SIZE_CONTEXTS; i++) | 1996 for (i = 0; i < TX_SIZE_CONTEXTS; i++) |
| 1885 count16x16_16x16p += cm->fc.tx_count_16x16p[i][TX_16X16]; | 1997 count16x16_16x16p += cm->fc.tx_count_16x16p[i][TX_16X16]; |
| 1886 | 1998 |
| 1887 for (i = 0; i < TX_SIZE_CONTEXTS; i++) | 1999 for (i = 0; i < TX_SIZE_CONTEXTS; i++) |
| 1888 count16x16_lp += cm->fc.tx_count_32x32p[i][TX_16X16]; | 2000 count16x16_lp += cm->fc.tx_count_32x32p[i][TX_16X16]; |
| 1889 | 2001 |
| 1890 for (i = 0; i < TX_SIZE_CONTEXTS; i++) | 2002 for (i = 0; i < TX_SIZE_CONTEXTS; i++) |
| 1891 count32x32 += cm->fc.tx_count_32x32p[i][TX_32X32]; | 2003 count32x32 += cm->fc.tx_count_32x32p[i][TX_32X32]; |
| 1892 | 2004 |
| 1893 if (count4x4 == 0 && count16x16_lp == 0 && count16x16_16x16p == 0 && | 2005 if (count4x4 == 0 && count16x16_lp == 0 && count16x16_16x16p == 0 |
| 1894 count32x32 == 0) { | 2006 && count32x32 == 0) { |
| 1895 cpi->common.txfm_mode = ALLOW_8X8; | 2007 cpi->common.txfm_mode = ALLOW_8X8; |
| 1896 reset_skip_txfm_size(cpi, TX_8X8); | 2008 reset_skip_txfm_size(cpi, TX_8X8); |
| 1897 } else if (count8x8_8x8p == 0 && count16x16_16x16p == 0 && | 2009 } else if (count8x8_8x8p == 0 && count16x16_16x16p == 0 |
| 1898 count8x8_lp == 0 && count16x16_lp == 0 && count32x32 == 0) { | 2010 && count8x8_lp == 0 && count16x16_lp == 0 && count32x32 == 0) { |
| 1899 cpi->common.txfm_mode = ONLY_4X4; | 2011 cpi->common.txfm_mode = ONLY_4X4; |
| 1900 reset_skip_txfm_size(cpi, TX_4X4); | 2012 reset_skip_txfm_size(cpi, TX_4X4); |
| 1901 } else if (count8x8_lp == 0 && count16x16_lp == 0 && count4x4 == 0) { | 2013 } else if (count8x8_lp == 0 && count16x16_lp == 0 && count4x4 == 0) { |
| 1902 cpi->common.txfm_mode = ALLOW_32X32; | 2014 cpi->common.txfm_mode = ALLOW_32X32; |
| 1903 } else if (count32x32 == 0 && count8x8_lp == 0 && count4x4 == 0) { | 2015 } else if (count32x32 == 0 && count8x8_lp == 0 && count4x4 == 0) { |
| 1904 cpi->common.txfm_mode = ALLOW_16X16; | 2016 cpi->common.txfm_mode = ALLOW_16X16; |
| 1905 reset_skip_txfm_size(cpi, TX_16X16); | 2017 reset_skip_txfm_size(cpi, TX_16X16); |
| 1906 } | 2018 } |
| 1907 } | 2019 } |
| 1908 | 2020 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1950 #else | 2062 #else |
| 1951 int64_t a; | 2063 int64_t a; |
| 1952 int64_t b; | 2064 int64_t b; |
| 1953 int64_t act = *(x->mb_activity_ptr); | 2065 int64_t act = *(x->mb_activity_ptr); |
| 1954 | 2066 |
| 1955 // Apply the masking to the RD multiplier. | 2067 // Apply the masking to the RD multiplier. |
| 1956 a = act + 4 * cpi->activity_avg; | 2068 a = act + 4 * cpi->activity_avg; |
| 1957 b = 4 * act + cpi->activity_avg; | 2069 b = 4 * act + cpi->activity_avg; |
| 1958 | 2070 |
| 1959 if (act > cpi->activity_avg) | 2071 if (act > cpi->activity_avg) |
| 1960 x->act_zbin_adj = (int)(((int64_t)b + (a >> 1)) / a) - 1; | 2072 x->act_zbin_adj = (int) (((int64_t) b + (a >> 1)) / a) - 1; |
| 1961 else | 2073 else |
| 1962 x->act_zbin_adj = 1 - (int)(((int64_t)a + (b >> 1)) / b); | 2074 x->act_zbin_adj = 1 - (int) (((int64_t) a + (b >> 1)) / b); |
| 1963 #endif | 2075 #endif |
| 1964 } | 2076 } |
| 1965 | 2077 |
| 1966 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, | 2078 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled, |
| 1967 int output_enabled, int mi_row, int mi_col, | 2079 int mi_row, int mi_col, BLOCK_SIZE_TYPE bsize) { |
| 1968 BLOCK_SIZE_TYPE bsize) { | 2080 VP9_COMMON * const cm = &cpi->common; |
| 1969 VP9_COMMON *const cm = &cpi->common; | 2081 MACROBLOCK * const x = &cpi->mb; |
| 1970 MACROBLOCK *const x = &cpi->mb; | 2082 MACROBLOCKD * const xd = &x->e_mbd; |
| 1971 MACROBLOCKD *const xd = &x->e_mbd; | |
| 1972 int n; | 2083 int n; |
| 1973 MODE_INFO *mi = xd->mode_info_context; | 2084 MODE_INFO *mi = xd->mode_info_context; |
| 1974 MB_MODE_INFO *mbmi = &mi->mbmi; | 2085 MB_MODE_INFO *mbmi = &mi->mbmi; |
| 1975 unsigned int segment_id = mbmi->segment_id; | 2086 unsigned int segment_id = mbmi->segment_id; |
| 1976 const int mis = cm->mode_info_stride; | 2087 const int mis = cm->mode_info_stride; |
| 1977 const int bwl = mi_width_log2(bsize); | 2088 const int bwl = mi_width_log2(bsize); |
| 1978 const int bw = 1 << bwl, bh = 1 << mi_height_log2(bsize); | 2089 const int bw = 1 << bwl, bh = 1 << mi_height_log2(bsize); |
| 1979 x->rd_search = 0; | 2090 x->rd_search = 0; |
| 1980 | 2091 |
| 1981 if (cm->frame_type == KEY_FRAME) { | 2092 if (cm->frame_type == KEY_FRAME) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2008 } | 2119 } |
| 2009 } else { | 2120 } else { |
| 2010 cpi->zbin_mode_boost = INTRA_ZBIN_BOOST; | 2121 cpi->zbin_mode_boost = INTRA_ZBIN_BOOST; |
| 2011 } | 2122 } |
| 2012 } | 2123 } |
| 2013 | 2124 |
| 2014 vp9_update_zbin_extra(cpi, x); | 2125 vp9_update_zbin_extra(cpi, x); |
| 2015 } | 2126 } |
| 2016 | 2127 |
| 2017 if (mbmi->ref_frame[0] == INTRA_FRAME) { | 2128 if (mbmi->ref_frame[0] == INTRA_FRAME) { |
| 2018 vp9_encode_intra_block_y(cm, x, (bsize < BLOCK_SIZE_SB8X8) ? | 2129 vp9_encode_intra_block_y( |
| 2019 BLOCK_SIZE_SB8X8 : bsize); | 2130 cm, x, (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); |
| 2020 vp9_encode_intra_block_uv(cm, x, (bsize < BLOCK_SIZE_SB8X8) ? | 2131 vp9_encode_intra_block_uv( |
| 2021 BLOCK_SIZE_SB8X8 : bsize); | 2132 cm, x, (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); |
| 2022 if (output_enabled) | 2133 if (output_enabled) |
| 2023 sum_intra_stats(cpi, x); | 2134 sum_intra_stats(cpi, x); |
| 2024 } else { | 2135 } else { |
| 2025 int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, mbmi->ref_frame[0])]; | 2136 int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, mbmi->ref_frame[0])]; |
| 2026 YV12_BUFFER_CONFIG *ref_fb = &cm->yv12_fb[idx]; | 2137 YV12_BUFFER_CONFIG *ref_fb = &cm->yv12_fb[idx]; |
| 2027 YV12_BUFFER_CONFIG *second_ref_fb = NULL; | 2138 YV12_BUFFER_CONFIG *second_ref_fb = NULL; |
| 2028 if (mbmi->ref_frame[1] > 0) { | 2139 if (mbmi->ref_frame[1] > 0) { |
| 2029 idx = cm->ref_frame_map[get_ref_frame_idx(cpi, mbmi->ref_frame[1])]; | 2140 idx = cm->ref_frame_map[get_ref_frame_idx(cpi, mbmi->ref_frame[1])]; |
| 2030 second_ref_fb = &cm->yv12_fb[idx]; | 2141 second_ref_fb = &cm->yv12_fb[idx]; |
| 2031 } | 2142 } |
| 2032 | 2143 |
| 2033 assert(cm->frame_type != KEY_FRAME); | 2144 assert(cm->frame_type != KEY_FRAME); |
| 2034 | 2145 |
| 2035 setup_pre_planes(xd, ref_fb, second_ref_fb, | 2146 setup_pre_planes(xd, ref_fb, second_ref_fb, mi_row, mi_col, |
| 2036 mi_row, mi_col, xd->scale_factor, xd->scale_factor_uv); | 2147 xd->scale_factor, xd->scale_factor_uv); |
| 2037 | 2148 |
| 2038 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, | 2149 vp9_build_inter_predictors_sb( |
| 2039 bsize < BLOCK_SIZE_SB8X8 ? BLOCK_SIZE_SB8X8 | 2150 xd, mi_row, mi_col, |
| 2040 : bsize); | 2151 bsize < BLOCK_SIZE_SB8X8 ? BLOCK_SIZE_SB8X8 : bsize); |
| 2041 } | 2152 } |
| 2042 | 2153 |
| 2043 if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) { | 2154 if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) { |
| 2044 vp9_tokenize_sb(cpi, xd, t, !output_enabled, | 2155 vp9_tokenize_sb(cpi, xd, t, !output_enabled, |
| 2045 (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); | 2156 (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); |
| 2046 } else if (!x->skip) { | 2157 } else if (!x->skip) { |
| 2047 vp9_encode_sb(cm, x, (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); | 2158 vp9_encode_sb(cm, x, (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); |
| 2048 vp9_tokenize_sb(cpi, xd, t, !output_enabled, | 2159 vp9_tokenize_sb(cpi, xd, t, !output_enabled, |
| 2049 (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); | 2160 (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); |
| 2050 } else { | 2161 } else { |
| 2051 // FIXME(rbultje): not tile-aware (mi - 1) | 2162 // FIXME(rbultje): not tile-aware (mi - 1) |
| 2052 int mb_skip_context = | 2163 int mb_skip_context = (mi - 1)->mbmi.mb_skip_coeff |
| 2053 (mi - 1)->mbmi.mb_skip_coeff + (mi - mis)->mbmi.mb_skip_coeff; | 2164 + (mi - mis)->mbmi.mb_skip_coeff; |
| 2054 | 2165 |
| 2055 mbmi->mb_skip_coeff = 1; | 2166 mbmi->mb_skip_coeff = 1; |
| 2056 if (output_enabled) | 2167 if (output_enabled) |
| 2057 cm->fc.mbskip_count[mb_skip_context][1]++; | 2168 cm->fc.mbskip_count[mb_skip_context][1]++; |
| 2058 vp9_reset_sb_tokens_context(xd, | 2169 vp9_reset_sb_tokens_context( |
| 2059 (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); | 2170 xd, (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize); |
| 2060 } | 2171 } |
| 2061 | 2172 |
| 2062 // copy skip flag on all mb_mode_info contexts in this SB | 2173 // copy skip flag on all mb_mode_info contexts in this SB |
| 2063 // if this was a skip at this txfm size | 2174 // if this was a skip at this txfm size |
| 2064 for (n = 1; n < bw * bh; n++) { | 2175 for (n = 1; n < bw * bh; n++) { |
| 2065 const int x_idx = n & (bw - 1), y_idx = n >> bwl; | 2176 const int x_idx = n & (bw - 1), y_idx = n >> bwl; |
| 2066 if (mi_col + x_idx < cm->mi_cols && mi_row + y_idx < cm->mi_rows) | 2177 if (mi_col + x_idx < cm->mi_cols && mi_row + y_idx < cm->mi_rows) |
| 2067 mi[x_idx + y_idx * mis].mbmi.mb_skip_coeff = mi->mbmi.mb_skip_coeff; | 2178 mi[x_idx + y_idx * mis].mbmi.mb_skip_coeff = mi->mbmi.mb_skip_coeff; |
| 2068 } | 2179 } |
| 2069 | 2180 |
| 2070 if (output_enabled) { | 2181 if (output_enabled) { |
| 2071 if (cm->txfm_mode == TX_MODE_SELECT && | 2182 if (cm->txfm_mode == TX_MODE_SELECT && mbmi->sb_type >= BLOCK_SIZE_SB8X8 |
| 2072 mbmi->sb_type >= BLOCK_SIZE_SB8X8 && | 2183 && !(mbmi->ref_frame[0] != INTRA_FRAME |
| 2073 !(mbmi->ref_frame[0] != INTRA_FRAME && (mbmi->mb_skip_coeff || | 2184 && (mbmi->mb_skip_coeff |
| 2074 vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) { | 2185 || vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) { |
| 2075 const int context = vp9_get_pred_context(cm, xd, PRED_TX_SIZE); | 2186 const int context = vp9_get_pred_context(cm, xd, PRED_TX_SIZE); |
| 2076 if (bsize >= BLOCK_SIZE_SB32X32) { | 2187 if (bsize >= BLOCK_SIZE_SB32X32) { |
| 2077 cm->fc.tx_count_32x32p[context][mbmi->txfm_size]++; | 2188 cm->fc.tx_count_32x32p[context][mbmi->txfm_size]++; |
| 2078 } else if (bsize >= BLOCK_SIZE_MB16X16) { | 2189 } else if (bsize >= BLOCK_SIZE_MB16X16) { |
| 2079 cm->fc.tx_count_16x16p[context][mbmi->txfm_size]++; | 2190 cm->fc.tx_count_16x16p[context][mbmi->txfm_size]++; |
| 2080 } else { | 2191 } else { |
| 2081 cm->fc.tx_count_8x8p[context][mbmi->txfm_size]++; | 2192 cm->fc.tx_count_8x8p[context][mbmi->txfm_size]++; |
| 2082 } | 2193 } |
| 2083 } else { | 2194 } else { |
| 2084 int x, y; | 2195 int x, y; |
| 2085 TX_SIZE sz = (cm->txfm_mode == TX_MODE_SELECT) ? TX_32X32 : cm->txfm_mode; | 2196 TX_SIZE sz = (cm->txfm_mode == TX_MODE_SELECT) ? TX_32X32 : cm->txfm_mode; |
| 2086 // The new intra coding scheme requires no change of transform size | 2197 // The new intra coding scheme requires no change of transform size |
| 2087 if (mi->mbmi.ref_frame[0] != INTRA_FRAME) { | 2198 if (mi->mbmi.ref_frame[0] != INTRA_FRAME) { |
| 2088 if (sz == TX_32X32 && bsize < BLOCK_SIZE_SB32X32) | 2199 if (sz == TX_32X32 && bsize < BLOCK_SIZE_SB32X32) |
| 2089 sz = TX_16X16; | 2200 sz = TX_16X16; |
| 2090 if (sz == TX_16X16 && bsize < BLOCK_SIZE_MB16X16) | 2201 if (sz == TX_16X16 && bsize < BLOCK_SIZE_MB16X16) |
| 2091 sz = TX_8X8; | 2202 sz = TX_8X8; |
| 2092 if (sz == TX_8X8 && bsize < BLOCK_SIZE_SB8X8) | 2203 if (sz == TX_8X8 && bsize < BLOCK_SIZE_SB8X8) |
| 2093 sz = TX_4X4; | 2204 sz = TX_4X4; |
| 2094 } else if (bsize >= BLOCK_SIZE_SB8X8) { | 2205 } else if (bsize >= BLOCK_SIZE_SB8X8) { |
| 2095 sz = mbmi->txfm_size; | 2206 sz = mbmi->txfm_size; |
| 2096 } else { | 2207 } else { |
| 2097 sz = TX_4X4; | 2208 sz = TX_4X4; |
| 2098 } | 2209 } |
| 2099 | 2210 |
| 2100 for (y = 0; y < bh; y++) { | 2211 for (y = 0; y < bh; y++) { |
| 2101 for (x = 0; x < bw; x++) { | 2212 for (x = 0; x < bw; x++) { |
| 2102 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) { | 2213 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) { |
| 2103 mi[mis * y + x].mbmi.txfm_size = sz; | 2214 mi[mis * y + x].mbmi.txfm_size = sz; |
| 2104 } | 2215 } |
| 2105 } | 2216 } |
| 2106 } | 2217 } |
| 2107 } | 2218 } |
| 2108 } | 2219 } |
| 2109 } | 2220 } |
| OLD | NEW |