librtmp 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []