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

Submitted by Linjie Fu on Oct. 30, 2018, 9:07 a.m.

Details

Message ID 20181030090756.14936-1-linjie.fu@intel.com
State New
Headers show

Commit Message

Linjie Fu Oct. 30, 2018, 9:07 a.m.
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@intel.com>
---
 libavcodec/avcodec.h       |  8 ++++++++
 libavcodec/decode.c        | 11 +++++++++--
 libavcodec/options_table.h |  1 +
 3 files changed, 18 insertions(+), 2 deletions(-)

Comments

Hendrik Leppkes Oct. 30, 2018, 9:11 a.m.
On Tue, Oct 30, 2018 at 10:08 AM Linjie Fu <linjie.fu@intel.com> wrote:
>
> 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@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;
>

This is really something user-code should implement, its easy enough
to detect in eg. get_buffer2, and return an error from there.

- Hendrik
Linjie Fu Nov. 8, 2018, 8:28 a.m.
> -----Original Message-----

> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf

> Of Hendrik Leppkes

> Sent: Tuesday, October 30, 2018 17:11

> To: FFmpeg development discussions and patches <ffmpeg-

> devel@ffmpeg.org>

> Subject: Re: [FFmpeg-devel] [PATCH] add an option to forbid the fallback to

> sw when hardware init fails

> 

> On Tue, Oct 30, 2018 at 10:08 AM Linjie Fu <linjie.fu@intel.com> wrote:

> >

> > 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@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;

> >

> 

> This is really something user-code should implement, its easy enough

> to detect in eg. get_buffer2, and return an error from there.

> 

> - Hendrik


Thanks for your review, will modify in user-code and detect in get_buffer().

Best regards,
Linjie, Fu.

Patch hide | download patch | download mbox

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},
 };