diff mbox series

[FFmpeg-devel] ffmpeg: remove superfluous custom cuvid hwaccel

Message ID 20200303170033.4543-1-jamrial@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel] ffmpeg: remove superfluous custom cuvid hwaccel | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

James Almer March 3, 2020, 5 p.m. UTC
It's apparently not working, and is a duplicate of the properly implemented
nvdec libavcodec hwaccel.

Signed-off-by: James Almer <jamrial@gmail.com>
---
When i try decoding a sample using -hwaccel cuvid I get

[h264 @ 000001ab70730020] decoder->cvdl->cuvidCreateDecoder(&decoder->decoder, params) failed -> CUDA_ERROR_INVALID_VALUE: invalid argument
[h264 @ 000001ab70730020] Failed setup for format cuda: hwaccel initialisation returned error

That same sample works just fine if i instead use -hwaccel nvdec. And seeing this
hwaccel is merely a ffmpeg.c specific implementation using AVHWFramesContext, much
like the libavcodec hwaccel, i figured it was best to just remove it and map cuvid
to nvdec in order to not break existing cli scripts.

The same can probably be done with the VideoToolbox one, but not the QSV as there's
no such hwaccel in libavcodec (One should probably be written).

 fftools/Makefile       |  1 -
 fftools/ffmpeg.h       |  2 --
 fftools/ffmpeg_cuvid.c | 73 ------------------------------------------
 fftools/ffmpeg_opt.c   |  5 +--
 4 files changed, 1 insertion(+), 80 deletions(-)
 delete mode 100644 fftools/ffmpeg_cuvid.c

Comments

Timo Rothenpieler March 3, 2020, 8:14 p.m. UTC | #1
On 03.03.2020 18:00, James Almer wrote:
> It's apparently not working, and is a duplicate of the properly implemented
> nvdec libavcodec hwaccel.
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> When i try decoding a sample using -hwaccel cuvid I get
> 
> [h264 @ 000001ab70730020] decoder->cvdl->cuvidCreateDecoder(&decoder->decoder, params) failed -> CUDA_ERROR_INVALID_VALUE: invalid argument
> [h264 @ 000001ab70730020] Failed setup for format cuda: hwaccel initialisation returned error
> 
> That same sample works just fine if i instead use -hwaccel nvdec. And seeing this
> hwaccel is merely a ffmpeg.c specific implementation using AVHWFramesContext, much
> like the libavcodec hwaccel, i figured it was best to just remove it and map cuvid
> to nvdec in order to not break existing cli scripts.
> 
> The same can probably be done with the VideoToolbox one, but not the QSV as there's
> no such hwaccel in libavcodec (One should probably be written).

It should be working fine still, but there's really no reason to keep it.
James Almer March 3, 2020, 8:52 p.m. UTC | #2
On 3/3/2020 5:14 PM, Timo Rothenpieler wrote:
> On 03.03.2020 18:00, James Almer wrote:
>> It's apparently not working, and is a duplicate of the properly
>> implemented
>> nvdec libavcodec hwaccel.
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>> When i try decoding a sample using -hwaccel cuvid I get
>>
>> [h264 @ 000001ab70730020]
>> decoder->cvdl->cuvidCreateDecoder(&decoder->decoder, params) failed ->
>> CUDA_ERROR_INVALID_VALUE: invalid argument
>> [h264 @ 000001ab70730020] Failed setup for format cuda: hwaccel
>> initialisation returned error
>>
>> That same sample works just fine if i instead use -hwaccel nvdec. And
>> seeing this
>> hwaccel is merely a ffmpeg.c specific implementation using
>> AVHWFramesContext, much
>> like the libavcodec hwaccel, i figured it was best to just remove it
>> and map cuvid
>> to nvdec in order to not break existing cli scripts.
>>
>> The same can probably be done with the VideoToolbox one, but not the
>> QSV as there's
>> no such hwaccel in libavcodec (One should probably be written).
> 
> It should be working fine still, but there's really no reason to keep it.

I get that error on my GTX 1660 on Win10, recent driver and ffnvcodec
headers. Is it working for you?

Will apply, thanks.
diff mbox series

Patch

diff --git a/fftools/Makefile b/fftools/Makefile
index 6cec666dd9..5affaa3f56 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -10,7 +10,6 @@  ALLAVPROGS   = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF))
 ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
 
 OBJS-ffmpeg                        += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
