mirror of
https://github.com/ossrs/srs.git
synced 2025-02-14 20:31:56 +00:00
Refine typo in kernel.
This commit is contained in:
parent
735176cab4
commit
35fe05d62c
9 changed files with 1321 additions and 1976 deletions
|
@ -101,7 +101,7 @@
|
|||
(void)0
|
||||
|
||||
// Checking for st(state-threads), only support the following cpus: i386/amd64/x86_64/arm
|
||||
// @reamrk to patch ST for arm, read https://github.com/ossrs/state-threads/issues/1
|
||||
// @reamrk To patch ST for arm, read https://github.com/ossrs/state-threads/issues/1
|
||||
#if !defined(__amd64__) && !defined(__x86_64__) && !defined(__i386__) && !defined(__arm__)
|
||||
#error "only support i386/amd64/x86_64/arm cpu"
|
||||
#endif
|
||||
|
|
|
@ -35,9 +35,7 @@
|
|||
class SrsBuffer;
|
||||
class ISrsStreamWriter;
|
||||
|
||||
/**
|
||||
* Transmux the RTMP packets to AAC stream.
|
||||
*/
|
||||
// Transmux the RTMP packets to AAC stream.
|
||||
class SrsAacTransmuxer
|
||||
{
|
||||
private:
|
||||
|
@ -51,17 +49,13 @@ public:
|
|||
SrsAacTransmuxer();
|
||||
virtual ~SrsAacTransmuxer();
|
||||
public:
|
||||
/**
|
||||
* initialize the underlayer file stream.
|
||||
* @remark user can initialize multiple times to encode multiple aac files.
|
||||
* @remark, user must free the fs, aac encoder never close/free it.
|
||||
*/
|
||||
// Initialize the underlayer file stream.
|
||||
// @remark User can initialize multiple times to encode multiple aac files.
|
||||
// @remark User must free the fs, aac encoder never close/free it.
|
||||
virtual srs_error_t initialize(ISrsStreamWriter* fs);
|
||||
public:
|
||||
/**
|
||||
* write audio/video packet.
|
||||
* @remark assert data is not NULL.
|
||||
*/
|
||||
// Write audio/video packet.
|
||||
// @remark The assert data should not be NULL.
|
||||
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
|
||||
};
|
||||
|
||||
|
|
|
@ -36,82 +36,72 @@
|
|||
///////////////////////////////////////////////////////////
|
||||
// RTMP consts values
|
||||
///////////////////////////////////////////////////////////
|
||||
// default vhost of rtmp
|
||||
// Default vhost of rtmp
|
||||
#define SRS_CONSTS_RTMP_DEFAULT_VHOST "__defaultVhost__"
|
||||
#define SRS_CONSTS_RTMP_DEFAULT_APP "__defaultApp__"
|
||||
// default port of rtmp
|
||||
// Default port of rtmp
|
||||
#define SRS_CONSTS_RTMP_DEFAULT_PORT 1935
|
||||
|
||||
// the default chunk size for system.
|
||||
// The default chunk size for system.
|
||||
#define SRS_CONSTS_RTMP_SRS_CHUNK_SIZE 60000
|
||||
// 6. Chunking, RTMP protocol default chunk size.
|
||||
#define SRS_CONSTS_RTMP_PROTOCOL_CHUNK_SIZE 128
|
||||
|
||||
/**
|
||||
* 6. Chunking
|
||||
* The chunk size is configurable. It can be set using a control
|
||||
* message(Set Chunk Size) as described in section 7.1. The maximum
|
||||
* chunk size can be 65536 bytes and minimum 128 bytes. Larger values
|
||||
* reduce CPU usage, but also commit to larger writes that can delay
|
||||
* other content on lower bandwidth connections. Smaller chunks are not
|
||||
* good for high-bit rate streaming. Chunk size is maintained
|
||||
* independently for each direction.
|
||||
*/
|
||||
// 6. Chunking
|
||||
// The chunk size is configurable. It can be set using a control
|
||||
// message(Set Chunk Size) as described in section 7.1. The maximum
|
||||
// chunk size can be 65536 bytes and minimum 128 bytes. Larger values
|
||||
// reduce CPU usage, but also commit to larger writes that can delay
|
||||
// other content on lower bandwidth connections. Smaller chunks are not
|
||||
// good for high-bit rate streaming. Chunk size is maintained
|
||||
// independently for each direction.
|
||||
#define SRS_CONSTS_RTMP_MIN_CHUNK_SIZE 128
|
||||
#define SRS_CONSTS_RTMP_MAX_CHUNK_SIZE 65536
|
||||
|
||||
|
||||
// the following is the timeout for rtmp protocol,
|
||||
// The following is the timeout for rtmp protocol,
|
||||
// to avoid death connection.
|
||||
|
||||
// the common io timeout, for connect, recv or send.
|
||||
// The common io timeout, for connect, recv or send.
|
||||
// TODO: FIXME: Maybe change to smaller value, such as 3s?
|
||||
#define SRS_CONSTS_RTMP_TIMEOUT (30 * SRS_UTIME_SECONDS)
|
||||
|
||||
// the timeout to wait for client control message,
|
||||
// The timeout to wait for client control message,
|
||||
// if timeout, we generally ignore and send the data to client,
|
||||
// generally, it's the pulse time for data seding.
|
||||
// @remark, recomment to 500ms.
|
||||
#define SRS_CONSTS_RTMP_PULSE (500 * SRS_UTIME_MILLISECONDS)
|
||||
|
||||
/**
|
||||
* max rtmp header size:
|
||||
* 1bytes basic header,
|
||||
* 11bytes message header,
|
||||
* 4bytes timestamp header,
|
||||
* that is, 1+11+4=16bytes.
|
||||
*/
|
||||
// The max rtmp header size:
|
||||
// 1bytes basic header,
|
||||
// 11bytes message header,
|
||||
// 4bytes timestamp header,
|
||||
// that is, 1+11+4=16bytes.
|
||||
#define SRS_CONSTS_RTMP_MAX_FMT0_HEADER_SIZE 16
|
||||
/**
|
||||
* max rtmp header size:
|
||||
* 1bytes basic header,
|
||||
* 4bytes timestamp header,
|
||||
* that is, 1+4=5bytes.
|
||||
*/
|
||||
// The max rtmp header size:
|
||||
// 1bytes basic header,
|
||||
// 4bytes timestamp header,
|
||||
// that is, 1+4=5bytes.
|
||||
// always use fmt0 as cache.
|
||||
#define SRS_CONSTS_RTMP_MAX_FMT3_HEADER_SIZE 5
|
||||
|
||||
/**
|
||||
* for performance issue,
|
||||
* the iovs cache, @see https://github.com/ossrs/srs/issues/194
|
||||
* iovs cache for multiple messages for each connections.
|
||||
* suppose the chunk size is 64k, each message send in a chunk which needs only 2 iovec,
|
||||
* so the iovs max should be (SRS_PERF_MW_MSGS * 2)
|
||||
*
|
||||
* @remark, SRS will realloc when the iovs not enough.
|
||||
*/
|
||||
// For performance issue,
|
||||
// the iovs cache, @see https://github.com/ossrs/srs/issues/194
|
||||
// iovs cache for multiple messages for each connections.
|
||||
// suppose the chunk size is 64k, each message send in a chunk which needs only 2 iovec,
|
||||
// so the iovs max should be (SRS_PERF_MW_MSGS * 2)
|
||||
//
|
||||
// @remark, SRS will realloc when the iovs not enough.
|
||||
#define SRS_CONSTS_IOVS_MAX (SRS_PERF_MW_MSGS * 2)
|
||||
/**
|
||||
* for performance issue,
|
||||
* the c0c3 cache, @see https://github.com/ossrs/srs/issues/194
|
||||
* c0c3 cache for multiple messages for each connections.
|
||||
* each c0 <= 16byes, suppose the chunk size is 64k,
|
||||
* each message send in a chunk which needs only a c0 header,
|
||||
* so the c0c3 cache should be (SRS_PERF_MW_MSGS * 16)
|
||||
*
|
||||
* @remark, SRS will try another loop when c0c3 cache dry, for we cannot realloc it.
|
||||
* so we use larger c0c3 cache, that is (SRS_PERF_MW_MSGS * 32)
|
||||
*/
|
||||
// For performance issue,
|
||||
// the c0c3 cache, @see https://github.com/ossrs/srs/issues/194
|
||||
// c0c3 cache for multiple messages for each connections.
|
||||
// each c0 <= 16byes, suppose the chunk size is 64k,
|
||||
// each message send in a chunk which needs only a c0 header,
|
||||
// so the c0c3 cache should be (SRS_PERF_MW_MSGS * 16)
|
||||
//
|
||||
// @remark, SRS will try another loop when c0c3 cache dry, for we cannot realloc it.
|
||||
// so we use larger c0c3 cache, that is (SRS_PERF_MW_MSGS * 32)
|
||||
#define SRS_CONSTS_C0C3_HEADERS_MAX (SRS_PERF_MW_MSGS * 32)
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
@ -127,16 +117,16 @@
|
|||
#define SRS_CONSTS_NULL_FILE "/dev/null"
|
||||
#define SRS_CONSTS_LOCALHOST "127.0.0.1"
|
||||
|
||||
// signal defines.
|
||||
// reload the config file and apply new config.
|
||||
// The signal defines.
|
||||
// To reload the config file and apply new config.
|
||||
#define SRS_SIGNAL_RELOAD SIGHUP
|
||||
// reopen the log file.
|
||||
// Reopen the log file.
|
||||
#define SRS_SIGNAL_REOPEN_LOG SIGUSR1
|
||||
// srs should gracefully quit, do dispose then exit.
|
||||
// The signal for srs to gracefully quit, do dispose then exit.
|
||||
#define SRS_SIGNAL_GRACEFULLY_QUIT SIGTERM
|
||||
|
||||
// application level signals.
|
||||
// persistence the config in memory to config file.
|
||||
// The application level signals.
|
||||
// Persistence the config in memory to config file.
|
||||
// @see https://github.com/ossrs/srs/issues/319#issuecomment-134993922
|
||||
// @remark we actually don't handle the signal for it's not a valid os signal.
|
||||
#define SRS_SIGNAL_PERSISTENCE_CONFIG 1000
|
||||
|
@ -149,33 +139,33 @@
|
|||
///////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// log consts values
|
||||
// The log consts values
|
||||
///////////////////////////////////////////////////////////
|
||||
// downloading speed-up, play to edge, ingest from origin
|
||||
// Downloading speed-up, play to edge, ingest from origin
|
||||
#define SRS_CONSTS_LOG_EDGE_PLAY "EIG"
|
||||
// uploading speed-up, publish to edge, foward to origin
|
||||
// Uploading speed-up, publish to edge, foward to origin
|
||||
#define SRS_CONSTS_LOG_EDGE_PUBLISH "EFW"
|
||||
// edge/origin forwarder.
|
||||
// The edge/origin forwarder.
|
||||
#define SRS_CONSTS_LOG_FOWARDER "FWR"
|
||||
// play stream on edge/origin.
|
||||
// Play stream on edge/origin.
|
||||
#define SRS_CONSTS_LOG_PLAY "PLA"
|
||||
// client publish to edge/origin
|
||||
// Client publish to edge/origin
|
||||
#define SRS_CONSTS_LOG_CLIENT_PUBLISH "CPB"
|
||||
// web/flash publish to edge/origin
|
||||
// The web/flash publish to edge/origin
|
||||
#define SRS_CONSTS_LOG_WEB_PUBLISH "WPB"
|
||||
// ingester for edge(play)/origin
|
||||
// Ingester for edge(play)/origin
|
||||
#define SRS_CONSTS_LOG_INGESTER "IGS"
|
||||
// hls log id.
|
||||
// The hls log id.
|
||||
#define SRS_CONSTS_LOG_HLS "HLS"
|
||||
// encoder log id.
|
||||
// The encoder log id.
|
||||
#define SRS_CONSTS_LOG_ENCODER "ENC"
|
||||
// http stream log id.
|
||||
// The http stream log id.
|
||||
#define SRS_CONSTS_LOG_HTTP_STREAM "HTS"
|
||||
// http stream cache log id.
|
||||
// The http stream cache log id.
|
||||
#define SRS_CONSTS_LOG_HTTP_STREAM_CACHE "HTC"
|
||||
// stream caster log id.
|
||||
// The stream caster log id.
|
||||
#define SRS_CONSTS_LOG_STREAM_CASTER "SCS"
|
||||
// the nginx exec log id.
|
||||
// The nginx exec log id.
|
||||
#define SRS_CONSTS_LOG_EXEC "EXE"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
@ -213,14 +203,14 @@
|
|||
///////////////////////////////////////////////////////////
|
||||
// HTTP consts values
|
||||
///////////////////////////////////////////////////////////
|
||||
// the default http port.
|
||||
// The default http port.
|
||||
#define SRS_CONSTS_HTTP_DEFAULT_PORT 80
|
||||
// linux path seprator
|
||||
// The linux path seprator
|
||||
#define SRS_CONSTS_HTTP_PATH_SEP '/'
|
||||
// query string seprator
|
||||
// Query string seprator
|
||||
#define SRS_CONSTS_HTTP_QUERY_SEP '?'
|
||||
|
||||
// the default recv timeout.
|
||||
// The default recv timeout.
|
||||
#define SRS_HTTP_RECV_TIMEOUT (60 * SRS_UTIME_SECONDS)
|
||||
|
||||
// 6.1.1 Status Code and Reason Phrase
|
||||
|
@ -405,7 +395,7 @@
|
|||
///////////////////////////////////////////////////////////
|
||||
#define SRS_CONSTS_KAFKA_DEFAULT_PORT 9092
|
||||
|
||||
// the common io timeout, for both recv and send.
|
||||
// The common io timeout, for both recv and send.
|
||||
#define SRS_CONSTS_KAFKA_TIMEOUT (30 * SRS_UTIME_MILLISECONDS)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -28,13 +28,13 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213
|
||||
// For srs-librtmp, @see https://github.com/ossrs/srs/issues/213
|
||||
#ifndef _WIN32
|
||||
#define ERROR_SUCCESS 0
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// system error.
|
||||
// The system error.
|
||||
///////////////////////////////////////////////////////
|
||||
#define ERROR_SOCKET_CREATE 1000
|
||||
#define ERROR_SOCKET_SETREUSE 1001
|
||||
|
@ -173,18 +173,18 @@
|
|||
#define ERROR_RTMP_STREAM_NAME_EMPTY 2051
|
||||
#define ERROR_HTTP_HIJACK 2052
|
||||
//
|
||||
// system control message,
|
||||
// not an error, but special control logic.
|
||||
// The system control message,
|
||||
// It's not an error, but special control logic.
|
||||
//
|
||||
// connection is redirect to another server.
|
||||
// When connection is redirect to another server.
|
||||
#define ERROR_CONTROL_REDIRECT 2997
|
||||
// sys ctl: rtmp close stream, support replay.
|
||||
// For sys ctl: rtmp close stream, support replay.
|
||||
#define ERROR_CONTROL_RTMP_CLOSE 2998
|
||||
// FMLE stop publish and republish.
|
||||
// When FMLE stop publish and republish.
|
||||
#define ERROR_CONTROL_REPUBLISH 2999
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// application level
|
||||
// The application level errors.
|
||||
///////////////////////////////////////////////////////
|
||||
#define ERROR_HLS_METADATA 3000
|
||||
#define ERROR_HLS_DECODE_ERROR 3001
|
||||
|
@ -329,23 +329,23 @@
|
|||
//#define ERROR_API_METHOD_NOT_ALLOWD
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// user-define error.
|
||||
// For user-define error.
|
||||
///////////////////////////////////////////////////////
|
||||
#define ERROR_USER_START 9000
|
||||
//#define ERROR_USER_DISCONNECT 9001
|
||||
#define ERROR_SOURCE_NOT_FOUND 9002
|
||||
#define ERROR_USER_END 9999
|
||||
|
||||
/**
|
||||
* whether the error code is an system control error.
|
||||
*/
|
||||
// Whether the error code is an system control error.
|
||||
// TODO: FIXME: Remove it from underlayer for confused with error and logger.
|
||||
extern bool srs_is_system_control_error(int error_code);
|
||||
extern bool srs_is_system_control_error(srs_error_t err);
|
||||
extern bool srs_is_client_gracefully_close(int error_code);
|
||||
extern bool srs_is_client_gracefully_close(srs_error_t err);
|
||||
|
||||
// Use complex errors, @read https://github.com/ossrs/srs/issues/913
|
||||
// The complex error carries code, message, callstack and instant variables,
|
||||
// which is more strong and easy to locate problem by log,
|
||||
// please @read https://github.com/ossrs/srs/issues/913
|
||||
class SrsCplxError
|
||||
{
|
||||
private:
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213
|
||||
// For srs-librtmp, @see https://github.com/ossrs/srs/issues/213
|
||||
#ifndef _WIN32
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
|
@ -40,19 +40,13 @@ class SrsFileReader;
|
|||
|
||||
#define SRS_FLV_TAG_HEADER_SIZE 11
|
||||
#define SRS_FLV_PREVIOUS_TAG_SIZE 4
|
||||
|
||||
/****************************************************************************
|
||||
*****************************************************************************
|
||||
****************************************************************************/
|
||||
/**
|
||||
5. Protocol Control Messages
|
||||
RTMP reserves message type IDs 1-7 for protocol control messages.
|
||||
These messages contain information needed by the RTM Chunk Stream
|
||||
protocol or RTMP itself. Protocol messages with IDs 1 & 2 are
|
||||
reserved for usage with RTM Chunk Stream protocol. Protocol messages
|
||||
with IDs 3-6 are reserved for usage of RTMP. Protocol message with ID
|
||||
7 is used between edge server and origin server.
|
||||
*/
|
||||
// 5. Protocol Control Messages
|
||||
// RTMP reserves message type IDs 1-7 for protocol control messages.
|
||||
// These messages contain information needed by the RTM Chunk Stream
|
||||
// protocol or RTMP itself. Protocol messages with IDs 1 & 2 are
|
||||
// reserved for usage with RTM Chunk Stream protocol. Protocol messages
|
||||
// with IDs 3-6 are reserved for usage of RTMP. Protocol message with ID
|
||||
// 7 is used between edge server and origin server.
|
||||
#define RTMP_MSG_SetChunkSize 0x01
|
||||
#define RTMP_MSG_AbortMessage 0x02
|
||||
#define RTMP_MSG_Acknowledgement 0x03
|
||||
|
@ -60,167 +54,121 @@ class SrsFileReader;
|
|||
#define RTMP_MSG_WindowAcknowledgementSize 0x05
|
||||
#define RTMP_MSG_SetPeerBandwidth 0x06
|
||||
#define RTMP_MSG_EdgeAndOriginServerCommand 0x07
|
||||
/**
|
||||
3. Types of messages
|
||||
The server and the client send messages over the network to
|
||||
communicate with each other. The messages can be of any type which
|
||||
includes audio messages, video messages, command messages, shared
|
||||
object messages, data messages, and user control messages.
|
||||
3.1. Command message
|
||||
Command messages carry the AMF-encoded commands between the client
|
||||
and the server. These messages have been assigned message type value
|
||||
of 20 for AMF0 encoding and message type value of 17 for AMF3
|
||||
encoding. These messages are sent to perform some operations like
|
||||
connect, createStream, publish, play, pause on the peer. Command
|
||||
messages like onstatus, result etc. are used to inform the sender
|
||||
about the status of the requested commands. A command message
|
||||
consists of command name, transaction ID, and command object that
|
||||
contains related parameters. A client or a server can request Remote
|
||||
Procedure Calls (RPC) over streams that are communicated using the
|
||||
command messages to the peer.
|
||||
*/
|
||||
// 3. Types of messages
|
||||
// The server and the client send messages over the network to
|
||||
// communicate with each other. The messages can be of any type which
|
||||
// includes audio messages, video messages, command messages, shared
|
||||
// object messages, data messages, and user control messages.
|
||||
// 3.1. Command message
|
||||
// Command messages carry the AMF-encoded commands between the client
|
||||
// and the server. These messages have been assigned message type value
|
||||
// of 20 for AMF0 encoding and message type value of 17 for AMF3
|
||||
// encoding. These messages are sent to perform some operations like
|
||||
// connect, createStream, publish, play, pause on the peer. Command
|
||||
// messages like onstatus, result etc. are used to inform the sender
|
||||
// about the status of the requested commands. A command message
|
||||
// consists of command name, transaction ID, and command object that
|
||||
// contains related parameters. A client or a server can request Remote
|
||||
// Procedure Calls (RPC) over streams that are communicated using the
|
||||
// command messages to the peer.
|
||||
#define RTMP_MSG_AMF3CommandMessage 17 // 0x11
|
||||
#define RTMP_MSG_AMF0CommandMessage 20 // 0x14
|
||||
/**
|
||||
3.2. Data message
|
||||
The client or the server sends this message to send Metadata or any
|
||||
user data to the peer. Metadata includes details about the
|
||||
data(audio, video etc.) like creation time, duration, theme and so
|
||||
on. These messages have been assigned message type value of 18 for
|
||||
AMF0 and message type value of 15 for AMF3.
|
||||
*/
|
||||
// 3.2. Data message
|
||||
// The client or the server sends this message to send Metadata or any
|
||||
// user data to the peer. Metadata includes details about the
|
||||
// data(audio, video etc.) like creation time, duration, theme and so
|
||||
// on. These messages have been assigned message type value of 18 for
|
||||
// AMF0 and message type value of 15 for AMF3.
|
||||
#define RTMP_MSG_AMF0DataMessage 18 // 0x12
|
||||
#define RTMP_MSG_AMF3DataMessage 15 // 0x0F
|
||||
/**
|
||||
3.3. Shared object message
|
||||
A shared object is a Flash object (a collection of name value pairs)
|
||||
that are in synchronization across multiple clients, instances, and
|
||||
so on. The message types kMsgContainer=19 for AMF0 and
|
||||
kMsgContainerEx=16 for AMF3 are reserved for shared object events.
|
||||
Each message can contain multiple events.
|
||||
*/
|
||||
// 3.3. Shared object message
|
||||
// A shared object is a Flash object (a collection of name value pairs)
|
||||
// that are in synchronization across multiple clients, instances, and
|
||||
// so on. The message types kMsgContainer=19 for AMF0 and
|
||||
// kMsgContainerEx=16 for AMF3 are reserved for shared object events.
|
||||
// Each message can contain multiple events.
|
||||
#define RTMP_MSG_AMF3SharedObject 16 // 0x10
|
||||
#define RTMP_MSG_AMF0SharedObject 19 // 0x13
|
||||
/**
|
||||
3.4. Audio message
|
||||
The client or the server sends this message to send audio data to the
|
||||
peer. The message type value of 8 is reserved for audio messages.
|
||||
*/
|
||||
// 3.4. Audio message
|
||||
// The client or the server sends this message to send audio data to the
|
||||
// peer. The message type value of 8 is reserved for audio messages.
|
||||
#define RTMP_MSG_AudioMessage 8 // 0x08
|
||||
/* *
|
||||
3.5. Video message
|
||||
The client or the server sends this message to send video data to the
|
||||
peer. The message type value of 9 is reserved for video messages.
|
||||
These messages are large and can delay the sending of other type of
|
||||
messages. To avoid such a situation, the video message is assigned
|
||||
the lowest priority.
|
||||
*/
|
||||
// 3.5. Video message
|
||||
// The client or the server sends this message to send video data to the
|
||||
// peer. The message type value of 9 is reserved for video messages.
|
||||
// These messages are large and can delay the sending of other type of
|
||||
// messages. To avoid such a situation, the video message is assigned
|
||||
// The lowest priority.
|
||||
#define RTMP_MSG_VideoMessage 9 // 0x09
|
||||
/**
|
||||
3.6. Aggregate message
|
||||
An aggregate message is a single message that contains a list of submessages.
|
||||
The message type value of 22 is reserved for aggregate
|
||||
messages.
|
||||
*/
|
||||
// 3.6. Aggregate message
|
||||
// An aggregate message is a single message that contains a list of submessages.
|
||||
// The message type value of 22 is reserved for aggregate
|
||||
// messages.
|
||||
#define RTMP_MSG_AggregateMessage 22 // 0x16
|
||||
|
||||
/****************************************************************************
|
||||
*****************************************************************************
|
||||
****************************************************************************/
|
||||
/**
|
||||
* the chunk stream id used for some under-layer message,
|
||||
* for example, the PC(protocol control) message.
|
||||
*/
|
||||
// The chunk stream id used for some under-layer message,
|
||||
// For example, the PC(protocol control) message.
|
||||
#define RTMP_CID_ProtocolControl 0x02
|
||||
/**
|
||||
* the AMF0/AMF3 command message, invoke method and return the result, over NetConnection.
|
||||
* generally use 0x03.
|
||||
*/
|
||||
// The AMF0/AMF3 command message, invoke method and return the result, over NetConnection.
|
||||
// generally use 0x03.
|
||||
#define RTMP_CID_OverConnection 0x03
|
||||
/**
|
||||
* the AMF0/AMF3 command message, invoke method and return the result, over NetConnection,
|
||||
* the midst state(we guess).
|
||||
* rarely used, e.g. onStatus(NetStream.Play.Reset).
|
||||
*/
|
||||
// The AMF0/AMF3 command message, invoke method and return the result, over NetConnection,
|
||||
// The midst state(we guess).
|
||||
// rarely used, e.g. onStatus(NetStream.Play.Reset).
|
||||
#define RTMP_CID_OverConnection2 0x04
|
||||
/**
|
||||
* the stream message(amf0/amf3), over NetStream.
|
||||
* generally use 0x05.
|
||||
*/
|
||||
// The stream message(amf0/amf3), over NetStream.
|
||||
// generally use 0x05.
|
||||
#define RTMP_CID_OverStream 0x05
|
||||
/**
|
||||
* the stream message(amf0/amf3), over NetStream, the midst state(we guess).
|
||||
* rarely used, e.g. play("mp4:mystram.f4v")
|
||||
*/
|
||||
// The stream message(amf0/amf3), over NetStream, the midst state(we guess).
|
||||
// rarely used, e.g. play("mp4:mystram.f4v")
|
||||
#define RTMP_CID_OverStream2 0x08
|
||||
/**
|
||||
* the stream message(video), over NetStream
|
||||
* generally use 0x06.
|
||||
*/
|
||||
// The stream message(video), over NetStream
|
||||
// generally use 0x06.
|
||||
#define RTMP_CID_Video 0x06
|
||||
/**
|
||||
* the stream message(audio), over NetStream.
|
||||
* generally use 0x07.
|
||||
*/
|
||||
// The stream message(audio), over NetStream.
|
||||
// generally use 0x07.
|
||||
#define RTMP_CID_Audio 0x07
|
||||
|
||||
/**
|
||||
* 6.1. Chunk Format
|
||||
* Extended timestamp: 0 or 4 bytes
|
||||
* This field MUST be sent when the normal timsestamp is set to
|
||||
* 0xffffff, it MUST NOT be sent if the normal timestamp is set to
|
||||
* anything else. So for values less than 0xffffff the normal
|
||||
* timestamp field SHOULD be used in which case the extended timestamp
|
||||
* MUST NOT be present. For values greater than or equal to 0xffffff
|
||||
* the normal timestamp field MUST NOT be used and MUST be set to
|
||||
* 0xffffff and the extended timestamp MUST be sent.
|
||||
*/
|
||||
// 6.1. Chunk Format
|
||||
// Extended timestamp: 0 or 4 bytes
|
||||
// This field MUST be sent when the normal timsestamp is set to
|
||||
// 0xffffff, it MUST NOT be sent if the normal timestamp is set to
|
||||
// anything else. So for values less than 0xffffff the normal
|
||||
// timestamp field SHOULD be used in which case the extended timestamp
|
||||
// MUST NOT be present. For values greater than or equal to 0xffffff
|
||||
// The normal timestamp field MUST NOT be used and MUST be set to
|
||||
// 0xffffff and the extended timestamp MUST be sent.
|
||||
#define RTMP_EXTENDED_TIMESTAMP 0xFFFFFF
|
||||
|
||||
/**
|
||||
* 4.1. Message Header
|
||||
*/
|
||||
// 4.1. Message Header
|
||||
class SrsMessageHeader
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* 3bytes.
|
||||
* Three-byte field that contains a timestamp delta of the message.
|
||||
* @remark, only used for decoding message from chunk stream.
|
||||
*/
|
||||
// 3bytes.
|
||||
// Three-byte field that contains a timestamp delta of the message.
|
||||
// @remark, only used for decoding message from chunk stream.
|
||||
int32_t timestamp_delta;
|
||||
/**
|
||||
* 3bytes.
|
||||
* Three-byte field that represents the size of the payload in bytes.
|
||||
* It is set in big-endian format.
|
||||
*/
|
||||
// 3bytes.
|
||||
// Three-byte field that represents the size of the payload in bytes.
|
||||
// It is set in big-endian format.
|
||||
int32_t payload_length;
|
||||
/**
|
||||
* 1byte.
|
||||
* One byte field to represent the message type. A range of type IDs
|
||||
* (1-7) are reserved for protocol control messages.
|
||||
*/
|
||||
// 1byte.
|
||||
// One byte field to represent the message type. A range of type IDs
|
||||
// (1-7) are reserved for protocol control messages.
|
||||
int8_t message_type;
|
||||
/**
|
||||
* 4bytes.
|
||||
* Four-byte field that identifies the stream of the message. These
|
||||
* bytes are set in little-endian format.
|
||||
*/
|
||||
// 4bytes.
|
||||
// Four-byte field that identifies the stream of the message. These
|
||||
// bytes are set in little-endian format.
|
||||
int32_t stream_id;
|
||||
|
||||
/**
|
||||
* Four-byte field that contains a timestamp of the message.
|
||||
* The 4 bytes are packed in the big-endian order.
|
||||
* @remark, used as calc timestamp when decode and encode time.
|
||||
* @remark, we use 64bits for large time for jitter detect and hls.
|
||||
*/
|
||||
// Four-byte field that contains a timestamp of the message.
|
||||
// The 4 bytes are packed in the big-endian order.
|
||||
// @remark, used as calc timestamp when decode and encode time.
|
||||
// @remark, we use 64bits for large time for jitter detect and hls.
|
||||
int64_t timestamp;
|
||||
public:
|
||||
/**
|
||||
* get the perfered cid(chunk stream id) which sendout over.
|
||||
* set at decoding, and canbe used for directly send message,
|
||||
* for example, dispatch to all connections.
|
||||
*/
|
||||
// Get the perfered cid(chunk stream id) which sendout over.
|
||||
// set at decoding, and canbe used for directly send message,
|
||||
// For example, dispatch to all connections.
|
||||
int perfer_cid;
|
||||
public:
|
||||
SrsMessageHeader();
|
||||
|
@ -239,149 +187,114 @@ public:
|
|||
bool is_set_peer_bandwidth();
|
||||
bool is_aggregate();
|
||||
public:
|
||||
/**
|
||||
* create a amf0 script header, set the size and stream_id.
|
||||
*/
|
||||
// Create a amf0 script header, set the size and stream_id.
|
||||
void initialize_amf0_script(int size, int stream);
|
||||
/**
|
||||
* create a audio header, set the size, timestamp and stream_id.
|
||||
*/
|
||||
// Create a audio header, set the size, timestamp and stream_id.
|
||||
void initialize_audio(int size, uint32_t time, int stream);
|
||||
/**
|
||||
* create a video header, set the size, timestamp and stream_id.
|
||||
*/
|
||||
// Create a video header, set the size, timestamp and stream_id.
|
||||
void initialize_video(int size, uint32_t time, int stream);
|
||||
};
|
||||
|
||||
/**
|
||||
* message is raw data RTMP message, bytes oriented,
|
||||
* protcol always recv RTMP message, and can send RTMP message or RTMP packet.
|
||||
* the common message is read from underlay protocol sdk.
|
||||
* while the shared ptr message used to copy and send.
|
||||
*/
|
||||
// The message is raw data RTMP message, bytes oriented,
|
||||
// protcol always recv RTMP message, and can send RTMP message or RTMP packet.
|
||||
// The common message is read from underlay protocol sdk.
|
||||
// while the shared ptr message used to copy and send.
|
||||
class SrsCommonMessage
|
||||
{
|
||||
// 4.1. Message Header
|
||||
// 4.1. Message Header
|
||||
public:
|
||||
SrsMessageHeader header;
|
||||
// 4.2. Message Payload
|
||||
// 4.2. Message Payload
|
||||
public:
|
||||
/**
|
||||
* current message parsed size,
|
||||
* size <= header.payload_length
|
||||
* for the payload maybe sent in multiple chunks.
|
||||
*/
|
||||
// The current message parsed size,
|
||||
// size <= header.payload_length
|
||||
// For the payload maybe sent in multiple chunks.
|
||||
int size;
|
||||
/**
|
||||
* the payload of message, the SrsCommonMessage never know about the detail of payload,
|
||||
* user must use SrsProtocol.decode_message to get concrete packet.
|
||||
* @remark, not all message payload can be decoded to packet. for example,
|
||||
* video/audio packet use raw bytes, no video/audio packet.
|
||||
*/
|
||||
// The payload of message, the SrsCommonMessage never know about the detail of payload,
|
||||
// user must use SrsProtocol.decode_message to get concrete packet.
|
||||
// @remark, not all message payload can be decoded to packet. for example,
|
||||
// video/audio packet use raw bytes, no video/audio packet.
|
||||
char* payload;
|
||||
public:
|
||||
SrsCommonMessage();
|
||||
virtual ~SrsCommonMessage();
|
||||
public:
|
||||
/**
|
||||
* alloc the payload to specified size of bytes.
|
||||
*/
|
||||
// Alloc the payload to specified size of bytes.
|
||||
virtual void create_payload(int size);
|
||||
public:
|
||||
/**
|
||||
* create common message,
|
||||
* from the header and body.
|
||||
* @remark user should never free the body.
|
||||
* @param pheader, the header to copy to the message. NULL to ignore.
|
||||
*/
|
||||
// Create common message,
|
||||
// from the header and body.
|
||||
// @remark user should never free the body.
|
||||
// @param pheader, the header to copy to the message. NULL to ignore.
|
||||
virtual srs_error_t create(SrsMessageHeader* pheader, char* body, int size);
|
||||
};
|
||||
|
||||
/**
|
||||
* the message header for shared ptr message.
|
||||
* only the message for all msgs are same.
|
||||
*/
|
||||
// The message header for shared ptr message.
|
||||
// only the message for all msgs are same.
|
||||
struct SrsSharedMessageHeader
|
||||
{
|
||||
/**
|
||||
* 3bytes.
|
||||
* Three-byte field that represents the size of the payload in bytes.
|
||||
* It is set in big-endian format.
|
||||
*/
|
||||
// 3bytes.
|
||||
// Three-byte field that represents the size of the payload in bytes.
|
||||
// It is set in big-endian format.
|
||||
int32_t payload_length;
|
||||
/**
|
||||
* 1byte.
|
||||
* One byte field to represent the message type. A range of type IDs
|
||||
* (1-7) are reserved for protocol control messages.
|
||||
*/
|
||||
// 1byte.
|
||||
// One byte field to represent the message type. A range of type IDs
|
||||
// (1-7) are reserved for protocol control messages.
|
||||
int8_t message_type;
|
||||
/**
|
||||
* get the perfered cid(chunk stream id) which sendout over.
|
||||
* set at decoding, and canbe used for directly send message,
|
||||
* for example, dispatch to all connections.
|
||||
*/
|
||||
// Get the perfered cid(chunk stream id) which sendout over.
|
||||
// set at decoding, and canbe used for directly send message,
|
||||
// For example, dispatch to all connections.
|
||||
int perfer_cid;
|
||||
|
||||
SrsSharedMessageHeader();
|
||||
virtual ~SrsSharedMessageHeader();
|
||||
};
|
||||
|
||||
/**
|
||||
* shared ptr message.
|
||||
* for audio/video/data message that need less memory copy.
|
||||
* and only for output.
|
||||
*
|
||||
* create first object by constructor and create(),
|
||||
* use copy if need reference count message.
|
||||
*
|
||||
*/
|
||||
// The shared ptr message.
|
||||
// For audio/video/data message that need less memory copy.
|
||||
// and only for output.
|
||||
//
|
||||
// Create first object by constructor and create(),
|
||||
// use copy if need reference count message.
|
||||
class SrsSharedPtrMessage
|
||||
{
|
||||
// 4.1. Message Header
|
||||
// 4.1. Message Header
|
||||
public:
|
||||
// the header can shared, only set the timestamp and stream id.
|
||||
// The header can shared, only set the timestamp and stream id.
|
||||
// @see https://github.com/ossrs/srs/issues/251
|
||||
//SrsSharedMessageHeader header;
|
||||
/**
|
||||
* Four-byte field that contains a timestamp of the message.
|
||||
* The 4 bytes are packed in the big-endian order.
|
||||
* @remark, used as calc timestamp when decode and encode time.
|
||||
* @remark, we use 64bits for large time for jitter detect and hls.
|
||||
*/
|
||||
// Four-byte field that contains a timestamp of the message.
|
||||
// The 4 bytes are packed in the big-endian order.
|
||||
// @remark, used as calc timestamp when decode and encode time.
|
||||
// @remark, we use 64bits for large time for jitter detect and hls.
|
||||
int64_t timestamp;
|
||||
/**
|
||||
* 4bytes.
|
||||
* Four-byte field that identifies the stream of the message. These
|
||||
* bytes are set in big-endian format.
|
||||
*/
|
||||
// 4bytes.
|
||||
// Four-byte field that identifies the stream of the message. These
|
||||
// bytes are set in big-endian format.
|
||||
int32_t stream_id;
|
||||
// 4.2. Message Payload
|
||||
public:
|
||||
/**
|
||||
* current message parsed size,
|
||||
* size <= header.payload_length
|
||||
* for the payload maybe sent in multiple chunks.
|
||||
*/
|
||||
// The current message parsed size,
|
||||
// size <= header.payload_length
|
||||
// For the payload maybe sent in multiple chunks.
|
||||
int size;
|
||||
/**
|
||||
* the payload of message, the SrsCommonMessage never know about the detail of payload,
|
||||
* user must use SrsProtocol.decode_message to get concrete packet.
|
||||
* @remark, not all message payload can be decoded to packet. for example,
|
||||
* video/audio packet use raw bytes, no video/audio packet.
|
||||
*/
|
||||
// The payload of message, the SrsCommonMessage never know about the detail of payload,
|
||||
// user must use SrsProtocol.decode_message to get concrete packet.
|
||||
// @remark, not all message payload can be decoded to packet. for example,
|
||||
// video/audio packet use raw bytes, no video/audio packet.
|
||||
char* payload;
|
||||
private:
|
||||
class SrsSharedPtrPayload
|
||||
{
|
||||
public:
|
||||
// shared message header.
|
||||
// The shared message header.
|
||||
// @see https://github.com/ossrs/srs/issues/251
|
||||
SrsSharedMessageHeader header;
|
||||
// actual shared payload.
|
||||
// The actual shared payload.
|
||||
char* payload;
|
||||
// size of payload.
|
||||
// The size of payload.
|
||||
int size;
|
||||
// the reference count
|
||||
// The reference count
|
||||
int shared_count;
|
||||
public:
|
||||
SrsSharedPtrPayload();
|
||||
|
@ -392,54 +305,40 @@ public:
|
|||
SrsSharedPtrMessage();
|
||||
virtual ~SrsSharedPtrMessage();
|
||||
public:
|
||||
/**
|
||||
* create shared ptr message,
|
||||
* copy header, manage the payload of msg,
|
||||
* set the payload to NULL to prevent double free.
|
||||
* @remark payload of msg set to NULL if success.
|
||||
*/
|
||||
// Create shared ptr message,
|
||||
// copy header, manage the payload of msg,
|
||||
// set the payload to NULL to prevent double free.
|
||||
// @remark payload of msg set to NULL if success.
|
||||
virtual srs_error_t create(SrsCommonMessage* msg);
|
||||
/**
|
||||
* create shared ptr message,
|
||||
* from the header and payload.
|
||||
* @remark user should never free the payload.
|
||||
* @param pheader, the header to copy to the message. NULL to ignore.
|
||||
*/
|
||||
// Create shared ptr message,
|
||||
// from the header and payload.
|
||||
// @remark user should never free the payload.
|
||||
// @param pheader, the header to copy to the message. NULL to ignore.
|
||||
virtual srs_error_t create(SrsMessageHeader* pheader, char* payload, int size);
|
||||
/**
|
||||
* get current reference count.
|
||||
* when this object created, count set to 0.
|
||||
* if copy() this object, count increase 1.
|
||||
* if this or copy deleted, free payload when count is 0, or count--.
|
||||
* @remark, assert object is created.
|
||||
*/
|
||||
// Get current reference count.
|
||||
// when this object created, count set to 0.
|
||||
// if copy() this object, count increase 1.
|
||||
// if this or copy deleted, free payload when count is 0, or count--.
|
||||
// @remark, assert object is created.
|
||||
virtual int count();
|
||||
/**
|
||||
* check perfer cid and stream id.
|
||||
* @return whether stream id already set.
|
||||
*/
|
||||
// check perfer cid and stream id.
|
||||
// @return whether stream id already set.
|
||||
virtual bool check(int stream_id);
|
||||
public:
|
||||
virtual bool is_av();
|
||||
virtual bool is_audio();
|
||||
virtual bool is_video();
|
||||
public:
|
||||
/**
|
||||
* generate the chunk header to cache.
|
||||
* @return the size of header.
|
||||
*/
|
||||
// generate the chunk header to cache.
|
||||
// @return the size of header.
|
||||
virtual int chunk_header(char* cache, int nb_cache, bool c0);
|
||||
public:
|
||||
/**
|
||||
* copy current shared ptr message, use ref-count.
|
||||
* @remark, assert object is created.
|
||||
*/
|
||||
// copy current shared ptr message, use ref-count.
|
||||
// @remark, assert object is created.
|
||||
virtual SrsSharedPtrMessage* copy();
|
||||
};
|
||||
|
||||
/**
|
||||
* Transmux RTMP packets to FLV stream.
|
||||
*/
|
||||
// Transmux RTMP packets to FLV stream.
|
||||
class SrsFlvTransmuxer
|
||||
{
|
||||
private:
|
||||
|
@ -450,60 +349,48 @@ public:
|
|||
SrsFlvTransmuxer();
|
||||
virtual ~SrsFlvTransmuxer();
|
||||
public:
|
||||
/**
|
||||
* initialize the underlayer file stream.
|
||||
* @remark user can initialize multiple times to encode multiple flv files.
|
||||
* @remark, user must free the @param fw, flv encoder never close/free it.
|
||||
*/
|
||||
// Initialize the underlayer file stream.
|
||||
// @remark user can initialize multiple times to encode multiple flv files.
|
||||
// @remark, user must free the @param fw, flv encoder never close/free it.
|
||||
virtual srs_error_t initialize(ISrsWriter* fw);
|
||||
public:
|
||||
/**
|
||||
* write flv header.
|
||||
* write following:
|
||||
* 1. E.2 The FLV header
|
||||
* 2. PreviousTagSize0 UI32 Always 0
|
||||
* that is, 9+4=13bytes.
|
||||
*/
|
||||
// Write flv header.
|
||||
// Write following:
|
||||
// 1. E.2 The FLV header
|
||||
// 2. PreviousTagSize0 UI32 Always 0
|
||||
// that is, 9+4=13bytes.
|
||||
virtual srs_error_t write_header();
|
||||
virtual srs_error_t write_header(char flv_header[9]);
|
||||
/**
|
||||
* write flv metadata.
|
||||
* @param type, the type of data, or other message type.
|
||||
* @see SrsFrameType
|
||||
* @param data, the amf0 metadata which serialize from:
|
||||
* AMF0 string: onMetaData,
|
||||
* AMF0 object: the metadata object.
|
||||
* @remark assert data is not NULL.
|
||||
*/
|
||||
// Write flv metadata.
|
||||
// @param type, the type of data, or other message type.
|
||||
// @see SrsFrameType
|
||||
// @param data, the amf0 metadata which serialize from:
|
||||
// AMF0 string: onMetaData,
|
||||
// AMF0 object: the metadata object.
|
||||
// @remark assert data is not NULL.
|
||||
virtual srs_error_t write_metadata(char type, char* data, int size);
|
||||
/**
|
||||
* write audio/video packet.
|
||||
* @remark assert data is not NULL.
|
||||
*/
|
||||
// Write audio/video packet.
|
||||
// @remark assert data is not NULL.
|
||||
virtual srs_error_t write_audio(int64_t timestamp, char* data, int size);
|
||||
virtual srs_error_t write_video(int64_t timestamp, char* data, int size);
|
||||
public:
|
||||
/**
|
||||
* get the tag size,
|
||||
* including the tag header, body, and 4bytes previous tag size.
|
||||
* @remark assert data_size is not negative.
|
||||
*/
|
||||
// Get the tag size,
|
||||
// including the tag header, body, and 4bytes previous tag size.
|
||||
// @remark assert data_size is not negative.
|
||||
static int size_tag(int data_size);
|
||||
#ifdef SRS_PERF_FAST_FLV_ENCODER
|
||||
private:
|
||||
// cache tag header.
|
||||
// The cache tag header.
|
||||
int nb_tag_headers;
|
||||
char* tag_headers;
|
||||
// cache pps(previous tag size)
|
||||
// The cache pps(previous tag size)
|
||||
int nb_ppts;
|
||||
char* ppts;
|
||||
// cache iovss.
|
||||
// The cache iovss.
|
||||
int nb_iovss_cache;
|
||||
iovec* iovss_cache;
|
||||
public:
|
||||
/**
|
||||
* write the tags in a time.
|
||||
*/
|
||||
// Write the tags in a time.
|
||||
virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count);
|
||||
#endif
|
||||
private:
|
||||
|
@ -514,9 +401,7 @@ private:
|
|||
virtual srs_error_t write_tag(char* header, int header_size, char* tag, int tag_size);
|
||||
};
|
||||
|
||||
/**
|
||||
* decode flv file.
|
||||
*/
|
||||
// Decode flv file.
|
||||
class SrsFlvDecoder
|
||||
{
|
||||
private:
|
||||
|
@ -525,40 +410,28 @@ public:
|
|||
SrsFlvDecoder();
|
||||
virtual ~SrsFlvDecoder();
|
||||
public:
|
||||
/**
|
||||
* initialize the underlayer file stream
|
||||
* @remark user can initialize multiple times to decode multiple flv files.
|
||||
* @remark user must free the @param fr, flv decoder never close/free it
|
||||
*/
|
||||
// Initialize the underlayer file stream
|
||||
// @remark user can initialize multiple times to decode multiple flv files.
|
||||
// @remark user must free the @param fr, flv decoder never close/free it
|
||||
virtual srs_error_t initialize(ISrsReader* fr);
|
||||
public:
|
||||
/**
|
||||
* read the flv header, donot including the 4bytes previous tag size.
|
||||
* @remark assert header not NULL.
|
||||
*/
|
||||
// Read the flv header, donot including the 4bytes previous tag size.
|
||||
// @remark assert header not NULL.
|
||||
virtual srs_error_t read_header(char header[9]);
|
||||
/**
|
||||
* read the tag header infos.
|
||||
* @remark assert ptype/pdata_size/ptime not NULL.
|
||||
*/
|
||||
// Read the tag header infos.
|
||||
// @remark assert ptype/pdata_size/ptime not NULL.
|
||||
virtual srs_error_t read_tag_header(char* ptype, int32_t* pdata_size, uint32_t* ptime);
|
||||
/**
|
||||
* read the tag data.
|
||||
* @remark assert data not NULL.
|
||||
*/
|
||||
// Read the tag data.
|
||||
// @remark assert data not NULL.
|
||||
virtual srs_error_t read_tag_data(char* data, int32_t size);
|
||||
/**
|
||||
* read the 4bytes previous tag size.
|
||||
* @remark assert previous_tag_size not NULL.
|
||||
*/
|
||||
// Read the 4bytes previous tag size.
|
||||
// @remark assert previous_tag_size not NULL.
|
||||
virtual srs_error_t read_previous_tag_size(char previous_tag_size[4]);
|
||||
};
|
||||
|
||||
/**
|
||||
* decode flv fast by only decoding the header and tag.
|
||||
* used for vod flv stream to read the header and sequence header,
|
||||
* then seek to specified offset.
|
||||
*/
|
||||
// Decode flv fast by only decoding the header and tag.
|
||||
// used for vod flv stream to read the header and sequence header,
|
||||
// then seek to specified offset.
|
||||
class SrsFlvVodStreamDecoder
|
||||
{
|
||||
private:
|
||||
|
@ -567,31 +440,23 @@ public:
|
|||
SrsFlvVodStreamDecoder();
|
||||
virtual ~SrsFlvVodStreamDecoder();
|
||||
public:
|
||||
/**
|
||||
* initialize the underlayer file stream
|
||||
* @remark user can initialize multiple times to decode multiple flv files.
|
||||
* @remark user must free the @param fr, flv decoder never close/free it.
|
||||
*/
|
||||
// Initialize the underlayer file stream
|
||||
// @remark user can initialize multiple times to decode multiple flv files.
|
||||
// @remark user must free the @param fr, flv decoder never close/free it.
|
||||
virtual srs_error_t initialize(ISrsReader* fr);
|
||||
public:
|
||||
/**
|
||||
* read the flv header and its size.
|
||||
* @param header, fill it 13bytes(9bytes header, 4bytes previous tag size).
|
||||
* @remark assert header not NULL.
|
||||
*/
|
||||
// Read the flv header and its size.
|
||||
// @param header, fill it 13bytes(9bytes header, 4bytes previous tag size).
|
||||
// @remark assert header not NULL.
|
||||
virtual srs_error_t read_header_ext(char header[13]);
|
||||
/**
|
||||
* read the sequence header tags offset and its size.
|
||||
* @param pstart, the start offset of sequence header.
|
||||
* @param psize, output the size, (tag header)+(tag body)+(4bytes previous tag size).
|
||||
* @remark we think the first audio/video is sequence header.
|
||||
* @remark assert pstart/psize not NULL.
|
||||
*/
|
||||
// Read the sequence header tags offset and its size.
|
||||
// @param pstart, the start offset of sequence header.
|
||||
// @param psize, output the size, (tag header)+(tag body)+(4bytes previous tag size).
|
||||
// @remark we think the first audio/video is sequence header.
|
||||
// @remark assert pstart/psize not NULL.
|
||||
virtual srs_error_t read_sequence_header_summary(int64_t* pstart, int* psize);
|
||||
public:
|
||||
/**
|
||||
* for start offset, seed to this position and response flv stream.
|
||||
*/
|
||||
// For start offset, seed to this position and response flv stream.
|
||||
virtual srs_error_t seek2(int64_t offset);
|
||||
};
|
||||
|
||||
|
|
|
@ -33,15 +33,13 @@
|
|||
|
||||
#include <srs_kernel_consts.hpp>
|
||||
|
||||
/**
|
||||
* the log level, for example:
|
||||
* if specified Debug level, all level messages will be logged.
|
||||
* if specified Warn level, only Warn/Error/Fatal level messages will be logged.
|
||||
*/
|
||||
// The log level, for example:
|
||||
// if specified Debug level, all level messages will be logged.
|
||||
// if specified Warn level, only Warn/Error/Fatal level messages will be logged.
|
||||
enum SrsLogLevel
|
||||
{
|
||||
SrsLogLevelForbidden = 0x00,
|
||||
// only used for very verbose debug, generally,
|
||||
// Only used for very verbose debug, generally,
|
||||
// we compile without this level for high performance.
|
||||
SrsLogLevelVerbose = 0x01,
|
||||
SrsLogLevelInfo = 0x02,
|
||||
|
@ -51,85 +49,63 @@ enum SrsLogLevel
|
|||
SrsLogLevelDisabled = 0x20,
|
||||
};
|
||||
|
||||
/**
|
||||
* the log interface provides method to write log.
|
||||
* but we provides some macro, which enable us to disable the log when compile.
|
||||
* @see also SmtDebug/SmtTrace/SmtWarn/SmtError which is corresponding to Debug/Trace/Warn/Fatal.
|
||||
*/
|
||||
// The log interface provides method to write log.
|
||||
// but we provides some macro, which enable us to disable the log when compile.
|
||||
// @see also SmtDebug/SmtTrace/SmtWarn/SmtError which is corresponding to Debug/Trace/Warn/Fatal.
|
||||
class ISrsLog
|
||||
{
|
||||
public:
|
||||
ISrsLog();
|
||||
virtual ~ISrsLog();
|
||||
public:
|
||||
/**
|
||||
* initialize log utilities.
|
||||
*/
|
||||
// Initialize log utilities.
|
||||
virtual srs_error_t initialize();
|
||||
/**
|
||||
* reopen the log file for log rotate.
|
||||
*/
|
||||
// Reopen the log file for log rotate.
|
||||
virtual void reopen();
|
||||
public:
|
||||
/**
|
||||
* log for verbose, very verbose information.
|
||||
*/
|
||||
// The log for verbose, very verbose information.
|
||||
virtual void verbose(const char* tag, int context_id, const char* fmt, ...);
|
||||
/**
|
||||
* log for debug, detail information.
|
||||
*/
|
||||
// The log for debug, detail information.
|
||||
virtual void info(const char* tag, int context_id, const char* fmt, ...);
|
||||
/**
|
||||
* log for trace, important information.
|
||||
*/
|
||||
// The log for trace, important information.
|
||||
virtual void trace(const char* tag, int context_id, const char* fmt, ...);
|
||||
/**
|
||||
* log for warn, warn is something should take attention, but not a error.
|
||||
*/
|
||||
// The log for warn, warn is something should take attention, but not a error.
|
||||
virtual void warn(const char* tag, int context_id, const char* fmt, ...);
|
||||
/**
|
||||
* log for error, something error occur, do something about the error, ie. close the connection,
|
||||
* but we will donot abort the program.
|
||||
*/
|
||||
// The log for error, something error occur, do something about the error, ie. close the connection,
|
||||
// but we will donot abort the program.
|
||||
virtual void error(const char* tag, int context_id, const char* fmt, ...);
|
||||
};
|
||||
|
||||
/**
|
||||
* the context id manager to identify context, for instance, the green-thread.
|
||||
* usage:
|
||||
* _srs_context->generate_id(); // when thread start.
|
||||
* _srs_context->get_id(); // get current generated id.
|
||||
* int old_id = _srs_context->set_id(1000); // set context id if need to merge thread context.
|
||||
*/
|
||||
// the context for multiple clients.
|
||||
// The context id manager to identify context, for instance, the green-thread.
|
||||
// Usage:
|
||||
// _srs_context->generate_id(); // when thread start.
|
||||
// _srs_context->get_id(); // get current generated id.
|
||||
// int old_id = _srs_context->set_id(1000); // set context id if need to merge thread context.
|
||||
// The context for multiple clients.
|
||||
class ISrsThreadContext
|
||||
{
|
||||
public:
|
||||
ISrsThreadContext();
|
||||
virtual ~ISrsThreadContext();
|
||||
public:
|
||||
/**
|
||||
* generate the id for current context.
|
||||
*/
|
||||
// Generate the id for current context.
|
||||
virtual int generate_id();
|
||||
/**
|
||||
* get the generated id of current context.
|
||||
*/
|
||||
// Get the generated id of current context.
|
||||
virtual int get_id();
|
||||
/**
|
||||
* set the id of current context.
|
||||
* @return the previous id value; 0 if no context.
|
||||
*/
|
||||
// Set the id of current context.
|
||||
// @return the previous id value; 0 if no context.
|
||||
virtual int set_id(int v);
|
||||
};
|
||||
|
||||
// @global user must provides a log object
|
||||
// @global User must provides a log object
|
||||
extern ISrsLog* _srs_log;
|
||||
|
||||
// @global user must implements the LogContext and define a global instance.
|
||||
// @global User must implements the LogContext and define a global instance.
|
||||
extern ISrsThreadContext* _srs_context;
|
||||
|
||||
// donot print method
|
||||
// Log style.
|
||||
// Use __FUNCTION__ to print c method
|
||||
// Use __PRETTY_FUNCTION__ to print c++ class:method
|
||||
#if 1
|
||||
#define srs_verbose(msg, ...) _srs_log->verbose(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#define srs_info(msg, ...) _srs_log->info(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
|
@ -137,7 +113,6 @@ extern ISrsThreadContext* _srs_context;
|
|||
#define srs_warn(msg, ...) _srs_log->warn(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#define srs_error(msg, ...) _srs_log->error(NULL, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#endif
|
||||
// use __FUNCTION__ to print c method
|
||||
#if 0
|
||||
#define srs_verbose(msg, ...) _srs_log->verbose(__FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#define srs_info(msg, ...) _srs_log->info(__FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
|
@ -145,7 +120,6 @@ extern ISrsThreadContext* _srs_context;
|
|||
#define srs_warn(msg, ...) _srs_log->warn(__FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#define srs_error(msg, ...) _srs_log->error(__FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#endif
|
||||
// use __PRETTY_FUNCTION__ to print c++ class:method
|
||||
#if 0
|
||||
#define srs_verbose(msg, ...) _srs_log->verbose(__PRETTY_FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#define srs_info(msg, ...) _srs_log->info(__PRETTY_FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
|
@ -154,7 +128,7 @@ extern ISrsThreadContext* _srs_context;
|
|||
#define srs_error(msg, ...) _srs_log->error(__PRETTY_FUNCTION__, _srs_context->get_id(), msg, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
// TODO: FIXME: add more verbose and info logs.
|
||||
// TODO: FIXME: Add more verbose and info logs.
|
||||
#ifndef SRS_AUTO_VERBOSE
|
||||
#undef srs_verbose
|
||||
#define srs_verbose(msg, ...) (void)0
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -33,160 +33,132 @@
|
|||
class SrsBuffer;
|
||||
class SrsBitBuffer;
|
||||
|
||||
// compare
|
||||
// Basic compare function.
|
||||
#define srs_min(a, b) (((a) < (b))? (a) : (b))
|
||||
#define srs_max(a, b) (((a) < (b))? (b) : (a))
|
||||
|
||||
// read nalu uev.
|
||||
// To read H.264 NALU uev.
|
||||
extern srs_error_t srs_avc_nalu_read_uev(SrsBitBuffer* stream, int32_t& v);
|
||||
extern srs_error_t srs_avc_nalu_read_bit(SrsBitBuffer* stream, int8_t& v);
|
||||
|
||||
// get current system time in srs_utime_t, use cache to avoid performance problem
|
||||
// Get current system time in srs_utime_t, use cache to avoid performance problem
|
||||
extern srs_utime_t srs_get_system_time();
|
||||
extern srs_utime_t srs_get_system_startup_time();
|
||||
// the deamon st-thread will update it.
|
||||
// A daemon st-thread updates it.
|
||||
extern srs_utime_t srs_update_system_time();
|
||||
|
||||
// the any address for listener,
|
||||
// it's "0.0.0.0" for ipv4, and "::" for ipv6.
|
||||
// The "ANY" address to listen, it's "0.0.0.0" for ipv4, and "::" for ipv6.
|
||||
extern std::string srs_any_address4listener();
|
||||
|
||||
// dns resolve utility, return the resolved ip address.
|
||||
// The dns resolve utility, return the resolved ip address.
|
||||
extern std::string srs_dns_resolve(std::string host, int& family);
|
||||
|
||||
// split the host:port to host and port.
|
||||
// Split the host:port to host and port.
|
||||
// @remark the hostport format in <host[:port]>, where port is optional.
|
||||
extern void srs_parse_hostport(const std::string& hostport, std::string& host, int& port);
|
||||
|
||||
// parse the endpoint to ip and port.
|
||||
// @remark hostport format in <[ip:]port>, where ip is default to "0.0.0.0".
|
||||
// Parse the endpoint to ip and port.
|
||||
// @remark The hostport format in <[ip:]port>, where ip is default to "0.0.0.0".
|
||||
extern void srs_parse_endpoint(std::string hostport, std::string& ip, int& port);
|
||||
|
||||
// parse the int64 value to string.
|
||||
// Parse the int64 value to string.
|
||||
extern std::string srs_int2str(int64_t value);
|
||||
// parse the float value to string, precise is 2.
|
||||
// Parse the float value to string, precise is 2.
|
||||
extern std::string srs_float2str(double value);
|
||||
// convert bool to switch value, true to "on", false to "off".
|
||||
// Convert bool to switch value, true to "on", false to "off".
|
||||
extern std::string srs_bool2switch(bool v);
|
||||
|
||||
// whether system is little endian
|
||||
// Whether system is little endian
|
||||
extern bool srs_is_little_endian();
|
||||
|
||||
// replace old_str to new_str of str
|
||||
// Replace old_str to new_str of str
|
||||
extern std::string srs_string_replace(std::string str, std::string old_str, std::string new_str);
|
||||
// trim char in trim_chars of str
|
||||
// Trim char in trim_chars of str
|
||||
extern std::string srs_string_trim_end(std::string str, std::string trim_chars);
|
||||
// trim char in trim_chars of str
|
||||
// Trim char in trim_chars of str
|
||||
extern std::string srs_string_trim_start(std::string str, std::string trim_chars);
|
||||
// remove char in remove_chars of str
|
||||
// Remove char in remove_chars of str
|
||||
extern std::string srs_string_remove(std::string str, std::string remove_chars);
|
||||
// remove first substring from str
|
||||
// Remove first substring from str
|
||||
extern std::string srs_erase_first_substr(std::string str, std::string erase_string);
|
||||
// remove last substring from str
|
||||
// Remove last substring from str
|
||||
extern std::string srs_erase_last_substr(std::string str, std::string erase_string);
|
||||
// whether string end with
|
||||
// Whether string end with
|
||||
extern bool srs_string_ends_with(std::string str, std::string flag);
|
||||
extern bool srs_string_ends_with(std::string str, std::string flag0, std::string flag1);
|
||||
extern bool srs_string_ends_with(std::string str, std::string flag0, std::string flag1, std::string flag2);
|
||||
extern bool srs_string_ends_with(std::string str, std::string flag0, std::string flag1, std::string flag2, std::string flag3);
|
||||
// whether string starts with
|
||||
// Whether string starts with
|
||||
extern bool srs_string_starts_with(std::string str, std::string flag);
|
||||
extern bool srs_string_starts_with(std::string str, std::string flag0, std::string flag1);
|
||||
extern bool srs_string_starts_with(std::string str, std::string flag0, std::string flag1, std::string flag2);
|
||||
extern bool srs_string_starts_with(std::string str, std::string flag0, std::string flag1, std::string flag2, std::string flag3);
|
||||
// whether string contains with
|
||||
// Whether string contains with
|
||||
extern bool srs_string_contains(std::string str, std::string flag);
|
||||
extern bool srs_string_contains(std::string str, std::string flag0, std::string flag1);
|
||||
extern bool srs_string_contains(std::string str, std::string flag0, std::string flag1, std::string flag2);
|
||||
// find the min match in str for flags.
|
||||
// Find the min match in str for flags.
|
||||
extern std::string srs_string_min_match(std::string str, std::vector<std::string> flags);
|
||||
// split the string by flag to array.
|
||||
// Split the string by flag to array.
|
||||
extern std::vector<std::string> srs_string_split(std::string str, std::string flag);
|
||||
extern std::vector<std::string> srs_string_split(std::string str, std::vector<std::string> flags);
|
||||
|
||||
/**
|
||||
* compare the memory in bytes.
|
||||
* @return true if completely equal; otherwise, false.
|
||||
*/
|
||||
// Compare the memory in bytes.
|
||||
// @return true if completely equal; otherwise, false.
|
||||
extern bool srs_bytes_equals(void* pa, void* pb, int size);
|
||||
|
||||
// create dir recursively
|
||||
// Create dir recursively
|
||||
extern srs_error_t srs_create_dir_recursively(std::string dir);
|
||||
|
||||
// whether path exists.
|
||||
// Whether path exists.
|
||||
extern bool srs_path_exists(std::string path);
|
||||
// get the dirname of path, for instance, dirname("/live/livestream")="/live"
|
||||
// Get the dirname of path, for instance, dirname("/live/livestream")="/live"
|
||||
extern std::string srs_path_dirname(std::string path);
|
||||
// get the basename of path, for instance, basename("/live/livestream")="livestream"
|
||||
// Get the basename of path, for instance, basename("/live/livestream")="livestream"
|
||||
extern std::string srs_path_basename(std::string path);
|
||||
// get the filename of path, for instance, filename("livestream.flv")="livestream"
|
||||
// Get the filename of path, for instance, filename("livestream.flv")="livestream"
|
||||
extern std::string srs_path_filename(std::string path);
|
||||
// get the file extension of path, for instance, filext("live.flv")=".flv"
|
||||
// Get the file extension of path, for instance, filext("live.flv")=".flv"
|
||||
extern std::string srs_path_filext(std::string path);
|
||||
|
||||
/**
|
||||
* whether stream starts with the avc NALU in "AnnexB"
|
||||
* from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
||||
* start code must be "N[00] 00 00 01" where N>=0
|
||||
* @param pnb_start_code output the size of start code, must >=3.
|
||||
* NULL to ignore.
|
||||
*/
|
||||
// Whether stream starts with the avc NALU in "AnnexB" from ISO_IEC_14496-10-AVC-2003.pdf, page 211.
|
||||
// The start code must be "N[00] 00 00 01" where N>=0
|
||||
// @param pnb_start_code output the size of start code, must >=3. NULL to ignore.
|
||||
extern bool srs_avc_startswith_annexb(SrsBuffer* stream, int* pnb_start_code = NULL);
|
||||
|
||||
/**
|
||||
* whether stream starts with the aac ADTS
|
||||
* from ISO_IEC_14496-3-AAC-2001.pdf, page 75, 1.A.2.2 ADTS.
|
||||
* start code must be '1111 1111 1111'B, that is 0xFFF
|
||||
*/
|
||||
// Whether stream starts with the aac ADTS from ISO_IEC_14496-3-AAC-2001.pdf, page 75, 1.A.2.2 ADTS.
|
||||
// The start code must be '1111 1111 1111'B, that is 0xFFF
|
||||
extern bool srs_aac_startswith_adts(SrsBuffer* stream);
|
||||
|
||||
/**
|
||||
* cacl the crc32 of bytes in buf, for ffmpeg.
|
||||
*/
|
||||
// Cacl the crc32 of bytes in buf, for ffmpeg.
|
||||
extern uint32_t srs_crc32_mpegts(const void* buf, int size);
|
||||
|
||||
/**
|
||||
* calc the crc32 of bytes in buf by IEEE, for zip.
|
||||
*/
|
||||
// Calc the crc32 of bytes in buf by IEEE, for zip.
|
||||
extern uint32_t srs_crc32_ieee(const void* buf, int size, uint32_t previous = 0);
|
||||
|
||||
/**
|
||||
* Decode a base64-encoded string.
|
||||
*/
|
||||
// Decode a base64-encoded string.
|
||||
extern srs_error_t srs_av_base64_decode(std::string cipher, std::string& plaintext);
|
||||
|
||||
/**
|
||||
* Calculate the output size needed to base64-encode x bytes to a
|
||||
* null-terminated string.
|
||||
*/
|
||||
// Calculate the output size needed to base64-encode x bytes to a null-terminated string.
|
||||
#define SRS_AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1)
|
||||
|
||||
/**
|
||||
* convert hex string to data.
|
||||
* for example, p=config='139056E5A0'
|
||||
* output hex to data={0x13, 0x90, 0x56, 0xe5, 0xa0}
|
||||
*/
|
||||
// Convert hex string to data, for example, p=config='139056E5A0'
|
||||
// The output data in hex {0x13, 0x90, 0x56, 0xe5, 0xa0} as such.
|
||||
extern int srs_hex_to_data(uint8_t* data, const char* p, int size);
|
||||
|
||||
/**
|
||||
* convert data string to hex.
|
||||
*/
|
||||
// Convert data string to hex.
|
||||
extern char *srs_data_to_hex(char *des, const uint8_t *src, int len);
|
||||
|
||||
/**
|
||||
* generate the c0 chunk header for msg.
|
||||
* @param cache, the cache to write header.
|
||||
* @param nb_cache, the size of cache.
|
||||
* @return the size of header. 0 if cache not enough.
|
||||
*/
|
||||
// Generate the c0 chunk header for msg.
|
||||
// @param cache, the cache to write header.
|
||||
// @param nb_cache, the size of cache.
|
||||
// @return The size of header. 0 if cache not enough.
|
||||
extern int srs_chunk_header_c0(int perfer_cid, uint32_t timestamp, int32_t payload_length, int8_t message_type, int32_t stream_id, char* cache, int nb_cache);
|
||||
|
||||
/**
|
||||
* generate the c3 chunk header for msg.
|
||||
* @param cache, the cache to write header.
|
||||
* @param nb_cache, the size of cache.
|
||||
* @return the size of header. 0 if cache not enough.
|
||||
*/
|
||||
// Generate the c3 chunk header for msg.
|
||||
// @param cache, the cache to write header.
|
||||
// @param nb_cache, the size of cache.
|
||||
// @return the size of header. 0 if cache not enough.
|
||||
extern int srs_chunk_header_c3(int perfer_cid, uint32_t timestamp, char* cache, int nb_cache);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue