FFmpeg
dsp.h
Go to the documentation of this file.
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_HEVC_DSP_H
26 #define AVCODEC_HEVC_DSP_H
27 
28 #include "libavutil/mem_internal.h"
29 
30 #include "libavcodec/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, const 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, const uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src,
64  const 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 */, const uint8_t *_src /* align 32 */, ptrdiff_t stride_dst,
68  const int16_t *sao_offset_val, int sao_eo_class, int width, int height);
69 
70  void (*sao_edge_restore[2])(uint8_t *_dst, const uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src,
71  const struct SAOParams *sao, const int *borders, int _width, int _height, int c_idx,
72  const uint8_t *vert_edge, const uint8_t *horiz_edge, const uint8_t *diag_edge);
73 
74  void (*put_hevc_qpel[10][2][2])(int16_t *dst, const 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, const 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, const 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,
82  const uint8_t *_src, ptrdiff_t _srcstride, const 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,
85  const uint8_t *_src, ptrdiff_t _srcstride, const 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, const 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, const 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, const 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, const uint8_t *_src, ptrdiff_t _srcstride,
96  const 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,
99  const uint8_t *_src, ptrdiff_t _srcstride, const 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, const int32_t *tc,
105  const uint8_t *no_p, const uint8_t *no_q);
106  void (*hevc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride,
107  int beta, const int32_t *tc,
108  const uint8_t *no_p, const uint8_t *no_q);
109  void (*hevc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride,
110  const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q);
111  void (*hevc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride,
112  const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q);
113  void (*hevc_h_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride,
114  int beta, const int32_t *tc,
115  const uint8_t *no_p, const uint8_t *no_q);
116  void (*hevc_v_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride,
117  int beta, const int32_t *tc,
118  const uint8_t *no_p, const uint8_t *no_q);
119  void (*hevc_h_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride,
120  const int32_t *tc, const uint8_t *no_p,
121  const uint8_t *no_q);
122  void (*hevc_v_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride,
123  const int32_t *tc, const uint8_t *no_p,
124  const uint8_t *no_q);
126 
128 
129 /** ff_hevc_.pel_filters[0] are dummies to simplify array addressing */
130 extern const int8_t ff_hevc_epel_filters[8][4];
131 extern const int8_t ff_hevc_qpel_filters[4][16];
132 
139 
140 #endif /* AVCODEC_HEVC_DSP_H */
HEVCDSPContext::hevc_v_loop_filter_luma
void(* hevc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:106
_dst
uint8_t * _dst
Definition: dsp.h:52
HEVCDSPContext::hevc_v_loop_filter_chroma
void(* hevc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:111
mem_internal.h
HEVCDSPContext::hevc_h_loop_filter_luma
void(* hevc_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:103
HEVCDSPContext::idct
void(* idct[4])(int16_t *coeffs, int col_limit)
Definition: dsp.h:59
src
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t const uint8_t * src
Definition: dsp.h:84
HEVCDSPContext::hevc_v_loop_filter_luma_c
void(* hevc_v_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, int beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:116
SAOParams::offset_sign
int offset_sign[3][4]
sao_offset_sign
Definition: dsp.h:36
height
uint8_t ptrdiff_t const uint8_t ptrdiff_t int height
Definition: dsp.h:53
_stride
ptrdiff_t _stride
Definition: h264pred_template.c:411
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
_src
uint8_t ptrdiff_t const uint8_t * _src
Definition: dsp.h:52
HEVCDSPContext::put_hevc_epel_bi_w
void(* put_hevc_epel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int ox0, int wx1, int ox1, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:98
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:53
ff_hevc_dsp_init_x86
void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init.c:806
ff_hevc_dsp_init_aarch64
void ff_hevc_dsp_init_aarch64(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init_aarch64.c:133
ff_hevc_qpel_filters
const int8_t ff_hevc_qpel_filters[4][16]
Definition: dsp.c:105
GetBitContext
Definition: get_bits.h:108
ff_hevc_dsp_init_loongarch
void ff_hevc_dsp_init_loongarch(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init_loongarch.c:27
HEVCDSPContext::dequant
void(* dequant)(int16_t *coeffs, int16_t log2_size)
Definition: dsp.h:53
HEVCDSPContext::put_hevc_qpel_bi_w
void(* put_hevc_qpel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, int denom, int wx0, int wx1, int ox0, int ox1, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:84
_srcstride
uint8_t ptrdiff_t const uint8_t ptrdiff_t _srcstride
Definition: dsp.h:53
ff_hevc_dsp_init_arm
void ff_hevc_dsp_init_arm(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init_arm.c:28
HEVCDSPContext::transform_4x4_luma
void(* transform_4x4_luma)(int16_t *coeffs)
Definition: dsp.h:57
ff_hevc_epel_filters
const int8_t ff_hevc_epel_filters[8][4]
ff_hevc_.pel_filters[0] are dummies to simplify array addressing
Definition: dsp.c:94
get_bits.h
my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition: dsp.h:53
srcstride
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t const uint8_t ptrdiff_t srcstride
Definition: dsp.h:84
HEVCDSPContext::sao_edge_filter
void(* sao_edge_filter[5])(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, const int16_t *sao_offset_val, int sao_eo_class, int width, int height)
Definition: dsp.h:67
width
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int width
Definition: dsp.h:53
HEVCDSPContext::put_hevc_qpel_uni_w
void(* put_hevc_qpel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:78
HEVCDSPContext::put_hevc_epel
void(* put_hevc_epel[10][2][2])(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:88
SAOParams::offset_abs
int offset_abs[3][4]
sao_offset_abs
Definition: dsp.h:35
HEVCDSPContext::sao_edge_restore
void(* sao_edge_restore[2])(uint8_t *_dst, const uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, const struct SAOParams *sao, const int *borders, int _width, int _height, int c_idx, const uint8_t *vert_edge, const uint8_t *horiz_edge, const uint8_t *diag_edge)
Definition: dsp.h:70
HEVCDSPContext::put_hevc_qpel_uni
void(* put_hevc_qpel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:76
_dststride
uint8_t ptrdiff_t _dststride
Definition: dsp.h:52
HEVCDSPContext::put_hevc_qpel
void(* put_hevc_qpel[10][2][2])(int16_t *dst, const uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:74
HEVCDSPContext::transform_rdpcm
void(* transform_rdpcm)(int16_t *coeffs, int16_t log2_size, int mode)
Definition: dsp.h:55
HEVCDSPContext::sao_band_filter
void(* sao_band_filter[5])(uint8_t *_dst, const uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, const int16_t *sao_offset_val, int sao_left_class, int width, int height)
Definition: dsp.h:63
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
SAOParams::offset_val
int16_t offset_val[3][5]
SaoOffsetVal.
Definition: dsp.h:42
HEVCDSPContext::put_hevc_epel_bi
void(* put_hevc_epel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:95
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
HEVCDSPContext::hevc_h_loop_filter_chroma
void(* hevc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:109
HEVCDSPContext::put_hevc_qpel_bi
void(* put_hevc_qpel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t _srcstride, const int16_t *src2, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:81
HEVCDSPContext::put_hevc_epel_uni
void(* put_hevc_epel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, const uint8_t *_src, ptrdiff_t _srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:91
HEVCDSPContext
Definition: dsp.h:47
SAOParams::eo_class
int eo_class[3]
sao_eo_class
Definition: dsp.h:40
src2
const pixel * src2
Definition: h264pred_template.c:422
HEVCDSPContext::put_hevc_epel_uni_w
void(* put_hevc_epel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, const uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:93
SAOParams
Definition: dsp.h:34
stride
#define stride
Definition: h264pred_template.c:537
HEVCDSPContext::hevc_h_loop_filter_chroma_c
void(* hevc_h_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:119
mode
mode
Definition: ebur128.h:83
SAOParams::type_idx
uint8_t type_idx[3]
sao_type_idx
Definition: dsp.h:44
HEVCDSPContext::idct_dc
void(* idct_dc[4])(int16_t *coeffs)
Definition: dsp.h:61
HEVCDSPContext::hevc_h_loop_filter_luma_c
void(* hevc_h_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, int beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:113
HEVCDSPContext::hevc_v_loop_filter_chroma_c
void(* hevc_v_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q)
Definition: dsp.h:122
ff_hevc_dsp_init
void ff_hevc_dsp_init(HEVCDSPContext *hpc, int bit_depth)
Definition: dsp.c:128
int32_t
int32_t
Definition: audioconvert.c:56
ff_hevc_dsp_init_ppc
void ff_hevc_dsp_init_ppc(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp.c:110
SAOParams::band_position
uint8_t band_position[3]
sao_band_position
Definition: dsp.h:38
HEVCDSPContext::put_pcm
void(* put_pcm)(uint8_t *_dst, ptrdiff_t _stride, int width, int height, struct GetBitContext *gb, int pcm_bit_depth)
Definition: dsp.h:48
HEVCDSPContext::add_residual
void(* add_residual[4])(uint8_t *dst, const int16_t *res, ptrdiff_t stride)
Definition: dsp.h:51
ff_hevc_dsp_init_mips
void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init_mips.c:24