mirror of
https://github.com/ittiam-systems/libhevc.git
synced 2026-04-02 20:30:49 +07:00
hevcdec: add support for internal color format 444
Change-Id: I013e44e024258f2f84690fdcc01b4cd52f0fbd18
This commit is contained in:
parent
135285ae8a
commit
29611400fa
12 changed files with 266 additions and 120 deletions
|
|
@ -103,7 +103,8 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
WORD32 nt,
|
||||
WORD32 nbr_flags,
|
||||
UWORD8 *pu1_dst,
|
||||
WORD32 dst_strd)
|
||||
WORD32 dst_strd,
|
||||
WORD32 chroma_format_idc)
|
||||
{
|
||||
UWORD8 pu1_ref_u, pu1_ref_v;
|
||||
WORD32 dc_val, i, j;
|
||||
|
|
@ -180,7 +181,7 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
// U-V interleaved Top-top right samples
|
||||
}
|
||||
|
||||
if(nt == 4)
|
||||
if(nt == 4 || (nt == 8 && chroma_format_idc == CHROMA_FMT_IDC_YUV444))
|
||||
{
|
||||
/* 1 bit extraction for all the neighboring blocks */
|
||||
tp_left = (nbr_flags & 0x10000) >> 16;
|
||||
|
|
@ -248,8 +249,9 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
|
||||
}
|
||||
}
|
||||
else if(nt == 8)
|
||||
else if(nt == 8 || (nt == 16 && chroma_format_idc == CHROMA_FMT_IDC_YUV444))
|
||||
{
|
||||
WORD32 sub_sample = chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 2 : 1;
|
||||
WORD32 nbr_flags_temp = 0;
|
||||
nbr_flags_temp = ((nbr_flags & 0xC) >> 2) + ((nbr_flags & 0xC0) >> 4)
|
||||
+ ((nbr_flags & 0x300) >> 4)
|
||||
|
|
@ -259,16 +261,16 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
/* compute trailing zeors based on nbr_flag for substitution process of below left see section .*/
|
||||
/* as each bit in nbr flags corresponds to 8 pels for bot_left, left, top and topright but 1 pel for topleft */
|
||||
{
|
||||
nbr_id_from_bl = look_up_trailing_zeros(nbr_flags_temp & 0XF) * 4; /* for bottom left and left */
|
||||
if(nbr_id_from_bl == 32)
|
||||
nbr_id_from_bl = 16;
|
||||
if(nbr_id_from_bl == 16)
|
||||
nbr_id_from_bl = look_up_trailing_zeros(nbr_flags_temp & 0XF) * (4 * sub_sample); /* for bottom left and left */
|
||||
if(nbr_id_from_bl == 32 * sub_sample)
|
||||
nbr_id_from_bl = 16 * sub_sample;
|
||||
if(nbr_id_from_bl == 16 * sub_sample)
|
||||
{
|
||||
/* for top left : 1 pel per nbr bit */
|
||||
if(!((nbr_flags_temp >> 8) & 0x1))
|
||||
{
|
||||
nbr_id_from_bl++;
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags_temp >> 4) & 0xF) * 4; /* top and top right; 8 pels per nbr bit */
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags_temp >> 4) & 0xF) * 4 * sub_sample; /* top and top right; 8 pels per nbr bit */
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -287,14 +289,14 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
}
|
||||
|
||||
/* for the loop of 4*Nt+1 pixels (excluding pixels computed from reverse substitution) */
|
||||
while(nbr_id_from_bl < ((T8C_4NT)+1))
|
||||
while(nbr_id_from_bl < ((T8C_4NT * sub_sample)+1))
|
||||
{
|
||||
/* To Obtain the next unavailable idx flag after reverse neighbor substitution */
|
||||
/* Divide by 8 to obtain the original index */
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> 2); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> (chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 3 : 2)); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
|
||||
/* The Top-left flag is at the last bit location of nbr_flags*/
|
||||
if(nbr_id_from_bl == (T8C_4NT / 2))
|
||||
if(nbr_id_from_bl == (T8C_4NT * sub_sample / 2))
|
||||
{
|
||||
get_bits = GET_BIT(nbr_flags_temp, 8);
|
||||
|
||||
|
|
@ -313,22 +315,23 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
UWORD16 *pu2_dst;
|
||||
/* 8 pel substitution (other than TL) */
|
||||
pu2_dst = (UWORD16 *)&pu1_dst[(2 * nbr_id_from_bl) - 2];
|
||||
ihevc_memset_16bit_a9q((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4);
|
||||
ihevc_memset_16bit_a9q((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4 * sub_sample);
|
||||
}
|
||||
|
||||
}
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T8C_4NT / 2)) ? 1 : 4;
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T8C_4NT * sub_sample / 2)) ? 1 : 4 * sub_sample;
|
||||
}
|
||||
|
||||
}
|
||||
else if(nt == 16)
|
||||
else if(nt == 16 || (nt == 32 && chroma_format_idc == CHROMA_FMT_IDC_YUV444))
|
||||
{
|
||||
WORD32 sub_sample = chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 2 : 1;
|
||||
/* compute trailing ones based on mbr_flag for substitution process of below left see section .*/
|
||||
/* as each bit in nbr flags corresponds to 4 pels for bot_left, left, top and topright but 1 pel for topleft */
|
||||
{
|
||||
nbr_id_from_bl = look_up_trailing_zeros((nbr_flags & 0XFF)) * 4; /* for bottom left and left */
|
||||
nbr_id_from_bl = look_up_trailing_zeros((nbr_flags & 0XFF)) * 4 * sub_sample; /* for bottom left and left */
|
||||
|
||||
if(nbr_id_from_bl == 32)
|
||||
if(nbr_id_from_bl == 32 * sub_sample)
|
||||
{
|
||||
/* for top left : 1 pel per nbr bit */
|
||||
if(!((nbr_flags >> 16) & 0x1))
|
||||
|
|
@ -336,7 +339,7 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
/* top left not available */
|
||||
nbr_id_from_bl++;
|
||||
/* top and top right; 4 pels per nbr bit */
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags >> 8) & 0xFF) * 4;
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags >> 8) & 0xFF) * 4 * sub_sample;
|
||||
}
|
||||
}
|
||||
/* Reverse Substitution Process*/
|
||||
|
|
@ -354,14 +357,14 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
}
|
||||
|
||||
/* for the loop of 4*Nt+1 pixels (excluding pixels computed from reverse substitution) */
|
||||
while(nbr_id_from_bl < ((T16C_4NT)+1))
|
||||
while(nbr_id_from_bl < ((T16C_4NT * sub_sample)+1))
|
||||
{
|
||||
/* To Obtain the next unavailable idx flag after reverse neighbor substitution */
|
||||
/* Devide by 4 to obtain the original index */
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> 2); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> (chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 3 : 2)); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
|
||||
/* The Top-left flag is at the last bit location of nbr_flags*/
|
||||
if(nbr_id_from_bl == (T16C_4NT / 2))
|
||||
if(nbr_id_from_bl == (T16C_4NT * sub_sample / 2))
|
||||
{
|
||||
get_bits = GET_BIT(nbr_flags, 16);
|
||||
/* only pel substitution for TL */
|
||||
|
|
@ -379,11 +382,11 @@ void ihevc_intra_pred_chroma_ref_substitution_a9q(UWORD8 *pu1_top_left,
|
|||
UWORD16 *pu2_dst;
|
||||
/* 4 pel substitution (other than TL) */
|
||||
pu2_dst = (UWORD16 *)&pu1_dst[(2 * nbr_id_from_bl) - 2];
|
||||
ihevc_memset_16bit_a9q((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4);
|
||||
ihevc_memset_16bit_a9q((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4 * sub_sample);
|
||||
}
|
||||
|
||||
}
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T16C_4NT / 2)) ? 1 : 4;
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T16C_4NT * sub_sample / 2)) ? 1 : 4 * sub_sample;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,7 +126,8 @@ typedef void ihevc_intra_pred_chroma_ref_substitution_ft(UWORD8 *pu1_top_left,
|
|||
WORD32 nt,
|
||||
WORD32 nbr_flags,
|
||||
UWORD8 *pu1_dst,
|
||||
WORD32 dst_strd);
|
||||
WORD32 dst_strd,
|
||||
WORD32 chroma_format_idc);
|
||||
|
||||
typedef void ihevc_intra_pred_chroma_ref_filtering_ft(UWORD8 *pu1_src,
|
||||
WORD32 nt,
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@
|
|||
|
||||
#include "ihevc_typedefs.h"
|
||||
#include "ihevc_macros.h"
|
||||
#include "ihevc_defs.h"
|
||||
#include "ihevc_func_selector.h"
|
||||
#include "ihevc_platform_macros.h"
|
||||
#include "ihevc_intra_pred.h"
|
||||
|
|
@ -129,7 +130,8 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
WORD32 nt,
|
||||
WORD32 nbr_flags,
|
||||
UWORD8 *pu1_dst,
|
||||
WORD32 dst_strd)
|
||||
WORD32 dst_strd,
|
||||
WORD32 chroma_format_idc)
|
||||
{
|
||||
UWORD8 pu1_ref_u, pu1_ref_v;
|
||||
WORD32 dc_val, i, j;
|
||||
|
|
@ -206,7 +208,7 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
// U-V interleaved Top-top right samples
|
||||
}
|
||||
|
||||
if(nt == 4)
|
||||
if(nt == 4 || (nt == 8 && chroma_format_idc == CHROMA_FMT_IDC_YUV444))
|
||||
{
|
||||
/* 1 bit extraction for all the neighboring blocks */
|
||||
tp_left = (nbr_flags & 0x10000) >> 16;
|
||||
|
|
@ -274,8 +276,9 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
|
||||
}
|
||||
}
|
||||
else if(nt == 8)
|
||||
else if(nt == 8 || (nt == 16 && chroma_format_idc == CHROMA_FMT_IDC_YUV444))
|
||||
{
|
||||
WORD32 sub_sample = chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 2 : 1;
|
||||
WORD32 nbr_flags_temp = 0;
|
||||
nbr_flags_temp = ((nbr_flags & 0xC) >> 2) + ((nbr_flags & 0xC0) >> 4)
|
||||
+ ((nbr_flags & 0x300) >> 4)
|
||||
|
|
@ -285,16 +288,16 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
/* compute trailing zeors based on nbr_flag for substitution process of below left see section .*/
|
||||
/* as each bit in nbr flags corresponds to 8 pels for bot_left, left, top and topright but 1 pel for topleft */
|
||||
{
|
||||
nbr_id_from_bl = look_up_trailing_zeros(nbr_flags_temp & 0XF) * 4; /* for bottom left and left */
|
||||
if(nbr_id_from_bl == 32)
|
||||
nbr_id_from_bl = 16;
|
||||
if(nbr_id_from_bl == 16)
|
||||
nbr_id_from_bl = look_up_trailing_zeros(nbr_flags_temp & 0XF) * (4 * sub_sample); /* for bottom left and left */
|
||||
if(nbr_id_from_bl == 32 * sub_sample)
|
||||
nbr_id_from_bl = 16 * sub_sample;
|
||||
if(nbr_id_from_bl == 16 * sub_sample)
|
||||
{
|
||||
/* for top left : 1 pel per nbr bit */
|
||||
if(!((nbr_flags_temp >> 8) & 0x1))
|
||||
{
|
||||
nbr_id_from_bl++;
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags_temp >> 4) & 0xF) * 4; /* top and top right; 8 pels per nbr bit */
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags_temp >> 4) & 0xF) * 4 * sub_sample; /* top and top right; 8 pels per nbr bit */
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -313,14 +316,14 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
}
|
||||
|
||||
/* for the loop of 4*Nt+1 pixels (excluding pixels computed from reverse substitution) */
|
||||
while(nbr_id_from_bl < ((T8C_4NT)+1))
|
||||
while(nbr_id_from_bl < ((T8C_4NT * sub_sample)+1))
|
||||
{
|
||||
/* To Obtain the next unavailable idx flag after reverse neighbor substitution */
|
||||
/* Divide by 8 to obtain the original index */
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> 2); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> (chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 3 : 2)); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
|
||||
/* The Top-left flag is at the last bit location of nbr_flags*/
|
||||
if(nbr_id_from_bl == (T8C_4NT / 2))
|
||||
if(nbr_id_from_bl == (T8C_4NT * sub_sample / 2))
|
||||
{
|
||||
get_bits = GET_BIT(nbr_flags_temp, 8);
|
||||
|
||||
|
|
@ -339,22 +342,23 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
UWORD16 *pu2_dst;
|
||||
/* 8 pel substitution (other than TL) */
|
||||
pu2_dst = (UWORD16 *)&pu1_dst[(2 * nbr_id_from_bl) - 2];
|
||||
ihevc_memset_16bit((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4);
|
||||
ihevc_memset_16bit((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4 * sub_sample);
|
||||
}
|
||||
|
||||
}
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T8C_4NT / 2)) ? 1 : 4;
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T8C_4NT * sub_sample / 2)) ? 1 : 4 * sub_sample;
|
||||
}
|
||||
|
||||
}
|
||||
else if(nt == 16)
|
||||
else if(nt == 16 || (nt == 32 && chroma_format_idc == CHROMA_FMT_IDC_YUV444))
|
||||
{
|
||||
WORD32 sub_sample = chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 2 : 1;
|
||||
/* compute trailing ones based on mbr_flag for substitution process of below left see section .*/
|
||||
/* as each bit in nbr flags corresponds to 4 pels for bot_left, left, top and topright but 1 pel for topleft */
|
||||
{
|
||||
nbr_id_from_bl = look_up_trailing_zeros((nbr_flags & 0XFF)) * 4; /* for bottom left and left */
|
||||
nbr_id_from_bl = look_up_trailing_zeros((nbr_flags & 0XFF)) * 4 * sub_sample; /* for bottom left and left */
|
||||
|
||||
if(nbr_id_from_bl == 32)
|
||||
if(nbr_id_from_bl == 32 * sub_sample)
|
||||
{
|
||||
/* for top left : 1 pel per nbr bit */
|
||||
if(!((nbr_flags >> 16) & 0x1))
|
||||
|
|
@ -362,7 +366,7 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
/* top left not available */
|
||||
nbr_id_from_bl++;
|
||||
/* top and top right; 4 pels per nbr bit */
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags >> 8) & 0xFF) * 4;
|
||||
nbr_id_from_bl += look_up_trailing_zeros((nbr_flags >> 8) & 0xFF) * 4 * sub_sample;
|
||||
}
|
||||
}
|
||||
/* Reverse Substitution Process*/
|
||||
|
|
@ -380,14 +384,14 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
}
|
||||
|
||||
/* for the loop of 4*Nt+1 pixels (excluding pixels computed from reverse substitution) */
|
||||
while(nbr_id_from_bl < ((T16C_4NT)+1))
|
||||
while(nbr_id_from_bl < ((T16C_4NT * sub_sample)+1))
|
||||
{
|
||||
/* To Obtain the next unavailable idx flag after reverse neighbor substitution */
|
||||
/* Devide by 4 to obtain the original index */
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> 2); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
frwd_nbr_flag = (nbr_id_from_bl >> (chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 3 : 2)); /*+ (nbr_id_from_bl & 0x1);*/
|
||||
|
||||
/* The Top-left flag is at the last bit location of nbr_flags*/
|
||||
if(nbr_id_from_bl == (T16C_4NT / 2))
|
||||
if(nbr_id_from_bl == (T16C_4NT * sub_sample / 2))
|
||||
{
|
||||
get_bits = GET_BIT(nbr_flags, 16);
|
||||
/* only pel substitution for TL */
|
||||
|
|
@ -405,11 +409,11 @@ void ihevc_intra_pred_chroma_ref_substitution(UWORD8 *pu1_top_left,
|
|||
UWORD16 *pu2_dst;
|
||||
/* 4 pel substitution (other than TL) */
|
||||
pu2_dst = (UWORD16 *)&pu1_dst[(2 * nbr_id_from_bl) - 2];
|
||||
ihevc_memset_16bit((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4);
|
||||
ihevc_memset_16bit((UWORD16 *)(pu1_dst + (2 * nbr_id_from_bl)), pu2_dst[0], 4 * sub_sample);
|
||||
}
|
||||
|
||||
}
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T16C_4NT / 2)) ? 1 : 4;
|
||||
nbr_id_from_bl += (nbr_id_from_bl == (T16C_4NT * sub_sample / 2)) ? 1 : 4 * sub_sample;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,3 +47,8 @@ const WORD16 gai2_ihevcd_chroma_qp[] =
|
|||
const UWORD8 gau1_intra_pred_chroma_modes[] =
|
||||
{ INTRA_PLANAR, INTRA_ANGULAR(26), INTRA_ANGULAR(10), INTRA_DC };
|
||||
|
||||
const WORD16 gai2_ihevcd_chroma_qp_444[] =
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
|
||||
45, 46, 47, 48, 49, 50, 51, 51, 51, 51, 51, 51, 51 };
|
||||
|
|
|
|||
|
|
@ -38,5 +38,6 @@ extern const WORD16 gai2_ihevcd_chroma_qp[];
|
|||
|
||||
extern const UWORD8 gau1_intra_pred_chroma_modes[];
|
||||
|
||||
extern const WORD16 gai2_ihevcd_chroma_qp_444[];
|
||||
|
||||
#endif /*_IHEVCD_COMMON_TABLES_H_*/
|
||||
|
|
|
|||
|
|
@ -556,6 +556,9 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
pps_t *ps_pps;
|
||||
WORD32 intra_flag;
|
||||
UWORD8 *pu1_pic_intra_flag;
|
||||
WORD32 h_samp_factor, v_samp_factor;
|
||||
WORD32 chroma_pixel_strd = 2;
|
||||
|
||||
/*************************************************************************/
|
||||
/* Contanis scaling matrix offset in the following order in a 1D buffer */
|
||||
/* Entries that are listed as UNUSED are invalid combinations where */
|
||||
|
|
@ -654,6 +657,9 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
|
||||
}
|
||||
|
||||
h_samp_factor = (CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc) ? 1 : 2;
|
||||
v_samp_factor = (CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc) ? 2 : 1;
|
||||
|
||||
/* Applying Inverse transform on all the TU's in CTB */
|
||||
for(tu_cnt = 0; tu_cnt < ps_proc->i4_ctb_tu_cnt; tu_cnt++, ps_tu++)
|
||||
{
|
||||
|
|
@ -754,26 +760,29 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
|
||||
if(ps_sps->i1_chroma_format_idc != CHROMA_FMT_IDC_MONOCHROME)
|
||||
{
|
||||
pu1_uv_dst += tu_x + (tu_y >> 1) * pic_strd;
|
||||
WORD32 chroma_strd = (pic_strd * chroma_pixel_strd) / h_samp_factor;
|
||||
|
||||
pu1_uv_dst += (tu_x * chroma_pixel_strd / h_samp_factor)
|
||||
+ (tu_y * chroma_pixel_strd * pic_strd / (h_samp_factor * v_samp_factor));
|
||||
pu1_uv_dst = pu1_uv_dst + chroma_yuv420sp_vu_u_offset;
|
||||
|
||||
/* U */
|
||||
for(i = 0; i < cb_size / 2; i++)
|
||||
for(i = 0; i < cb_size / v_samp_factor; i++)
|
||||
{
|
||||
for(j = 0; j < cb_size / 2; j++)
|
||||
for(j = 0; j < cb_size / h_samp_factor; j++)
|
||||
{
|
||||
pu1_uv_dst[i * pic_strd + 2 * j] = *pu1_buf++;
|
||||
pu1_uv_dst[i * chroma_strd + chroma_pixel_strd * j] = *pu1_buf++;
|
||||
}
|
||||
}
|
||||
|
||||
pu1_uv_dst = pu1_uv_dst + 1 + chroma_yuv420sp_vu_v_offset;
|
||||
|
||||
/* V */
|
||||
for(i = 0; i < cb_size / 2; i++)
|
||||
for(i = 0; i < cb_size / v_samp_factor; i++)
|
||||
{
|
||||
for(j = 0; j < cb_size / 2; j++)
|
||||
for(j = 0; j < cb_size / h_samp_factor; j++)
|
||||
{
|
||||
pu1_uv_dst[i * pic_strd + 2 * j] = *pu1_buf++;
|
||||
pu1_uv_dst[i * chroma_strd + chroma_pixel_strd * j] = *pu1_buf++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -791,12 +800,13 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
{
|
||||
if(0 == pcm_flag)
|
||||
{
|
||||
/* Initializing variables */
|
||||
pred_strd = pic_strd;
|
||||
dst_strd = pic_strd;
|
||||
|
||||
if(c_idx == 0) /* Y */
|
||||
{
|
||||
/* Initializing variables */
|
||||
pred_strd = pic_strd;
|
||||
dst_strd = pic_strd;
|
||||
|
||||
log2_y_trans_size_minus_2 = ps_tu->b3_size;
|
||||
trans_size = 1 << (log2_y_trans_size_minus_2 + 2);
|
||||
log2_trans_size = log2_y_trans_size_minus_2 + 2;
|
||||
|
|
@ -847,17 +857,41 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
}
|
||||
else /* UV interleaved */
|
||||
{
|
||||
/* Initializing variables */
|
||||
pred_strd = pic_strd * chroma_pixel_strd / h_samp_factor;
|
||||
dst_strd = pic_strd * chroma_pixel_strd / h_samp_factor;
|
||||
const WORD16 *pi2_ihevcd_chroma_qp =
|
||||
CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc ?
|
||||
gai2_ihevcd_chroma_qp_444 :
|
||||
gai2_ihevcd_chroma_qp;
|
||||
|
||||
/* Chroma :If Transform size is 4x4, keep 4x4 else do transform on (trans_size/2 x trans_size/2) */
|
||||
if(ps_tu->b3_size == 0)
|
||||
{
|
||||
/* Chroma 4x4 is present with 4th luma 4x4 block. For this case chroma postion has to be (luma pos x- 4,luma pos y- 4) */
|
||||
log2_uv_trans_size_minus_2 = ps_tu->b3_size;
|
||||
tu_uv_offset = (tu_x - 4) + ((tu_y - 4) / 2) * pic_strd;
|
||||
if(CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
tu_uv_offset = (tu_x * chroma_pixel_strd)
|
||||
+ (tu_y * chroma_pixel_strd * pic_strd);
|
||||
}
|
||||
else if(CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
/* Chroma 4x4 is present with 4th luma 4x4 block. For this case chroma postion has to be (luma pos x - 4, luma pos y - 4) */
|
||||
tu_uv_offset = (tu_x - 4) + ((tu_y - 4) / 2) * pic_strd;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
log2_uv_trans_size_minus_2 = ps_tu->b3_size - 1;
|
||||
tu_uv_offset = tu_x + (tu_y >> 1) * pic_strd;
|
||||
if(CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
log2_uv_trans_size_minus_2 = ps_tu->b3_size;
|
||||
}
|
||||
else if(CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
log2_uv_trans_size_minus_2 = ps_tu->b3_size - 1;
|
||||
}
|
||||
tu_uv_offset = (tu_x * chroma_pixel_strd / h_samp_factor)
|
||||
+ (tu_y * chroma_pixel_strd * pic_strd / (h_samp_factor * v_samp_factor));
|
||||
}
|
||||
trans_size = 1 << (log2_uv_trans_size_minus_2 + 2);
|
||||
log2_trans_size = log2_uv_trans_size_minus_2 + 2;
|
||||
|
|
@ -900,8 +934,8 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
chroma_qp_idx = ps_tu->b7_qp + i1_chroma_pic_qp_offset
|
||||
+ i1_chroma_slice_qp_offset;
|
||||
chroma_qp_idx = CLIP3(chroma_qp_idx, 0, 57);
|
||||
qp_div = gai2_ihevcd_chroma_qp[chroma_qp_idx] / 6;
|
||||
qp_rem = gai2_ihevcd_chroma_qp[chroma_qp_idx] % 6;
|
||||
qp_div = pi2_ihevcd_chroma_qp[chroma_qp_idx] / 6;
|
||||
qp_rem = pi2_ihevcd_chroma_qp[chroma_qp_idx] % 6;
|
||||
|
||||
/* QP for V */
|
||||
i1_chroma_pic_qp_offset = ps_pps->i1_pic_cr_qp_offset;
|
||||
|
|
@ -911,8 +945,8 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
chroma_qp_idx = ps_tu->b7_qp + i1_chroma_pic_qp_offset
|
||||
+ i1_chroma_slice_qp_offset;
|
||||
chroma_qp_idx = CLIP3(chroma_qp_idx, 0, 57);
|
||||
qp_div_v = gai2_ihevcd_chroma_qp[chroma_qp_idx] / 6;
|
||||
qp_rem_v = gai2_ihevcd_chroma_qp[chroma_qp_idx] % 6;
|
||||
qp_div_v = pi2_ihevcd_chroma_qp[chroma_qp_idx] / 6;
|
||||
qp_rem_v = pi2_ihevcd_chroma_qp[chroma_qp_idx] % 6;
|
||||
|
||||
/* Unpacking coeffs */
|
||||
transform_skip_flag = pu1_tu_coeff_data[1] & 1;
|
||||
|
|
@ -969,10 +1003,20 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
if(trans_size == 4)
|
||||
luma_nbr_flags_4x4[(ps_tu->b4_pos_x % 2) + (ps_tu->b4_pos_y % 2) * 2] = luma_nbr_flags;
|
||||
|
||||
if((ps_tu->b4_pos_x % 2 == 0) && (ps_tu->b4_pos_y % 2 == 0))
|
||||
if(ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
{
|
||||
chroma_nbr_flags = luma_nbr_flags;
|
||||
}
|
||||
else if(ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV422)
|
||||
{
|
||||
if(ps_tu->b4_pos_y % 2 == 0)
|
||||
chroma_nbr_flags = luma_nbr_flags;
|
||||
}
|
||||
else if(ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV420)
|
||||
{
|
||||
if(((ps_tu->b4_pos_x % 2 == 0) && (ps_tu->b4_pos_y % 2 == 0)))
|
||||
chroma_nbr_flags = luma_nbr_flags;
|
||||
}
|
||||
|
||||
/* Initializing nbr pointers */
|
||||
pu1_top = pu1_pred - pic_strd;
|
||||
|
|
@ -1019,7 +1063,7 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
* 1 4 4 4 4
|
||||
*
|
||||
* Generating chroma_nbr_flags depending upon the transform size */
|
||||
if(ps_tu->b3_size == 0)
|
||||
if(ps_tu->b3_size == 0 && ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV420)
|
||||
{
|
||||
/* Take TL,T,L flags of First luma 4x4 block */
|
||||
chroma_nbr_flags = (luma_nbr_flags_4x4[0] & 0x10FF0);
|
||||
|
|
@ -1030,16 +1074,19 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
}
|
||||
|
||||
/* Initializing nbr pointers */
|
||||
pu1_top = pu1_pred_orig - pic_strd;
|
||||
pu1_top = pu1_pred_orig - (pic_strd * chroma_pixel_strd / h_samp_factor);
|
||||
pu1_left = pu1_pred_orig - 2;
|
||||
pu1_top_left = pu1_pred_orig - pic_strd - 2;
|
||||
pu1_top_left = pu1_pred_orig - (pic_strd * chroma_pixel_strd / h_samp_factor) - 2;
|
||||
|
||||
/* Chroma pred mode derivation from luma pred mode */
|
||||
{
|
||||
tu_t *ps_tu_tmp = ps_tu;
|
||||
while(!ps_tu_tmp->b1_first_tu_in_cu)
|
||||
if(ps_sps->i1_chroma_format_idc != CHROMA_FMT_IDC_YUV444)
|
||||
{
|
||||
ps_tu_tmp--;
|
||||
while(!ps_tu_tmp->b1_first_tu_in_cu)
|
||||
{
|
||||
ps_tu_tmp--;
|
||||
}
|
||||
}
|
||||
u1_luma_pred_mode_first_tu = ps_tu_tmp->b6_luma_intra_mode;
|
||||
}
|
||||
|
|
@ -1049,8 +1096,7 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
{
|
||||
u1_chroma_pred_mode = gau1_intra_pred_chroma_modes[u1_chroma_pred_mode];
|
||||
|
||||
if(u1_chroma_pred_mode ==
|
||||
u1_luma_pred_mode_first_tu)
|
||||
if(u1_chroma_pred_mode == u1_luma_pred_mode_first_tu)
|
||||
{
|
||||
u1_chroma_pred_mode = INTRA_ANGULAR(34);
|
||||
}
|
||||
|
|
@ -1059,7 +1105,10 @@ WORD32 ihevcd_iquant_itrans_recon_ctb(process_ctxt_t *ps_proc)
|
|||
/* call the chroma reference array substitution */
|
||||
ps_codec->s_func_selector.ihevc_intra_pred_chroma_ref_substitution_fptr(
|
||||
pu1_top_left,
|
||||
pu1_top, pu1_left, pic_strd, trans_size, chroma_nbr_flags, pu1_ref_sub_out, 1);
|
||||
pu1_top, pu1_left,
|
||||
(pic_strd * chroma_pixel_strd / h_samp_factor),
|
||||
trans_size, chroma_nbr_flags, pu1_ref_sub_out, 1,
|
||||
ps_sps->i1_chroma_format_idc);
|
||||
|
||||
/* use the look up to get the function idx */
|
||||
chroma_pred_func_idx =
|
||||
|
|
|
|||
|
|
@ -1971,7 +1971,6 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec)
|
|||
|| ps_sps->i1_transform_skip_context_enabled_flag
|
||||
|| ps_sps->i1_implicit_rdpcm_enabled_flag
|
||||
|| ps_sps->i1_explicit_rdpcm_enabled_flag
|
||||
|| ps_sps->i1_intra_smoothing_disabled_flag
|
||||
|| ps_sps->i1_fast_rice_adaptation_enabled_flag)
|
||||
{
|
||||
// TODO: decoder does not yet supports these tool-sets
|
||||
|
|
|
|||
|
|
@ -311,7 +311,8 @@ WORD32 ihevcd_parse_residual_coding(codec_t *ps_codec,
|
|||
scan_idx = SCAN_DIAG_UPRIGHT;
|
||||
if(PRED_MODE_INTRA == ps_codec->s_parse.s_cu.i4_pred_mode)
|
||||
{
|
||||
if((2 == log2_trafo_size) || ((3 == log2_trafo_size) && (0 == c_idx)))
|
||||
int is_YUV444 = ps_codec->s_parse.ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444;
|
||||
if((2 == log2_trafo_size) || ((3 == log2_trafo_size) && (0 == c_idx || is_YUV444)))
|
||||
{
|
||||
if((6 <= intra_pred_mode) &&
|
||||
(14 >= intra_pred_mode))
|
||||
|
|
|
|||
|
|
@ -120,7 +120,8 @@ WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
|
|||
WORD32 log2_trafo_size,
|
||||
WORD32 trafo_depth,
|
||||
WORD32 blk_idx,
|
||||
WORD32 intra_pred_mode)
|
||||
WORD32 intra_pred_mode,
|
||||
WORD32 chroma_intra_pred_mode_idx)
|
||||
{
|
||||
IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
|
||||
sps_t *ps_sps;
|
||||
|
|
@ -210,6 +211,7 @@ WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
|
|||
if(split_transform_flag)
|
||||
{
|
||||
WORD32 intra_pred_mode_tmp;
|
||||
WORD32 chroma_intra_pred_mode_tmp_idx = ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[0];
|
||||
x1 = x0 + ((1 << log2_trafo_size) >> 1);
|
||||
y1 = y0 + ((1 << log2_trafo_size) >> 1);
|
||||
|
||||
|
|
@ -218,19 +220,27 @@ WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
|
|||
/* When depth is non-zero intra pred mode of parent node is sent */
|
||||
/* This takes care of passing correct mode to all the child nodes */
|
||||
intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x0, y0, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 0, intra_pred_mode_tmp);
|
||||
if (ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
chroma_intra_pred_mode_tmp_idx = trafo_depth ? chroma_intra_pred_mode_idx : ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[0];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x0, y0, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 0, intra_pred_mode_tmp, chroma_intra_pred_mode_tmp_idx);
|
||||
RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
|
||||
|
||||
intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[1];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x1, y0, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 1, intra_pred_mode_tmp);
|
||||
if (ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
chroma_intra_pred_mode_tmp_idx = trafo_depth ? chroma_intra_pred_mode_idx : ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[1];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x1, y0, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 1, intra_pred_mode_tmp, chroma_intra_pred_mode_tmp_idx);
|
||||
RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
|
||||
|
||||
intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[2];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x0, y1, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 2, intra_pred_mode_tmp);
|
||||
if (ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
chroma_intra_pred_mode_tmp_idx = trafo_depth ? chroma_intra_pred_mode_idx : ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[2];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x0, y1, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 2, intra_pred_mode_tmp, chroma_intra_pred_mode_tmp_idx);
|
||||
RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
|
||||
|
||||
intra_pred_mode_tmp = trafo_depth ? intra_pred_mode : ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[3];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x1, y1, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 3, intra_pred_mode_tmp);
|
||||
if (ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
chroma_intra_pred_mode_tmp_idx = trafo_depth ? chroma_intra_pred_mode_idx : ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[3];
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x1, y1, x0, y0, log2_trafo_size - 1, trafo_depth + 1, 3, intra_pred_mode_tmp, chroma_intra_pred_mode_tmp_idx);
|
||||
RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
|
||||
|
||||
}
|
||||
|
|
@ -278,7 +288,7 @@ WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
|
|||
ps_tu->b7_qp = ps_codec->s_parse.u4_qp;
|
||||
|
||||
ps_tu->b6_luma_intra_mode = intra_pred_mode;
|
||||
ps_tu->b3_chroma_intra_mode_idx = ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx;
|
||||
ps_tu->b3_chroma_intra_mode_idx = chroma_intra_pred_mode_idx;
|
||||
|
||||
/* Section:7.3.12 Transform unit syntax inlined here */
|
||||
if(ps_codec->s_parse.s_cu.i1_cbf_luma ||
|
||||
|
|
@ -339,31 +349,36 @@ WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
|
|||
ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size, 0, intra_pred_mode);
|
||||
}
|
||||
|
||||
if(4 == ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx)
|
||||
intra_pred_mode_chroma = ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0];
|
||||
WORD32 chroma_blk_luma_intra_pred_mode =
|
||||
ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444 ?
|
||||
intra_pred_mode :
|
||||
ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0];
|
||||
if(4 == chroma_intra_pred_mode_idx)
|
||||
intra_pred_mode_chroma = chroma_blk_luma_intra_pred_mode;
|
||||
else
|
||||
{
|
||||
intra_pred_mode_chroma = gau1_intra_pred_chroma_modes[ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx];
|
||||
intra_pred_mode_chroma = gau1_intra_pred_chroma_modes[chroma_intra_pred_mode_idx];
|
||||
|
||||
if(intra_pred_mode_chroma ==
|
||||
ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0])
|
||||
if(intra_pred_mode_chroma == chroma_blk_luma_intra_pred_mode)
|
||||
{
|
||||
intra_pred_mode_chroma = INTRA_ANGULAR(34);
|
||||
}
|
||||
|
||||
}
|
||||
if(log2_trafo_size > 2)
|
||||
if(log2_trafo_size > 2 || ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
{
|
||||
WORD32 trafo_offset = (ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444 ? 0 : 1);
|
||||
WORD32 log2_trafo_size_c = MAX(2, log2_trafo_size - trafo_offset);
|
||||
|
||||
if(ps_codec->s_parse.s_cu.ai1_cbf_cb[trafo_depth])
|
||||
{
|
||||
ps_tu->b1_cb_cbf = 1;
|
||||
ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size - 1, 1, intra_pred_mode_chroma);
|
||||
ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size_c, 1, intra_pred_mode_chroma);
|
||||
}
|
||||
|
||||
if(ps_codec->s_parse.s_cu.ai1_cbf_cr[trafo_depth])
|
||||
{
|
||||
ps_tu->b1_cr_cbf = 1;
|
||||
ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size - 1, 2, intra_pred_mode_chroma);
|
||||
ihevcd_parse_residual_coding(ps_codec, x0, y0, log2_trafo_size_c, 2, intra_pred_mode_chroma);
|
||||
}
|
||||
}
|
||||
else if(blk_idx == 3)
|
||||
|
|
@ -388,7 +403,7 @@ WORD32 ihevcd_parse_transform_tree(codec_t *ps_codec,
|
|||
}
|
||||
else
|
||||
{
|
||||
if((3 != blk_idx) && (2 == log2_trafo_size))
|
||||
if((3 != blk_idx) && (2 == log2_trafo_size && ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV420))
|
||||
{
|
||||
ps_tu->b3_chroma_intra_mode_idx = INTRA_PRED_CHROMA_IDX_NONE;
|
||||
}
|
||||
|
|
@ -591,7 +606,8 @@ IHEVCD_ERROR_T ihevcd_parse_pcm_sample(codec_t *ps_codec,
|
|||
|
||||
num_bits = ps_sps->i1_pcm_sample_bit_depth_luma;
|
||||
|
||||
for(i = 0; i < 1 << (log2_cb_size << 1); i++)
|
||||
WORD32 luma_samples = 1 << (log2_cb_size << 1);
|
||||
for(i = 0; i < luma_samples; i++)
|
||||
{
|
||||
TRACE_CABAC_CTXT("pcm_sample_luma", ps_cabac->u4_range, 0);
|
||||
BITS_PARSE("pcm_sample_luma", value, ps_bitstrm, num_bits);
|
||||
|
|
@ -602,9 +618,17 @@ IHEVCD_ERROR_T ihevcd_parse_pcm_sample(codec_t *ps_codec,
|
|||
|
||||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
num_bits = ps_sps->i1_pcm_sample_bit_depth_chroma;
|
||||
WORD32 chroma_samples = 0;
|
||||
|
||||
for (i = 0; i < (1 << (log2_cb_size << 1)) >> 1; i++) {
|
||||
if(ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
|
||||
chroma_samples = luma_samples << 1;
|
||||
else if(ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV422)
|
||||
chroma_samples = luma_samples;
|
||||
else if(ps_sps->i1_chroma_format_idc == CHROMA_FMT_IDC_YUV420)
|
||||
chroma_samples = luma_samples >> 1;
|
||||
num_bits = ps_sps->i1_pcm_sample_bit_depth_chroma;
|
||||
for(i = 0; i < chroma_samples; i++)
|
||||
{
|
||||
TRACE_CABAC_CTXT("pcm_sample_chroma", ps_cabac->u4_range, 0);
|
||||
BITS_PARSE("pcm_sample_chroma", value, ps_bitstrm, num_bits);
|
||||
|
||||
|
|
@ -1119,22 +1143,53 @@ IHEVCD_ERROR_T ihevcd_parse_coding_unit_intra(codec_t *ps_codec,
|
|||
}
|
||||
cnt++;
|
||||
}
|
||||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc) {
|
||||
if(CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
for(i = 0; i < part_cnt; i++)
|
||||
{
|
||||
TRACE_CABAC_CTXT("intra_chroma_pred_mode", ps_cabac->u4_range, IHEVC_CAB_CHROMA_PRED_MODE);
|
||||
value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm,
|
||||
IHEVC_CAB_CHROMA_PRED_MODE);
|
||||
// TODO: this needs to be an array of elements
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[i] = 4;
|
||||
if(value)
|
||||
{
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[i] =
|
||||
ihevcd_cabac_decode_bypass_bins(ps_cabac,
|
||||
ps_bitstrm,
|
||||
2);
|
||||
}
|
||||
AEV_TRACE("intra_chroma_pred_mode",
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[i],
|
||||
ps_cabac->u4_range);
|
||||
}
|
||||
}
|
||||
else if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
TRACE_CABAC_CTXT("intra_chroma_pred_mode", ps_cabac->u4_range, IHEVC_CAB_CHROMA_PRED_MODE);
|
||||
value = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm,
|
||||
IHEVC_CAB_CHROMA_PRED_MODE);
|
||||
ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx = 4;
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[0] = 4;
|
||||
if (value) {
|
||||
ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx =
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[0] =
|
||||
ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm,
|
||||
2);
|
||||
}
|
||||
AEV_TRACE("intra_chroma_pred_mode",
|
||||
ps_codec->s_parse.s_cu.i4_intra_chroma_pred_mode_idx,
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[0],
|
||||
ps_cabac->u4_range);
|
||||
|
||||
}
|
||||
ihevcd_intra_pred_mode_prediction(ps_codec, log2_cb_size, x0, y0);
|
||||
|
||||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc && part_mode != PART_NxN)
|
||||
{
|
||||
// Only required for YUV444, but done for all formats to simplify calling arguments for ihevcd_parse_transform_tree
|
||||
parse_cu_t *ps_cu = &ps_codec->s_parse.s_cu;
|
||||
ps_cu->ai4_intra_chroma_pred_mode_idx[1] = ps_cu->ai4_intra_chroma_pred_mode_idx[0];
|
||||
ps_cu->ai4_intra_chroma_pred_mode_idx[2] = ps_cu->ai4_intra_chroma_pred_mode_idx[0];
|
||||
ps_cu->ai4_intra_chroma_pred_mode_idx[3] = ps_cu->ai4_intra_chroma_pred_mode_idx[0];
|
||||
}
|
||||
}
|
||||
STATS_UPDATE_PU_SIZE(ps_pu);
|
||||
/* Increment PU pointer */
|
||||
|
|
@ -1611,7 +1666,8 @@ IHEVCD_ERROR_T ihevcd_parse_coding_unit(codec_t *ps_codec,
|
|||
(ps_sps->i1_max_transform_hierarchy_depth_inter);
|
||||
ret = ihevcd_parse_transform_tree(ps_codec, x0, y0, x0, y0,
|
||||
log2_cb_size, 0, 0,
|
||||
ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0]);
|
||||
ps_codec->s_parse.s_cu.ai4_intra_luma_pred_mode[0],
|
||||
ps_codec->s_parse.s_cu.ai4_intra_chroma_pred_mode_idx[0]);
|
||||
RETURN_IF((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret, ret);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -536,6 +536,13 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
|
||||
WORD32 ctb_size = 1 << ps_sps->i1_log2_ctb_size;
|
||||
|
||||
WORD32 h_samp_factor, v_samp_factor;
|
||||
WORD32 chroma_row_strd;
|
||||
WORD32 chroma_pixel_strd = 2;
|
||||
|
||||
h_samp_factor = (CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc) ? 1 : 2;
|
||||
v_samp_factor = (CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc) ? 2 : 1;
|
||||
|
||||
PROFILE_DISABLE_PROCESS_CTB();
|
||||
|
||||
ps_codec = ps_proc->ps_codec;
|
||||
|
|
@ -968,7 +975,6 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
/*TODO: Add support for custom scaling matrices */
|
||||
}
|
||||
|
||||
|
||||
/* CTB Level pointers */
|
||||
ps_proc->pu1_cur_ctb_luma = ps_proc->pu1_cur_pic_luma
|
||||
+ (ps_proc->i4_ctb_x * ctb_size
|
||||
|
|
@ -977,8 +983,8 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
ps_proc->pu1_cur_ctb_chroma = ps_proc->pu1_cur_pic_chroma
|
||||
+ ps_proc->i4_ctb_x * ctb_size
|
||||
+ (ps_proc->i4_ctb_y * ctb_size * ps_codec->i4_strd / 2);
|
||||
+ (ps_proc->i4_ctb_x * ctb_size * chroma_pixel_strd / h_samp_factor)
|
||||
+ (ps_proc->i4_ctb_y * ctb_size * ps_codec->i4_strd * chroma_pixel_strd / (h_samp_factor * v_samp_factor));
|
||||
}
|
||||
|
||||
ihevcd_iquant_itrans_recon_ctb(ps_proc);
|
||||
|
|
@ -1204,6 +1210,8 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
|
||||
/* Call padding if required */
|
||||
{
|
||||
chroma_row_strd = ps_codec->i4_strd * chroma_pixel_strd / h_samp_factor;
|
||||
|
||||
#if SAO_PROCESS_SHIFT_CTB
|
||||
|
||||
if(0 == ps_proc->i4_ctb_x)
|
||||
|
|
@ -1223,10 +1231,12 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
ps_proc->pu1_cur_ctb_chroma = ps_proc->pu1_cur_pic_chroma
|
||||
+ ps_proc->i4_ctb_x * ctb_size
|
||||
+ (ps_proc->i4_ctb_y * ctb_size * ps_codec->i4_strd / 2);
|
||||
pad_ht_chroma = ctb_size / 2;
|
||||
ps_codec->s_func_selector.ihevc_pad_left_chroma_fptr(ps_proc->pu1_cur_ctb_chroma - 16 * ps_codec->i4_strd, ps_codec->i4_strd, pad_ht_chroma, PAD_LEFT);
|
||||
+ (ps_proc->i4_ctb_x * ctb_size * chroma_pixel_strd / h_samp_factor)
|
||||
+ (ps_proc->i4_ctb_y * ctb_size * chroma_row_strd / v_samp_factor);
|
||||
pad_ht_chroma = ctb_size / v_samp_factor;
|
||||
ps_codec->s_func_selector.ihevc_pad_left_chroma_fptr(
|
||||
ps_proc->pu1_cur_ctb_chroma - (8 * v_samp_factor) * chroma_row_strd,
|
||||
chroma_row_strd, pad_ht_chroma, PAD_LEFT * chroma_pixel_strd / h_samp_factor);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1243,9 +1253,9 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
ps_proc->pu1_cur_ctb_chroma = ps_proc->pu1_cur_pic_chroma
|
||||
+ ps_proc->i4_ctb_x * ctb_size
|
||||
+ (ps_proc->i4_ctb_y * ctb_size * ps_codec->i4_strd / 2);
|
||||
pad_ht_chroma = ctb_size / 2;
|
||||
+ (ps_proc->i4_ctb_x * ctb_size * chroma_pixel_strd / h_samp_factor)
|
||||
+ (ps_proc->i4_ctb_y * ctb_size * chroma_row_strd / v_samp_factor);
|
||||
pad_ht_chroma = ctb_size / v_samp_factor;
|
||||
}
|
||||
pad_ht_luma = ctb_size;
|
||||
if((ps_sps->i2_pic_ht_in_ctb - 1) == ps_proc->i4_ctb_y)
|
||||
|
|
@ -1253,16 +1263,21 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
pad_ht_luma += 8;
|
||||
if (CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
pad_ht_chroma += 16;
|
||||
ps_codec->s_func_selector.ihevc_pad_left_chroma_fptr(ps_proc->pu1_cur_pic_chroma + (ps_sps->i2_pic_height_in_luma_samples / 2 - 16) * ps_codec->i4_strd,
|
||||
ps_codec->i4_strd, 16, PAD_LEFT);
|
||||
pad_ht_chroma += (8 * v_samp_factor);
|
||||
ps_codec->s_func_selector.ihevc_pad_left_chroma_fptr(
|
||||
ps_proc->pu1_cur_pic_chroma + ((ps_sps->i2_pic_height_in_luma_samples / v_samp_factor) - (8 * v_samp_factor)) * chroma_row_strd,
|
||||
chroma_row_strd, (8 * v_samp_factor),
|
||||
PAD_LEFT * chroma_pixel_strd / h_samp_factor);
|
||||
}
|
||||
}
|
||||
/* Pad right after last CTB in the current row is processed */
|
||||
ps_codec->s_func_selector.ihevc_pad_right_luma_fptr(ps_proc->pu1_cur_ctb_luma + cols_remaining - 8 * ps_codec->i4_strd, ps_codec->i4_strd, pad_ht_luma, PAD_RIGHT);
|
||||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
ps_codec->s_func_selector.ihevc_pad_right_chroma_fptr(ps_proc->pu1_cur_ctb_chroma + cols_remaining - 16 * ps_codec->i4_strd, ps_codec->i4_strd, pad_ht_chroma, PAD_RIGHT);
|
||||
ps_codec->s_func_selector.ihevc_pad_right_chroma_fptr(
|
||||
ps_proc->pu1_cur_ctb_chroma + (cols_remaining * chroma_pixel_strd / h_samp_factor) - (8 * v_samp_factor) * chroma_row_strd,
|
||||
chroma_row_strd, pad_ht_chroma,
|
||||
PAD_RIGHT * chroma_pixel_strd / h_samp_factor);
|
||||
}
|
||||
|
||||
if((ps_sps->i2_pic_ht_in_ctb - 1) == ps_proc->i4_ctb_y)
|
||||
|
|
@ -1274,7 +1289,10 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
ihevc_pad_top(ps_proc->pu1_cur_pic_luma - PAD_LEFT, ps_codec->i4_strd, ps_sps->i2_pic_width_in_luma_samples + PAD_WD, PAD_TOP);
|
||||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
ihevc_pad_top(ps_proc->pu1_cur_pic_chroma - PAD_LEFT, ps_codec->i4_strd, ps_sps->i2_pic_width_in_luma_samples + PAD_WD, PAD_TOP / 2);
|
||||
ihevc_pad_top(ps_proc->pu1_cur_pic_chroma - PAD_LEFT * (chroma_pixel_strd / h_samp_factor),
|
||||
chroma_row_strd,
|
||||
(ps_sps->i2_pic_width_in_luma_samples + PAD_WD) * (chroma_pixel_strd / h_samp_factor),
|
||||
PAD_TOP / v_samp_factor);
|
||||
}
|
||||
|
||||
/* Pad bottom after padding left and right for current rows after processing 1st CTB row */
|
||||
|
|
@ -1282,8 +1300,13 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc)
|
|||
ihevc_pad_bottom(pu1_buf, ps_codec->i4_strd, ps_sps->i2_pic_width_in_luma_samples + PAD_WD, PAD_BOT);
|
||||
if(CHROMA_FMT_IDC_MONOCHROME != ps_sps->i1_chroma_format_idc)
|
||||
{
|
||||
pu1_buf = ps_proc->pu1_cur_pic_chroma + ps_codec->i4_strd * (ps_sps->i2_pic_height_in_luma_samples / 2) - PAD_LEFT;
|
||||
ihevc_pad_bottom(pu1_buf, ps_codec->i4_strd, ps_sps->i2_pic_width_in_luma_samples + PAD_WD, PAD_BOT / 2);
|
||||
pu1_buf = ps_proc->pu1_cur_pic_chroma
|
||||
+ chroma_row_strd * (ps_sps->i2_pic_height_in_luma_samples / v_samp_factor)
|
||||
- (PAD_LEFT * chroma_pixel_strd / h_samp_factor);
|
||||
ihevc_pad_bottom(pu1_buf,
|
||||
chroma_row_strd,
|
||||
(ps_sps->i2_pic_width_in_luma_samples + PAD_WD) * (chroma_pixel_strd / h_samp_factor),
|
||||
PAD_BOT / v_samp_factor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -736,7 +736,7 @@ typedef struct
|
|||
/**
|
||||
* Chroma pred mode index to be used to compute intra pred mode for chroma
|
||||
*/
|
||||
WORD32 i4_intra_chroma_pred_mode_idx;
|
||||
WORD32 ai4_intra_chroma_pred_mode_idx[4];
|
||||
/**
|
||||
* Maximum transform depth
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -6244,7 +6244,8 @@ UWORD8 ihevce_distortion_based_intra_chroma_mode_selector(
|
|||
u1_trans_size,
|
||||
nbr_flags,
|
||||
pu1_ref_sub_out,
|
||||
1);
|
||||
1,
|
||||
CHROMA_FMT_IDC_YUV420);
|
||||
|
||||
/* use the look up to get the function idx */
|
||||
chrm_pred_func_idx = g_i4_ip_funcs[u1_chrm_mode];
|
||||
|
|
@ -6636,7 +6637,8 @@ void ihevce_intra_chroma_pred_mode_selector(
|
|||
trans_size,
|
||||
nbr_flags,
|
||||
(UWORD8 *)ps_ctxt->pv_ref_sub_out,
|
||||
1);
|
||||
1,
|
||||
CHROMA_FMT_IDC_YUV420);
|
||||
|
||||
/* use the look up to get the function idx */
|
||||
chrm_pred_func_idx = g_i4_ip_funcs[best_chrm_mode];
|
||||
|
|
@ -7396,7 +7398,8 @@ LWORD64 ihevce_chroma_cu_prcs_rdopt(
|
|||
trans_size,
|
||||
nbr_flags,
|
||||
(UWORD8 *)ps_ctxt->pv_ref_sub_out,
|
||||
1);
|
||||
1,
|
||||
CHROMA_FMT_IDC_YUV420);
|
||||
|
||||
/* use the look up to get the function idx */
|
||||
chrm_pred_func_idx = g_i4_ip_funcs[chrm_pred_mode];
|
||||
|
|
@ -9418,7 +9421,8 @@ void ihevce_final_rdopt_mode_prcs(
|
|||
chroma_trans_size,
|
||||
nbr_flags,
|
||||
(UWORD8 *)ps_ctxt->pv_ref_sub_out,
|
||||
1);
|
||||
1,
|
||||
CHROMA_FMT_IDC_YUV420);
|
||||
|
||||
/* use the look up to get the function idx */
|
||||
chrm_pred_func_idx = g_i4_ip_funcs[chroma_pred_mode];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue