From f7e3269f64d4bebeaa0f44ac8da6bb82b4aeba2b Mon Sep 17 00:00:00 2001 From: "peng.chen" Date: Fri, 18 Nov 2016 10:47:01 +0800 Subject: [PATCH] Save ROI parameters in the common encoder context These parameters can be used for all codecs v2: Don't align ROI region, each codec might have special requirement Signed-off-by: peng.chen Signed-off-by: Xiang, Haihao Reviewed-by: Zhao Yakui --- src/i965_encoder.c | 35 +++++++++++++++++++++++++++++++++++ src/i965_encoder.h | 6 ++++++ 2 files changed, 41 insertions(+) diff --git a/src/i965_encoder.c b/src/i965_encoder.c index 4ef92eb..4aa3ee1 100644 --- a/src/i965_encoder.c +++ b/src/i965_encoder.c @@ -438,6 +438,30 @@ intel_encoder_check_framerate_parameter(VADriverContextP ctx, } } +static void +intel_encoder_check_roi_parameter(VADriverContextP ctx, + struct intel_encoder_context *encoder_context, + VAEncMiscParameterBufferROI *misc) +{ + int i = 0; + + encoder_context->brc.num_roi = MIN(misc->num_roi, I965_MAX_NUM_ROI_REGIONS); + encoder_context->brc.roi_max_delta_qp = misc->max_delta_qp; + encoder_context->brc.roi_min_delta_qp = misc->min_delta_qp; + encoder_context->brc.roi_value_is_qp_delta = 0; + + if (encoder_context->rate_control_mode != VA_RC_CQP) + encoder_context->brc.roi_value_is_qp_delta = misc->roi_flags.bits.roi_value_is_qp_delta; + + for (i = 0; i < encoder_context->brc.num_roi; i++) { + encoder_context->brc.roi[i].left = misc->roi->roi_rectangle.x; + encoder_context->brc.roi[i].right = encoder_context->brc.roi[i].left + misc->roi->roi_rectangle.width; + encoder_context->brc.roi[i].top = misc->roi->roi_rectangle.y; + encoder_context->brc.roi[i].bottom = encoder_context->brc.roi[i].top + misc->roi->roi_rectangle.height; + encoder_context->brc.roi[i].value = misc->roi->roi_value; + } +} + static VAStatus intel_encoder_check_brc_parameter(VADriverContextP ctx, struct encode_state *encode_state, @@ -481,6 +505,12 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx, (VAEncMiscParameterHRD *)misc_param->data); break; + case VAEncMiscParameterTypeROI: + intel_encoder_check_roi_parameter(ctx, + encoder_context, + (VAEncMiscParameterBufferROI *)misc_param->data); + break; + default: break; } @@ -1056,6 +1086,11 @@ intel_encoder_end_picture(VADriverContextP ctx, encoder_context->mfc_pipeline(ctx, profile, encode_state, encoder_context); encoder_context->num_frames_in_sequence++; encoder_context->brc.need_reset = 0; + /* + * ROI is only available for the current frame, see the comment + * for VAEncROI in va.h + */ + encoder_context->brc.num_roi = 0; return VA_STATUS_SUCCESS; } diff --git a/src/i965_encoder.h b/src/i965_encoder.h index ba31364..fe5a595 100644 --- a/src/i965_encoder.h +++ b/src/i965_encoder.h @@ -84,6 +84,12 @@ struct intel_encoder_context unsigned int hrd_buffer_size; unsigned int hrd_initial_buffer_fullness; unsigned int need_reset; + + unsigned int num_roi; + unsigned int roi_max_delta_qp; + unsigned int roi_min_delta_qp; + unsigned int roi_value_is_qp_delta; + struct intel_roi roi[I965_MAX_NUM_ROI_REGIONS]; } brc; void *vme_context; -- 2.11.0