Fix OCIO LUT async processor black screen and freeze

- Pass through input texture when the LUT processor is not ready yet,
  preventing black frames while the processor is being generated.
- Serialize processor generation with a single in-flight task to avoid
  concurrent OCIO lock contention that could freeze the UI.
- Invalidate cached frames after the async processor is set so the viewer
  refreshes automatically without requiring the playhead to be moved.
- Add OAK_DISABLE_HWACCEL environment variable to force software decoding.
- Add FFmpegDecoderHW regression test for H.264 4:2:2 10-bit decoding.
This commit is contained in:
2026-07-13 10:19:30 +08:00
parent 68c0477715
commit 800859b0ef
6 changed files with 125 additions and 10 deletions
+9 -1
View File
@@ -425,13 +425,17 @@ TexturePtr FFmpegDecoder::RetrieveVideoInternal(const RetrieveVideoParams &p)
AVFramePtr ptr = PreProcessFrame(f, p);
f=std::move(ptr);
if (!f) {
// Error occurred while software scaling
qWarning() << "PreProcessFrame failed";
return nullptr;
}
// Finally, perform any GPU processing required
TexturePtr texture = ProcessFrameIntoTexture(f, p, original);
if (!texture) {
qWarning() << "ProcessFrameIntoTexture returned null";
}
return texture;
}
@@ -1476,6 +1480,10 @@ bool FFmpegDecoder::Instance::Open(const char *filename, int stream_index)
AVHWDeviceType FFmpegDecoder::Instance::ChooseHardwareDevice()
{
if (qEnvironmentVariableIsSet("OAK_DISABLE_HWACCEL")) {
return AV_HWDEVICE_TYPE_NONE;
}
#ifdef Q_OS_LINUX
// Prefer NVIDIA's NVDEC where available, then VAAPI/VDPAU.
for (AVHWDeviceType type : { AV_HWDEVICE_TYPE_CUDA, AV_HWDEVICE_TYPE_VAAPI,