{$ifndef NO_SMART_LINK}
{$smartlink on}
{$endif}
unit lrtmp;
interface
{$PACKRECORDS C}
uses
ctypes,
sockets;
Const
{$ifdef windows}
LibRtmp = 'librtmp'; // Library name
{ matching lib version for librtmp.dll, needed for initialization }
RTMP_LIBRTMP_VER_STRING='2.3';
{$else windows}
LibRtmp = 'rtmp'; // Library name
{ matching lib version for librtmp, needed for initialization }
RTMP_LIBRTMP_VER_STRING='2.3';
{$endif windows}
{$I inttypes}
{AMF Constants}
Const
AMF_NUMBER = 0;
AMF_BOOLEAN = 1;
AMF_STRING = 2;
AMF_OBJECT = 3;
AMF_MOVIECLIP = 4;
AMF_NULL = 5;
AMF_UNDEFINED = 6;
AMF_REFERENCE = 7;
AMF_ECMA_ARRAY = 8;
AMF_OBJECT_END = 9;
AMF_STRICT_ARRAY = 10;
AMF_DATE = 11;
AMF_LONG_STRING = 12;
AMF_UNSUPPORTED = 13;
AMF_RECORDSET = 14;
AMF_XML_DOC = 15;
AMF_TYPED_OBJECT = 16;
AMF_AVMPLUS = 17;
AMF_INVALID = $ff;
AMF3_UNDEFINED = 0;
AMF3_NULL = 1;
AMF3_FALSE = 2;
AMF3_TRUE = 3;
AMF3_INTEGER = 4;
AMF3_DOUBLE = 5;
AMF3_STRING = 6;
AMF3_XML_DOC = 7;
AMF3_DATE = 8;
AMF3_ARRAY = 9;
AMF3_OBJECT = 10;
AMF3_XML = 11;
AMF3_BYTE_ARRAY = 12;
{RTMP Constants}
const
RTMP_LIB_VERSION = $020300;
RTMP_FEATURE_HTTP = $01;
RTMP_FEATURE_ENC = $02;
RTMP_FEATURE_SSL = $04;
RTMP_FEATURE_MFP = $08;
RTMP_FEATURE_WRITE = $10;
RTMP_FEATURE_HTTP2 = $20;
RTMP_PROTOCOL_UNDEFINED = -(1);
RTMP_PROTOCOL_RTMP = 0;
RTMP_PROTOCOL_RTMPE = RTMP_FEATURE_ENC;
RTMP_PROTOCOL_RTMPT = RTMP_FEATURE_HTTP;
RTMP_PROTOCOL_RTMPS = RTMP_FEATURE_SSL;
RTMP_PROTOCOL_RTMPTE = RTMP_FEATURE_HTTP or RTMP_FEATURE_ENC;
RTMP_PROTOCOL_RTMPTS = RTMP_FEATURE_HTTP or RTMP_FEATURE_SSL;
RTMP_PROTOCOL_RTMFP = RTMP_FEATURE_MFP;
RTMP_DEFAULT_CHUNKSIZE = 128;
RTMP_BUFFER_CACHE_SIZE = 16*1024;
RTMP_CHANNELS = 65600;
RTMP_PACKET_TYPE_AUDIO = $08;
RTMP_PACKET_TYPE_VIDEO = $09;
RTMP_PACKET_TYPE_INFO = $12;
RTMP_MAX_HEADER_SIZE = 18;
RTMP_PACKET_SIZE_LARGE = 0;
RTMP_PACKET_SIZE_MEDIUM = 1;
RTMP_PACKET_SIZE_SMALL = 2;
RTMP_PACKET_SIZE_MINIMUM = 3;
RTMP_LF_AUTH = $0001;
RTMP_LF_LIVE = $0002;
RTMP_LF_SWFV = $0004;
RTMP_LF_PLST = $0008;
RTMP_LF_BUFX = $0010;
RTMP_LF_FTCU = $0020;
RTMP_SWF_HASHLEN = 32;
RTMP_READ_HEADER = $01;
RTMP_READ_RESUME = $02;
RTMP_READ_NO_IGNORE = $04;
RTMP_READ_GOTKF = $08;
RTMP_READ_GOTFLVK = $10;
RTMP_READ_SEEKING = $20;
RTMP_READ_COMPLETE = -(3);
RTMP_READ_ERROR = -(2);
RTMP_READ_EOF = -(1);
RTMP_READ_IGNORE = 0;
{AMF Types}
Type
AVal = record
av_val : pcchar;
av_len : cint;
end;
PAVal = ^AVal;
AMF3ClassDef = record
cd_name : AVal;
cd_externalizable : cchar;
cd_dynamic : cchar;
cd_num : cint;
cd_props : PAVal;
end;
PAMF3ClassDef = ^AMF3ClassDef;
AMF3DataType = Longint;
PAMF3DataType = ^AMF3DataType;
AMFDataType = Longint;
PAMFDataType = ^AMFDataType;
AMFObjectProperty = record
{undefined structure}
end;
PAMFObjectProperty = ^AMFObjectProperty;
AMFObject = record
o_num : cint;
o_props : PAMFObjectProperty;
end;
PAMFObject = ^AMFObject;
{RTMP Types}
Type
TArray0toRTMP_SWF_HASHLEN1OfUint8_t = array[0..(RTMP_SWF_HASHLEN)-1] of uint8_t;
TArray0toRTMP_SWF_HASHLEN101OfCchar = array[0..(RTMP_SWF_HASHLEN+10)-1] of cchar;
TArray0toRTMP_MAX_HEADER_SIZE1OfCchar = array[0..(RTMP_MAX_HEADER_SIZE)-1] of cchar;
TArray0toRTMP_CHANNELS1OfCint = array[0..(RTMP_CHANNELS)-1] of cint;
TArray0toRTMP_BUFFER_CACHE_SIZE1OfCchar = array[0..(RTMP_BUFFER_CACHE_SIZE)-1] of cchar;
TArray0to6OfPcchar = array[0..6] of pcchar;
RTMPChunk = record
c_headerSize : cint;
c_chunkSize : cint;
c_chunk : pcchar;
c_header : TArray0toRTMP_MAX_HEADER_SIZE1OfCchar;
end;
PRTMPChunk = ^RTMPChunk;
RTMPPacket = record
m_headerType : uint8_t;
m_packetType : uint8_t;
m_hasAbsTimestamp : uint8_t;
m_nChannel : cint;
m_nTimeStamp : uint32_t;
m_nInfoField2 : int32_t;
m_nBodySize : uint32_t;
m_nBytesRead : uint32_t;
m_chunk : PRTMPChunk;
m_body : pcchar;
end;
PRTMPPacket = ^RTMPPacket;
TArray0toRTMP_CHANNELS1OfPRTMPPacket = array[0..(RTMP_CHANNELS)-1] of PRTMPPacket;
RTMPSockBuf = record
sb_socket : cint;
sb_size : cint;
sb_start : pcchar;
sb_buf : TArray0toRTMP_BUFFER_CACHE_SIZE1OfCchar;
sb_timedout : cint;
sb_ssl : pointer;
end;
RTMP_LNK = record
hostname : AVal;
sockshost : AVal;
playpath0 : AVal;
playpath : AVal;
tcUrl : AVal;
swfUrl : AVal;
pageUrl : AVal;
app : AVal;
auth : AVal;
flashVer : AVal;
subscribepath : AVal;
token : AVal;
extras : AMFObject;
edepth : cint;
seekTime : cint;
stopTime : cint;
lFlags : cint;
swfAge : cint;
protocol : cint;
timeout : cint;
socksport : cushort;
port : cushort;
dh : pointer;
rc4keyIn : pointer;
rc4keyOut : pointer;
SWFSize : uint32_t;
SWFHash : TArray0toRTMP_SWF_HASHLEN1OfUint8_t;
SWFVerificationResponse : TArray0toRTMP_SWF_HASHLEN101OfCchar;
end;
RTMP_READ = record
buf : pcchar;
bufpos : pcchar;
buflen : cuint;
timestamp : uint32_t;
dataType : uint8_t;
flags : uint8_t;
status : int8_t;
initialFrameType : uint8_t;
nResumeTS : uint32_t;
metaHeader : pcchar;
initialFrame : pcchar;
nMetaHeaderSize : uint32_t;
nInitialFrameSize : uint32_t;
nIgnoredFrameCounter : uint32_t;
nIgnoredFlvFrameCounter : uint32_t;
end;
RTMP_METHOD = record
name : AVal;
num : cint;
end;
PRTMP_METHOD = ^RTMP_METHOD;
RTMP = record
m_inChunkSize : cint;
m_outChunkSize : cint;
m_nBWCheckCounter : cint;
m_nBytesIn : cint;
m_nBytesInSent : cint;
m_nBufferMS : cint;
m_stream_id : cint;
m_mediaChannel : cint;
m_mediaStamp : uint32_t;
m_pauseStamp : uint32_t;
m_pausing : cint;
m_nServerBW : cint;
m_nClientBW : cint;
m_nClientBW2 : uint8_t;
m_bPlaying : uint8_t;
m_bSendEncoding : uint8_t;
m_bSendCounter : uint8_t;
m_numInvokes : cint;
m_numCalls : cint;
m_methodCalls : PRTMP_METHOD;
m_vecChannelsIn : TArray0toRTMP_CHANNELS1OfPRTMPPacket;
m_vecChannelsOut : TArray0toRTMP_CHANNELS1OfPRTMPPacket;
m_channelTimestamp : TArray0toRTMP_CHANNELS1OfCint;
m_fAudioCodecs : double;
m_fVideoCodecs : double;
m_fEncoding : double;
m_fDuration : double;
m_msgCounter : cint;
m_polling : cint;
m_resplen : cint;
m_unackd : cint;
m_clientID : AVal;
m_read : RTMP_READ;
m_write : RTMPPacket;
m_sb : RTMPSockBuf;
Link : RTMP_LNK;
end;
PRTMP = ^RTMP;
PRTMP_LNK = ^RTMP_LNK;
PRTMP_READ = ^RTMP_READ;
PRTMPSockBuf = ^RTMPSockBuf;
{RTMP Variables}
var
RTMPProtocolStringsLower : TArray0to6OfPcchar;cvar;external;
RTMP_DefaultFlashVer : AVal;cvar;external;
RTMP_ctrlC : cint;cvar;external;
{AMF Functions}
function AMF_EncodeString(output:pcchar; outend:pcchar; var str:AVal):pcchar;cdecl;external External_library name 'AMF_EncodeString';
function AMF_EncodeNumber(output:pcchar; outend:pcchar; dVal:double):pcchar;cdecl;external External_library name 'AMF_EncodeNumber';
function AMF_EncodeInt16(output:pcchar; outend:pcchar; nVal:cshort):pcchar;cdecl;external External_library name 'AMF_EncodeInt16';
function AMF_EncodeInt24(output:pcchar; outend:pcchar; nVal:cint):pcchar;cdecl;external External_library name 'AMF_EncodeInt24';
function AMF_EncodeInt32(output:pcchar; outend:pcchar; nVal:cint):pcchar;cdecl;external External_library name 'AMF_EncodeInt32';
function AMF_EncodeBoolean(output:pcchar; outend:pcchar; bVal:cint):pcchar;cdecl;external External_library name 'AMF_EncodeBoolean';
function AMF_EncodeNamedString(output:pcchar; outend:pcchar; var name:AVal; var value:AVal):pcchar;cdecl;external External_library name 'AMF_EncodeNamedString';
function AMF_EncodeNamedNumber(output:pcchar; outend:pcchar; var name:AVal; dVal:double):pcchar;cdecl;external External_library name 'AMF_EncodeNamedNumber';
function AMF_EncodeNamedBoolean(output:pcchar; outend:pcchar; var name:AVal; bVal:cint):pcchar;cdecl;external External_library name 'AMF_EncodeNamedBoolean';
function AMF_DecodeInt16(data:pcchar):cushort;cdecl;external External_library name 'AMF_DecodeInt16';
function AMF_DecodeInt24(data:pcchar):cuint;cdecl;external External_library name 'AMF_DecodeInt24';
function AMF_DecodeInt32(data:pcchar):cuint;cdecl;external External_library name 'AMF_DecodeInt32';
procedure AMF_DecodeString(data:pcchar; var str:AVal);cdecl;external External_library name 'AMF_DecodeString';
procedure AMF_DecodeLongString(data:pcchar; var str:AVal);cdecl;external External_library name 'AMF_DecodeLongString';
function AMF_DecodeBoolean(data:pcchar):cint;cdecl;external External_library name 'AMF_DecodeBoolean';
function AMF_DecodeNumber(data:pcchar):double;cdecl;external External_library name 'AMF_DecodeNumber';
function AMF_Encode(var obj:AMFObject; pBuffer:pcchar; pBufEnd:pcchar):pcchar;cdecl;external External_library name 'AMF_Encode';
function AMF_Decode(var obj:AMFObject; pBuffer:pcchar; nSize:cint; bDecodeName:cint):cint;cdecl;external External_library name 'AMF_Decode';
function AMF_DecodeArray(var obj:AMFObject; pBuffer:pcchar; nSize:cint; nArrayLen:cint; bDecodeName:cint):cint;cdecl;external External_library name 'AMF_DecodeArray';
function AMF3_Decode(var obj:AMFObject; pBuffer:pcchar; nSize:cint; bDecodeName:cint):cint;cdecl;external External_library name 'AMF3_Decode';
procedure AMF_Dump(var obj:AMFObject);cdecl;external External_library name 'AMF_Dump';
procedure AMF_Reset(var obj:AMFObject);cdecl;external External_library name 'AMF_Reset';
procedure AMF_AddProp(var obj:AMFObject; var prop:AMFObjectProperty);cdecl;external External_library name 'AMF_AddProp';
function AMF_CountProp(var obj:AMFObject):cint;cdecl;external External_library name 'AMF_CountProp';
function AMF_GetProp(var obj:AMFObject; var name:AVal; nIndex:cint):PAMFObjectProperty;cdecl;external External_library name 'AMF_GetProp';
function AMFProp_GetType(var prop:AMFObjectProperty):AMFDataType;cdecl;external External_library name 'AMFProp_GetType';
procedure AMFProp_SetNumber(var prop:AMFObjectProperty; dval:double);cdecl;external External_library name 'AMFProp_SetNumber';
procedure AMFProp_SetBoolean(var prop:AMFObjectProperty; bflag:cint);cdecl;external External_library name 'AMFProp_SetBoolean';
procedure AMFProp_SetString(var prop:AMFObjectProperty; var str:AVal);cdecl;external External_library name 'AMFProp_SetString';
procedure AMFProp_SetObject(var prop:AMFObjectProperty; var obj:AMFObject);cdecl;external External_library name 'AMFProp_SetObject';
procedure AMFProp_GetName(var prop:AMFObjectProperty; var name:AVal);cdecl;external External_library name 'AMFProp_GetName';
procedure AMFProp_SetName(var prop:AMFObjectProperty; var name:AVal);cdecl;external External_library name 'AMFProp_SetName';
function AMFProp_GetNumber(var prop:AMFObjectProperty):double;cdecl;external External_library name 'AMFProp_GetNumber';
function AMFProp_GetBoolean(var prop:AMFObjectProperty):cint;cdecl;external External_library name 'AMFProp_GetBoolean';
procedure AMFProp_GetString(var prop:AMFObjectProperty; var str:AVal);cdecl;external External_library name 'AMFProp_GetString';
procedure AMFProp_GetObject(var prop:AMFObjectProperty; var obj:AMFObject);cdecl;external External_library name 'AMFProp_GetObject';
function AMFProp_IsValid(var prop:AMFObjectProperty):cint;cdecl;external External_library name 'AMFProp_IsValid';
function AMFProp_Encode(var prop:AMFObjectProperty; pBuffer:pcchar; pBufEnd:pcchar):pcchar;cdecl;external External_library name 'AMFProp_Encode';
function AMF3Prop_Decode(var prop:AMFObjectProperty; pBuffer:pcchar; nSize:cint; bDecodeName:cint):cint;cdecl;external External_library name 'AMF3Prop_Decode';
function AMFProp_Decode(var prop:AMFObjectProperty; pBuffer:pcchar; nSize:cint; bDecodeName:cint):cint;cdecl;external External_library name 'AMFProp_Decode';
procedure AMFProp_Dump(var prop:AMFObjectProperty);cdecl;external External_library name 'AMFProp_Dump';
procedure AMFProp_Reset(var prop:AMFObjectProperty);cdecl;external External_library name 'AMFProp_Reset';
procedure AMF3CD_AddProp(var cd:AMF3ClassDef; var prop:AVal);cdecl;external External_library name 'AMF3CD_AddProp';
function AMF3CD_GetProp(var cd:AMF3ClassDef; idx:cint):PAVal;cdecl;external External_library name 'AMF3CD_GetProp';
{RTMP Functions}
procedure RTMPPacket_Reset(var p:RTMPPacket);cdecl;external External_library name 'RTMPPacket_Reset';
procedure RTMPPacket_Dump(var p:RTMPPacket);cdecl;external External_library name 'RTMPPacket_Dump';
function RTMPPacket_Alloc(var p:RTMPPacket; nSize:cint):cint;cdecl;external External_library name 'RTMPPacket_Alloc';
procedure RTMPPacket_Free(var p:RTMPPacket);cdecl;external External_library name 'RTMPPacket_Free';
function RTMP_GetTime:uint32_t;cdecl;external External_library name 'RTMP_GetTime';
function RTMP_ParseURL(url:pcchar; var protocol:cint; var host:AVal; var port:cuint; var playpath:AVal;
var app:AVal):cint;cdecl;external External_library name 'RTMP_ParseURL';
procedure RTMP_ParsePlaypath(var input:AVal; var output:AVal);cdecl;external External_library name 'RTMP_ParsePlaypath';
procedure RTMP_SetBufferMS(var r:RTMP; size:cint);cdecl;external External_library name 'RTMP_SetBufferMS';
procedure RTMP_UpdateBufferMS(var r:RTMP);cdecl;external External_library name 'RTMP_UpdateBufferMS';
function RTMP_SetOpt(var r:RTMP; var opt:AVal; var arg:AVal):cint;cdecl;external External_library name 'RTMP_SetOpt';
function RTMP_SetupURL(var r:RTMP; url:pcchar):cint;cdecl;external External_library name 'RTMP_SetupURL';
procedure RTMP_SetupStream(var r:RTMP; protocol:cint; var hostname:AVal; port:cuint; var sockshost:AVal;
var playpath:AVal; var tcUrl:AVal; var swfUrl:AVal; var pageUrl:AVal; var app:AVal;
var auth:AVal; var swfSHA256Hash:AVal; swfSize:uint32_t; var flashVer:AVal; var subscribepath:AVal;
dStart:cint; dStop:cint; bLiveStream:cint; timeout:clong);cdecl;external External_library name 'RTMP_SetupStream';
function RTMP_Connect(var r:RTMP; var cp:RTMPPacket):cint;cdecl;external External_library name 'RTMP_Connect';
function RTMP_Connect0(var r:RTMP; var svc:sockaddr):cint;cdecl;external External_library name 'RTMP_Connect0';
function RTMP_Connect1(var r:RTMP; var cp:RTMPPacket):cint;cdecl;external External_library name 'RTMP_Connect1';
function RTMP_Serve(var r:RTMP):cint;cdecl;external External_library name 'RTMP_Serve';
function RTMP_ReadPacket(var r:RTMP; var packet:RTMPPacket):cint;cdecl;external External_library name 'RTMP_ReadPacket';
function RTMP_SendPacket(var r:RTMP; var packet:RTMPPacket; queue:cint):cint;cdecl;external External_library name 'RTMP_SendPacket';
function RTMP_SendChunk(var r:RTMP; var chunk:RTMPChunk):cint;cdecl;external External_library name 'RTMP_SendChunk';
function RTMP_IsConnected(var r:RTMP):cint;cdecl;external External_library name 'RTMP_IsConnected';
function RTMP_Socket(var r:RTMP):cint;cdecl;external External_library name 'RTMP_Socket';
function RTMP_IsTimedout(var r:RTMP):cint;cdecl;external External_library name 'RTMP_IsTimedout';
function RTMP_GetDuration(var r:RTMP):double;cdecl;external External_library name 'RTMP_GetDuration';
function RTMP_ToggleStream(var r:RTMP):cint;cdecl;external External_library name 'RTMP_ToggleStream';
function RTMP_ConnectStream(var r:RTMP; seekTime:cint):cint;cdecl;external External_library name 'RTMP_ConnectStream';
function RTMP_ReconnectStream(var r:RTMP; seekTime:cint):cint;cdecl;external External_library name 'RTMP_ReconnectStream';
procedure RTMP_DeleteStream(var r:RTMP);cdecl;external External_library name 'RTMP_DeleteStream';
function RTMP_GetNextMediaPacket(var r:RTMP; var packet:RTMPPacket):cint;cdecl;external External_library name 'RTMP_GetNextMediaPacket';
function RTMP_ClientPacket(var r:RTMP; var packet:RTMPPacket):cint;cdecl;external External_library name 'RTMP_ClientPacket';
procedure RTMP_Init(var r:RTMP);cdecl;external External_library name 'RTMP_Init';
procedure RTMP_Close(var r:RTMP);cdecl;external External_library name 'RTMP_Close';
function RTMP_Alloc:PRTMP;cdecl;external External_library name 'RTMP_Alloc';
procedure RTMP_Free(var r:RTMP);cdecl;external External_library name 'RTMP_Free';
procedure RTMP_EnableWrite(var r:RTMP);cdecl;external External_library name 'RTMP_EnableWrite';
function RTMP_LibVersion:cint;cdecl;external External_library name 'RTMP_LibVersion';
procedure RTMP_UserInterrupt;cdecl;external External_library name 'RTMP_UserInterrupt';
function RTMP_SendCtrl(var r:RTMP; nType:cshort; nObject:cuint; nTime:cuint):cint;cdecl;external External_library name 'RTMP_SendCtrl';
function RTMP_SendPause(var r:RTMP; DoPause:cint; dTime:cint):cint;cdecl;external External_library name 'RTMP_SendPause';
function RTMP_Pause(var r:RTMP; DoPause:cint):cint;cdecl;external External_library name 'RTMP_Pause';
function RTMP_FindFirstMatchingProperty(var obj:AMFObject; var name:AVal; var p:AMFObjectProperty):cint;cdecl;external External_library name 'RTMP_FindFirstMatchingProperty';
function RTMPSockBuf_Fill(var sb:RTMPSockBuf):cint;cdecl;external External_library name 'RTMPSockBuf_Fill';
function RTMPSockBuf_Send(var sb:RTMPSockBuf; buf:pcchar; len:cint):cint;cdecl;external External_library name 'RTMPSockBuf_Send';
function RTMPSockBuf_Close(var sb:RTMPSockBuf):cint;cdecl;external External_library name 'RTMPSockBuf_Close';
function RTMP_SendCreateStream(var r:RTMP):cint;cdecl;external External_library name 'RTMP_SendCreateStream';
function RTMP_SendSeek(var r:RTMP; dTime:cint):cint;cdecl;external External_library name 'RTMP_SendSeek';
function RTMP_SendServerBW(var r:RTMP):cint;cdecl;external External_library name 'RTMP_SendServerBW';
function RTMP_SendClientBW(var r:RTMP):cint;cdecl;external External_library name 'RTMP_SendClientBW';
procedure RTMP_DropRequest(var r:RTMP; i:cint; freeit:cint);cdecl;external External_library name 'RTMP_DropRequest';
function RTMP_ReadData(var r:RTMP; buf:pcchar; size:cint):cint;cdecl;external External_library name 'RTMP_ReadData';
function RTMP_WriteData(var r:RTMP; buf:pcchar; size:cint):cint;cdecl;external External_library name 'RTMP_WriteData';
function RTMP_HashSWF(url:pcchar; var size:cuint; hash:pcuchar; age:cint):cint;cdecl;external External_library name 'RTMP_HashSWF';
implementation
end.