History

more wip logic

Sigrid Solveig Haflínudóttir committed 5 years ago

Commit f6d84671 parent c4f625f4 files · +152 −5Browse files

Unified · Split

4 files
  1. amf.c +32 −0
  2. amf.h +5 −0
  3. main.c +4 −0
  4. rtmp.c +111 −5
amf.c+32−0
@@ -158,3 +158,35 @@ amfkvstr(u8int *p, u8int *e, char *name, char *v) · 157 unmodified lines
158{158{
159 return amfstr(amfkv(p, e, name), e, v);159 return amfstr(amfkv(p, e, name), e, v);
160}160}
161
162u8int *
163amfbyteget(u8int *p, u8int *e, u8int *byte)
164{
165 atleast(1);
166 *byte = *p;
167 return p+1;
168}
169
170u8int *
171amfi16get(u8int *p, u8int *e, s16int *i)
172{
173 atleast(2);
174 *i = p[0]<<8 | p[1];
175 return p+2;
176}
177
178u8int *
179amfi24get(u8int *p, u8int *e, s32int *i)
180{
181 atleast(3);
182 *i = p[0]<<16 | p[1]<<8 | p[2];
183 return p+3;
184}
185
186u8int *
187amfi32get(u8int *p, u8int *e, s32int *i)
188{
189 atleast(4);
190 *i = p[0]<<16 | p[1]<<16 | p[2]<<8 | p[3];
191 return p+4;
192}
amf.h+5−0
@@ -11,3 +11,8 @@ u8int *amfend(u8int *p, u8int *e); · 10 unmodified lines
11u8int *amfkvnum(u8int *p, u8int *e, char *name, double v);11u8int *amfkvnum(u8int *p, u8int *e, char *name, double v);
12u8int *amfkvstr(u8int *p, u8int *e, char *name, char *v);12u8int *amfkvstr(u8int *p, u8int *e, char *name, char *v);
13u8int *amfkvbool(u8int *p, u8int *e, char *name, int v);13u8int *amfkvbool(u8int *p, u8int *e, char *name, int v);
14
15u8int *amfbyteget(u8int *p, u8int *e, u8int *byte);
16u8int *amfi16get(u8int *p, u8int *e, s16int *i);
17u8int *amfi24get(u8int *p, u8int *e, s32int *i);
18u8int *amfi32get(u8int *p, u8int *e, s32int *i);
main.c+4−0
@@ -7,6 +7,7 @@ · 6 unmodified lines
7#include "rtmp.h"7#include "rtmp.h"
8 8
9int mainstacksize = 65536;9int mainstacksize = 65536;
10int debug = 0;
10 11
11static void12static void
12usage(void)13usage(void)
@@ -29,6 +30,9 @@ threadmain(int argc, char **argv) · 16 unmodified lines
29 a = nil;30 a = nil;
30 v = nil;31 v = nil;
31 ARGBEGIN{32 ARGBEGIN{
33 case 'd':
34 debug++;
35 break;
32 case 'D':36 case 'D':
33 rtmpdump++;37 rtmpdump++;
34 break;38 break;
rtmp.c+111−5
@@ -37,6 +37,9 @@ struct Packet { · 36 unmodified lines
37 u32int ts;37 u32int ts;
38 u8int *data;38 u8int *data;
39 int sz;39 int sz;
40 int left;
41 Packet *prev;
42 Packet *next;
40};43};
41 44
42struct RTMP {45struct RTMP {
@@ -45,6 +48,7 @@ struct RTMP { · 2 unmodified lines
45 char *path;48 char *path;
46 char *tcurl;49 char *tcurl;
47 Packet pk;50 Packet pk;
51 Packet *ch;
48 u8int *b, *p, *e;52 u8int *b, *p, *e;
49 int mode;53 int mode;
50 int bsz;54 int bsz;
@@ -66,6 +70,39 @@ struct RTMP { · 15 unmodified lines
66#define putkvbool(name, s) do{ r->p = amfkvbool(r->p, r->e, name, s); }while(0)70#define putkvbool(name, s) do{ r->p = amfkvbool(r->p, r->e, name, s); }while(0)
67 71
68int rtmpdump = 0;72int rtmpdump = 0;
73extern int debug;
74
75static Packet *
76pk4chan(RTMP *r, int chan)
77{
78 Packet *p;
79
80 for(p = r->ch; p != nil && p->chan != chan; p = p->next);
81
82 if(p == nil){
83 if((p = calloc(1, sizeof(*p))) == nil)
84 sysfatal("memory");
85 p->type = -1;
86 p->chan = chan;
87 if((p->next = r->ch) != nil)
88 r->ch->prev = p;
89 }
90
91 return p;
92}
93
94static void
95pkfree(RTMP *r, Packet *p)
96{
97 if(p->prev != nil)
98 p->prev->next = p->next;
99 if(p->next != nil)
100 p->next->prev = p->prev;
101 if(r->ch == p)
102 r->ch = p->next;
103
104 free(p->data);
105}
69 106
70static void107static void
71newpacket(RTMP *r, int type, int hsz, int chan)108newpacket(RTMP *r, int type, int hsz, int chan)
@@ -85,6 +122,22 @@ newpacket(RTMP *r, int type, int hsz, int chan) · 13 unmodified lines
85 }122 }
86}123}
87 124
125static void
126bextend(RTMP *r, int bsz)
127{
128 u8int *ob;
129
130 if(r->bsz >= bsz)
131 return;
132 ob = r->b;
133 if((r->b = realloc(r->b, bsz*2)) == nil)
134 sysfatal("memory");
135 if(ob != nil)
136 r->p = r->b + (intptr)(ob - r->p);
137 r->bsz *= 2;
138 r->e = r->b + r->bsz;
139}
140
88static int141static int
89handshake(int f)142handshake(int f)
90{143{
@@ -117,6 +170,60 @@ err: · 26 unmodified lines
117 return -1;170 return -1;
118}171}
119 172
173static int
174rtmprecv(RTMP *r)
175{
176 u8int *h, *e, type;
177 int hsz, chan, bodysz, dummy;
178 u32int ts;
179
180 r->p = r->b;
181 if(readn(r->i, r->p, 1) != 1)
182 goto err;
183 hsz = (r->p[0] & 0xc0)>>6;
184 chan = r->p[0] & 0x3f;
185 if(debug)
186 fprint(2, "hsz=%d chan=%d\n", hsz, chan);
187 if(readn(r->i, r->p+1, hsz-1) != hsz-1)
188 goto err;
189
190 memset(&r->pk, 0, sizeof(r->pk));
191 r->pk.hsz = hsz;
192 r->pk.chan = chan;
193
194 h = r->p + 1;
195 e = r->p + hsz;
196 r->pk.type = -1;
197 bodysz = 0;
198 if(hsz >= SzSmall){
199 h = amfi24get(h, e, (s32int*)&ts); /* FIXME proper timestamps? */
200 if(hsz >= SzMedium){
201 h = amfi24get(h, e, &bodysz);
202 h = amfbyteget(h, e, &type);
203 r->pk.type = type;
204 if(hsz >= SzLarge)
205 h = amfi32get(h, e, &dummy); /* FIXME seems to be always 0? */
206 }
207 }
208
209 if(ts == 0xffffff){ /* exntended timestamp */
210 if(readn(r->i, h, 4) != 4)
211 goto err;
212 h = amfi32get(h, h+4, (s32int*)&ts);
213 }
214
215 bextend(r, bodysz);
216 if(readn(r->i, h, bodysz) != bodysz)
217 goto err;
218 h += bodysz;
219
220 return 0;
221
222err:
223 werrstr("rtmprecv: %r");
224 return -1;
225}
226
120static int227static int
121rtmpsend(RTMP *r)228rtmpsend(RTMP *r)
122{229{
@@ -147,7 +254,6 @@ rtmpsend(RTMP *r) · 24 unmodified lines
147 hsz = e - r->b;254 hsz = e - r->b;
148 for(; hsz+bodysz > 0;){255 for(; hsz+bodysz > 0;){
149 n = min(bodysz, Chunk);256 n = min(bodysz, Chunk);
150 fprint(2, "header is %d bytes, writing %d+%d=%d\n", hsz, hsz, n, hsz+n);
151 if(Bwrite(r, p, hsz+n) < 0)257 if(Bwrite(r, p, hsz+n) < 0)
152 goto err;258 goto err;
153 if(rtmpdump)259 if(rtmpdump)
@@ -162,6 +268,7 @@ rtmpsend(RTMP *r) · 8 unmodified lines
162 }268 }
163 269
164 r->p = nil;270 r->p = nil;
271 Bflush(r);
165 272
166 return 0;273 return 0;
167err:274err:
@@ -247,16 +354,15 @@ rtmpdial(char *url, int w, int h, int withaudio) · 79 unmodified lines
247 354
248 if(handshake(f) != 0)355 if(handshake(f) != 0)
249 goto err;356 goto err;
250 if((r = calloc(1, sizeof(*r))) == nil || (r->b = malloc(Bufsz)) == nil)357 if((r = calloc(1, sizeof(*r))) == nil)
251 sysfatal("memory");358 sysfatal("memory");
252 if((r->app = strdup(app)) == nil || (path != nil && (r->path = strdup(path)) == nil))359 if((r->app = strdup(app)) == nil || (path != nil && (r->path = strdup(path)) == nil))
253 sysfatal("memory");360 sysfatal("memory");
361 bextend(r, Bufsz);
254 r->tcurl = url;362 r->tcurl = url;
255 r->bsz = Bufsz;
256 r->e = r->b + r->bsz;
257 Binits(r, f, OWRITE, r->biobuf, sizeof(r->biobuf));363 Binits(r, f, OWRITE, r->biobuf, sizeof(r->biobuf));
258 r->i = f;364 r->i = f;
259 if(connect(r) != 0)365 if(connect(r) != 0 || rtmprecv(r) != 0)
260 goto err;366 goto err;
261 367
262 return r;368 return r;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t