inline bool serializeItem()

in torchvision/csrc/io/decoder/util.cpp [86:142]


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