This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 21441b3400 avcodec/hevc/filter: fix deblocking offsets taken from the 
wrong CTB
21441b3400 is described below

commit 21441b3400342e1d4d2273f28bddd2368fd0cca4
Author:     Charly Morgand-Poyac <[email protected]>
AuthorDate: Sat Jul 25 19:37:30 2026 +0200
Commit:     michaelni <[email protected]>
CommitDate: Wed Oct 14 13:38:50 2026 +0000

    avcodec/hevc/filter: fix deblocking offsets taken from the wrong CTB
    
    Equations 8-348, 8-350 and 8-383 take slice_beta_offset_div2 and
    slice_tc_offset_div2 from the slice that contains the q0,0 sample of the
    edge: the current CTB for a vertical edge, and for a horizontal one the CTB
    that contains the sample group.
    
    deblocking_filter_CTB() reused whatever the previous loop had left in
    tc_offset and beta_offset instead. Vertical edges could take the left CTB's
    offsets, and each horizontal chroma sample group mixed the offsets of both
    CTBs.
    
    This only changes the output when a CTB and its left neighbour come from
    slices with different deblocking offsets.
    
    Fixes: 65746bfbae3d1077656b48820f0c18c5703e34f7 (hevc_filter: run vertical 
and horizontal together)
    Fixes: fa0506e4136b5b883205c82809a113f5edcd200b (hevc/rext: update boundary 
strength for chroma deblocking filter)
    Signed-off-by: Charly Morgand-Poyac <[email protected]>
---
 libavcodec/hevc/filter.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/libavcodec/hevc/filter.c b/libavcodec/hevc/filter.c
index aee73df034..a4f1b24db7 100644
--- a/libavcodec/hevc/filter.c
+++ b/libavcodec/hevc/filter.c
@@ -540,14 +540,13 @@ static void deblocking_filter_CTB(const HEVCContext *s, 
const HEVCLayerContext *
     if (y_end > sps->height)
         y_end = sps->height;
 
-    tc_offset   = cur_tc_offset;
-    beta_offset = cur_beta_offset;
-
     x_end2 = x_end;
     if (x_end2 != sps->width)
         x_end2 -= 8;
     for (y = y0; y < y_end; y += 8) {
         // vertical filtering luma
+        tc_offset   = cur_tc_offset;
+        beta_offset = cur_beta_offset;
         for (x = x0 ? x0 : 8; x < x_end; x += 8) {
             const int bs0 = l->vertical_bs[(x +  y      * l->bs_width) >> 2];
             const int bs1 = l->vertical_bs[(x + (y + 4) * l->bs_width) >> 2];
@@ -622,8 +621,8 @@ static void deblocking_filter_CTB(const HEVCContext *s, 
const HEVCLayerContext *
                         const int qp1 = (get_qPy(sps, l->qp_y_tab, x - 1, y + 
(4 * v)) +
                                          get_qPy(sps, l->qp_y_tab, x,     y + 
(4 * v)) + 1) >> 1;
 
-                        c_tc[0] = (bs0 == 2) ? chroma_tc(pps, sps, qp0, 
chroma, tc_offset) : 0;
-                        c_tc[1] = (bs1 == 2) ? chroma_tc(pps, sps, qp1, 
chroma, tc_offset) : 0;
+                        c_tc[0] = (bs0 == 2) ? chroma_tc(pps, sps, qp0, 
chroma, cur_tc_offset) : 0;
+                        c_tc[1] = (bs1 == 2) ? chroma_tc(pps, sps, qp1, 
chroma, cur_tc_offset) : 0;
                         src       = &data[chroma][(y >> sps->vshift[chroma]) * 
linesize[chroma] + ((x >> sps->hshift[chroma]) << sps->pixel_shift)];
                         if (pcmf) {
                             no_p[0] = get_pcm(sps, l->is_pcm, x - 1, y);
@@ -642,7 +641,6 @@ static void deblocking_filter_CTB(const HEVCContext *s, 
const HEVCLayerContext *
                     continue;
 
                 // horizontal filtering chroma
-                tc_offset = x0 ? left_tc_offset : cur_tc_offset;
                 x_end2 = x_end;
                 if (x_end != sps->width)
                     x_end2 = x_end - 8 * h;
@@ -650,13 +648,14 @@ static void deblocking_filter_CTB(const HEVCContext *s, 
const HEVCLayerContext *
                     const int bs0 = l->horizontal_bs[( x          + y * 
l->bs_width) >> 2];
                     const int bs1 = l->horizontal_bs[((x + 4 * h) + y * 
l->bs_width) >> 2];
                     if ((bs0 == 2) || (bs1 == 2)) {
+                        const int off = x >= x0 ? cur_tc_offset : 
left_tc_offset;
                         const int qp0 = bs0 == 2 ? (get_qPy(sps, l->qp_y_tab, 
x,           y - 1) +
                                                     get_qPy(sps, l->qp_y_tab, 
x,           y)     + 1) >> 1 : 0;
                         const int qp1 = bs1 == 2 ? (get_qPy(sps, l->qp_y_tab, 
x + (4 * h), y - 1) +
                                                     get_qPy(sps, l->qp_y_tab, 
x + (4 * h), y)     + 1) >> 1 : 0;
 
-                        c_tc[0]   = bs0 == 2 ? chroma_tc(pps, sps, qp0, 
chroma, tc_offset)     : 0;
-                        c_tc[1]   = bs1 == 2 ? chroma_tc(pps, sps, qp1, 
chroma, cur_tc_offset) : 0;
+                        c_tc[0]   = bs0 == 2 ? chroma_tc(pps, sps, qp0, 
chroma, off) : 0;
+                        c_tc[1]   = bs1 == 2 ? chroma_tc(pps, sps, qp1, 
chroma, off) : 0;
                         src       = &data[chroma][(y >> sps->vshift[1]) * 
linesize[chroma] + ((x >> sps->hshift[1]) << sps->pixel_shift)];
                         if (pcmf) {
                             no_p[0] = get_pcm(sps, l->is_pcm, x,           y - 
1);

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to