[FFmpeg-devel] [PATCH] add an option to forbid the fallback to sw when hardware init fails

Linjie Fu linjie.fu at intel.com
Tue Oct 30 11:07:56 EET 2018


Currently ff_get_format will go through all usable choices if the
chosen format was not supported. It will fallback to software if
the hardware init fails.

According to the comment in ticket #7519, provided an option
"-fallback_forbid 1" to return directly if hardware init fails
and forbid the fallback to software.

Signed-off-by: Linjie Fu <linjie.fu at intel.com>
---
 libavcodec/avcodec.h       |  8 ++++++++
 libavcodec/decode.c        | 11 +++++++++--
 libavcodec/options_table.h |  1 +
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 705a3ce4f3..fac3c6acb2 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3312,6 +3312,14 @@ typedef struct AVCodecContext {
      * used as reference pictures).
      */
     int extra_hw_frames;
+
+    /**
+     * - forbid the fallback to software path in ff_get_format
+     * - when the hardware init fails. (0 -> disabled)
+     * - encoding: unused.
+     * - decoding: Set by user.
+     */
+    int fallback_forbid;
 } AVCodecContext;
 
 #if FF_API_CODEC_GET_SET
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 4607e9f318..edadbd7e03 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1441,8 +1441,15 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
             av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel "
                    "initialisation.\n", desc->name);
             err = hwaccel_init(avctx, hw_config);
-            if (err < 0)
-                goto try_again;
+            if (err < 0) {
+                if (avctx->fallback_forbid) {
+                    av_log(avctx, AV_LOG_ERROR, "Format %s not usable, fallback "
+                        "was forbidden.\n", desc->name);
+                    ret = AV_PIX_FMT_NONE;
+                    break;
+                } else
+                    goto try_again;
+            }
         }
         ret = user_choice;
         break;
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index 099261e168..73f0333eeb 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -479,6 +479,7 @@ static const AVOption avcodec_options[] = {
 {"allow_high_depth", "allow to output YUV pixel formats with a different chroma sampling than 4:2:0 and/or other than 8 bits per component", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"},
 {"allow_profile_mismatch", "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"},
 {"extra_hw_frames", "Number of extra hardware frames to allocate for the user", OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, V|D },
+{"fallback_forbid", "forbid the fallback to software path when hardware init fails", OFFSET(fallback_forbid), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, V|D },
 {NULL},
 };
 
-- 
2.17.1



More information about the ffmpeg-devel mailing list