示例#1
0
  protected void createCencBoxes(CencEncryptedTrack track, SampleTableBox stbl, int[] chunkSizes) {

    SampleAuxiliaryInformationSizesBox saiz = new SampleAuxiliaryInformationSizesBox();

    saiz.setAuxInfoType("cenc");
    saiz.setFlags(1);
    List<CencSampleAuxiliaryDataFormat> sampleEncryptionEntries =
        track.getSampleEncryptionEntries();
    if (track.hasSubSampleEncryption()) {
      short[] sizes = new short[sampleEncryptionEntries.size()];
      for (int i = 0; i < sizes.length; i++) {
        sizes[i] = (short) sampleEncryptionEntries.get(i).getSize();
      }
      saiz.setSampleInfoSizes(sizes);
    } else {
      saiz.setDefaultSampleInfoSize(8); // 8 bytes iv
      saiz.setSampleCount(track.getSamples().size());
    }

    SampleAuxiliaryInformationOffsetsBox saio = new SampleAuxiliaryInformationOffsetsBox();
    SampleEncryptionBox senc = new SampleEncryptionBox();
    senc.setSubSampleEncryption(track.hasSubSampleEncryption());
    senc.setEntries(sampleEncryptionEntries);

    long offset = senc.getOffsetToFirstIV();
    int index = 0;
    long[] offsets = new long[chunkSizes.length];

    for (int i = 0; i < chunkSizes.length; i++) {
      offsets[i] = offset;
      for (int j = 0; j < chunkSizes[i]; j++) {
        offset += sampleEncryptionEntries.get(index++).getSize();
      }
    }
    saio.setOffsets(offsets);

    stbl.addBox(saiz);
    stbl.addBox(saio);
    stbl.addBox(senc);
    sampleAuxiliaryInformationOffsetsBoxes.add(saio);
  }
示例#2
0
  /** {@inheritDoc} */
  public Container build(Movie movie) {
    if (fragmenter == null) {
      fragmenter = new TimeBasedFragmenter(2);
    }
    LOG.fine("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));
    }
    Box 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());
    }

    InterleaveChunkMdat mdat = new InterleaveChunkMdat(movie, chunks, contentSize);
    isoFile.addBox(mdat);

    /*
    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
     */
    long dataOffset = mdat.getDataOffset();
    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)
      Object b = saio;
      do {
        Object current = b;
        b = ((Box) b).getParent();

        for (Box box : ((Container) b).getBoxes()) {
          if (box == current) {
            break;
          }
          offset += box.getSize();
        }

      } while (b instanceof Box);

      long[] saioOffsets = saio.getOffsets();
      for (int i = 0; i < saioOffsets.length; i++) {
        saioOffsets[i] = saioOffsets[i] + offset;
      }
      saio.setOffsets(saioOffsets);
    }

    return isoFile;
  }