Merge "Encoder: Defined structures for accessing MB header data"
This commit is contained in:
commit
8aa140b8a5
5 changed files with 349 additions and 126 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue