Examples of IRTMPEvent


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

  /**
   * 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

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

      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

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

  /** {@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

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

  /**
   * 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

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

   *
   * @param message the message to check
   * @return <code>true</code> if the message should be sent, <code>false</code> otherwise (and the message is discarded)
   */
  protected boolean checkSendMessageEnabled(RTMPMessage message) {
    IRTMPEvent body = message.getBody();
    if (!receiveAudio && body instanceof AudioData) {
      // The user doesn't want to get audio packets
      ((IStreamData<?>) body).getData().free();
      if (sendBlankAudio) {
        // Send reset audio packet
        sendBlankAudio = false;
        body = new AudioData();
        // We need a zero timestamp
        if (lastMessageTs >= 0) {
          body.setTimestamp(lastMessageTs - timestampOffset);
        } else {
          body.setTimestamp(-timestampOffset);
        }
        message = RTMPMessage.build(body);
      } else {
        return false;
      }
View Full Code Here

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

    if (buf.position() > header.getSize()) {
      log.warn("Packet size expanded from {} to {} ({})", new Object[] { (header.getSize()), buf.position(), header });
    }
    buf.flip();
    try {
      final IRTMPEvent message = decodeMessage(conn, packet.getHeader(), buf);
      message.setHeader(packet.getHeader());
      // Unfortunately flash will, especially when resetting a video stream with a new key frame, sometime
      // send an earlier time stamp.  To avoid dropping it, we just give it the minimal increment since the
      // last message.  But to avoid relative time stamps being mis-computed, we don't reset the header we stored.
      final Header lastReadHeader = rtmp.getLastReadPacketHeader(channelId);
      if (lastReadHeader != null && (message instanceof AudioData || message instanceof VideoData)
          && RTMPUtils.compareTimestamps(lastReadHeader.getTimer(), packet.getHeader().getTimer()) >= 0) {
        log.trace("Non-monotonically increasing timestamps; type: {}; adjusting to {}; ts: {}; last: {}", new Object[] { header.getDataType(),
            lastReadHeader.getTimer() + 1, header.getTimer(), lastReadHeader.getTimer() });
        message.setTimestamp(lastReadHeader.getTimer() + 1);
      } else {
        message.setTimestamp(header.getTimer());
      }
      rtmp.setLastReadPacketHeader(channelId, packet.getHeader());
      packet.setMessage(message);
      if (message instanceof ChunkSize) {
        ChunkSize chunkSizeMsg = (ChunkSize) message;
View Full Code Here

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

   * @param header RTMP header
   * @param in Input IoBuffer
   * @return RTMP event
   */
  public IRTMPEvent decodeMessage(RTMPConnection conn, Header header, IoBuffer in) {
    IRTMPEvent message;
    byte dataType = header.getDataType();
    switch (dataType) {
      case TYPE_INVOKE:
        message = decodeInvoke(conn.getEncoding(), in);
        break;
      case TYPE_NOTIFY:
        if (header.getStreamId() == 0) {
          message = decodeNotify(conn.getEncoding(), in, header);
        } else {
          message = decodeStreamMetadata(in);
        }
        break;
      case TYPE_AUDIO_DATA:
        message = decodeAudioData(in);
        message.setSourceType(Constants.SOURCE_TYPE_LIVE);
        break;
      case TYPE_VIDEO_DATA:
        message = decodeVideoData(in);
        message.setSourceType(Constants.SOURCE_TYPE_LIVE);
        break;
      case TYPE_AGGREGATE:
        message = decodeAggregate(in);
        break;
      case TYPE_FLEX_SHARED_OBJECT: // represents an SO in an AMF3 container
View Full Code Here

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

   * @return  RTMP event
   */
  public IRTMPEvent dequeue() {
    if (reader.hasMoreTags()) {
      ITag tag = reader.readTag();
      IRTMPEvent msg;
      switch (tag.getDataType()) {
        case TYPE_AUDIO_DATA:
          msg = new AudioData(tag.getBody());
          break;
        case TYPE_VIDEO_DATA:
          msg = new VideoData(tag.getBody());
          break;
        case TYPE_INVOKE:
          msg = new Invoke(tag.getBody());
          break;
        case TYPE_NOTIFY:
          msg = new Notify(tag.getBody());
          break;
        default:
          log.warn("Unexpected type? {}", tag.getDataType());
          msg = new Unknown(tag.getDataType(), tag.getBody());
          break;
      }
      msg.setTimestamp(tag.getTimestamp());
      //msg.setSealed(true);
      return msg;
    }
    return null;
  }
View Full Code Here

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

            streamOffset = (int) item.getStart();
          }
        }
        msg = msgIn.pullMessage();
        if (msg instanceof RTMPMessage) {
          IRTMPEvent body = ((RTMPMessage) msg).getBody();
          if (item.getLength() == 0) {
            // Only send first video frame
            body = ((RTMPMessage) msg).getBody();
            while (body != null && !(body instanceof VideoData)) {
              msg = msgIn.pullMessage();
              if (msg == null)
                break;
             
              if (!(msg instanceof RTMPMessage))
                continue;
             
              body = ((RTMPMessage) msg).getBody();
            }
          }
         
          if (body != null) {
            // Adjust timestamp when playing lists
            body.setTimestamp(body.getTimestamp() + timestampOffset);
          }
        }
      }
      if (sendNotifications) {
        if (withReset) {
View Full Code Here

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

          msg = null;
        }
        while (msg != null) {
          if (msg instanceof RTMPMessage) {
            RTMPMessage rtmpMessage = (RTMPMessage) msg;
            IRTMPEvent body = rtmpMessage.getBody();
            if (body instanceof VideoData
                && ((VideoData) body).getFrameType() == FrameType.KEYFRAME) {
              body.setTimestamp(seekPos);
              doPushMessage(rtmpMessage);
              rtmpMessage.getBody().release();
              messageSent = true;
              lastMessage = body;
              break;
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. 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.