docs: public ParsableBox parseBox(ReadableByteChannel byteChannel, String parentType) throws IOException {
          header.get().rewind().limit(8);
  
          int bytesRead = 0;
          int b;
          while ((b = byteChannel.read(header.get())) + bytesRead < 8) {
              if (b < 0) {
                  throw new EOFException();
              } else {
                  bytesRead += b;
              }
          }
          header.get().rewind();
  
          long size = IsoTypeReader.readUInt32(header.get());
          // do plausibility check
          if (size < 8 && size > 1) {
              LOG.error("Plausibility check failed: size < 8 (size = {}). Stop parsing!", size);
              return null;
          }
  
  
          String type = IsoTypeReader.read4cc(header.get());
          //System.err.println(type);
          byte[] usertype = null;
          long contentSize;
  
          if (size == 1) {
              header.get().limit(16);
              byteChannel.read(header.get());
              header.get().position(8);
              size = IsoTypeReader.readUInt64(header.get());
              contentSize = size - 16;
          } else if (size == 0) {
              throw new RuntimeException("box size of zero means 'till end of file. That is not yet supported");
          } else {
              contentSize = size - 8;
          }
          if (UserBox.TYPE.equals(type)) {
              header.get().limit(header.get().limit() + 16);
              byteChannel.read(header.get());
              usertype = new byte[16];
              for (int i = header.get().position() - 16; i < header.get().position(); i++) {
                  usertype[i - (header.get().position() - 16)] = header.get().get(i);
              }
              contentSize -= 16;
          }
          ParsableBox parsableBox = null;
          if( skippedTypes != null && skippedTypes.contains(type) ) {
              LOG.trace("Skipping box {} {} {}", type, usertype, parentType);
              parsableBox = new SkipBox(type, usertype, parentType);
          }
          else {
              LOG.trace("Creating box {} {} {}", type, usertype, parentType);
              parsableBox = createBox(type, usertype, parentType);
          }
          //LOG.finest("Parsing " + box.getType());
          // System.out.println("parsing " + Mp4Arrays.toString(box.getType()) + " " + box.getClass().getName() + " size=" + size);
          header.get().rewind();
  
          parsableBox.parse(byteChannel, header.get(), contentSize, this);
          return parsableBox;
      }