@Override
  protected List<IrStreamItem> process(int beg, int length) {
    List<IrStreamItem> items = new ArrayList<>(16);
    ParameterData data = new ParameterData(CHUNKSIZE);
    for (int i = beg; i < beg + length - 1; i += 2) {
      int noBitsLimit = params.getNoBitsLimit(noPayload);
      int mark = analyzer.getCleanedTime(i);
      int space = analyzer.getCleanedTime(i + 1);
      Burst burst = new Burst(mark, space);
      if (burst.equals(zero)) {
        data.update(0);
      } else if (burst.equals(one)) {
        data.update(1);
      } else if (burst.equals(two)) {
        data.update(2);
      } else if (burst.equals(three)) {
        data.update(3);
      } else {
        if (!data.isEmpty()) {
          saveParameter(data, items, params.getBitDirection());
          data = new ParameterData();
        }

        items.add(newFlash(mark));
        if (i == beg + length - 2 && params.isUseExtents())
          items.add(newExtent(analyzer.getTotalDuration(beg, length)));
        else items.add(newGap(space));
      }

      if (data.getNoBits() >= noBitsLimit) {
        saveParameter(data, items, params.getBitDirection());
        data = new ParameterData(CHUNKSIZE);
      }
    }
    if (!data.isEmpty()) saveParameter(data, items, params.getBitDirection());

    return items;
  }