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

James Almer jamrial at gmail.com
Tue Mar 3 19:00:33 EET 2020


It's apparently not working, and is a duplicate of the properly implemented
nvdec libavcodec hwaccel.

Signed-off-by: James Almer <jamrial at 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

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"))
-- 
2.25.1



More information about the ffmpeg-devel mailing list