From patchwork Sun Feb 12 20:37:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Miroslav_Sluge=C5=88?= X-Patchwork-Id: 2528 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp609986vsb; Sun, 12 Feb 2017 12:37:50 -0800 (PST) X-Received: by 10.28.96.130 with SMTP id u124mr37973964wmb.81.1486931870391; Sun, 12 Feb 2017 12:37:50 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l73si2743575wmd.112.2017.02.12.12.37.49; Sun, 12 Feb 2017 12:37:50 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@email.cz; dkim=neutral (body hash did not verify) header.i=@email.cz; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=email.cz Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1AC10689DD8; Sun, 12 Feb 2017 22:37:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mxf2.seznam.cz (mxf2.seznam.cz [77.75.76.123]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9B367689C87 for ; Sun, 12 Feb 2017 22:37:36 +0200 (EET) Received: from email.seznam.cz by email-smtpc13b.ng.seznam.cz (email-smtpc13b.ng.seznam.cz [10.23.14.135]) id 4126201b75f1380741b40916; Sun, 12 Feb 2017 21:37:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=email.cz; s=beta; t=1486931861; bh=zDb3Uc2xLI4CaHiic4KMEACL/PBs087u4QqEeOT3I7s=; h=DKIM-Signature:Received:From:Subject:To:Message-ID:Date: User-Agent:MIME-Version:Content-Type; b=C3Rxdl5UaHzsDssxo0Elby/kMhF0ayApiJ3dGy9M1gDFH/ERQxpUAxMdsHqVV1RPw 9+5I0Mh7lbeJbXLA6tccMAYAIOuhsmUN5mv/c5jADBkNMcudQImRv5wsAj6gQc9tEy ehHaz+ItudEUYSY7egRXboAq4iQ5h/eI3Wj9eTVg= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=email.cz; s=beta; t=1486931861; bh=zDb3Uc2xLI4CaHiic4KMEACL/PBs087u4QqEeOT3I7s=; h=Received:From:Subject:To:Message-ID:Date:User-Agent:MIME-Version: Content-Type; b=IZuMj6kLEpMoRak9yUIIY5uQUnlIYqVXTxFK9keEj73x9QCpRgvLNi7TBWIHGSUnW Ao6zkfj5Ju8nrQ9AXkKtsG1cyd3i5p7z97HyNhS7dJuND3ThoeIgqrCFJKcLcY5tnY RBEvZ12tmR/7fjBo4P4aMkcx8oF3IKX8FF3vil9g= Received: from [192.168.0.6] (ip-94-113-140-7.net.upcbroadband.cz [94.113.140.7]) by email-relay21.ng.seznam.cz (Seznam SMTPD 1.3.56) with ESMTP; Sun, 12 Feb 2017 21:37:36 +0100 (CET) From: =?UTF-8?Q?Miroslav_Sluge=c5=88?= To: ffmpeg-devel@ffmpeg.org Message-ID: <58A0C78E.4070103@email.cz> Date: Sun, 12 Feb 2017 21:37:34 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.0.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] (for discussion): ffmpeg: prefer cuvid decoders when use option -cuvid X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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. From 08e448c036166b645a0364c0a2a6b2b1dbdd869d Mon Sep 17 00:00:00 2001 From: Miroslav Slugen 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