librtmp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@ruby-librtmp --create
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+
3
+ # Specify your gem's dependencies in librtmp.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ ruby-librtmp
2
+ ============
3
+
4
+ Ruby bindings to librtmp (from rtmpdump)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/librtmp.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'librtmp/version'
2
+
3
+ module Librtmp
4
+
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'librtmp/ffi/amf'
2
+ require 'librtmp/ffi/rtmp'
3
+
4
+ module Librtmp
5
+ module FFI
6
+ end
7
+ end
@@ -0,0 +1,161 @@
1
+ require 'ffi'
2
+
3
+ module Librtmp
4
+ module FFI
5
+ extend ::FFI::Library
6
+
7
+ ffi_lib 'librtmp'
8
+
9
+ AMFDataType = enum(
10
+ :amf_number, 0,
11
+ :amf_boolean, :amf_string, :amf_object,
12
+ :amf_movieclip, :amf_null, :amf_undefined,
13
+ :amf_reference, :amf_ecma_array, :amf_object_end,
14
+ :amf_strict_array, :amf_date, :amf_long_string,
15
+ :amf_unsupported, :amf_recordset, :amf_xml_doc,
16
+ :amf_typed_object, :amf_avmplus, :amf_invalid, 0xff
17
+ )
18
+
19
+ AMF3DataType = enum(
20
+ :amf3_undefined, 0,
21
+ :amf3_null, :amf3_false, :amf3_true,
22
+ :amf3_integer, :amf3_double, :amf3_string,
23
+ :amf3_xml_doc, :amf3_date, :amf3_array,
24
+ :amf3_object, :amf3_xml, :amf3_byter_array
25
+ )
26
+
27
+ class AVal < ::FFI::Struct
28
+ layout :av_val, :pointer,
29
+ :av_len, :int
30
+ end
31
+
32
+ class AMFObject < ::FFI::Struct
33
+ layout :o_num, :int
34
+ end
35
+
36
+ class AMFObjectPropertyPVu < ::FFI::Union
37
+ layout :p_number, :double,
38
+ :p_aval, AVal,
39
+ :p_object, AMFObject
40
+ end
41
+
42
+ class AMFObjectProperty < ::FFI::Struct
43
+ layout :p_name, AVal,
44
+ :p_type, AMFDataType,
45
+ :p_vu, AMFObjectPropertyPVu,
46
+ :p_UTCoffset, :int16
47
+ end
48
+
49
+ class AMFObject < ::FFI::Struct
50
+ layout :o_props, AMFObjectProperty
51
+ end
52
+
53
+ class AMF3ClassDef < ::FFI::Struct
54
+ layout :cd_name, AVal,
55
+ :cd_externalizable, :char,
56
+ :cd_dynamic, :char,
57
+ :cd_num, :int,
58
+ :cd_props, :pointer
59
+ end
60
+
61
+ # char *AMF_EncodeString(char *output, char *outend, const AVal * str);
62
+ # char *AMF_EncodeNumber(char *output, char *outend, double dVal);
63
+ # char *AMF_EncodeInt16(char *output, char *outend, short nVal);
64
+ # char *AMF_EncodeInt24(char *output, char *outend, int nVal);
65
+ # char *AMF_EncodeInt32(char *output, char *outend, int nVal);
66
+ # char *AMF_EncodeBoolean(char *output, char *outend, int bVal);
67
+ attach_function :AMF_EncodeString, [:pointer, :pointer, :pointer], :pointer
68
+ attach_function :AMF_EncodeNumber, [:pointer, :pointer, :double], :pointer
69
+ attach_function :AMF_EncodeInt16, [:pointer, :pointer, :short], :pointer
70
+ attach_function :AMF_EncodeInt24, [:pointer, :pointer, :int], :pointer
71
+ attach_function :AMF_EncodeInt32, [:pointer, :pointer, :int], :pointer
72
+ attach_function :AMF_EncodeBoolean, [:pointer, :pointer, :int], :pointer
73
+
74
+ # /* Shortcuts for AMFProp_Encode */
75
+ # char *AMF_EncodeNamedString(char *output, char *outend, const AVal * name, const AVal * value);
76
+ # char *AMF_EncodeNamedNumber(char *output, char *outend, const AVal * name, double dVal);
77
+ # char *AMF_EncodeNamedBoolean(char *output, char *outend, const AVal * name, int bVal);
78
+ attach_function :AMF_EncodeNamedString, [:pointer, :pointer, AVal, AVal], :pointer
79
+ attach_function :AMF_EncodeNamedNumber, [:pointer, :pointer, AVal, :double], :pointer
80
+ attach_function :AMF_EncodeNamedBoolean, [:pointer, :pointer, AVal, :int], :pointer
81
+
82
+ # unsigned short AMF_DecodeInt16(const char *data);
83
+ # unsigned int AMF_DecodeInt24(const char *data);
84
+ # unsigned int AMF_DecodeInt32(const char *data);
85
+ # void AMF_DecodeString(const char *data, AVal * str);
86
+ # void AMF_DecodeLongString(const char *data, AVal * str);
87
+ # int AMF_DecodeBoolean(const char *data);
88
+ # double AMF_DecodeNumber(const char *data);
89
+ attach_function :AMF_DecodeInt16, [:string], :ushort
90
+ attach_function :AMF_DecodeInt24, [:string], :uint
91
+ attach_function :AMF_DecodeInt32, [:string], :uint
92
+ attach_function :AMF_DecodeString, [:string, AVal], :void
93
+ attach_function :AMF_DecodeLongString, [:string, AVal], :void
94
+ attach_function :AMF_DecodeBoolean, [:string], :int
95
+ attach_function :AMF_DecodeNumber, [:string], :double
96
+
97
+ # char *AMF_Encode(AMFObject * obj, char *pBuffer, char *pBufEnd);
98
+ # int AMF_Decode(AMFObject * obj, const char *pBuffer, int nSize, int bDecodeName);
99
+ # int AMF_DecodeArray(AMFObject * obj, const char *pBuffer, int nSize, int nArrayLen, int bDecodeName);
100
+ # int AMF3_Decode(AMFObject * obj, const char *pBuffer, int nSize, int bDecodeName);
101
+ # void AMF_Dump(AMFObject * obj);
102
+ # void AMF_Reset(AMFObject * obj);
103
+ attach_function :AMF_Encode, [AMFObject, :pointer, :pointer], :pointer
104
+ attach_function :AMF_Decode, [AMFObject, :string, :int, :int], :int
105
+ attach_function :AMF_DecodeArray, [AMFObject, :string, :int, :int, :int], :int
106
+ attach_function :AMF3_Decode, [AMFObject, :string, :int, :int], :int
107
+ attach_function :AMF_Dump, [AMFObject], :void
108
+ attach_function :AMF_Reset, [AMFObject], :void
109
+
110
+ # void AMF_AddProp(AMFObject * obj, const AMFObjectProperty * prop);
111
+ # int AMF_CountProp(AMFObject * obj);
112
+ # AMFObjectProperty *AMF_GetProp(AMFObject * obj, const AVal * name, int nIndex);
113
+ attach_function :AMF_AddProp, [AMFObject, AMFObjectProperty], :void
114
+ attach_function :AMF_CountProp, [AMFObject], :int
115
+ attach_function :AMF_GetProp, [AMFObject, AVal, :int], AMFObjectProperty
116
+
117
+ # AMFDataType AMFProp_GetType(AMFObjectProperty * prop);
118
+ # void AMFProp_SetNumber(AMFObjectProperty * prop, double dval);
119
+ # void AMFProp_SetBoolean(AMFObjectProperty * prop, int bflag);
120
+ # void AMFProp_SetString(AMFObjectProperty * prop, AVal * str);
121
+ # void AMFProp_SetObject(AMFObjectProperty * prop, AMFObject * obj);
122
+ attach_function :AMFProp_GetType, [AMFObjectProperty], AMFDataType
123
+ #attach_function :AMFProp_SetNumber, [AMFObjectProperty, :double], :void
124
+ #attach_function :AMFProp_SetBoolean, [AMFObjectProperty, :int], :void
125
+ #attach_function :AMFProp_SetString, [AMFObjectProperty, AVal], :void
126
+ #attach_function :AMFProp_SetObject, [AMFObjectProperty, AMFObject], :void
127
+
128
+ # void AMFProp_GetName(AMFObjectProperty * prop, AVal * name);
129
+ # void AMFProp_SetName(AMFObjectProperty * prop, AVal * name);
130
+ # double AMFProp_GetNumber(AMFObjectProperty * prop);
131
+ # int AMFProp_GetBoolean(AMFObjectProperty * prop);
132
+ # void AMFProp_GetString(AMFObjectProperty * prop, AVal * str);
133
+ # void AMFProp_GetObject(AMFObjectProperty * prop, AMFObject * obj);
134
+ attach_function :AMFProp_GetName, [AMFObjectProperty, AVal], :void
135
+ attach_function :AMFProp_SetName, [AMFObjectProperty, AVal], :void
136
+ attach_function :AMFProp_GetNumber, [AMFObjectProperty], :double
137
+ attach_function :AMFProp_GetBoolean, [AMFObjectProperty], :int
138
+ attach_function :AMFProp_GetString, [AMFObjectProperty, AVal], :void
139
+ attach_function :AMFProp_GetObject, [AMFObjectProperty, AMFObject], :void
140
+
141
+ # int AMFProp_IsValid(AMFObjectProperty * prop);
142
+ attach_function :AMFProp_IsValid, [AMFObjectProperty], :int
143
+
144
+ # char *AMFProp_Encode(AMFObjectProperty * prop, char *pBuffer, char *pBufEnd);
145
+ # int AMF3Prop_Decode(AMFObjectProperty * prop, const char *pBuffer, int nSize, int bDecodeName);
146
+ # int AMFProp_Decode(AMFObjectProperty * prop, const char *pBuffer, int nSize, int bDecodeName);
147
+ attach_function :AMFProp_Encode, [AMFObjectProperty, :pointer, :pointer], :pointer
148
+ attach_function :AMF3Prop_Decode, [AMFObjectProperty, :pointer, :int, :int], :int
149
+ attach_function :AMFProp_Decode, [AMFObjectProperty, :pointer, :int, :int], :int
150
+
151
+ # void AMFProp_Dump(AMFObjectProperty * prop);
152
+ # void AMFProp_Reset(AMFObjectProperty * prop);
153
+ attach_function :AMFProp_Dump, [AMFObjectProperty], :void
154
+ attach_function :AMFProp_Reset, [AMFObjectProperty], :void
155
+
156
+ # void AMF3CD_AddProp(AMF3ClassDef * cd, AVal * prop);
157
+ # AVal *AMF3CD_GetProp(AMF3ClassDef * cd, int idx);
158
+ attach_function :AMF3CD_AddProp, [AMF3ClassDef, AVal], :void
159
+ attach_function :AMF3CD_GetProp, [AMF3ClassDef, :int], AVal
160
+ end
161
+ end
@@ -0,0 +1,240 @@
1
+ require 'ffi'
2
+ require 'librtmp/ffi/amf'
3
+
4
+ module Librtmp
5
+ module FFI
6
+ extend ::FFI::Library
7
+
8
+ ffi_lib 'librtmp'
9
+
10
+ RTMP_MAX_HEADER_SIZE = 18
11
+ RTMP_BUFFER_CACHE_SIZE = (16*1024)
12
+ RTMP_CHANNELS = 65600
13
+ RTMP_DEFAULT_CHUNKSIZE = 128
14
+
15
+ class RTMPChunk < ::FFI::Struct
16
+ layout :c_headerSize, :int,
17
+ :c_chunkSize, :int,
18
+ :c_chunk, :pointer,
19
+ :c_header, [:char, RTMP_MAX_HEADER_SIZE]
20
+ end
21
+
22
+ class RTMPPacket < ::FFI::Struct
23
+ layout :m_headerType, :uint8,
24
+ :m_packetType, :uint8,
25
+ :m_hasAbsTimestamp, :uint8,
26
+ :m_nChannel, :int,
27
+ :m_nTimestamp, :uint32,
28
+ :m_nInfoField2, :int32,
29
+ :m_nBodySize, :uint32,
30
+ :m_nBytesRead, :uint32,
31
+ :m_chunk, RTMPChunk,
32
+ :m_body, :pointer
33
+ end
34
+
35
+ class RTMPSockBuf < ::FFI::Struct
36
+ layout :sb_socket, :int,
37
+ :sb_size, :int,
38
+ :sb_start, :pointer,
39
+ :sb_buf, [:char, RTMP_BUFFER_CACHE_SIZE],
40
+ :sb_timedout, :int,
41
+ :sb_ssl, :pointer
42
+ end
43
+
44
+ RTMP_LF_AUTH = 0x0001
45
+ RTMP_LF_LIVE = 0x0002
46
+ RTMP_LF_SWFV = 0x0004
47
+ RTMP_LF_PLST = 0x0008
48
+ RTMP_LF_BUFX = 0x0010
49
+ RTMP_LF_FTCU = 0x0020
50
+
51
+ # typedef struct RTMP_LNK
52
+ # {
53
+ # #ifdef CRYPTO
54
+ # #define RTMP_SWF_HASHLEN 32
55
+ # void *dh; /* for encryption */
56
+ # void *rc4keyIn;
57
+ # void *rc4keyOut;
58
+ #
59
+ # uint32_t SWFSize;
60
+ # uint8_t SWFHash[RTMP_SWF_HASHLEN];
61
+ # char SWFVerificationResponse[RTMP_SWF_HASHLEN+10];
62
+ # #endif
63
+ # } RTMP_LNK;
64
+ class RTMP_LNK < ::FFI::Struct
65
+ layout :hostname, AVal,
66
+ :sockshost, AVal,
67
+ :playpath0, AVal,
68
+ :playpath, AVal,
69
+ :tcUrl, AVal,
70
+ :swfUrl, AVal,
71
+ :swfHash, AVal,
72
+ :pageUrl, AVal,
73
+ :app, AVal,
74
+ :auth, AVal,
75
+ :flashVer, AVal,
76
+ :subscribepath, AVal,
77
+ :usherToken, AVal,
78
+ :WeebToken, AVal,
79
+ :token, AVal,
80
+ :extras, AMFObject,
81
+ :depth, :int,
82
+ :seekTime, :int,
83
+ :stopTime, :int,
84
+ :lFlags, :int,
85
+ :swfAge, :int,
86
+ :swfSize, :int,
87
+ :protocol, :int,
88
+ :ConnectPacket, :int,
89
+ :CombineConnectPacket, :int,
90
+ :redirected, :int,
91
+ :timeout, :int,
92
+ :Extras, AVal,
93
+ :HandshakeResponse, AVal,
94
+ :socksport, :ushort,
95
+ :port, :ushort
96
+ end
97
+
98
+ RTMP_READ_HEADER = 0x01
99
+ RTMP_READ_RESUME = 0x02
100
+ RTMP_READ_NO_IGNORE = 0x04
101
+ RTMP_READ_GOTKF = 0x08
102
+ RTMP_READ_GOTFLVK = 0x10
103
+ RTMP_READ_SEEKING = 0x20
104
+
105
+ RTMP_READ_COMPLETE = -3
106
+ RTMP_READ_ERROR = -2
107
+ RTMP_READ_EOF = -1
108
+ RTMP_READ_IGNORE = 0
109
+
110
+ class RTMP_READ < ::FFI::Struct
111
+ layout :buf, :pointer,
112
+ :bufpos, :pointer,
113
+ :buflen, :uint,
114
+ :timestamp, :uint32,
115
+ :dataType, :uint8,
116
+ :flags, :uint8,
117
+ :status, :int8,
118
+ :initialFrameType, :uint8,
119
+ :nResumeTS, :uint32,
120
+ :metaHeader, :pointer,
121
+ :initialFrame, :pointer,
122
+ :nMetaHeaderSize, :uint32,
123
+ :nInitialFrameSize, :uint32,
124
+ :nIgnoredFrameCounter, :uint32,
125
+ :nIgnoredFlvFrameCounter, :uint32
126
+ end
127
+
128
+ class RTMP_METHOD < ::FFI::Struct
129
+ layout :name, AVal,
130
+ :num, :int
131
+ end
132
+
133
+ class RTMP < ::FFI::Struct
134
+ layout :m_inChunkSize, :int,
135
+ :m_outChunkSize, :int,
136
+ :m_nBWCheckCounter, :int,
137
+ :m_nBytesIn, :int,
138
+ :m_nBytesInSent, :int,
139
+ :m_nBufferMS, :int,
140
+ :m_stream_id, :int,
141
+ :m_mediaChannel, :int,
142
+ :m_mediaStamp, :uint32,
143
+ :m_pauseStamp, :uint32,
144
+ :m_pausing, :int,
145
+ :m_nServerBW, :int,
146
+ :m_nClientBW, :int,
147
+ :m_nClientBW2, :uint8,
148
+ :m_bPlaying, :uint8,
149
+ :m_bSendEncoding, :uint8,
150
+ :m_bSendCounter, :uint8,
151
+ :m_numInvoke, :int,
152
+ :m_numCalls, :int,
153
+ :m_methodCalls, RTMP_METHOD,
154
+ :m_vecChannelsIn, [RTMPPacket, RTMP_CHANNELS],
155
+ :m_vecChannelsOut, [RTMPPacket, RTMP_CHANNELS],
156
+ :m_channelTimestamp, [:int, RTMP_CHANNELS],
157
+ :m_fAudioCodecs, :double,
158
+ :m_fVideoCodecs, :double,
159
+ :m_fEncoding, :double,
160
+ :m_fDuration, :double,
161
+ :m_msgCounter, :int,
162
+ :m_polling, :int,
163
+ :m_resplen, :int,
164
+ :m_unackd, :int,
165
+ :m_clientID, AVal,
166
+ :m_read, RTMP_READ,
167
+ :m_write, RTMPPacket,
168
+ :m_sb, RTMPSockBuf,
169
+ :Link, RTMP_LNK
170
+ end
171
+
172
+ attach_function :RTMPPacket_Reset, [RTMPPacket], :void
173
+ attach_function :RTMPPacket_Dump, [RTMPPacket], :void
174
+ attach_function :RTMPPacket_Alloc, [RTMPPacket, :int], :int
175
+ attach_function :RTMPPacket_Free, [RTMPPacket], :void
176
+
177
+ attach_function :RTMP_ParseURL, [:string, :pointer, AVal, :pointer, AVal, AVal], :int
178
+
179
+ attach_function :RTMP_ParsePlaypath, [AVal, AVal], :void
180
+ attach_function :RTMP_SetBufferMS, [RTMP, :int], :void
181
+ attach_function :RTMP_UpdateBufferMS, [RTMP], :void
182
+
183
+ attach_function :RTMP_SetOpt, [RTMP, AVal, AVal], :int
184
+ attach_function :RTMP_SetupURL, [RTMP, :pointer], :int
185
+ attach_function :RTMP_SetupStream, [RTMP, :int, AVal, :uint, AVal, AVal,
186
+ AVal, AVal, AVal, AVal, AVal, AVal,
187
+ :uint32, AVal, AVal, AVal, AVal, :int,
188
+ :int, :int, :long], :void
189
+
190
+ attach_function :RTMP_Connect, [RTMP, RTMPPacket], :int
191
+ attach_function :RTMP_Connect0, [RTMP, :pointer], :int
192
+ attach_function :RTMP_Connect1, [RTMP, RTMPPacket], :int
193
+ attach_function :RTMP_Serve, [RTMP], :int
194
+
195
+ attach_function :RTMP_ReadPacket, [RTMP, RTMPPacket], :int
196
+ attach_function :RTMP_SendPacket, [RTMP, RTMPPacket, :int], :int
197
+ attach_function :RTMP_SendChunk, [RTMP, RTMPChunk], :int
198
+ attach_function :RTMP_IsConnected, [RTMP], :int
199
+ attach_function :RTMP_Socket, [RTMP], :int
200
+ attach_function :RTMP_IsTimedout, [RTMP], :int
201
+ attach_function :RTMP_GetDuration, [RTMP], :double
202
+ attach_function :RTMP_ToggleStream, [RTMP], :int
203
+
204
+ attach_function :RTMP_ConnectStream, [RTMP, :int], :int
205
+ attach_function :RTMP_ReconnectStream, [RTMP, :int], :int
206
+ attach_function :RTMP_DeleteStream, [RTMP], :void
207
+ attach_function :RTMP_GetNextMediaPacket, [RTMP, RTMPPacket], :int
208
+ attach_function :RTMP_ClientPacket, [RTMP, RTMPPacket], :int
209
+
210
+ attach_function :RTMP_Init, [RTMP], :void
211
+ attach_function :RTMP_Close, [RTMP], :void
212
+ attach_function :RTMP_Alloc, [RTMP], RTMP
213
+ attach_function :RTMP_Free, [RTMP], :void
214
+ attach_function :RTMP_EnableWrite, [RTMP], :void
215
+
216
+ attach_function :RTMP_LibVersion, [], :int
217
+ attach_function :RTMP_UserInterrupt, [], :int
218
+
219
+ attach_function :RTMP_SendCtrl, [RTMP, :short, :uint, :uint], :int
220
+
221
+ attach_function :RTMP_SendPause, [RTMP, :int, :int], :int
222
+ attach_function :RTMP_Pause, [RTMP, :int], :int
223
+
224
+ attach_function :RTMP_FindFirstMatchingProperty, [AMFObject, AVal, AMFObjectProperty], :int
225
+
226
+ attach_function :RTMPSockBuf_Fill, [RTMPSockBuf], :int
227
+ attach_function :RTMPSockBuf_Send, [RTMPSockBuf, :string, :int], :int
228
+ attach_function :RTMPSockBuf_Close, [RTMPSockBuf], :int
229
+
230
+ attach_function :RTMP_SendCreateStream, [RTMP], :int
231
+ attach_function :RTMP_SendSeek, [RTMP, :int], :int
232
+ attach_function :RTMP_SendServerBW, [RTMP], :int
233
+ attach_function :RTMP_SendClientBW, [RTMP], :int
234
+ attach_function :RTMP_DropRequest, [RTMP, :int, :int], :void
235
+ attach_function :RTMP_Read, [RTMP, :pointer, :int], :int
236
+ attach_function :RTMP_Write, [RTMP, :string, :int], :int
237
+
238
+ attach_function :RTMP_HashSWF, [:string, :pointer, :pointer, :int], :int
239
+ end
240
+ end
@@ -0,0 +1,3 @@
1
+ module Librtmp
2
+ VERSION = '0.1.0'
3
+ end
data/librtmp.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "librtmp/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "librtmp"
7
+ s.version = Librtmp::VERSION
8
+ s.authors = ["James Thompson"]
9
+ s.email = ["james@plainprograms.com"]
10
+ s.homepage = "http://github.com/plainprograms/ruby-librtmp"
11
+ s.summary = %q{Wraps the librtmp library from rtmpdump with Ruby}
12
+ s.description = %q{Provides a wrapper for the librtmp library in Ruby to allow use of the RTMP streaming protocols}
13
+
14
+ s.rubyforge_project = "librtmp"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "ffi"
24
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: librtmp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - James Thompson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: &70190125709880 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70190125709880
25
+ description: Provides a wrapper for the librtmp library in Ruby to allow use of the
26
+ RTMP streaming protocols
27
+ email:
28
+ - james@plainprograms.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - .rvmrc
35
+ - Gemfile
36
+ - README.md
37
+ - Rakefile
38
+ - lib/librtmp.rb
39
+ - lib/librtmp/ffi.rb
40
+ - lib/librtmp/ffi/amf.rb
41
+ - lib/librtmp/ffi/rtmp.rb
42
+ - lib/librtmp/version.rb
43
+ - librtmp.gemspec
44
+ homepage: http://github.com/plainprograms/ruby-librtmp
45
+ licenses: []
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project: librtmp
64
+ rubygems_version: 1.8.12
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Wraps the librtmp library from rtmpdump with Ruby
68
+ test_files: []