FFmpeg
dsp.h
Go to the documentation of this file.
1 /*
2  * VVC DSP
3  *
4  * Copyright (C) 2021 Nuo Mi
5  *
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #ifndef AVCODEC_VVC_DSP_H
25 #define AVCODEC_VVC_DSP_H
26 
27 #include <stdint.h>
28 #include <stddef.h>
29 
30 enum TxType {
35 };
36 
37 enum TxSize {
45 };
46 
47 typedef struct VVCInterDSPContext {
48  void (*put[2 /* luma, chroma */][7 /* log2(width) - 1 */][2 /* int, frac */][2 /* int, frac */])(
49  int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int height,
50  const int8_t *hf, const int8_t *vf, int width);
51 
52  void (*put_uni[2 /* luma, chroma */][7 /* log2(width) - 1 */][2 /* int, frac */][2 /* int, frac */])(
53  uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int height,
54  const int8_t *hf, const int8_t *vf, int width);
55 
56  void (*put_uni_w[2 /* luma, chroma */][7 /* log2(width) - 1 */][2 /* int, frac */][2 /* int, frac */])(
57  uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int height,
58  int denom, int wx, int ox, const int8_t *hf, const int8_t *vf, int width);
59 
60  void (*put_scaled[2 /* luma, chroma */][7 /* log2(width) - 1 */])(
61  int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int src_height,
62  int x, int y, int dx, int dy, int height, const int8_t *hf, const int8_t *vf, int width);
63 
64  void (*put_uni_scaled[2 /* luma, chroma */][7 /* log2(width) - 1 */])(
65  uint8_t *dst, const ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int src_height,
66  int x, int y, int dx, int dy, int height, const int8_t *hf, const int8_t *vf, int width);
67 
68  void (*put_uni_w_scaled[2 /* luma, chroma */][7 /* log2(width) - 1 */])(
69  uint8_t *dst, const ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int src_height,
70  int x, int y, int dx, int dy, int height, int denom, int wx, int ox, const int8_t *hf, const int8_t *vf,
71  int width);
72 
73  void (*avg)(uint8_t *dst, ptrdiff_t dst_stride,
74  const int16_t *src0, const int16_t *src1, int width, int height);
75 
76  void (*w_avg)(uint8_t *_dst, const ptrdiff_t _dst_stride,
77  const int16_t *src0, const int16_t *src1, int width, int height,
78  int denom, int w0, int w1, int o0, int o1);
79 
80  void (*put_ciip)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height,
81  const uint8_t *inter, ptrdiff_t inter_stride, int inter_weight);
82 
83  void (*put_gpm)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height,
84  const int16_t *src0, const int16_t *src1,
85  const uint8_t *weights, int step_x, int step_y);
86 
87  void (*fetch_samples)(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int x_frac, int y_frac);
88  void (*bdof_fetch_samples)(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int x_frac, int y_frac,
89  int width, int height);
90 
91  void (*prof_grad_filter)(int16_t *gradient_h, int16_t *gradient_v, const ptrdiff_t gradient_stride,
92  const int16_t *src, const ptrdiff_t src_stride, int width, int height, const int pad);
93  void (*apply_prof)(int16_t *dst, const int16_t *src, const int16_t *diff_mv_x, const int16_t *diff_mv_y);
94 
95  void (*apply_prof_uni)(uint8_t *dst, ptrdiff_t dst_stride, const int16_t *src,
96  const int16_t *diff_mv_x, const int16_t *diff_mv_y);
97  void (*apply_prof_uni_w)(uint8_t *dst, const ptrdiff_t dst_stride, const int16_t *src,
98  const int16_t *diff_mv_x, const int16_t *diff_mv_y, int denom, int wx, int ox);
99 
100  void (*apply_bdof)(uint8_t *dst, ptrdiff_t dst_stride, int16_t *src0, int16_t *src1, int block_w, int block_h);
101 
102  int (*sad)(const int16_t *src0, const int16_t *src1, int dx, int dy, int block_w, int block_h);
103  void (*dmvr[2][2])(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int height,
104  intptr_t mx, intptr_t my, int width);
106 
107 struct VVCLocalContext;
108 
109 typedef struct VVCIntraDSPContext {
110  void (*intra_cclm_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h);
111  void (*lmcs_scale_chroma)(struct VVCLocalContext *lc, int *dst, const int *coeff, int w, int h, int x0_cu, int y0_cu);
112  void (*intra_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h, int c_idx);
113  void (*pred_planar)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride);
114  void (*pred_mip)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride,
115  int mode_id, int is_transpose);
116  void (*pred_dc)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride);
117  void (*pred_v)(uint8_t *src, const uint8_t *_top, int w, int h, ptrdiff_t stride);
118  void (*pred_h)(uint8_t *src, const uint8_t *_left, int w, int h, ptrdiff_t stride);
119  void (*pred_angular_v)(uint8_t *src, const uint8_t *_top, const uint8_t *_left,
120  int w, int h, ptrdiff_t stride, int c_idx, int mode, int ref_idx, int filter_flag, int need_pdpc);
121  void (*pred_angular_h)(uint8_t *src, const uint8_t *_top, const uint8_t *_left, int w, int h, ptrdiff_t stride,
122  int c_idx, int mode, int ref_idx, int filter_flag, int need_pdpc);
124 
125 typedef struct VVCItxDSPContext {
126  void (*add_residual)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride);
127  void (*add_residual_joint)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride, int c_sign, int shift);
128  void (*pred_residual_joint)(int *buf, int width, int height, int c_sign, int shift);
129 
130  void (*itx[N_TX_TYPE][N_TX_SIZE])(int *coeffs, ptrdiff_t step, size_t nz);
131  void (*transform_bdpcm)(int *coeffs, int width, int height, int vertical, int log2_transform_range);
133 
134 typedef struct VVCLMCSDSPContext {
135  void (*filter)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height, const void *lut);
137 
138 typedef struct VVCLFDSPContext {
139  int (*ladf_level[2 /* h, v */])(const uint8_t *pix, ptrdiff_t stride);
140 
141  void (*filter_luma[2 /* h, v */])(uint8_t *pix, ptrdiff_t stride, const int32_t *beta, const int32_t *tc,
142  const uint8_t *no_p, const uint8_t *no_q, const uint8_t *max_len_p, const uint8_t *max_len_q, int hor_ctu_edge);
143  void (*filter_chroma[2 /* h, v */])(uint8_t *pix, ptrdiff_t stride, const int32_t *beta, const int32_t *tc,
144  const uint8_t *no_p, const uint8_t *no_q, const uint8_t *max_len_p, const uint8_t *max_len_q, int shift);
146 
147 struct SAOParams;
148 typedef struct VVCSAODSPContext {
149  void (*band_filter[9])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, ptrdiff_t src_stride,
150  const int16_t *sao_offset_val, int sao_left_class, int width, int height);
151  /* implicit src_stride parameter has value of 2 * MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE */
152  void (*edge_filter[9])(uint8_t *dst /* align 16 */, const uint8_t *src /* align 32 */, ptrdiff_t dst_stride,
153  const int16_t *sao_offset_val, int sao_eo_class, int width, int height);
154  void (*edge_restore[2])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, ptrdiff_t src_stride,
155  const struct SAOParams *sao, const int *borders, int width, int height, int c_idx,
156  const uint8_t *vert_edge, const uint8_t *horiz_edge, const uint8_t *diag_edge);
158 
159 typedef struct VVCALFDSPContext {
160  void (*filter[2 /* luma, chroma */])(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride,
161  int width, int height, const int16_t *filter, const int16_t *clip, int vb_pos);
162  void (*filter_cc)(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *luma, ptrdiff_t luma_stride,
163  int width, int height, int hs, int vs, const int16_t *filter, int vb_pos);
164 
165  void (*classify)(int *class_idx, int *transpose_idx, const uint8_t *src, ptrdiff_t src_stride, int width, int height,
166  int vb_pos, int *gradient_tmp);
167  void (*recon_coeff_and_clip)(int16_t *coeff, int16_t *clip, const int *class_idx, const int *transpose_idx, int size,
168  const int16_t *coeff_set, const uint8_t *clip_idx_set, const uint8_t *class_to_filt);
170 
171 typedef struct VVCDSPContext {
179 } VVCDSPContext;
180 
181 void ff_vvc_dsp_init(VVCDSPContext *hpc, int bit_depth);
182 
183 void ff_vvc_dsp_init_aarch64(VVCDSPContext *hpc, const int bit_depth);
184 void ff_vvc_dsp_init_x86(VVCDSPContext *hpc, const int bit_depth);
185 
186 #endif /* AVCODEC_VVC_DSP_H */
VVCALFDSPContext::recon_coeff_and_clip
void(* recon_coeff_and_clip)(int16_t *coeff, int16_t *clip, const int *class_idx, const int *transpose_idx, int size, const int16_t *coeff_set, const uint8_t *clip_idx_set, const uint8_t *class_to_filt)
Definition: dsp.h:167
DCT2
@ DCT2
Definition: dsp.h:31
VVCLMCSDSPContext::filter
void(* filter)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height, const void *lut)
Definition: dsp.h:135
VVCIntraDSPContext::pred_v
void(* pred_v)(uint8_t *src, const uint8_t *_top, int w, int h, ptrdiff_t stride)
Definition: dsp.h:117
VVCIntraDSPContext::pred_dc
void(* pred_dc)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride)
Definition: dsp.h:116
TX_SIZE_4
@ TX_SIZE_4
Definition: dsp.h:39
VVCInterDSPContext::put_scaled
void(* put_scaled[2/*luma, chroma */][7/*log2(width) - 1 */])(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int src_height, int x, int y, int dx, int dy, int height, const int8_t *hf, const int8_t *vf, int width)
Definition: dsp.h:60
src1
const pixel * src1
Definition: h264pred_template.c:421
VVCInterDSPContext::put_uni_w
void(* put_uni_w[2/*luma, chroma */][7/*log2(width) - 1 */][2/*int, frac */][2/*int, frac */])(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int height, int denom, int wx, int ox, const int8_t *hf, const int8_t *vf, int width)
Definition: dsp.h:56
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
w
uint8_t w
Definition: llviddspenc.c:38
VVCInterDSPContext::dmvr
void(* dmvr[2][2])(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int height, intptr_t mx, intptr_t my, int width)
Definition: dsp.h:103
VVCDSPContext::itx
VVCItxDSPContext itx
Definition: dsp.h:174
VVCInterDSPContext::apply_bdof
void(* apply_bdof)(uint8_t *dst, ptrdiff_t dst_stride, int16_t *src0, int16_t *src1, int block_w, int block_h)
Definition: dsp.h:100
TX_SIZE_32
@ TX_SIZE_32
Definition: dsp.h:42
VVCItxDSPContext::add_residual
void(* add_residual)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride)
Definition: dsp.h:126
TX_SIZE_2
@ TX_SIZE_2
Definition: dsp.h:38
VVCInterDSPContext::sad
int(* sad)(const int16_t *src0, const int16_t *src1, int dx, int dy, int block_w, int block_h)
Definition: dsp.h:102
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
VVCIntraDSPContext::intra_cclm_pred
void(* intra_cclm_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h)
Definition: dsp.h:110
VVCItxDSPContext
Definition: dsp.h:125
VVCInterDSPContext::w_avg
void(* w_avg)(uint8_t *_dst, const ptrdiff_t _dst_stride, const int16_t *src0, const int16_t *src1, int width, int height, int denom, int w0, int w1, int o0, int o1)
Definition: dsp.h:76
VVCInterDSPContext::apply_prof_uni
void(* apply_prof_uni)(uint8_t *dst, ptrdiff_t dst_stride, const int16_t *src, const int16_t *diff_mv_x, const int16_t *diff_mv_y)
Definition: dsp.h:95
ff_vvc_dsp_init
void ff_vvc_dsp_init(VVCDSPContext *hpc, int bit_depth)
Definition: dsp.c:98
VVCSAODSPContext::band_filter
void(* band_filter[9])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, ptrdiff_t src_stride, const int16_t *sao_offset_val, int sao_left_class, int width, int height)
Definition: dsp.h:149
VVCLFDSPContext::filter_luma
void(* filter_luma[2/*h, v */])(uint8_t *pix, ptrdiff_t stride, const int32_t *beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q, const uint8_t *max_len_p, const uint8_t *max_len_q, int hor_ctu_edge)
Definition: dsp.h:141
VVCDSPContext::inter
VVCInterDSPContext inter
Definition: dsp.h:172
VVCALFDSPContext::filter_cc
void(* filter_cc)(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *luma, ptrdiff_t luma_stride, int width, int height, int hs, int vs, const int16_t *filter, int vb_pos)
Definition: dsp.h:162
TX_SIZE_16
@ TX_SIZE_16
Definition: dsp.h:41
clip
clip
Definition: af_crystalizer.c:121
width
#define width
N_TX_SIZE
@ N_TX_SIZE
Definition: dsp.h:44
VVCALFDSPContext
Definition: dsp.h:159
VVCIntraDSPContext::pred_planar
void(* pred_planar)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride)
Definition: dsp.h:113
VVCIntraDSPContext
Definition: dsp.h:109
TX_SIZE_64
@ TX_SIZE_64
Definition: dsp.h:43
VVCDSPContext::lf
VVCLFDSPContext lf
Definition: dsp.h:176
VVCIntraDSPContext::lmcs_scale_chroma
void(* lmcs_scale_chroma)(struct VVCLocalContext *lc, int *dst, const int *coeff, int w, int h, int x0_cu, int y0_cu)
Definition: dsp.h:111
VVCInterDSPContext::avg
void(* avg)(uint8_t *dst, ptrdiff_t dst_stride, const int16_t *src0, const int16_t *src1, int width, int height)
Definition: dsp.h:73
VVCItxDSPContext::add_residual_joint
void(* add_residual_joint)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride, int c_sign, int shift)
Definition: dsp.h:127
VVCLocalContext
Definition: ctu.h:371
VVCInterDSPContext::bdof_fetch_samples
void(* bdof_fetch_samples)(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int x_frac, int y_frac, int width, int height)
Definition: dsp.h:88
TxSize
TxSize
Definition: dsp.h:37
N_TX_TYPE
@ N_TX_TYPE
Definition: dsp.h:34
VVCSAODSPContext
Definition: dsp.h:148
ff_vvc_dsp_init_x86
void ff_vvc_dsp_init_x86(VVCDSPContext *hpc, const int bit_depth)
Definition: vvcdsp_init.c:319
VVCItxDSPContext::transform_bdpcm
void(* transform_bdpcm)(int *coeffs, int width, int height, int vertical, int log2_transform_range)
Definition: dsp.h:131
VVCSAODSPContext::edge_restore
void(* edge_restore[2])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, ptrdiff_t src_stride, 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:154
VVCDSPContext::intra
VVCIntraDSPContext intra
Definition: dsp.h:173
VVCIntraDSPContext::pred_angular_h
void(* pred_angular_h)(uint8_t *src, const uint8_t *_top, const uint8_t *_left, int w, int h, ptrdiff_t stride, int c_idx, int mode, int ref_idx, int filter_flag, int need_pdpc)
Definition: dsp.h:121
VVCALFDSPContext::filter
void(* filter[2/*luma, chroma */])(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int width, int height, const int16_t *filter, const int16_t *clip, int vb_pos)
Definition: dsp.h:160
VVCLFDSPContext::filter_chroma
void(* filter_chroma[2/*h, v */])(uint8_t *pix, ptrdiff_t stride, const int32_t *beta, const int32_t *tc, const uint8_t *no_p, const uint8_t *no_q, const uint8_t *max_len_p, const uint8_t *max_len_q, int shift)
Definition: dsp.h:143
VVCInterDSPContext::apply_prof
void(* apply_prof)(int16_t *dst, const int16_t *src, const int16_t *diff_mv_x, const int16_t *diff_mv_y)
Definition: dsp.h:93
shift
static int shift(int a, int b)
Definition: bonk.c:261
VVCLMCSDSPContext
Definition: dsp.h:134
VVCInterDSPContext::prof_grad_filter
void(* prof_grad_filter)(int16_t *gradient_h, int16_t *gradient_v, const ptrdiff_t gradient_stride, const int16_t *src, const ptrdiff_t src_stride, int width, int height, const int pad)
Definition: dsp.h:91
size
int size
Definition: twinvq_data.h:10344
height
#define height
VVCSAODSPContext::edge_filter
void(* edge_filter[9])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, const int16_t *sao_offset_val, int sao_eo_class, int width, int height)
Definition: dsp.h:152
VVCDSPContext::sao
VVCSAODSPContext sao
Definition: dsp.h:177
VVCIntraDSPContext::intra_pred
void(* intra_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h, int c_idx)
Definition: dsp.h:112
VVCIntraDSPContext::pred_mip
void(* pred_mip)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride, int mode_id, int is_transpose)
Definition: dsp.h:114
VVCInterDSPContext::apply_prof_uni_w
void(* apply_prof_uni_w)(uint8_t *dst, const ptrdiff_t dst_stride, const int16_t *src, const int16_t *diff_mv_x, const int16_t *diff_mv_y, int denom, int wx, int ox)
Definition: dsp.h:97
TxType
TxType
Definition: dsp.h:30
weights
static const int weights[]
Definition: hevc_pel.c:32
VVCDSPContext::alf
VVCALFDSPContext alf
Definition: dsp.h:178
SAOParams
Definition: dsp.h:34
VVCALFDSPContext::classify
void(* classify)(int *class_idx, int *transpose_idx, const uint8_t *src, ptrdiff_t src_stride, int width, int height, int vb_pos, int *gradient_tmp)
Definition: dsp.h:165
stride
#define stride
Definition: h264pred_template.c:537
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
VVCInterDSPContext::put_uni
void(* put_uni[2/*luma, chroma */][7/*log2(width) - 1 */][2/*int, frac */][2/*int, frac */])(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int height, const int8_t *hf, const int8_t *vf, int width)
Definition: dsp.h:52
mode
mode
Definition: ebur128.h:83
ff_vvc_dsp_init_aarch64
void ff_vvc_dsp_init_aarch64(VVCDSPContext *hpc, const int bit_depth)
Definition: dsp_init.c:41
VVCInterDSPContext::put_gpm
void(* put_gpm)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height, const int16_t *src0, const int16_t *src1, const uint8_t *weights, int step_x, int step_y)
Definition: dsp.h:83
VVCLFDSPContext::ladf_level
int(* ladf_level[2/*h, v */])(const uint8_t *pix, ptrdiff_t stride)
Definition: dsp.h:139
VVCIntraDSPContext::pred_angular_v
void(* pred_angular_v)(uint8_t *src, const uint8_t *_top, const uint8_t *_left, int w, int h, ptrdiff_t stride, int c_idx, int mode, int ref_idx, int filter_flag, int need_pdpc)
Definition: dsp.h:119
VVCInterDSPContext
Definition: dsp.h:47
DST7
@ DST7
Definition: dsp.h:32
src0
const pixel *const src0
Definition: h264pred_template.c:420
VVCInterDSPContext::put_uni_w_scaled
void(* put_uni_w_scaled[2/*luma, chroma */][7/*log2(width) - 1 */])(uint8_t *dst, const ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int src_height, int x, int y, int dx, int dy, int height, int denom, int wx, int ox, const int8_t *hf, const int8_t *vf, int width)
Definition: dsp.h:68
VVCLFDSPContext
Definition: dsp.h:138
VVCDSPContext::lmcs
VVCLMCSDSPContext lmcs
Definition: dsp.h:175
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
VVCInterDSPContext::put_ciip
void(* put_ciip)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height, const uint8_t *inter, ptrdiff_t inter_stride, int inter_weight)
Definition: dsp.h:80
int32_t
int32_t
Definition: audioconvert.c:56
VVCItxDSPContext::pred_residual_joint
void(* pred_residual_joint)(int *buf, int width, int height, int c_sign, int shift)
Definition: dsp.h:128
coeff
static const double coeff[2][5]
Definition: vf_owdenoise.c:80
TX_SIZE_8
@ TX_SIZE_8
Definition: dsp.h:40
VVCItxDSPContext::itx
void(* itx[N_TX_TYPE][N_TX_SIZE])(int *coeffs, ptrdiff_t step, size_t nz)
Definition: dsp.h:130
VVCIntraDSPContext::pred_h
void(* pred_h)(uint8_t *src, const uint8_t *_left, int w, int h, ptrdiff_t stride)
Definition: dsp.h:118
h
h
Definition: vp9dsp_template.c:2038
DCT8
@ DCT8
Definition: dsp.h:33
VVCInterDSPContext::fetch_samples
void(* fetch_samples)(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int x_frac, int y_frac)
Definition: dsp.h:87
int
int
Definition: ffmpeg_filter.c:424
VVCInterDSPContext::put
void(* put[2/*luma, chroma */][7/*log2(width) - 1 */][2/*int, frac */][2/*int, frac */])(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int height, const int8_t *hf, const int8_t *vf, int width)
Definition: dsp.h:48
VVCInterDSPContext::put_uni_scaled
void(* put_uni_scaled[2/*luma, chroma */][7/*log2(width) - 1 */])(uint8_t *dst, const ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int src_height, int x, int y, int dx, int dy, int height, const int8_t *hf, const int8_t *vf, int width)
Definition: dsp.h:64
VVCDSPContext
Definition: dsp.h:171