diff options
author | peng.chen <peng.c.chen@intel.com> | 2016-11-18 10:47:01 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2016-11-30 12:41:56 +0800 |
commit | f7e3269f64d4bebeaa0f44ac8da6bb82b4aeba2b (patch) | |
tree | c9027bdb6de8872f7e1c6d6048cd6479dd997cb2 | |
parent | 99af1428459a5c7cfe9d997dd09eb90818d990e1 (diff) |
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 <peng.c.chen@intel.com>
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
-rw-r--r-- | src/i965_encoder.c | 35 | ||||
-rw-r--r-- | src/i965_encoder.h | 6 |
2 files changed, 41 insertions, 0 deletions
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; |