Check cancelled codec preparation cannot publish partial capabilities

This commit is contained in:
evgeny committed 2026-10-20 01:25:24 +02:00
1 parent 36e8ab228c
commit 4db89eeb32
1 file changed
+11 -2
+11 -2
View File
@@ -25,13 +25,16 @@ static int64_t start;
static bool disturbed = false;
static bool slowDecoder = false, holdAck = false, limitedDisplay = false;
static std::atomic<unsigned> decodedFrames{0};
static std::atomic<unsigned> codecOpens{0};
static std::atomic<unsigned> codecOpens{0}, decoderOpens{0};
static std::atomic<bool>* cancelEncoderProbe = nullptr;
static std::atomic<size_t> displayThread{0};
static std::atomic<bool> unsafeTimer{false};
static size_t threadId() { return std::hash<std::thread::id>{}(std::this_thread::get_id()); }
static int64_t nowUs() { return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now().time_since_epoch()).count(); }
extern "C" int __real_avcodec_open2(AVCodecContext*, const AVCodec*, AVDictionary**);
extern "C" int __wrap_avcodec_open2(AVCodecContext* context, const AVCodec* codec, AVDictionary** options) {
if (av_codec_is_decoder(codec)) ++decoderOpens;
else if (cancelEncoderProbe) *cancelEncoderProbe = false;
++codecOpens; return __real_avcodec_open2(context, codec, options);
}
extern "C" int __real_avcodec_receive_frame(AVCodecContext*, AVFrame*);
@@ -115,6 +118,11 @@ static bool queuePressure() {
int main(int argc, char** argv) {
QCoreApplication app(argc, argv); debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN);
debug_set_category_level(DEBUG_CATEGORY_CALL, DEBUG_LEVEL_DEBUG);
// Отмена после готового decoder, но посреди encoder: частичная общая матрица не должна попасть в кэш.
std::atomic<bool> interrupted{true}; cancelEncoderProbe = &interrupted;
const auto abandoned = CallVideoEngine::capabilities(&interrupted); cancelEncoderProbe = nullptr;
if (interrupted || abandoned.encode[0].profiles || abandoned.decode[0].profiles || !decoderOpens) return 1;
const unsigned decodedBeforeWarmup = decoderOpens;
// Как при старте GUI: подготовка в worker, event loop работает, повторный вызов не открывает codec.
std::atomic<bool> preparing{true}, prepared{false};
call_video_caps ready{};
@@ -124,7 +132,8 @@ int main(int argc, char** argv) {
const int64_t warming = nowUs();
while (!prepared && nowUs() - warming < 10000000) { app.processEvents(); QThread::msleep(1); }
preparing = false; warmup.join(); pulse.stop();
if (!ticks || !ready.decode[0].profiles || !ready.decode[1].profiles || !codecOpens) return 1;
if (!ticks || !ready.decode[0].profiles || !ready.decode[1].profiles || !codecOpens
|| decoderOpens != decodedBeforeWarmup) return 1;
const unsigned opened = codecOpens;
const auto cancelled = CallVideoEngine::capabilities(&preparing);
if (cancelled.encode[0].profiles || cancelled.decode[0].profiles) return 1;