code: private final IMessage playVOD(boolean withReset, long itemLength) throws IOException {
          IMessage msg = null;
          // change state
          subscriberStream.setState(StreamState.PLAYING);
          if (withReset) {
              releasePendingMessage();
          }
          sendVODInitCM(currentItem.get());
          // Don't use pullAndPush to detect IOExceptions prior to sending NetStream.Play.Start
          int start = (int) currentItem.get().getStart();
          if (start > 0) {
              streamOffset = sendVODSeekCM(start);
              // We seeked to the nearest keyframe so use real timestamp now
              if (streamOffset == -1) {
                  streamOffset = start;
              }
          }
          IMessageInput in = msgInReference.get();
          msg = in.pullMessage();
          if (msg instanceof RTMPMessage) {
              // Only send first video frame
              IRTMPEvent body = ((RTMPMessage) msg).getBody();
              if (itemLength == 0) {
                  while (body != null && !(body instanceof VideoData)) {
                      msg = in.pullMessage();
                      if (msg != null && msg instanceof RTMPMessage) {
                          body = ((RTMPMessage) msg).getBody();
                      } else {
                          break;
                      }
                  }
              }
              if (body != null) {
                  // Adjust timestamp when playing lists
                  body.setTimestamp(body.getTimestamp() + timestampOffset);
              }
          }
          return msg;
      }
docs: Performs the processes needed for VOD / pre-recorded streams.
  
  @param withReset
  whether or not to perform reset on the stream
  @param itemLength
  length of the item to be played
  @return message for the consumer
  @throws IOException