252 lines
8.1 KiB
C
252 lines
8.1 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2022 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
|
|
*/
|
|
|
|
#ifndef _ISVC_INTRA_RESAMPLE_H_
|
|
#define _ISVC_INTRA_RESAMPLE_H_
|
|
|
|
#include "ih264_typedefs.h"
|
|
#include "isvc_macros.h"
|
|
#include "ih264_platform_macros.h"
|
|
#include "isvc_structs.h"
|
|
|
|
#define DYADIC_REF_W_Y 20
|
|
#define DYADIC_REF_H_Y 20
|
|
#define DYADIC_REF_W_C 10
|
|
#define DYADIC_REF_H_C 10
|
|
|
|
#define MAX_NUM_RES_LYRS 4
|
|
|
|
#define MAX_PIX_FILL_LUMA 4
|
|
#define MAX_PIX_FILL_CHROMA 2
|
|
|
|
#define MAX_REF_ARR_WD_HT 48
|
|
#define MAX_REF_IDX_ARRAY (MAX_REF_ARR_WD_HT + MB_SIZE)
|
|
|
|
#define CLIPUCHAR(x) CLIP3(0, 255, (x))
|
|
|
|
#define REF_ARRAY_WIDTH 48
|
|
#define REF_ARRAY_HEIGHT 48
|
|
|
|
typedef void FT_INTERPOLATE_LUMA_2X(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
|
|
UWORD8 *pu1_out_buf, WORD32 i4_out_stride);
|
|
|
|
typedef void FT_VERT_INTERPOLATE_CHROMA_2X(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
|
|
WORD32 i4_phase_0, WORD32 i4_phase_1);
|
|
|
|
typedef void FT_HORZ_INTERPOLATE_CHROMA_2X(WORD16 *pi2_tmp_filt_buf, UWORD8 *pu1_out_buf,
|
|
WORD32 i4_out_stride, WORD32 i4_phase_0,
|
|
WORD32 i4_phase_1);
|
|
|
|
typedef struct mem_element_t
|
|
{
|
|
/* Buffer pointer */
|
|
void *pv_buffer;
|
|
|
|
/* size of the structure or unit */
|
|
WORD32 i4_element_size;
|
|
|
|
/* Stride of buffer in terms of number of elements.*/
|
|
WORD32 i4_num_element_stride;
|
|
} mem_element_t;
|
|
|
|
typedef struct seg_description_t
|
|
{
|
|
/* describes segment dimension */
|
|
UWORD8 u1_seg_dim;
|
|
|
|
/* describes offset from start */
|
|
UWORD8 u1_seg_off;
|
|
|
|
/* describes whether mb is adjoining the segment
|
|
0 => not adjoining 1 => adjoining */
|
|
UWORD8 u1_mb_adjoin;
|
|
|
|
/* distance to nearest MB */
|
|
WORD8 i1_dist_idx;
|
|
|
|
/* describes the nearest mb boundary
|
|
+1 => rightMB/bottomMB
|
|
-1 => leftMB/topMB */
|
|
WORD8 i1_nearst_mb_bdry;
|
|
} seg_description_t;
|
|
|
|
typedef struct seg_lookup_desc_t
|
|
{
|
|
/* place holder to store the number of segments */
|
|
UWORD8 u1_num_segments;
|
|
|
|
/* this variable indicates where is start locatiion of the segment with
|
|
respect to less the block_width or greater than block width*/
|
|
UWORD8 u4_start_pos;
|
|
|
|
/* place holder to store per segment description */
|
|
seg_description_t s_segments[4];
|
|
} seg_lookup_desc_t;
|
|
|
|
typedef struct intra_samp_lyr_ctxt
|
|
{
|
|
/* mb position */
|
|
coordinates_t *ps_mb_pos;
|
|
|
|
/* reference layer width in terms luma samples */
|
|
WORD32 i4_ref_width;
|
|
|
|
/* reference layer height in terms luma samples */
|
|
WORD32 i4_ref_height;
|
|
|
|
/* Constrained intra resampling flag. Range is [0,1]. */
|
|
WORD8 i1_constrained_intra_rsmpl_flag;
|
|
|
|
/* Chroma xPhase for even values of x for dyadic cases */
|
|
WORD32 i4_x_phase_0;
|
|
|
|
/* Chroma xPhase for odd values of x for dyadic cases */
|
|
WORD32 i4_x_phase_1;
|
|
|
|
/* Chroma yPhase for even values of y for dyadic cases */
|
|
WORD32 i4_y_phase_0;
|
|
|
|
/* Chroma yPhase for odd values of y for dyadic cases */
|
|
WORD32 i4_y_phase_1;
|
|
|
|
FT_INTERPOLATE_LUMA_2X *pf_interpolate_luma;
|
|
|
|
FT_VERT_INTERPOLATE_CHROMA_2X *pf_vert_interpol_chroma;
|
|
|
|
FT_HORZ_INTERPOLATE_CHROMA_2X *pf_horz_interpol_chroma;
|
|
|
|
WORD16 i2_x_min_pos;
|
|
|
|
WORD16 i2_x_max_pos;
|
|
|
|
WORD16 i2_y_min_pos;
|
|
|
|
WORD16 i2_y_max_pos;
|
|
|
|
coordinates_t *ps_phase;
|
|
|
|
WORD32 *pi4_ref_array_positions_x;
|
|
|
|
WORD32 *pi4_ref_array_positions_y;
|
|
|
|
coordinates_t *ps_offsets;
|
|
|
|
coordinates_t *ps_ref_array_dims;
|
|
|
|
/* buffers to store lookup for horizontal segment description */
|
|
seg_lookup_desc_t as_seg_lookup_horz[MB_SIZE];
|
|
|
|
/* buffers to store lookup for vertical segment description */
|
|
seg_lookup_desc_t as_seg_lookup_vert[MB_SIZE];
|
|
|
|
/* buffers to store lookup for x indexes to get
|
|
availability from 4x4 availability grid */
|
|
UWORD8 au1_refarray_x_idx[MAX_REF_IDX_ARRAY];
|
|
|
|
/* buffers to store lookup for y indexes to get
|
|
availability from 4x4 availability grid */
|
|
UWORD8 au1_refarray_y_idx[MAX_REF_IDX_ARRAY];
|
|
} intra_samp_lyr_ctxt;
|
|
|
|
typedef struct intra_sampling_ctxt_t
|
|
{
|
|
/* Array of resolution layer ctxt. */
|
|
intra_samp_lyr_ctxt as_res_lyrs[MAX_NUM_RES_LYRS];
|
|
|
|
/* pointer to array of SPS */
|
|
void *ps_sps;
|
|
|
|
/* buffer to store the reference layer data before intra sampling */
|
|
UWORD8 *pu1_refarray_buffer;
|
|
|
|
/* buffer to hold the reference layer Cb data before intra
|
|
resampling (used for dyadic cases only) */
|
|
UWORD8 *pu1_refarray_cb;
|
|
|
|
/* buffer to hold the reference layer Cr data before intra
|
|
resampling (used for dyadic cases only) */
|
|
UWORD8 *pu1_refarray_cr;
|
|
|
|
/* intermideate buffer for interpolation */
|
|
WORD32 *pi4_temp_interpolation_buffer;
|
|
|
|
/* resolution id of the layer which is to be processed */
|
|
WORD32 i4_res_lyr_id;
|
|
|
|
/* reference layer width in terms luma samples */
|
|
WORD32 i4_ref_width;
|
|
|
|
/* reference layer width in terms luma samples */
|
|
WORD32 i4_refarray_stride;
|
|
|
|
/* reference layer height in terms luma samples */
|
|
WORD32 i4_ref_height;
|
|
} intra_sampling_ctxt_t;
|
|
|
|
typedef struct inter_lyr_mb_prms_t
|
|
{
|
|
/* NNZs of Chroma. Here each bit corresonds
|
|
to a NNZs of 4x4 sub block. Lower 4 bits are
|
|
used for Cb and upper are used for Cr */
|
|
UWORD8 u1_chroma_nnz;
|
|
|
|
/* NNZs of Luma. Here each bit corresonds
|
|
to a NNZs of 4x4 sub block in raster scan order. */
|
|
UWORD16 u2_luma_nnz;
|
|
|
|
/* Packed MB mode transform size of an MB */
|
|
WORD8 i1_mb_mode;
|
|
} inter_lyr_mb_prms_t;
|
|
|
|
/* Function declarations */
|
|
extern void isvc_intra_samp_mb_dyadic(void *pv_intra_samp_ctxt, mem_element_t *ps_ref_luma,
|
|
mem_element_t *ps_ref_chroma,
|
|
mem_element_t *ps_ref_mb_mode_map,
|
|
mem_element_t *ps_curr_luma, mem_element_t *ps_curr_chroma,
|
|
UWORD16 u2_mb_x, UWORD16 u2_mb_y,
|
|
WORD32 i4_scaled_ref_layer_left_offset,
|
|
WORD32 i4_scaled_ref_layer_top_offset);
|
|
|
|
extern void isvc_intra_samp_mb(void *pv_intra_samp_ctxt_luma, void *pv_intra_samp_ctxt_chroma,
|
|
mem_element_t *ps_ref_luma, mem_element_t *ps_ref_chroma,
|
|
mem_element_t *ps_ref_mb_mode_map, mem_element_t *ps_curr_luma,
|
|
mem_element_t *ps_curr_chroma);
|
|
|
|
extern void isvc_intra_resamp_generate_segment_lookup(seg_lookup_desc_t *ps_seg_lookup_table,
|
|
WORD32 i4_dimension, WORD32 i4_mb_size,
|
|
WORD32 i4_shift_val);
|
|
|
|
/* C Declarations */
|
|
extern FT_INTERPOLATE_LUMA_2X isvc_interpolate_base_luma_dyadic;
|
|
extern FT_VERT_INTERPOLATE_CHROMA_2X isvc_vert_interpol_chroma_dyadic;
|
|
extern FT_HORZ_INTERPOLATE_CHROMA_2X isvc_horz_interpol_chroma_dyadic;
|
|
|
|
/* SSE42 Declarations */
|
|
extern FT_INTERPOLATE_LUMA_2X isvc_interpolate_base_luma_dyadic_sse42;
|
|
extern FT_VERT_INTERPOLATE_CHROMA_2X isvc_vert_interpol_chroma_dyadic_sse42;
|
|
extern FT_HORZ_INTERPOLATE_CHROMA_2X isvc_horz_interpol_chroma_dyadic_sse42;
|
|
|
|
/* NEON Declarations */
|
|
extern FT_INTERPOLATE_LUMA_2X isvc_interpolate_base_luma_dyadic_neon;
|
|
extern FT_VERT_INTERPOLATE_CHROMA_2X isvc_vert_interpol_chroma_dyadic_neon;
|
|
extern FT_HORZ_INTERPOLATE_CHROMA_2X isvc_horz_interpol_chroma_dyadic_neon;
|
|
|
|
#endif
|