Merge "Encoder: Defined structures for accessing MB header data" am: 8aa140b8a5 am: fef5e9e203

am: eba0a08cdd

Change-Id: I1d7c6d62099e81e69d8b7d81f6db9293ac00e5f7
This commit is contained in:
Ray Essick 2016-11-29 14:42:28 +00:00 committed by android-build-merger
commit 2ebe889e3f
5 changed files with 349 additions and 126 deletions

View file

@ -3823,7 +3823,7 @@ static WORD32 ih264e_init_mem_rec(iv_obj_t *ps_codec_obj,
UWORD8 *pu1_buf = ps_mem_rec->pv_base; UWORD8 *pu1_buf = ps_mem_rec->pv_base;
/* size of header data of 1 mb */ /* size of header data of 1 mb */
size = 40; size = sizeof(mb_hdr_t);
/* size for 1 row of mbs */ /* size for 1 row of mbs */
size = size * max_mb_cols; size = size * max_mb_cols;

View file

@ -339,7 +339,7 @@ static void ih264e_cabac_enc_4x4mb_modes(cabac_ctxt_t *ps_cabac_ctxt,
for (i = 0; i < 16; i += 2) for (i = 0; i < 16; i += 2)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_intra_4x4_modes++; byte = pu1_intra_4x4_modes[i >> 1];
if (byte & 0x1) if (byte & 0x1)
{ {
ih264e_cabac_encode_bin(ps_cabac_ctxt, ih264e_cabac_encode_bin(ps_cabac_ctxt,
@ -1540,14 +1540,14 @@ static void ih264e_cabac_enc_mvds_b16x16(cabac_ctxt_t *ps_cabac_ctxt,
u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1]; u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1];
u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0]; u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0];
u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1]; u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1];
u2_mv = *(pi2_mv_ptr++); u2_mv = pi2_mv_ptr[0];
ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X,
(UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
ps_cabac_ctxt); ps_cabac_ctxt);
u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv));
u2_mv = *(pi2_mv_ptr++); u2_mv = pi2_mv_ptr[1];
ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y,
(UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b),
@ -1555,6 +1555,7 @@ static void ih264e_cabac_enc_mvds_b16x16(cabac_ctxt_t *ps_cabac_ctxt,
u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv)); u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv));
} }
/***************************************************************/ /***************************************************************/
/* Store abs_mvd_values cabac contexts */ /* Store abs_mvd_values cabac contexts */
/***************************************************************/ /***************************************************************/
@ -1571,14 +1572,14 @@ static void ih264e_cabac_enc_mvds_b16x16(cabac_ctxt_t *ps_cabac_ctxt,
u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[3]; u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[3];
u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[2]; u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[2];
u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[3]; u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[3];
u2_mv = *(pi2_mv_ptr++); u2_mv = pi2_mv_ptr[2];
ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X, ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_X,
(UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b), (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
ps_cabac_ctxt); ps_cabac_ctxt);
u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv)); u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv));
u2_mv = *(pi2_mv_ptr++); u2_mv = pi2_mv_ptr[3];
ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y, ih264e_cabac_enc_ctx_mvd(u2_mv, MVD_Y,
(UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b), (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b),
@ -1624,11 +1625,11 @@ IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac; cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
/* packed header data */ /* packed header data */
UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data;
mb_info_ctxt_t *ps_curr_ctxt; mb_info_ctxt_t *ps_curr_ctxt;
WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
WORD8 mb_qp_delta; WORD8 mb_qp_delta;
UWORD32 u4_cbp_l, u4_cbp_c; UWORD32 u4_cbp_l, u4_cbp_c;
WORD32 byte_count = 0;
WORD32 bitstream_start_offset, bitstream_end_offset; WORD32 bitstream_start_offset, bitstream_end_offset;
if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB)
@ -1638,12 +1639,10 @@ IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
return (IH264E_BITSTREAM_BUFFER_OVERFLOW); return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
} }
/* mb header info */ /* mb header info */
mb_tpm = *pu1_byte++; mb_tpm = ps_mb_hdr->u1_mb_type_mode;
byte_count++; cbp = ps_mb_hdr->u1_cbp;
cbp = *pu1_byte++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
/* mb type */ /* mb type */
mb_type = mb_tpm & 0xF; mb_type = mb_tpm & 0xF;
@ -1671,9 +1670,10 @@ IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
MB_TYPE_I_SLICE); MB_TYPE_I_SLICE);
if (mb_type == I4x4) if (mb_type == I4x4)
{ /* Encode 4x4 MB modes */ {
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte); /* Encode 4x4 MB modes */
byte_count += 8; mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes);
} }
/* Encode chroma mode */ /* Encode chroma mode */
ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt); ih264e_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt);
@ -1731,17 +1731,18 @@ IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
memset(ps_curr_ctxt->u1_mv, 0, 16); memset(ps_curr_ctxt->u1_mv, 0, 16);
memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16); memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16);
ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = cbp; ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_cbp = cbp;
ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count;
if (mb_type == I16x16) if (mb_type == I16x16)
{ {
ps_curr_ctxt->u1_mb_type = CAB_I16x16; ps_curr_ctxt->u1_mb_type = CAB_I16x16;
pu1_byte += sizeof(mb_hdr_i16x16_t);
} }
else else
{ {
ps_curr_ctxt->u1_mb_type = CAB_I4x4; ps_curr_ctxt->u1_mb_type = CAB_I4x4;
pu1_byte += sizeof(mb_hdr_i4x4_t);
} }
ps_ent_ctxt->pv_mb_header_data = pu1_byte;
return IH264E_SUCCESS; return IH264E_SUCCESS;
} }
@ -1778,8 +1779,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
WORD8 mb_qp_delta; WORD8 mb_qp_delta;
UWORD32 u4_cbp_l, u4_cbp_c; UWORD32 u4_cbp_l, u4_cbp_c;
WORD32 byte_count = 0;
UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data;
if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB)
>= ps_bitstream->u4_max_strm_size) >= ps_bitstream->u4_max_strm_size)
@ -1788,8 +1789,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
return (IH264E_BITSTREAM_BUFFER_OVERFLOW); return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
} }
/* mb header info */ /* mb header info */
mb_tpm = *pu1_byte++; mb_tpm = ps_mb_hdr->u1_mb_type_mode;
byte_count++;
/* mb type */ /* mb type */
mb_type = mb_tpm & 0xF; mb_type = mb_tpm & 0xF;
@ -1800,10 +1800,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* if Intra MB */ /* if Intra MB */
if (mb_type == I16x16 || mb_type == I4x4) if (mb_type == I16x16 || mb_type == I4x4)
{ {
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
byte_count++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
mb_qp_delta = *pu1_byte++;
byte_count++;
/* Starting bitstream offset for header in bits */ /* Starting bitstream offset for header in bits */
bitstream_start_offset = GET_NUM_BITS(ps_bitstream); bitstream_start_offset = GET_NUM_BITS(ps_bitstream);
@ -1833,9 +1831,10 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
} }
if (mb_type == I4x4) if (mb_type == I4x4)
{ /* Intra 4x4 modes */ {
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte); /* Intra 4x4 modes */
byte_count += 8; mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes);
} }
chroma_intra_mode = (mb_tpm >> 6); chroma_intra_mode = (mb_tpm >> 6);
@ -1901,13 +1900,15 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
if (mb_type == I16x16) if (mb_type == I16x16)
{ {
ps_curr_ctxt->u1_mb_type = CAB_I16x16; ps_curr_ctxt->u1_mb_type = CAB_I16x16;
pu1_byte += sizeof(mb_hdr_i16x16_t);
} }
else else
{ {
ps_curr_ctxt->u1_mb_type = CAB_I4x4; ps_curr_ctxt->u1_mb_type = CAB_I4x4;
pu1_byte += sizeof(mb_hdr_i4x4_t);
} }
ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; ps_ent_ctxt->pv_mb_header_data = pu1_byte;
return IH264E_SUCCESS; return IH264E_SUCCESS;
} }
@ -1918,10 +1919,9 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* Encoding P16x16 */ /* Encoding P16x16 */
if (mb_type != PSKIP) if (mb_type != PSKIP)
{ {
cbp = *pu1_byte++; mb_hdr_p16x16_t *ps_mb_hdr_p16x16 = (mb_hdr_p16x16_t *)ps_ent_ctxt->pv_mb_header_data;
byte_count++; cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = *pu1_byte++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
byte_count++;
/* Encoding mb_skip */ /* Encoding mb_skip */
ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE); ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE);
@ -1937,8 +1937,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
} }
ps_curr_ctxt->u1_mb_type = CAB_P; ps_curr_ctxt->u1_mb_type = CAB_P;
{ {
WORD16 *pi2_mv_ptr = (WORD16 *) pu1_byte; WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_p16x16->ai2_mv;
byte_count += 4;
ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type
| CAB_NON_BD16x16); | CAB_NON_BD16x16);
/* Encoding motion vector for P16x16 */ /* Encoding motion vector for P16x16 */
@ -1960,6 +1960,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* Starting bitstream offset for residue */ /* Starting bitstream offset for residue */
bitstream_start_offset = bitstream_end_offset; bitstream_start_offset = bitstream_end_offset;
pu1_byte += sizeof(mb_hdr_p16x16_t);
} }
else/* MB = PSKIP */ else/* MB = PSKIP */
{ {
@ -1978,6 +1980,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
- bitstream_start_offset; - bitstream_start_offset;
/* Starting bitstream offset for residue */ /* Starting bitstream offset for residue */
pu1_byte += sizeof(mb_hdr_pskip_t);
} }
if (cbp > 0) if (cbp > 0)
@ -2002,7 +2005,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
} }
ps_curr_ctxt->u1_intrapred_chroma_mode = 0; ps_curr_ctxt->u1_intrapred_chroma_mode = 0;
ps_curr_ctxt->u1_cbp = cbp; ps_curr_ctxt->u1_cbp = cbp;
ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; ps_ent_ctxt->pv_mb_header_data = pu1_byte;
return IH264E_SUCCESS; return IH264E_SUCCESS;
} }
} }
@ -2066,8 +2070,8 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode; WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
WORD8 mb_qp_delta; WORD8 mb_qp_delta;
UWORD32 u4_cbp_l, u4_cbp_c; UWORD32 u4_cbp_l, u4_cbp_c;
WORD32 byte_count = 0;
UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data;
if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) if ((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB)
>= ps_bitstream->u4_max_strm_size) >= ps_bitstream->u4_max_strm_size)
@ -2076,8 +2080,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
return (IH264E_BITSTREAM_BUFFER_OVERFLOW); return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
} }
/* mb header info */ /* mb header info */
mb_tpm = *pu1_byte++; mb_tpm = ps_mb_hdr->u1_mb_type_mode;
byte_count++;
/* mb type */ /* mb type */
mb_type = mb_tpm & 0xF; mb_type = mb_tpm & 0xF;
@ -2088,10 +2091,8 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* if Intra MB */ /* if Intra MB */
if (mb_type == I16x16 || mb_type == I4x4) if (mb_type == I16x16 || mb_type == I4x4)
{ {
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
byte_count++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
mb_qp_delta = *pu1_byte++;
byte_count++;
/* Starting bitstream offset for header in bits */ /* Starting bitstream offset for header in bits */
bitstream_start_offset = GET_NUM_BITS(ps_bitstream); bitstream_start_offset = GET_NUM_BITS(ps_bitstream);
@ -2138,9 +2139,10 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
} }
if (mb_type == I4x4) if (mb_type == I4x4)
{ /* Intra 4x4 modes */ {
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte); /* Intra 4x4 modes */
byte_count += 8; mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes);
} }
chroma_intra_mode = (mb_tpm >> 6); chroma_intra_mode = (mb_tpm >> 6);
@ -2206,13 +2208,15 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
if (mb_type == I16x16) if (mb_type == I16x16)
{ {
ps_curr_ctxt->u1_mb_type = CAB_I16x16; ps_curr_ctxt->u1_mb_type = CAB_I16x16;
pu1_byte += sizeof(mb_hdr_i16x16_t);
} }
else else
{ {
ps_curr_ctxt->u1_mb_type = CAB_I4x4; ps_curr_ctxt->u1_mb_type = CAB_I4x4;
pu1_byte += sizeof(mb_hdr_i4x4_t);
} }
ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; ps_ent_ctxt->pv_mb_header_data = pu1_byte;
return IH264E_SUCCESS; return IH264E_SUCCESS;
} }
@ -2224,10 +2228,9 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* Encoding B_Direct_16x16 */ /* Encoding B_Direct_16x16 */
if (mb_type == BDIRECT) if (mb_type == BDIRECT)
{ {
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
byte_count++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
mb_qp_delta = *pu1_byte++;
byte_count++;
/* Encoding mb_skip */ /* Encoding mb_skip */
ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE);
@ -2275,6 +2278,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
bitstream_start_offset = bitstream_end_offset; bitstream_start_offset = bitstream_end_offset;
/* Starting bitstream offset for residue */ /* Starting bitstream offset for residue */
pu1_byte += sizeof(mb_hdr_bdirect_t);
} }
else if (mb_type == BSKIP)/* MB = BSKIP */ else if (mb_type == BSKIP)/* MB = BSKIP */
@ -2293,17 +2297,18 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
- bitstream_start_offset; - bitstream_start_offset;
/* Starting bitstream offset for residue */ /* Starting bitstream offset for residue */
pu1_byte += sizeof(mb_hdr_bskip_t);
} }
else /* mbype is B_L0_16x16, B_L1_16x16 or B_Bi_16x16 */ else /* mbype is B_L0_16x16, B_L1_16x16 or B_Bi_16x16 */
{ {
mb_hdr_b16x16_t *ps_mb_hdr_b16x16 = (mb_hdr_b16x16_t *)ps_ent_ctxt->pv_mb_header_data;
WORD32 i4_mb_part_pred_mode = (mb_tpm >> 4); WORD32 i4_mb_part_pred_mode = (mb_tpm >> 4);
UWORD32 u4_mb_type = mb_type - B16x16 + B_L0_16x16 UWORD32 u4_mb_type = mb_type - B16x16 + B_L0_16x16
+ i4_mb_part_pred_mode; + i4_mb_part_pred_mode;
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
byte_count++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
mb_qp_delta = *pu1_byte++;
byte_count++;
/* Encoding mb_skip */ /* Encoding mb_skip */
ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE); ih264e_cabac_enc_mb_skip(0, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE);
@ -2338,11 +2343,9 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16; ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
{ {
WORD16 *pi2_mv_ptr = (WORD16 *) pu1_byte; WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_b16x16->ai2_mv;
/* Get the pred modes */ /* Get the pred modes */
byte_count += 4 * (1 + (i4_mb_part_pred_mode == PRED_BI));
ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type
| CAB_NON_BD16x16); | CAB_NON_BD16x16);
/* Encoding motion vector for B16x16 */ /* Encoding motion vector for B16x16 */
@ -2364,6 +2367,8 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
- bitstream_start_offset; - bitstream_start_offset;
/* Starting bitstream offset for residue */ /* Starting bitstream offset for residue */
bitstream_start_offset = bitstream_end_offset; bitstream_start_offset = bitstream_end_offset;
pu1_byte += sizeof(mb_hdr_b16x16_t);
} }
if (cbp > 0) if (cbp > 0)
@ -2388,7 +2393,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
} }
ps_curr_ctxt->u1_intrapred_chroma_mode = 0; ps_curr_ctxt->u1_intrapred_chroma_mode = 0;
ps_curr_ctxt->u1_cbp = cbp; ps_curr_ctxt->u1_cbp = cbp;
ps_ent_ctxt->pv_mb_header_data = ((WORD8 *)ps_ent_ctxt->pv_mb_header_data) + byte_count; ps_ent_ctxt->pv_mb_header_data = pu1_byte;
return IH264E_SUCCESS; return IH264E_SUCCESS;
} }
} }

View file

@ -959,6 +959,7 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* packed header data */ /* packed header data */
UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb header info */ /* mb header info */
/* /*
@ -986,9 +987,9 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/********************************************************************/ /********************************************************************/
/* mb header info */ /* mb header info */
mb_tpm = *pu1_byte++; mb_tpm = ps_mb_hdr->u1_mb_type_mode;
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = *pu1_byte++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* mb type */ /* mb type */
mb_type = mb_tpm & 0xF; mb_type = mb_tpm & 0xF;
@ -1009,9 +1010,13 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i16x16_t);
} }
else if (mb_type == I4x4) else if (mb_type == I4x4)
{ {
mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */ /* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode; WORD32 intra_pred_mode_flag, rem_intra_mode;
WORD32 byte; WORD32 byte;
@ -1024,7 +1029,7 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
for (i = 0; i < 16; i += 2) for (i = 0; i < 16; i += 2)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_byte++; byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
intra_pred_mode_flag = byte & 0x1; intra_pred_mode_flag = byte & 0x1;
@ -1056,11 +1061,14 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i4x4_t);
} }
else if (mb_type == I8x8) else if (mb_type == I8x8)
{ {
/* transform 8x8 flag */ /* transform 8x8 flag */
UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag; UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag;
mb_hdr_i8x8_t *ps_mb_hdr_i8x8 = (mb_hdr_i8x8_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */ /* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode; WORD32 intra_pred_mode_flag, rem_intra_mode;
@ -1080,7 +1088,7 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_byte++; byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
intra_pred_mode_flag = byte & 0x1; intra_pred_mode_flag = byte & 0x1;
@ -1112,6 +1120,8 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i8x8_t);
} }
else else
{ {
@ -1181,6 +1191,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* packed header data */ /* packed header data */
UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb header info */ /* mb header info */
/* /*
@ -1211,7 +1222,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/********************************************************************/ /********************************************************************/
/* mb header info */ /* mb header info */
mb_tpm = *pu1_byte++; mb_tpm = ps_mb_hdr->u1_mb_type_mode;
/* mb type */ /* mb type */
mb_type = mb_tpm & 0xF; mb_type = mb_tpm & 0xF;
@ -1227,6 +1238,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
(*ps_ent_ctxt->pi4_mb_skip_run)++; (*ps_ent_ctxt->pi4_mb_skip_run)++;
/* store the index of the next mb syntax layer */ /* store the index of the next mb syntax layer */
pu1_byte += sizeof(mb_hdr_pskip_t);
ps_ent_ctxt->pv_mb_header_data = pu1_byte; ps_ent_ctxt->pv_mb_header_data = pu1_byte;
/* set nnz to zero */ /* set nnz to zero */
@ -1248,8 +1260,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
} }
/* remaining mb header info */ /* remaining mb header info */
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = *pu1_byte++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* mb skip run */ /* mb skip run */
PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run"); PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run");
@ -1278,9 +1290,12 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i16x16_t);
} }
else if (mb_type == I4x4) else if (mb_type == I4x4)
{ {
mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */ /* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode; WORD32 intra_pred_mode_flag, rem_intra_mode;
WORD32 byte; WORD32 byte;
@ -1296,7 +1311,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
for (i = 0; i < 16; i += 2) for (i = 0; i < 16; i += 2)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_byte++; byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
intra_pred_mode_flag = byte & 0x1; intra_pred_mode_flag = byte & 0x1;
@ -1328,9 +1343,13 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i4x4_t);
} }
else if (mb_type == I8x8) else if (mb_type == I8x8)
{ {
mb_hdr_i8x8_t *ps_mb_hdr_i8x8 = (mb_hdr_i8x8_t *)ps_ent_ctxt->pv_mb_header_data;
/* transform 8x8 flag */ /* transform 8x8 flag */
UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag; UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag;
@ -1355,7 +1374,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_byte++; byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
intra_pred_mode_flag = byte & 0x1; intra_pred_mode_flag = byte & 0x1;
@ -1387,14 +1406,18 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i8x8_t);
} }
else else
{ {
mb_hdr_p16x16_t *ps_mb_hdr_p16x16 = (mb_hdr_p16x16_t *)ps_ent_ctxt->pv_mb_header_data;
/* inter macro block partition cnt */ /* inter macro block partition cnt */
const UWORD8 au1_part_cnt[] = { 1, 2, 2, 4 }; const UWORD8 au1_part_cnt[] = { 1, 2, 2, 4 };
/* mv ptr */ /* mv ptr */
WORD16 *pi2_mv_ptr = (WORD16 *)pu1_byte; WORD16 *pi2_mv_ptr = (WORD16 *)ps_mb_hdr_p16x16->ai2_mv;
/* number of partitions for the current mb */ /* number of partitions for the current mb */
UWORD32 u4_part_cnt = au1_part_cnt[mb_type - 3]; UWORD32 u4_part_cnt = au1_part_cnt[mb_type - 3];
@ -1410,7 +1433,8 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
PUT_BITS_SEV(ps_bitstream, *pi2_mv_ptr++, error_status, "mv y"); PUT_BITS_SEV(ps_bitstream, *pi2_mv_ptr++, error_status, "mv y");
} }
pu1_byte = (UWORD8 *)pi2_mv_ptr; pu1_byte += sizeof(mb_hdr_p16x16_t);
} }
/* coded_block_pattern */ /* coded_block_pattern */
@ -1479,6 +1503,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* packed header data */ /* packed header data */
UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data; UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
mb_hdr_common_t *ps_mb_hdr = (mb_hdr_common_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb header info */ /* mb header info */
/* /*
@ -1508,7 +1533,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* BEGIN HEADER GENERATION */ /* BEGIN HEADER GENERATION */
/********************************************************************/ /********************************************************************/
mb_tpm = *pu1_byte++; mb_tpm = ps_mb_hdr->u1_mb_type_mode;
/* mb type */ /* mb type */
mb_type = mb_tpm & 0xF; mb_type = mb_tpm & 0xF;
@ -1524,6 +1549,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
(*ps_ent_ctxt->pi4_mb_skip_run)++; (*ps_ent_ctxt->pi4_mb_skip_run)++;
/* store the index of the next mb syntax layer */ /* store the index of the next mb syntax layer */
pu1_byte += sizeof(mb_hdr_bskip_t);
ps_ent_ctxt->pv_mb_header_data = pu1_byte; ps_ent_ctxt->pv_mb_header_data = pu1_byte;
/* set nnz to zero */ /* set nnz to zero */
@ -1547,8 +1573,8 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* remaining mb header info */ /* remaining mb header info */
cbp = *pu1_byte++; cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = *pu1_byte++; mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* mb skip run */ /* mb skip run */
PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run"); PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run");
@ -1577,9 +1603,13 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i16x16_t);
} }
else if (mb_type == I4x4) else if (mb_type == I4x4)
{ {
mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */ /* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode; WORD32 intra_pred_mode_flag, rem_intra_mode;
WORD32 byte; WORD32 byte;
@ -1595,7 +1625,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
for (i = 0; i < 16; i += 2) for (i = 0; i < 16; i += 2)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_byte++; byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
intra_pred_mode_flag = byte & 0x1; intra_pred_mode_flag = byte & 0x1;
@ -1627,9 +1657,13 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i4x4_t);
} }
else if (mb_type == I8x8) else if (mb_type == I8x8)
{ {
mb_hdr_i8x8_t *ps_mb_hdr_i8x8 = (mb_hdr_i8x8_t *)ps_ent_ctxt->pv_mb_header_data;
/* transform 8x8 flag */ /* transform 8x8 flag */
UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag; UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag;
@ -1654,7 +1688,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
/* sub blk idx 1 */ /* sub blk idx 1 */
byte = *pu1_byte++; byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
intra_pred_mode_flag = byte & 0x1; intra_pred_mode_flag = byte & 0x1;
@ -1686,21 +1720,24 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* intra_chroma_pred_mode */ /* intra_chroma_pred_mode */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode"); PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i8x8_t);
} }
else if(mb_type == BDIRECT) else if(mb_type == BDIRECT)
{ {
is_inter = 1; is_inter = 1;
/* write mb type */ /* write mb type */
PUT_BITS_UEV(ps_bitstream, B_DIRECT_16x16, error_status, "mb type"); PUT_BITS_UEV(ps_bitstream, B_DIRECT_16x16, error_status, "mb type");
pu1_byte += sizeof(mb_hdr_bdirect_t);
} }
else /* if mb_type == B16x16 */ else /* if mb_type == B16x16 */
{ {
mb_hdr_b16x16_t *ps_mb_hdr_b16x16 = (mb_hdr_b16x16_t *)ps_ent_ctxt->pv_mb_header_data;
/* inter macro block partition cnt for 16x16 16x8 8x16 8x8 */ /* inter macro block partition cnt for 16x16 16x8 8x16 8x8 */
const UWORD8 au1_part_cnt[] = { 1, 2, 2, 4 }; const UWORD8 au1_part_cnt[] = { 1, 2, 2, 4 };
/* mv ptr */
WORD16 *pi2_mvd_ptr = (WORD16 *)pu1_byte;
/* number of partitions for the current mb */ /* number of partitions for the current mb */
UWORD32 u4_part_cnt = au1_part_cnt[mb_type - B16x16]; UWORD32 u4_part_cnt = au1_part_cnt[mb_type - B16x16];
@ -1718,21 +1755,17 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
{ {
if (i4_mb_part_pred_mode != PRED_L1)/* || PRED_BI */ if (i4_mb_part_pred_mode != PRED_L1)/* || PRED_BI */
{ {
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l0 x"); PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[0][0], error_status, "mv l0 x");
pi2_mvd_ptr++; PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[0][1], error_status, "mv l0 y");
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l0 y");
pi2_mvd_ptr++;
} }
if (i4_mb_part_pred_mode != PRED_L0)/* || PRED_BI */ if (i4_mb_part_pred_mode != PRED_L0)/* || PRED_BI */
{ {
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l1 x"); PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[1][0], error_status, "mv l1 x");
pi2_mvd_ptr++; PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[1][1], error_status, "mv l1 y");
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l1 y");
pi2_mvd_ptr++;
} }
} }
pu1_byte = (UWORD8 *)pi2_mvd_ptr; pu1_byte += sizeof(mb_hdr_b16x16_t);
} }
/* coded_block_pattern */ /* coded_block_pattern */

