public RawH264Track(IsoBufferWrapperImpl rawH264) throws IOException {
    InnerAccessUnit current = new InnerAccessUnit();
    InnerAccessUnit previous = new InnerAccessUnit();

    NALUnitReader nalUnitReader = new AnnexBNALUnitReader(rawH264);
    AccessUnitSourceImpl accessUnitSource = new AccessUnitSourceImpl(nalUnitReader);
    streamParams = accessUnitSource;
    SliceHeaderReader sliceHeaderReader = new SliceHeaderReader(accessUnitSource);
    AccessUnit au;
    long frameNumInGop = 0;
    while ((au = accessUnitSource.nextAccessUnit()) != null) {
      // System.err.println("Start AU");
      List<IsoBufferWrapper> nals = new LinkedList<IsoBufferWrapper>();
      IsoBufferWrapper nalUnitBuffer;
      while ((nalUnitBuffer = au.nextNALUnit()) != null) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        new IsoOutputStream(baos).writeUInt32(nalUnitBuffer.size());
        nals.add(new IsoBufferWrapperImpl(baos.toByteArray()));
        nals.add(nalUnitBuffer);
        NALUnit nalUnit = NALUnit.read(nalUnitBuffer);
        if (nalUnit.type == NALUnitType.IDR_SLICE
            || nalUnit.type == NALUnitType.NON_IDR_SLICE
            || nalUnit.type == NALUnitType.AUX_SLICE
            || nalUnit.type == NALUnitType.SLICE_PART_A
            || nalUnit.type == NALUnitType.SLICE_PART_B
            || nalUnit.type == NALUnitType.SLICE_PART_C) {
          current.sliceHeaders.add(sliceHeaderReader.read(nalUnit, new CAVLCReader(nalUnitBuffer)));
        }

        if (++a % 1000 == 0) {
          System.err.println(a);
        }
      }
      samples.add(new MultiplexIsoBufferWrapperImpl(nals));
      decodedPoc(current, previous);
      if (current.poc == 0) {
        frameNumInGop = 0;
      }
      System.err.println("cts: " + (current.poc - frameNumInGop * 2));
      previous = current;
      frameNumInGop++;
      current = new InnerAccessUnit();
    }
  }