[FFmpeg-devel,v2] libavcodec/hevc_filter: implement skip_frame

Submitted by Stefan _ on Dec. 6, 2017, 6:52 p.m.

Details

Message ID DB3PR0202MB345239E6224770D24C5D307BEC320@DB3PR0202MB3452.eurprd02.prod.outlook.com
State New
Headers show

Commit Message

Stefan _ Dec. 6, 2017, 6:52 p.m.
On 06.12.2017 at 18:32 Michael Niedermayer wrote:
> This is duplicated, it should be moved into a seperate function

>

> [...]

>

Done.

Comments

Michael Niedermayer Dec. 7, 2017, 4:41 p.m.
On Wed, Dec 06, 2017 at 06:52:53PM +0000, Stefan _ wrote:
> On 06.12.2017 at 18:32 Michael Niedermayer wrote:
> > This is duplicated, it should be moved into a seperate function
> >
> > [...]
> >
> Done.
> 

>  hevc_filter.c |   20 +++-----------------
>  hevcdec.c     |   16 +++++++++++++++-
>  hevcdec.h     |   20 ++++++++++++++++++++
>  3 files changed, 38 insertions(+), 18 deletions(-)
> 93e3d5a1ccae9cbd0f5774e2666055e5ca4e8dd1  0001-libavcodec-hevc_filter-implement-skip_frame.patch
> From 7a9651040c1c4815d82712cb98dbd7bcf8c085bb Mon Sep 17 00:00:00 2001
> From: sfan5 <sfan5@live.de>
> Date: Tue, 5 Dec 2017 23:26:14 +0100
> Subject: [PATCH] libavcodec/hevc_filter: implement skip_frame
> 
> Also move AVDISCARD_NONREF check into inline function.

The move and the functional change should be in seperate patches
that keeps changes easy to read and understand

[...]

Patch hide | download patch | download mbox

From 7a9651040c1c4815d82712cb98dbd7bcf8c085bb Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Tue, 5 Dec 2017 23:26:14 +0100
Subject: [PATCH] libavcodec/hevc_filter: implement skip_frame

Also move AVDISCARD_NONREF check into inline function.
---
 libavcodec/hevc_filter.c | 20 +++-----------------
 libavcodec/hevcdec.c     | 16 +++++++++++++++-
 libavcodec/hevcdec.h     | 20 ++++++++++++++++++++
 3 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c
index 94fb7cd3d1..6b9824088c 100644
--- a/libavcodec/hevc_filter.c
+++ b/libavcodec/hevc_filter.c
@@ -842,29 +842,15 @@  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;
-    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;
-    }
+    int skip = 0;
     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))
+        (s->avctx->skip_loop_filter >= AVDISCARD_NONREF &&
+        ff_hevc_nal_is_nonref(s->nal_unit_type)))
         skip = 1;
 
     if (!skip)
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 433a7056ea..4bfae8c12b 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2905,6 +2905,13 @@  static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
         if (ret < 0)
             return ret;
 
+        if (
+            (s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
+            (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
+            (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IDR(s))) {
+            break;
+        }
+
         if (s->sh.first_slice_in_pic_flag) {
             if (s->max_ra == INT_MAX) {
                 if (s->nal_unit_type == HEVC_NAL_CRA_NUT || IS_BLA(s)) {
@@ -3028,7 +3035,14 @@  static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
 
     /* decode the NAL units */
     for (i = 0; i < s->pkt.nb_nals; i++) {
-        ret = decode_nal_unit(s, &s->pkt.nals[i]);
+        H2645NAL *nal = &s->pkt.nals[i];
+
+        if (s->avctx->skip_frame >= AVDISCARD_ALL ||
+            (s->avctx->skip_frame >= AVDISCARD_NONREF
+            && ff_hevc_nal_is_nonref(nal->type)))
+            continue;
+
+        ret = decode_nal_unit(s, nal);
         if (ret < 0) {
             av_log(s->avctx, AV_LOG_WARNING,
                    "Error parsing NAL unit #%d.\n", i);
diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h
index ef918f4fb2..b311edc8ae 100644
--- a/libavcodec/hevcdec.h
+++ b/libavcodec/hevcdec.h
@@ -548,6 +548,26 @@  int ff_hevc_frame_nb_refs(HEVCContext *s);
 
 int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc);
 
+static av_always_inline int ff_hevc_nal_is_nonref(enum HEVCNALUnitType type)
+{
+    switch (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:
+        return 1;
+        break;
+    default: break;
+    }
+    return 0;
+}
+
 /**
  * Find next frame in output order and put a reference to it in frame.
  * @return 1 if a frame was output, 0 otherwise
-- 
2.15.0