fix: avoid unbounded HTTP throttling and make buffer readout opt-in

This commit is contained in:
2026-10-11 11:52:48 +02:00
parent 13554a1574
commit 537e8e2624
6 changed files with 118 additions and 28 deletions
+7 -3
View File
@@ -485,7 +485,7 @@ struct Player {
steadyAnchor = Clock::now();
}
playback::NetworkInput *openNetworkInput(int slot, const std::string &url, const std::string &headers) {
playback::NetworkInput *openNetworkInput(int slot, const std::string &url, const std::string &headers, bool live) {
inputs[slot] = std::make_unique<playback::NetworkInput>(stopping, requestedEpoch, activeEpoch, wake, cacheBudget);
auto &input = *inputs[slot];
input.format = avformat_alloc_context();
@@ -494,6 +494,10 @@ struct Player {
AVDictionary *options = nullptr;
int result = av_dict_set(&options, "protocol_whitelist", "http,https,tcp,tls,crypto", 0);
if (result >= 0) result = av_dict_set(&options, "rw_timeout", "15000000", 0);
// Some YouTube CDNs throttle open-ended ranges; FFmpeg continues bounded requests.
if (result >= 0 && !live) result = av_dict_set(&options, "request_size", "10485760", 0);
if (result >= 0 && !live) result = av_dict_set(&options, "multiple_requests", "1", 0);
// Leave short-seek read-ahead disabled: cache misses must escape stalled responses.
if (result >= 0 && !headers.empty()) result = av_dict_set(&options, "headers", headers.c_str(), 0);
if (result < 0) {
av_dict_free(&options);
@@ -520,7 +524,7 @@ struct Player {
status = PLAYER_OPENING;
publish();
if (network) {
auto *primary = openNetworkInput(0, command.path, command.videoHeaders);
auto *primary = openNetworkInput(0, command.path, command.videoHeaders, command.live);
format = primary->format;
openTrack(1, format, primary, AVMEDIA_TYPE_VIDEO, -1);
if (command.audioURL.empty()) {
@@ -528,7 +532,7 @@ struct Player {
} else {
if (!tracks[1].codec)
throw std::runtime_error("The selected video stream contains no playable video");
auto *audio = openNetworkInput(1, command.audioURL, command.audioHeaders);
auto *audio = openNetworkInput(1, command.audioURL, command.audioHeaders, command.live);
openTrack(0, audio->format, audio, AVMEDIA_TYPE_AUDIO, -1);
if (!tracks[0].codec)
throw std::runtime_error("The selected audio stream contains no playable audio");