It's a duplicate of the properly implemented nvdec libavcodec hwaccel Reviewed-by: Timo Rothenpieler <timo@rothenpieler.org> Signed-off-by: James Almer <jamrial@gmail.com>tags/n4.3
@@ -10,7 +10,6 @@ ALLAVPROGS = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF)) | |||||
ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF)) | ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF)) | ||||
OBJS-ffmpeg += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o | 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 | OBJS-ffmpeg-$(CONFIG_LIBMFX) += fftools/ffmpeg_qsv.o | ||||
ifndef CONFIG_VIDEOTOOLBOX | ifndef CONFIG_VIDEOTOOLBOX | ||||
OBJS-ffmpeg-$(CONFIG_VDA) += fftools/ffmpeg_videotoolbox.o | OBJS-ffmpeg-$(CONFIG_VDA) += fftools/ffmpeg_videotoolbox.o | ||||
@@ -61,7 +61,6 @@ enum HWAccelID { | |||||
HWACCEL_GENERIC, | HWACCEL_GENERIC, | ||||
HWACCEL_VIDEOTOOLBOX, | HWACCEL_VIDEOTOOLBOX, | ||||
HWACCEL_QSV, | HWACCEL_QSV, | ||||
HWACCEL_CUVID, | |||||
}; | }; | ||||
typedef struct HWAccel { | typedef struct HWAccel { | ||||
@@ -654,7 +653,6 @@ int ffmpeg_parse_options(int argc, char **argv); | |||||
int videotoolbox_init(AVCodecContext *s); | int videotoolbox_init(AVCodecContext *s); | ||||
int qsv_init(AVCodecContext *s); | int qsv_init(AVCodecContext *s); | ||||
int cuvid_init(AVCodecContext *s); | |||||
HWDevice *hw_device_get_by_name(const char *name); | HWDevice *hw_device_get_by_name(const char *name); | ||||
int hw_device_init_from_string(const char *arg, HWDevice **dev); | int hw_device_init_from_string(const char *arg, HWDevice **dev); | ||||
@@ -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; | |||||
} |
@@ -72,9 +72,6 @@ const HWAccel hwaccels[] = { | |||||
#endif | #endif | ||||
#if CONFIG_LIBMFX | #if CONFIG_LIBMFX | ||||
{ "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV }, | { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV }, | ||||
#endif | |||||
#if CONFIG_CUVID | |||||
{ "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA }, | |||||
#endif | #endif | ||||
{ 0 }, | { 0 }, | ||||
}; | }; | ||||
@@ -822,7 +819,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) | |||||
MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st); | MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st); | ||||
if (hwaccel) { | if (hwaccel) { | ||||
// The NVDEC hwaccels use a CUDA device, so remap the name here. | // 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"; | hwaccel = "cuda"; | ||||
if (!strcmp(hwaccel, "none")) | if (!strcmp(hwaccel, "none")) | ||||