      avio_context_free(&avio_ctx_);
    }
  }
  
  bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic<bool> *abort) {
    std::string content = read(url, abort);
    if (content.empty()) return false;
  
    input_ctx = avformat_alloc_context();
    if (!input_ctx) return false;
  
    struct buffer_data bd = {
 
</s> remove   s->frame = new FrameReader(true);
 </s> add   s->frame = new FrameReader(); </s> remove     .data = (uint8_t *)content.data(),
 </s> add     .data = (const uint8_t*)data, </s> remove     printf("Error loading video - %s - %s\n", err_str, url.c_str());
 </s> add     printf("Error loading video - %s\n", err_str); </s> remove   int ret = avformat_open_input(&input_ctx, url.c_str(), NULL, NULL);
 </s> add   int ret = avformat_open_input(&input_ctx, nullptr, nullptr, nullptr);
bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic<bool> *abort, bool local_cache, int chunk_size, int retries) {
  FileReader f(local_cache, chunk_size, retries);
  std::string data = f.read(url, abort);
  if (data.empty()) return false;

  return load((std::byte *)data.data(), data.size(), no_cuda, abort);
}
      avio_context_free(&avio_ctx_);
    }
  }
  
bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic<bool> *abort, bool local_cache, int chunk_size, int retries) {
  FileReader f(local_cache, chunk_size, retries);
  std::string data = f.read(url, abort);
  if (data.empty()) return false;

  return load((std::byte *)data.data(), data.size(), no_cuda, abort);
}
bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic<bool> *abort, bool local_cache, int chunk_size, int retries) {
  FileReader f(local_cache, chunk_size, retries);
  std::string data = f.read(url, abort);
  if (data.empty()) return false;

  return load((std::byte *)data.data(), data.size(), no_cuda, abort);
}
bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic<bool> *abort, bool local_cache, int chunk_size, int retries) {
  FileReader f(local_cache, chunk_size, retries);
  std::string data = f.read(url, abort);
  if (data.empty()) return false;

  return load((std::byte *)data.data(), data.size(), no_cuda, abort);
}
  
    input_ctx = avformat_alloc_context();
    if (!input_ctx) return false;
  
    struct buffer_data bd = {
keep keep keep keep replace replace replace keep keep keep keep keep
 logreader: support reading from corrupt log (#23050)

* catch exception outside loop

* print decompress error

* add test case for corrupt log

* fix decompressbz2 stuck if log is corrupt

* recovered from corrupt data

* add output

* ass space

* std::endl

* override load(), load from buffer

* override FrameReader::load to load from the buffer

* replace NULL with nullptr

* fix test case for corrupt log

* Trigger Build

* check bzerror too

Co-authored-by: Willem Melching <willem.melching@gmail.com> 
selfdrive/ui/replay/framereader.cc