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