Options to control decoding codec

This commit is contained in:
Niellune
2025-06-12 20:52:01 +03:00
parent b00de2c6ad
commit c83f00e7bf
3 changed files with 32 additions and 5 deletions
+11 -4
View File
@@ -49,7 +49,7 @@ AVCodecContext *Decoder::load_codec(AVCodecID codec_id)
AVCodecContext *result = nullptr;
// Try hardware-accelerated decoders by iterating registered codecs
while ((codec = av_codec_iterate(&iter)))
while ((codec = av_codec_iterate(&iter)) && Settings::hwDecode)
{
if (!av_codec_is_decoder(codec) || codec->id != codec_id)
continue;
@@ -63,14 +63,21 @@ AVCodecContext *Decoder::load_codec(AVCodecID codec_id)
break;
}
if(Settings::codecLowDelay)
result->flags |= AV_CODEC_FLAG_LOW_DELAY;
if(Settings::codecFast)
result->flags2 |= AV_CODEC_FLAG2_FAST;
int ret = avcodec_open2(result, codec, nullptr);
if (ret == 0)
{
std::cout << "[Video] Using HW decoder: " << codec->name << std::endl;
if (result->codec->capabilities & AV_CODEC_CAP_DELAY)
std::cout << "[Video] Codec has AV_CODEC_CAP_DELAY and can introduce lags, consider use SW decoding" << std::endl;
return result;
}
std::cout << "[Video] Can't load HW codec " << codec->name << ": " << avErrorText(ret) << std::endl;
std::cout << "[Video] Can't load HW decoder " << codec->name << ": " << avErrorText(ret) << std::endl;
avcodec_free_context(&result);
}
@@ -78,7 +85,7 @@ AVCodecContext *Decoder::load_codec(AVCodecID codec_id)
codec = avcodec_find_decoder(codec_id);
if (!codec)
{
std::cout << "[Video] Decoder not found for codec id " << codec_id << std::endl;
std::cout << "[Video] HW decoder not found for codec id " << codec_id << std::endl;
return nullptr;
}
@@ -92,7 +99,7 @@ AVCodecContext *Decoder::load_codec(AVCodecID codec_id)
int ret = avcodec_open2(result, codec, nullptr);
if (ret < 0)
{
std::cout << "[Video] Failed to open software decoder " << codec->name << ": " << avErrorText(ret) << std::endl;
std::cout << "[Video] Failed to open SW decoder " << codec->name << ": " << avErrorText(ret) << std::endl;
avcodec_free_context(&result);
return nullptr;
}
+7
View File
@@ -33,6 +33,7 @@ public:
// Application configuration section
static inline Setting<int> fontSize{"font-size", 30};
static inline Setting<bool> vsync{"vsync", false};
static inline Setting<bool> hwDecode{"hw-decode", true};
static inline Setting<float> aspectCorrection{"aspect-correction", 1};
static inline Setting<bool> fastScale{"fast-render-scale", false};
static inline Setting<int> videoQueue{"video-buffer-size", 32};
@@ -51,6 +52,12 @@ public:
// Debug section
static inline Setting<int> protocolDebug{"protocol-debug", 0};
static inline Setting<float> codecLowDelay{"decode-low-delay", true};
static inline Setting<float> codecFast{"decode-fast", false};
static void load(const std::string &filename);
static void print();