/******************************************************************************
|
*
|
* Copyright (C) 2015 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at:
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*
|
*****************************************************************************
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
*/
|
/**
|
*******************************************************************************
|
* @file
|
* ih264_luma_intra_pred_filters.c
|
*
|
* @brief
|
* Contains function definitions for intra prediction filters
|
*
|
* @author
|
* Ittiam
|
*
|
* @par List of Functions:
|
* - ih264_intra_pred_luma_4x4_mode_vert
|
* - ih264_intra_pred_luma_4x4_mode_horz
|
* - ih264_intra_pred_luma_4x4_mode_dc
|
* - ih264_intra_pred_luma_4x4_mode_diag_dl
|
* - ih264_intra_pred_luma_4x4_mode_diag_dr
|
* - ih264_intra_pred_luma_4x4_mode_vert_r
|
* - ih264_intra_pred_luma_4x4_mode_horz_d
|
* - ih264_intra_pred_luma_4x4_mode_vert_l
|
* - ih264_intra_pred_luma_4x4_mode_horz_u
|
* - ih264_intra_pred_luma_8x8_mode_ref_filtering
|
* - ih264_intra_pred_luma_8x8_mode_vert
|
* - ih264_intra_pred_luma_8x8_mode_horz
|
* - ih264_intra_pred_luma_8x8_mode_dc
|
* - ih264_intra_pred_luma_8x8_mode_diag_dl
|
* - ih264_intra_pred_luma_8x8_mode_diag_dr
|
* - ih264_intra_pred_luma_8x8_mode_vert_r
|
* - ih264_intra_pred_luma_8x8_mode_horz_d
|
* - ih264_intra_pred_luma_8x8_mode_vert_l
|
* - ih264_intra_pred_luma_8x8_mode_horz_u
|
* - ih264_intra_pred_luma_16x16_mode_vert
|
* - ih264_intra_pred_luma_16x16_mode_horz
|
* - ih264_intra_pred_luma_16x16_mode_dc
|
* - ih264_intra_pred_luma_16x16_mode_plane
|
*
|
*
|
* @remarks
|
* None
|
*
|
******************************************************************************
|
*/
|
|
/*****************************************************************************/
|
/* File Includes */
|
/*****************************************************************************/
|
/* System include files */
|
#include <stdio.h>
|
#include <stddef.h>
|
#include <string.h>
|
|
/* User include files */
|
#include "ih264_defs.h"
|
#include "ih264_typedefs.h"
|
#include "ih264_macros.h"
|
#include "ih264_platform_macros.h"
|
#include "ih264_intra_pred_filters.h"
|
|
/* Global variables used only in assembly files*/
|
const WORD8 ih264_gai1_intrapred_luma_plane_coeffs[] =
|
{ 0x01, 0x02, 0x03, 0x04,
|
0x05, 0x06, 0x07, 0x08,
|
0x09, 0x0A, 0x0B, 0x0C,
|
0x0D, 0x0E, 0x0F, 0x10, };
|
|
const WORD8 ih264_gai1_intrapred_luma_8x8_horz_u[] =
|
{ 0x06,0x15,0x05,0x14,
|
0x04,0x13,0x03,0x12,
|
0x02,0x11,0x01,0x10,
|
0x00,0x1F,0x0F,0x0F
|
};
|
|
/******************* LUMA INTRAPREDICTION *******************/
|
|
/******************* 4x4 Modes *******************/
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_vert
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:vertical
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:vertical ,described in sec 8.3.1.2.1
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************
|
*/
|
void ih264_intra_pred_luma_4x4_mode_vert(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK_SIZE + 1;
|
|
memcpy(pu1_dst, pu1_top, 4);
|
memcpy(pu1_dst + dst_strd, pu1_top, 4);
|
memcpy(pu1_dst + 2 * dst_strd, pu1_top, 4);
|
memcpy(pu1_dst + 3 * dst_strd, pu1_top, 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_horz
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:horizontal
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:horizontal ,described in sec 8.3.1.2.2
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************
|
*/
|
void ih264_intra_pred_luma_4x4_mode_horz(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_left = pu1_src + BLK_SIZE - 1;
|
|
memset(pu1_dst, *pu1_left, 4);
|
memset(pu1_dst + dst_strd, *(pu1_left - 1), 4);
|
memset(pu1_dst + 2 * dst_strd, *(pu1_left - 2), 4);
|
memset(pu1_dst + 3 * dst_strd, *(pu1_left - 3), 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_dc
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:DC
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:DC ,described in sec 8.3.1.2.3
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_dc(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 u1_useleft; /* availability of left predictors (only for DC) */
|
UWORD8 u1_usetop; /* availability of top predictors (only for DC) */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
WORD32 val = 0;
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
u1_useleft = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK);
|
u1_usetop = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK);
|
pu1_top = pu1_src + BLK_SIZE + 1;
|
pu1_left = pu1_src + BLK_SIZE - 1;
|
|
if(u1_useleft)
|
{
|
val += *pu1_left--;
|
val += *pu1_left--;
|
val += *pu1_left--;
|
val += *pu1_left + 2;
|
}
|
if(u1_usetop)
|
{
|
val += *pu1_top + *(pu1_top + 1) + *(pu1_top + 2) + *(pu1_top + 3)
|
+ 2;
|
}
|
/* Since 2 is added if either left/top pred is there,
|
val still being zero implies both preds are not there */
|
val = (val) ? (val >> (1 + u1_useleft + u1_usetop)) : 128;
|
|
/* 4 bytes are copied from src to dst */
|
memset(pu1_dst, val, 4);
|
memset(pu1_dst + dst_strd, val, 4);
|
memset(pu1_dst + 2 * dst_strd, val, 4);
|
memset(pu1_dst + 3 * dst_strd, val, 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_diag_dl
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Left
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Left ,described in sec 8.3.1.2.4
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_diag_dl(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h;
|
UWORD8 predicted_pixels[7];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src +BLK_SIZE + 1;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_e = *pu1_top++;
|
ui4_f = *pu1_top++;
|
ui4_g = *pu1_top++;
|
ui4_h = *pu1_top;
|
|
predicted_pixels[0] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[1] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[2] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[3] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[4] = FILT121(ui4_e, ui4_f, ui4_g);
|
predicted_pixels[5] = FILT121(ui4_f, ui4_g, ui4_h);
|
predicted_pixels[6] = FILT121(ui4_g, ui4_h, ui4_h);
|
|
memcpy(pu1_dst, predicted_pixels, 4);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 1, 4);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 4);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 3, 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_diag_dr
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Right
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Right ,described in sec 8.3.1.2.5
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_diag_dr(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_topleft = NULL;/* Pointer to top left predictor */
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_i, ui4_j, ui4_k, ui4_l, ui4_m;
|
UWORD8 predicted_pixels[7];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK_SIZE + 1;
|
pu1_left = pu1_src + BLK_SIZE - 1;
|
pu1_topleft = pu1_src +BLK_SIZE;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_i = *pu1_left--;
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left--;
|
ui4_l = *pu1_left;
|
ui4_m = *pu1_topleft;
|
|
predicted_pixels[2] = FILT121(ui4_j, ui4_i, ui4_m);
|
predicted_pixels[1] = FILT121(ui4_k, ui4_j, ui4_i);
|
predicted_pixels[0] = FILT121(ui4_l, ui4_k, ui4_j);
|
predicted_pixels[3] = FILT121(ui4_i, ui4_m, ui4_a);
|
predicted_pixels[4] = FILT121(ui4_m, ui4_a, ui4_b);
|
predicted_pixels[5] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[6] = FILT121(ui4_b, ui4_c, ui4_d);
|
|
memcpy(pu1_dst, predicted_pixels + 3, 4);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 2, 4);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 1, 4);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels, 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_vert_r
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:Vertical_Right
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:Vertical_Right ,described in sec 8.3.1.2.6
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_vert_r(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_i, ui4_j, ui4_k, ui4_m;
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_topleft = NULL;/* Pointer to top left predictor */
|
UWORD8 predicted_pixels[10];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src +BLK_SIZE + 1;
|
pu1_left = pu1_src + BLK_SIZE - 1;
|
pu1_topleft = pu1_src + BLK_SIZE;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_i = *pu1_left--;
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left;
|
ui4_m = *pu1_topleft;
|
|
predicted_pixels[6] = FILT11(ui4_m, ui4_a);
|
predicted_pixels[7] = FILT11(ui4_a, ui4_b);
|
predicted_pixels[8] = FILT11(ui4_b, ui4_c);
|
predicted_pixels[9] = FILT11(ui4_c, ui4_d);
|
predicted_pixels[1] = FILT121(ui4_i, ui4_m, ui4_a);
|
predicted_pixels[2] = FILT121(ui4_m, ui4_a, ui4_b);
|
predicted_pixels[3] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[4] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[5] = FILT121(ui4_j, ui4_i, ui4_m);
|
predicted_pixels[0] = FILT121(ui4_k, ui4_j, ui4_i);
|
|
memcpy(pu1_dst, predicted_pixels + 6, 4);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 1, 4);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 5, 4);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels, 4);
|
}
|
|
/*
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_horz_d
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:Horizontal_Down
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:Horizontal_Down ,described in sec 8.3.1.2.7
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_horz_d(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_topleft = NULL;/* Pointer to top left predictor */
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_i, ui4_j, ui4_k, ui4_l, ui4_m;
|
UWORD8 predicted_pixels[10];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK_SIZE + 1;
|
pu1_left = pu1_src + BLK_SIZE - 1;
|
pu1_topleft = pu1_src + BLK_SIZE;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_i = *pu1_left--;
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left--;
|
ui4_l = *pu1_left--;
|
ui4_m = *pu1_topleft;
|
|
predicted_pixels[6] = FILT11(ui4_i, ui4_m);
|
predicted_pixels[7] = FILT121(ui4_i, ui4_m, ui4_a);
|
predicted_pixels[8] = FILT121(ui4_m, ui4_a, ui4_b);
|
predicted_pixels[9] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[1] = FILT121(ui4_l, ui4_k, ui4_j);
|
predicted_pixels[2] = FILT11(ui4_k, ui4_j);
|
predicted_pixels[3] = FILT121(ui4_k, ui4_j, ui4_i);
|
predicted_pixels[4] = FILT11(ui4_j, ui4_i);
|
predicted_pixels[5] = FILT121(ui4_j, ui4_i, ui4_m);
|
predicted_pixels[0] = FILT11(ui4_l, ui4_k);
|
|
memcpy(pu1_dst, predicted_pixels + 6, 4);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 4, 4);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 4);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels, 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_vert_l
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:Vertical_Left
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:Vertical_Left ,described in sec 8.3.1.2.8
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_vert_l(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g;
|
UWORD8 predicted_pixels[10];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK_SIZE + 1;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_e = *pu1_top++;
|
ui4_f = *pu1_top++;
|
ui4_g = *pu1_top;
|
|
predicted_pixels[5] = FILT11(ui4_a, ui4_b);
|
predicted_pixels[6] = FILT11(ui4_b, ui4_c);
|
predicted_pixels[7] = FILT11(ui4_c, ui4_d);
|
predicted_pixels[8] = FILT11(ui4_d, ui4_e);
|
predicted_pixels[0] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[1] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[2] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[3] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[9] = FILT11(ui4_e, ui4_f);
|
predicted_pixels[4] = FILT121(ui4_e, ui4_f, ui4_g);
|
|
memcpy(pu1_dst, predicted_pixels + 5, 4);
|
memcpy(pu1_dst + dst_strd, predicted_pixels, 4);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 6, 4);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 1, 4);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_4x4_mode_horz_u
|
*
|
* @brief
|
* Perform Intra prediction for luma_4x4 mode:Horizontal_Up
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_4x4 mode:Horizontal_Up ,described in sec 8.3.1.2.9
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_4x4_mode_horz_u(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD32 ui4_i, ui4_j, ui4_k, ui4_l;
|
UWORD8 predicted_pixels[10];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_left = pu1_src + BLK_SIZE - 1;
|
|
ui4_i = *pu1_left--;
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left--;
|
ui4_l = *pu1_left--;
|
|
predicted_pixels[0] = FILT11(ui4_j, ui4_i);
|
predicted_pixels[1] = FILT121(ui4_k, ui4_j, ui4_i);
|
predicted_pixels[2] = FILT11(ui4_k, ui4_j);
|
predicted_pixels[3] = FILT121(ui4_l, ui4_k, ui4_j);
|
predicted_pixels[4] = FILT11(ui4_l, ui4_k);
|
predicted_pixels[5] = FILT121(ui4_l, ui4_l, ui4_k);
|
predicted_pixels[6] = ui4_l;
|
predicted_pixels[7] = ui4_l;
|
predicted_pixels[8] = ui4_l;
|
predicted_pixels[9] = ui4_l;
|
|
memcpy(pu1_dst, predicted_pixels, 4);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 2, 4);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 4, 4);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 6, 4);
|
}
|
|
/******************* 8x8 Modes *******************/
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_ref_filtering
|
*
|
* @brief
|
* Reference sample filtering process for Intra_8x8 sample prediction
|
*
|
* @par Description:
|
* Perform Reference sample filtering process for Intra_8x8 sample prediction ,described in sec 8.3.2.2.1
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride[Not Used]
|
*
|
* @param[in] dst_strd
|
* integer destination stride[Not Used]
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_8x8_mode_ref_filtering(UWORD8 *pu1_left,
|
UWORD8 *pu1_topleft,
|
UWORD8 *pu1_top,
|
UWORD8 *pu1_dst,
|
WORD32 left_strd,
|
WORD32 ngbr_avail)
|
{
|
WORD32 top_avail, left_avail, top_left_avail, top_right_avail;
|
|
left_avail = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK);
|
top_avail = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK);
|
top_left_avail = BOOLEAN(ngbr_avail & TOP_LEFT_MB_AVAILABLE_MASK);
|
top_right_avail = BOOLEAN(ngbr_avail & TOP_RIGHT_MB_AVAILABLE_MASK);
|
|
if(top_avail)
|
{
|
WORD32 i;
|
UWORD32 u4_xm1;
|
|
if(!top_right_avail)
|
{
|
memset(pu1_dst + 8 + 1 + 8, pu1_top[7], 8);
|
top_right_avail = 1;
|
}
|
else
|
{
|
memcpy(pu1_dst + 8 + 1 + 8, pu1_top + 8, 8);
|
}
|
|
if(top_left_avail)
|
{
|
pu1_dst[8 + 1 + 0] = FILT121((*pu1_topleft), pu1_top[0],
|
pu1_top[1]);
|
|
}
|
else
|
{
|
pu1_dst[8 + 1] = ((3 * pu1_top[0]) + pu1_top[1] + 2) >> 2;
|
}
|
|
for(i = 1; i <= 6; i++)
|
{
|
pu1_dst[8 + 1 + i] = FILT121(pu1_top[i - 1], pu1_top[i],
|
pu1_top[i + 1]);
|
|
}
|
/* First byte of Top Right input is in pu1_dst[8 + 1 + 8]*/
|
pu1_dst[8 + 1 + 7] = FILT121(pu1_top[6], pu1_top[7],
|
pu1_dst[8 + 1 + 8]);
|
|
/* filtered output and source in same buf, to prevent output(x - 1)
|
being over written in process */
|
u4_xm1 = pu1_top[7];
|
|
for(i = 8; i <= 14; i++)
|
{
|
UWORD32 u4_x;
|
u4_x = (u4_xm1 + (pu1_dst[8 + 1 + i] << 1) + pu1_dst[8 + 1 + i + 1]
|
+ 2) >> 2;
|
/* assigning u4_xm1 from the un-filtered values for the next iteration */
|
u4_xm1 = pu1_dst[8 + 1 + i];
|
pu1_dst[8 + 1 + i] = u4_x;
|
}
|
|
pu1_dst[8 + 1 + 15] = (u4_xm1 + (3 * pu1_dst[8 + 1 + 15]) + 2) >> 2;
|
|
}
|
|
/* pu1_topleft is overloaded. It is both: */
|
/* a. A pointer for the top left pixel */
|
/* b. An indicator of availability of top left. */
|
/* If it is null then top left not available */
|
if(top_left_avail)
|
{
|
if((!top_avail) || (!left_avail))
|
{
|
if(top_avail)
|
pu1_dst[8] = (3 * pu1_topleft[0] + pu1_top[0] + 2) >> 2;
|
else if(left_avail)
|
pu1_dst[8] = (3 * pu1_topleft[0] + pu1_left[0] + 2) >> 2;
|
}
|
else
|
{
|
pu1_dst[8] = FILT121(pu1_top[0], (*pu1_topleft), pu1_left[0]);
|
}
|
}
|
|
if(left_avail)
|
{
|
UWORD32 idx;
|
if(0 != pu1_topleft)
|
{
|
pu1_dst[7] = FILT121((*pu1_topleft), pu1_left[0],
|
pu1_left[left_strd]);
|
}
|
else
|
{
|
pu1_dst[7] = ((3 * pu1_left[0]) + pu1_left[left_strd] + 2) >> 2;
|
}
|
|
for(idx = 1; idx <= 6; idx++)
|
{
|
pu1_dst[7 - idx] = FILT121(pu1_left[(idx - 1) * left_strd],
|
pu1_left[idx * left_strd],
|
pu1_left[(idx + 1) * left_strd]);
|
|
}
|
pu1_dst[0] = (pu1_left[6 * left_strd] + 3 * pu1_left[7 * left_strd] + 2)
|
>> 2;
|
|
}
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_vert
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:vertical
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:vertical ,described in sec 8.3.2.2.2
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************
|
*/
|
void ih264_intra_pred_luma_8x8_mode_vert(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL;
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
|
memcpy(pu1_dst, pu1_top, 8);
|
memcpy(pu1_dst + dst_strd, pu1_top, 8);
|
memcpy(pu1_dst + 2 * dst_strd, pu1_top, 8);
|
memcpy(pu1_dst + 3 * dst_strd, pu1_top, 8);
|
memcpy(pu1_dst + 4 * dst_strd, pu1_top, 8);
|
memcpy(pu1_dst + 5 * dst_strd, pu1_top, 8);
|
memcpy(pu1_dst + 6 * dst_strd, pu1_top, 8);
|
memcpy(pu1_dst + 7 * dst_strd, pu1_top, 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_horz
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:horizontal
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:horizontal ,described in sec 8.3.2.2.2
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************
|
*/
|
|
void ih264_intra_pred_luma_8x8_mode_horz(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = pu1_src + BLK8x8SIZE - 1;
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
memset(pu1_dst, *pu1_left, 8);
|
memset(pu1_dst + dst_strd, *(pu1_left - 1), 8);
|
memset(pu1_dst + 2 * dst_strd, *(pu1_left - 2), 8);
|
memset(pu1_dst + 3 * dst_strd, *(pu1_left - 3), 8);
|
memset(pu1_dst + 4 * dst_strd, *(pu1_left - 4), 8);
|
memset(pu1_dst + 5 * dst_strd, *(pu1_left - 5), 8);
|
memset(pu1_dst + 6 * dst_strd, *(pu1_left - 6), 8);
|
memset(pu1_dst + 7 * dst_strd, *(pu1_left - 7), 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_dc
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:DC
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:DC ,described in sec 8.3.2.2.4
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_8x8_mode_dc(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 u1_useleft; /* availability of left predictors (only for DC) */
|
UWORD8 u1_usetop; /* availability of top predictors (only for DC) */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
WORD32 row;
|
WORD32 val = 0;
|
UNUSED(src_strd);
|
|
u1_useleft = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK);
|
u1_usetop = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
pu1_left = pu1_src + BLK8x8SIZE - 1;
|
|
if(u1_useleft)
|
{
|
for(row = 0; row < BLK8x8SIZE; row++)
|
val += *(pu1_left - row);
|
val += 4;
|
}
|
if(u1_usetop)
|
{
|
for(row = 0; row < BLK8x8SIZE; row++)
|
val += *(pu1_top + row);
|
val += 4;
|
}
|
|
/* Since 4 is added if either left/top pred is there,
|
val still being zero implies both preds are not there */
|
val = (val) ? (val >> (2 + u1_useleft + u1_usetop)) : 128;
|
|
memset(pu1_dst, val, 8);
|
memset(pu1_dst + dst_strd, val, 8);
|
memset(pu1_dst + 2 * dst_strd, val, 8);
|
memset(pu1_dst + 3 * dst_strd, val, 8);
|
memset(pu1_dst + 4 * dst_strd, val, 8);
|
memset(pu1_dst + 5 * dst_strd, val, 8);
|
memset(pu1_dst + 6 * dst_strd, val, 8);
|
memset(pu1_dst + 7 * dst_strd, val, 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_diag_dl
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Left
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Left ,described in sec 8.3.2.2.5
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_8x8_mode_diag_dl(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h;
|
UWORD32 ui4_i, ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p;
|
UWORD8 predicted_pixels[15];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_e = *pu1_top++;
|
ui4_f = *pu1_top++;
|
ui4_g = *pu1_top++;
|
ui4_h = *pu1_top++;
|
ui4_i = *pu1_top++;
|
ui4_j = *pu1_top++;
|
ui4_k = *pu1_top++;
|
ui4_l = *pu1_top++;
|
ui4_m = *pu1_top++;
|
ui4_n = *pu1_top++;
|
ui4_o = *pu1_top++;
|
ui4_p = *pu1_top;
|
|
predicted_pixels[0] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[1] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[2] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[3] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[4] = FILT121(ui4_e, ui4_f, ui4_g);
|
predicted_pixels[5] = FILT121(ui4_f, ui4_g, ui4_h);
|
predicted_pixels[6] = FILT121(ui4_g, ui4_h, ui4_i);
|
predicted_pixels[7] = FILT121(ui4_h, ui4_i, ui4_j);
|
predicted_pixels[8] = FILT121(ui4_i, ui4_j, ui4_k);
|
predicted_pixels[9] = FILT121(ui4_j, ui4_k, ui4_l);
|
predicted_pixels[10] = FILT121(ui4_k, ui4_l, ui4_m);
|
predicted_pixels[11] = FILT121(ui4_l, ui4_m, ui4_n);
|
predicted_pixels[12] = FILT121(ui4_m, ui4_n, ui4_o);
|
predicted_pixels[13] = FILT121(ui4_n, ui4_o, ui4_p);
|
predicted_pixels[14] = FILT121(ui4_o, ui4_p, ui4_p);
|
|
memcpy(pu1_dst, predicted_pixels, 8);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 1, 8);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 8);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 3, 8);
|
memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 4, 8);
|
memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 5, 8);
|
memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 6, 8);
|
memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 7, 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_diag_dr
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Right
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Right ,described in sec 8.3.2.2.6
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_8x8_mode_diag_dr(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_topleft = NULL; /* Pointer to start of top left predictors */
|
UWORD32 ui4_a;
|
UWORD32 ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h, ui4_i;
|
UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p, ui4_q;
|
UWORD8 predicted_pixels[15];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
pu1_left = pu1_src + BLK8x8SIZE - 1;
|
pu1_topleft = pu1_src + BLK8x8SIZE;
|
|
ui4_a = *pu1_topleft;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_e = *pu1_top++;
|
ui4_f = *pu1_top++;
|
ui4_g = *pu1_top++;
|
ui4_h = *pu1_top++;
|
ui4_i = *pu1_top;
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left--;
|
ui4_l = *pu1_left--;
|
ui4_m = *pu1_left--;
|
ui4_n = *pu1_left--;
|
ui4_o = *pu1_left--;
|
ui4_p = *pu1_left--;
|
ui4_q = *pu1_left;
|
|
predicted_pixels[6] = FILT121(ui4_a, ui4_j, ui4_k);
|
predicted_pixels[5] = FILT121(ui4_j, ui4_k, ui4_l);
|
predicted_pixels[4] = FILT121(ui4_k, ui4_l, ui4_m);
|
predicted_pixels[3] = FILT121(ui4_l, ui4_m, ui4_n);
|
predicted_pixels[2] = FILT121(ui4_m, ui4_n, ui4_o);
|
predicted_pixels[1] = FILT121(ui4_n, ui4_o, ui4_p);
|
predicted_pixels[0] = FILT121(ui4_o, ui4_p, ui4_q);
|
predicted_pixels[7] = FILT121(ui4_b, ui4_a, ui4_j);
|
predicted_pixels[8] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[9] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[10] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[11] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[12] = FILT121(ui4_e, ui4_f, ui4_g);
|
predicted_pixels[13] = FILT121(ui4_f, ui4_g, ui4_h);
|
predicted_pixels[14] = FILT121(ui4_g, ui4_h, ui4_i);
|
|
memcpy(pu1_dst, predicted_pixels + 7, 8);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 6, 8);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 5, 8);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 4, 8);
|
memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 3, 8);
|
memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 2, 8);
|
memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 1, 8);
|
memcpy(pu1_dst + 7 * dst_strd, predicted_pixels, 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_vert_r
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:Vertical_Right
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:Vertical_Right ,described in sec 8.3.2.2.7
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
void ih264_intra_pred_luma_8x8_mode_vert_r(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_topleft = NULL; /* Pointer to start of top left predictors */
|
UWORD32 ui4_a;
|
UWORD32 ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h, ui4_i;
|
UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p;
|
UWORD8 predicted_pixels[22];
|
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
pu1_left = pu1_src + BLK8x8SIZE - 1;
|
pu1_topleft = pu1_src + BLK8x8SIZE;
|
|
ui4_a = *pu1_topleft;
|
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_e = *pu1_top++;
|
ui4_f = *pu1_top++;
|
ui4_g = *pu1_top++;
|
ui4_h = *pu1_top++;
|
ui4_i = *pu1_top;
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left--;
|
ui4_l = *pu1_left--;
|
ui4_m = *pu1_left--;
|
ui4_n = *pu1_left--;
|
ui4_o = *pu1_left--;
|
ui4_p = *pu1_left--;
|
|
predicted_pixels[0] = FILT121(ui4_o, ui4_n, ui4_m);
|
predicted_pixels[1] = FILT121(ui4_m, ui4_l, ui4_k);
|
predicted_pixels[2] = FILT121(ui4_k, ui4_j, ui4_a);
|
predicted_pixels[3] = FILT11(ui4_a, ui4_b);
|
predicted_pixels[4] = FILT11(ui4_b, ui4_c);
|
predicted_pixels[5] = FILT11(ui4_c, ui4_d);
|
predicted_pixels[6] = FILT11(ui4_d, ui4_e);
|
predicted_pixels[7] = FILT11(ui4_e, ui4_f);
|
predicted_pixels[8] = FILT11(ui4_f, ui4_g);
|
predicted_pixels[9] = FILT11(ui4_g, ui4_h);
|
predicted_pixels[10] = FILT11(ui4_h, ui4_i);
|
predicted_pixels[11] = FILT121(ui4_p, ui4_o, ui4_n);
|
predicted_pixels[12] = FILT121(ui4_n, ui4_m, ui4_l);
|
predicted_pixels[13] = FILT121(ui4_l, ui4_k, ui4_j);
|
predicted_pixels[14] = FILT121(ui4_b, ui4_a, ui4_j);
|
predicted_pixels[15] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[16] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[17] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[18] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[19] = FILT121(ui4_e, ui4_f, ui4_g);
|
predicted_pixels[20] = FILT121(ui4_f, ui4_g, ui4_h);
|
predicted_pixels[21] = FILT121(ui4_g, ui4_h, ui4_i);
|
|
memcpy(pu1_dst, predicted_pixels + 3, 8);
|
memcpy(pu1_dst + 1 * dst_strd, predicted_pixels + 14, 8);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 8);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 13, 8);
|
memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 1, 8);
|
memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 12, 8);
|
memcpy(pu1_dst + 6 * dst_strd, predicted_pixels, 8);
|
memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 11, 8);
|
|
}
|
|
/*
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_horz_d
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:Horizontal_Down
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:Horizontal_Down ,described in sec 8.3.2.2.8
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_8x8_mode_horz_d(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_topleft = NULL; /* Pointer to start of top left predictors */
|
UWORD32 ui4_a;
|
UWORD32 ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h, ui4_i;
|
UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p;
|
UWORD8 predicted_pixels[22];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
pu1_left = pu1_src + BLK8x8SIZE - 1;
|
pu1_topleft = pu1_src + BLK8x8SIZE;
|
|
ui4_a = *pu1_topleft;
|
ui4_j = *pu1_top++;
|
ui4_k = *pu1_top++;
|
ui4_l = *pu1_top++;
|
ui4_m = *pu1_top++;
|
ui4_n = *pu1_top++;
|
ui4_o = *pu1_top++;
|
ui4_p = *pu1_top++;
|
ui4_b = *pu1_left--;
|
ui4_c = *pu1_left--;
|
ui4_d = *pu1_left--;
|
ui4_e = *pu1_left--;
|
ui4_f = *pu1_left--;
|
ui4_g = *pu1_left--;
|
ui4_h = *pu1_left--;
|
ui4_i = *pu1_left;
|
|
predicted_pixels[0] = FILT11(ui4_h, ui4_i);
|
predicted_pixels[1] = FILT121(ui4_g, ui4_h, ui4_i);
|
predicted_pixels[2] = FILT11(ui4_g, ui4_h);
|
predicted_pixels[3] = FILT121(ui4_f, ui4_g, ui4_h);
|
predicted_pixels[4] = FILT11(ui4_f, ui4_g);
|
predicted_pixels[5] = FILT121(ui4_e, ui4_f, ui4_g);
|
predicted_pixels[6] = FILT11(ui4_e, ui4_f);
|
predicted_pixels[7] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[8] = FILT11(ui4_d, ui4_e);
|
predicted_pixels[9] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[10] = FILT11(ui4_c, ui4_d);
|
predicted_pixels[11] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[12] = FILT11(ui4_b, ui4_c);
|
predicted_pixels[13] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[14] = FILT11(ui4_a, ui4_b);
|
predicted_pixels[15] = FILT121(ui4_j, ui4_a, ui4_b);
|
predicted_pixels[16] = FILT121(ui4_k, ui4_j, ui4_a);
|
predicted_pixels[17] = FILT121(ui4_l, ui4_k, ui4_j);
|
predicted_pixels[18] = FILT121(ui4_m, ui4_l, ui4_k);
|
predicted_pixels[19] = FILT121(ui4_n, ui4_m, ui4_l);
|
predicted_pixels[20] = FILT121(ui4_o, ui4_n, ui4_m);
|
predicted_pixels[21] = FILT121(ui4_p, ui4_o, ui4_n);
|
|
memcpy(pu1_dst, predicted_pixels + 14, 8);
|
memcpy(pu1_dst + dst_strd, predicted_pixels + 12, 8);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 10, 8);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 8, 8);
|
memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 6, 8);
|
memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 4, 8);
|
memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 2, 8);
|
memcpy(pu1_dst + 7 * dst_strd, predicted_pixels, 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_vert_l
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:Vertical_Left
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:Vertical_Left ,described in sec 8.3.2.2.9
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_8x8_mode_vert_l(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h;
|
UWORD32 ui4_i, ui4_j, ui4_k, ui4_l, ui4_m;
|
UWORD8 predicted_pixels[22];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + BLK8x8SIZE + 1;
|
|
ui4_a = *pu1_top++;
|
ui4_b = *pu1_top++;
|
ui4_c = *pu1_top++;
|
ui4_d = *pu1_top++;
|
ui4_e = *pu1_top++;
|
ui4_f = *pu1_top++;
|
ui4_g = *pu1_top++;
|
ui4_h = *pu1_top++;
|
ui4_i = *pu1_top++;
|
ui4_j = *pu1_top++;
|
ui4_k = *pu1_top++;
|
ui4_l = *pu1_top++;
|
ui4_m = *pu1_top++;
|
|
predicted_pixels[0] = FILT11(ui4_a, ui4_b);
|
predicted_pixels[1] = FILT11(ui4_b, ui4_c);
|
predicted_pixels[2] = FILT11(ui4_c, ui4_d);
|
predicted_pixels[3] = FILT11(ui4_d, ui4_e);
|
predicted_pixels[4] = FILT11(ui4_e, ui4_f);
|
predicted_pixels[5] = FILT11(ui4_f, ui4_g);
|
predicted_pixels[6] = FILT11(ui4_g, ui4_h);
|
predicted_pixels[7] = FILT11(ui4_h, ui4_i);
|
predicted_pixels[8] = FILT11(ui4_i, ui4_j);
|
predicted_pixels[9] = FILT11(ui4_j, ui4_k);
|
predicted_pixels[10] = FILT11(ui4_k, ui4_l);
|
predicted_pixels[11] = FILT121(ui4_a, ui4_b, ui4_c);
|
predicted_pixels[12] = FILT121(ui4_b, ui4_c, ui4_d);
|
predicted_pixels[13] = FILT121(ui4_c, ui4_d, ui4_e);
|
predicted_pixels[14] = FILT121(ui4_d, ui4_e, ui4_f);
|
predicted_pixels[15] = FILT121(ui4_e, ui4_f, ui4_g);
|
predicted_pixels[16] = FILT121(ui4_f, ui4_g, ui4_h);
|
predicted_pixels[17] = FILT121(ui4_g, ui4_h, ui4_i);
|
predicted_pixels[18] = FILT121(ui4_h, ui4_i, ui4_j);
|
predicted_pixels[19] = FILT121(ui4_i, ui4_j, ui4_k);
|
predicted_pixels[20] = FILT121(ui4_j, ui4_k, ui4_l);
|
predicted_pixels[21] = FILT121(ui4_k, ui4_l, ui4_m);
|
|
memcpy(pu1_dst, predicted_pixels, 8);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 1, 8);
|
memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 2, 8);
|
memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 3, 8);
|
memcpy(pu1_dst + 1 * dst_strd, predicted_pixels + 11, 8);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 12, 8);
|
memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 13, 8);
|
memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 14, 8);
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_8x8_mode_horz_u
|
*
|
* @brief
|
* Perform Intra prediction for luma_8x8 mode:Horizontal_Up
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_8x8 mode:Horizontal_Up ,described in sec 8.3.2.2.10
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_8x8_mode_horz_u(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p, ui4_q;
|
UWORD8 predicted_pixels[22];
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_left = pu1_src + BLK8x8SIZE - 1;
|
|
ui4_j = *pu1_left--;
|
ui4_k = *pu1_left--;
|
ui4_l = *pu1_left--;
|
ui4_m = *pu1_left--;
|
ui4_n = *pu1_left--;
|
ui4_o = *pu1_left--;
|
ui4_p = *pu1_left--;
|
ui4_q = *pu1_left;
|
|
pu1_left = pu1_src + BLK8x8SIZE - 1;
|
|
predicted_pixels[0] = FILT11(ui4_j, ui4_k);
|
predicted_pixels[1] = FILT121(ui4_j, ui4_k, ui4_l);
|
predicted_pixels[2] = FILT11(ui4_k, ui4_l);
|
predicted_pixels[3] = FILT121(ui4_k, ui4_l, ui4_m);
|
predicted_pixels[4] = FILT11(ui4_l, ui4_m);
|
predicted_pixels[5] = FILT121(ui4_l, ui4_m, ui4_n);
|
predicted_pixels[6] = FILT11(ui4_m, ui4_n);
|
predicted_pixels[7] = FILT121(ui4_m, ui4_n, ui4_o);
|
predicted_pixels[8] = FILT11(ui4_n, ui4_o);
|
predicted_pixels[9] = FILT121(ui4_n, ui4_o, ui4_p);
|
predicted_pixels[10] = FILT11(ui4_o, ui4_p);
|
predicted_pixels[11] = FILT121(ui4_o, ui4_p, ui4_q);
|
predicted_pixels[12] = FILT11(ui4_p, ui4_q);
|
predicted_pixels[13] = FILT121(ui4_p, ui4_q, ui4_q);
|
memset(predicted_pixels+14,ui4_q,8);
|
|
memcpy(pu1_dst, predicted_pixels, 8);
|
memcpy(pu1_dst + 1 * dst_strd, predicted_pixels + 2, 8);
|
memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 4, 8);
|
memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 6, 8);
|
memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 8, 8);
|
memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 10, 8);
|
memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 12, 8);
|
memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 14, 8);
|
}
|
|
|
/******************* 16x16 Modes *******************/
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_16x16_mode_vert
|
*
|
* @brief
|
* Perform Intra prediction for luma_16x16 mode:Vertical
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_16x16 mode:Vertical, described in sec 8.3.3.1
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels (Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_16x16_mode_vert(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
WORD32 rows; /* loop variables*/
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + MB_SIZE + 1;
|
|
for(rows = 0; rows < 16; rows += 4, pu1_dst += dst_strd)
|
{
|
memcpy(pu1_dst, pu1_top, 16);
|
pu1_dst += dst_strd;
|
memcpy(pu1_dst, pu1_top, 16);
|
pu1_dst += dst_strd;
|
memcpy(pu1_dst, pu1_top, 16);
|
pu1_dst += dst_strd;
|
memcpy(pu1_dst, pu1_top, 16);
|
}
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_16x16_mode_horz
|
*
|
* @brief
|
* Perform Intra prediction for luma_16x16 mode:Horizontal
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_16x16 mode:Horizontal, described in sec 8.3.3.2
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_16x16_mode_horz(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
UWORD8 *pu1_left = NULL; /* Pointer to start of top predictors */
|
WORD32 rows;
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_left = pu1_src + MB_SIZE - 1;
|
|
for(rows = 0; rows < 16; rows += 4, pu1_dst += dst_strd, pu1_left --)
|
{
|
memset(pu1_dst, *pu1_left, 16); /* copy the left value to the entire row*/
|
pu1_left --;
|
pu1_dst += dst_strd;
|
memset(pu1_dst, *pu1_left, 16);
|
pu1_left --;
|
pu1_dst += dst_strd;
|
memset(pu1_dst, *pu1_left, 16);
|
pu1_left --;
|
pu1_dst += dst_strd;
|
memset(pu1_dst, *pu1_left, 16);
|
}
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_16x16_mode_dc
|
*
|
* @brief
|
* Perform Intra prediction for luma_16x16 mode:DC
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_16x16 mode:DC, described in sec 8.3.3.3
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
** @param[in] ngbr_avail
|
* availability of neighbouring pixels
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_16x16_mode_dc(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
WORD8 u1_useleft; /* availability of left predictors (only for DC) */
|
UWORD8 u1_usetop; /* availability of top predictors (only for DC) */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
WORD32 rows; /* loop variables*/
|
WORD32 val = 0;
|
UNUSED(src_strd);
|
|
u1_useleft = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK);
|
u1_usetop = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK);
|
pu1_top = pu1_src + MB_SIZE + 1;
|
pu1_left = pu1_src + MB_SIZE - 1;
|
if(u1_useleft)
|
{
|
for(rows = 0; rows < 16; rows++)
|
val += *(pu1_left - rows);
|
val += 8;
|
}
|
if(u1_usetop)
|
{
|
for(rows = 0; rows < 16; rows++)
|
val += *(pu1_top + rows);
|
val += 8;
|
}
|
/* Since 8 is added if either left/top pred is there,
|
val still being zero implies both preds are not there */
|
val = (val) ? (val >> (3 + u1_useleft + u1_usetop)) : 128;
|
|
for(rows = 0; rows < 16; rows += 4, pu1_dst += dst_strd)
|
{
|
memset(pu1_dst, val, 16);
|
pu1_dst += dst_strd;
|
memset(pu1_dst, val, 16);
|
pu1_dst += dst_strd;
|
memset(pu1_dst, val, 16);
|
pu1_dst += dst_strd;
|
memset(pu1_dst, val, 16);
|
}
|
}
|
|
/**
|
*******************************************************************************
|
*
|
*ih264_intra_pred_luma_16x16_mode_plane
|
*
|
* @brief
|
* Perform Intra prediction for luma_16x16 mode:PLANE
|
*
|
* @par Description:
|
* Perform Intra prediction for luma_16x16 mode:PLANE, described in sec 8.3.3.4
|
*
|
* @param[in] pu1_src
|
* UWORD8 pointer to the source
|
*
|
* @param[out] pu1_dst
|
* UWORD8 pointer to the destination
|
*
|
* @param[in] src_strd
|
* integer source stride
|
*
|
* @param[in] dst_strd
|
* integer destination stride
|
*
|
* @param[in] ngbr_avail
|
* availability of neighbouring pixels(Not used in this function)
|
*
|
* @returns
|
*
|
* @remarks
|
* None
|
*
|
*******************************************************************************/
|
|
void ih264_intra_pred_luma_16x16_mode_plane(UWORD8 *pu1_src,
|
UWORD8 *pu1_dst,
|
WORD32 src_strd,
|
WORD32 dst_strd,
|
WORD32 ngbr_avail)
|
{
|
/*! Written with no multiplications */
|
UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */
|
UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */
|
UWORD8 *pu1_topleft = NULL;
|
WORD32 a, b, c, tmp;
|
UWORD8 *pu1_tmp1, *pu1_tmp2;
|
WORD32 shift;
|
UNUSED(src_strd);
|
UNUSED(ngbr_avail);
|
pu1_top = pu1_src + MB_SIZE + 1;
|
pu1_left = pu1_src + MB_SIZE - 1;
|
pu1_topleft = pu1_src + MB_SIZE;
|
|
{
|
a = (*(pu1_top + 15) + *(pu1_left - 15)) << 4;
|
|
/*! Implement Sum(x*(P((x+7),-1) - P((x-7),-1))) x=1...8 */
|
pu1_tmp1 = pu1_top + 8;
|
pu1_tmp2 = pu1_tmp1 - 2;
|
|
/* Pixel diffs are only 9 bits;
|
so sign extension allows shifts to be used even for signed */
|
b = ((*pu1_tmp1++) - (*pu1_tmp2--)); /* x=1 */
|
b += ((*pu1_tmp1++) - (*pu1_tmp2--)) << 1; /* x=2 */
|
tmp = ((*pu1_tmp1++) - (*pu1_tmp2--));
|
b += (tmp << 1) + tmp; /* x=3 */
|
b += ((*pu1_tmp1++) - (*pu1_tmp2--)) << 2; /* x=4 */
|
|
tmp = ((*pu1_tmp1++) - (*pu1_tmp2--));
|
b += (tmp << 2) + tmp; /* x=5 */
|
tmp = ((*pu1_tmp1++) - (*pu1_tmp2--));
|
b += (tmp << 2) + (tmp << 1); /* x=6 */
|
tmp = ((*pu1_tmp1++) - (*pu1_tmp2--));
|
b += (tmp << 3) - tmp; /* x=7 */
|
b += ((*pu1_tmp1) - (*pu1_topleft)) << 3; /* x=8 */
|
|
b = ((b << 2) + b + 32) >> 6; /*! (5*H + 32)>>6 */
|
|
/*! Implement Sum(y*(P(-1,(y+7)) - P(-1,(y-7)))) y=1...8 */
|
pu1_tmp1 = pu1_left - 8;
|
pu1_tmp2 = pu1_tmp1 + 2;
|
|
c = ((*pu1_tmp1) - (*pu1_tmp2)); /* y=1 */
|
pu1_tmp1--;
|
pu1_tmp2++;
|
c += ((*pu1_tmp1) - (*pu1_tmp2)) << 1; /* y=2 */
|
pu1_tmp1--;
|
pu1_tmp2++;
|
tmp = ((*pu1_tmp1) - (*pu1_tmp2));
|
c += (tmp << 1) + tmp; /* y=3 */
|
pu1_tmp1--;
|
pu1_tmp2++;
|
c += ((*pu1_tmp1) - (*pu1_tmp2)) << 2; /* y=4 */
|
pu1_tmp1--;
|
pu1_tmp2++;
|
|
tmp = ((*pu1_tmp1) - (*pu1_tmp2));
|
c += (tmp << 2) + tmp; /* y=5 */
|
pu1_tmp1--;
|
pu1_tmp2++;
|
tmp = ((*pu1_tmp1) - (*pu1_tmp2));
|
c += (tmp << 2) + (tmp << 1); /* y=6 */
|
pu1_tmp1--;
|
pu1_tmp2++;
|
tmp = ((*pu1_tmp1) - (*pu1_tmp2));
|
c += (tmp << 3) - tmp; /* y=7 */
|
pu1_tmp1--; //pu1_tmp2 ++;
|
/* Modified to get (-1,-1) location as *(pu1_top - 1) instead of (pu1_left - ui4_stride) */
|
//c += ((*pu1_tmp1) - (*(pu1_top - 1)))<<3; /* y=8 */
|
c += ((*pu1_tmp1) - (*pu1_topleft)) << 3; /* y=8 */
|
|
c = ((c << 2) + c + 32) >> 6; /*! (5*V + 32)>>32 */
|
shift = 3;
|
}
|
|
/*! Now from the plane parameters a, b, and c,
|
compute the fitted plane values over the block */
|
{
|
WORD32 tmp1, tmpx, tmpx_init, j, i;
|
|
tmpx_init = -(b << shift); /* -8b */
|
tmp = a - (c << shift) + 16; /* a-((4or8)*c)+16 */
|
for(i = 0; i < 16; i++)
|
{
|
tmp += c; /*increment every time by c to get c*(y-7or3)*/
|
tmpx = tmpx_init; /* Init to -8b */
|
for(j = 0; j < 16; j++)
|
{
|
tmpx += b; /* increment every time by b to get b*(x-7or3) */
|
tmp1 = (tmp + tmpx) >> 5;
|
*pu1_dst++ = CLIP_U8(tmp1);
|
}
|
pu1_dst += (dst_strd - 16);
|
}
|
}
|
}
|