View file

@ -652,18 +652,19 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
{ {
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_i4x4_t *ps_mb_hdr = (mb_hdr_i4x4_t *)ps_proc->pv_mb_header_data;
/* temp var */ /* temp var */
WORD32 i4, byte; WORD32 i4, byte;
/* mb type plus mode */ /* mb type plus mode */
*pu1_ptr++ = (ps_proc->u1_c_i8_mode << 6) + u4_mb_type; ps_mb_hdr->common.u1_mb_type_mode = (ps_proc->u1_c_i8_mode << 6) + u4_mb_type;
/* cbp */ /* cbp */
*pu1_ptr++ = ps_proc->u4_cbp; ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* mb qp delta */ /* mb qp delta */
*pu1_ptr++ = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev; ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;
/* sub mb modes */ /* sub mb modes */
for (i4 = 0; i4 < 16; i4 ++) for (i4 = 0; i4 < 16; i4 ++)
@ -710,63 +711,66 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
} }
} }
*pu1_ptr++ = byte; ps_mb_hdr->au1_sub_blk_modes[i4 >> 1] = byte;
} }
/* end of mb layer */ /* end of mb layer */
pu1_ptr += sizeof(mb_hdr_i4x4_t);
ps_proc->pv_mb_header_data = pu1_ptr; ps_proc->pv_mb_header_data = pu1_ptr;
} }
else if (u4_mb_type == I16x16) else if (u4_mb_type == I16x16)
{ {
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_i16x16_t *ps_mb_hdr = (mb_hdr_i16x16_t *)ps_proc->pv_mb_header_data;
/* mb type plus mode */ /* mb type plus mode */
*pu1_ptr++ = (ps_proc->u1_c_i8_mode << 6) + (ps_proc->u1_l_i16_mode << 4) + u4_mb_type; ps_mb_hdr->common.u1_mb_type_mode = (ps_proc->u1_c_i8_mode << 6) + (ps_proc->u1_l_i16_mode << 4) + u4_mb_type;
/* cbp */ /* cbp */
*pu1_ptr++ = ps_proc->u4_cbp; ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* mb qp delta */ /* mb qp delta */
*pu1_ptr++ = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev; ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;
/* end of mb layer */ /* end of mb layer */
pu1_ptr += sizeof(mb_hdr_i16x16_t);
ps_proc->pv_mb_header_data = pu1_ptr; ps_proc->pv_mb_header_data = pu1_ptr;
} }
else if (u4_mb_type == P16x16) else if (u4_mb_type == P16x16)
{ {
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_p16x16_t *ps_mb_hdr = (mb_hdr_p16x16_t *)ps_proc->pv_mb_header_data;
WORD16 *i2_mv_ptr; /* mb type */
ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
/* mb type plus mode */
*pu1_ptr++ = u4_mb_type;
/* cbp */ /* cbp */
*pu1_ptr++ = ps_proc->u4_cbp; ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* mb qp delta */ /* mb qp delta */
*pu1_ptr++ = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev; ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;
i2_mv_ptr = (WORD16 *)pu1_ptr; ps_mb_hdr->ai2_mv[0] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx - ps_proc->ps_pred_mv[0].s_mv.i2_mvx;
*i2_mv_ptr++ = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx - ps_proc->ps_pred_mv[0].s_mv.i2_mvx; ps_mb_hdr->ai2_mv[1] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy - ps_proc->ps_pred_mv[0].s_mv.i2_mvy;
*i2_mv_ptr++ = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy - ps_proc->ps_pred_mv[0].s_mv.i2_mvy;
/* end of mb layer */ /* end of mb layer */
ps_proc->pv_mb_header_data = i2_mv_ptr; pu1_ptr += sizeof(mb_hdr_p16x16_t);
ps_proc->pv_mb_header_data = pu1_ptr;
} }
else if (u4_mb_type == PSKIP) else if (u4_mb_type == PSKIP)
{ {
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_pskip_t *ps_mb_hdr = (mb_hdr_pskip_t *)ps_proc->pv_mb_header_data;
/* mb type plus mode */ /* mb type */
*pu1_ptr++ = u4_mb_type; ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
/* end of mb layer */ /* end of mb layer */
pu1_ptr += sizeof(mb_hdr_pskip_t);
ps_proc->pv_mb_header_data = pu1_ptr; ps_proc->pv_mb_header_data = pu1_ptr;
} }
else if(u4_mb_type == B16x16) else if(u4_mb_type == B16x16)
@ -774,58 +778,59 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_b16x16_t *ps_mb_hdr = (mb_hdr_b16x16_t *)ps_proc->pv_mb_header_data;
WORD16 *i2_mv_ptr;
UWORD32 u4_pred_mode = ps_proc->ps_pu->b2_pred_mode; UWORD32 u4_pred_mode = ps_proc->ps_pu->b2_pred_mode;
/* mb type plus mode */ /* mb type plus mode */
*pu1_ptr++ = (u4_pred_mode << 4) + u4_mb_type; ps_mb_hdr->common.u1_mb_type_mode = (u4_pred_mode << 4) + u4_mb_type;
/* cbp */ /* cbp */
*pu1_ptr++ = ps_proc->u4_cbp; ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* mb qp delta */ /* mb qp delta */
*pu1_ptr++ = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev; ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;
/* l0 & l1 me data */ /* l0 & l1 me data */
i2_mv_ptr = (WORD16 *)pu1_ptr;
if (u4_pred_mode != PRED_L1) if (u4_pred_mode != PRED_L1)
{ {
*i2_mv_ptr++ = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx ps_mb_hdr->ai2_mv[0][0] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx
- ps_proc->ps_pred_mv[0].s_mv.i2_mvx; - ps_proc->ps_pred_mv[0].s_mv.i2_mvx;
*i2_mv_ptr++ = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy ps_mb_hdr->ai2_mv[0][1] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy
- ps_proc->ps_pred_mv[0].s_mv.i2_mvy; - ps_proc->ps_pred_mv[0].s_mv.i2_mvy;
} }
if (u4_pred_mode != PRED_L0) if (u4_pred_mode != PRED_L0)
{ {
*i2_mv_ptr++ = ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvx ps_mb_hdr->ai2_mv[1][0] = ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvx
- ps_proc->ps_pred_mv[1].s_mv.i2_mvx; - ps_proc->ps_pred_mv[1].s_mv.i2_mvx;
*i2_mv_ptr++ = ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvy ps_mb_hdr->ai2_mv[1][1] = ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvy
- ps_proc->ps_pred_mv[1].s_mv.i2_mvy; - ps_proc->ps_pred_mv[1].s_mv.i2_mvy;
} }
/* end of mb layer */ /* end of mb layer */
ps_proc->pv_mb_header_data = i2_mv_ptr; pu1_ptr += sizeof(mb_hdr_b16x16_t);
ps_proc->pv_mb_header_data = pu1_ptr;
} }
else if(u4_mb_type == BDIRECT) else if(u4_mb_type == BDIRECT)
{ {
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_bdirect_t *ps_mb_hdr = (mb_hdr_bdirect_t *)ps_proc->pv_mb_header_data;
/* mb type plus mode */ /* mb type plus mode */
*pu1_ptr++ = u4_mb_type; ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
/* cbp */ /* cbp */
*pu1_ptr++ = ps_proc->u4_cbp; ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* mb qp delta */ /* mb qp delta */
*pu1_ptr++ = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev; ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;
/* end of mb layer */
pu1_ptr += sizeof(mb_hdr_bdirect_t);
ps_proc->pv_mb_header_data = pu1_ptr; ps_proc->pv_mb_header_data = pu1_ptr;
} }
@ -835,11 +840,13 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
/* pointer to mb header storage space */ /* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data; UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
mb_hdr_bskip_t *ps_mb_hdr = (mb_hdr_bskip_t *)ps_proc->pv_mb_header_data;
/* mb type plus mode */ /* mb type plus mode */
*pu1_ptr++ = (u4_pred_mode << 4) + u4_mb_type; ps_mb_hdr->common.u1_mb_type_mode = (u4_pred_mode << 4) + u4_mb_type;
/* end of mb layer */ /* end of mb layer */
pu1_ptr += sizeof(mb_hdr_bskip_t);
ps_proc->pv_mb_header_data = pu1_ptr; ps_proc->pv_mb_header_data = pu1_ptr;
} }

