Package org.red5.server.net.rtmp.message

Examples of org.red5.server.net.rtmp.message.Header


        buffer.clear();
        buffer.put( video );
        buffer.flip();

        VideoData videoData = new VideoData( buffer );
        videoData.setTimestamp( (int) ts );

        kt++;

//        if ( kt < 10 ) {
//            logger.debug( "+++ " + videoData );
View Full Code Here


   * @param event           Event data
   * @param streamId        Stream id
   */
  private void write(IRTMPEvent event, int streamId) {
    log.trace("write channel: {} stream id: {}", id, streamId);
    final Header header = new Header();
    final Packet packet = new Packet(header, event);
    header.setChannelId(id);
    int ts = event.getTimestamp();
    if (ts != 0) {
      header.setTimer(event.getTimestamp());     
    } else {
      // TODO may need to add generated timestamps at some point
//      int timestamp = connection.getTimer();
//      header.setTimerBase(timestamp);
//      event.setTimestamp(timestamp);
    }
    header.setStreamId(streamId);
    header.setDataType(event.getDataType());
    // should use RTMPConnection specific method..
    //log.trace("Connection type for write: {}", connection.getClass().getName());
    connection.write(packet);
  }
View Full Code Here

   * @param packet      RTMP packet
   * @return            Encoded data
   */
  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
View Full Code Here

        // TODO ensure the data contains all the bytes to support the specified size
        int timestamp = IOUtils.readExtendedMediumInt(data);
        /*timestamp = ntohap((GETIBPOINTER(buffer) + 4)); 0x12345678 == 34 56 78 12*/
        int streamId = IOUtils.readUnsignedMediumInt(data);
        log.debug("Data timestamp: {} stream id: {}", timestamp, streamId);
        Header partHeader = new Header();
        partHeader.setChannelId(header.getChannelId());
        partHeader.setDataType(subType);
        partHeader.setSize(size);
        // use the stream id from the aggregate's header
        partHeader.setStreamId(header.getStreamId());
        partHeader.setTimer(timestamp);
        // timer delta == time stamp - timer base
        // the back pointer may be used to verify the size of the individual part
        // it will be equal to the data size + header size
        int backPointer = 0;
        switch (subType) {
View Full Code Here

    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) {
View Full Code Here

        return;
      }
      try {
        final Packet packet = (Packet) in;
        final Object message = packet.getMessage();
        final Header source = packet.getHeader();

        log.debug("{}", source);
        log.debug("{}", message);
      } catch (RuntimeException e) {
        log.error("Exception", e);
View Full Code Here

      if (!messageSent) {
        // Send blank audio packet to notify client about new position
        log.debug("Sending blank audio packet");
        AudioData audio = new AudioData();
        audio.setTimestamp(seekPos);
        audio.setHeader(new Header());
        audio.getHeader().setTimer(seekPos);
        RTMPMessage audioMessage = RTMPMessage.build(audio);
        lastMessageTs = seekPos;
        doPushMessage(audioMessage);
        audioMessage.getBody().release();
View Full Code Here

      }
      // 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
      IoBuffer buf = null;
      switch (dataType) {
        case Constants.TYPE_AGGREGATE:
          log.trace("Aggregate data");
          data.write(msg);
          break;
        case Constants.TYPE_AUDIO_DATA:
          log.trace("Audio data");
          buf = ((AudioData) msg).getData();
          if (buf != null) {
            AudioData audioData = new AudioData(buf.asReadOnlyBuffer());
            audioData.setHeader(header);
            audioData.setTimestamp(header.getTimer());
            log.trace("Source type: {}", ((AudioData) msg).getSourceType());
            audioData.setSourceType(((AudioData) msg).getSourceType());
            audio.write(audioData);
          } else {
            log.warn("Audio data was not found");
          }
          break;
        case Constants.TYPE_VIDEO_DATA:
          log.trace("Video data");
          buf = ((VideoData) msg).getData();
          if (buf != null) {
            VideoData videoData = new VideoData(buf.asReadOnlyBuffer());
            videoData.setHeader(header);
            videoData.setTimestamp(header.getTimer());
            log.trace("Source type: {}", ((VideoData) msg).getSourceType());
            videoData.setSourceType(((VideoData) msg).getSourceType());
            video.write(videoData);
          } else {
            log.warn("Video data was not found");
          }
          break;
        case Constants.TYPE_PING:
          log.trace("Ping");
          Ping ping = new Ping((Ping) msg);
          ping.setHeader(header);
          conn.ping(ping);
          break;
        case Constants.TYPE_STREAM_METADATA:
          log.trace("Meta data");
          Notify notify = new Notify(((Notify) msg).getData().asReadOnlyBuffer());
          notify.setHeader(header);
          notify.setTimestamp(header.getTimer());
          data.write(notify);
          break;
        case Constants.TYPE_FLEX_STREAM_SEND:
          log.trace("Flex stream send");
          // TODO: okay to send this also to AMF0 clients?
          FlexStreamSend send = new FlexStreamSend(((Notify) msg).getData().asReadOnlyBuffer());
          send.setHeader(header);
          send.setTimestamp(header.getTimer());
          data.write(send);
          break;
        case Constants.TYPE_BYTES_READ:
          log.trace("Bytes read");
          BytesRead bytesRead = new BytesRead(((BytesRead) msg).getBytesRead());
          bytesRead.setHeader(header);
          bytesRead.setTimestamp(header.getTimer());
          conn.getChannel((byte) 2).write(bytesRead);
          break;
        default:
          log.trace("Default: {}", dataType);
          data.write(msg);
View Full Code Here

    // trigger generation of BytesRead messages
    updateBytesRead();
  }

  private String getMessageType(Packet packet) {
    final Header header = packet.getHeader();
    final byte headerDataType = header.getDataType();
    return  messageTypeToName(headerDataType);
  }
View Full Code Here

    // create and send a rejected status
    Status status = new Status(StatusCodes.NC_CONNECT_REJECTED, Status.ERROR, message);
    PendingCall call = new PendingCall(null, "onStatus", new Object[] { status });
    Invoke event = new Invoke();
    event.setCall(call);
    Header header = new Header();
    Packet packet = new Packet(header, event);
    header.setDataType(event.getDataType());
    // create dummy connection if local is empty
    RTMPConnection conn = (RTMPConnection) Red5.getConnectionLocal();
    if (conn == null) {
      try {
        conn = ((RTMPConnManager) manager).createConnectionInstance(RTMPTConnection.class);
View Full Code Here

TOP

Related Classes of org.red5.server.net.rtmp.message.Header

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.