aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorSrujan Vandrangi <srujan.vandrangi@ittiam.com>2024-04-24 22:27:04 +0530
committerSrujan Vandrangi <srujan.vandrangi@ittiam.com>2024-04-24 17:01:56 +0000
commit6e8f8ec91d5b38031bb3aaab304f1364ef2c677b (patch)
tree6f625d7c45940f579530132d178bec86495c5cfb /common
parent21f3eddcb038076220c6da4e4cdd7ecec88a4f1c (diff)
parent828cdb77ba434eb11ce19f7f0d4482e744b27064 (diff)
downloadlibavc-master.tar.gz
Upgrade libavc to v1.4.0HEADmastermain
This project was upgraded with external_updater. Usage: tools/external_updater/updater.sh update external/libavc For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md Bug: 325356593 Test: atest CtsMediaV2TestCases Change-Id: If5cfbadef49d467bb00914988690cab24e80070e
Diffstat (limited to 'common')
-rw-r--r--common/arm/svc/isvc_iquant_itrans_recon_neon.c452
-rw-r--r--common/svc/isvc_mem_fns.c158
-rw-r--r--common/svc/isvc_mem_fns.h8
-rw-r--r--common/svc/isvc_trans_quant_itrans_iquant.h8
-rw-r--r--common/x86/svc/isvc_iquant_itrans_recon_sse42.c681
5 files changed, 0 insertions, 1307 deletions
diff --git a/common/arm/svc/isvc_iquant_itrans_recon_neon.c b/common/arm/svc/isvc_iquant_itrans_recon_neon.c
index 270adde..8a97fbc 100644
--- a/common/arm/svc/isvc_iquant_itrans_recon_neon.c
+++ b/common/arm/svc/isvc_iquant_itrans_recon_neon.c
@@ -587,193 +587,6 @@ void isvc_iquant_itrans_recon_4x4_with_res_accumulate_neon(
vreinterpret_u32_u8(pred23_un), 1);
}
-void isvc_iquant_itrans_recon_chroma_4x4_neon(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_src = (WORD16 *) ps_src->pv_data;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
-
- WORD16 i2_rnd_factor = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
-
- int16x4x4_t src_16x4x2;
- int16x4x4_t iscal_16x4x2;
- int16x4x4_t weigh_16x4x2;
-
- int16x4_t q0_16x4, q1_16x4, q2_16x4, q3_16x4;
- int32x4_t q0_32x4, q1_32x4, q2_32x4, q3_32x4;
- int16x4_t rq1_16x4, rq3_16x4;
- int16x4_t x0_16x4, x1_16x4, x2_16x4, x3_16x4;
- int16x8_t x0_16x8, x1_16x8, x2_16x8, x3_16x8;
- int16x4_t xx0_16x4, xx1_16x4, xx2_16x4, xx3_16x4;
- int16x4x2_t xx0_16x4x2, xx1_16x4x2;
- int32x2x2_t x0_32x2x2, x1_32x2x2;
- int16x4_t weigh0_16x4, weigh1_16x4, weigh2_16x4, weigh3_16x4;
-
- uint8x8_t pred0_in, pred1_in, pred2_in, pred3_in;
- int16x8_t pred0, pred1, pred2, pred3;
- int16x8_t rec0, rec1, rec2, rec3;
- uint8x8_t rec0_un, rec1_un, rec2_un, rec3_un;
- uint8x8_t out0, out1, out2, out3;
-
- uint8x8_t chroma_mask_8x8 = vreinterpret_u8_u16(vdup_n_u16(0x00ff));
-
- int16x4_t pos_255_16x4 = vdup_n_s16(((WORD16) UINT8_MAX));
- int16x4_t neg_255_16x4 = vdup_n_s16(-((WORD16) UINT8_MAX));
- int32x4_t qp_div_6_32x4 = vdupq_n_s32(u4_qp_div_6);
- int32x4_t rnd_fact = vdupq_n_s32(i2_rnd_factor);
-
- UNUSED(i4_iq_start_idx);
- UNUSED(ps_res);
- UNUSED(ps_res_pred);
- UNUSED(u1_res_accumulate);
-
- src_16x4x2 = vld4_s16(pi2_src);
- iscal_16x4x2 = vld4_s16((const int16_t *) pu2_iscal_mat);
- weigh_16x4x2 = vld4_s16((const int16_t *) pu2_weigh_mat);
-
- weigh0_16x4 = vmul_s16(weigh_16x4x2.val[0], iscal_16x4x2.val[0]);
- weigh1_16x4 = vmul_s16(weigh_16x4x2.val[1], iscal_16x4x2.val[1]);
- weigh2_16x4 = vmul_s16(weigh_16x4x2.val[2], iscal_16x4x2.val[2]);
- weigh3_16x4 = vmul_s16(weigh_16x4x2.val[3], iscal_16x4x2.val[3]);
-
- q0_32x4 = vmull_s16(weigh0_16x4, src_16x4x2.val[0]);
- q1_32x4 = vmull_s16(weigh1_16x4, src_16x4x2.val[1]);
- q2_32x4 = vmull_s16(weigh2_16x4, src_16x4x2.val[2]);
- q3_32x4 = vmull_s16(weigh3_16x4, src_16x4x2.val[3]);
-
- q0_32x4 = vaddq_s32(q0_32x4, rnd_fact);
- q1_32x4 = vaddq_s32(q1_32x4, rnd_fact);
- q2_32x4 = vaddq_s32(q2_32x4, rnd_fact);
- q3_32x4 = vaddq_s32(q3_32x4, rnd_fact);
-
- q0_32x4 = vshlq_s32(q0_32x4, qp_div_6_32x4);
- q1_32x4 = vshlq_s32(q1_32x4, qp_div_6_32x4);
- q2_32x4 = vshlq_s32(q2_32x4, qp_div_6_32x4);
- q3_32x4 = vshlq_s32(q3_32x4, qp_div_6_32x4);
-
- q0_16x4 = vqshrn_n_s32(q0_32x4, 4);
- q1_16x4 = vqshrn_n_s32(q1_32x4, 4);
- q2_16x4 = vqshrn_n_s32(q2_32x4, 4);
- q3_16x4 = vqshrn_n_s32(q3_32x4, 4);
-
- q0_16x4 = vset_lane_s16(pi2_dc_src[0], q0_16x4, 0);
-
- rq1_16x4 = vshr_n_s16(q1_16x4, 1);
- rq3_16x4 = vshr_n_s16(q3_16x4, 1);
-
- x0_16x4 = vadd_s16(q0_16x4, q2_16x4);
- x1_16x4 = vsub_s16(q0_16x4, q2_16x4);
- x2_16x4 = vsub_s16(rq1_16x4, q3_16x4);
- x3_16x4 = vadd_s16(q1_16x4, rq3_16x4);
-
- xx0_16x4 = vadd_s16(x0_16x4, x3_16x4);
- xx1_16x4 = vadd_s16(x1_16x4, x2_16x4);
- xx2_16x4 = vsub_s16(x1_16x4, x2_16x4);
- xx3_16x4 = vsub_s16(x0_16x4, x3_16x4);
-
- /* row 0 to row 3 */
- xx0_16x4x2 = vtrn_s16(xx0_16x4, xx1_16x4);
- xx1_16x4x2 = vtrn_s16(xx2_16x4, xx3_16x4);
- x0_32x2x2 =
- vzip_s32(vreinterpret_s32_s16(xx0_16x4x2.val[0]), vreinterpret_s32_s16(xx1_16x4x2.val[0]));
- x1_32x2x2 =
- vzip_s32(vreinterpret_s32_s16(xx0_16x4x2.val[1]), vreinterpret_s32_s16(xx1_16x4x2.val[1]));
-
- x0_16x4 = vreinterpret_s16_s32(x0_32x2x2.val[0]);
- x1_16x4 = vreinterpret_s16_s32(x1_32x2x2.val[0]);
- x2_16x4 = vreinterpret_s16_s32(x0_32x2x2.val[1]);
- x3_16x4 = vreinterpret_s16_s32(x1_32x2x2.val[1]);
-
- /* Store Horz transform output into temp */
- vst1_s16(pi2_tmp, x0_16x4);
- vst1_s16(pi2_tmp + 4, x1_16x4);
- vst1_s16(pi2_tmp + 8, x2_16x4);
- vst1_s16(pi2_tmp + 12, x3_16x4);
-
- /* vertical inverse transform */
- rq1_16x4 = vshr_n_s16(x1_16x4, 1);
- rq3_16x4 = vshr_n_s16(x3_16x4, 1);
-
- xx0_16x4 = vadd_s16(x0_16x4, x2_16x4);
- xx1_16x4 = vsub_s16(x0_16x4, x2_16x4);
- xx2_16x4 = vsub_s16(rq1_16x4, x3_16x4);
- xx3_16x4 = vadd_s16(x1_16x4, rq3_16x4);
-
- x0_16x4 = vadd_s16(xx0_16x4, xx3_16x4);
- x1_16x4 = vadd_s16(xx1_16x4, xx2_16x4);
- x2_16x4 = vsub_s16(xx1_16x4, xx2_16x4);
- x3_16x4 = vsub_s16(xx0_16x4, xx3_16x4);
-
- x0_16x4 = vrshr_n_s16(x0_16x4, 6);
- x1_16x4 = vrshr_n_s16(x1_16x4, 6);
- x2_16x4 = vrshr_n_s16(x2_16x4, 6);
- x3_16x4 = vrshr_n_s16(x3_16x4, 6);
-
- /* Saturate all values < -255 to -255 and retain the rest as it is */
- x0_16x4 = vmax_s16(x0_16x4, neg_255_16x4);
- x1_16x4 = vmax_s16(x1_16x4, neg_255_16x4);
- x2_16x4 = vmax_s16(x2_16x4, neg_255_16x4);
- x3_16x4 = vmax_s16(x3_16x4, neg_255_16x4);
-
- /* Saturate all values > 255 to 255 and retain the rest as it is */
- x0_16x4 = vmin_s16(x0_16x4, pos_255_16x4);
- x1_16x4 = vmin_s16(x1_16x4, pos_255_16x4);
- x2_16x4 = vmin_s16(x2_16x4, pos_255_16x4);
- x3_16x4 = vmin_s16(x3_16x4, pos_255_16x4);
-
- x0_16x8 = vreinterpretq_s16_s32(vmovl_s16(x0_16x4));
- x1_16x8 = vreinterpretq_s16_s32(vmovl_s16(x1_16x4));
- x2_16x8 = vreinterpretq_s16_s32(vmovl_s16(x2_16x4));
- x3_16x8 = vreinterpretq_s16_s32(vmovl_s16(x3_16x4));
-
- pred0_in = vld1_u8((uint8_t *) pu1_pred);
- pred1_in = vld1_u8((uint8_t *) pu1_pred + (i4_pred_stride));
- pred2_in = vld1_u8((uint8_t *) pu1_pred + (i4_pred_stride << 1));
- pred3_in = vld1_u8((uint8_t *) pu1_pred + (i4_pred_stride * 3));
-
- pred0 = vreinterpretq_s16_u16(vmovl_u8(pred0_in));
- pred1 = vreinterpretq_s16_u16(vmovl_u8(pred1_in));
- pred2 = vreinterpretq_s16_u16(vmovl_u8(pred2_in));
- pred3 = vreinterpretq_s16_u16(vmovl_u8(pred3_in));
-
- /* Out pixel = pred + res */
- rec0 = vaddq_s16(pred0, x0_16x8);
- rec1 = vaddq_s16(pred1, x1_16x8);
- rec2 = vaddq_s16(pred2, x2_16x8);
- rec3 = vaddq_s16(pred3, x3_16x8);
-
- out0 = vld1_u8(pu1_out);
- out1 = vld1_u8(pu1_out + i4_out_stride);
- out2 = vld1_u8(pu1_out + i4_out_stride * 2);
- out3 = vld1_u8(pu1_out + i4_out_stride * 3);
-
- /* Convert to 8 bit unsigned with saturation */
- rec0_un = vqmovun_s16(rec0);
- rec1_un = vqmovun_s16(rec1);
- rec2_un = vqmovun_s16(rec2);
- rec3_un = vqmovun_s16(rec3);
-
- /* Store in alternate postions */
- out0 = vbsl_u8(chroma_mask_8x8, rec0_un, out0);
- out1 = vbsl_u8(chroma_mask_8x8, rec1_un, out1);
- out2 = vbsl_u8(chroma_mask_8x8, rec2_un, out2);
- out3 = vbsl_u8(chroma_mask_8x8, rec3_un, out3);
-
- vst1_u8((pu1_out), out0);
- vst1_u8((pu1_out + i4_out_stride), out1);
- vst1_u8((pu1_out + (i4_out_stride << 1)), out2);
- vst1_u8((pu1_out + ((i4_out_stride << 1) + i4_out_stride)), out3);
-}
-
void isvc_iquant_itrans_recon_chroma_4x4_with_res_output_neon(
buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
buffer_container_t *ps_res, buffer_container_t *ps_rec,
@@ -1280,271 +1093,6 @@ void isvc_iquant_itrans_recon_4x4_dc_neon(buffer_container_t *ps_src, buffer_con
vst1_lane_u32((uint32_t *) (pu1_out + i4_out_stride * 3), vreinterpret_u32_u8(pred3_in), 0);
}
-void isvc_iquant_itrans_recon_4x4_dc_with_res_output_neon(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_src = (WORD16 *) ps_src->pv_data;
- WORD16 *pi2_res = (WORD16 *) ps_res->pv_data;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_res_stride = ps_res->i4_data_stride;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
- WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
-
- WORD16 i2_it_out;
- WORD32 i4_iq_out_temp;
- int16x8_t temp_0;
- int16x4_t residue_res;
- uint8x8_t pred0_in, pred1_in, pred2_in, pred3_in;
- int16x8_t pred0, pred1, pred2, pred3;
-
- UNUSED(pi2_tmp);
- UNUSED(ps_res_pred);
- UNUSED(u1_res_accumulate);
-
- if(i4_iq_start_idx == 0)
- {
- i4_iq_out_temp = pi2_src[0];
- INV_QUANT(i4_iq_out_temp, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
- }
- else
- {
- i4_iq_out_temp = pi2_dc_src[0];
- }
-
- i2_it_out = ((i4_iq_out_temp + 32) >> 6);
- temp_0 = vdupq_n_s16(i2_it_out);
- residue_res = vdup_n_s16(isvc_get_residue(i2_it_out, 0, 0));
-
- vst1_s16(pi2_res, residue_res);
- vst1_s16(pi2_res + i4_res_stride, residue_res);
- vst1_s16(pi2_res + (i4_res_stride << 1), residue_res);
- vst1_s16(pi2_res + (i4_res_stride << 1) + i4_res_stride, residue_res);
-
- pred0_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred1_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred2_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred3_in = vld1_u8(pu1_pred);
-
- pred0 = vreinterpretq_s16_u16(vmovl_u8(pred0_in));
- pred1 = vreinterpretq_s16_u16(vmovl_u8(pred1_in));
- pred2 = vreinterpretq_s16_u16(vmovl_u8(pred2_in));
- pred3 = vreinterpretq_s16_u16(vmovl_u8(pred3_in));
-
- /* Out pixel = Res + pred */
- pred0 = vaddq_s16(pred0, temp_0);
- pred1 = vaddq_s16(pred1, temp_0);
- pred2 = vaddq_s16(pred2, temp_0);
- pred3 = vaddq_s16(pred3, temp_0);
-
- /* Convert to unsigned 8 bit with saturation */
- pred0_in = vqmovun_s16(pred0);
- pred1_in = vqmovun_s16(pred1);
- pred2_in = vqmovun_s16(pred2);
- pred3_in = vqmovun_s16(pred3);
-
- vst1_lane_u32((uint32_t *) (pu1_out), vreinterpret_u32_u8(pred0_in), 0);
- vst1_lane_u32((uint32_t *) (pu1_out + i4_out_stride), vreinterpret_u32_u8(pred1_in), 0);
- vst1_lane_u32((uint32_t *) (pu1_out + i4_out_stride * 2), vreinterpret_u32_u8(pred2_in), 0);
- vst1_lane_u32((uint32_t *) (pu1_out + i4_out_stride * 3), vreinterpret_u32_u8(pred3_in), 0);
-}
-
-void isvc_iquant_itrans_recon_4x4_dc_with_res_accumulate_neon(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_src = (WORD16 *) ps_src->pv_data;
- WORD16 *pi2_res = (WORD16 *) ps_res->pv_data;
- WORD16 *pi2_res_pred = (WORD16 *) ps_res_pred->pv_data;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_res_stride = ps_res->i4_data_stride;
- WORD32 i4_res_pred_stride = ps_res_pred->i4_data_stride;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
- WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
-
- WORD32 i4_iq_out_temp;
- int16x4_t temp_0;
- uint8x8_t pred0_in, pred1_in, pred2_in, pred3_in;
- int16x8_t pred0, pred1, pred2, pred3;
- int16x8_t pred01_in, pred23_in;
- uint8x8_t pred01_un, pred23_un;
-
- int16x4_t resd0_in, resd1_in, resd2_in, resd3_in;
- int16x8_t resd01_in, resd23_in;
- int16x4_t pos_255 = vdup_n_s16(((WORD16) UINT8_MAX));
- int16x4_t neg_255 = vdup_n_s16(-((WORD16) UINT8_MAX));
-
- UNUSED(pi2_tmp);
- UNUSED(u1_res_accumulate);
-
- if(i4_iq_start_idx == 0)
- {
- i4_iq_out_temp = pi2_src[0];
- INV_QUANT(i4_iq_out_temp, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
- }
- else
- {
- i4_iq_out_temp = pi2_dc_src[0];
- }
-
- temp_0 = vdup_n_s16((i4_iq_out_temp + 32) >> 6);
-
- resd0_in = vld1_s16((int16_t *) pi2_res_pred);
- resd1_in = vld1_s16((int16_t *) pi2_res_pred + i4_res_pred_stride);
- resd2_in = vld1_s16((int16_t *) pi2_res_pred + (i4_res_pred_stride * 2));
- resd3_in = vld1_s16((int16_t *) pi2_res_pred + (i4_res_pred_stride * 3));
-
- /* Add res pred to the res obtained */
- resd0_in = vadd_s16(resd0_in, temp_0);
- resd1_in = vadd_s16(resd1_in, temp_0);
- resd2_in = vadd_s16(resd2_in, temp_0);
- resd3_in = vadd_s16(resd3_in, temp_0);
-
- /* Saturate all values < -255 to -255 and retain the rest as it is */
- resd0_in = vmax_s16(resd0_in, neg_255);
- resd1_in = vmax_s16(resd1_in, neg_255);
- resd2_in = vmax_s16(resd2_in, neg_255);
- resd3_in = vmax_s16(resd3_in, neg_255);
-
- /* Saturate all values > 255 to 255 and retain the rest as it is */
- resd0_in = vmin_s16(resd0_in, pos_255);
- resd1_in = vmin_s16(resd1_in, pos_255);
- resd2_in = vmin_s16(resd2_in, pos_255);
- resd3_in = vmin_s16(resd3_in, pos_255);
-
- vst1_s16(pi2_res, resd0_in);
- vst1_s16(pi2_res + i4_res_stride, resd1_in);
- vst1_s16(pi2_res + (i4_res_stride << 1), resd2_in);
- vst1_s16(pi2_res + (i4_res_stride << 1) + i4_res_stride, resd3_in);
-
- resd01_in = vcombine_s16(resd0_in, resd1_in);
- resd23_in = vcombine_s16(resd2_in, resd3_in);
-
- pred0_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred1_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred2_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred3_in = vld1_u8(pu1_pred);
-
- pred0 = vreinterpretq_s16_u16(vmovl_u8(pred0_in));
- pred1 = vreinterpretq_s16_u16(vmovl_u8(pred1_in));
- pred2 = vreinterpretq_s16_u16(vmovl_u8(pred2_in));
- pred3 = vreinterpretq_s16_u16(vmovl_u8(pred3_in));
-
- pred01_in = vcombine_s16(vget_low_s16(pred0), vget_low_s16(pred1));
- pred23_in = vcombine_s16(vget_low_s16(pred2), vget_low_s16(pred3));
-
- /* Out pixel = Res + pred */
- pred01_in = vaddq_s16(pred01_in, resd01_in);
- pred23_in = vaddq_s16(pred23_in, resd23_in);
-
- /* Convert to unsigned 8 bit with saturation */
- pred01_un = vqmovun_s16(pred01_in);
- pred23_un = vqmovun_s16(pred23_in);
-
- vst1_lane_u32((uint32_t *) (pu1_out), vreinterpret_u32_u8(pred01_un), 0);
- vst1_lane_u32((uint32_t *) (pu1_out + i4_out_stride), vreinterpret_u32_u8(pred01_un), 1);
- vst1_lane_u32((uint32_t *) (pu1_out + (i4_out_stride << 1)), vreinterpret_u32_u8(pred23_un), 0);
- vst1_lane_u32((uint32_t *) (pu1_out + ((i4_out_stride << 1) + i4_out_stride)),
- vreinterpret_u32_u8(pred23_un), 1);
-}
-
-void isvc_iquant_itrans_recon_chroma_4x4_dc_neon(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_src = (WORD16 *) ps_src->pv_data;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
-
- WORD32 i4_iq_out_temp;
- int16x8_t temp_0;
- uint8x8_t pred0_in, pred1_in, pred2_in, pred3_in;
- int16x8_t pred0, pred1, pred2, pred3;
- uint8x8_t i4_out_horz_8x8_r0, i4_out_horz_8x8_r1, i4_out_horz_8x8_r2, i4_out_horz_8x8_r3;
- uint8x8_t chroma_mask_8x8 = vreinterpret_u8_u16(vdup_n_u16(0x00ff));
-
- UNUSED(pi2_src);
- UNUSED(pu2_iscal_mat);
- UNUSED(pu2_weigh_mat);
- UNUSED(u4_qp_div_6);
- UNUSED(pi2_tmp);
- UNUSED(i4_iq_start_idx);
- UNUSED(ps_res);
- UNUSED(ps_res_pred);
- UNUSED(u1_res_accumulate);
-
- i4_iq_out_temp = pi2_dc_src[0];
- temp_0 = vdupq_n_s16((i4_iq_out_temp + 32) >> 6);
-
- pred0_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred1_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred2_in = vld1_u8(pu1_pred);
- pu1_pred = pu1_pred + i4_pred_stride;
- pred3_in = vld1_u8(pu1_pred);
-
- pred0 = vreinterpretq_s16_u16(vmovl_u8(pred0_in));
- pred1 = vreinterpretq_s16_u16(vmovl_u8(pred1_in));
- pred2 = vreinterpretq_s16_u16(vmovl_u8(pred2_in));
- pred3 = vreinterpretq_s16_u16(vmovl_u8(pred3_in));
-
- /* Out pixel = Res + pred */
- pred0 = vaddq_s16(pred0, temp_0);
- pred1 = vaddq_s16(pred1, temp_0);
- pred2 = vaddq_s16(pred2, temp_0);
- pred3 = vaddq_s16(pred3, temp_0);
-
- /* Convert to unsigned 8 bit with saturation */
- pred0_in = vqmovun_s16(pred0);
- pred1_in = vqmovun_s16(pred1);
- pred2_in = vqmovun_s16(pred2);
- pred3_in = vqmovun_s16(pred3);
-
- i4_out_horz_8x8_r0 = vld1_u8(pu1_out);
- i4_out_horz_8x8_r1 = vld1_u8(pu1_out + i4_out_stride);
- i4_out_horz_8x8_r2 = vld1_u8(pu1_out + i4_out_stride * 2);
- i4_out_horz_8x8_r3 = vld1_u8(pu1_out + i4_out_stride * 3);
-
- /* Store out pixels in alternate positions */
- i4_out_horz_8x8_r0 = vbsl_u8(chroma_mask_8x8, pred0_in, i4_out_horz_8x8_r0);
- i4_out_horz_8x8_r1 = vbsl_u8(chroma_mask_8x8, pred1_in, i4_out_horz_8x8_r1);
- i4_out_horz_8x8_r2 = vbsl_u8(chroma_mask_8x8, pred2_in, i4_out_horz_8x8_r2);
- i4_out_horz_8x8_r3 = vbsl_u8(chroma_mask_8x8, pred3_in, i4_out_horz_8x8_r3);
-
- vst1_u8((uint8_t *) (pu1_out), i4_out_horz_8x8_r0);
- vst1_u8((uint8_t *) (pu1_out + i4_out_stride), i4_out_horz_8x8_r1);
- vst1_u8((uint8_t *) (pu1_out + i4_out_stride * 2), i4_out_horz_8x8_r2);
- vst1_u8((uint8_t *) (pu1_out + i4_out_stride * 3), i4_out_horz_8x8_r3);
-}
-
void isvc_iquant_itrans_recon_chroma_4x4_dc_with_res_output_neon(
buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
buffer_container_t *ps_res, buffer_container_t *ps_rec,
diff --git a/common/svc/isvc_mem_fns.c b/common/svc/isvc_mem_fns.c
index 345715a..35a4c66 100644
--- a/common/svc/isvc_mem_fns.c
+++ b/common/svc/isvc_mem_fns.c
@@ -124,164 +124,6 @@ void isvc_memset_2d(UWORD8 *pu1_dst, WORD32 i4_dst_stride, UWORD8 u1_val, WORD32
*******************************************************************************
*
* @brief
- * Function for copying to an interleaved destination
- *
- * @par Description:
- * Copies the array of width 'wd' and height 'ht' from the location pointed
- * by 'src' to the location pointed by 'dst'
- *
- * @param[in] pu1_src
- * UWORD8 pointer to the source
- *
- * @param[out] pu1_dst
- * UWORD8 pointer to the destination
- *
- * @param[in] src_strd
- * integer source stride
- *
- * @param[in] dst_strd
- * integer destination stride
- *
- * @param[in] ht
- * integer height of the array
- *
- * @param[in] wd
- * integer width of the array
- *
- * @returns
- *
- * @remarks
- * The alternate elements of src will be copied to alternate locations in dsr
- * Other locations are not touched
- *
- *******************************************************************************
- */
-void isvc_interleaved_copy(UWORD8 *pu1_src, UWORD8 *pu1_dst, WORD32 src_strd, WORD32 dst_strd,
- WORD32 ht, WORD32 wd)
-{
- WORD32 row, col;
- wd *= 2;
-
- for(row = 0; row < ht; row++)
- {
- for(col = 0; col < wd; col += 2)
- {
- pu1_dst[col] = pu1_src[col];
- }
-
- pu1_src += src_strd;
- pu1_dst += dst_strd;
- }
-}
-
-/**
- *******************************************************************************
- *
- * @brief
- * Function for copying to an interleaved destination
- *
- * @par Description:
- * Copies the array of width 'wd' and height 'ht' from the location pointed
- * by 'src' to the location pointed by 'dst'
- *
- * @param[in] pu1_src
- * UWORD8 pointer to the source
- *
- * @param[out] pu1_dst
- * UWORD8 pointer to the destination
- *
- * @param[in] src_strd
- * integer source stride
- *
- * @param[in] dst_strd
- * integer destination stride
- *
- * @param[in] ht
- * integer height of the array
- *
- * @param[in] wd
- * integer width of the array
- *
- * @returns
- *
- * @remarks
- * The alternate elements of src will be copied to alternate locations in dsr
- * Other locations are not touched
- *
- *******************************************************************************
- */
-void isvc_16bit_interleaved_copy(WORD16 *pi2_src, WORD16 *pi2_dst, WORD32 src_strd, WORD32 dst_strd,
- WORD32 ht, WORD32 wd)
-{
- WORD32 row, col;
- wd *= 2;
-
- for(row = 0; row < ht; row++)
- {
- for(col = 0; col < wd; col += 2)
- {
- pi2_dst[col] = pi2_src[col];
- }
-
- pi2_src += src_strd;
- pi2_dst += dst_strd;
- }
-}
-
-/**
- *******************************************************************************
- *
- * @brief
- * Function for memsetting to an interleaved destination
- *
- * @par Description:
- * Memsets the array of width 'wd' and height 'ht' pointed by 'src'
- *
- * @param[in] pu1_src
- * UWORD8 pointer to the source
- *
- * @param[in] src_strd
- * integer source stride
- *
- * @param[in] value
- * Value to set
- *
- * @param[in] ht
- * integer height of the array
- *
- * @param[in] wd
- * integer width of the array
- *
- * @returns
- *
- * @remarks
- * The alternate elements of src will be copied to alternate locations in dsr
- * Other locations are not touched
- *
- *******************************************************************************
- */
-void isvc_16bit_interleaved_memset(WORD16 *pi2_src, WORD32 i4_src_strd, WORD16 i2_value,
- WORD32 i4_wd, WORD32 i4_ht)
-{
- WORD32 row, col;
-
- i4_wd *= 2;
-
- for(row = 0; row < i4_ht; row++)
- {
- for(col = 0; col < i4_wd; col += 2)
- {
- pi2_src[col] = i2_value;
- }
-
- pi2_src += i4_src_strd;
- }
-}
-
-/**
- *******************************************************************************
- *
- * @brief
* Checks if any pixel in a block is non-zero
*
* @param[in] pu1_data
diff --git a/common/svc/isvc_mem_fns.h b/common/svc/isvc_mem_fns.h
index a4d95f7..581e478 100644
--- a/common/svc/isvc_mem_fns.h
+++ b/common/svc/isvc_mem_fns.h
@@ -64,32 +64,24 @@ typedef UWORD8 FT_NONZERO_CHECKER(UWORD8 *pu1_data, WORD32 i4_data_strd, UWORD32
UWORD32 u4_ht);
/* C function declarations */
-extern FT_MEMCPY ih264_memcpy;
extern FT_MEMCPY ih264_memcpy_mul_8;
-extern FT_MEMSET ih264_memset;
extern FT_MEMSET ih264_memset_mul_8;
extern FT_MEMSET_16BIT ih264_memset_16bit;
extern FT_MEMSET_16BIT ih264_memset_16bit_mul_8;
extern FT_COPY_2D isvc_copy_2d;
extern FT_MEMSET_2D isvc_memset_2d;
-extern FT_16BIT_INTERLEAVED_COPY isvc_16bit_interleaved_copy;
-extern FT_16BIT_INTERLEAVED_MEMSET isvc_16bit_interleaved_memset;
extern FT_NONZERO_CHECKER isvc_is_nonzero_blk;
extern FT_MEM_ALLOC isvc_memory_alloc;
extern FT_MEM_FREE isvc_memory_free;
/* A9 Q function declarations */
-extern FT_MEMCPY isvc_memcpy_a9q;
extern FT_MEMCPY ih264_memcpy_mul_8_a9q;
-extern FT_MEMSET ih264_memset_a9q;
extern FT_MEMSET ih264_memset_mul_8_a9q;
extern FT_MEMSET_16BIT ih264_memset_16bit_a9q;
extern FT_MEMSET_16BIT ih264_memset_16bit_mul_8_a9q;
/* AV8 function declarations */
-extern FT_MEMCPY ih264_memcpy_av8;
extern FT_MEMCPY ih264_memcpy_mul_8_av8;
-extern FT_MEMSET ih264_memset_av8;
extern FT_MEMSET ih264_memset_mul_8_av8;
extern FT_MEMSET_16BIT ih264_memset_16bit_av8;
extern FT_MEMSET_16BIT ih264_memset_16bit_mul_8_av8;
diff --git a/common/svc/isvc_trans_quant_itrans_iquant.h b/common/svc/isvc_trans_quant_itrans_iquant.h
index fd15dcc..7ded811 100644
--- a/common/svc/isvc_trans_quant_itrans_iquant.h
+++ b/common/svc/isvc_trans_quant_itrans_iquant.h
@@ -195,15 +195,11 @@ extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_4x4_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_4x4_with_res_acc_sse42;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_chroma_4x4_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_chroma_4x4_with_res_acc_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_dc_4x4_sse42;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_dc_4x4_sse42;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_dc_with_res_acc_4x4_sse42;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_dc_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_chroma_4x4_dc_sse42;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_res_chroma_4x4_dc_with_res_acc_sse42;
@@ -217,15 +213,11 @@ extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_with_res_output_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_with_res_accumulate_neon;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_with_res_output_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_with_res_accumulate_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_dc_neon;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_dc_with_res_output_neon;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_4x4_dc_with_res_accumulate_neon;
-extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_dc_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_dc_with_res_output_neon;
extern FT_IQ_IT_RECON isvc_iquant_itrans_recon_chroma_4x4_dc_with_res_accumulate_neon;
diff --git a/common/x86/svc/isvc_iquant_itrans_recon_sse42.c b/common/x86/svc/isvc_iquant_itrans_recon_sse42.c
index 829952b..f86ebc7 100644
--- a/common/x86/svc/isvc_iquant_itrans_recon_sse42.c
+++ b/common/x86/svc/isvc_iquant_itrans_recon_sse42.c
@@ -1034,356 +1034,6 @@ void isvc_iquant_itrans_recon_res_4x4_with_res_acc_sse42(
*(pu4_out) = _mm_cvtsi128_si32(resq_r3);
}
-/*
- ********************************************************************************
- *
- * @brief This function reconstructs a 4x4 sub block from quantized chroma
- *resiude and prediction buffer
- *
- * @par Description:
- * The quantized residue is first inverse quantized, then inverse transformed.
- * This inverse transformed content is added to the prediction buffer to recon-
- * struct the end output
- *
- * @param[in] pi2_src
- * quantized 4x4 block
- *
- * @param[in] pu1_pred
- * prediction 4x4 block
- *
- * @param[out] pu1_out
- * reconstructed 4x4 block
- *
- * @param[in] src_strd
- * quantization buffer stride
- *
- * @param[in] i4_pred_stride,
- * Prediction buffer stride
- *
- * @param[in] i4_out_stride
- * recon buffer Stride
- *
- * @param[in] pu2_scaling_list
- * pointer to scaling list
- *
- * @param[in] pu2_norm_adjust
- * pointer to inverse scale matrix
- *
- * @param[in] u4_qp_div_6
- * Floor (qp/6)
- *
- * @param[in] pi4_tmp
- * temporary buffer of size 1*16
- *
- * @returns none
- *
- * @remarks none
- *
- *******************************************************************************
- */
-void isvc_iquant_itrans_recon_chroma_4x4_sse42(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_src = (WORD16 *) ps_src->pv_data;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_src_stride = ps_src->i4_data_stride;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
- __m128i src_r0_r1, src_r2_r3;
- __m128i src_r0, src_r1, src_r2, src_r3;
- __m128i scalemat_r0_r1, scalemat_r2_r3;
- __m128i pred_r0, pred_r1, pred_r2, pred_r3;
- __m128i sign_reg, dequant_r0_r1, dequant_r2_r3;
- /* all bits reset to zero */
- __m128i zero_8x16b = _mm_setzero_si128();
- __m128i neg_255_8x16b = _mm_set1_epi16(-((WORD16) UINT8_MAX));
- __m128i pos_255_8x16b = _mm_set1_epi16(((WORD16) UINT8_MAX));
- __m128i temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
- __m128i resq_r0, resq_r1, resq_r2, resq_r3;
- __m128i add_rshift = _mm_set1_epi32((u4_qp_div_6 < 4) ? (1 << (3 - u4_qp_div_6)) : 0);
- __m128i value_32 = _mm_set1_epi32(32);
- __m128i chroma_mask = _mm_set1_epi16(0xFF);
- __m128i out_r0, out_r1, out_r2, out_r3;
-
- ASSERT(4 == i4_src_stride);
- ASSERT(0 == u1_res_accumulate);
-
- UNUSED(i4_src_stride);
- UNUSED(u1_res_accumulate);
- UNUSED(ps_res);
- UNUSED(ps_res_pred);
- UNUSED(i4_iq_start_idx);
-
- /*************************************************************/
- /* Dequantization of coefficients. Will be replaced by SIMD */
- /* operations on platform */
- /*************************************************************/
- /* a00 a01 a02 a03 a10 a11 a12 a13 -- the source
- matrix 0th,1st row */
- src_r0_r1 = _mm_loadu_si128((__m128i *) (pi2_src));
-
- /* a20 a21 a22 a23 a30 a31 a32 a33 -- the
- source matrix 2nd,3rd row */
- src_r2_r3 = _mm_loadu_si128((__m128i *) (pi2_src + 8));
-
- /* b00 b01 b02 b03 b10 b11 b12 b13 -- the
- scaling matrix 0th,1st row */
- scalemat_r0_r1 = _mm_loadu_si128((__m128i *) (pu2_iscal_mat));
-
- /* b20 b21 b22 b23 b30 b31 b32 b33 --b12 b13 -- the
- the scaling matrix 2nd,3rd row */
- scalemat_r2_r3 = _mm_loadu_si128((__m128i *) (pu2_iscal_mat + 8));
-
- /* q00 q01 q02 q03 q10 q11
- q12 q13 -- all 16 bits */
- dequant_r0_r1 = _mm_loadu_si128((__m128i *) (pu2_weigh_mat));
-
- /* q20 q21 q22 q23 q30 q31
- q32 q33 -- all 16 bits */
- dequant_r2_r3 = _mm_loadu_si128((__m128i *) (pu2_weigh_mat + 8));
-
- temp0 = _mm_mullo_epi16(scalemat_r0_r1,
- dequant_r0_r1); // b00*q00 b01*q01 b02*q02 b03*q03 b10*q10 b11*q11
- // b12*q12 b13*q13 -- 16 bit result
-
- temp1 = _mm_mullo_epi16(scalemat_r2_r3, dequant_r2_r3);
-
- /* b00*q00 0 b01*q01 0 b02*q02 0 b03*q03 0 -- 16 bit long */
- temp4 = _mm_unpacklo_epi16(temp0, zero_8x16b);
-
- /* b10*q10 0 b11*q11 0 b12*q12 0 b13*q13 0 -- 16 bit long */
- temp5 = _mm_unpackhi_epi16(temp0, zero_8x16b);
-
- /* b00*q00 0 b01*q01 0 b02*q02 0 b03*q03 0 -- 16 bit long */
- temp6 = _mm_unpacklo_epi16(temp1, zero_8x16b);
-
- /* b10*q10 0 b11*q11 0 b12*q12 0 b13*q13 0 -- 16 bit long */
- temp7 = _mm_unpackhi_epi16(temp1, zero_8x16b);
-
- /* a00 0 a01 0 a02 0 a03 0 -- 16 bit long */
- src_r0 = _mm_unpacklo_epi16(src_r0_r1, zero_8x16b);
- /* a10 0 a11 0 a12 0 a13 0 -- 16 bit long */
- src_r1 = _mm_unpackhi_epi16(src_r0_r1, zero_8x16b);
- /* a20 0 a21 0 a22 0 a23 0 -- 16 bit long */
- src_r2 = _mm_unpacklo_epi16(src_r2_r3, zero_8x16b);
- /* a30 0 a31 0 a32 0 a33 0 -- 16 bit long */
- src_r3 = _mm_unpackhi_epi16(src_r2_r3, zero_8x16b);
-
- temp4 = _mm_madd_epi16(src_r0, temp4);
- temp5 = _mm_madd_epi16(src_r1, temp5);
- temp6 = _mm_madd_epi16(src_r2, temp6);
- temp7 = _mm_madd_epi16(src_r3, temp7);
-
- if(u4_qp_div_6 >= 4)
- {
- resq_r0 = _mm_slli_epi32(temp4, u4_qp_div_6 - 4);
- resq_r1 = _mm_slli_epi32(temp5, u4_qp_div_6 - 4);
- resq_r2 = _mm_slli_epi32(temp6, u4_qp_div_6 - 4);
- resq_r3 = _mm_slli_epi32(temp7, u4_qp_div_6 - 4);
- }
- else
- {
- temp4 = _mm_add_epi32(temp4, add_rshift);
- temp5 = _mm_add_epi32(temp5, add_rshift);
- temp6 = _mm_add_epi32(temp6, add_rshift);
- temp7 = _mm_add_epi32(temp7, add_rshift);
- resq_r0 = _mm_srai_epi32(temp4, 4 - u4_qp_div_6);
- resq_r1 = _mm_srai_epi32(temp5, 4 - u4_qp_div_6);
- resq_r2 = _mm_srai_epi32(temp6, 4 - u4_qp_div_6);
- resq_r3 = _mm_srai_epi32(temp7, 4 - u4_qp_div_6);
- }
-
- resq_r0 = _mm_insert_epi32(resq_r0, (WORD32) pi2_dc_src[0], 0);
- /* Perform Inverse transform */
- /*-------------------------------------------------------------*/
- /* IDCT [ Horizontal transformation ] */
- /*-------------------------------------------------------------*/
- // Matrix transpose
- /*
- * a0 a1 a2 a3
- * b0 b1 b2 b3
- * c0 c1 c2 c3
- * d0 d1 d2 d3
- */
- /* a0 b0 a1 b1 */
- temp1 = _mm_unpacklo_epi32(resq_r0, resq_r1);
- /* c0 d0 c1 d1 */
- temp3 = _mm_unpacklo_epi32(resq_r2, resq_r3);
- /* a2 b2 a3 b3 */
- temp2 = _mm_unpackhi_epi32(resq_r0, resq_r1);
- /* c2 d2 c3 d3 */
- temp4 = _mm_unpackhi_epi32(resq_r2, resq_r3);
- /* a0 b0 c0 d0 */
- resq_r0 = _mm_unpacklo_epi64(temp1, temp3);
- /* a1 b1 c1 d1 */
- resq_r1 = _mm_unpackhi_epi64(temp1, temp3);
- /* a2 b2 c2 d2 */
- resq_r2 = _mm_unpacklo_epi64(temp2, temp4);
- /* a3 b3 c3 d3 */
- resq_r3 = _mm_unpackhi_epi64(temp2, temp4);
- /* Transform starts -- horizontal transform */
-
- /*------------------------------------------------------------------*/
- /* z0 = w0 + w2 */
- temp0 = _mm_add_epi32(resq_r0, resq_r2);
- /* z1 = w0 - w2 */
- temp1 = _mm_sub_epi32(resq_r0, resq_r2);
- /* z2 = (w1 >> 1) - w3 */
- temp2 = _mm_srai_epi32(resq_r1, 1);
- temp2 = _mm_sub_epi32(temp2, resq_r3);
- /* z3 = w1 + (w3 >> 1) */
- temp3 = _mm_srai_epi32(resq_r3, 1); //(w3>>1) + w1
- temp3 = _mm_add_epi32(temp3, resq_r1);
- /*----------------------------------------------------------*/
- /* x0 = z0 + z3 */
- resq_r0 = _mm_add_epi32(temp0, temp3);
- /* x1 = z1 + z2 */
- resq_r1 = _mm_add_epi32(temp1, temp2);
- /* x2 = z1 - z2 */
- resq_r2 = _mm_sub_epi32(temp1, temp2);
- /* x3 = z0 - z3 */
- resq_r3 = _mm_sub_epi32(temp0, temp3);
- // Matrix transpose
- /*
- * a0 b0 c0 d0
- * a1 b1 c1 d1
- * a2 b2 c2 d2
- * a3 b3 c3 d3
- */
- /* a0 a1 b0 b1 */
- temp1 = _mm_unpacklo_epi32(resq_r0, resq_r1);
- /* a2 a3 b2 b3 */
- temp3 = _mm_unpacklo_epi32(resq_r2, resq_r3);
- /* c0 c1 d0 d1 */
- temp2 = _mm_unpackhi_epi32(resq_r0, resq_r1);
- /* c2 c3 d2 d3 */
- temp4 = _mm_unpackhi_epi32(resq_r2, resq_r3);
- /* a0 a1 a2 a3 */
- resq_r0 = _mm_unpacklo_epi64(temp1, temp3);
- /* b0 b1 b2 b3 */
- resq_r1 = _mm_unpackhi_epi64(temp1, temp3);
- /* c0 c1 c2 c3 */
- resq_r2 = _mm_unpacklo_epi64(temp2, temp4);
- /* d0 d1 d2 d3 */
- resq_r3 = _mm_unpackhi_epi64(temp2, temp4);
- /* Transform ends -- horizontal transform */
-
- temp0 = _mm_packs_epi32(resq_r0, resq_r1);
- temp1 = _mm_packs_epi32(resq_r2, resq_r3);
-
- _mm_storeu_si128((__m128i *) (&pi2_tmp[0]), temp0);
- _mm_storeu_si128((__m128i *) (&pi2_tmp[2 * 4]), temp1);
-
- /* Load pred buffer */
- pred_r0 = _mm_loadl_epi64((__m128i *) (&pu1_pred[0]));
- pred_r1 = _mm_loadl_epi64((__m128i *) (&pu1_pred[i4_pred_stride]));
- pred_r2 = _mm_loadl_epi64((__m128i *) (&pu1_pred[2 * i4_pred_stride]));
- pred_r3 = _mm_loadl_epi64((__m128i *) (&pu1_pred[3 * i4_pred_stride]));
-
- pred_r0 = _mm_and_si128(pred_r0, chroma_mask);
- pred_r1 = _mm_and_si128(pred_r1, chroma_mask);
- pred_r2 = _mm_and_si128(pred_r2, chroma_mask);
- pred_r3 = _mm_and_si128(pred_r3, chroma_mask);
-
- pred_r0 = _mm_unpacklo_epi64(pred_r0, pred_r1);
- pred_r1 = _mm_unpacklo_epi64(pred_r2, pred_r3);
-
- /*--------------------------------------------------------------*/
- /* IDCT [ Vertical transformation] and Xij = (xij + 32)>>6 */
- /* */
- /* Add the prediction and store it back to same buffer */
- /*--------------------------------------------------------------*/
- /* z0j = y0j + y2j */
- temp0 = _mm_add_epi32(resq_r0, resq_r2);
- /* z1j = y0j - y2j */
- temp1 = _mm_sub_epi32(resq_r0, resq_r2);
- /* z2j = (y1j>>1) - y3j */
- temp2 = _mm_srai_epi32(resq_r1, 1);
- temp2 = _mm_sub_epi32(temp2, resq_r3);
- /* z3j = y1j + (y3j>>1) */
- temp3 = _mm_srai_epi32(resq_r3, 1);
- temp3 = _mm_add_epi32(temp3, resq_r1);
-
- /* x0j = z0j + z3j */
- temp4 = _mm_add_epi32(temp0, temp3);
- temp4 = _mm_add_epi32(temp4, value_32);
- temp4 = _mm_srai_epi32(temp4, 6);
- /* x1j = z1j + z2j */
- temp5 = _mm_add_epi32(temp1, temp2);
- temp5 = _mm_add_epi32(temp5, value_32);
- temp5 = _mm_srai_epi32(temp5, 6);
- /* x2j = z1j - z2j */
- temp6 = _mm_sub_epi32(temp1, temp2);
- temp6 = _mm_add_epi32(temp6, value_32);
- temp6 = _mm_srai_epi32(temp6, 6);
- /* x3j = z0j - z3j */
- temp7 = _mm_sub_epi32(temp0, temp3);
- temp7 = _mm_add_epi32(temp7, value_32);
- temp7 = _mm_srai_epi32(temp7, 6);
-
- /* 32-bit to 16-bit conversion */
- temp0 = _mm_packs_epi32(temp4, temp5);
- temp1 = _mm_packs_epi32(temp6, temp7);
-
- /* Saturate all values < -255 to -255 and retain the rest as it is */
- temp4 = _mm_max_epi16(temp0, neg_255_8x16b);
- /* Saturate all values > 255 to 255 and retain the rest as it is */
- temp4 = _mm_min_epi16(temp4, pos_255_8x16b);
-
- /* Saturate all values < -255 to -255 and retain the rest as it is */
- temp5 = _mm_max_epi16(temp1, neg_255_8x16b);
- /* Saturate all values > 255 to 255 and retain the rest as it is */
- temp5 = _mm_min_epi16(temp5, pos_255_8x16b);
-
- temp0 = _mm_add_epi16(temp4, pred_r0);
- temp1 = _mm_add_epi16(temp5, pred_r1);
-
- /*------------------------------------------------------------------*/
- /* Clipping the results to 8 bits */
- sign_reg = _mm_cmpgt_epi16(temp0, zero_8x16b);
- temp0 = _mm_and_si128(temp0, sign_reg);
- sign_reg = _mm_cmpgt_epi16(temp1, zero_8x16b);
- temp1 = _mm_and_si128(temp1, sign_reg);
-
- resq_r0 = _mm_packus_epi16(temp0, temp1);
- resq_r1 = _mm_srli_si128(resq_r0, 4);
- resq_r2 = _mm_srli_si128(resq_r1, 4);
- resq_r3 = _mm_srli_si128(resq_r2, 4);
-
- resq_r0 = _mm_cvtepu8_epi16(resq_r0);
- resq_r1 = _mm_cvtepu8_epi16(resq_r1);
- resq_r2 = _mm_cvtepu8_epi16(resq_r2);
- resq_r3 = _mm_cvtepu8_epi16(resq_r3);
-
- chroma_mask = _mm_set1_epi16(0xFF00);
- out_r0 = _mm_loadl_epi64((__m128i *) (&pu1_out[0]));
- out_r1 = _mm_loadl_epi64((__m128i *) (&pu1_out[i4_out_stride]));
- out_r2 = _mm_loadl_epi64((__m128i *) (&pu1_out[2 * i4_out_stride]));
- out_r3 = _mm_loadl_epi64((__m128i *) (&pu1_out[3 * i4_out_stride]));
-
- out_r0 = _mm_and_si128(out_r0, chroma_mask);
- out_r1 = _mm_and_si128(out_r1, chroma_mask);
- out_r2 = _mm_and_si128(out_r2, chroma_mask);
- out_r3 = _mm_and_si128(out_r3, chroma_mask);
-
- out_r0 = _mm_add_epi8(out_r0, resq_r0);
- out_r1 = _mm_add_epi8(out_r1, resq_r1);
- out_r2 = _mm_add_epi8(out_r2, resq_r2);
- out_r3 = _mm_add_epi8(out_r3, resq_r3);
-
- _mm_storel_epi64((__m128i *) (&pu1_out[0]), out_r0);
- _mm_storel_epi64((__m128i *) (&pu1_out[i4_out_stride]), out_r1);
- _mm_storel_epi64((__m128i *) (&pu1_out[2 * i4_out_stride]), out_r2);
- _mm_storel_epi64((__m128i *) (&pu1_out[3 * i4_out_stride]), out_r3);
-}
-
void isvc_iquant_itrans_recon_res_chroma_4x4_sse42(
buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
buffer_container_t *ps_res, buffer_container_t *ps_rec,
@@ -2191,337 +1841,6 @@ void isvc_iquant_itrans_recon_dc_4x4_sse42(buffer_container_t *ps_src, buffer_co
*(pu4_out) = _mm_cvtsi128_si32(temp7);
}
-void isvc_iquant_itrans_recon_res_dc_4x4_sse42(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_res = (WORD16 *) ps_res->pv_data;
- WORD16 *pi2_res_ptr = pi2_res;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_res_stride = ps_res->i4_data_stride;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
- UWORD32 *pu4_out = (UWORD32 *) pu1_out;
- WORD32 q0 = ((WORD16 *) (ps_src->pv_data))[0];
- WORD16 i_macro, rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
-
- __m128i pred_r0, pred_r1, pred_r2, pred_r3;
- __m128i sign_reg;
- /* all bits reset to zero */
- __m128i zero_8x16b = _mm_setzero_si128();
- __m128i temp4, temp5, temp6, temp7;
- __m128i value_add;
-
- ASSERT(0 == u1_res_accumulate);
-
- UNUSED(pi2_tmp);
- UNUSED(ps_res_pred);
- UNUSED(u1_res_accumulate);
-
- INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
-
- /* Restoring dc value for intra case */
- if(i4_iq_start_idx != 0) q0 = pi2_dc_src[0];
-
- i_macro = ((q0 + 32) >> 6);
-
- value_add = _mm_set1_epi16(isvc_get_residue(i_macro, 0, 0));
-
- zero_8x16b = _mm_setzero_si128();
-
- /* Load pred buffer */
-
- /* p00 p01 p02 p03 0 0 0 0 -- all 8 bits */
- pred_r0 = _mm_loadl_epi64((__m128i *) (&pu1_pred[0]));
-
- /* p10 p11 p12 p13 0 0 0 0 -- all 8 bits */
- pred_r1 = _mm_loadl_epi64((__m128i *) (&pu1_pred[i4_pred_stride]));
-
- /* p20 p21 p22 p23 0 0 0 0 -- all 8 bits */
- pred_r2 = _mm_loadl_epi64((__m128i *) (&pu1_pred[2 * i4_pred_stride]));
-
- /* p30 p31 p32 p33 0 0 0 0 -- all 8 bits */
- pred_r3 = _mm_loadl_epi64((__m128i *) (&pu1_pred[3 * i4_pred_stride]));
-
- pred_r0 = _mm_cvtepu8_epi16(pred_r0);
- pred_r1 = _mm_cvtepu8_epi16(pred_r1);
- pred_r2 = _mm_cvtepu8_epi16(pred_r2);
- pred_r3 = _mm_cvtepu8_epi16(pred_r3);
-
- pred_r0 = _mm_unpacklo_epi64(pred_r0, pred_r1);
- pred_r2 = _mm_unpacklo_epi64(pred_r2, pred_r3);
-
- temp4 = _mm_add_epi16(value_add, pred_r0);
- temp5 = _mm_add_epi16(value_add, pred_r2);
-
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[0]), value_add);
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[i4_res_stride]), value_add);
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[2 * i4_res_stride]), value_add);
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[3 * i4_res_stride]), value_add);
- /*------------------------------------------------------------------*/
- /* Clipping the results to 8 bits */
- sign_reg = _mm_cmpgt_epi16(temp4, zero_8x16b);
- temp4 = _mm_and_si128(temp4, sign_reg);
- sign_reg = _mm_cmpgt_epi16(temp5, zero_8x16b);
- temp5 = _mm_and_si128(temp5, sign_reg);
-
- temp4 = _mm_packus_epi16(temp4, temp5);
- temp5 = _mm_srli_si128(temp4, 4);
- temp6 = _mm_srli_si128(temp5, 4);
- temp7 = _mm_srli_si128(temp6, 4);
-
- *pu4_out = _mm_cvtsi128_si32(temp4);
- pu1_out += i4_out_stride;
- pu4_out = (UWORD32 *) (pu1_out);
- *(pu4_out) = _mm_cvtsi128_si32(temp5);
- pu1_out += i4_out_stride;
- pu4_out = (UWORD32 *) (pu1_out);
- *(pu4_out) = _mm_cvtsi128_si32(temp6);
- pu1_out += i4_out_stride;
- pu4_out = (UWORD32 *) (pu1_out);
- *(pu4_out) = _mm_cvtsi128_si32(temp7);
-}
-
-void isvc_iquant_itrans_recon_res_dc_with_res_acc_4x4_sse42(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_res = (WORD16 *) ps_res->pv_data;
- WORD16 *pi2_res_ptr = pi2_res;
- WORD16 *pi2_res_pred = (WORD16 *) ps_res_pred->pv_data;
- WORD16 *pi2_res_pred_ptr = pi2_res_pred;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_res_stride = ps_res->i4_data_stride;
- WORD32 i4_res_pred_stride = ps_res_pred->i4_data_stride;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
- UWORD32 *pu4_out = (UWORD32 *) pu1_out;
- WORD32 q0 = ((WORD16 *) (ps_src->pv_data))[0];
- WORD16 i_macro, rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
-
- __m128i pred_r0, pred_r1, pred_r2, pred_r3;
- __m128i sign_reg;
- /* all bits reset to zero */
- __m128i zero_8x16b = _mm_setzero_si128();
- __m128i temp4, temp5, temp6, temp7;
- __m128i value_add;
- __m128i res_pred_r0, res_pred_r1, res_pred_r2, res_pred_r3;
- __m128i temp0, temp1;
- __m128i neg_255_8x16b = _mm_set1_epi16(-((WORD16) UINT8_MAX));
- __m128i pos_255_8x16b = _mm_set1_epi16(((WORD16) UINT8_MAX));
-
- ASSERT(1 == u1_res_accumulate);
-
- UNUSED(pi2_tmp);
- UNUSED(u1_res_accumulate);
-
- INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
-
- /* Restoring dc value for intra case */
- if(i4_iq_start_idx != 0) q0 = pi2_dc_src[0];
-
- i_macro = ((q0 + 32) >> 6);
-
- value_add = _mm_set1_epi16(i_macro);
-
- zero_8x16b = _mm_setzero_si128();
-
- /* Load pred buffer */
-
- /* p00 p01 p02 p03 0 0 0 0 -- all 8 bits */
- pred_r0 = _mm_loadl_epi64((__m128i *) (&pu1_pred[0]));
-
- /* p10 p11 p12 p13 0 0 0 0 -- all 8 bits */
- pred_r1 = _mm_loadl_epi64((__m128i *) (&pu1_pred[i4_pred_stride]));
-
- /* p20 p21 p22 p23 0 0 0 0 -- all 8 bits */
- pred_r2 = _mm_loadl_epi64((__m128i *) (&pu1_pred[2 * i4_pred_stride]));
-
- /* p30 p31 p32 p33 0 0 0 0 -- all 8 bits */
- pred_r3 = _mm_loadl_epi64((__m128i *) (&pu1_pred[3 * i4_pred_stride]));
-
- pred_r0 = _mm_cvtepu8_epi16(pred_r0);
- pred_r1 = _mm_cvtepu8_epi16(pred_r1);
- pred_r2 = _mm_cvtepu8_epi16(pred_r2);
- pred_r3 = _mm_cvtepu8_epi16(pred_r3);
-
- pred_r0 = _mm_unpacklo_epi64(pred_r0, pred_r1);
- pred_r2 = _mm_unpacklo_epi64(pred_r2, pred_r3);
-
- /* Accumulating res */
- res_pred_r0 = _mm_loadl_epi64((__m128i *) &pi2_res_pred_ptr[0]);
- res_pred_r1 = _mm_loadl_epi64((__m128i *) &pi2_res_pred_ptr[i4_res_pred_stride]);
- res_pred_r2 = _mm_loadl_epi64((__m128i *) &pi2_res_pred_ptr[2 * i4_res_pred_stride]);
- res_pred_r3 = _mm_loadl_epi64((__m128i *) &pi2_res_pred_ptr[3 * i4_res_pred_stride]);
-
- res_pred_r0 = _mm_unpacklo_epi64(res_pred_r0, res_pred_r1);
- res_pred_r1 = _mm_unpacklo_epi64(res_pred_r2, res_pred_r3);
-
- temp0 = _mm_add_epi16(value_add, res_pred_r0);
- temp1 = _mm_add_epi16(value_add, res_pred_r1);
-
- /* Saturate all values < -255 to -255 and retain the rest as it is */
- temp0 = _mm_max_epi16(temp0, neg_255_8x16b);
- /* Saturate all values > 255 to 255 and retain the rest as it is */
- temp0 = _mm_min_epi16(temp0, pos_255_8x16b);
-
- /* Saturate all values < -255 to -255 and retain the rest as it is */
- temp1 = _mm_max_epi16(temp1, neg_255_8x16b);
- /* Saturate all values > 255 to 255 and retain the rest as it is */
- temp1 = _mm_min_epi16(temp1, pos_255_8x16b);
-
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[0]), temp0);
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[2 * i4_res_stride]), temp1);
-
- temp4 = _mm_add_epi16(temp0, pred_r0);
- temp5 = _mm_add_epi16(temp1, pred_r2);
-
- temp0 = _mm_srli_si128(temp0, 8);
- temp1 = _mm_srli_si128(temp1, 8);
-
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[i4_res_stride]), temp0);
- _mm_storeu_si128((__m128i *) (&pi2_res_ptr[3 * i4_res_stride]), temp1);
-
- /*------------------------------------------------------------------*/
- /* Clipping the results to 8 bits */
- sign_reg = _mm_cmpgt_epi16(temp4, zero_8x16b);
- temp4 = _mm_and_si128(temp4, sign_reg);
- sign_reg = _mm_cmpgt_epi16(temp5, zero_8x16b);
- temp5 = _mm_and_si128(temp5, sign_reg);
-
- temp4 = _mm_packus_epi16(temp4, temp5);
- temp5 = _mm_srli_si128(temp4, 4);
- temp6 = _mm_srli_si128(temp5, 4);
- temp7 = _mm_srli_si128(temp6, 4);
-
- *pu4_out = _mm_cvtsi128_si32(temp4);
- pu1_out += i4_out_stride;
- pu4_out = (UWORD32 *) (pu1_out);
- *(pu4_out) = _mm_cvtsi128_si32(temp5);
- pu1_out += i4_out_stride;
- pu4_out = (UWORD32 *) (pu1_out);
- *(pu4_out) = _mm_cvtsi128_si32(temp6);
- pu1_out += i4_out_stride;
- pu4_out = (UWORD32 *) (pu1_out);
- *(pu4_out) = _mm_cvtsi128_si32(temp7);
-}
-
-void isvc_iquant_itrans_recon_chroma_4x4_dc_sse42(
- buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
- buffer_container_t *ps_res, buffer_container_t *ps_rec,
- iq_it_res_rec_constants_t *ps_iq_it_res_rec_constants, WORD16 *pi2_tmp, WORD16 *pi2_dc_src,
- WORD32 i4_iq_start_idx, UWORD8 u1_res_accumulate)
-{
- WORD16 *pi2_src = (WORD16 *) ps_src->pv_data;
- UWORD8 *pu1_pred = (UWORD8 *) ps_pred->pv_data;
- UWORD8 *pu1_out = (UWORD8 *) ps_rec->pv_data;
- WORD32 i4_pred_stride = ps_pred->i4_data_stride;
- WORD32 i4_out_stride = ps_rec->i4_data_stride;
- const UWORD16 *pu2_iscal_mat = ps_iq_it_res_rec_constants->pu2_iscal_mat;
- const UWORD16 *pu2_weigh_mat = ps_iq_it_res_rec_constants->pu2_weigh_mat;
- UWORD32 u4_qp_div_6 = ps_iq_it_res_rec_constants->u4_qp_div_6;
- /* DC value won't be dequantized for chroma
- inverse transform */
- WORD16 q0 = pi2_dc_src[0];
- WORD16 i_macro = ((q0 + 32) >> 6);
-
- __m128i pred_r0, pred_r1, pred_r2, pred_r3;
- /* all bits reset to zero */
- __m128i zero_8x16b = _mm_setzero_si128();
- __m128i chroma_mask = _mm_set1_epi16(0xFF);
- __m128i value_add = _mm_set1_epi16(i_macro);
- __m128i out_r0, out_r1, out_r2, out_r3;
-
- ASSERT(0 == u1_res_accumulate);
-
- UNUSED(pi2_src);
- UNUSED(pu2_iscal_mat);
- UNUSED(pu2_weigh_mat);
- UNUSED(u4_qp_div_6);
- UNUSED(pi2_tmp);
- UNUSED(ps_res_pred);
- UNUSED(ps_res);
- UNUSED(i4_iq_start_idx);
- UNUSED(u1_res_accumulate);
-
- /* Load pred buffer */
- pred_r0 = _mm_loadl_epi64((__m128i *) (&pu1_pred[0]));
-
- pred_r1 = _mm_loadl_epi64((__m128i *) (&pu1_pred[i4_pred_stride]));
-
- pred_r2 = _mm_loadl_epi64((__m128i *) (&pu1_pred[2 * i4_pred_stride]));
-
- pred_r3 = _mm_loadl_epi64((__m128i *) (&pu1_pred[3 * i4_pred_stride]));
-
- /* Mask alternate pred values from the interleaved pred buf */
- pred_r0 = _mm_and_si128(pred_r0, chroma_mask);
- pred_r1 = _mm_and_si128(pred_r1, chroma_mask);
- pred_r2 = _mm_and_si128(pred_r2, chroma_mask);
- pred_r3 = _mm_and_si128(pred_r3, chroma_mask);
-
- /* Pack the first four 16 bit values of 2 regs into a single reg*/
- pred_r0 = _mm_unpacklo_epi64(pred_r0, pred_r1);
- pred_r2 = _mm_unpacklo_epi64(pred_r2, pred_r3);
-
- /* Compute out pixel by adding res to pred */
- pred_r0 = _mm_add_epi16(value_add, pred_r0);
- pred_r2 = _mm_add_epi16(value_add, pred_r2);
- /*------------------------------------------------------------------*/
- /* Clipping the results to 8 bits */
- pred_r0 = _mm_packus_epi16(pred_r0, pred_r2);
- pred_r1 = _mm_srli_si128(pred_r0, 4);
- pred_r2 = _mm_srli_si128(pred_r1, 4);
- pred_r3 = _mm_srli_si128(pred_r2, 4);
-
- /* p00 p01 p02 p03 -- all 16 bits */
- pred_r0 = _mm_unpacklo_epi8(pred_r0, zero_8x16b);
- /* p10 p11 p12 p13 -- all 16 bits */
- pred_r1 = _mm_unpacklo_epi8(pred_r1, zero_8x16b);
- /* p20 p21 p22 p23 -- all 16 bits */
- pred_r2 = _mm_unpacklo_epi8(pred_r2, zero_8x16b);
- /* p30 p31 p32 p33 -- all 16 bits */
- pred_r3 = _mm_unpacklo_epi8(pred_r3, zero_8x16b);
-
- /* Load interleaved out buffer */
- out_r0 = _mm_loadl_epi64((__m128i *) (&pu1_out[0]));
- out_r1 = _mm_loadl_epi64((__m128i *) (&pu1_out[i4_out_stride]));
- out_r2 = _mm_loadl_epi64((__m128i *) (&pu1_out[2 * i4_out_stride]));
- out_r3 = _mm_loadl_epi64((__m128i *) (&pu1_out[3 * i4_out_stride]));
-
- /* Mask the interleaved out buf in order to save the U/V out pixel computed in
- this function call without thrashing the U/V out pixel that was saved
- during an earlier function call */
- chroma_mask = _mm_set1_epi16(0xFF00);
-
- out_r0 = _mm_and_si128(out_r0, chroma_mask);
- out_r1 = _mm_and_si128(out_r1, chroma_mask);
- out_r2 = _mm_and_si128(out_r2, chroma_mask);
- out_r3 = _mm_and_si128(out_r3, chroma_mask);
-
- /* Save the out pixels in alternate locations */
- out_r0 = _mm_add_epi8(out_r0, pred_r0);
- out_r1 = _mm_add_epi8(out_r1, pred_r1);
- out_r2 = _mm_add_epi8(out_r2, pred_r2);
- out_r3 = _mm_add_epi8(out_r3, pred_r3);
-
- _mm_storel_epi64((__m128i *) (&pu1_out[0]), out_r0);
- _mm_storel_epi64((__m128i *) (&pu1_out[i4_out_stride]), out_r1);
- _mm_storel_epi64((__m128i *) (&pu1_out[2 * i4_out_stride]), out_r2);
- _mm_storel_epi64((__m128i *) (&pu1_out[3 * i4_out_stride]), out_r3);
-}
-
void isvc_iquant_itrans_recon_res_chroma_4x4_dc_sse42(
buffer_container_t *ps_src, buffer_container_t *ps_pred, buffer_container_t *ps_res_pred,
buffer_container_t *ps_res, buffer_container_t *ps_rec,