diff --git a/encoder/ih264e_api.c b/encoder/ih264e_api.c index 1c9a48b..415dd01 100644 --- a/encoder/ih264e_api.c +++ b/encoder/ih264e_api.c @@ -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; diff --git a/encoder/ih264e_cabac_encode.c b/encoder/ih264e_cabac_encode.c index ecc30f5..e49ab58 100644 --- a/encoder/ih264e_cabac_encode.c +++ b/encoder/ih264e_cabac_encode.c @@ -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; } } diff --git a/encoder/ih264e_cavlc.c b/encoder/ih264e_cavlc.c index 7491480..ed34a43 100644 --- a/encoder/ih264e_cavlc.c +++ b/encoder/ih264e_cavlc.c @@ -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 */ diff --git a/encoder/ih264e_process.c b/encoder/ih264e_process.c index fce7e35..ae178c6 100644 --- a/encoder/ih264e_process.c +++ b/encoder/ih264e_process.c @@ -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; } diff --git a/encoder/ih264e_structs.h b/encoder/ih264e_structs.h index 074731e..cedd66c 100644 --- a/encoder/ih264e_structs.h +++ b/encoder/ih264e_structs.h @@ -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