From Hot Frog, 7 Months ago, written in C++.
Embed
  1. template<typename T>
  2. static bool LoadVisionFile(const char* fileName, int cameraId, int64_t minTime, int64_t maxTime, vector<T>& items)
  3. {
  4.         auto f = fopen(fileName, "rb");
  5.         if (!f)
  6.         {
  7.                 fprintf(stderr, "Unable to open source file \"%s\".", fileName);
  8.                 return false;
  9.         }
  10.  
  11.         bool result = true;
  12.         size_t bufferSize = 1024 * 100;
  13.         uint8_t* buffer = new uint8_t[bufferSize];
  14.  
  15.         for (;;)
  16.         {
  17.                 uint32_t size;
  18.                 if (1 != fread(&size, sizeof(size), 1, f))
  19.                         break;
  20.  
  21.                 size = SwapEndianess(size);
  22.                 if (size > (20 * 1024 * 1024))
  23.                 {
  24.                         fprintf(stderr, "Invalid size value in source file.");
  25.                         result = false;
  26.                         break;
  27.                 }
  28.  
  29.                 if (bufferSize < size)
  30.                 {
  31.                         delete buffer;
  32.                         bufferSize = size;
  33.                         buffer = new uint8_t[bufferSize];
  34.                 }
  35.  
  36.                 if (1 != fread(buffer, size, 1, f))
  37.                 {
  38.                         fprintf(stderr, "Unable to read item from source file.");
  39.                         result = false;
  40.                         break;
  41.                 }
  42.  
  43.                 try
  44.                 {
  45.                         TeslaStructReader rd(buffer, size);
  46.  
  47.                         if (rd.GetByte(1) != cameraId)
  48.                                 continue;
  49.  
  50.                         auto time = rd.GetTimestamp(0);
  51.                         if (time < minTime)
  52.                                 continue;
  53.  
  54.                         if (time > maxTime)
  55.                                 break;
  56.  
  57.                         minTime = time;
  58.  
  59.                         items.emplace_back();
  60.                         LoadVisionItem(rd, items.back());
  61.                 }
  62.                 catch (const exception& ex)
  63.                 {
  64.                         fprintf(stderr, "Error while reading source item: %s.", ex.what());
  65.                         result = false;
  66.                         break;
  67.                 }
  68.         }
  69.  
  70.         fclose(f);
  71.         delete buffer;
  72.  
  73.         return result;
  74. }