C++程序  |  218行  |  10.69 KB

/******************************************************************************
 *
 * Copyright (C) 2018 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 ihevce_common_utils.h
*
* @brief
*  Contains the declarations and definitions of common utils for encoder
*
* @author
*  ittiam
*
******************************************************************************
*/

#ifndef _IHEVCE_COMMON_UTILS_H_
#define _IHEVCE_COMMON_UTILS_H_

#include <math.h>
#include <limits.h>

/*****************************************************************************/
/* Constant Macros                                                           */
/*****************************************************************************/

/*****************************************************************************/
/* Function Macros                                                           */
/*****************************************************************************/

/**
******************************************************************************
*  @macro  IHEVCE_WT_PRED
*  @brief Implements wt pred formula as per spec
******************************************************************************
*/
#define IHEVCE_WT_PRED(p0, p1, w0, w1, rnd, shift)                                                 \
    (((((WORD32)w0) * ((WORD32)p0) + ((WORD32)w1) * ((WORD32)p1)) >> shift) + rnd)

#define SORT_PRIMARY_INTTYPE_ARRAY_AND_REORDER_GENERIC_COMPANION_ARRAY(                            \
    primary_array, companion_array, array_length, type_companion)                                  \
    {                                                                                              \
        WORD32 i, j;                                                                               \
                                                                                                   \
        for(i = 0; i < (array_length - 1); i++)                                                    \
        {                                                                                          \
            for(j = (i + 1); j < array_length; j++)                                                \
            {                                                                                      \
                if(primary_array[i] > primary_array[j])                                            \
                {                                                                                  \
                    type_companion t;                                                              \
                                                                                                   \
                    SWAP(primary_array[i], primary_array[j]);                                      \
                                                                                                   \
                    t = companion_array[i];                                                        \
                    companion_array[i] = companion_array[j];                                       \
                    companion_array[j] = t;                                                        \
                }                                                                                  \
            }                                                                                      \
        }                                                                                          \
    }

#define SORT_PRIMARY_INTTYPE_ARRAY_AND_REORDER_INTTYPE_COMPANION_ARRAY(                            \
    primary_array, companion_array, array_length)                                                  \
    {                                                                                              \
        WORD32 i, j;                                                                               \
                                                                                                   \
        for(i = 0; i < (array_length - 1); i++)                                                    \
        {                                                                                          \
            for(j = (i + 1); j < array_length; j++)                                                \
            {                                                                                      \
                if(primary_array[i] > primary_array[j])                                            \
                {                                                                                  \
                    type_companion t;                                                              \
                                                                                                   \
                    SWAP(primary_array[i], primary_array[j]);                                      \
                    SWAP(companion_array[i], companion_array[j]);                                  \
                }                                                                                  \
            }                                                                                      \
        }                                                                                          \
    }

#define SORT_INTTYPE_ARRAY(primary_array, array_length)                                            \
    {                                                                                              \
        WORD32 i, j;                                                                               \
                                                                                                   \
        for(i = 0; i < (array_length - 1); i++)                                                    \
        {                                                                                          \
            for(j = (i + 1); j < array_length; j++)                                                \
            {                                                                                      \
                if(primary_array[i] > primary_array[j])                                            \
                {                                                                                  \
                    SWAP(primary_array[i], primary_array[j]);                                      \
                }                                                                                  \
            }                                                                                      \
        }                                                                                          \
    }

#define SET_BIT(x, bitpos) ((x) | (1 << (bitpos)))

#define CLEAR_BIT(x, bitpos) ((x) & (~(1 << (bitpos))))

#define CU_TREE_NODE_FILL(ps_node, valid_flag, posx, posy, size, inter_eval_enable)                \
    {                                                                                              \
        ps_node->is_node_valid = valid_flag;                                                       \
        ps_node->u1_cu_size = size;                                                                \
        ps_node->u1_intra_eval_enable = 0;                                                         \
        ps_node->b3_cu_pos_x = posx;                                                               \
        ps_node->b3_cu_pos_y = posy;                                                               \
        ps_node->u1_inter_eval_enable = inter_eval_enable;                                         \
    }

/*****************************************************************************/
/* Extern Function Declarations                                              */
/*****************************************************************************/

void ihevce_copy_2d(
    UWORD8 *pu1_dst,
    WORD32 dst_stride,
    UWORD8 *pu1_src,
    WORD32 src_stride,
    WORD32 blk_wd,
    WORD32 blk_ht);

void ihevce_2d_square_copy_luma(
    void *p_dst,
    WORD32 dst_strd,
    void *p_src,
    WORD32 src_strd,
    WORD32 num_cols_to_copy,
    WORD32 unit_size);

void ihevce_wt_avg_2d(
    UWORD8 *pu1_pred0,
    UWORD8 *pu1_pred1,
    WORD32 pred0_strd,
    WORD32 pred1_strd,
    WORD32 wd,
    WORD32 ht,
    UWORD8 *pu1_dst,
    WORD32 dst_strd,
    WORD32 w0,
    WORD32 w1,
    WORD32 o0,
    WORD32 o1,
    WORD32 log_wdc);

void ihevce_itrans_recon_dc(
    UWORD8 *pu1_pred,
    WORD32 pred_strd,
    UWORD8 *pu1_dst,
    WORD32 dst_strd,
    WORD32 trans_size,
    WORD16 i2_deq_value,
    CHROMA_PLANE_ID_T e_chroma_plane);

WORD32 ihevce_find_num_clusters_of_identical_points_1D(
    UWORD8 *pu1_inp_array,
    UWORD8 *pu1_out_array,
    UWORD8 *pu1_freq_of_out_data_in_inp,
    WORD32 i4_num_inp_array_elements);

void ihevce_scale_mv(mv_t *ps_mv, WORD32 i4_poc_to, WORD32 i4_poc_from, WORD32 i4_curr_poc);

WORD32 ihevce_compare_pu_mv_t(
    pu_mv_t *ps_1, pu_mv_t *ps_2, WORD32 i4_pred_mode_1, WORD32 i4_pred_mode_2);

void ihevce_set_pred_buf_as_free(UWORD32 *pu4_idx_array, UWORD8 u1_buf_id);

UWORD8 ihevce_get_free_pred_buf_indices(
    UWORD8 *pu1_idx_array, UWORD32 *pu4_bitfield, UWORD8 u1_num_bufs_requested);

WORD32 ihevce_osal_init(void *pv_hle_ctxt);

WORD32 ihevce_osal_delete(void *pv_hle_ctxt);

static INLINE UWORD32 ihevce_num_ones_generic(UWORD32 bitfield)
{
    bitfield = bitfield - ((bitfield >> 1) & 0x55555555);
    bitfield = (bitfield & 0x33333333) + ((bitfield >> 2) & 0x33333333);
    return (((bitfield + (bitfield >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

static INLINE UWORD32 ihevce_num_ones_popcnt(UWORD32 bitfield)
{
    return __builtin_popcount(bitfield);
}

WORD32 ihevce_compute_area_of_valid_cus_in_ctb(cur_ctb_cu_tree_t *ps_cu_tree);

void ihevce_cu_tree_init(
    cur_ctb_cu_tree_t *ps_cu_tree,
    cur_ctb_cu_tree_t *ps_cu_tree_root,
    WORD32 *pi4_nodes_created_in_cu_tree,
    WORD32 tree_depth,
    CU_POS_T e_grandparent_blk_pos,
    CU_POS_T e_parent_blk_pos,
    CU_POS_T e_cur_blk_pos);

#endif /* _IHEVCE_COMMON_UTILS_H_ */