summaryrefslogtreecommitdiff
path: root/libavcodec/hevc_filter.c
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2017-11-30 23:58:02 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2017-12-04 19:05:36 +0100
commit942eafcf08c440eb23f08c10bd7b56d1c27fd21c (patch)
tree571f755a101f8cf9b96b3520ad912f57c1104bd0 /libavcodec/hevc_filter.c
parentd67c1dda403288bcfd30b5d4a0412582728c2c79 (diff)
libavcodec/hevc_filter: support for all skip_loop_filter levels.
Continues where commit 52c75d486ed5f75cbb79e5dbd07b7aef24f3071f left off. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/hevc_filter.c')
-rw-r--r--libavcodec/hevc_filter.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c
index b53f4cc721..94fb7cd3d1 100644
--- a/libavcodec/hevc_filter.c
+++ b/libavcodec/hevc_filter.c
@@ -842,9 +842,34 @@ void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0,
void ff_hevc_hls_filter(HEVCContext *s, int x, int y, int ctb_size)
{
int x_end = x >= s->ps.sps->width - ctb_size;
- if (s->avctx->skip_loop_filter < AVDISCARD_ALL)
+ int skip = 0, is_n = 0;
+ switch (s->nal_unit_type) {
+ case HEVC_NAL_TRAIL_N:
+ case HEVC_NAL_TSA_N:
+ case HEVC_NAL_STSA_N:
+ case HEVC_NAL_RADL_N:
+ case HEVC_NAL_RASL_N:
+ case HEVC_NAL_VCL_N10:
+ case HEVC_NAL_VCL_N12:
+ case HEVC_NAL_VCL_N14:
+ case HEVC_NAL_BLA_N_LP:
+ case HEVC_NAL_IDR_N_LP:
+ is_n = 1;
+ break;
+ default: break;
+ }
+ if (s->avctx->skip_loop_filter >= AVDISCARD_ALL ||
+ (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY && !IS_IDR(s)) ||
+ (s->avctx->skip_loop_filter >= AVDISCARD_NONINTRA &&
+ s->sh.slice_type != HEVC_SLICE_I) ||
+ (s->avctx->skip_loop_filter >= AVDISCARD_BIDIR &&
+ s->sh.slice_type == HEVC_SLICE_B) ||
+ (s->avctx->skip_loop_filter >= AVDISCARD_NONREF && is_n))
+ skip = 1;
+
+ if (!skip)
deblocking_filter_CTB(s, x, y);
- if (s->ps.sps->sao_enabled) {
+ if (s->ps.sps->sao_enabled && !skip) {
int y_end = y >= s->ps.sps->height - ctb_size;
if (y && x)
sao_filter_CTB(s, x - ctb_size, y - ctb_size);