public TextTrackImpl() {
    super("subtitles");
    sampleDescriptionBox = new SampleDescriptionBox();
    TextSampleEntry tx3g = new TextSampleEntry("tx3g");
    tx3g.setDataReferenceIndex(1);
    tx3g.setStyleRecord(new TextSampleEntry.StyleRecord());
    tx3g.setBoxRecord(new TextSampleEntry.BoxRecord());
    sampleDescriptionBox.addBox(tx3g);

    FontTableBox ftab = new FontTableBox();
    ftab.setEntries(Collections.singletonList(new FontTableBox.FontRecord(1, "Serif")));

    tx3g.addBox(ftab);

    trackMetaData.setCreationTime(new Date());
    trackMetaData.setModificationTime(new Date());
    trackMetaData.setTimescale(1000); // Text tracks use millieseconds
  }
  private void parse(InputStream fin) throws IOException {
    inputStream = fin;
    bitRateAndFrameSizeTable = new int[19][2][3][2];
    stts = new LinkedList<TimeToSampleBox.Entry>();
    initBitRateAndFrameSizeTable();
    if (!readVariables()) {
      throw new IOException();
    }

    sampleDescriptionBox = new SampleDescriptionBox();
    AudioSampleEntry audioSampleEntry = new AudioSampleEntry("ac-3");
    audioSampleEntry.setChannelCount(2); // According to  ETSI TS 102 366 Annex F
    audioSampleEntry.setSampleRate(samplerate);
    audioSampleEntry.setDataReferenceIndex(1);
    audioSampleEntry.setSampleSize(16);

    AC3SpecificBox ac3 = new AC3SpecificBox();
    ac3.setAcmod(acmod);
    ac3.setBitRateCode(frmsizecod >> 1);
    ac3.setBsid(bsid);
    ac3.setBsmod(bsmod);
    ac3.setFscod(fscod);
    ac3.setLfeon(lfeon);
    ac3.setReserved(0);

    audioSampleEntry.addBox(ac3);
    sampleDescriptionBox.addBox(audioSampleEntry);

    trackMetaData.setCreationTime(new Date());
    trackMetaData.setModificationTime(new Date());
    trackMetaData.setLanguage(lang);
    trackMetaData.setTimescale(samplerate); // Audio tracks always use samplerate as timescale

    samples = new LinkedList<ByteBuffer>();
    if (!readSamples()) {
      throw new IOException();
    }
  }