View file

@ -1149,6 +1149,184 @@ typedef struct
}mb_info_t; }mb_info_t;
/**
******************************************************************************
* @brief mb_hdr structures to access first few common elements of above
* structures
******************************************************************************
*/
typedef struct
{
/**
* mb type and mode
*/
UWORD8 u1_mb_type_mode;
/**
* CBP
*/
UWORD8 u1_cbp;
/**
* MB qp delta
*/
UWORD8 u1_mb_qp_delta;
/**
* Element to align structure to 2 byte boundary
*/
UWORD8 u1_pad;
}mb_hdr_common_t;
/**
******************************************************************************
* @brief macro block info for I4x4 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* Sub block modes, 2 modes per byte
*/
UWORD8 au1_sub_blk_modes[8];
}mb_hdr_i4x4_t;
/**
******************************************************************************
* @brief macro block info for I8x8 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* Sub block modes, 2 modes per byte
*/
UWORD8 au1_sub_blk_modes[2];
}mb_hdr_i8x8_t;
/**
******************************************************************************
* @brief macro block info for I16x16 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_i16x16_t;
/**
******************************************************************************
* @brief macro block info for P16x16 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* MV
*/
WORD16 ai2_mv[2];
}mb_hdr_p16x16_t;
/**
******************************************************************************
* @brief macro block info for PSKIP MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_pskip_t;
/**
******************************************************************************
* @brief macro block info for B16x16 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* MV
*/
WORD16 ai2_mv[2][2];
}mb_hdr_b16x16_t;
/**
******************************************************************************
* @brief macro block info for BDIRECT MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_bdirect_t;
/**
******************************************************************************
* @brief macro block info for PSKIP MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_bskip_t;
/**
******************************************************************************
* @brief Union of mb_hdr structures for size calculation
* and to access first few common elements
******************************************************************************
*/
typedef union
{
mb_hdr_i4x4_t mb_hdr_i4x4;
mb_hdr_i8x8_t mb_hdr_i8x8;
mb_hdr_i16x16_t mb_hdr_i16x16;
mb_hdr_p16x16_t mb_hdr_p16x16;
mb_hdr_pskip_t mb_hdr_pskip;
mb_hdr_b16x16_t mb_hdr_b16x16;
mb_hdr_bdirect_t mb_hdr_bdirect;
mb_hdr_bskip_t mb_hdr_bskip;
}mb_hdr_t;
/** /**
****************************************************************************** ******************************************************************************
* @brief structure presenting the neighbor availability of a mb * @brief structure presenting the neighbor availability of a mb