This patch is for discussion only, not ready to commit yet and maybe
newer will be.
We were facing issue when using -hwaccel cuvid we have to also specify
input decoder like -c:v XXXX_cuvid for every input and input video
format was sometimes mpeg2/h264/hevc. So this is my FIX/HACK to only
specify -cuvid and ffmpeg will pick cuvid decoder for any supported input.
I don't know correct solution for this yet.
--
Miroslav Slugeň
>From 08e448c036166b645a0364c0a2a6b2b1dbdd869d Mon Sep 17 00:00:00 2001
From: Miroslav Slugen <thunde...@email.cz>
Date: Sun, 12 Feb 2017 21:32:45 +0100
Subject: [PATCH 1/1] ffmpeg: prefer cuvid decoders when use option -cuvid
---
ffmpeg.c | 8 +++++++
ffmpeg_opt.c | 2 ++
libavcodec/allcodecs.c | 57 ++++++++++++++++++++++++++++++++++++++++++--------
libavcodec/avcodec.h | 2 ++
4 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/ffmpeg.c b/ffmpeg.c
index 06570c0..a47dcd2 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -4557,6 +4557,14 @@ int main(int argc, char **argv)
argv++;
}
+ avcodec_cuvid = 0;
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-cuvid")) {
+ avcodec_cuvid = 1;
+ break;
+ }
+ }
+
avcodec_register_all();
#if CONFIG_AVDEVICE
avdevice_register_all();
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 6a47d32..46e440c 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -3582,6 +3582,8 @@ const OptionDef options[] = {
"audio bitrate (please use -b:a)", "bitrate" },
{ "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
"video bitrate (please use -b:v)", "bitrate" },
+ { "cuvid", OPT_BOOL | OPT_EXPERT, { &avcodec_cuvid },
+ "enable cuvid acceleration for input" },
{ "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
"use HW accelerated decoding", "hwaccel name" },
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 3680129..e613728 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -58,6 +58,36 @@
av_register_codec_parser(&ff_##x##_parser); \
}
+int avcodec_cuvid = 0;
+
+static void avcodec_register_cuvid_h264(void) {
+ REGISTER_DECODER(H264_CUVID, h264_cuvid);
+}
+static void avcodec_register_cuvid_hevc(void) {
+ REGISTER_DECODER(HEVC_CUVID, hevc_cuvid);
+}
+static void avcodec_register_cuvid_mjpeg(void) {
+ REGISTER_DECODER(MJPEG_CUVID, mjpeg_cuvid);
+}
+static void avcodec_register_cuvid_mpeg1(void) {
+ REGISTER_DECODER(MPEG1_CUVID, mpeg1_cuvid);
+}
+static void avcodec_register_cuvid_mpeg2(void) {
+ REGISTER_DECODER(MPEG2_CUVID, mpeg2_cuvid);
+}
+static void avcodec_register_cuvid_mpeg4(void) {
+ REGISTER_DECODER(MPEG4_CUVID, mpeg4_cuvid);
+}
+static void avcodec_register_cuvid_vc1(void) {
+ REGISTER_DECODER(VC1_CUVID, vc1_cuvid);
+}
+static void avcodec_register_cuvid_vp8(void) {
+ REGISTER_DECODER(VP8_CUVID, vp8_cuvid);
+}
+static void avcodec_register_cuvid_vp9(void) {
+ REGISTER_DECODER(VP9_CUVID, vp9_cuvid);
+}
+
void avcodec_register_all(void)
{
static int initialized;
@@ -202,6 +232,7 @@ void avcodec_register_all(void)
REGISTER_ENCDEC (H263, h263);
REGISTER_DECODER(H263I, h263i);
REGISTER_ENCDEC (H263P, h263p);
+ if (avcodec_cuvid) avcodec_register_cuvid_h264();
REGISTER_DECODER(H264, h264);
REGISTER_DECODER(H264_CRYSTALHD, h264_crystalhd);
REGISTER_DECODER(H264_MEDIACODEC, h264_mediacodec);
@@ -212,6 +243,7 @@ void avcodec_register_all(void)
REGISTER_DECODER(H264_VDPAU, h264_vdpau);
#endif
REGISTER_ENCDEC (HAP, hap);
+ if (avcodec_cuvid) avcodec_register_cuvid_hevc();
REGISTER_DECODER(HEVC, hevc);
REGISTER_DECODER(HEVC_QSV, hevc_qsv);
REGISTER_DECODER(HNM4_VIDEO, hnm4_video);
@@ -237,6 +269,7 @@ void avcodec_register_all(void)
REGISTER_DECODER(MAGICYUV, magicyuv);
REGISTER_DECODER(MDEC, mdec);
REGISTER_DECODER(MIMIC, mimic);
+ if (avcodec_cuvid) avcodec_register_cuvid_mjpeg();
REGISTER_ENCDEC (MJPEG, mjpeg);
REGISTER_DECODER(MJPEGB, mjpegb);
REGISTER_DECODER(MMVIDEO, mmvideo);
@@ -244,8 +277,11 @@ void avcodec_register_all(void)
#if FF_API_XVMC
REGISTER_DECODER(MPEG_XVMC, mpeg_xvmc);
#endif /* FF_API_XVMC */
+ avcodec_register_cuvid_mpeg1();
REGISTER_ENCDEC (MPEG1VIDEO, mpeg1video);
+ avcodec_register_cuvid_mpeg2();
REGISTER_ENCDEC (MPEG2VIDEO, mpeg2video);
+ avcodec_register_cuvid_mpeg4();
REGISTER_ENCDEC (MPEG4, mpeg4);
REGISTER_DECODER(MPEG4_CRYSTALHD, mpeg4_crystalhd);
REGISTER_DECODER(MPEG4_MMAL, mpeg4_mmal);
@@ -344,6 +380,7 @@ void avcodec_register_all(void)
REGISTER_ENCDEC (V410, v410);
REGISTER_DECODER(VB, vb);
REGISTER_DECODER(VBLE, vble);
+ avcodec_register_cuvid_vc1();
REGISTER_DECODER(VC1, vc1);
REGISTER_DECODER(VC1_CRYSTALHD, vc1_crystalhd);
#if FF_API_VDPAU
@@ -362,7 +399,9 @@ void avcodec_register_all(void)
REGISTER_DECODER(VP6A, vp6a);
REGISTER_DECODER(VP6F, vp6f);
REGISTER_DECODER(VP7, vp7);
+ if (avcodec_cuvid) avcodec_register_cuvid_vp8();
REGISTER_DECODER(VP8, vp8);
+ if (avcodec_cuvid) avcodec_register_cuvid_vp9();
REGISTER_DECODER(VP9, vp9);
REGISTER_DECODER(VQA, vqa);
REGISTER_DECODER(WEBP, webp);
@@ -642,7 +681,7 @@ void avcodec_register_all(void)
/* external libraries, that shouldn't be used by default if one of the
* above is available */
REGISTER_ENCDEC (LIBOPENH264, libopenh264);
- REGISTER_DECODER(H264_CUVID, h264_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_h264();
REGISTER_ENCODER(H264_NVENC, h264_nvenc);
REGISTER_ENCODER(H264_OMX, h264_omx);
REGISTER_ENCODER(H264_QSV, h264_qsv);
@@ -653,25 +692,25 @@ void avcodec_register_all(void)
REGISTER_ENCODER(NVENC_H264, nvenc_h264);
REGISTER_ENCODER(NVENC_HEVC, nvenc_hevc);
#endif
- REGISTER_DECODER(HEVC_CUVID, hevc_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_hevc();
REGISTER_DECODER(HEVC_MEDIACODEC, hevc_mediacodec);
REGISTER_ENCODER(HEVC_NVENC, hevc_nvenc);
REGISTER_ENCODER(HEVC_QSV, hevc_qsv);
REGISTER_ENCODER(HEVC_VAAPI, hevc_vaapi);
REGISTER_ENCODER(LIBKVAZAAR, libkvazaar);
- REGISTER_DECODER(MJPEG_CUVID, mjpeg_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_mjpeg();
REGISTER_ENCODER(MJPEG_VAAPI, mjpeg_vaapi);
- REGISTER_DECODER(MPEG1_CUVID, mpeg1_cuvid);
- REGISTER_DECODER(MPEG2_CUVID, mpeg2_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_mpeg1();
+ if (!avcodec_cuvid) avcodec_register_cuvid_mpeg2();
REGISTER_ENCODER(MPEG2_QSV, mpeg2_qsv);
REGISTER_ENCODER(MPEG2_VAAPI, mpeg2_vaapi);
- REGISTER_DECODER(MPEG4_CUVID, mpeg4_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_mpeg4();
REGISTER_DECODER(MPEG4_MEDIACODEC, mpeg4_mediacodec);
- REGISTER_DECODER(VC1_CUVID, vc1_cuvid);
- REGISTER_DECODER(VP8_CUVID, vp8_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_vc1();
+ if (!avcodec_cuvid) avcodec_register_cuvid_vp8();
REGISTER_DECODER(VP8_MEDIACODEC, vp8_mediacodec);
REGISTER_ENCODER(VP8_VAAPI, vp8_vaapi);
- REGISTER_DECODER(VP9_CUVID, vp9_cuvid);
+ if (!avcodec_cuvid) avcodec_register_cuvid_vp9();
REGISTER_DECODER(VP9_MEDIACODEC, vp9_mediacodec);
/* parsers */
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 3e161ea..09c1835 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -6256,6 +6256,8 @@ const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
*/
AVCPBProperties *av_cpb_properties_alloc(size_t *size);
+extern int avcodec_cuvid;
+
/**
* @}
*/
--
2.1.4
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel