docs: public Container build(Movie movie) {
          if (fragmenter == null) {
              fragmenter = new DefaultFragmenterImpl(2);
          }
          LOG.debug("Creating movie {}", movie);
          for (Track track : movie.getTracks()) {
              // getting the samples may be a time consuming activity
              List<Sample> samples = track.getSamples();
              putSamples(track, samples);
              long[] sizes = new long[samples.size()];
              for (int i = 0; i < sizes.length; i++) {
                  Sample b = samples.get(i);
                  sizes[i] = b.getSize();
              }
              track2SampleSizes.put(track, sizes);
  
          }
  
          BasicContainer isoFile = new BasicContainer();
  
          isoFile.addBox(createFileTypeBox(movie));
  
          Map<Track, int[]> chunks = new HashMap<Track, int[]>();
          for (Track track : movie.getTracks()) {
              chunks.put(track, getChunkSizes(track));
          }
          ParsableBox moov = createMovieBox(movie, chunks);
          isoFile.addBox(moov);
          List<SampleSizeBox> stszs = Path.getPaths(moov, "trak/mdia/minf/stbl/stsz");
  
          long contentSize = 0;
          for (SampleSizeBox stsz : stszs) {
              contentSize += sum(stsz.getSampleSizes());
  
          }
          LOG.debug("About to create mdat");
          InterleaveChunkMdat mdat = new InterleaveChunkMdat(movie, chunks, contentSize);
  
          long dataOffset = 16;
          for (Box lightBox : isoFile.getBoxes()) {
              dataOffset += lightBox.getSize();
          }
          isoFile.addBox(mdat);
          LOG.debug("mdat crated");
  
          /*
          dataOffset is where the first sample starts. In this special mdat the samples always start
          at offset 16 so that we can use the same offset for large boxes and small boxes
           */
  
          for (StaticChunkOffsetBox chunkOffsetBox : chunkOffsetBoxes.values()) {
              long[] offsets = chunkOffsetBox.getChunkOffsets();
              for (int i = 0; i < offsets.length; i++) {
                  offsets[i] += dataOffset;
              }
          }
          for (SampleAuxiliaryInformationOffsetsBox saio : sampleAuxiliaryInformationOffsetsBoxes) {
              long offset = saio.getSize(); // the calculation is systematically wrong by 4, I don't want to debug why. Just a quick correction --san 14.May.13
              offset += 4 + 4 + 4 + 4 + 4 + 24;
              // size of all header we were missing otherwise (moov, trak, mdia, minf, stbl)
              offset = Offsets.find(isoFile, saio, offset);
  
              long[] saioOffsets = saio.getOffsets();
              for (int i = 0; i < saioOffsets.length; i++) {
                  saioOffsets[i] = saioOffsets[i] + offset;
  
              }
              saio.setOffsets(saioOffsets);
          }
  
  
          return isoFile;
      }