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

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


    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

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

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

            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

          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

         * Recieve then send if message is data (not audio or video)
         */
        private synchronized void pullAndPush() throws IOException {
      if (state == State.PLAYING && isPullMode && !isWaitingForToken) {
        if (pendingMessage != null) {
          IRTMPEvent body = pendingMessage.getBody();
          if (!okayToSendMessage(body)) {
            return;
          }
         
          sendMessage(pendingMessage);
          releasePendingMessage();
        } else {
          while (true) {
            IMessage msg = msgIn.pullMessage();
            if (msg == null) {
              // No more packets to send
              stop();
              break;
            } else {
              if (msg instanceof RTMPMessage) {
                RTMPMessage rtmpMessage = (RTMPMessage) msg;
                IRTMPEvent body = rtmpMessage.getBody();
                if (!receiveAudio && body instanceof AudioData) {
                  // The user doesn't want to get audio packets
                  ((IStreamData) body).getData().release();
                  if (sendBlankAudio) {
                    // Send reset audio packet
                    sendBlankAudio = false;
                    body = new AudioData();
                    // We need a zero timestamp
                    if (lastMessage != null) {
                      body.setTimestamp(lastMessage.getTimestamp()-timestampOffset);
                    } else {
                      body.setTimestamp(-timestampOffset);
                    }
                    rtmpMessage.setBody(body);
                  } else {
                    continue;
                  }
                } else if (!receiveVideo && body instanceof VideoData) {
                  // The user doesn't want to get video packets
                  ((IStreamData) body).getData().release();
                  continue;
                }
               
                // Adjust timestamp when playing lists
                body.setTimestamp(body.getTimestamp() + timestampOffset);
                if (okayToSendMessage(body)) {
                  //System.err.println("ts: " + rtmpMessage.getBody().getTimestamp());
                  sendMessage(rtmpMessage);
                  ((IStreamData) body).getData().release();
                } else {
View Full Code Here

     */
    private void doPushMessage(AbstractMessage message) {
      try {
        msgOut.pushMessage(message);
        if (message instanceof RTMPMessage) {
          IRTMPEvent body = ((RTMPMessage) message).getBody();
          if (body instanceof IStreamData && ((IStreamData) body).getData() != null) {
            bytesSent += ((IStreamData) body).getData().limit();
          }
        }
       
View Full Code Here

      props.put("duration", duration);
      props.put("bytes", bytes);
      out.writeMap(props, new Serializer());
      buf.flip();

      IRTMPEvent event = new Notify(buf);
      if (lastMessage != null) {
        int timestamp = lastMessage.getTimestamp();
        event.setTimestamp(timestamp);
      } else {
        event.setTimestamp(0);
      }
      RTMPMessage msg = new RTMPMessage();
      msg.setBody(event);
      doPushMessage(msg);
    }
View Full Code Here

        sendReset();
        return;
      }
      if (message instanceof RTMPMessage) {
        RTMPMessage rtmpMessage = (RTMPMessage) message;
        IRTMPEvent body = rtmpMessage.getBody();
        if (!(body instanceof IStreamData)) {
          throw new RuntimeException("expected IStreamData but got "
              + body.getClass() + " (type " + body.getDataType() + ")");
        }

        int size = ((IStreamData) body).getData().limit();
        if (body instanceof VideoData) {
          IVideoStreamCodec videoCodec = null;
          if (msgIn instanceof IBroadcastScope) {
            IClientBroadcastStream stream = (IClientBroadcastStream) ((IBroadcastScope) msgIn)
                .getAttribute(IBroadcastScope.STREAM_ATTRIBUTE);
            if (stream != null && stream.getCodecInfo() != null) {
              videoCodec = stream.getCodecInfo().getVideoCodec();
            }
          }

          if (videoCodec == null || videoCodec.canDropFrames()) {
            if (state == State.PAUSED) {
              // The subscriber paused the video
              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.
              return;
            }

            boolean drop = !videoBucket.acquireToken(size, 0);
            if (!receiveVideo || drop) {
              // The client disabled video or the app doesn't have enough bandwidth
              // allowed for this stream.
              videoFrameDropper.dropPacket(rtmpMessage);
              return;
            }

            Long[] writeDelta = getWriteDelta();
            if (pendingVideos > 1 /*|| writeDelta[0] > writeDelta[1]*/) {
              // 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;
            }
           
            videoFrameDropper.sendPacket(rtmpMessage);
          }
        } else if (body instanceof AudioData) {
          if (!receiveAudio && sendBlankAudio) {
            // Send blank audio packet to reset player
            sendBlankAudio = false;
            body = new AudioData();
            if (lastMessage != null) {
              body.setTimestamp(lastMessage.getTimestamp());
            } else {
              body.setTimestamp(0);
            }
            rtmpMessage.setBody(body);
          } else if (state == State.PAUSED || !receiveAudio || !audioBucket.acquireToken(size, 0)) {
            return;
          }
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.