1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * HEVC video decoder 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (C) 2012 - 2013 Guillaume Martres 5cabdff1aSopenharmony_ci * Copyright (C) 2013 - 2014 Pierre-Edouard Lepere 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * This file is part of FFmpeg. 9cabdff1aSopenharmony_ci * 10cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 11cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 12cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 13cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 14cabdff1aSopenharmony_ci * 15cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 16cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 17cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18cabdff1aSopenharmony_ci * Lesser General Public License for more details. 19cabdff1aSopenharmony_ci * 20cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 21cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 22cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23cabdff1aSopenharmony_ci */ 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#ifndef AVCODEC_HEVCDSP_H 26cabdff1aSopenharmony_ci#define AVCODEC_HEVCDSP_H 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "get_bits.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#define MAX_PB_SIZE 64 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_citypedef struct SAOParams { 35cabdff1aSopenharmony_ci int offset_abs[3][4]; ///< sao_offset_abs 36cabdff1aSopenharmony_ci int offset_sign[3][4]; ///< sao_offset_sign 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci uint8_t band_position[3]; ///< sao_band_position 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci int eo_class[3]; ///< sao_eo_class 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci int16_t offset_val[3][5]; ///<SaoOffsetVal 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci uint8_t type_idx[3]; ///< sao_type_idx 45cabdff1aSopenharmony_ci} SAOParams; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_citypedef struct HEVCDSPContext { 48cabdff1aSopenharmony_ci void (*put_pcm)(uint8_t *_dst, ptrdiff_t _stride, int width, int height, 49cabdff1aSopenharmony_ci struct GetBitContext *gb, int pcm_bit_depth); 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci void (*add_residual[4])(uint8_t *dst, int16_t *res, ptrdiff_t stride); 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci void (*dequant)(int16_t *coeffs, int16_t log2_size); 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci void (*transform_rdpcm)(int16_t *coeffs, int16_t log2_size, int mode); 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci void (*transform_4x4_luma)(int16_t *coeffs); 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci void (*idct[4])(int16_t *coeffs, int col_limit); 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci void (*idct_dc[4])(int16_t *coeffs); 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci void (*sao_band_filter[5])(uint8_t *_dst, uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, 64cabdff1aSopenharmony_ci int16_t *sao_offset_val, int sao_left_class, int width, int height); 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci /* implicit stride_src parameter has value of 2 * MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE */ 67cabdff1aSopenharmony_ci void (*sao_edge_filter[5])(uint8_t *_dst /* align 16 */, uint8_t *_src /* align 32 */, ptrdiff_t stride_dst, 68cabdff1aSopenharmony_ci int16_t *sao_offset_val, int sao_eo_class, int width, int height); 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci void (*sao_edge_restore[2])(uint8_t *_dst, uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, 71cabdff1aSopenharmony_ci struct SAOParams *sao, int *borders, int _width, int _height, int c_idx, 72cabdff1aSopenharmony_ci uint8_t *vert_edge, uint8_t *horiz_edge, uint8_t *diag_edge); 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci void (*put_hevc_qpel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, 75cabdff1aSopenharmony_ci int height, intptr_t mx, intptr_t my, int width); 76cabdff1aSopenharmony_ci void (*put_hevc_qpel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, 77cabdff1aSopenharmony_ci int height, intptr_t mx, intptr_t my, int width); 78cabdff1aSopenharmony_ci void (*put_hevc_qpel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, 79cabdff1aSopenharmony_ci int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width); 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci void (*put_hevc_qpel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, 82cabdff1aSopenharmony_ci int16_t *src2, 83cabdff1aSopenharmony_ci int height, intptr_t mx, intptr_t my, int width); 84cabdff1aSopenharmony_ci void (*put_hevc_qpel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, 85cabdff1aSopenharmony_ci int16_t *src2, 86cabdff1aSopenharmony_ci int height, int denom, int wx0, int wx1, 87cabdff1aSopenharmony_ci int ox0, int ox1, intptr_t mx, intptr_t my, int width); 88cabdff1aSopenharmony_ci void (*put_hevc_epel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, 89cabdff1aSopenharmony_ci int height, intptr_t mx, intptr_t my, int width); 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci void (*put_hevc_epel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, 92cabdff1aSopenharmony_ci int height, intptr_t mx, intptr_t my, int width); 93cabdff1aSopenharmony_ci void (*put_hevc_epel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, 94cabdff1aSopenharmony_ci int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width); 95cabdff1aSopenharmony_ci void (*put_hevc_epel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, 96cabdff1aSopenharmony_ci int16_t *src2, 97cabdff1aSopenharmony_ci int height, intptr_t mx, intptr_t my, int width); 98cabdff1aSopenharmony_ci void (*put_hevc_epel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, 99cabdff1aSopenharmony_ci int16_t *src2, 100cabdff1aSopenharmony_ci int height, int denom, int wx0, int ox0, int wx1, 101cabdff1aSopenharmony_ci int ox1, intptr_t mx, intptr_t my, int width); 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci void (*hevc_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, 104cabdff1aSopenharmony_ci int beta, int32_t *tc, 105cabdff1aSopenharmony_ci uint8_t *no_p, uint8_t *no_q); 106cabdff1aSopenharmony_ci void (*hevc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, 107cabdff1aSopenharmony_ci int beta, int32_t *tc, 108cabdff1aSopenharmony_ci uint8_t *no_p, uint8_t *no_q); 109cabdff1aSopenharmony_ci void (*hevc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, 110cabdff1aSopenharmony_ci int32_t *tc, uint8_t *no_p, uint8_t *no_q); 111cabdff1aSopenharmony_ci void (*hevc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, 112cabdff1aSopenharmony_ci int32_t *tc, uint8_t *no_p, uint8_t *no_q); 113cabdff1aSopenharmony_ci void (*hevc_h_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, 114cabdff1aSopenharmony_ci int beta, int32_t *tc, 115cabdff1aSopenharmony_ci uint8_t *no_p, uint8_t *no_q); 116cabdff1aSopenharmony_ci void (*hevc_v_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, 117cabdff1aSopenharmony_ci int beta, int32_t *tc, 118cabdff1aSopenharmony_ci uint8_t *no_p, uint8_t *no_q); 119cabdff1aSopenharmony_ci void (*hevc_h_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, 120cabdff1aSopenharmony_ci int32_t *tc, uint8_t *no_p, 121cabdff1aSopenharmony_ci uint8_t *no_q); 122cabdff1aSopenharmony_ci void (*hevc_v_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, 123cabdff1aSopenharmony_ci int32_t *tc, uint8_t *no_p, 124cabdff1aSopenharmony_ci uint8_t *no_q); 125cabdff1aSopenharmony_ci} HEVCDSPContext; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_civoid ff_hevc_dsp_init(HEVCDSPContext *hpc, int bit_depth); 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ciextern const int8_t ff_hevc_epel_filters[7][4]; 130cabdff1aSopenharmony_ciextern const int8_t ff_hevc_qpel_filters[3][16]; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_civoid ff_hevc_dsp_init_aarch64(HEVCDSPContext *c, const int bit_depth); 133cabdff1aSopenharmony_civoid ff_hevc_dsp_init_arm(HEVCDSPContext *c, const int bit_depth); 134cabdff1aSopenharmony_civoid ff_hevc_dsp_init_ppc(HEVCDSPContext *c, const int bit_depth); 135cabdff1aSopenharmony_civoid ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth); 136cabdff1aSopenharmony_civoid ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth); 137cabdff1aSopenharmony_civoid ff_hevc_dsp_init_loongarch(HEVCDSPContext *c, const int bit_depth); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci#endif /* AVCODEC_HEVCDSP_H */ 140