Merge "Encoder: Defined structures for accessing MB header data"

This commit is contained in:
Ray Essick 2016-11-29 14:27:07 +00:00 committed by Gerrit Code Review
commit 8aa140b8a5
5 changed files with 349 additions and 126 deletions

View file

@ -3796,7 +3796,7 @@ static WORD32 ih264e_init_mem_rec(iv_obj_t *ps_codec_obj,
UWORD8 *pu1_buf = ps_mem_rec->pv_base;
/* size of header data of 1 mb */
size = 40;
size = sizeof(mb_hdr_t);
/* size for 1 row of mbs */
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)
{
/* sub blk idx 1 */
byte = *pu1_intra_4x4_modes++;
byte = pu1_intra_4x4_modes[i >> 1];
if (byte & 0x1)
{
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_x_a = (UWORD16) pu1_lft_mv_ctxt[0];
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,
(UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
ps_cabac_ctxt);
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,
(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));
}
/***************************************************************/
/* 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_x_a = (UWORD16) pu1_lft_mv_ctxt[2];
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,
(UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
ps_cabac_ctxt);
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,
(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;
/* packed 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;
WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
WORD8 mb_qp_delta;
UWORD32 u4_cbp_l, u4_cbp_c;
WORD32 byte_count = 0;
WORD32 bitstream_start_offset, bitstream_end_offset;
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);
}
/* mb header info */
mb_tpm = *pu1_byte++;
byte_count++;
cbp = *pu1_byte++;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
mb_tpm = ps_mb_hdr->u1_mb_type_mode;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* mb type */
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);
if (mb_type == I4x4)
{ /* Encode 4x4 MB modes */
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte);
byte_count += 8;
{
/* Encode 4x4 MB modes */
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 */
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_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16);
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)
{
ps_curr_ctxt->u1_mb_type = CAB_I16x16;
pu1_byte += sizeof(mb_hdr_i16x16_t);
}
else
{
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;
}
@ -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;
WORD8 mb_qp_delta;
UWORD32 u4_cbp_l, u4_cbp_c;
WORD32 byte_count = 0;
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)
>= 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);
}
/* mb header info */
mb_tpm = *pu1_byte++;
byte_count++;
mb_tpm = ps_mb_hdr->u1_mb_type_mode;
/* mb type */
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 (mb_type == I16x16 || mb_type == I4x4)
{
cbp = *pu1_byte++;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* Starting bitstream offset for header in bits */
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)
{ /* Intra 4x4 modes */
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte);
byte_count += 8;
{
/* Intra 4x4 modes */
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);
@ -1901,13 +1900,15 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
if (mb_type == I16x16)
{
ps_curr_ctxt->u1_mb_type = CAB_I16x16;
pu1_byte += sizeof(mb_hdr_i16x16_t);
}
else
{
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;
}
@ -1918,10 +1919,9 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* Encoding P16x16 */
if (mb_type != PSKIP)
{
cbp = *pu1_byte++;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
mb_hdr_p16x16_t *ps_mb_hdr_p16x16 = (mb_hdr_p16x16_t *)ps_ent_ctxt->pv_mb_header_data;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* Encoding mb_skip */
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;
{
WORD16 *pi2_mv_ptr = (WORD16 *) pu1_byte;
byte_count += 4;
WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_p16x16->ai2_mv;
ps_curr_ctxt->u1_mb_type = (ps_curr_ctxt->u1_mb_type
| CAB_NON_BD16x16);
/* 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 */
bitstream_start_offset = bitstream_end_offset;
pu1_byte += sizeof(mb_hdr_p16x16_t);
}
else/* MB = PSKIP */
{
@ -1978,6 +1980,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
- bitstream_start_offset;
/* Starting bitstream offset for residue */
pu1_byte += sizeof(mb_hdr_pskip_t);
}
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_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;
}
}
@ -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;
WORD8 mb_qp_delta;
UWORD32 u4_cbp_l, u4_cbp_c;
WORD32 byte_count = 0;
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)
>= 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);
}
/* mb header info */
mb_tpm = *pu1_byte++;
byte_count++;
mb_tpm = ps_mb_hdr->u1_mb_type_mode;
/* mb type */
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 (mb_type == I16x16 || mb_type == I4x4)
{
cbp = *pu1_byte++;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* Starting bitstream offset for header in bits */
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)
{ /* Intra 4x4 modes */
ih264e_cabac_enc_4x4mb_modes(ps_cabac_ctxt, pu1_byte);
byte_count += 8;
{
/* Intra 4x4 modes */
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);
@ -2206,13 +2208,15 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
if (mb_type == I16x16)
{
ps_curr_ctxt->u1_mb_type = CAB_I16x16;
pu1_byte += sizeof(mb_hdr_i16x16_t);
}
else
{
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;
}
@ -2224,10 +2228,9 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt)
/* Encoding B_Direct_16x16 */
if (mb_type == BDIRECT)
{
cbp = *pu1_byte++;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* Encoding mb_skip */
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;
/* Starting bitstream offset for residue */
pu1_byte += sizeof(mb_hdr_bdirect_t);
}
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;
/* 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 */
{
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);
UWORD32 u4_mb_type = mb_type - B16x16 + B_L0_16x16
+ i4_mb_part_pred_mode;
cbp = *pu1_byte++;
byte_count++;
mb_qp_delta = *pu1_byte++;
byte_count++;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* Encoding mb_skip */
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;
{
WORD16 *pi2_mv_ptr = (WORD16 *) pu1_byte;
WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_b16x16->ai2_mv;
/* 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
| CAB_NON_BD16x16);
/* 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;
/* Starting bitstream offset for residue */
bitstream_start_offset = bitstream_end_offset;
pu1_byte += sizeof(mb_hdr_b16x16_t);
}
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_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;
}
}

