summaryrefslogtreecommitdiff
path: root/src/gen9_mfc_hevc.c
diff options
context:
space:
mode:
authorpeng.chen <peng.c.chen@intel.com>2016-04-25 13:42:50 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2016-04-28 20:32:34 +0800
commit4643f94991e4e36ce3a23de63cce9fe543ed1725 (patch)
treef6d0a9e8e869e482008b3b645d82b49810bd0d9c /src/gen9_mfc_hevc.c
parent656c16bf9a399ea3154a12f24846323bfe3ef4e5 (diff)
add the support of 8-aligned size setting for hevc encoding
v2: disable drop cu flag for 16-aliged size v1: created Signed-off-by: peng.chen <peng.c.chen@intel.com>
Diffstat (limited to 'src/gen9_mfc_hevc.c')
-rw-r--r--src/gen9_mfc_hevc.c68
1 files changed, 64 insertions, 4 deletions
diff --git a/src/gen9_mfc_hevc.c b/src/gen9_mfc_hevc.c
index fd976f0..ad5e936 100644
--- a/src/gen9_mfc_hevc.c
+++ b/src/gen9_mfc_hevc.c
@@ -1687,6 +1687,8 @@ gen9_hcpe_hevc_pipeline_slice_programing(VADriverContextP ctx,
int cu_index = 0;
int inter_rdo, intra_rdo;
int qp;
+ int drop_cu_row_in_last_mb = 0;
+ int drop_cu_column_in_last_mb = 0;
if (log2_ctb_size == 5) num_cu_record = 16;
else if (log2_ctb_size == 4) num_cu_record = 4;
@@ -1751,10 +1753,29 @@ gen9_hcpe_hevc_pipeline_slice_programing(VADriverContextP ctx,
int last_ctb = (i_ctb == (pSliceParameter->slice_segment_address + pSliceParameter->num_ctu_in_slice - 1));
int ctb_height_in_mb_internal = ctb_width_in_mb;
int ctb_width_in_mb_internal = ctb_width_in_mb;
+ int max_cu_num_in_mb = 4;
+
ctb_x = i_ctb % width_in_ctb;
ctb_y = i_ctb / width_in_ctb;
- if(ctb_y == (height_in_ctb - 1) && row_pad_flag) ctb_height_in_mb_internal = 1;
- if(ctb_x == (width_in_ctb - 1) && col_pad_flag) ctb_width_in_mb_internal = 1;
+
+ drop_cu_row_in_last_mb = 0;
+ drop_cu_column_in_last_mb = 0;
+
+ if(ctb_y == (height_in_ctb - 1) && row_pad_flag)
+ {
+ ctb_height_in_mb_internal = (pSequenceParameter->pic_height_in_luma_samples - (ctb_y * ctb_size) + 15)/16;
+
+ if((log2_cu_size == 3) && (pSequenceParameter->pic_height_in_luma_samples % 16))
+ drop_cu_row_in_last_mb = (16 - (pSequenceParameter->pic_height_in_luma_samples % 16))>>log2_cu_size;
+ }
+
+ if(ctb_x == (width_in_ctb - 1) && col_pad_flag)
+ {
+ ctb_width_in_mb_internal = (pSequenceParameter->pic_width_in_luma_samples - (ctb_x * ctb_size) + 15) / 16;
+
+ if((log2_cu_size == 3) && (pSequenceParameter->pic_width_in_luma_samples % 16))
+ drop_cu_column_in_last_mb = (16 - (pSequenceParameter->pic_width_in_luma_samples % 16))>>log2_cu_size;
+ }
mb_x = 0;
mb_y = 0;
@@ -1769,6 +1790,13 @@ gen9_hcpe_hevc_pipeline_slice_programing(VADriverContextP ctx,
mb_addr = macroblock_address + mb_y * width_in_mbs ;
for (mb_x = 0; mb_x < ctb_width_in_mb_internal; mb_x++)
{
+ max_cu_num_in_mb = 4;
+ if(drop_cu_row_in_last_mb && (mb_y == ctb_height_in_mb_internal - 1))
+ max_cu_num_in_mb /= 2;
+
+ if(drop_cu_column_in_last_mb && (mb_x == ctb_width_in_mb_internal - 1))
+ max_cu_num_in_mb /= 2;
+
/* get the mb info from the vme out */
msg = (unsigned int *)(msg_ptr + mb_addr * vme_context->vme_output.size_block);
@@ -1779,7 +1807,23 @@ gen9_hcpe_hevc_pipeline_slice_programing(VADriverContextP ctx,
if (is_intra || intra_rdo < inter_rdo) {
/* fill intra cu */
tmp_mb_mode = (msg[0] & AVC_INTRA_MODE_MASK) >> 4;
- if (tmp_mb_mode == AVC_INTRA_16X16) {
+ if(max_cu_num_in_mb < 4){
+ if(tmp_mb_mode == AVC_INTRA_16X16)
+ {
+ msg[0] = (msg[0] & !AVC_INTRA_MODE_MASK) | (AVC_INTRA_8X8<<4);
+ tmp_mb_mode = AVC_INTRA_8X8;
+ }
+
+ gen9_hcpe_hevc_fill_indirect_cu_intra(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,0);
+ if(--max_cu_num_in_mb > 0)
+ gen9_hcpe_hevc_fill_indirect_cu_intra(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,2);
+
+ if(ctb_width_in_mb == 2)
+ split_coding_unit_flag |= 0x1 << (mb_x + mb_y * ctb_width_in_mb + 16);
+ else if(ctb_width_in_mb == 1)
+ split_coding_unit_flag |= 0x1 << 20;
+ }
+ else if(tmp_mb_mode == AVC_INTRA_16X16) {
gen9_hcpe_hevc_fill_indirect_cu_intra(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,0);
} else { // for 4x4 to use 8x8 replace
gen9_hcpe_hevc_fill_indirect_cu_intra(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,0);
@@ -1795,7 +1839,23 @@ gen9_hcpe_hevc_pipeline_slice_programing(VADriverContextP ctx,
msg += AVC_INTER_MSG_OFFSET;
/* fill inter cu */
tmp_mb_mode = msg[0] & AVC_INTER_MODE_MASK;
- if (tmp_mb_mode == AVC_INTER_8X8){
+ if(max_cu_num_in_mb < 4)
+ {
+ if(tmp_mb_mode != AVC_INTER_8X8)
+ {
+ msg[0] = (msg[0] & !AVC_INTER_MODE_MASK) | AVC_INTER_8X8;
+ tmp_mb_mode = AVC_INTER_8X8;
+ }
+ gen9_hcpe_hevc_fill_indirect_cu_inter(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,0);
+ if(--max_cu_num_in_mb > 0)
+ gen9_hcpe_hevc_fill_indirect_cu_inter(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,1);
+
+ if(ctb_width_in_mb == 2)
+ split_coding_unit_flag |= 0x1 << (mb_x + mb_y * ctb_width_in_mb + 16);
+ else if(ctb_width_in_mb == 1)
+ split_coding_unit_flag |= 0x1 << 20;
+ }
+ else if (tmp_mb_mode == AVC_INTER_8X8){
gen9_hcpe_hevc_fill_indirect_cu_inter(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,0);
gen9_hcpe_hevc_fill_indirect_cu_inter(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,1);
gen9_hcpe_hevc_fill_indirect_cu_inter(ctx, encode_state, encoder_context, qp, msg, ctb_x, ctb_y, mb_x, mb_y, ctb_width_in_mb, width_in_ctb, num_cu_record, slice_type,cu_index++,2);