-OBJS-ffmpeg-$(CONFIG_CUVID)        += fftools/ffmpeg_cuvid.o
 OBJS-ffmpeg-$(CONFIG_LIBMFX)       += fftools/ffmpeg_qsv.o
 ifndef CONFIG_VIDEOTOOLBOX
 OBJS-ffmpeg-$(CONFIG_VDA)          += fftools/ffmpeg_videotoolbox.o
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 7b6f802082..c0b8eb599f 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -61,7 +61,6 @@  enum HWAccelID {
     HWACCEL_GENERIC,
     HWACCEL_VIDEOTOOLBOX,
     HWACCEL_QSV,
-    HWACCEL_CUVID,
 };
 
 typedef struct HWAccel {
@@ -654,7 +653,6 @@  int ffmpeg_parse_options(int argc, char **argv);
 
 int videotoolbox_init(AVCodecContext *s);
 int qsv_init(AVCodecContext *s);
-int cuvid_init(AVCodecContext *s);
 
 HWDevice *hw_device_get_by_name(const char *name);
 int hw_device_init_from_string(const char *arg, HWDevice **dev);
diff --git a/fftools/ffmpeg_cuvid.c b/fftools/ffmpeg_cuvid.c
deleted file mode 100644
index 3ff3b40f17..0000000000
--- a/fftools/ffmpeg_cuvid.c
+++ /dev/null
@@ -1,73 +0,0 @@ 
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/hwcontext.h"
-#include "libavutil/pixdesc.h"
-
-#include "ffmpeg.h"
-
-static void cuvid_uninit(AVCodecContext *avctx)
-{
-    InputStream *ist = avctx->opaque;
-    av_buffer_unref(&ist->hw_frames_ctx);
-}
-
-int cuvid_init(AVCodecContext *avctx)
-{
-    InputStream *ist = avctx->opaque;
-    AVHWFramesContext *frames_ctx;
-    int ret;
-
-    av_log(avctx, AV_LOG_VERBOSE, "Initializing cuvid hwaccel\n");
-
-    if (!hw_device_ctx) {
-        ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA,
-                                     ist->hwaccel_device, NULL, 0);
-        if (ret < 0) {
-            av_log(avctx, AV_LOG_ERROR, "Error creating a CUDA device\n");
-            return ret;
-        }
-    }
-
-    av_buffer_unref(&ist->hw_frames_ctx);
-    ist->hw_frames_ctx = av_hwframe_ctx_alloc(hw_device_ctx);
-    if (!ist->hw_frames_ctx) {
-        av_log(avctx, AV_LOG_ERROR, "Error creating a CUDA frames context\n");
-        return AVERROR(ENOMEM);
-    }
-
-    frames_ctx = (AVHWFramesContext*)ist->hw_frames_ctx->data;
-
-    frames_ctx->format = AV_PIX_FMT_CUDA;
-    frames_ctx->sw_format = avctx->sw_pix_fmt;
-    frames_ctx->width = avctx->width;
-    frames_ctx->height = avctx->height;
-
-    av_log(avctx, AV_LOG_DEBUG, "Initializing CUDA frames context: sw_format = %s, width = %d, height = %d\n",
-           av_get_pix_fmt_name(frames_ctx->sw_format), frames_ctx->width, frames_ctx->height);
-
-    ret = av_hwframe_ctx_init(ist->hw_frames_ctx);
-    if (ret < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Error initializing a CUDA frame pool\n");
-        return ret;
-    }
-
-    ist->hwaccel_uninit = cuvid_uninit;
-
-    return 0;
-}
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 3bf90bd20c..1b721c4954 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -72,9 +72,6 @@  const HWAccel hwaccels[] = {
 #endif
 #if CONFIG_LIBMFX
     { "qsv",   qsv_init,   HWACCEL_QSV,   AV_PIX_FMT_QSV },
-#endif
-#if CONFIG_CUVID
-    { "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA },
 #endif
     { 0 },
 };
@@ -822,7 +819,7 @@  static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
             MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
             if (hwaccel) {
                 // The NVDEC hwaccels use a CUDA device, so remap the name here.
-                if (!strcmp(hwaccel, "nvdec"))
+                if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
                     hwaccel = "cuda";
 
                 if (!strcmp(hwaccel, "none"))