Package org.red5.server.api.service

Examples of org.red5.server.api.service.IServiceCall


  @SuppressWarnings({ "unchecked" })
  @Override
  protected void onCommand(RTMPConnection conn, Channel channel, Header source, ICommand command) {
    log.debug("onCommand {}", command);
    // get the call
    final IServiceCall call = command.getCall();
    log.trace("call: {}", call);
    // get the method name
    final String action = call.getServiceMethodName();
    // If it's a callback for server remote call then pass it over to callbacks handler and return
    if ("_result".equals(action) || "_error".equals(action)) {
      handlePendingCallResult(conn, (Invoke) command);
      return;
    }
    boolean disconnectOnReturn = false;
    // "connected" here means that there is a scope associated with the connection (post-"connect")
    boolean connected = conn.isConnected();
    if (connected) {
      // If this is not a service call then handle connection...
      if (call.getServiceName() == null) {
        StreamAction streamAction = StreamAction.getEnum(action);
        if (log.isDebugEnabled()) {
          log.debug("Stream action: {}", streamAction.toString());
        }
        // TODO change this to an application scope parameter and / or change to the listener pattern
        if (dispatchStreamActions) {
          // pass the stream action event to the handler
          try {
            conn.getScope().getHandler().handleEvent(new StreamActionEvent(streamAction));
          } catch (Exception ex) {
            log.warn("Exception passing stream action: {} to the scope handler", streamAction, ex);
          }
        }
        //if the "stream" action is not predefined a custom type will be returned
        switch (streamAction) {
          case DISCONNECT:
            conn.close();
            break;
          case CREATE_STREAM:
          case INIT_STREAM:
          case CLOSE_STREAM:
          case RELEASE_STREAM:
          case DELETE_STREAM:
          case PUBLISH:
          case PLAY:
          case PLAY2:
          case SEEK:
          case PAUSE:
          case PAUSE_RAW:
          case RECEIVE_VIDEO:
          case RECEIVE_AUDIO:
            IStreamService streamService = (IStreamService) ScopeUtils.getScopeService(conn.getScope(), IStreamService.class, StreamService.class);
            Status status = null;
            try {
              log.debug("Invoking {} from {} with service: {}", new Object[] { call, conn, streamService });
              if (invokeCall(conn, call, streamService)) {
                log.debug("Stream service invoke {} success", action);
              } else {
                status = getStatus(NS_INVALID_ARGUMENT).asStatus();
                status.setDescription(String.format("Failed to %s (stream id: %d)", action, source.getStreamId()));
              }
            } catch (Throwable err) {
              log.error("Error while invoking {} on stream service. {}", action, err);
              status = getStatus(NS_FAILED).asStatus();
              status.setDescription(String.format("Error while invoking %s (stream id: %d)", action, source.getStreamId()));
              status.setDetails(err.getMessage());
            }
            if (status != null) {
              channel.sendStatus(status);
            } else {
              log.debug("Status for {} was null", action);
            }
            break;
          default:
            log.debug("Defaulting to invoke for: {}", action);
            invokeCall(conn, call);
        }
      } else {
        // handle service calls
        invokeCall(conn, call);
      }
    } else {
      if (StreamAction.CONNECT.equals(action)) {
        // Handle connection
        log.debug("connect");
        // Get parameters passed from client to
        // NetConnection#connection
        final Map<String, Object> params = command.getConnectionParams();
        // Get hostname
        String host = getHostname((String) params.get("tcUrl"));
        // app name as path, but without query string if there is one
        String path = (String) params.get("app");
        if (path.indexOf("?") != -1) {
          int idx = path.indexOf("?");
          params.put("queryString", path.substring(idx));
          path = path.substring(0, idx);
        }
        params.put("path", path);
        // connection setup
        conn.setup(host, path, params);
        try {
          // Lookup server scope when connected using host and application name
          IGlobalScope global = server.lookupGlobal(host, path);
          log.trace("Global lookup result: {}", global);
          if (global != null) {
            final IContext context = global.getContext();
            IScope scope = null;
            try {
              // TODO optimize this to use Scope instead of Context
              scope = context.resolveScope(global, path);
              // if global scope connection is not allowed, reject
              if (scope.getDepth() < 1 && !globalScopeConnectionAllowed) {
                call.setStatus(Call.STATUS_ACCESS_DENIED);
                if (call instanceof IPendingServiceCall) {
                  IPendingServiceCall pc = (IPendingServiceCall) call;
                  StatusObject status = getStatus(NC_CONNECT_REJECTED);
                  status.setDescription("Global scope connection disallowed on this server.");
                  pc.setResult(status);
                }
                disconnectOnReturn = true;
              }
              if (scope != null) {
                if (log.isTraceEnabled()) {
                  log.trace("Connecting to: {}", scope);
                }
                if (log.isDebugEnabled()) {
                  log.debug("Connecting to: {}", scope.getName());
                  log.debug("Conn {}, scope {}, call {}", new Object[] { conn, scope, call });
                  log.debug("Call args {}", call.getArguments());
                }
                boolean okayToConnect;
                try {
                  if (call.getArguments() != null) {
                    okayToConnect = conn.connect(scope, call.getArguments());
                  } else {
                    okayToConnect = conn.connect(scope);
                  }
                  if (okayToConnect) {
                    log.debug("Connected - {}", conn.getClient());
                    call.setStatus(Call.STATUS_SUCCESS_RESULT);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      //send fmsver and capabilities
                      StatusObject result = getStatus(NC_CONNECT_SUCCESS);
                      result.setAdditional("fmsVer", Red5.getFMSVersion());
                      result.setAdditional("capabilities", Integer.valueOf(31));
                      result.setAdditional("mode", Integer.valueOf(1));
                      result.setAdditional("data", Red5.getDataVersion());
                      pc.setResult(result);
                    }
                    // Measure initial roundtrip time after connecting
                    conn.ping(new Ping(Ping.STREAM_BEGIN, 0, -1));
                    disconnectOnReturn = false;
                  } else {
                    log.debug("Connect failed");
                    call.setStatus(Call.STATUS_ACCESS_DENIED);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      pc.setResult(getStatus(NC_CONNECT_REJECTED));
                    }
                    disconnectOnReturn = true;
                  }
                } catch (ClientRejectedException rejected) {
                  log.debug("Connect rejected");
                  call.setStatus(Call.STATUS_ACCESS_DENIED);
                  if (call instanceof IPendingServiceCall) {
                    IPendingServiceCall pc = (IPendingServiceCall) call;
                    StatusObject status = getStatus(NC_CONNECT_REJECTED);
                    Object reason = rejected.getReason();
                    if (reason != null) {
                      status.setApplication(reason);
                      //should we set description?
                      status.setDescription(reason.toString());
                    }
                    pc.setResult(status);
                  }
                  disconnectOnReturn = true;
                }
              }
            } catch (ScopeNotFoundException err) {
              log.warn("Scope not found", err);
              call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
              if (call instanceof IPendingServiceCall) {
                StatusObject status = getStatus(NC_CONNECT_REJECTED);
                status.setDescription(String.format("No scope '%s' on this server.", path));
                ((IPendingServiceCall) call).setResult(status);
              }
              log.info("Scope {} not found on {}", path, host);
              disconnectOnReturn = true;
            } catch (ScopeShuttingDownException err) {
              log.warn("Scope shutting down", err);
              call.setStatus(Call.STATUS_APP_SHUTTING_DOWN);
              if (call instanceof IPendingServiceCall) {
                StatusObject status = getStatus(NC_CONNECT_APPSHUTDOWN);
                status.setDescription(String.format("Application at '%s' is currently shutting down.", path));
                ((IPendingServiceCall) call).setResult(status);
              }
              log.info("Application at {} currently shutting down on {}", path, host);
              disconnectOnReturn = true;
            }
          } else {
            log.warn("Scope {} not found", path);
            call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
            if (call instanceof IPendingServiceCall) {
              StatusObject status = getStatus(NC_CONNECT_INVALID_APPLICATION);
              status.setDescription(String.format("No scope '%s' on this server.", path));
              ((IPendingServiceCall) call).setResult(status);
            }
            log.info("No application scope found for {} on host {}", path, host);
            disconnectOnReturn = true;
          }
        } catch (RuntimeException e) {
          call.setStatus(Call.STATUS_GENERAL_EXCEPTION);
          if (call instanceof IPendingServiceCall) {
            IPendingServiceCall pc = (IPendingServiceCall) call;
            pc.setResult(getStatus(NC_CONNECT_FAILED));
          }
          log.error("Error connecting {}", e);
          disconnectOnReturn = true;
        }
        // Evaluate request for AMF3 encoding
        if (Integer.valueOf(3).equals(params.get("objectEncoding"))) {
          if (call instanceof IPendingServiceCall) {
            Object pcResult = ((IPendingServiceCall) call).getResult();
            Map<String, Object> result;
            if (pcResult instanceof Map) {
              result = (Map<String, Object>) pcResult;
              result.put("objectEncoding", 3);
            } else if (pcResult instanceof StatusObject) {
              result = new HashMap<String, Object>();
              StatusObject status = (StatusObject) pcResult;
              result.put("code", status.getCode());
              result.put("description", status.getDescription());
              result.put("application", status.getApplication());
              result.put("level", status.getLevel());
              result.put("objectEncoding", 3);
              ((IPendingServiceCall) call).setResult(result);
            }
          }
          conn.getState().setEncoding(Encoding.AMF3);
        }
      } else {
        // not connected and attempting to send an invoke
        log.warn("Not connected, closing connection");
        conn.close();
      }
    }
    if (command instanceof Invoke) {
      if ((source.getStreamId() != 0) && (call.getStatus() == Call.STATUS_SUCCESS_VOID || call.getStatus() == Call.STATUS_SUCCESS_NULL)) {
        // This fixes a bug in the FP on Intel Macs.
        log.debug("Method does not have return value, do not reply");
        return;
      }
      boolean sendResult = true;
View Full Code Here


   *
     * @param conn         Connection
     * @param invoke       Pending call result event context
     */
    protected void handlePendingCallResult(RTMPConnection conn, Notify invoke) {
    final IServiceCall call = invoke.getCall();
    final IPendingServiceCall pendingCall = conn.getPendingCall(invoke
        .getInvokeId());
    if (pendingCall != null) {
      // The client sent a response to a previously made call.
      Object[] args = call.getArguments();
      if ((args != null) && (args.length > 0)) {
        // TODO: can a client return multiple results?
        pendingCall.setResult(args[0]);
      }

View Full Code Here

    notify(method, null);
  }

  /** {@inheritDoc} */
  public void notify(String method, Object[] params) {
    IServiceCall call = new Call(method, params);
    notify(call);
  }
View Full Code Here

      Header source, Notify invoke, RTMP rtmp) {

    log.debug("Invoke: {}", invoke);

    // Get call
    final IServiceCall call = invoke.getCall();

    // If it's a callback for server remote call then pass it over to
    // callbacks handler and return
    if (call.getServiceMethodName().equals("_result")
        || call.getServiceMethodName().equals("_error")) {
      handlePendingCallResult(conn, invoke);
      return;
    }

    boolean disconnectOnReturn = false;

    // If this is not a service call then handle connection...
    if (call.getServiceName() == null) {
      log.debug("call: {}", call);
      final String action = call.getServiceMethodName();
      if (!conn.isConnected()) {
        // Handle connection
        if (action.equals(ACTION_CONNECT)) {
          log.debug("connect");

          // Get parameters passed from client to
          // NetConnection#connection
          final Map params = invoke.getConnectionParams();

          // Get hostname
          String host = getHostname((String) params.get("tcUrl"));

          // Check up port
          if (host.endsWith(":1935")) {
            // Remove default port from connection string
            host = host.substring(0, host.length() - 5);
          }

          // App name as path, but without query string if there is
          // one
          String path = (String) params.get("app");
          if (path.indexOf("?") != -1) {
            int idx = path.indexOf("?");
            params.put("queryString", path.substring(idx));
            path = path.substring(0, idx);
          }
          params.put("path", path);

          final String sessionId = null;
          conn.setup(host, path, sessionId, params);
          try {
            // Lookup server scope when connected
            // Use host and application name
            IGlobalScope global = server.lookupGlobal(host, path);
            if (global == null) {
              call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
              if (call instanceof IPendingServiceCall) {
                StatusObject status = getStatus(NC_CONNECT_INVALID_APPLICATION);
                status.setDescription("No scope \"" + path
                    + "\" on this server.");
                ((IPendingServiceCall) call).setResult(status);
              }
              log.info("No application scope found for {} on host {}. Misspelled or missing application folder?", path, host);
              disconnectOnReturn = true;
            } else {
              final IContext context = global.getContext();
              IScope scope = null;
              try {
                scope = context.resolveScope(global, path);
              } catch (ScopeNotFoundException err) {
                call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
                if (call instanceof IPendingServiceCall) {
                  StatusObject status = getStatus(NC_CONNECT_REJECTED);
                  status.setDescription("No scope \"" + path
                      + "\" on this server.");
                  ((IPendingServiceCall) call)
                      .setResult(status);
                }
                log.info("Scope {} not found on {}", path, host);
                disconnectOnReturn = true;
              } catch (ScopeShuttingDownException err) {
                call.setStatus(Call.STATUS_APP_SHUTTING_DOWN);
                if (call instanceof IPendingServiceCall) {
                  StatusObject status = getStatus(NC_CONNECT_APPSHUTDOWN);
                  status.setDescription("Application at \""
                      + path
                      + "\" is currently shutting down.");
                  ((IPendingServiceCall) call)
                      .setResult(status);
                }
                log.info("Application at {} currently shutting down on {}", path, host);
                disconnectOnReturn = true;
              }
              if (scope != null) {
                log.info("Connecting to: {}", scope);
                // Setup application's classloader to be used for deserializing
                ClassLoader loader = scope.getClassLoader();
                if (loader == null) {
                  // Fallback, should never happen
                  loader = getClass().getClassLoader();
                }
                Thread.currentThread().setContextClassLoader(loader);
               
                boolean okayToConnect;
                try {
                    log.info("DEBUG - conn {}, scope {}, call {}", new Object[]{conn, scope, call});
                    log.info("DEBUG - args {}", call.getArguments());
                  if (call.getArguments() != null) {
                    okayToConnect = conn.connect(scope, call.getArguments());
                  } else {
                    okayToConnect = conn.connect(scope);
                  }
                  if (okayToConnect) {
                    log.debug("Connected - Client: {}", conn.getClient());
                    call.setStatus(Call.STATUS_SUCCESS_RESULT);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      pc.setResult(getStatus(NC_CONNECT_SUCCESS));
                    }
                    // Measure initial roundtrip time after
                    // connecting
                    conn.getChannel(2).write(
                        new Ping(Ping.STREAM_CLEAR, 0,
                            -1));
                    conn.startRoundTripMeasurement();
                  } else {
                    log.debug("Connect failed");
                    call
                        .setStatus(Call.STATUS_ACCESS_DENIED);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      pc
                          .setResult(getStatus(NC_CONNECT_REJECTED));
                    }
                    disconnectOnReturn = true;
                  }
                } catch (ClientRejectedException rejected) {
                  log.debug("Connect rejected");
                  call.setStatus(Call.STATUS_ACCESS_DENIED);
                  if (call instanceof IPendingServiceCall) {
                    IPendingServiceCall pc = (IPendingServiceCall) call;
                    StatusObject status = getStatus(NC_CONNECT_REJECTED);
                    if (rejected.getReason() != null)
                      status.setApplication(rejected
                          .getReason());
                    pc.setResult(status);
                  }
                  disconnectOnReturn = true;
                }
              }
            }
          } catch (RuntimeException e) {
            call.setStatus(Call.STATUS_GENERAL_EXCEPTION);
            if (call instanceof IPendingServiceCall) {
              IPendingServiceCall pc = (IPendingServiceCall) call;
              pc.setResult(getStatus(NC_CONNECT_FAILED));
            }
            log.error("Error connecting {}", e);
            disconnectOnReturn = true;
          }

          // Evaluate request for AMF3 encoding
          if (Integer.valueOf(3).equals(params.get("objectEncoding"))
              && call instanceof IPendingServiceCall) {
            Object pcResult = ((IPendingServiceCall) call)
                .getResult();
            Map<String, Object> result;
            if (pcResult instanceof Map) {
              result = (Map) pcResult;
              result.put("objectEncoding", 3);
            } else if (pcResult instanceof StatusObject) {
              result = new HashMap<String, Object>();
              StatusObject status = (StatusObject) pcResult;
              result.put("code", status.getCode());
              result.put("description", status.getDescription());
              result.put("application", status.getApplication());
              result.put("level", status.getLevel());
              result.put("objectEncoding", 3);
              ((IPendingServiceCall) call).setResult(result);
            }

            rtmp.setEncoding(Encoding.AMF3);
          }
        }
      } else if (action.equals(ACTION_DISCONNECT)) {
        conn.close();
      } else if (action.equals(ACTION_CREATE_STREAM)
          || action.equals(ACTION_DELETE_STREAM)
          || action.equals(ACTION_RELEASE_STREAM)
          || action.equals(ACTION_PUBLISH)
          || action.equals(ACTION_PLAY) || action.equals(ACTION_SEEK)
          || action.equals(ACTION_PAUSE)
          || action.equals(ACTION_CLOSE_STREAM)
          || action.equals(ACTION_RECEIVE_VIDEO)
          || action.equals(ACTION_RECEIVE_AUDIO)) {
        IStreamService streamService = (IStreamService) getScopeService(
            conn.getScope(), IStreamService.class,
            StreamService.class);
        Status status = null;
        try {
          if (!invokeCall(conn, call, streamService)) {
            status = getStatus(NS_INVALID_ARGUMENT).asStatus();
            status.setDescription("Failed to " + action
                + " (stream ID: " + source.getStreamId() + ")");
          }
        } catch (Throwable err) {
          log.error("Error while invoking " + action
              + " on stream service.", err);
          status = getStatus(NS_FAILED).asStatus();
          status.setDescription("Error while invoking " + action
              + " (stream ID: " + source.getStreamId() + ")");
          status.setDetails(err.getMessage());
        }
        if (status != null) {
          channel.sendStatus(status);
        }
      } else {
        invokeCall(conn, call);
      }
    } else if (conn.isConnected()) {
      // Service calls, must be connected.
      invokeCall(conn, call);
    } else {
      // Warn user attemps to call service without being connected
      log.warn("Not connected, closing connection");
      conn.close();
    }

    if (invoke instanceof Invoke) {
      if ((source.getStreamId() != 0)
          && (call.getStatus() == Call.STATUS_SUCCESS_VOID || call
              .getStatus() == Call.STATUS_SUCCESS_NULL)) {
        // This fixes a bug in the FP on Intel Macs.
        if (log.isDebugEnabled()) {
          log
              .debug("Method does not have return value, do not reply");
View Full Code Here

 
  /** {@inheritDoc} */
    @Override
  protected void onInvoke(RTMPConnection conn, Channel channel,
      Header source, Notify invoke, RTMP rtmp) {
    final IServiceCall call = invoke.getCall();
    if (call.getServiceMethodName().equals("_result")
        || call.getServiceMethodName().equals("_error")) {
      handlePendingCallResult(conn, invoke);
      return;
    }
   
    if (serviceProvider == null) {
      // Client doesn't support calling methods on him
      call.setStatus(Call.STATUS_METHOD_NOT_FOUND);
      call.setException(new MethodNotFoundException(
          call.getServiceMethodName()));
    } else {
      serviceInvoker.invoke(call, serviceProvider);
    }
   
    if (call instanceof IPendingServiceCall) {
View Full Code Here

     */
  protected void encodeNotifyOrInvoke(ByteBuffer out, Notify invoke, RTMP rtmp) {
    // TODO: tidy up here
    // log.debug("Encode invoke");
    Output output = new org.red5.io.amf.Output(out);
    final IServiceCall call = invoke.getCall();
    final boolean isPending = (call.getStatus() == Call.STATUS_PENDING);

    if (!isPending) {
      if (log.isDebugEnabled()) {
        log.debug("Call has been executed, send result");
      }
      serializer.serialize(output, call.isSuccess() ? "_result" : "_error"); // seems right
    } else {
      if (log.isDebugEnabled()) {
        log.debug("This is a pending call, send request");
      }
      final String action = (call.getServiceName() == null) ? call
          .getServiceMethodName() : call.getServiceName() + '.'
          + call.getServiceMethodName();
      serializer.serialize(output, action); // seems right
    }
    if (invoke instanceof Invoke) {
      serializer.serialize(output, Integer.valueOf(invoke.getInvokeId()));
      serializer.serialize(output, invoke.getConnectionParams());
    }

    if (call.getServiceName() == null && "connect".equals(call.getServiceMethodName())) {
      // Response to initial connect, always use AMF0
      output = new org.red5.io.amf.Output(out);
    } else {
      if (rtmp.getEncoding() == Encoding.AMF3) {
        output = new org.red5.io.amf3.Output(out);
      } else {
        output = new org.red5.io.amf.Output(out);
      }
    }

    if (!isPending && (invoke instanceof Invoke)) {
      IPendingServiceCall pendingCall = (IPendingServiceCall) call;
      if (!call.isSuccess()) {
        StatusObject status = generateErrorResult(StatusCodes.NC_CALL_FAILED, call.getException());
        pendingCall.setResult(status);
      }
      if (log.isDebugEnabled()) {
        log.debug("Writing result: " + pendingCall.getResult());
      }
View Full Code Here

      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;
      }
View Full Code Here

    }
  }

  protected void handleConnect(RTMPConnection conn, Channel channel, Header header,
      Invoke invoke, RTMP rtmp) {
    final IServiceCall call = invoke.getCall();
        // Get parameters passed from client to NetConnection#connection
        final Map params = invoke.getConnectionParams();

        // Get hostname
        String host = getHostname((String) params.get("tcUrl"));

        // Check up port
        if (host.endsWith(":1935")) {
      // Remove default port from connection string
      host = host.substring(0, host.length() - 5);
    }

        // App name as path, but without query string if there is one
        String path = (String) params.get("app");
        if (path.indexOf("?") != -1){
          int idx = path.indexOf("?");
          params.put("queryString", path.substring(idx));
          path = path.substring(0, idx);
        }
        params.put("path", path);
       
    final String sessionId = null;
   
    conn.setup(host, path, sessionId, params);
   
    // check the security constraints
    // send back "ConnectionRejected" if fails.
    if (!checkPermission(conn)) {
      call.setStatus(Call.STATUS_ACCESS_DENIED);
      if (call instanceof IPendingServiceCall) {
        IPendingServiceCall pc = (IPendingServiceCall) call;
        pc.setResult(getStatus(NC_CONNECT_REJECTED));
      }
      Invoke reply = new Invoke();
View Full Code Here

      if (stream.getStreamListeners() != null) {
       
        for (Iterator<IStreamListener> iter = stream.getStreamListeners().iterator();iter.hasNext();) {
         
          IStreamListener iStreamListener = iter.next();
         
          ListenerAdapter listenerAdapter = (ListenerAdapter) iStreamListener;
         
          log.debug("Stream Closing ?? "+listenerAdapter.getFlvRecordingMetaDataId()+ " " +flvRecordingMetaDataId);
         
View Full Code Here

            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

TOP

Related Classes of org.red5.server.api.service.IServiceCall

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.