blob: eefb3cd152e7f6961139223ad9b0ac02d2b84090
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 "get_bits.h" |
29 | |
30 | #define MAX_PB_SIZE 64 |
31 | |
32 | typedef struct SAOParams { |
33 | int offset_abs[3][4]; ///< sao_offset_abs |
34 | int offset_sign[3][4]; ///< sao_offset_sign |
35 | |
36 | uint8_t band_position[3]; ///< sao_band_position |
37 | |
38 | int eo_class[3]; ///< sao_eo_class |
39 | |
40 | int16_t offset_val[3][5]; ///<SaoOffsetVal |
41 | |
42 | uint8_t type_idx[3]; ///< sao_type_idx |
43 | } SAOParams; |
44 | |
45 | typedef struct HEVCDSPContext { |
46 | void (*put_pcm)(uint8_t *_dst, ptrdiff_t _stride, int width, int height, |
47 | struct GetBitContext *gb, int pcm_bit_depth); |
48 | |
49 | void (*add_residual[4])(uint8_t *dst, int16_t *res, ptrdiff_t stride); |
50 | |
51 | void (*dequant)(int16_t *coeffs, int16_t log2_size); |
52 | |
53 | void (*transform_rdpcm)(int16_t *coeffs, int16_t log2_size, int mode); |
54 | |
55 | void (*transform_4x4_luma)(int16_t *coeffs); |
56 | |
57 | void (*idct[4])(int16_t *coeffs, int col_limit); |
58 | |
59 | void (*idct_dc[4])(int16_t *coeffs); |
60 | |
61 | void (*sao_band_filter[5])(uint8_t *_dst, uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, |
62 | int16_t *sao_offset_val, int sao_left_class, int width, int height); |
63 | |
64 | /* implicit stride_src parameter has value of 2 * MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE */ |
65 | void (*sao_edge_filter[5])(uint8_t *_dst /* align 16 */, uint8_t *_src /* align 32 */, ptrdiff_t stride_dst, |
66 | int16_t *sao_offset_val, int sao_eo_class, int width, int height); |
67 | |
68 | void (*sao_edge_restore[2])(uint8_t *_dst, uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, |
69 | struct SAOParams *sao, int *borders, int _width, int _height, int c_idx, |
70 | uint8_t *vert_edge, uint8_t *horiz_edge, uint8_t *diag_edge); |
71 | |
72 | void (*put_hevc_qpel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, |
73 | int height, intptr_t mx, intptr_t my, int width); |
74 | void (*put_hevc_qpel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, |
75 | int height, intptr_t mx, intptr_t my, int width); |
76 | void (*put_hevc_qpel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, |
77 | int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width); |
78 | |
79 | void (*put_hevc_qpel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, |
80 | int16_t *src2, |
81 | int height, intptr_t mx, intptr_t my, int width); |
82 | void (*put_hevc_qpel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, |
83 | int16_t *src2, |
84 | int height, int denom, int wx0, int wx1, |
85 | int ox0, int ox1, intptr_t mx, intptr_t my, int width); |
86 | void (*put_hevc_epel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, |
87 | int height, intptr_t mx, intptr_t my, int width); |
88 | |
89 | void (*put_hevc_epel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, |
90 | int height, intptr_t mx, intptr_t my, int width); |
91 | void (*put_hevc_epel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, |
92 | int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width); |
93 | void (*put_hevc_epel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, |
94 | int16_t *src2, |
95 | int height, intptr_t mx, intptr_t my, int width); |
96 | void (*put_hevc_epel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, |
97 | int16_t *src2, |
98 | int height, int denom, int wx0, int ox0, int wx1, |
99 | int ox1, intptr_t mx, intptr_t my, int width); |
100 | |
101 | void (*hevc_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, |
102 | int beta, int32_t *tc, |
103 | uint8_t *no_p, uint8_t *no_q); |
104 | void (*hevc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, |
105 | int beta, int32_t *tc, |
106 | uint8_t *no_p, uint8_t *no_q); |
107 | void (*hevc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, |
108 | int32_t *tc, uint8_t *no_p, uint8_t *no_q); |
109 | void (*hevc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, |
110 | int32_t *tc, uint8_t *no_p, uint8_t *no_q); |
111 | void (*hevc_h_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, |
112 | int beta, int32_t *tc, |
113 | uint8_t *no_p, uint8_t *no_q); |
114 | void (*hevc_v_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, |
115 | int beta, int32_t *tc, |
116 | uint8_t *no_p, uint8_t *no_q); |
117 | void (*hevc_h_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, |
118 | int32_t *tc, uint8_t *no_p, |
119 | uint8_t *no_q); |
120 | void (*hevc_v_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, |
121 | int32_t *tc, uint8_t *no_p, |
122 | uint8_t *no_q); |
123 | } HEVCDSPContext; |
124 | |
125 | void ff_hevc_dsp_init(HEVCDSPContext *hpc, int bit_depth); |
126 | |
127 | extern const int8_t ff_hevc_epel_filters[7][4]; |
128 | extern const int8_t ff_hevc_qpel_filters[3][16]; |
129 | |
130 | void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth); |
131 | void ff_hevcdsp_init_arm(HEVCDSPContext *c, const int bit_depth); |
132 | void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth); |
133 | #endif /* AVCODEC_HEVCDSP_H */ |
134 |