Encoder: Added support for Constrained intra prediction.
am:8668fbcc97* commit '8668fbcc97': Encoder: Added support for Constrained intra prediction.
This commit is contained in:
commit
e0f8b95f0c
6 changed files with 144 additions and 43 deletions
|
|
@ -1420,6 +1420,16 @@ static IV_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
|
|||
return IV_FAIL;
|
||||
}
|
||||
|
||||
if ((ps_ip->s_ive_ip.u4_constrained_intra_pred != 0)
|
||||
&& (ps_ip->s_ive_ip.u4_constrained_intra_pred != 1))
|
||||
{
|
||||
ps_op->s_ive_op.u4_error_code |= 1
|
||||
<< IVE_UNSUPPORTEDPARAM;
|
||||
ps_op->s_ive_op.u4_error_code |=
|
||||
IH264E_INVALID_CONSTRAINED_INTRA_PREDICTION_MODE;
|
||||
return IV_FAIL;
|
||||
}
|
||||
|
||||
if ((ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_CONFIG)
|
||||
&& (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_SLOWEST)
|
||||
&& (ps_ip->s_ive_ip.u4_enc_speed_preset != IVE_NORMAL)
|
||||
|
|
@ -1979,7 +1989,7 @@ IH264E_ERROR_T ih264e_codec_update_config(codec_t *ps_codec,
|
|||
else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_IPE_PARAMS)
|
||||
{
|
||||
ps_curr_cfg->u4_enc_speed_preset = ps_cfg->u4_enc_speed_preset;
|
||||
|
||||
ps_curr_cfg->u4_constrained_intra_pred = ps_cfg->u4_constrained_intra_pred;
|
||||
if (ps_curr_cfg->u4_enc_speed_preset == IVE_SLOWEST)
|
||||
{/* high quality */
|
||||
/* enable diamond search */
|
||||
|
|
@ -5069,6 +5079,8 @@ static IV_STATUS_T ih264_set_ipe_params(void *pv_api_ip,
|
|||
ps_cfg->u4_enable_intra_4x4 = ps_ip->s_ive_ip.u4_enable_intra_4x4;
|
||||
ps_cfg->u4_enc_speed_preset = ps_ip->s_ive_ip.u4_enc_speed_preset;
|
||||
|
||||
ps_cfg->u4_constrained_intra_pred = ps_ip->s_ive_ip.u4_constrained_intra_pred;
|
||||
|
||||
ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
|
||||
ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
|
||||
|
||||
|
|
|
|||
|
|
@ -226,6 +226,9 @@ typedef enum
|
|||
/**Invalid entropy coding mode */
|
||||
IH264E_INVALID_ENTROPY_CODING_MODE = IH264E_CODEC_ERROR_START + 0x31,
|
||||
|
||||
/**Invalid Constrained Intra prediction mode */
|
||||
IH264E_INVALID_CONSTRAINED_INTRA_PREDICTION_MODE = IH264E_CODEC_ERROR_START + 0x32,
|
||||
|
||||
/**max failure error code to ensure enum is 32 bits wide */
|
||||
IH264E_FAIL = -1,
|
||||
|
||||
|
|
|
|||
|
|
@ -363,15 +363,17 @@ void ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff(process_ctxt_t *ps
|
|||
UWORD8 *pu1_mb_a = pu1_ref_mb - 1;
|
||||
UWORD8 *pu1_mb_b = pu1_ref_mb - i4_rec_strd;
|
||||
UWORD8 *pu1_mb_d = pu1_mb_b - 1;
|
||||
|
||||
UWORD8 u1_mb_a, u1_mb_b, u1_mb_d;
|
||||
/* valid intra modes map */
|
||||
UWORD32 u4_valid_intra_modes;
|
||||
|
||||
/* lut for valid intra modes */
|
||||
const UWORD8 u1_valid_intra_modes[8] = {4, 6, 12, 14, 5, 7, 13, 15};
|
||||
const UWORD8 u1_valid_intra_modes[8] = {4, 6, 4, 6, 5, 7, 5, 15};
|
||||
|
||||
/* temp var */
|
||||
UWORD32 i, u4_enable_fast_sad = 0, offset = 0;
|
||||
mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
UWORD32 u4_constrained_intra_pred = ps_proc->ps_codec->s_cfg.u4_constrained_intra_pred;
|
||||
|
||||
/* init temp var */
|
||||
if (ps_proc->i4_slice_type != ISLICE)
|
||||
|
|
@ -382,17 +384,13 @@ void ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff(process_ctxt_t *ps
|
|||
}
|
||||
|
||||
/* locating neighbors that are available for prediction */
|
||||
/* TODO : update the neighbor availability information basing on constrained intra pred information */
|
||||
/* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines
|
||||
* basing on neighbors available and hence evade the computation of neighbor availability totally. */
|
||||
/* i4_ngbr_avbl = blk_a * LEFT_MB_AVAILABLE_MASK + blk_b * TOP_MB_AVAILABLE_MASK + blk_d * TOP_LEFT_MB_AVAILABLE_MASK */
|
||||
i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1);
|
||||
ps_proc->i4_ngbr_avbl_16x16_mb = i4_ngbr_avbl;
|
||||
|
||||
/* gather prediction pels from the neighbors, if particular set is not available
|
||||
* it is set to zero*/
|
||||
/* left pels */
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
u1_mb_a = ((ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
if (u1_mb_a)
|
||||
{
|
||||
for(i = 0; i < 16; i++)
|
||||
pu1_ngbr_pels_i16[16-1-i] = pu1_mb_a[i * i4_rec_strd];
|
||||
|
|
@ -402,33 +400,32 @@ void ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff(process_ctxt_t *ps
|
|||
ps_codec->pf_mem_set_mul8(pu1_ngbr_pels_i16,0,MB_SIZE);
|
||||
}
|
||||
/* top pels */
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
u1_mb_b = ((ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
&& (u4_constrained_intra_pred ? ps_top_mb_syn_ele->u2_is_intra : 1));
|
||||
if (u1_mb_b)
|
||||
{
|
||||
ps_codec->pf_mem_cpy_mul8(pu1_ngbr_pels_i16+16+1,pu1_mb_b,16);
|
||||
/*for(i = 0; i < 16; i++)
|
||||
pu1_ngbr_pels_i16[16+1+i] = pu1_mb_b[i];*/
|
||||
}
|
||||
else
|
||||
{
|
||||
ps_codec->pf_mem_set_mul8(pu1_ngbr_pels_i16+16+1,0,MB_SIZE);
|
||||
}
|
||||
/* topleft pels */
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
u1_mb_d = ((ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_top_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
if (u1_mb_d)
|
||||
{
|
||||
pu1_ngbr_pels_i16[16] = *pu1_mb_d;
|
||||
}
|
||||
else
|
||||
{
|
||||
pu1_ngbr_pels_i16[16] = 0;
|
||||
}
|
||||
|
||||
i4_ngbr_avbl = (u1_mb_a) + (u1_mb_b << 2) + (u1_mb_d << 1);
|
||||
ps_proc->i4_ngbr_avbl_16x16_mb = i4_ngbr_avbl;
|
||||
|
||||
/* set valid intra modes for evaluation */
|
||||
// u4_valid_intra_modes = 15;
|
||||
//// ih264e_filter_intra16x16modes(pu1_mb_curr, i4_src_strd, &u4_valid_intra_modes);
|
||||
// if (!ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
// u4_valid_intra_modes &= ~(1 << HORZ_I16x16);
|
||||
// if (!ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
// u4_valid_intra_modes &= ~(1 << VERT_I16x16);
|
||||
//// if (!ps_proc->ps_ngbr_avbl->u1_mb_a || !ps_proc->ps_ngbr_avbl->u1_mb_b || !ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
// if (i4_ngbr_avbl != 7)
|
||||
// u4_valid_intra_modes &= ~(1 << PLANE_I16x16);
|
||||
|
||||
u4_valid_intra_modes = u1_valid_intra_modes[i4_ngbr_avbl];
|
||||
|
||||
if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FAST)
|
||||
|
|
@ -443,7 +440,7 @@ void ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff(process_ctxt_t *ps
|
|||
/* cost = distortion + lambda*rate */
|
||||
i4_mb_cost_least = i4_mb_distortion_least;
|
||||
|
||||
if (( (u4_valid_intra_modes >> 3) & 1) != 0 && (ps_codec->s_cfg.u4_enc_speed_preset != IVE_FASTEST ||
|
||||
if ((( (u4_valid_intra_modes >> 3) & 1) != 0) && (ps_codec->s_cfg.u4_enc_speed_preset != IVE_FASTEST ||
|
||||
ps_proc->i4_slice_type == ISLICE))
|
||||
{
|
||||
/* intra prediction for PLANE mode*/
|
||||
|
|
@ -562,14 +559,37 @@ void ih264e_evaluate_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_p
|
|||
|
||||
/* temp vars */
|
||||
UWORD32 b8, u4_pix_x, u4_pix_y;
|
||||
UWORD32 u4_constrained_intra_pred = ps_proc->ps_codec->s_cfg.u4_constrained_intra_pred;
|
||||
block_neighbors_t s_ngbr_avbl_MB;
|
||||
|
||||
/* ngbr mb syntax information */
|
||||
UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (ps_proc->i4_mb_x << 4);
|
||||
mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
|
||||
mb_info_t *ps_top_right_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
/* valid intra modes map */
|
||||
UWORD32 u4_valid_intra_modes;
|
||||
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_c)
|
||||
{
|
||||
ps_top_right_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + (ps_proc->i4_mb_x + 1);
|
||||
}
|
||||
/* left pels */
|
||||
s_ngbr_avbl_MB.u1_mb_a = ((ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
|
||||
/* top pels */
|
||||
s_ngbr_avbl_MB.u1_mb_b = ((ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
&& (u4_constrained_intra_pred ? ps_top_mb_syn_ele->u2_is_intra : 1));
|
||||
|
||||
/* topleft pels */
|
||||
s_ngbr_avbl_MB.u1_mb_d = ((ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_top_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
|
||||
/* top right */
|
||||
s_ngbr_avbl_MB.u1_mb_c = ((ps_proc->ps_ngbr_avbl->u1_mb_c)
|
||||
&& (u4_constrained_intra_pred ? ps_top_right_mb_syn_ele->u2_is_intra : 1));
|
||||
|
||||
|
||||
for(b8 = 0; b8 < 4; b8++)
|
||||
{
|
||||
u4_pix_x = (b8 & 0x01) << 3;
|
||||
|
|
@ -586,10 +606,10 @@ void ih264e_evaluate_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_p
|
|||
/* TODO : update the neighbor availability information basing on constrained intra pred information */
|
||||
/* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines */
|
||||
/* basing on neighbors available and hence evade the computation of neighbor availability totally. */
|
||||
s_ngbr_avbl.u1_mb_a = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x - 1, u4_pix_y); /* xD = -1, yD = 0 */
|
||||
s_ngbr_avbl.u1_mb_b = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x, u4_pix_y - 1); /* xD = 0, yD = -1 */
|
||||
s_ngbr_avbl.u1_mb_c = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x + 8, u4_pix_y - 1); /* xD = BLK_8x8_SIZE, yD = -1 */
|
||||
s_ngbr_avbl.u1_mb_d = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x - 1, u4_pix_y - 1); /* xD = -1, yD = -1 */
|
||||
s_ngbr_avbl.u1_mb_a = ih264e_derive_ngbr_avbl_of_mb_partitions(&s_ngbr_avbl_MB, u4_pix_x - 1, u4_pix_y); /* xD = -1, yD = 0 */
|
||||
s_ngbr_avbl.u1_mb_b = ih264e_derive_ngbr_avbl_of_mb_partitions(&s_ngbr_avbl_MB, u4_pix_x, u4_pix_y - 1); /* xD = 0, yD = -1 */
|
||||
s_ngbr_avbl.u1_mb_c = ih264e_derive_ngbr_avbl_of_mb_partitions(&s_ngbr_avbl_MB, u4_pix_x + 8, u4_pix_y - 1); /* xD = BLK_8x8_SIZE, yD = -1 */
|
||||
s_ngbr_avbl.u1_mb_d = ih264e_derive_ngbr_avbl_of_mb_partitions(&s_ngbr_avbl_MB, u4_pix_x - 1, u4_pix_y - 1); /* xD = -1, yD = -1 */
|
||||
|
||||
/* i4_ngbr_avbl = blk_a * LEFT_MB_AVAILABLE_MASK + blk_b * TOP_MB_AVAILABLE_MASK + blk_c * TOP_RIGHT_MB_AVAILABLE_MASK + blk_d * TOP_LEFT_MB_AVAILABLE_MASK */
|
||||
i4_ngbr_avbl = (s_ngbr_avbl.u1_mb_a) + (s_ngbr_avbl.u1_mb_d << 1) + (s_ngbr_avbl.u1_mb_b << 2) + (s_ngbr_avbl.u1_mb_c << 3) +
|
||||
|
|
@ -799,12 +819,35 @@ void ih264e_evaluate_intra4x4_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_p
|
|||
/* ngbr sub mb modes */
|
||||
UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (ps_proc->i4_mb_x << 4);
|
||||
mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
mb_info_t *ps_top_right_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
|
||||
/* valid intra modes map */
|
||||
UWORD32 u4_valid_intra_modes;
|
||||
UWORD16 u2_valid_modes[8] = {4, 262, 4, 262, 141, 399, 141, 511};
|
||||
|
||||
i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_c << 3);
|
||||
UWORD32 u4_constrained_intra_pred = ps_proc->ps_codec->s_cfg.u4_constrained_intra_pred;
|
||||
UWORD8 u1_mb_a, u1_mb_b, u1_mb_c, u1_mb_d;
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_c)
|
||||
{
|
||||
ps_top_right_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x + 1;
|
||||
}
|
||||
/* left pels */
|
||||
u1_mb_a = ((ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
|
||||
/* top pels */
|
||||
u1_mb_b = ((ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
&& (u4_constrained_intra_pred ? ps_top_mb_syn_ele->u2_is_intra : 1));
|
||||
|
||||
/* topleft pels */
|
||||
u1_mb_d = ((ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_top_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
|
||||
/* top right */
|
||||
u1_mb_c = ((ps_proc->ps_ngbr_avbl->u1_mb_c)
|
||||
&& (u4_constrained_intra_pred ? ps_top_right_mb_syn_ele->u2_is_intra : 1));
|
||||
|
||||
i4_ngbr_avbl = (u1_mb_a) + (u1_mb_d << 1) + (u1_mb_b << 2) + (u1_mb_c << 3);
|
||||
memcpy(ps_proc->au1_ngbr_avbl_4x4_subblks, gau1_ih264_4x4_ngbr_avbl[i4_ngbr_avbl], 16);
|
||||
|
||||
for (b8 = 0; b8 < 4; b8++)
|
||||
|
|
@ -1057,6 +1100,7 @@ void ih264e_evaluate_intra4x4_modes_for_least_cost_rdopton(process_ctxt_t *ps_pr
|
|||
/* ngbr sub mb modes */
|
||||
UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (ps_proc->i4_mb_x << 4);
|
||||
mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
mb_info_t *ps_top_right_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
|
||||
/* valid intra modes map */
|
||||
UWORD32 u4_valid_intra_modes;
|
||||
|
|
@ -1064,9 +1108,32 @@ void ih264e_evaluate_intra4x4_modes_for_least_cost_rdopton(process_ctxt_t *ps_pr
|
|||
|
||||
/* Dummy variable for 4x4 trans function */
|
||||
WORD16 i2_dc_dummy;
|
||||
UWORD8 u1_mb_a, u1_mb_b, u1_mb_c, u1_mb_d;
|
||||
UWORD32 u4_constrained_intra_pred = ps_proc->ps_codec->s_cfg.u4_constrained_intra_pred;
|
||||
|
||||
/* compute ngbr availability for sub blks */
|
||||
i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_c << 3);
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_c)
|
||||
{
|
||||
ps_top_right_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + (ps_proc->i4_mb_x + 1);
|
||||
}
|
||||
|
||||
/* left pels */
|
||||
u1_mb_a = ((ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
|
||||
/* top pels */
|
||||
u1_mb_b = ((ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
&& (u4_constrained_intra_pred ? ps_top_mb_syn_ele->u2_is_intra : 1));
|
||||
|
||||
/* topleft pels */
|
||||
u1_mb_d = ((ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_top_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
|
||||
/* top right pels */
|
||||
u1_mb_c = ((ps_proc->ps_ngbr_avbl->u1_mb_c)
|
||||
&& (u4_constrained_intra_pred ? ps_top_right_mb_syn_ele->u2_is_intra : 1));
|
||||
|
||||
i4_ngbr_avbl = (u1_mb_a) + (u1_mb_d << 1) + (u1_mb_b << 2) + (u1_mb_c << 3);
|
||||
memcpy(ps_proc->au1_ngbr_avbl_4x4_subblks, gau1_ih264_4x4_ngbr_avbl[i4_ngbr_avbl], 16);
|
||||
|
||||
for(b8 = 0; b8 < 4; b8++)
|
||||
|
|
@ -1328,26 +1395,24 @@ void ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_
|
|||
UWORD8 *pu1_mb_d = pu1_mb_b - 2;
|
||||
|
||||
/* neighbor availability */
|
||||
const UWORD8 u1_valid_intra_modes[8] = {1, 3, 9, 11, 5, 7, 13, 15,};
|
||||
const UWORD8 u1_valid_intra_modes[8] = {1, 3, 1, 3, 5, 7, 5, 15};
|
||||
WORD32 i4_ngbr_avbl;
|
||||
|
||||
/* valid intra modes map */
|
||||
UWORD32 u4_valid_intra_modes;
|
||||
mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
|
||||
|
||||
/* temp var */
|
||||
UWORD8 i;
|
||||
|
||||
UWORD32 u4_constrained_intra_pred = ps_proc->ps_codec->s_cfg.u4_constrained_intra_pred;
|
||||
UWORD8 u1_mb_a, u1_mb_b, u1_mb_d;
|
||||
/* locating neighbors that are available for prediction */
|
||||
/* TODO : update the neighbor availability information basing on constrained intra pred information */
|
||||
/* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines
|
||||
* basing on neighbors available and hence evade the computation of neighbor availability totally. */
|
||||
/* i4_ngbr_avbl = blk_a * LEFT_MB_AVAILABLE_MASK + blk_b * TOP_MB_AVAILABLE_MASK + blk_d * TOP_LEFT_MB_AVAILABLE_MASK */
|
||||
i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1);
|
||||
ps_proc->i4_chroma_neighbor_avail_8x8_mb = i4_ngbr_avbl;
|
||||
|
||||
/* gather prediction pels from the neighbors */
|
||||
/* left pels */
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
u1_mb_a = ((ps_proc->ps_ngbr_avbl->u1_mb_a)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
if (u1_mb_a)
|
||||
{
|
||||
for (i = 0; i < 16; i += 2)
|
||||
{
|
||||
|
|
@ -1361,7 +1426,9 @@ void ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_
|
|||
}
|
||||
|
||||
/* top pels */
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
u1_mb_b = ((ps_proc->ps_ngbr_avbl->u1_mb_b)
|
||||
&& (u4_constrained_intra_pred ? ps_top_mb_syn_ele->u2_is_intra : 1));
|
||||
if (u1_mb_b)
|
||||
{
|
||||
ps_codec->pf_mem_cpy_mul8(&pu1_ngbr_pels_c_i8x8[18], pu1_mb_b, 16);
|
||||
}
|
||||
|
|
@ -1371,11 +1438,15 @@ void ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_
|
|||
}
|
||||
|
||||
/* top left pels */
|
||||
if (ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
u1_mb_d = ((ps_proc->ps_ngbr_avbl->u1_mb_d)
|
||||
&& (u4_constrained_intra_pred ? ps_proc->s_top_left_mb_syntax_ele.u2_is_intra : 1));
|
||||
if (u1_mb_d)
|
||||
{
|
||||
pu1_ngbr_pels_c_i8x8[16] = *pu1_mb_d;
|
||||
pu1_ngbr_pels_c_i8x8[17] = *(pu1_mb_d + 1);
|
||||
}
|
||||
i4_ngbr_avbl = (u1_mb_a) + (u1_mb_b << 2) + (u1_mb_d << 1);
|
||||
ps_proc->i4_chroma_neighbor_avail_8x8_mb = i4_ngbr_avbl;
|
||||
|
||||
u4_valid_intra_modes = u1_valid_intra_modes[i4_ngbr_avbl];
|
||||
|
||||
|
|
|
|||
|
|
@ -1251,6 +1251,9 @@ typedef struct
|
|||
* from which this command takes effect */
|
||||
UWORD32 u4_timestamp_high;
|
||||
|
||||
/** Constrained intra pred flag */
|
||||
UWORD32 u4_constrained_intra_pred;
|
||||
|
||||
}ive_ctl_set_ipe_params_ip_t;
|
||||
|
||||
/** Output structure : Set IPE Params */
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@
|
|||
#define DEFAULT_SRCH_RNG_Y 48
|
||||
#define DEFAULT_I_INTERVAL 30
|
||||
#define DEFAULT_IDR_INTERVAL 1000
|
||||
#define DEFAULT_CONSTRAINED_INTRAPRED 0
|
||||
#define DEFAULT_B_FRAMES 0
|
||||
#define DEFAULT_DISABLE_DEBLK_LEVEL 0
|
||||
#define DEFAULT_HPEL 1
|
||||
|
|
@ -285,6 +286,7 @@ typedef struct
|
|||
UWORD32 u4_srch_rng_y;
|
||||
UWORD32 u4_i_interval;
|
||||
UWORD32 u4_idr_interval;
|
||||
UWORD32 u4_constrained_intra_pred;
|
||||
UWORD32 u4_b_frames;
|
||||
UWORD32 u4_num_bframes;
|
||||
UWORD32 u4_disable_deblk_level;
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ typedef enum
|
|||
SRCH_RNG_Y,
|
||||
I_INTERVAL,
|
||||
IDR_INTERVAL,
|
||||
CONSTRAINED_INTRA_PRED,
|
||||
B_FRMS,
|
||||
NUM_B_FRMS,
|
||||
DISABLE_DBLK,
|
||||
|
|
@ -156,6 +157,7 @@ static const argument_t argument_mapping[] =
|
|||
{ "--", "--src_framerate", SRC_FRAMERATE, "Source frame rate \n" },
|
||||
{ "--", "--i_interval", I_INTERVAL, "Intra frame interval \n" },
|
||||
{ "--", "--idr_interval", IDR_INTERVAL, "IDR frame interval \n" },
|
||||
{ "--", "--constrained_intrapred", CONSTRAINED_INTRA_PRED, "Constrained IntraPrediction Flag \n" },
|
||||
{ "--", "--bframes", NUM_B_FRMS, "Maximum number of consecutive B frames \n" },
|
||||
{ "--", "--speed", ENC_SPEED, "Encoder speed preset 0 (slowest) and 100 (fastest)\n" },
|
||||
{ "--", "--me_speed", ME_SPEED, "Encoder speed preset 0 (slowest) and 100 (fastest)\n" },
|
||||
|
|
@ -750,6 +752,10 @@ void parse_argument(app_ctxt_t *ps_app_ctxt, CHAR *argument, CHAR *value)
|
|||
sscanf(value, "%d", &ps_app_ctxt->u4_idr_interval);
|
||||
break;
|
||||
|
||||
case CONSTRAINED_INTRA_PRED:
|
||||
sscanf(value, "%d", &ps_app_ctxt->u4_constrained_intra_pred);
|
||||
break;
|
||||
|
||||
case NUM_B_FRMS:
|
||||
sscanf(value, "%d", &ps_app_ctxt->u4_num_bframes);
|
||||
break;
|
||||
|
|
@ -976,6 +982,7 @@ void init_default_params(app_ctxt_t *ps_app_ctxt)
|
|||
ps_app_ctxt->u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
|
||||
ps_app_ctxt->u4_i_interval = DEFAULT_I_INTERVAL;
|
||||
ps_app_ctxt->u4_idr_interval = DEFAULT_IDR_INTERVAL;
|
||||
ps_app_ctxt->u4_constrained_intra_pred = DEFAULT_CONSTRAINED_INTRAPRED;
|
||||
ps_app_ctxt->u4_disable_deblk_level = DEFAULT_DISABLE_DEBLK_LEVEL;
|
||||
ps_app_ctxt->u4_hpel = DEFAULT_HPEL;
|
||||
ps_app_ctxt->u4_qpel = DEFAULT_QPEL;
|
||||
|
|
@ -1088,6 +1095,9 @@ void set_ipe_params(app_ctxt_t *ps_app_ctxt,
|
|||
s_ipe_params_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_ipe_params_ip_t);
|
||||
s_ipe_params_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_ipe_params_op_t);
|
||||
|
||||
s_ipe_params_ip.s_ive_ip.u4_constrained_intra_pred =
|
||||
ps_app_ctxt->u4_constrained_intra_pred;
|
||||
|
||||
status = ih264e_api_function(ps_app_ctxt->ps_enc,&s_ipe_params_ip,&s_ipe_params_op);
|
||||
if(status != IV_SUCCESS)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue