FFmpeg
hevcdsp.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_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 
104  int beta, int32_t *tc,
105  uint8_t *no_p, uint8_t *no_q);
107  int beta, int32_t *tc,
108  uint8_t *no_p, uint8_t *no_q);
110  int32_t *tc, uint8_t *no_p, uint8_t *no_q);
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);
126 
128 
129 extern const int8_t ff_hevc_epel_filters[7][4];
130 extern const int8_t ff_hevc_qpel_filters[3][16];
131 
137 
138 #endif /* AVCODEC_HEVCDSP_H */
static void idct(int16_t block[64])
Definition: 4xm.c:164
const int8_t ff_hevc_qpel_filters[3][16]
Definition: hevcdsp.c:104
static av_always_inline void FUNC() add_residual(uint8_t *_dst, int16_t *res, ptrdiff_t stride, int size)
#define tc
Definition: regdef.h:69
void ff_hevc_dsp_init_ppc(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp.c:110
static int dequant(AVSContext *h, int16_t *level_buf, uint8_t *run_buf, int16_t *dst, int mul, int shift, int coeff_num)
Definition: cavsdec.c:516
uint8_t
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
#define height
static void FUNC() hevc_h_loop_filter_luma(uint8_t *pix, ptrdiff_t stride, int beta, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
bitstream reader API header.
void ff_hevc_dsp_init(HEVCDSPContext *hpc, int bit_depth)
Definition: hevcdsp.c:126
#define src
Definition: vp8dsp.c:255
const int8_t ff_hevc_epel_filters[7][4]
Definition: hevcdsp.c:94
int eo_class[3]
sao_eo_class
Definition: hevcdsp.h:40
static void FUNC() sao_band_filter(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, ptrdiff_t stride_src, int16_t *sao_offset_val, int sao_left_class, int width, int height)
uint8_t type_idx[3]
sao_type_idx
Definition: hevcdsp.h:44
int offset_abs[3][4]
sao_offset_abs
Definition: hevcdsp.h:35
#define width
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:254
int32_t
static void FUNC() hevc_v_loop_filter_luma(uint8_t *pix, ptrdiff_t stride, int beta, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
void ff_hevc_dsp_init_arm(HEVCDSPContext *c, const int bit_depth)
void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init.c:709
static void FUNC() hevc_h_loop_filter_chroma(uint8_t *pix, ptrdiff_t stride, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
void ff_hevc_dsp_init_aarch64(HEVCDSPContext *c, const int bit_depth)
static void FUNC() put_pcm(uint8_t *_dst, ptrdiff_t stride, int width, int height, GetBitContext *gb, int pcm_bit_depth)
static void FUNC() transform_rdpcm(int16_t *_coeffs, int16_t log2_size, int mode)
static void FUNC() hevc_v_loop_filter_chroma(uint8_t *pix, ptrdiff_t stride, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
int16_t offset_val[3][5]
SaoOffsetVal.
Definition: hevcdsp.h:42
uint8_t band_position[3]
sao_band_position
Definition: hevcdsp.h:38
static void FUNC() sao_edge_filter(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *sao_offset_val, int eo, int width, int height)
static void FUNC() transform_4x4_luma(int16_t *coeffs)
#define stride
mode
Use these values in ebur128_init (or&#39;ed).
Definition: ebur128.h:83
int offset_sign[3][4]
sao_offset_sign
Definition: hevcdsp.h:36