View file

@ -959,6 +959,7 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* packed 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 */
/*
@ -986,9 +987,9 @@ IH264E_ERROR_T ih264e_write_islice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/********************************************************************/
/* mb header info */
mb_tpm = *pu1_byte++;
cbp = *pu1_byte++;
mb_qp_delta = *pu1_byte++;
mb_tpm = ps_mb_hdr->u1_mb_type_mode;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* mb type */
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 */
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)
{
mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode;
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)
{
/* sub blk idx 1 */
byte = *pu1_byte++;
byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
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 */
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)
{
/* transform 8x8 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 */
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++)
{
/* sub blk idx 1 */
byte = *pu1_byte++;
byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
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 */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i8x8_t);
}
else
{
@ -1181,6 +1191,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* packed 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 */
/*
@ -1211,7 +1222,7 @@ IH264E_ERROR_T ih264e_write_pslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/********************************************************************/
/* mb header info */
mb_tpm = *pu1_byte++;
mb_tpm = ps_mb_hdr->u1_mb_type_mode;
/* mb type */
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)++;
/* 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;
/* 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 */
cbp = *pu1_byte++;
mb_qp_delta = *pu1_byte++;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* 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 */
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)
{
mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode;
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)
{
/* sub blk idx 1 */
byte = *pu1_byte++;
byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
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 */
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)
{
mb_hdr_i8x8_t *ps_mb_hdr_i8x8 = (mb_hdr_i8x8_t *)ps_ent_ctxt->pv_mb_header_data;
/* transform 8x8 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++)
{
/* sub blk idx 1 */
byte = *pu1_byte++;
byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
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 */
PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
pu1_byte += sizeof(mb_hdr_i8x8_t);
}
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 */
const UWORD8 au1_part_cnt[] = { 1, 2, 2, 4 };
/* 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 */
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");
}
pu1_byte = (UWORD8 *)pi2_mv_ptr;
pu1_byte += sizeof(mb_hdr_p16x16_t);
}
/* coded_block_pattern */
@ -1479,6 +1503,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* packed 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 */
/*
@ -1508,7 +1533,7 @@ IH264E_ERROR_T ih264e_write_bslice_mb_cavlc(entropy_ctxt_t *ps_ent_ctxt)
/* BEGIN HEADER GENERATION */
/********************************************************************/
mb_tpm = *pu1_byte++;
mb_tpm = ps_mb_hdr->u1_mb_type_mode;
/* mb type */
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)++;
/* 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;
/* 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 */
cbp = *pu1_byte++;
mb_qp_delta = *pu1_byte++;
cbp = ps_mb_hdr->u1_cbp;
mb_qp_delta = ps_mb_hdr->u1_mb_qp_delta;
/* 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 */
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)
{
mb_hdr_i4x4_t *ps_mb_hdr_i4x4 = (mb_hdr_i4x4_t *)ps_ent_ctxt->pv_mb_header_data;
/* mb sub blk modes */
WORD32 intra_pred_mode_flag, rem_intra_mode;
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)
{
/* sub blk idx 1 */
byte = *pu1_byte++;
byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
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 */
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)
{
mb_hdr_i8x8_t *ps_mb_hdr_i8x8 = (mb_hdr_i8x8_t *)ps_ent_ctxt->pv_mb_header_data;
/* transform 8x8 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++)
{
/* sub blk idx 1 */
byte = *pu1_byte++;
byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
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 */
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)
{
is_inter = 1;
/* write 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 */
{
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 */
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 */
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 */
{
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l0 x");
pi2_mvd_ptr++;
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l0 y");
pi2_mvd_ptr++;
PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[0][0], error_status, "mv l0 x");
PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[0][1], error_status, "mv l0 y");
}
if (i4_mb_part_pred_mode != PRED_L0)/* || PRED_BI */
{
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l1 x");
pi2_mvd_ptr++;
PUT_BITS_SEV(ps_bitstream, *pi2_mvd_ptr, error_status, "mv l1 y");
pi2_mvd_ptr++;
PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[1][0], error_status, "mv l1 x");
PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mv[1][1], error_status, "mv l1 y");
}
}
pu1_byte = (UWORD8 *)pi2_mvd_ptr;
pu1_byte += sizeof(mb_hdr_b16x16_t);
}
/* coded_block_pattern */

