// BRC start
static void
+gen9_hevc_configure_roi(struct encode_state *encode_state,
+ struct intel_encoder_context *encoder_context)
+{
+ struct encoder_vme_mfc_context *vme_context = NULL;
+ struct gen9_hevc_encoder_state *priv_state = NULL;
+ int i = 0;
+
+ vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
+ priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
+
+ priv_state->num_roi = MIN(encoder_context->brc.num_roi, I965_MAX_NUM_ROI_REGIONS);
+ priv_state->roi_value_is_qp_delta = encoder_context->brc.roi_value_is_qp_delta;
+
+ for (i = 0; i < priv_state->num_roi; i++) {
+ priv_state->roi[i].left = encoder_context->brc.roi[i].left >> 4;
+ priv_state->roi[i].right = encoder_context->brc.roi[i].right >> 4;
+ priv_state->roi[i].top = encoder_context->brc.roi[i].top >> 4;
+ priv_state->roi[i].bottom = encoder_context->brc.roi[i].bottom >> 4;
+ priv_state->roi[i].value = encoder_context->brc.roi[i].value;
+ }
+}
+
+static void
gen9_hevc_brc_prepare(struct encode_state *encode_state,
struct intel_encoder_context *encoder_context)
{
generic_state->brc_need_reset = brc_reset;
encoder_context->brc.need_reset = 0;
}
+
+ gen9_hevc_configure_roi(encode_state, encoder_context);
}
static void
int cur_mb_x = i - cur_mb_y * priv_state->width_in_mb;
int roi_idx = 0;
- if (cur_mb_x > 1 && cur_mb_x < (priv_state->width_in_mb - 2) &&
- cur_mb_y > 1 && cur_mb_y < (priv_state->width_in_mb - 2)) {
- out_data = 0;
+ out_data = 0;
- for (roi_idx = (priv_state->num_roi - 1); roi_idx >= 0; roi_idx--) {
- roi_par = &priv_state->roi[roi_idx];
+ for (roi_idx = (priv_state->num_roi - 1); roi_idx >= 0; roi_idx--) {
+ roi_par = &priv_state->roi[roi_idx];
- roi_level = qp_delta = 0;
- if (generic_state->brc_enabled)
- roi_level = roi_par->value * 5;
- else
- qp_delta = roi_par->value;
+ roi_level = qp_delta = 0;
+ if (generic_state->brc_enabled && !priv_state->roi_value_is_qp_delta)
+ roi_level = roi_par->value * 5;
+ else
+ qp_delta = roi_par->value;
-#if 0
- if (roi_level == 0)
- continue;
-#endif
+ if (roi_level == 0 && qp_delta == 0)
+ continue;
- if ((cur_mb_x >= roi_par->left) &&
- (cur_mb_x < roi_par->right) &&
- (cur_mb_y >= roi_par->top) &&
- (cur_mb_y < roi_par->bottom))
- out_data = 15 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
- else if ((cur_mb_x >= roi_par->left - 1) &&
- (cur_mb_x < roi_par->right + 1) &&
- (cur_mb_y >= roi_par->top - 1) &&
- (cur_mb_y < roi_par->top + 1))
- out_data = 14 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
- else if ((cur_mb_x >= roi_par->left - 2) &&
- (cur_mb_x < roi_par->right + 2) &&
- (cur_mb_y >= roi_par->top - 2) &&
- (cur_mb_y < roi_par->top + 2))
- out_data = 13 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
- else if ((cur_mb_x >= roi_par->left - 3) &&
- (cur_mb_x < roi_par->right + 3) &&
- (cur_mb_y >= roi_par->top - 3) &&
- (cur_mb_y < roi_par->top + 3)) {
- if (qp_delta >= 3)
- out_data = 12 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
- }
+ if ((cur_mb_x >= roi_par->left) &&
+ (cur_mb_x < roi_par->right) &&
+ (cur_mb_y >= roi_par->top) &&
+ (cur_mb_y < roi_par->bottom))
+ out_data = 15 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
+ else if ((cur_mb_x >= roi_par->left - 1) &&
+ (cur_mb_x < roi_par->right + 1) &&
+ (cur_mb_y >= roi_par->top - 1) &&
+ (cur_mb_y < roi_par->bottom + 1))
+ out_data = 14 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
+ else if ((cur_mb_x >= roi_par->left - 2) &&
+ (cur_mb_x < roi_par->right + 2) &&
+ (cur_mb_y >= roi_par->top - 2) &&
+ (cur_mb_y < roi_par->bottom + 2))
+ out_data = 13 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
+ else if ((cur_mb_x >= roi_par->left - 3) &&
+ (cur_mb_x < roi_par->right + 3) &&
+ (cur_mb_y >= roi_par->top - 3) &&
+ (cur_mb_y < roi_par->bottom + 3)) {
+ out_data = 12 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
}
- pdata[(cur_mb_y * (width_in_mb_aligned >> 2)) + cur_mb_x] = out_data;
}
+
+ pdata[(cur_mb_y * (width_in_mb_aligned >> 2)) + cur_mb_x] = out_data;
}
i965_unmap_gpe_resource(&priv_ctx->res_roi_buffer);
} else {
memcpy((void *)cmd, GEN9_HEVC_BRCUPDATE_CURBE_DATA,
sizeof(GEN9_HEVC_BRCUPDATE_CURBE_DATA));
-
- if (priv_state->num_roi)
- gen9_hevc_brc_update_set_roi_curbe(ctx, encode_state, encoder_context, cmd);
}
+ if (priv_state->num_roi)
+ gen9_hevc_brc_update_set_roi_curbe(ctx, encode_state, encoder_context, cmd);
+
i965_gpe_context_unmap_curbe(gpe_context);
}