From 4ac4b61272a9f0e07b525a0f64ec5d73ec3349b4 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 29 Nov 2021 05:29:40 +0800 Subject: [PATCH] framereader: fix crash after fallback to cpu decoding (#23055) old-commit-hash: a449b856cac746647ad994eb511600929d529498 --- selfdrive/ui/replay/framereader.cc | 9 ++++++--- selfdrive/ui/replay/framereader.h | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/selfdrive/ui/replay/framereader.cc b/selfdrive/ui/replay/framereader.cc index 29172a58b2..76e9ea7d66 100644 --- a/selfdrive/ui/replay/framereader.cc +++ b/selfdrive/ui/replay/framereader.cc @@ -27,8 +27,9 @@ enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat * if (*p == *hw_pix_fmt) return *p; } printf("Please run replay with the --no-cuda flag!\n"); - assert(0); - return AV_PIX_FMT_NONE; + // fallback to YUV420p + *hw_pix_fmt = AV_PIX_FMT_NONE; + return AV_PIX_FMT_YUV420P; } } // namespace @@ -94,7 +95,7 @@ bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic * width = (decoder_ctx->width + 3) & ~3; height = decoder_ctx->height; - if (!no_cuda) { + if (has_cuda_device && !no_cuda) { if (!initHardwareDecoder(AV_HWDEVICE_TYPE_CUDA)) { printf("No CUDA capable device was found. fallback to CPU decoding.\n"); } else { @@ -136,6 +137,8 @@ bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) { int ret = av_hwdevice_ctx_create(&hw_device_ctx, hw_device_type, nullptr, nullptr, 0); if (ret < 0) { + hw_pix_fmt = AV_PIX_FMT_NONE; + has_cuda_device = false; printf("Failed to create specified HW device %d.\n", ret); return false; } diff --git a/selfdrive/ui/replay/framereader.h b/selfdrive/ui/replay/framereader.h index 7bb63d72f7..f6895c7be6 100644 --- a/selfdrive/ui/replay/framereader.h +++ b/selfdrive/ui/replay/framereader.h @@ -50,4 +50,5 @@ private: AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; AVBufferRef *hw_device_ctx = nullptr; std::vector nv12toyuv_buffer; + inline static std::atomic has_cuda_device = true; };