History

avcodec/vvcdec: support mv wraparound

A 360 video specific tool see https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9503377 passed files: DMVR_A_Huawei_3.bit WRAP_D_InterDigital_4.bit WRAP_A_InterDigital_4.bit WRAP_B_InterDigital_4.bit WRAP_C_InterDigital_4.bit ERP_A_MediaTek_3.bit

Nuo Mi committed 2 years ago

Commit f68f4071 parent 68517402 files · +87 −10Browse files

Unified · Split

2 files
  1. libavcodec/vvc/inter.c +79 −2
  2. tests/ref/fate/vvc-conformance-WRAP_A_4 +8 −8
libavcodec/vvc/inter.c+79−2
@@ -95,20 +95,97 @@ static void emulated_edge_no_wrap(const VVCLocalContext *lc, uint8_t *dst, · 94 unmodified lines
95 }95 }
96}96}
97 97
98static void emulated_half(const VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride,
99 const uint8_t *src, const ptrdiff_t src_stride, const int ps,
100 int x_off, int y_off, const int block_w, const int block_h,
101 const VVCRect *subpic,const VVCRect *half_sb, const int dmvr_clip)
102{
103 const VVCFrameContext *fc = lc->fc;
104 int pic_width, pic_height;
105
106 src += y_off * src_stride + x_off * (1 << ps);
107
108 clip_to_subpic(&x_off, &y_off, &pic_width, &pic_height, subpic, half_sb, dmvr_clip);
109
110 fc->vdsp.emulated_edge_mc(dst, src, dst_stride, src_stride,
111 block_w, block_h, x_off, y_off, pic_width, pic_height);
112}
113
114static void sb_set_lr(VVCRect *sb, const int l, const int r)
115{
116 sb->l = l;
117 sb->r = r;
118}
119
120static void sb_wrap(VVCRect *sb, const int wrap)
121{
122 sb_set_lr(sb, sb->l + wrap, sb->r + wrap);
123}
124
98static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst,125static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst,
99 const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame,126 const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame,
100 int x_sb, int y_sb, int x_off, int y_off, int block_w, int block_h, const int wrap_enabled,127 int x_sb, int y_sb, int x_off, int y_off, int block_w, int block_h, const int wrap_enabled,
101 const int is_chroma, const int extra_before, const int extra_after)128 const int is_chroma, const int extra_before, const int extra_after)
102{129{
130 const VVCSPS *sps = src_frame->sps;
131 const VVCPPS *pps = src_frame->pps;
132 const int ps = sps->pixel_shift;
103 const int subpic_idx = lc->sc->sh.r->curr_subpic_idx;133 const int subpic_idx = lc->sc->sh.r->curr_subpic_idx;
134 const int extra = extra_before + extra_after;
104 const int dmvr_clip = x_sb != x_off || y_sb != y_off;135 const int dmvr_clip = x_sb != x_off || y_sb != y_off;
136 const int dmvr_left = FFMAX(x_off, x_sb) - extra_before;
137 const int dmvr_right = FFMIN(x_off, x_sb) + block_w + extra_after;
138 const int left = x_off - extra_before;
139 const int top = y_off - extra_before;
140 const int pic_width = pps->width >> sps->hshift[is_chroma];
141 const int wrap = pps->ref_wraparound_offset << (sps->min_cb_log2_size_y - sps->hshift[is_chroma]);
142 const ptrdiff_t dst_stride = EDGE_EMU_BUFFER_STRIDE << ps;
105 VVCRect sb = { x_sb - extra_before, y_sb - extra_before, x_sb + block_w + extra_after, y_sb + block_h + extra_after };143 VVCRect sb = { x_sb - extra_before, y_sb - extra_before, x_sb + block_w + extra_after, y_sb + block_h + extra_after };
106 VVCRect subpic;144 VVCRect subpic;
107 145
108 subpic_get_rect(&subpic, src_frame, subpic_idx, is_chroma);146 subpic_get_rect(&subpic, src_frame, subpic_idx, is_chroma);
109 147
110 return emulated_edge_no_wrap(lc, dst, src, src_stride,148 if (!wrap_enabled || (dmvr_left >= 0 && dmvr_right <= pic_width)) {
111 x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip);149 return emulated_edge_no_wrap(lc, dst, src, src_stride,
150 x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip);
151 }
152 if (dmvr_right <= 0) {
153 sb_wrap(&sb, wrap);
154 return emulated_edge_no_wrap(lc, dst, src, src_stride,
155 x_off + wrap, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip);
156 }
157 if (dmvr_left >= pic_width) {
158 sb_wrap(&sb, -wrap);
159 return emulated_edge_no_wrap(lc, dst, src, src_stride,
160 x_off - wrap, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip);
161 }
162
163 block_w += extra;
164 block_h += extra;
165
166 // half block are wrapped
167 if (dmvr_left < 0 ) {
168 const int w = -left;
169 VVCRect half_sb = { sb.l + wrap, sb.t, 0 + wrap, sb.b };
170 emulated_half(lc, dst, dst_stride, *src, *src_stride, ps,
171 left + wrap, top, w, block_h, &subpic, &half_sb, dmvr_clip);
172
173 sb_set_lr(&half_sb, 0, sb.r);
174 emulated_half(lc, dst + (w << ps), dst_stride, *src, *src_stride, ps,
175 0, top, block_w - w, block_h, &subpic, &half_sb, dmvr_clip);
176 } else {
177 const int w = pic_width - left;
178 VVCRect half_sb = { sb.l, sb.t, pic_width, sb.b };
179 emulated_half(lc, dst, dst_stride, *src, *src_stride, ps,
180 left, top, w, block_h, &subpic, &half_sb, dmvr_clip);
181
182 sb_set_lr(&half_sb, pic_width - wrap, sb.r - wrap);
183 emulated_half(lc, dst + (w << ps), dst_stride, *src, *src_stride, ps,
184 pic_width - wrap , top, block_w - w, block_h, &subpic, &half_sb, dmvr_clip);
185 }
186
187 *src = dst + extra_before * dst_stride + (extra_before << ps);
188 *src_stride = dst_stride;
112}189}
113 190
114#define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \191#define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \
tests/ref/fate/vvc-conformance-WRAP_A_4+8−8
@@ -4,11 +4,11 @@ · 3 unmodified lines
4#dimensions 0: 1680x8324#dimensions 0: 1680x832
5#sar 0: 0/15#sar 0: 0/1
60, 0, 0, 1, 4193280, 0xbd70f1b360, 0, 0, 1, 4193280, 0xbd70f1b3
70, 1, 1, 1, 4193280, 0x64e160d570, 1, 1, 1, 4193280, 0x491104c9
80, 2, 2, 1, 4193280, 0xd20722ea80, 2, 2, 1, 4193280, 0xf600c2c1
90, 3, 3, 1, 4193280, 0xa1d0005590, 3, 3, 1, 4193280, 0x1e3c8e2b
100, 4, 4, 1, 4193280, 0xe3dcb9cd100, 4, 4, 1, 4193280, 0xad275e45
110, 5, 5, 1, 4193280, 0xcf97b6cf110, 5, 5, 1, 4193280, 0xcd6103d7
120, 6, 6, 1, 4193280, 0xd87b73d0120, 6, 6, 1, 4193280, 0x0ec8cfbd
130, 7, 7, 1, 4193280, 0x0f8ee2bc130, 7, 7, 1, 4193280, 0x2f664486
140, 8, 8, 1, 4193280, 0x76607ca4140, 8, 8, 1, 4193280, 0x543eb3fc

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t