From c7d9c91417bf69c783f390e48dbbe7aafb45bbda Mon Sep 17 00:00:00 2001 From: Harish Mahendrakar Date: Wed, 23 Nov 2016 13:30:39 +0530 Subject: [PATCH] Encoder: Defined structures for accessing MB header data Instead of using hard coded address offsets, defined structures to access MB Header for each MB type This improves readability of the code Also helps in maintaining required alignment for MV MV elements need to be aligned to 2 byte boundary Unaligned accesses result in undefined behavior Bug: 33073518 Test: Tested with -fsanitize=alignment enabled on avcenc Change-Id: I51c009b7deded76315a4bf2880444d21ae7d517f --- encoder/ih264e_api.c | 2 +- encoder/ih264e_cabac_encode.c | 125 ++++++++++++------------ encoder/ih264e_cavlc.c | 91 +++++++++++------ encoder/ih264e_process.c | 79 ++++++++------- encoder/ih264e_structs.h | 178 ++++++++++++++++++++++++++++++++++ 5 files changed, 349 insertions(+), 126 deletions(-) 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