This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 24f3ab761e4648105d5734f72f94c3e2ddd9c9fa Author: Charly Morgand-Poyac <[email protected]> AuthorDate: Sun Jul 5 14:09:47 2026 +0200 Commit: charlymp <[email protected]> CommitDate: Sat Jul 11 14:23:12 2026 +0000 lavc/hevcdec: precompute the significance context tables per scan The significance flag loop looked up scan_x_off/scan_y_off and then ctx_idx_map for every decoded bin. The composition of the two is constant per scan type, so precompute the three permuted tables and index them by scan position directly. The SCAN_HORIZ table is the original one, horizontal scan order being raster order. About 2.5% faster single threaded decoding on high bitrate streams. Signed-off-by: Charly Morgand-Poyac <[email protected]> --- libavcodec/hevc/cabac.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/libavcodec/hevc/cabac.c b/libavcodec/hevc/cabac.c index f6bde3028f..bb632ef990 100644 --- a/libavcodec/hevc/cabac.c +++ b/libavcodec/hevc/cabac.c @@ -909,10 +909,10 @@ static av_always_inline int significant_coeff_group_flag_decode(HEVCLocalContext return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc); } -static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int x_c, int y_c, +static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int n, int offset, const uint8_t *ctx_idx_map) { - int inc = ctx_idx_map[(y_c << 2) + x_c] + offset; + int inc = ctx_idx_map[n] + offset; return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc); } @@ -1223,18 +1223,35 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps, prev_sig += (!!significant_coeff_group_flag[x_cg][y_cg + 1] << 1); if (significant_coeff_group_flag[x_cg][y_cg] && n_end >= 0) { - static const uint8_t ctx_idx_map[] = { - 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, // log2_trafo_size == 2 - 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0 - 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 1 - 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, // prev_sig == 2 - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // default + // ctx_idx_map composed with the intra-CG scan, indexed by scan position + static const uint8_t ctx_idx_map[3][5 * 16] = { + { // SCAN_DIAG + 0, 2, 1, 6, 3, 4, 7, 6, 4, 5, 7, 8, 5, 8, 8, 8, // log2_trafo_size == 2 + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // prev_sig == 0 + 2, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, // prev_sig == 1 + 2, 2, 1, 2, 1, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, // prev_sig == 2 + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // default + }, + { // SCAN_HORIZ + 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8, + 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + }, + { // SCAN_VERT + 0, 2, 6, 7, 1, 3, 6, 7, 4, 4, 8, 8, 5, 5, 8, 8, + 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, + 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + }, }; const uint8_t *ctx_idx_map_p; int scf_offset = 0; if (sps->transform_skip_context_enabled && (transform_skip_flag || lc->cu.cu_transquant_bypass_flag)) { - ctx_idx_map_p = &ctx_idx_map[4 * 16]; + ctx_idx_map_p = &ctx_idx_map[scan_idx][4 * 16]; if (c_idx == 0) { scf_offset = 40; } else { @@ -1244,9 +1261,9 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps, if (c_idx != 0) scf_offset = 27; if (log2_trafo_size == 2) { - ctx_idx_map_p = &ctx_idx_map[0]; + ctx_idx_map_p = &ctx_idx_map[scan_idx][0]; } else { - ctx_idx_map_p = &ctx_idx_map[(prev_sig + 1) << 4]; + ctx_idx_map_p = &ctx_idx_map[scan_idx][(prev_sig + 1) << 4]; if (c_idx == 0) { if ((x_cg > 0 || y_cg > 0)) scf_offset += 3; @@ -1264,9 +1281,7 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps, } } for (n = n_end; n > 0; n--) { - x_c = scan_x_off[n]; - y_c = scan_y_off[n]; - if (significant_coeff_flag_decode(lc, x_c, y_c, scf_offset, ctx_idx_map_p)) { + if (significant_coeff_flag_decode(lc, n, scf_offset, ctx_idx_map_p)) { significant_coeff_flag_idx[nb_significant_coeff_flag] = n; nb_significant_coeff_flag++; implicit_non_zero_coeff = 0; _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
