mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-10-06 20:23:43 +08:00
修复低版本gcc编译问题:#1667
This commit is contained in:
parent
fd52ba31b0
commit
cea30f8180
|
@ -249,11 +249,8 @@ void FFmpegFrame::fillPicture(AVPixelFormat target_format, int target_width, int
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template<bool decoder = true, typename ...ARGS>
|
|
||||||
AVCodec *getCodec(ARGS ...names);
|
|
||||||
|
|
||||||
template<bool decoder = true>
|
template<bool decoder = true>
|
||||||
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);
|
auto codec = decoder ? avcodec_find_decoder_by_name(name) : avcodec_find_encoder_by_name(name);
|
||||||
if (codec) {
|
if (codec) {
|
||||||
InfoL << (decoder ? "got decoder:" : "got encoder:") << name;
|
InfoL << (decoder ? "got decoder:" : "got encoder:") << name;
|
||||||
|
@ -264,7 +261,7 @@ AVCodec *getCodec(const char *name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<bool decoder = true>
|
template<bool decoder = true>
|
||||||
AVCodec *getCodec(enum AVCodecID id) {
|
static inline AVCodec *getCodec_l(enum AVCodecID id) {
|
||||||
auto codec = decoder ? avcodec_find_decoder(id) : avcodec_find_encoder(id);
|
auto codec = decoder ? avcodec_find_decoder(id) : avcodec_find_encoder(id);
|
||||||
if (codec) {
|
if (codec) {
|
||||||
InfoL << (decoder ? "got decoder:" : "got encoder:") << avcodec_get_name(id);
|
InfoL << (decoder ? "got decoder:" : "got encoder:") << avcodec_get_name(id);
|
||||||
|
@ -274,13 +271,34 @@ AVCodec *getCodec(enum AVCodecID id) {
|
||||||
return codec;
|
return codec;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<bool decoder = true, typename First, typename ...ARGS>
|
class CodecName {
|
||||||
AVCodec *getCodec(First first, ARGS ...names) {
|
public:
|
||||||
auto codec = getCodec<decoder>(names...);
|
CodecName(string name) : _codec_name(std::move(name)) {}
|
||||||
if (codec) {
|
CodecName(enum AVCodecID id) : _id(id) {}
|
||||||
return codec;
|
|
||||||
|
template <bool decoder>
|
||||||
|
AVCodec *getCodec() const {
|
||||||
|
if (!_codec_name.empty()) {
|
||||||
|
return getCodec_l<decoder>(_codec_name.data());
|
||||||
}
|
}
|
||||||
return getCodec<decoder>(first);
|
return getCodec_l<decoder>(_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
string _codec_name;
|
||||||
|
enum AVCodecID _id;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <bool decoder = true>
|
||||||
|
static inline AVCodec *getCodec(const std::initializer_list<CodecName> &codec_list) {
|
||||||
|
AVCodec *ret = nullptr;
|
||||||
|
for (int i = codec_list.size(); i >= 1; --i) {
|
||||||
|
ret = codec_list.begin()[i - 1].getCodec<decoder>();
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
FFmpegDecoder::FFmpegDecoder(const Track::Ptr &track, int thread_num) {
|
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;
|
AVCodec *codec_default = nullptr;
|
||||||
switch (track->getCodecId()) {
|
switch (track->getCodecId()) {
|
||||||
case CodecH264:
|
case CodecH264:
|
||||||
codec_default = getCodec(AV_CODEC_ID_H264);
|
codec_default = getCodec({AV_CODEC_ID_H264});
|
||||||
if (checkIfSupportedNvidia()) {
|
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 {
|
} 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;
|
break;
|
||||||
case CodecH265:
|
case CodecH265:
|
||||||
codec_default = getCodec(AV_CODEC_ID_HEVC);
|
codec_default = getCodec({AV_CODEC_ID_HEVC});
|
||||||
if (checkIfSupportedNvidia()) {
|
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 {
|
} 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;
|
break;
|
||||||
case CodecAAC:
|
case CodecAAC:
|
||||||
codec = getCodec(AV_CODEC_ID_AAC);
|
codec = getCodec({AV_CODEC_ID_AAC});
|
||||||
break;
|
break;
|
||||||
case CodecG711A:
|
case CodecG711A:
|
||||||
codec = getCodec(AV_CODEC_ID_PCM_ALAW);
|
codec = getCodec({AV_CODEC_ID_PCM_ALAW});
|
||||||
break;
|
break;
|
||||||
case CodecG711U:
|
case CodecG711U:
|
||||||
codec = getCodec(AV_CODEC_ID_PCM_MULAW);
|
codec = getCodec({AV_CODEC_ID_PCM_MULAW});
|
||||||
break;
|
break;
|
||||||
case CodecOpus:
|
case CodecOpus:
|
||||||
codec = getCodec(AV_CODEC_ID_OPUS);
|
codec = getCodec({AV_CODEC_ID_OPUS});
|
||||||
break;
|
break;
|
||||||
case CodecVP8:
|
case CodecVP8:
|
||||||
codec = getCodec(AV_CODEC_ID_VP8);
|
codec = getCodec({AV_CODEC_ID_VP8});
|
||||||
break;
|
break;
|
||||||
case CodecVP9:
|
case CodecVP9:
|
||||||
codec = getCodec(AV_CODEC_ID_VP9);
|
codec = getCodec({AV_CODEC_ID_VP9});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user