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 "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);
124 
126 
127 extern const int8_t ff_hevc_epel_filters[7][4];
128 extern const int8_t ff_hevc_qpel_filters[3][16];
129 
134 
135 #endif /* AVCODEC_HEVCDSP_H */
stride
int stride
Definition: mace.c:144
ff_hevc_dsp_init_ppc
void ff_hevc_dsp_init_ppc(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp.c:110
bit_depth
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:226
HEVCDSPContext::add_residual
void(* add_residual[4])(uint8_t *dst, int16_t *res, ptrdiff_t stride)
Definition: hevcdsp.h:49
HEVCDSPContext::put_hevc_epel_uni
void(* put_hevc_epel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:89
HEVCDSPContext::idct
void(* idct[4])(int16_t *coeffs, int col_limit)
Definition: hevcdsp.h:57
HEVCDSPContext::hevc_h_loop_filter_luma
void(* hevc_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int beta, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:101
SAOParams::offset_sign
int offset_sign[3][4]
sao_offset_sign
Definition: hevcdsp.h:34
ff_hevc_qpel_filters
const int8_t ff_hevc_qpel_filters[3][16]
Definition: hevcdsp.c:104
GetBitContext
Definition: get_bits.h:61
HEVCDSPContext::dequant
void(* dequant)(int16_t *coeffs, int16_t log2_size)
Definition: hevcdsp.h:51
ff_hevc_epel_filters
const int8_t ff_hevc_epel_filters[7][4]
Definition: hevcdsp.c:94
src
#define src
Definition: vp8dsp.c:254
HEVCDSPContext::hevc_v_loop_filter_luma
void(* hevc_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int beta, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:104
SAOParams::eo_class
int eo_class[3]
sao_eo_class
Definition: hevcdsp.h:38
HEVCDSPContext::put_hevc_epel_bi_w
void(* put_hevc_epel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, int denom, int wx0, int ox0, int wx1, int ox1, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:96
SAOParams::type_idx
uint8_t type_idx[3]
sao_type_idx
Definition: hevcdsp.h:42
width
#define width
HEVCDSPContext::put_hevc_epel
void(* put_hevc_epel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:86
HEVCDSPContext::transform_4x4_luma
void(* transform_4x4_luma)(int16_t *coeffs)
Definition: hevcdsp.h:55
ff_hevc_dsp_init
void ff_hevc_dsp_init(HEVCDSPContext *hpc, int bit_depth)
Definition: hevcdsp.c:126
HEVCDSPContext::sao_edge_restore
void(* sao_edge_restore[2])(uint8_t *_dst, uint8_t *_src, ptrdiff_t _stride_dst, ptrdiff_t _stride_src, struct SAOParams *sao, int *borders, int _width, int _height, int c_idx, uint8_t *vert_edge, uint8_t *horiz_edge, uint8_t *diag_edge)
Definition: hevcdsp.h:68
get_bits.h
HEVCDSPContext::hevc_h_loop_filter_chroma_c
void(* hevc_h_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:117
HEVCDSPContext::hevc_v_loop_filter_chroma_c
void(* hevc_v_loop_filter_chroma_c)(uint8_t *pix, ptrdiff_t stride, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:120
int32_t
int32_t
Definition: audio_convert.c:194
HEVCDSPContext::put_hevc_qpel
void(* put_hevc_qpel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:72
HEVCDSPContext::hevc_h_loop_filter_chroma
void(* hevc_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:107
HEVCDSPContext::transform_rdpcm
void(* transform_rdpcm)(int16_t *coeffs, int16_t log2_size, int mode)
Definition: hevcdsp.h:53
ff_hevc_dsp_init_mips
void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init_mips.c:521
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
ff_hevc_dsp_init_arm
void ff_hevc_dsp_init_arm(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init_arm.c:28
SAOParams::offset_abs
int offset_abs[3][4]
sao_offset_abs
Definition: hevcdsp.h:33
HEVCDSPContext::put_hevc_epel_bi
void(* put_hevc_epel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:93
HEVCDSPContext::put_hevc_qpel_uni
void(* put_hevc_qpel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:74
HEVCDSPContext::put_hevc_qpel_uni_w
void(* put_hevc_qpel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:76
height
#define height
HEVCDSPContext
Definition: hevcdsp.h:45
HEVCDSPContext::put_hevc_qpel_bi
void(* put_hevc_qpel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:79
SAOParams::band_position
uint8_t band_position[3]
sao_band_position
Definition: hevcdsp.h:36
uint8_t
uint8_t
Definition: audio_convert.c:194
HEVCDSPContext::sao_band_filter
void(* sao_band_filter[5])(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)
Definition: hevcdsp.h:61
HEVCDSPContext::sao_edge_filter
void(* sao_edge_filter[5])(uint8_t *_dst, uint8_t *_src, ptrdiff_t stride_dst, int16_t *sao_offset_val, int sao_eo_class, int width, int height)
Definition: hevcdsp.h:65
ff_hevc_dsp_init_x86
void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth)
Definition: hevcdsp_init.c:708
SAOParams
Definition: hevcdsp.h:32
HEVCDSPContext::put_hevc_epel_uni_w
void(* put_hevc_epel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:91
mode
mode
Definition: ebur128.h:83
HEVCDSPContext::idct_dc
void(* idct_dc[4])(int16_t *coeffs)
Definition: hevcdsp.h:59
HEVCDSPContext::hevc_h_loop_filter_luma_c
void(* hevc_h_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, int beta, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:111
tc
#define tc
Definition: regdef.h:69
SAOParams::offset_val
int16_t offset_val[3][5]
SaoOffsetVal.
Definition: hevcdsp.h:40
HEVCDSPContext::hevc_v_loop_filter_luma_c
void(* hevc_v_loop_filter_luma_c)(uint8_t *pix, ptrdiff_t stride, int beta, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:114
HEVCDSPContext::hevc_v_loop_filter_chroma
void(* hevc_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, int32_t *tc, uint8_t *no_p, uint8_t *no_q)
Definition: hevcdsp.h:109
HEVCDSPContext::put_pcm
void(* put_pcm)(uint8_t *_dst, ptrdiff_t _stride, int width, int height, struct GetBitContext *gb, int pcm_bit_depth)
Definition: hevcdsp.h:46
HEVCDSPContext::put_hevc_qpel_bi_w
void(* put_hevc_qpel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, int denom, int wx0, int wx1, int ox0, int ox1, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:82