From cea30f8180e2acfdd70e22f05aad7f7c2b3d8acb Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sun, 29 May 2022 22:13:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=8E=E7=89=88=E6=9C=ACgc?= =?UTF-8?q?c=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98:#1667?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Codec/Transcode.cpp | 64 ++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/src/Codec/Transcode.cpp b/src/Codec/Transcode.cpp index c9a4cb5f..fa972b3a 100644 --- a/src/Codec/Transcode.cpp +++ b/src/Codec/Transcode.cpp @@ -249,11 +249,8 @@ void FFmpegFrame::fillPicture(AVPixelFormat target_format, int target_width, int /////////////////////////////////////////////////////////////////////////// -template -AVCodec *getCodec(ARGS ...names); - template -AVCodec *getCodec(const char *name) { +static inline AVCodec *getCodec_l(const char *name) { auto codec = decoder ? avcodec_find_decoder_by_name(name) : avcodec_find_encoder_by_name(name); if (codec) { InfoL << (decoder ? "got decoder:" : "got encoder:") << name; @@ -264,7 +261,7 @@ AVCodec *getCodec(const char *name) { } template -AVCodec *getCodec(enum AVCodecID id) { +static inline AVCodec *getCodec_l(enum AVCodecID id) { auto codec = decoder ? avcodec_find_decoder(id) : avcodec_find_encoder(id); if (codec) { InfoL << (decoder ? "got decoder:" : "got encoder:") << avcodec_get_name(id); @@ -274,13 +271,34 @@ AVCodec *getCodec(enum AVCodecID id) { return codec; } -template -AVCodec *getCodec(First first, ARGS ...names) { - auto codec = getCodec(names...); - if (codec) { - return codec; +class CodecName { +public: + CodecName(string name) : _codec_name(std::move(name)) {} + CodecName(enum AVCodecID id) : _id(id) {} + + template + AVCodec *getCodec() const { + if (!_codec_name.empty()) { + return getCodec_l(_codec_name.data()); + } + return getCodec_l(_id); } - return getCodec(first); + +private: + string _codec_name; + enum AVCodecID _id; +}; + +template +static inline AVCodec *getCodec(const std::initializer_list &codec_list) { + AVCodec *ret = nullptr; + for (int i = codec_list.size(); i >= 1; --i) { + ret = codec_list.begin()[i - 1].getCodec(); + if (ret) { + return ret; + } + } + return ret; } FFmpegDecoder::FFmpegDecoder(const Track::Ptr &track, int thread_num) { @@ -289,38 +307,38 @@ FFmpegDecoder::FFmpegDecoder(const Track::Ptr &track, int thread_num) { AVCodec *codec_default = nullptr; switch (track->getCodecId()) { case CodecH264: - codec_default = getCodec(AV_CODEC_ID_H264); + codec_default = getCodec({AV_CODEC_ID_H264}); if (checkIfSupportedNvidia()) { - codec = getCodec("libopenh264", AV_CODEC_ID_H264, "h264_qsv", "h264_videotoolbox", "h264_cuvid", "h264_nvmpi"); + codec = getCodec({{"libopenh264"}, {AV_CODEC_ID_H264}, {"h264_qsv"}, {"h264_videotoolbox"}, {"h264_cuvid"}, {"h264_nvmpi"}}); } else { - codec = getCodec("libopenh264", AV_CODEC_ID_H264, "h264_qsv", "h264_videotoolbox", "h264_nvmpi"); + codec = getCodec({{"libopenh264"}, {AV_CODEC_ID_H264}, {"h264_qsv"}, {"h264_videotoolbox"}, {"h264_nvmpi"}}); } break; case CodecH265: - codec_default = getCodec(AV_CODEC_ID_HEVC); + codec_default = getCodec({AV_CODEC_ID_HEVC}); if (checkIfSupportedNvidia()) { - codec = getCodec(AV_CODEC_ID_HEVC, "hevc_qsv", "hevc_videotoolbox", "hevc_cuvid", "hevc_nvmpi"); + codec = getCodec({{AV_CODEC_ID_HEVC}, {"hevc_qsv"}, {"hevc_videotoolbox"}, {"hevc_cuvid"}, {"hevc_nvmpi"}}); } else { - codec = getCodec(AV_CODEC_ID_HEVC, "hevc_qsv", "hevc_videotoolbox", "hevc_nvmpi"); + codec = getCodec({{AV_CODEC_ID_HEVC}, {"hevc_qsv"}, {"hevc_videotoolbox"}, {"hevc_nvmpi"}}); } break; case CodecAAC: - codec = getCodec(AV_CODEC_ID_AAC); + codec = getCodec({AV_CODEC_ID_AAC}); break; case CodecG711A: - codec = getCodec(AV_CODEC_ID_PCM_ALAW); + codec = getCodec({AV_CODEC_ID_PCM_ALAW}); break; case CodecG711U: - codec = getCodec(AV_CODEC_ID_PCM_MULAW); + codec = getCodec({AV_CODEC_ID_PCM_MULAW}); break; case CodecOpus: - codec = getCodec(AV_CODEC_ID_OPUS); + codec = getCodec({AV_CODEC_ID_OPUS}); break; case CodecVP8: - codec = getCodec(AV_CODEC_ID_VP8); + codec = getCodec({AV_CODEC_ID_VP8}); break; case CodecVP9: - codec = getCodec(AV_CODEC_ID_VP9); + codec = getCodec({AV_CODEC_ID_VP9}); break; default: break;