inline bool deserializeItem()

in torchvision/csrc/io/decoder/util.cpp [165:227]


inline bool deserializeItem(
    const uint8_t* src,
    size_t len,
    size_t& pos,
    AVSubtitleRect& dest) {
  auto rectDeserialize =
      [](const uint8_t* y, size_t l, size_t& p, AVSubtitleRect& x) -> bool {
    switch (x.type) {
      case SUBTITLE_BITMAP:
        for (int i = 0; i < x.nb_colors; ++i) {
          if (!deserializeItem(y, l, p, x.linesize[i])) {
            return false;
          }
          if (p + x.linesize[i] > l) {
            return false;
          }
          x.data[i] = (uint8_t*)av_malloc(x.linesize[i]);
          memcpy(x.data[i], y + p, x.linesize[i]);
          p += x.linesize[i];
        }
        return true;
      case SUBTITLE_TEXT: {
        size_t s = 0;
        if (!deserializeItem(y, l, p, s)) {
          return false;
        }
        if (p + s > l) {
          return false;
        }
        x.text = (char*)av_malloc(s + 1);
        memcpy(x.text, y + p, s);
        x.text[s] = 0;
        p += s;
        return true;
      }
      case SUBTITLE_ASS: {
        size_t s = 0;
        if (!deserializeItem(y, l, p, s)) {
          return false;
        }
        if (p + s > l) {
          return false;
        }
        x.ass = (char*)av_malloc(s + 1);
        memcpy(x.ass, y + p, s);
        x.ass[s] = 0;
        p += s;
        return true;
      }
      default:
        return true;
    }
  };

  return deserializeItem(src, len, pos, dest.x) &&
      deserializeItem(src, len, pos, dest.y) &&
      deserializeItem(src, len, pos, dest.w) &&
      deserializeItem(src, len, pos, dest.h) &&
      deserializeItem(src, len, pos, dest.nb_colors) &&
      deserializeItem(src, len, pos, dest.type) &&
      deserializeItem(src, len, pos, dest.flags) &&
      rectDeserialize(src, len, pos, dest);
}