From: Nuo Mi <nuomi2021@gmail.com> To: ffmpeg-devel@ffmpeg.org Cc: benjamin.bross@hhi.fraunhofer.de, Nuo Mi <nuomi2021@gmail.com> Subject: [FFmpeg-devel] [PATCH v2 5/5] avcodec/vvcdec: support mv wraparound Date: Tue, 4 Jun 2024 20:04:11 +0800 Message-ID: <TYSPR06MB64334B63FFE036514CCE454BAAF82@TYSPR06MB6433.apcprd06.prod.outlook.com> (raw) In-Reply-To: <20240604120411.435626-1-nuomi2021@gmail.com> 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 --- libavcodec/vvc/inter.c | 81 ++++++++++++++++++++++++- tests/ref/fate/vvc-conformance-WRAP_A_4 | 16 ++--- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index 09575eb2b4..98cb43322f 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -95,20 +95,97 @@ static void emulated_edge_no_wrap(const VVCLocalContext *lc, uint8_t *dst, } } +static void emulated_half(const VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, + const uint8_t *src, const ptrdiff_t src_stride, const int ps, + int x_off, int y_off, const int block_w, const int block_h, + const VVCRect *subpic,const VVCRect *half_sb, const int dmvr_clip) +{ + const VVCFrameContext *fc = lc->fc; + int pic_width, pic_height; + + src += y_off * src_stride + x_off * (1 << ps); + + clip_to_subpic(&x_off, &y_off, &pic_width, &pic_height, subpic, half_sb, dmvr_clip); + + fc->vdsp.emulated_edge_mc(dst, src, dst_stride, src_stride, + block_w, block_h, x_off, y_off, pic_width, pic_height); +} + +static void sb_set_lr(VVCRect *sb, const int l, const int r) +{ + sb->l = l; + sb->r = r; +} + +static void sb_wrap(VVCRect *sb, const int wrap) +{ + sb_set_lr(sb, sb->l + wrap, sb->r + wrap); +} + static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame, int x_sb, int y_sb, int x_off, int y_off, int block_w, int block_h, const int wrap_enabled, const int is_chroma, const int extra_before, const int extra_after) { + const VVCSPS *sps = src_frame->sps; + const VVCPPS *pps = src_frame->pps; + const int ps = sps->pixel_shift; const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; + const int extra = extra_before + extra_after; const int dmvr_clip = x_sb != x_off || y_sb != y_off; + const int dmvr_left = FFMAX(x_off, x_sb) - extra_before; + const int dmvr_right = FFMIN(x_off, x_sb) + block_w + extra_after; + const int left = x_off - extra_before; + const int top = y_off - extra_before; + const int pic_width = pps->width >> sps->hshift[is_chroma]; + const int wrap = pps->ref_wraparound_offset << (sps->min_cb_log2_size_y - sps->hshift[is_chroma]); + const ptrdiff_t dst_stride = EDGE_EMU_BUFFER_STRIDE << ps; VVCRect sb = { x_sb - extra_before, y_sb - extra_before, x_sb + block_w + extra_after, y_sb + block_h + extra_after }; VVCRect subpic; subpic_get_rect(&subpic, src_frame, subpic_idx, is_chroma); - return emulated_edge_no_wrap(lc, dst, src, src_stride, - x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + if (!wrap_enabled || (dmvr_left >= 0 && dmvr_right <= pic_width)) { + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + } + if (dmvr_right <= 0) { + sb_wrap(&sb, wrap); + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off + wrap, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + } + if (dmvr_left >= pic_width) { + sb_wrap(&sb, -wrap); + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off - wrap, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + } + + block_w += extra; + block_h += extra; + + // half block are wrapped + if (dmvr_left < 0 ) { + const int w = -left; + VVCRect half_sb = { sb.l + wrap, sb.t, 0 + wrap, sb.b }; + emulated_half(lc, dst, dst_stride, *src, *src_stride, ps, + left + wrap, top, w, block_h, &subpic, &half_sb, dmvr_clip); + + sb_set_lr(&half_sb, 0, sb.r); + emulated_half(lc, dst + (w << ps), dst_stride, *src, *src_stride, ps, + 0, top, block_w - w, block_h, &subpic, &half_sb, dmvr_clip); + } else { + const int w = pic_width - left; + VVCRect half_sb = { sb.l, sb.t, pic_width, sb.b }; + emulated_half(lc, dst, dst_stride, *src, *src_stride, ps, + left, top, w, block_h, &subpic, &half_sb, dmvr_clip); + + sb_set_lr(&half_sb, pic_width - wrap, sb.r - wrap); + emulated_half(lc, dst + (w << ps), dst_stride, *src, *src_stride, ps, + pic_width - wrap , top, block_w - w, block_h, &subpic, &half_sb, dmvr_clip); + } + + *src = dst + extra_before * dst_stride + (extra_before << ps); + *src_stride = dst_stride; } #define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \ diff --git a/tests/ref/fate/vvc-conformance-WRAP_A_4 b/tests/ref/fate/vvc-conformance-WRAP_A_4 index 7273880c2d..7f69d5e029 100644 --- a/tests/ref/fate/vvc-conformance-WRAP_A_4 +++ b/tests/ref/fate/vvc-conformance-WRAP_A_4 @@ -4,11 +4,11 @@ #dimensions 0: 1680x832 #sar 0: 0/1 0, 0, 0, 1, 4193280, 0xbd70f1b3 -0, 1, 1, 1, 4193280, 0x64e160d5 -0, 2, 2, 1, 4193280, 0xd20722ea -0, 3, 3, 1, 4193280, 0xa1d00055 -0, 4, 4, 1, 4193280, 0xe3dcb9cd -0, 5, 5, 1, 4193280, 0xcf97b6cf -0, 6, 6, 1, 4193280, 0xd87b73d0 -0, 7, 7, 1, 4193280, 0x0f8ee2bc -0, 8, 8, 1, 4193280, 0x76607ca4 +0, 1, 1, 1, 4193280, 0x491104c9 +0, 2, 2, 1, 4193280, 0xf600c2c1 +0, 3, 3, 1, 4193280, 0x1e3c8e2b +0, 4, 4, 1, 4193280, 0xad275e45 +0, 5, 5, 1, 4193280, 0xcd6103d7 +0, 6, 6, 1, 4193280, 0x0ec8cfbd +0, 7, 7, 1, 4193280, 0x2f664486 +0, 8, 8, 1, 4193280, 0x543eb3fc -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2024-06-04 12:05 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top [not found] <20240604120411.435626-1-nuomi2021@gmail.com> 2024-06-04 12:04 ` [FFmpeg-devel] [PATCH v2 2/5] avcodec/vvcdec: misc, move src offset inside emulated_edge Nuo Mi 2024-06-04 12:04 ` [FFmpeg-devel] [PATCH v2 3/5] avcodec/vvcdec: refact out emulated_edge_no_wrap Nuo Mi 2024-06-04 12:04 ` [FFmpeg-devel] [PATCH v2 4/5] avcodec/vvcdec: misc, reindent inter.c Nuo Mi 2024-06-04 12:04 ` Nuo Mi [this message] 2024-06-08 9:54 ` [FFmpeg-devel] [PATCH v2 5/5] avcodec/vvcdec: support mv wraparound Nuo Mi
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=TYSPR06MB64334B63FFE036514CCE454BAAF82@TYSPR06MB6433.apcprd06.prod.outlook.com \ --to=nuomi2021@gmail.com \ --cc=benjamin.bross@hhi.fraunhofer.de \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git