View file

@ -651,18 +651,19 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
{
/* pointer to mb header storage space */
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 */
WORD32 i4, byte;
/* 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 */
*pu1_ptr++ = ps_proc->u4_cbp;
ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* 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 */
for (i4 = 0; i4 < 16; i4 ++)
@ -709,63 +710,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 */
pu1_ptr += sizeof(mb_hdr_i4x4_t);
ps_proc->pv_mb_header_data = pu1_ptr;
}
else if (u4_mb_type == I16x16)
{
/* pointer to mb header storage space */
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 */
*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 */
*pu1_ptr++ = ps_proc->u4_cbp;
ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* 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_i16x16_t);
ps_proc->pv_mb_header_data = pu1_ptr;
}
else if (u4_mb_type == P16x16)
{
/* pointer to mb header storage space */
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 plus mode */
*pu1_ptr++ = u4_mb_type;
/* mb type */
ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
/* cbp */
*pu1_ptr++ = ps_proc->u4_cbp;
ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* 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;
*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;
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;
/* 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)
{
/* pointer to mb header storage space */
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 */
*pu1_ptr++ = u4_mb_type;
/* mb type */
ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
/* end of mb layer */
pu1_ptr += sizeof(mb_hdr_pskip_t);
ps_proc->pv_mb_header_data = pu1_ptr;
}
else if(u4_mb_type == B16x16)
@ -773,58 +777,59 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
/* pointer to mb header storage space */
UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
WORD16 *i2_mv_ptr;
mb_hdr_b16x16_t *ps_mb_hdr = (mb_hdr_b16x16_t *)ps_proc->pv_mb_header_data;
UWORD32 u4_pred_mode = ps_proc->ps_pu->b2_pred_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 */
*pu1_ptr++ = ps_proc->u4_cbp;
ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* 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 */
i2_mv_ptr = (WORD16 *)pu1_ptr;
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;
*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;
}
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;
*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;
}
/* 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)
{
/* pointer to mb header storage space */
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 */
*pu1_ptr++ = u4_mb_type;
ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
/* cbp */
*pu1_ptr++ = ps_proc->u4_cbp;
ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
/* 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;
}
@ -834,11 +839,13 @@ IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
/* pointer to mb header storage space */
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 */
*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 */
pu1_ptr += sizeof(mb_hdr_bskip_t);
ps_proc->pv_mb_header_data = pu1_ptr;
}

View file

@ -1146,6 +1146,184 @@ typedef struct
}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