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

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


  }

  /** {@inheritDoc} */
    public void messageReceived(RTMPConnection conn, ProtocolState state, Object in) throws Exception {

    IRTMPEvent message = null;
    try {

      final Packet packet = (Packet) in;
      message = packet.getMessage();
      final Header header = packet.getHeader();
      final Channel channel = conn.getChannel(header.getChannelId());
      final IClientStream stream = conn.getStreamById(header
          .getStreamId());

      if (log.isDebugEnabled()) {
        log.debug("Message recieved");
        log.debug("Stream Id: " + header);
        log.debug("Channel: " + channel);
      }

      // Thread local performance ? Should we benchmark
      Red5.setConnectionLocal(conn);

      // XXX: HACK HACK HACK to support stream ids
      BaseRTMPHandler.setStreamId(header.getStreamId());

      // Increase number of received messages
      conn.messageReceived();

      //if (message instanceof IRTMPEvent) {
      message.setSource(conn);
      //}

      switch (header.getDataType()) {
        case TYPE_CHUNK_SIZE:
          onChunkSize(conn, channel, header, (ChunkSize) message);
          break;

        case TYPE_INVOKE:
        case TYPE_FLEX_MESSAGE:
          onInvoke(conn, channel, header, (Invoke) message, (RTMP) state);
          if(message.getHeader().getStreamId()!=0
              && ((Invoke)message).getCall().getServiceName()==null
              && ACTION_PUBLISH.equals(((Invoke)message).getCall().getServiceMethodName())) {
            if (stream != null) {
              // Only dispatch if stream really was created
              ((IEventDispatcher) stream).dispatchEvent(message);
            }
          }
          break;

        case TYPE_NOTIFY: // just like invoke, but does not return
          if (((Notify) message).getData() != null && stream != null) {
            // Stream metadata
            ((IEventDispatcher) stream).dispatchEvent(message);
          } else {
            onInvoke(conn, channel, header, (Notify) message, (RTMP) state);
          }
          break;
         
        case TYPE_FLEX_STREAM_SEND:
          if (stream != null) {
            ((IEventDispatcher) stream).dispatchEvent(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_AUDIO_DATA:
        case TYPE_VIDEO_DATA:
          // log.info("in packet: "+source.getSize()+"
          // ts:"+source.getTimer());

          // 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;
        default:
          log.debug("Unknown type: {}", header.getDataType());
      }
      if (message instanceof Unknown) {
        log.info("{}", message);
      }
    } catch (RuntimeException e) {
      // TODO Auto-generated catch block
      log.error("Exception", e);
    }
    if (message != null) {
      message.release();
    }
  }
View Full Code Here


    StreamCodecInfo info = null;
    if (codecInfo instanceof StreamCodecInfo) {
      info = (StreamCodecInfo) codecInfo;
    }

    IRTMPEvent rtmpEvent;
    try {
      rtmpEvent = (IRTMPEvent) event;
    } catch (ClassCastException e) {
      log.error("Class cast exception in event dispatch", e);
      return;
    }
    int eventTime = -1;
    // If this is first packet save it's timestamp
    if (firstPacketTime == -1) {
      firstPacketTime = rtmpEvent.getTimestamp();
    }
    if (rtmpEvent instanceof AudioData) {
      if (info != null) {
        info.setHasAudio(true);
      }
      if (rtmpEvent.getHeader().isTimerRelative()) {
        audioTime += rtmpEvent.getTimestamp();
      } else {
        audioTime = rtmpEvent.getTimestamp();
      }
      eventTime = audioTime;
    } else if (rtmpEvent instanceof VideoData) {
      IVideoStreamCodec videoStreamCodec = null;
      if (videoCodecFactory != null && checkVideoCodec) {
        videoStreamCodec = videoCodecFactory
            .getVideoCodec(((VideoData) rtmpEvent).getData());
        if (codecInfo instanceof StreamCodecInfo) {
          ((StreamCodecInfo) codecInfo)
              .setVideoCodec(videoStreamCodec);
        }
        checkVideoCodec = false;
      } else if (codecInfo != null) {
        videoStreamCodec = codecInfo.getVideoCodec();
      }

      if (videoStreamCodec != null) {
        videoStreamCodec.addData(((VideoData) rtmpEvent).getData());
      }

      if (info != null) {
        info.setHasVideo(true);
      }
      if (rtmpEvent.getHeader().isTimerRelative()) {
        videoTime += rtmpEvent.getTimestamp();
      } else {
        videoTime = rtmpEvent.getTimestamp();
      }
      eventTime = videoTime;
    } else if (rtmpEvent instanceof Invoke) {
      if (rtmpEvent.getHeader().isTimerRelative()) {
        dataTime += rtmpEvent.getTimestamp();
      } else {
        dataTime = rtmpEvent.getTimestamp();
      }
      return;
    } else if (rtmpEvent instanceof Notify) {
      if (rtmpEvent.getHeader().isTimerRelative()) {
        dataTime += rtmpEvent.getTimestamp();
      } else {
        dataTime = rtmpEvent.getTimestamp();
      }
      eventTime = dataTime;
    }

    if (rtmpEvent instanceof IStreamData
View Full Code Here

     */
    public ByteBuffer encodePacket(RTMP rtmp, Packet packet) {

    final Header header = packet.getHeader();
    final int channelId = header.getChannelId();
    final IRTMPEvent message = packet.getMessage();
    ByteBuffer data;

    if (message instanceof ChunkSize) {
      ChunkSize chunkSizeMsg = (ChunkSize) message;
      rtmp.setWriteChunkSize(chunkSizeMsg.getSize());
    }

    try {
      data = encodeMessage(rtmp, header, message);
    } finally {
      message.release();
    }

    if (data.position() != 0) {
      data.flip();
    } else {
View Full Code Here

    this.mrtmpManager = mrtmpManager;
  }

  @Override
  public void messageReceived(RTMPConnection conn, ProtocolState state, Object in) throws Exception {
    IRTMPEvent message = null;
    final Packet packet = (Packet) in;
    message = packet.getMessage();
    final Header header = packet.getHeader();
    final Channel channel = conn.getChannel(header.getChannelId());

    // Increase number of received messages
    conn.messageReceived();

    if (header.getDataType() == TYPE_BYTES_READ) {
      // TODO need to sync the bytes read on edge and origin
      onStreamBytesRead(conn, channel, header,
          (BytesRead) message);
    }

    if (header.getDataType() == TYPE_INVOKE) {
      final IServiceCall call = ((Invoke) message).getCall();
      final String action = call.getServiceMethodName();
      if (call.getServiceName() == null &&
          !conn.isConnected() &&
          action.equals(ACTION_CONNECT)) {
        handleConnect(conn, channel, header, (Invoke) message, (RTMP) state);
        return;
      }
    }

    switch (header.getDataType()) {
      case TYPE_CHUNK_SIZE:
      case TYPE_INVOKE:
      case TYPE_FLEX_MESSAGE:
      case TYPE_NOTIFY:
      case TYPE_AUDIO_DATA:
      case TYPE_VIDEO_DATA:
      case TYPE_FLEX_SHARED_OBJECT:
      case TYPE_SHARED_OBJECT:
      case TYPE_BYTES_READ:
        forwardPacket(conn, packet);
        break;
      case TYPE_PING:
        onPing(conn, channel, header, (Ping) message);
        break;

      default:
        if (log.isDebugEnabled()) {
          log.debug("Unknown type: "+header.getDataType());
        }
    }
    if (message instanceof Unknown) {
      log.info(message.toString());
    }
    if (message != null) {
      message.release();
    }   
  }
View Full Code Here

      // Do not unsubscribe as this kills VOD seek while in buffer
      // this.pipe.unsubscribe(this);
      return null;
    }
    ITag tag = reader.readTag();
    IRTMPEvent msg = 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;
      default:
        log.warn("Unexpected type? " + tag.getDataType());
        msg = new Unknown(tag.getDataType(), tag.getBody());
        break;
    }
    msg.setTimestamp(timestamp);
    RTMPMessage rtmpMsg = new RTMPMessage();
    rtmpMsg.setBody(msg);
    return rtmpMsg;
  }
View Full Code Here

    }

    buf.flip();

    try {
      final IRTMPEvent message = decodeMessage(rtmp, packet.getHeader(), buf);
      packet.setMessage(message);

      if (message instanceof ChunkSize) {
        ChunkSize chunkSizeMsg = (ChunkSize) message;
        rtmp.setReadChunkSize(chunkSizeMsg.getSize());
View Full Code Here

     * @param header                  RTMP header
     * @param in                      Input byte buffer
     * @return                        RTMP event
     */
    public IRTMPEvent decodeMessage(RTMP rtmp, Header header, ByteBuffer in) {
    IRTMPEvent message;
    if (header.getTimer() == 0xffffff) {
      // Skip first four bytes
      int unknown = in.getInt();
      if (log.isDebugEnabled()) {
        log.debug("Unknown 4 bytes: " + unknown);
      }
    }

    switch (header.getDataType()) {
      case TYPE_CHUNK_SIZE:
        message = decodeChunkSize(in);
        break;
      case TYPE_INVOKE:
        message = decodeInvoke(in, rtmp);
        break;
      case TYPE_NOTIFY:
        if (header.getStreamId() == 0)
          message = decodeNotify(in, header, rtmp);
        else
          message = decodeStreamMetadata(in);
        break;
      case TYPE_PING:
        message = decodePing(in);
        break;
      case TYPE_BYTES_READ:
        message = decodeBytesRead(in);
        break;
      case TYPE_AUDIO_DATA:
        message = decodeAudioData(in);
        break;
      case TYPE_VIDEO_DATA:
        message = decodeVideoData(in);
        break;
      case TYPE_FLEX_SHARED_OBJECT:
        message = decodeFlexSharedObject(in, rtmp);
        break;
      case TYPE_SHARED_OBJECT:
        message = decodeSharedObject(in, rtmp);
        break;
      case TYPE_SERVER_BANDWIDTH:
        message = decodeServerBW(in);
        break;
      case TYPE_CLIENT_BANDWIDTH:
        message = decodeClientBW(in);
        break;
      case TYPE_FLEX_MESSAGE:
        message = decodeFlexMessage(in, rtmp);
        break;
      case TYPE_FLEX_STREAM_SEND:
        message = decodeFlexStreamSend(in);
        break;
      default:
        log.warn("Unknown object type: " + header.getDataType());
        message = decodeUnknown(header.getDataType(), in);
        break;
    }
    message.setHeader(header);
    message.setTimestamp(header.getTimer());
    return message;
  }
View Full Code Here

    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

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

      IRTMPEvent rtmpEvent = nextRTMPMessage.getBody();
      // filter all non-AV messages
      if (!(rtmpEvent instanceof VideoData)
          && !(rtmpEvent instanceof AudioData)) {
        continue;
      }
      rtmpEvent = nextRTMPMessage.getBody();
      nextTS = rtmpEvent.getTimestamp();
      if (first) {
        vodStartTS = nextTS;
        first = false;
      }
View Full Code Here

  public void dispatchEvent(IEvent event) {
    //      log.trace("dispatchEvent(event:{})", event);
    //      System.out.println("dispatchEvent(event:)" + event);
    if (event instanceof IRTMPEvent) {
      IRTMPEvent rtmpEvent = (IRTMPEvent) event;
      if (livePipe != null) {
        RTMPMessage msg = RTMPMessage.build(rtmpEvent);
        //RTMPMessage msg = new RTMPMessage();
        //msg.setBody(rtmpEvent);
       
        if (creationTime == null)
          creationTime = (long)rtmpEvent.getTimestamp();
         
        try {
//          System.out.println("dispatchEvent(event:)" + event);
          livePipe.pushMessage(msg);
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.