code: public void bufferPacket(OggPacket packet, long granulePosition) {
          if(closed) {
              throw new IllegalStateException("Can't buffer packets on a closed stream!");
          }
          if(! doneFirstPacket) {
              packet.setIsBOS();
              doneFirstPacket = true;
          }
  
          int size = packet.getData().length;
          boolean emptyPacket = (size==0);
  
          // Add to pages in turn
          OggPage page = getCurrentPage(false);
          int pos = 0;
          while( pos < size || emptyPacket) {
              pos = page.addPacket(packet, pos);
              if(pos < size) {
                  page = getCurrentPage(true);
                  page.setIsContinuation();
              }
              page.setGranulePosition(granulePosition);
              emptyPacket = false;
          }
          currentGranulePosition = granulePosition;
          packet.setParent(page);
      }
docs: Buffers the given packet up ready for
  writing to the stream, but doesn't
  write it to disk yet. The granule position
  is updated on the page.
  If writing the packet requires a new page,
  then the updated granule position only
  applies to the new page