Package org.red5.server.net.rtmp.event

Examples of org.red5.server.net.rtmp.event.IRTMPEvent


      if (!chunkSizeSent) {
        sendChunkSize();
      }
      // cast to rtmp message
      RTMPMessage rtmpMsg = (RTMPMessage) message;
      IRTMPEvent msg = rtmpMsg.getBody();
      // get timestamp
      int eventTime = msg.getTimestamp();
      log.debug("Message timestamp: {}", eventTime);
      if (eventTime < 0) {
        log.debug("Message has negative timestamp: {}", eventTime);
        return;
      }
      // get the data type
      byte dataType = msg.getDataType();
      log.trace("Data type: {}", dataType);
      //create a new header for the consumer
      final Header header = new Header();
      header.setTimerBase(eventTime);
      //data buffer
View Full Code Here


   * Process the queued items.
   */
  private void processQueue() {
    CachedEvent cachedEvent;
    try {
      IRTMPEvent event = null;
      RTMPMessage message = null;
      // get first event in the queue
      cachedEvent = queue.poll();
      if (cachedEvent != null) {
        // get the data type
        final byte dataType = cachedEvent.getDataType();
        // get the data
        IoBuffer buffer = cachedEvent.getData();
        // get the current size of the buffer / data
        int bufferLimit = buffer.limit();
        if (bufferLimit > 0) {
          // create new RTMP message and push to the consumer
          switch (dataType) {
            case Constants.TYPE_AGGREGATE:
              event = new Aggregate(buffer);
              event.setTimestamp(cachedEvent.getTimestamp());
              message = RTMPMessage.build(event);
              break;
            case Constants.TYPE_AUDIO_DATA:
              event = new AudioData(buffer);
              event.setTimestamp(cachedEvent.getTimestamp());
              message = RTMPMessage.build(event);
              break;
            case Constants.TYPE_VIDEO_DATA:
              event = new VideoData(buffer);
              event.setTimestamp(cachedEvent.getTimestamp());
              message = RTMPMessage.build(event);
              break;
            default:
              event = new Notify(buffer);
              event.setTimestamp(cachedEvent.getTimestamp());
              message = RTMPMessage.build(event);
              break;
          }
          // push it down to the recorder
          recordingConsumer.pushMessage(null, message);
        } else if (bufferLimit == 0 && dataType == Constants.TYPE_AUDIO_DATA) {
          log.debug("Stream data size was 0, sending empty audio message");
          // allow for 0 byte audio packets
          event = new AudioData(IoBuffer.allocate(0));
          event.setTimestamp(cachedEvent.getTimestamp());
          message = RTMPMessage.build(event);
          // push it down to the recorder
          recordingConsumer.pushMessage(null, message);
        } else {
          log.debug("Stream data size was 0, recording pipe will not be notified");
View Full Code Here

    this.state = state;
  }

  /** {@inheritDoc} */
  public boolean canSendPacket(RTMPMessage message, long pending) {
    IRTMPEvent packet = message.getBody();
    boolean result = true;
    // We currently only drop video packets.
    if (packet instanceof VideoData) {
      VideoData video = (VideoData) packet;
      FrameType type = video.getFrameType();
View Full Code Here

    return result;
  }

  /** {@inheritDoc} */
  public void dropPacket(RTMPMessage message) {
    IRTMPEvent packet = message.getBody();
    // Only check video packets.
    if (packet instanceof VideoData) {
      VideoData video = (VideoData) packet;
      FrameType type = video.getFrameType();
      switch (state) {
View Full Code Here

      }
    }
    msg = msgIn.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 = msgIn.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;
  }
View Full Code Here

    log.trace("doPushMessage: {}", message.getMessageType());
    if (msgOut != null) {
      try {
        msgOut.pushMessage(message);
        if (message instanceof RTMPMessage) {
          IRTMPEvent body = ((RTMPMessage) message).getBody();
          //update the last message sent's timestamp
          lastMessageTs = body.getTimestamp();
          IoBuffer streamData = null;
          if (body instanceof IStreamData && (streamData = ((IStreamData<?>) body).getData()) != null) {
            bytesSent.addAndGet(streamData.limit());
          }
        }
View Full Code Here

  /**
   * Send RTMP message
   * @param message        RTMP message
   */
  private void sendMessage(RTMPMessage messageIn) {
    IRTMPEvent event;
    IoBuffer dataReference;
    switch (messageIn.getBody().getDataType()) {
      case Constants.TYPE_AGGREGATE:
        dataReference = ((Aggregate) messageIn.getBody()).getData();
        event = new Aggregate(dataReference);
        event.setTimestamp(messageIn.getBody().getTimestamp());
        break;
      case Constants.TYPE_AUDIO_DATA:
        dataReference = ((AudioData) messageIn.getBody()).getData();
        event = new AudioData(dataReference);
        event.setTimestamp(messageIn.getBody().getTimestamp());
        break;
      case Constants.TYPE_VIDEO_DATA:
        dataReference = ((VideoData) messageIn.getBody()).getData();
        event = new VideoData(dataReference);
        event.setTimestamp(messageIn.getBody().getTimestamp());
        break;
      default:
        dataReference = ((Notify) messageIn.getBody()).getData();
        event = new Notify(dataReference);
        event.setTimestamp(messageIn.getBody().getTimestamp());
        break;
    }
    RTMPMessage messageOut = RTMPMessage.build(event);
    //get the current timestamp from the message
    int ts = messageOut.getBody().getTimestamp();
View Full Code Here

      props.put("isFastPlay", false);
    }
    out.writeMap(props);
    buf.flip();

    IRTMPEvent event = new Notify(buf);
    if (lastMessageTs > 0) {
      event.setTimestamp(lastMessageTs);
    } else {
      event.setTimestamp(0);
    }
    RTMPMessage msg = RTMPMessage.build(event);
    doPushMessage(msg);
  }
View Full Code Here

  /** {@inheritDoc} */
  public void pushMessage(IPipe pipe, IMessage message) throws IOException {
    if (message instanceof RTMPMessage) {
      RTMPMessage rtmpMessage = (RTMPMessage) message;
      IRTMPEvent body = rtmpMessage.getBody();
      if (body instanceof IStreamData) {
        // the subscriber paused
        if (subscriberStream.getState() == StreamState.PAUSED) {
          log.debug("Dropping packet because we are paused");
          videoFrameDropper.dropPacket(rtmpMessage);
          return;
        }
        if (body instanceof VideoData) {
          if (msgIn instanceof IBroadcastScope) {
            IBroadcastStream stream = (IBroadcastStream) ((IBroadcastScope) msgIn).getClientBroadcastStream();
            if (stream != null && stream.getCodecInfo() != null) {
              IVideoStreamCodec videoCodec = stream.getCodecInfo().getVideoCodec();
              //dont try to drop frames if video codec is null - related to SN-77
              if (videoCodec != null && videoCodec.canDropFrames()) {
                if (!receiveVideo) {
                  // The client disabled video or the app doesn't have enough bandwidth
                  // allowed for this stream.
                  log.debug("Dropping packet because we cant receive video or token acquire failed");
                  videoFrameDropper.dropPacket(rtmpMessage);
                  return;
                }
                // Only check for frame dropping if the codec supports it
                long pendingVideos = pendingVideoMessages();
                if (!videoFrameDropper.canSendPacket(rtmpMessage, pendingVideos)) {
                  // Drop frame as it depends on other frames that were dropped before.
                  log.debug("Dropping packet because frame dropper says we cant send it");
                  return;
                }
                // increment the number of times we had pending video frames sequentially
                if (pendingVideos > 1) {
                  numSequentialPendingVideoFrames++;
                } else {
                  // reset number of sequential pending frames if 1 or 0 are pending.
                  numSequentialPendingVideoFrames = 0;
                }
                if (pendingVideos > maxPendingVideoFramesThreshold || numSequentialPendingVideoFrames > maxSequentialPendingVideoFrames) {
                  log.debug("Pending: {} Threshold: {} Sequential: {}", new Object[] { pendingVideos, maxPendingVideoFramesThreshold,
                      numSequentialPendingVideoFrames });
                  // We drop because the client has insufficient bandwidth.
                  long now = System.currentTimeMillis();
                  if (bufferCheckInterval > 0 && now >= nextCheckBufferUnderrun) {
                    // Notify client about frame dropping (keyframe)
                    sendInsufficientBandwidthStatus(currentItem);
                    nextCheckBufferUnderrun = now + bufferCheckInterval;
                  }
                  videoFrameDropper.dropPacket(rtmpMessage);
                  return;
                }
              }
            }
          }
        } else if (body instanceof AudioData) {
          if (!receiveAudio && sendBlankAudio) {
            // Send blank audio packet to reset player
            sendBlankAudio = false;
            body = new AudioData();
            if (lastMessageTs > 0) {
              body.setTimestamp(lastMessageTs);
            } else {
              body.setTimestamp(0);
            }
            rtmpMessage = RTMPMessage.build(body);
          } else if (!receiveAudio) {
            return;
          }
        }
        sendMessage(rtmpMessage);
      } else {
        throw new RuntimeException(String.format("Expected IStreamData but got %s (type %s)", body.getClass(), body.getDataType()));
      }
    } else if (message instanceof ResetMessage) {
      sendReset();
    } else {
      msgOut.pushMessage(message);
View Full Code Here

  /**
   * Releases pending message body, nullifies pending message object
   */
  private void releasePendingMessage() {
    if (pendingMessage != null) {
      IRTMPEvent body = pendingMessage.getBody();
      if (body instanceof IStreamData && ((IStreamData<?>) body).getData() != null) {
        ((IStreamData<?>) body).getData().free();
      }
      pendingMessage = null;
    }
View Full Code Here

TOP

Related Classes of org.red5.server.net.rtmp.event.IRTMPEvent

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.