summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeng.chen <peng.c.chen@intel.com>2016-11-18 10:47:01 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2016-11-30 12:41:56 +0800
commitf7e3269f64d4bebeaa0f44ac8da6bb82b4aeba2b (patch)
treec9027bdb6de8872f7e1c6d6048cd6479dd997cb2
parent99af1428459a5c7cfe9d997dd09eb90818d990e1 (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.c35
-rw-r--r--src/i965_encoder.h6
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;