Examples of IRTMPEvent


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

            if ( !( event instanceof IRTMPEvent ) ) {
                logger.debug( "skipping non rtmp event: " + event );
                return;
            }

            IRTMPEvent rtmpEvent = (IRTMPEvent) event;

            if ( logger.isDebugEnabled() ) {
                // logger.debug("rtmp event: " + rtmpEvent.getHeader() + ", " +
                // rtmpEvent.getClass().getSimpleName());
            }

            if ( !( rtmpEvent instanceof IStreamData ) ) {
                logger.debug( "skipping non stream data" );
                return;
            }

            if ( rtmpEvent.getHeader().getSize() == 0 ) {
                logger.debug( "skipping event where size == 0" );
                return;
            }

            if ( rtmpEvent instanceof VideoData ) {
View Full Code Here

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

    if (msgOut != null) {
      msgOut.pushMessage(message);
    }
    // Notify listeners about received packet
    if (message instanceof RTMPMessage) {
      final IRTMPEvent rtmpEvent = ((RTMPMessage) message).getBody();
      if (rtmpEvent instanceof IStreamPacket) {
        for (IStreamListener listener : getStreamListeners()) {
          try {
            listener.packetReceived(this, (IStreamPacket) rtmpEvent);
          } catch (Exception e) {
View Full Code Here

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

    boolean first = (nextRTMPMessage == null);
    long delta = 0L;
    do {
      nextRTMPMessage = getNextRTMPMessage();
      if (nextRTMPMessage != null) {
        IRTMPEvent rtmpEvent = nextRTMPMessage.getBody();
        // filter all non-AV messages
        if (rtmpEvent instanceof VideoData || rtmpEvent instanceof AudioData) {
          rtmpEvent = nextRTMPMessage.getBody();
          nextTS = rtmpEvent.getTimestamp();
          if (first) {
            vodStartTS = nextTS;
            first = false;
          }
          delta = nextTS - vodStartTS - (System.currentTimeMillis() - serverStartTS);
View Full Code Here

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

    if (this.pipe == pipe) {
      if (reader == null) {
        init();
      }
      if (reader.hasMoreTags()) {
        IRTMPEvent msg = null;
        ITag tag = reader.readTag();
        if (tag != null) {
          int timestamp = tag.getTimestamp();
          switch (tag.getDataType()) {
            case Constants.TYPE_AUDIO_DATA:
              msg = new AudioData(tag.getBody());
              break;
            case Constants.TYPE_VIDEO_DATA:
              msg = new VideoData(tag.getBody());
              break;
            case Constants.TYPE_INVOKE:
              msg = new Invoke(tag.getBody());
              break;
            case Constants.TYPE_NOTIFY:
              msg = new Notify(tag.getBody());
              break;
            case Constants.TYPE_FLEX_STREAM_SEND:
              msg = new FlexStreamSend(tag.getBody());
              break;
            default:
              log.warn("Unexpected type? {}", tag.getDataType());
              msg = new Unknown(tag.getDataType(), tag.getBody());
          }
          msg.setTimestamp(timestamp);
          RTMPMessage rtmpMsg = RTMPMessage.build(msg);
          return rtmpMsg;
        } else {
          log.debug("Tag was null");
        }
View Full Code Here

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

    if (event instanceof IRTMPEvent && !closed) {
      switch (event.getType()) {
        case STREAM_CONTROL:
        case STREAM_DATA:
          // create the event
          IRTMPEvent rtmpEvent;
          try {
            rtmpEvent = (IRTMPEvent) event;
          } catch (ClassCastException e) {
            log.error("Class cast exception in event dispatch", e);
            return;
          }
          int eventTime = -1;
          if (log.isTraceEnabled()) {
            // If this is first packet save its timestamp; expect it is
            // absolute? no matter: it's never used!
            if (firstPacketTime == -1) {
              firstPacketTime = rtmpEvent.getTimestamp();
              log.trace(String.format("CBS=@%08x: rtmpEvent=%s creation=%s firstPacketTime=%d", System.identityHashCode(this), rtmpEvent.getClass().getSimpleName(),
                  creationTime, firstPacketTime));
            } else {
              log.trace(String.format("CBS=@%08x: rtmpEvent=%s creation=%s firstPacketTime=%d timestamp=%d", System.identityHashCode(this), rtmpEvent.getClass()
                  .getSimpleName(), creationTime, firstPacketTime, rtmpEvent.getTimestamp()));
            }

          }
          //get the buffer only once per call
          IoBuffer buf = null;
          if (rtmpEvent instanceof IStreamData && (buf = ((IStreamData<?>) rtmpEvent).getData()) != null) {
            bytesReceived += buf.limit();
          }
          // get stream codec
          IStreamCodecInfo codecInfo = getCodecInfo();
          StreamCodecInfo info = null;
          if (codecInfo instanceof StreamCodecInfo) {
            info = (StreamCodecInfo) codecInfo;
          }
          //log.trace("Stream codec info: {}", info);
          if (rtmpEvent instanceof AudioData) {
            IAudioStreamCodec audioStreamCodec = null;
            if (checkAudioCodec) {
              // dont try to read codec info from 0 length audio packets
              if (buf.limit() > 0) {
                  audioStreamCodec = AudioCodecFactory.getAudioCodec(buf);
                  if (info != null) {
                    info.setAudioCodec(audioStreamCodec);
                  }
                  checkAudioCodec = false;
              }
            } else if (codecInfo != null) {
              audioStreamCodec = codecInfo.getAudioCodec();
            }
            if (audioStreamCodec != null) {
              audioStreamCodec.addData(buf.asReadOnlyBuffer());
            }
            if (info != null) {
              info.setHasAudio(true);
            }
            eventTime = rtmpEvent.getTimestamp();
            log.trace("Audio: {}", eventTime);
          } else if (rtmpEvent instanceof VideoData) {
            IVideoStreamCodec videoStreamCodec = null;
            if (checkVideoCodec) {
              videoStreamCodec = VideoCodecFactory.getVideoCodec(buf);
              if (info != null) {
                info.setVideoCodec(videoStreamCodec);
              }
              checkVideoCodec = false;
            } else if (codecInfo != null) {
              videoStreamCodec = codecInfo.getVideoCodec();
            }
            if (videoStreamCodec != null) {
              videoStreamCodec.addData(buf.asReadOnlyBuffer());
            }
            if (info != null) {
              info.setHasVideo(true);
            }
            eventTime = rtmpEvent.getTimestamp();
            log.trace("Video: {}", eventTime);
          } else if (rtmpEvent instanceof Invoke) {
            eventTime = rtmpEvent.getTimestamp();
            //do we want to return from here?
            //event / stream listeners will not be notified of invokes
            return;
          } else if (rtmpEvent instanceof Notify) {
            // store the metadata
            Notify notifyEvent = (Notify) rtmpEvent;
            if (metaData == null && notifyEvent.getHeader().getDataType() == Notify.TYPE_STREAM_METADATA) {
              try {
                metaData = notifyEvent.duplicate();
              } catch (Exception e) {
                log.warn("Metadata could not be duplicated for this stream", e);
              }
            }
            eventTime = rtmpEvent.getTimestamp();
          }
          // update last event time
          if (eventTime > latestTimeStamp) {
            latestTimeStamp = eventTime;
          }
View Full Code Here

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

  public IoBuffer encodePacket(Packet packet) {
    IoBuffer out = null;
    final Header header = packet.getHeader();
    final int channelId = header.getChannelId();
    log.trace("Channel id: {}", channelId);
    final IRTMPEvent message = packet.getMessage();
    if (message instanceof ChunkSize) {
      ChunkSize chunkSizeMsg = (ChunkSize) message;
      ((RTMPConnection) Red5.getConnectionLocal()).getState().setWriteChunkSize(chunkSizeMsg.getSize());
    }
    // normally the message is expected not to be dropped
    if (!dropMessage(channelId, message)) {
      IoBuffer data = encodeMessage(header, message);
      if (data != null) {
        RTMP rtmp = ((RTMPConnection) Red5.getConnectionLocal()).getState();
        if (data.position() != 0) {
          data.flip();
        } else {
          data.rewind();
        }
        int dataLen = data.limit();
        header.setSize(dataLen);
        // get last header
        Header lastHeader = rtmp.getLastWriteHeader(channelId);
        // maximum header size with extended timestamp (Chunk message header type 0 with 11 byte)
        int headerSize = 18;
        // set last write header
        rtmp.setLastWriteHeader(channelId, header);
        // set last write packet
        rtmp.setLastWritePacket(channelId, packet);
        int chunkSize = rtmp.getWriteChunkSize();
        // maximum chunk header size with extended timestamp
        int chunkHeaderSize = 7;
        int numChunks = (int) Math.ceil(dataLen / (float) chunkSize);
        int bufSize = dataLen + headerSize + (numChunks > 0 ? (numChunks - 1) * chunkHeaderSize : 0);
        out = IoBuffer.allocate(bufSize, false);
        // encode the header
        encodeHeader(header, lastHeader, out);
        if (numChunks == 1) {
          // we can do it with a single copy
          BufferUtils.put(out, data, dataLen);
        } else {
          int extendedTimestamp = header.getExtendedTimestamp();
          for (int i = 0; i < numChunks - 1; i++) {
            BufferUtils.put(out, data, chunkSize);
            dataLen -= chunkSize;
            RTMPUtils.encodeHeaderByte(out, HEADER_CONTINUE, channelId);
            if (extendedTimestamp != 0) {
              out.putInt(extendedTimestamp);
            }
          }
          BufferUtils.put(out, data, dataLen);
        }
        data.free();
        out.flip();
        data = null;
      }
    }
    message.release();
    return out;
  }
View Full Code Here

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

    msgOut.pushMessage(message);
    recordPipe.pushMessage(message);

    // Notify listeners about received packet
    if (message instanceof RTMPMessage) {
      final IRTMPEvent rtmpEvent = ((RTMPMessage) message).getBody();
      if (rtmpEvent instanceof IStreamPacket) {
        for (IStreamListener listener : getStreamListeners()) {
          try {
            listener.packetReceived(this, (IStreamPacket) rtmpEvent);
          } catch (Exception e) {
View Full Code Here

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

    if (nextRTMPMessage == null) {
      onItemEnd();
      return;
    }

    IRTMPEvent rtmpEvent = null;

    if (first) {
      rtmpEvent = nextRTMPMessage.getBody();
      // FIXME hack the first Metadata Tag from FLVReader
      // the FLVReader will issue a metadata tag of ts 0
      // even if it is seeked to somewhere in the middle
      // which will cause the stream to wait too long.
      // Is this an FLVReader's bug?
      if (!(rtmpEvent instanceof VideoData) && !(rtmpEvent instanceof AudioData) && rtmpEvent.getTimestamp() == 0) {
        rtmpEvent.release();
        nextRTMPMessage = getNextRTMPMessage();
        if (nextRTMPMessage == null) {
          onItemEnd();
          return;
        }
      }
    }

    rtmpEvent = nextRTMPMessage.getBody();
    if (rtmpEvent instanceof VideoData) {
      nextVideoTS = rtmpEvent.getTimestamp();
      nextTS = nextVideoTS;
    } else if (rtmpEvent instanceof AudioData) {
      nextAudioTS = rtmpEvent.getTimestamp();
      nextTS = nextAudioTS;
    } else {
      nextDataTS = rtmpEvent.getTimestamp();
      nextTS = nextDataTS;
    }
    if (first) {
      vodStartTS = nextTS;
    }
View Full Code Here

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

  /** {@inheritDoc} */
  public void messageReceived(RTMPConnection conn, Packet packet) throws Exception {
    log.trace("Connection: {}", conn.getSessionId());
    if (conn != null) {
      IRTMPEvent message = null;
      try {
        message = packet.getMessage();
        final Header header = packet.getHeader();
        final int streamId = header.getStreamId();
        final Channel channel = conn.getChannel(header.getChannelId());
        final IClientStream stream = conn.getStreamById(streamId);
        log.trace("Message received - stream id: {} channel: {} header: {}", streamId, channel.getId(), header);
        // set stream id on the connection
        conn.setStreamId(streamId);
        // increase number of received messages
        conn.messageReceived();
        // set the source of the message
        message.setSource(conn);
        // process based on data type
        final byte headerDataType = header.getDataType();
        log.trace("Header / message data type: {}", headerDataType);
        switch (headerDataType) {
        case TYPE_AGGREGATE:
          log.debug("Aggregate type data - header timer: {} size: {}", header.getTimer(), header.getSize());
        case TYPE_AUDIO_DATA:
        case TYPE_VIDEO_DATA:
          // mark the event as from a live source
          // log.trace("Marking message as originating from a Live source");
          message.setSourceType(Constants.SOURCE_TYPE_LIVE);
          // NOTE: If we respond to "publish" with "NetStream.Publish.BadName",
          // the client sends a few stream packets before stopping. We need to ignore them
          if (stream != null) {
            ((IEventDispatcher) stream).dispatchEvent(message);
          }
          break;
        case TYPE_FLEX_SHARED_OBJECT:
        case TYPE_SHARED_OBJECT:
          onSharedObject(conn, channel, header, (SharedObjectMessage) message);
          break;
        case TYPE_INVOKE:
        case TYPE_FLEX_MESSAGE:
          onCommand(conn, channel, header, (Invoke) message);
          IPendingServiceCall call = ((Invoke) message).getCall();
          if (message.getHeader().getStreamId() != 0 && call.getServiceName() == null && StreamAction.PUBLISH.equals(call.getServiceMethodName())) {
            if (stream != null) {
              // Only dispatch if stream really was created
              ((IEventDispatcher) stream).dispatchEvent(message);
            }
          }
          break;
        case TYPE_NOTIFY: // like an invoke, but does not return
                  // anything and has a invoke / transaction
                  // id of 0
        case TYPE_FLEX_STREAM_SEND:
          if (((Notify) message).getData() != null && stream != null) {
            // Stream metadata
            ((IEventDispatcher) stream).dispatchEvent(message);
          } else {
            onCommand(conn, channel, header, (Notify) message);
          }
          break;
        case TYPE_PING:
          onPing(conn, channel, header, (Ping) message);
          break;
        case TYPE_BYTES_READ:
          onStreamBytesRead(conn, channel, header, (BytesRead) message);
          break;
        case TYPE_CHUNK_SIZE:
          onChunkSize(conn, channel, header, (ChunkSize) message);
          break;
        case Constants.TYPE_CLIENT_BANDWIDTH: // onBWDone / peer bw
          log.debug("Client bandwidth: {}", message);
          onClientBandwidth(conn, channel, (ClientBW) message);
          break;
        case Constants.TYPE_SERVER_BANDWIDTH: // window ack size
          log.debug("Server bandwidth: {}", message);
          onServerBandwidth(conn, channel, (ServerBW) message);
          break;
        default:
          log.debug("Unknown type: {}", header.getDataType());
        }
        if (message instanceof Unknown) {
          log.info("Message type unknown: {}", message);
        }
      } catch (Throwable t) {
        log.error("Exception", t);
      }
      // XXX this may be causing 'missing' data if previous methods are
      // not making copies before buffering etc..
      if (message != null) {
        message.release();
      }
    }
  }
View Full Code Here

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

   * @throws IOException if message could not be written
   */
  @SuppressWarnings("rawtypes")
  public void pushMessage(IPipe pipe, IMessage message) throws IOException {
    if (message instanceof RTMPMessage) {
      final IRTMPEvent msg = ((RTMPMessage) message).getBody();
      // get the type
      byte dataType = msg.getDataType();
      // get the timestamp
      int timestamp = msg.getTimestamp();
      log.debug("Data type: {} timestamp: {}", dataType, timestamp);
      // if we're dealing with a FlexStreamSend IRTMPEvent, this avoids relative timestamp calculations
      if (!(msg instanceof FlexStreamSend)) {
        log.trace("Not FlexStreamSend type");
        lastTimestamp = timestamp;
      }
      // ensure that our first video frame written is a key frame
      if (msg instanceof VideoData) {
        if (!gotVideoKeyFrame) {
          VideoData video = (VideoData) msg;
          if (video.getFrameType() == FrameType.KEYFRAME) {
            log.debug("Got our first keyframe");
            gotVideoKeyFrame = true;
          } else {
            // skip this frame bail out
            log.debug("Skipping video data since keyframe has not been written yet");
            return;
          }
        }
      }
      // initialize a writer
      if (writer == null) {
        init();
      }
      // if writes are delayed, queue the data and sort it by time
      if (!delayWrite) {
        write(timestamp, msg);
      } else {
        QueuedData queued = null;
        if (msg instanceof IStreamData) {
          log.debug("Stream data, body saved. Data type: {} class type: {}", dataType, msg.getClass().getName());
          try {
            queued = new QueuedData(timestamp, dataType, ((IStreamData) msg).duplicate());
          } catch (ClassNotFoundException e) {
            log.warn("Exception queueing stream data", e);
          }
        } else {
          //XXX what type of message are we saving that has no body data??
          log.debug("Non-stream data, body not saved. Data type: {} class type: {}", dataType, msg.getClass().getName());
          queued = new QueuedData(timestamp, dataType);
        }
        writeLock.lock();
        try {
          //add to the queue
          queue.add(queued);
        } finally {
          writeLock.unlock();
        }
        int queueSize = 0;
        readLock.lock();
        try {
          queueSize = queue.size();
        } finally {
          readLock.unlock();
        }
        if (msg instanceof VideoData) {
          writeQueuedDataSlice(createTimestampLimitedSlice(msg.getTimestamp()));
        } else if (queueThreshold >= 0 && queueSize >= queueThreshold) {
          writeQueuedDataSlice(createFixedLengthSlice(queueThreshold / (100 / percentage)));
        }
      }
    } else if (message instanceof ResetMessage) {
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.