277
279
dist_scale_factor = ( ((b-p0) << 8) + ((p1-p0) >> 1) ) / (p1-p0);
281
if( h->sps->i_mb_width <= 2 || h->sps->i_mb_height <= 2 )
283
for( h->mb.i_mb_y = 0; h->mb.i_mb_y < h->sps->i_mb_height; h->mb.i_mb_y++ )
284
for( h->mb.i_mb_x = 0; h->mb.i_mb_x < h->sps->i_mb_width; h->mb.i_mb_x++ )
285
i_score += x264_slicetype_mb_cost( h, a, frames, p0, p1, b, dist_scale_factor );
279
287
/* the edge mbs seem to reduce the predictive quality of the
280
288
* whole frame's score, but are needed for a spatial distribution. */
281
if( h->param.rc.i_vbv_buffer_size )
289
else if( h->param.rc.i_vbv_buffer_size )
283
291
for( h->mb.i_mb_y = 0; h->mb.i_mb_y < h->sps->i_mb_height; h->mb.i_mb_y++ )
286
294
for( h->mb.i_mb_x = 0; h->mb.i_mb_x < h->sps->i_mb_width; h->mb.i_mb_x++ )
288
296
int i_mb_cost = x264_slicetype_mb_cost( h, a, frames, p0, p1, b, dist_scale_factor );
289
row_satd[ h->mb.i_mb_y ] += i_mb_cost;
297
int i_mb_cost_aq = i_mb_cost;
298
if( h->param.rc.i_aq_mode )
301
i_mb_cost_aq *= pow(2.0,-(frames[b]->f_qp_offset[h->mb.i_mb_x + h->mb.i_mb_y*h->mb.i_mb_stride])/6.0);
303
row_satd[ h->mb.i_mb_y ] += i_mb_cost_aq;
290
304
if( h->mb.i_mb_y > 0 && h->mb.i_mb_y < h->sps->i_mb_height - 1 &&
291
305
h->mb.i_mb_x > 0 && h->mb.i_mb_x < h->sps->i_mb_width - 1 )
307
/* Don't use AQ-weighted costs for slicetype decision, only for ratecontrol. */
293
308
i_score += i_mb_cost;
309
i_score_aq += i_mb_cost_aq;
298
else if( h->sps->i_mb_width > 2 && h->sps->i_mb_height > 2 )
300
316
for( h->mb.i_mb_y = 1; h->mb.i_mb_y < h->sps->i_mb_height - 1; h->mb.i_mb_y++ )
301
317
for( h->mb.i_mb_x = 1; h->mb.i_mb_x < h->sps->i_mb_width - 1; h->mb.i_mb_x++ )
302
i_score += x264_slicetype_mb_cost( h, a, frames, p0, p1, b, dist_scale_factor );
306
for( h->mb.i_mb_y = 0; h->mb.i_mb_y < h->sps->i_mb_height; h->mb.i_mb_y++ )
307
for( h->mb.i_mb_x = 0; h->mb.i_mb_x < h->sps->i_mb_width; h->mb.i_mb_x++ )
308
i_score += x264_slicetype_mb_cost( h, a, frames, p0, p1, b, dist_scale_factor );
319
int i_mb_cost = x264_slicetype_mb_cost( h, a, frames, p0, p1, b, dist_scale_factor );
320
int i_mb_cost_aq = i_mb_cost;
321
if( h->param.rc.i_aq_mode )
324
i_mb_cost_aq *= pow(2.0,-(frames[b]->f_qp_offset[h->mb.i_mb_x + h->mb.i_mb_y*h->mb.i_mb_stride])/6.0);
326
i_score += i_mb_cost;
327
i_score_aq += i_mb_cost_aq;
313
332
i_score = i_score * 100 / (120 + h->param.i_bframe_bias);
315
334
frames[b]->i_cost_est[b-p0][p1-b] = i_score;
335
frames[b]->i_cost_est_aq[b-p0][p1-b] = i_score_aq;
316
336
// fprintf( stderr, "frm %d %c(%d,%d): %6d %6d imb:%d \n", frames[b]->i_frame,
317
337
// (p1==0?'I':b<p1?'B':'P'), b-p0, p1-b, i_score, frames[b]->i_cost_est[0][0], frames[b]->i_intra_mbs[b-p0] );
538
558
frames[b] = h->fenc;
540
560
cost = x264_slicetype_frame_cost( h, &a, frames, p0, p1, b, 0 );
562
/* In AQ, use the weighted score instead. */
563
if( h->param.rc.i_aq_mode )
564
cost = frames[b]->i_cost_est[b-p0][p1-b];
541
566
h->fenc->i_row_satd = h->fenc->i_row_satds[b-p0][p1-b];
542
567
h->fdec->i_row_satd = h->fdec->i_row_satds[b-p0][p1-b];
543
568
h->fdec->i_satd = cost;