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 VVCTxType {
35 };
36 
37 enum VVCTxSize {
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 (*apply_prof)(int16_t *dst, const int16_t *src, const int16_t *diff_mv_x, const int16_t *diff_mv_y);
92 
93  void (*apply_prof_uni)(uint8_t *dst, ptrdiff_t dst_stride, const int16_t *src,
94  const int16_t *diff_mv_x, const int16_t *diff_mv_y);
95  void (*apply_prof_uni_w)(uint8_t *dst, const ptrdiff_t dst_stride, const int16_t *src,
96  const int16_t *diff_mv_x, const int16_t *diff_mv_y, int denom, int wx, int ox);
97 
98  void (*apply_bdof)(uint8_t *dst, ptrdiff_t dst_stride, const int16_t *src0, const int16_t *src1, int block_w, int block_h);
99 
100  int (*sad)(const int16_t *src0, const int16_t *src1, int dx, int dy, int block_w, int block_h);
101  void (*dmvr[2][2])(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride, int height,
102  intptr_t mx, intptr_t my, int width);
104 
105 struct VVCLocalContext;
106 
107 typedef struct VVCIntraDSPContext {
108  void (*intra_cclm_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h);
109  void (*lmcs_scale_chroma)(struct VVCLocalContext *lc, int *dst, const int *coeff, int w, int h, int x0_cu, int y0_cu);
110  void (*intra_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h, int c_idx);
111  void (*pred_planar)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride);
112  void (*pred_mip)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride,
113  int mode_id, int is_transpose);
114  void (*pred_dc)(uint8_t *src, const uint8_t *top, const uint8_t *left, int w, int h, ptrdiff_t stride);
115  void (*pred_v)(uint8_t *src, const uint8_t *_top, int w, int h, ptrdiff_t stride);
116  void (*pred_h)(uint8_t *src, const uint8_t *_left, int w, int h, ptrdiff_t stride);
117  void (*pred_angular_v)(uint8_t *src, const uint8_t *_top, const uint8_t *_left,
118  int w, int h, ptrdiff_t stride, int c_idx, int mode, int ref_idx, int filter_flag, int need_pdpc);
119  void (*pred_angular_h)(uint8_t *src, const uint8_t *_top, const uint8_t *_left, int w, int h, ptrdiff_t stride,
120  int c_idx, int mode, int ref_idx, int filter_flag, int need_pdpc);
122 
123 typedef struct VVCItxDSPContext {
124  void (*add_residual)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride);
125  void (*add_residual_joint)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride, int c_sign, int shift);
126  void (*pred_residual_joint)(int *buf, int width, int height, int c_sign, int shift);
127 
128  void (*itx[VVC_N_TX_TYPE][VVC_N_TX_SIZE])(int *coeffs, ptrdiff_t step, size_t nz);
129  void (*transform_bdpcm)(int *coeffs, int width, int height, int vertical, int log2_transform_range);
131 
132 typedef struct VVCLMCSDSPContext {
133  void (*filter)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height, const void *lut);
135 
136 typedef struct VVCLFDSPContext {
137  int (*ladf_level[2 /* h, v */])(const uint8_t *pix, ptrdiff_t stride);
138 
139  void (*filter_luma[2 /* h, v */])(uint8_t *pix, ptrdiff_t stride, const int32_t *beta, const int32_t *tc,
140  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);
141  void (*filter_chroma[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 shift);
144 
145 struct SAOParams;
146 typedef struct VVCSAODSPContext {
147  void (*band_filter[9])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, ptrdiff_t src_stride,
148  const int16_t *sao_offset_val, int sao_left_class, int width, int height);
149  /* implicit src_stride parameter has value of 2 * MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE */
150  void (*edge_filter[9])(uint8_t *dst /* align 16 */, const uint8_t *src /* align 32 */, ptrdiff_t dst_stride,
151  const int16_t *sao_offset_val, int sao_eo_class, int width, int height);
152  void (*edge_restore[2])(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_stride, ptrdiff_t src_stride,
153  const struct SAOParams *sao, const int *borders, int width, int height, int c_idx,
154  const uint8_t *vert_edge, const uint8_t *horiz_edge, const uint8_t *diag_edge);
156 
157 typedef struct VVCALFDSPContext {
158  void (*filter[2 /* luma, chroma */])(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride,
159  int width, int height, const int16_t *filter, const int16_t *clip, int vb_pos);
160  void (*filter_cc)(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *luma, ptrdiff_t luma_stride,
161  int width, int height, int hs, int vs, const int16_t *filter, int vb_pos);
162 
163  void (*classify)(int *class_idx, int *transpose_idx, const uint8_t *src, ptrdiff_t src_stride, int width, int height,
164  int vb_pos, int *gradient_tmp);
165  void (*recon_coeff_and_clip)(int16_t *coeff, int16_t *clip, const int *class_idx, const int *transpose_idx, int size,
166  const int16_t *coeff_set, const uint8_t *clip_idx_set, const uint8_t *class_to_filt);
168 
169 typedef struct VVCDSPContext {
177 } VVCDSPContext;
178 
179 void ff_vvc_dsp_init(VVCDSPContext *hpc, int bit_depth);
180 
181 void ff_vvc_dsp_init_aarch64(VVCDSPContext *hpc, const int bit_depth);
182 void ff_vvc_dsp_init_riscv(VVCDSPContext *hpc, const int bit_depth);
183 void ff_vvc_dsp_init_x86(VVCDSPContext *hpc, const int bit_depth);
184 
185 #endif /* AVCODEC_VVC_DSP_H */
_dst
uint8_t * _dst
Definition: dsp.h:52
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:165
VVC_N_TX_TYPE
@ VVC_N_TX_TYPE
Definition: dsp.h:34
VVCLMCSDSPContext::filter
void(* filter)(uint8_t *dst, ptrdiff_t dst_stride, int width, int height, const void *lut)
Definition: dsp.h:133
VVC_DCT8
@ VVC_DCT8
Definition: dsp.h:33
VVCIntraDSPContext::pred_v
void(* pred_v)(uint8_t *src, const uint8_t *_top, int w, int h, ptrdiff_t stride)
Definition: dsp.h:115
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:114
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
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
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
VVC_DCT2
@ VVC_DCT2
Definition: dsp.h:31
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:101
VVCDSPContext::itx
VVCItxDSPContext itx
Definition: dsp.h:172
height
uint8_t ptrdiff_t const uint8_t ptrdiff_t int height
Definition: dsp.h:53
VVC_TX_SIZE_4
@ VVC_TX_SIZE_4
Definition: dsp.h:39
VVC_N_TX_SIZE
@ VVC_N_TX_SIZE
Definition: dsp.h:44
VVCItxDSPContext::add_residual
void(* add_residual)(uint8_t *dst, const int *res, int width, int height, ptrdiff_t stride)
Definition: dsp.h:124
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:100
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:108
VVCItxDSPContext
Definition: dsp.h:123
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:53
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:93
ff_vvc_dsp_init
void ff_vvc_dsp_init(VVCDSPContext *hpc, int bit_depth)
Definition: dsp.c:77
VVC_TX_SIZE_2
@ VVC_TX_SIZE_2
Definition: dsp.h:38
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:147
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:139
ff_vvc_dsp_init_riscv
void ff_vvc_dsp_init_riscv(VVCDSPContext *hpc, const int bit_depth)
Definition: vvcdsp_init.c:40
VVCDSPContext::inter
VVCInterDSPContext inter
Definition: dsp.h:170
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:160
clip
clip
Definition: af_crystalizer.c:122
VVC_TX_SIZE_16
@ VVC_TX_SIZE_16
Definition: dsp.h:41
VVCALFDSPContext
Definition: dsp.h:157
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:111
VVCIntraDSPContext
Definition: dsp.h:107
my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition: dsp.h:53
VVCDSPContext::lf
VVCLFDSPContext lf
Definition: dsp.h:174
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:109
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
width
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int width
Definition: dsp.h:53
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:125
VVCLocalContext
Definition: ctu.h:373
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
VVCInterDSPContext::apply_bdof
void(* apply_bdof)(uint8_t *dst, ptrdiff_t dst_stride, const int16_t *src0, const int16_t *src1, int block_w, int block_h)
Definition: dsp.h:98
VVCSAODSPContext
Definition: dsp.h:146
ff_vvc_dsp_init_x86
void ff_vvc_dsp_init_x86(VVCDSPContext *hpc, const int bit_depth)
Definition: vvcdsp_init.c:359
VVCItxDSPContext::transform_bdpcm
void(* transform_bdpcm)(int *coeffs, int width, int height, int vertical, int log2_transform_range)
Definition: dsp.h:129
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:152
VVCDSPContext::intra
VVCIntraDSPContext intra
Definition: dsp.h:171
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:119
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:158
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:141
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:91
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
VVCLMCSDSPContext
Definition: dsp.h:132
size
int size
Definition: twinvq_data.h:10344
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:150
VVCDSPContext::sao
VVCSAODSPContext sao
Definition: dsp.h:175
VVCIntraDSPContext::intra_pred
void(* intra_pred)(const struct VVCLocalContext *lc, int x0, int y0, int w, int h, int c_idx)
Definition: dsp.h:110
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:112
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:95
weights
static const int weights[]
Definition: hevc_pel.c:32
VVC_TX_SIZE_32
@ VVC_TX_SIZE_32
Definition: dsp.h:42
VVCDSPContext::alf
VVCALFDSPContext alf
Definition: dsp.h:176
hf
uint8_t ptrdiff_t const uint8_t ptrdiff_t int const int8_t * hf
Definition: dsp.h:249
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:163
VVC_TX_SIZE_8
@ VVC_TX_SIZE_8
Definition: dsp.h:40
stride
#define stride
Definition: h264pred_template.c:537
VVCItxDSPContext::itx
void(* itx[VVC_N_TX_TYPE][VVC_N_TX_SIZE])(int *coeffs, ptrdiff_t step, size_t nz)
Definition: dsp.h:128
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:99
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:137
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:117
VVCInterDSPContext
Definition: dsp.h:47
src0
const pixel *const src0
Definition: h264pred_template.c:420
VVCTxSize
VVCTxSize
Definition: dsp.h:37
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:136
VVCDSPContext::lmcs
VVCLMCSDSPContext lmcs
Definition: dsp.h:173
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
VVC_TX_SIZE_64
@ VVC_TX_SIZE_64
Definition: dsp.h:43
VVCTxType
VVCTxType
Definition: dsp.h:30
int32_t
int32_t
Definition: audioconvert.c:56
VVC_DST7
@ VVC_DST7
Definition: dsp.h:32
VVCItxDSPContext::pred_residual_joint
void(* pred_residual_joint)(int *buf, int width, int height, int c_sign, int shift)
Definition: dsp.h:126
coeff
static const double coeff[2][5]
Definition: vf_owdenoise.c:80
VVCIntraDSPContext::pred_h
void(* pred_h)(uint8_t *src, const uint8_t *_left, int w, int h, ptrdiff_t stride)
Definition: dsp.h:116
h
h
Definition: vp9dsp_template.c:2070
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
vf
uint8_t ptrdiff_t const uint8_t ptrdiff_t int const int8_t const int8_t * vf
Definition: dsp.h:249
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:169